@ouestfrance/sipa-bms-ui 8.19.0 → 8.21.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 (66) hide show
  1. package/dist/components/form/BmsFilePicker.vue.d.ts +4 -0
  2. package/dist/components/form/BmsInputText.vue.d.ts +1 -0
  3. package/dist/components/form/BmsMultiSelect.vue.d.ts +4 -0
  4. package/dist/components/form/BmsSearch.vue.d.ts +3 -1
  5. package/dist/components/form/RawAutocomplete.vue.d.ts +8 -0
  6. package/dist/components/layout/BmsSplitWindow.vue.d.ts +1 -0
  7. package/dist/components/navigation/UiTenantSwitcher.vue.d.ts +3 -1
  8. package/dist/components/table/BmsTableFilters.vue.d.ts +3 -1
  9. package/dist/mockServiceWorker.js +1 -1
  10. package/dist/sipa-bms-ui.css +54 -368
  11. package/dist/sipa-bms-ui.es.js +118 -47
  12. package/dist/sipa-bms-ui.es.js.map +1 -1
  13. package/dist/sipa-bms-ui.umd.js +117 -46
  14. package/dist/sipa-bms-ui.umd.js.map +1 -1
  15. package/package.json +13 -12
  16. package/src/assets/scss/_conf.scss +0 -1
  17. package/src/assets/scss/app.scss +0 -1
  18. package/src/components/button/BmsAllButtons.stories.js +50 -23
  19. package/src/components/button/BmsButton.stories.js +151 -65
  20. package/src/components/button/BmsIconButton.stories.js +14 -8
  21. package/src/components/button/UiButton.stories.js +31 -0
  22. package/src/components/feedback/BmsCircularProgress.stories.js +0 -7
  23. package/src/components/feedback/BmsLoader.stories.js +0 -6
  24. package/src/components/feedback/BmsTooltip.stories.js +1 -0
  25. package/src/components/feedback/UiTooltip.stories.js +1 -0
  26. package/src/components/form/BmsAutocomplete.stories.js +11 -1
  27. package/src/components/form/BmsBetweenInput.stories.js +17 -1
  28. package/src/components/form/BmsFilePicker.stories.js +8 -1
  29. package/src/components/form/BmsFilePicker.vue +10 -5
  30. package/src/components/form/BmsInputBooleanCheckbox.stories.js +9 -0
  31. package/src/components/form/BmsInputCheckboxCaption.stories.js +16 -0
  32. package/src/components/form/BmsInputCheckboxCaptionGroup.stories.js +21 -1
  33. package/src/components/form/BmsInputText.vue +1 -0
  34. package/src/components/form/BmsMultiSelect.vue +32 -25
  35. package/src/components/form/BmsSelect.vue +18 -16
  36. package/src/components/form/RawAutocomplete.vue +16 -4
  37. package/src/components/form/RawInputText.vue +1 -0
  38. package/src/components/form/UiBmsInputCheckbox.stories.js +1 -0
  39. package/src/components/form/UiBmsSwitch.stories.js +1 -5
  40. package/src/components/layout/BmsForm_retrocompat.stories.js +1 -0
  41. package/src/components/layout/BmsModal.stories.js +2 -1
  42. package/src/components/layout/BmsSplitWindow.vue +4 -3
  43. package/src/components/navigation/BmsBreadcrumb.stories.js +0 -18
  44. package/src/components/navigation/BmsMenu.stories.js +4 -4
  45. package/src/components/navigation/BmsMenuNav.stories.js +4 -3
  46. package/src/components/navigation/UiMenuItem.stories.js +53 -2
  47. package/src/components/navigation/UiTab.stories.js +1 -0
  48. package/src/components/navigation/UiTenantSwitcher.stories.js +1 -0
  49. package/src/components/table/BmsEmptyScreen.stories.js +0 -7
  50. package/src/components/table/BmsTableFilters.vue +1 -1
  51. package/src/components/table/UiBmsTable.stories.js +1 -0
  52. package/src/components/table/UiFilterButton.stories.js +3 -8
  53. package/src/components/utils/BmsRelativeTime.stories.js +0 -6
  54. package/src/documentation/button/primaryButton.mdx +142 -0
  55. package/src/documentation/{secondaryButton.mdx → button/secondaryButton.mdx} +2 -2
  56. package/src/documentation/foundation/contributing.mdx +72 -0
  57. package/src/documentation/foundation/gettingstarted.mdx +7 -0
  58. package/src/documentation/{principles.mdx → foundation/principles.mdx} +9 -9
  59. package/src/documentation/icons.mdx +43 -0
  60. package/src/showroom/pages/forms.vue +10 -1
  61. package/src/assets/scss/_formkit.scss +0 -353
  62. package/src/components/feedback/Notification.stories.js +0 -37
  63. package/src/components/form/Form.stories.js +0 -35
  64. package/src/components/navigation/UiMenuItemStatus.stories.js +0 -64
  65. package/src/documentation/primaryButton.mdx +0 -20
  66. /package/src/documentation/{button.mdx → button/button.mdx} +0 -0
@@ -38015,6 +38015,58 @@
38015
38015
  };
38016
38016
  }
38017
38017
 
38018
+ function createKeyPredicate(keyFilter) {
38019
+ if (typeof keyFilter === "function")
38020
+ return keyFilter;
38021
+ else if (typeof keyFilter === "string")
38022
+ return (event) => event.key === keyFilter;
38023
+ else if (Array.isArray(keyFilter))
38024
+ return (event) => keyFilter.includes(event.key);
38025
+ return () => true;
38026
+ }
38027
+ function onKeyStroke(...args) {
38028
+ let key;
38029
+ let handler;
38030
+ let options = {};
38031
+ if (args.length === 3) {
38032
+ key = args[0];
38033
+ handler = args[1];
38034
+ options = args[2];
38035
+ } else if (args.length === 2) {
38036
+ if (typeof args[1] === "object") {
38037
+ key = true;
38038
+ handler = args[0];
38039
+ options = args[1];
38040
+ } else {
38041
+ key = args[0];
38042
+ handler = args[1];
38043
+ }
38044
+ } else {
38045
+ key = true;
38046
+ handler = args[0];
38047
+ }
38048
+ const {
38049
+ target = defaultWindow,
38050
+ eventName = "keydown",
38051
+ passive = false,
38052
+ dedupe = false
38053
+ } = options;
38054
+ const predicate = createKeyPredicate(key);
38055
+ const listener = (e) => {
38056
+ if (e.repeat && vue.toValue(dedupe))
38057
+ return;
38058
+ if (predicate(e))
38059
+ handler(e);
38060
+ };
38061
+ return useEventListener(target, eventName, listener, passive);
38062
+ }
38063
+ function onKeyDown(key, handler, options = {}) {
38064
+ return onKeyStroke(key, handler, { ...options, eventName: "keydown" });
38065
+ }
38066
+ function onKeyUp(key, handler, options = {}) {
38067
+ return onKeyStroke(key, handler, { ...options, eventName: "keyup" });
38068
+ }
38069
+
38018
38070
  const ssrWidthSymbol = Symbol("vueuse-ssr-width");
38019
38071
  // @__NO_SIDE_EFFECTS__
38020
38072
  function useSSRWidth() {
@@ -38893,7 +38945,8 @@
38893
38945
  maxlength: __props.maxlength,
38894
38946
  onBlur: _cache[0] || (_cache[0] = ($event) => $emits("blur")),
38895
38947
  onInput,
38896
- onFocus: _cache[1] || (_cache[1] = ($event) => $emits("focus"))
38948
+ onFocus: _cache[1] || (_cache[1] = ($event) => $emits("focus")),
38949
+ onClick: _cache[2] || (_cache[2] = ($event) => $emits("click"))
38897
38950
  }, null, 40, _hoisted_3$j),
38898
38951
  vue.createElementVNode("span", _hoisted_4$c, [
38899
38952
  vue.renderSlot(_ctx.$slots, "icon-end", {}, void 0, true)
@@ -38903,7 +38956,7 @@
38903
38956
  }
38904
38957
  });
38905
38958
 
38906
- const RawInputText = /* @__PURE__ */ _export_sfc(_sfc_main$1e, [["__scopeId", "data-v-4c74b915"]]);
38959
+ const RawInputText = /* @__PURE__ */ _export_sfc(_sfc_main$1e, [["__scopeId", "data-v-d5f058e1"]]);
38907
38960
 
38908
38961
  const _sfc_main$1d = /* @__PURE__ */ vue.defineComponent({
38909
38962
  __name: "RawAutocomplete",
@@ -38927,7 +38980,7 @@
38927
38980
  "modelValue": { required: true },
38928
38981
  "modelModifiers": {}
38929
38982
  }),
38930
- emits: /* @__PURE__ */ vue.mergeModels(["addNewOption", "select"], ["update:modelValue"]),
38983
+ emits: /* @__PURE__ */ vue.mergeModels(["addNewOption", "select", "blur", "focus", "click", "input"], ["update:modelValue"]),
38931
38984
  setup(__props, { expose: __expose, emit: __emit }) {
38932
38985
  const props = __props;
38933
38986
  const modelValue = vue.useModel(__props, "modelValue");
@@ -38944,6 +38997,12 @@
38944
38997
  onClickOutside(rawInput, closeDatalist, {
38945
38998
  ignore: [".datalist-option", ".icon-toggle-button", ".icon-clear"]
38946
38999
  });
39000
+ const onBlur = () => {
39001
+ emits("blur");
39002
+ closeDatalist();
39003
+ };
39004
+ onKeyUp("Escape", onBlur);
39005
+ onKeyUp("Tab", onBlur);
38947
39006
  const classes = vue.computed(() => {
38948
39007
  return { "is-error": props.errors?.length, "is-disabled": props.disabled };
38949
39008
  });
@@ -38981,8 +39040,8 @@
38981
39040
  }
38982
39041
  }
38983
39042
  );
38984
- const onFocus = () => {
38985
- openDatalist();
39043
+ const onClick = () => {
39044
+ isDatalistOpen.value = !isDatalistOpen.value;
38986
39045
  };
38987
39046
  const onInput = () => {
38988
39047
  openDatalist();
@@ -39044,7 +39103,8 @@
39044
39103
  required: __props.required,
39045
39104
  small: __props.small,
39046
39105
  onInput,
39047
- onFocus
39106
+ onClick,
39107
+ onKeyup: vue.withKeys(openDatalist, ["down"])
39048
39108
  }, {
39049
39109
  "icon-start": vue.withCtx(() => [
39050
39110
  vue.renderSlot(_ctx.$slots, "icon-start", {}, void 0, true)
@@ -39077,7 +39137,7 @@
39077
39137
  }
39078
39138
  });
39079
39139
 
39080
- const RawAutocomplete = /* @__PURE__ */ _export_sfc(_sfc_main$1d, [["__scopeId", "data-v-15343285"]]);
39140
+ const RawAutocomplete = /* @__PURE__ */ _export_sfc(_sfc_main$1d, [["__scopeId", "data-v-46667c72"]]);
39081
39141
 
39082
39142
  const _hoisted_1$R = ["innerHTML"];
39083
39143
  const _hoisted_2$z = ["innerHTML"];
@@ -39441,6 +39501,8 @@
39441
39501
  const _sfc_main$18 = /* @__PURE__ */ vue.defineComponent({
39442
39502
  __name: "BmsFilePicker",
39443
39503
  props: {
39504
+ dragOverMessage: { default: "Déposer votre image ici" },
39505
+ dragOffMessage: { default: "Glissez votre image ici ou cliquez pour parcourir" },
39444
39506
  modelValue: {},
39445
39507
  limit: { default: 10 }
39446
39508
  },
@@ -39520,9 +39582,9 @@
39520
39582
  }, [
39521
39583
  vue.createElementVNode("label", _hoisted_2$x, [
39522
39584
  isDragOver.value ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
39523
- vue.createTextVNode("Déposer votre image ici")
39585
+ vue.createTextVNode(vue.toDisplayString(__props.dragOverMessage), 1)
39524
39586
  ], 64)) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
39525
- vue.createTextVNode("Glissez votre image ici ou cliquez pour parcourir")
39587
+ vue.createTextVNode(vue.toDisplayString(__props.dragOffMessage), 1)
39526
39588
  ], 64)),
39527
39589
  vue.createElementVNode("input", {
39528
39590
  "data-testid": "file-upload-input-file",
@@ -39553,7 +39615,7 @@
39553
39615
  }
39554
39616
  });
39555
39617
 
39556
- const BmsFilePicker = /* @__PURE__ */ _export_sfc(_sfc_main$18, [["__scopeId", "data-v-c892a845"]]);
39618
+ const BmsFilePicker = /* @__PURE__ */ _export_sfc(_sfc_main$18, [["__scopeId", "data-v-4aaf4346"]]);
39557
39619
 
39558
39620
  const _hoisted_1$O = ["disabled", "name", "value"];
39559
39621
  const _hoisted_2$w = {
@@ -68538,7 +68600,7 @@
68538
68600
  errors: {},
68539
68601
  captions: {},
68540
68602
  disabled: { type: Boolean, default: false },
68541
- small: { type: Boolean },
68603
+ small: { type: Boolean, default: false },
68542
68604
  ellipsisLabel: { type: Boolean }
68543
68605
  },
68544
68606
  emits: ["update:modelValue", "blur", "focus"],
@@ -69407,26 +69469,37 @@
69407
69469
  "modelValue": { default: [] },
69408
69470
  "modelModifiers": {}
69409
69471
  }),
69410
- emits: ["update:modelValue"],
69411
- setup(__props) {
69472
+ emits: /* @__PURE__ */ vue.mergeModels(["select", "input"], ["update:modelValue"]),
69473
+ setup(__props, { emit: __emit }) {
69412
69474
  const props = __props;
69475
+ const emits = __emit;
69476
+ const modelValue = vue.useModel(__props, "modelValue");
69413
69477
  const inputElement = vue.ref(null);
69414
69478
  const isDatalistOpen = vue.ref(false);
69479
+ const searching = vue.ref("");
69415
69480
  const closeDatalist = () => isDatalistOpen.value = false;
69416
69481
  const openDatalist = () => {
69417
69482
  if (!props.disabled) {
69418
69483
  isDatalistOpen.value = true;
69419
69484
  }
69420
69485
  };
69421
- const searching = vue.ref("");
69422
- const modelValue = vue.useModel(__props, "modelValue");
69423
- onClickOutside(inputElement, closeDatalist, {
69424
- ignore: [".datalist-option", ".icon-toggle-button"]
69425
- });
69426
69486
  const onBackspace = () => {
69427
69487
  if (searching.value.length === 0 && modelValue.value && modelValue.value.length > 0)
69428
69488
  modelValue.value.splice(-1);
69429
69489
  };
69490
+ onClickOutside(inputElement, closeDatalist, {
69491
+ ignore: [".datalist-option", ".icon-toggle-button"]
69492
+ });
69493
+ onKeyUp("Escape", closeDatalist);
69494
+ onKeyUp("Tab", closeDatalist);
69495
+ onKeyDown("Backspace", onBackspace);
69496
+ const onSelectClick = () => {
69497
+ isDatalistOpen.value = !isDatalistOpen.value;
69498
+ };
69499
+ const onInput = (e) => {
69500
+ emits("input", e);
69501
+ openDatalist();
69502
+ };
69430
69503
  const setFocus = () => {
69431
69504
  if (inputElement.value) {
69432
69505
  inputElement.value.focus();
@@ -69439,8 +69512,8 @@
69439
69512
  modelValue.value = (modelValue.value ?? []).concat(option.value);
69440
69513
  }
69441
69514
  searching.value = "";
69515
+ emits("select", option);
69442
69516
  setFocus();
69443
- closeDatalist();
69444
69517
  };
69445
69518
  const removeOption = (value) => {
69446
69519
  modelValue.value = (modelValue.value ?? []).filter((o) => o !== value);
@@ -69472,7 +69545,7 @@
69472
69545
  "model-value": modelValue.value,
69473
69546
  open: isDatalistOpen.value,
69474
69547
  onSelect,
69475
- onClick: setFocus
69548
+ onClick: onSelectClick
69476
69549
  }), {
69477
69550
  input: vue.withCtx(() => [
69478
69551
  vue.createElementVNode("div", _hoisted_1$H, [
@@ -69496,13 +69569,8 @@
69496
69569
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searching.value = $event),
69497
69570
  class: "search",
69498
69571
  disabled: __props.disabled,
69499
- onFocus: openDatalist,
69500
- onClick: openDatalist,
69501
- onKeyup: [
69502
- vue.withKeys(openDatalist, ["down"]),
69503
- vue.withKeys(onBackspace, ["backspace"])
69504
- ],
69505
- onInput: openDatalist
69572
+ onInput,
69573
+ onKeyup: vue.withKeys(openDatalist, ["down"])
69506
69574
  }, null, 40, _hoisted_2$s), [
69507
69575
  [vue.vModelText, searching.value]
69508
69576
  ])
@@ -69515,12 +69583,10 @@
69515
69583
  })) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
69516
69584
  isDatalistOpen.value ? (vue.openBlock(), vue.createBlock(vue.unref(ChevronUp), {
69517
69585
  key: 0,
69518
- class: "icon icon-toggle-button",
69519
- onClick: closeDatalist
69586
+ class: "icon icon-toggle-button"
69520
69587
  })) : (vue.openBlock(), vue.createBlock(vue.unref(ChevronDown), {
69521
69588
  key: 1,
69522
- class: "icon icon-toggle-button",
69523
- onClick: openDatalist
69589
+ class: "icon icon-toggle-button"
69524
69590
  }))
69525
69591
  ], 64))
69526
69592
  ])
@@ -69543,7 +69609,7 @@
69543
69609
  }
69544
69610
  });
69545
69611
 
69546
- const BmsMultiSelect = /* @__PURE__ */ _export_sfc(_sfc_main$R, [["__scopeId", "data-v-b8b817ba"]]);
69612
+ const BmsMultiSelect = /* @__PURE__ */ _export_sfc(_sfc_main$R, [["__scopeId", "data-v-970d00fe"]]);
69547
69613
 
69548
69614
  const _sfc_main$Q = /* @__PURE__ */ vue.defineComponent({
69549
69615
  __name: "BmsSearch",
@@ -86849,6 +86915,7 @@
86849
86915
  emits: /* @__PURE__ */ vue.mergeModels(["select"], ["update:modelValue"]),
86850
86916
  setup(__props, { expose: __expose, emit: __emit }) {
86851
86917
  const props = __props;
86918
+ const emits = __emit;
86852
86919
  const modelValue = vue.useModel(__props, "modelValue");
86853
86920
  const inputElement = vue.ref(null);
86854
86921
  const isDatalistOpen = vue.ref(props.open);
@@ -86861,10 +86928,11 @@
86861
86928
  setFocus();
86862
86929
  }
86863
86930
  };
86864
- const emits = __emit;
86865
86931
  onClickOutside(inputElement, closeDatalist, {
86866
86932
  ignore: [".datalist-option", ".icon-toggle-button"]
86867
86933
  });
86934
+ onKeyUp("Escape", closeDatalist);
86935
+ onKeyUp("Tab", closeDatalist);
86868
86936
  const displayValue = vue.computed(() => {
86869
86937
  const option = props.options.find(
86870
86938
  (o) => _.isEqual(o.value, modelValue.value)
@@ -86883,6 +86951,12 @@
86883
86951
  setFocus();
86884
86952
  closeDatalist();
86885
86953
  };
86954
+ const onSelectClick = () => {
86955
+ isDatalistOpen.value = !isDatalistOpen.value;
86956
+ if (isDatalistOpen) {
86957
+ setFocus();
86958
+ }
86959
+ };
86886
86960
  __expose({
86887
86961
  setFocus
86888
86962
  });
@@ -86890,7 +86964,7 @@
86890
86964
  return vue.openBlock(), vue.createBlock(RawSelect, vue.mergeProps(_ctx.$props, {
86891
86965
  open: isDatalistOpen.value,
86892
86966
  onSelect,
86893
- onClick: setFocus
86967
+ onClick: onSelectClick
86894
86968
  }), {
86895
86969
  input: vue.withCtx(() => [
86896
86970
  vue.createElementVNode("input", {
@@ -86903,19 +86977,15 @@
86903
86977
  placeholder: __props.placeholder,
86904
86978
  required: __props.required,
86905
86979
  disabled: __props.disabled,
86906
- onFocus: openDatalist,
86907
- onClick: openDatalist,
86908
86980
  onKeyup: vue.withKeys(openDatalist, ["down"])
86909
86981
  }, null, 40, _hoisted_1$G),
86910
86982
  vue.createElementVNode("span", _hoisted_2$r, [
86911
86983
  isDatalistOpen.value ? (vue.openBlock(), vue.createBlock(vue.unref(ChevronUp), {
86912
86984
  key: 0,
86913
- class: "icon-toggle-button",
86914
- onClick: closeDatalist
86985
+ class: "icon-toggle-button"
86915
86986
  })) : (vue.openBlock(), vue.createBlock(vue.unref(ChevronDown), {
86916
86987
  key: 1,
86917
- class: "icon-toggle-button",
86918
- onClick: openDatalist
86988
+ class: "icon-toggle-button"
86919
86989
  }))
86920
86990
  ])
86921
86991
  ]),
@@ -86925,7 +86995,7 @@
86925
86995
  }
86926
86996
  });
86927
86997
 
86928
- const BmsSelect = /* @__PURE__ */ _export_sfc(_sfc_main$P, [["__scopeId", "data-v-7aef9c6c"]]);
86998
+ const BmsSelect = /* @__PURE__ */ _export_sfc(_sfc_main$P, [["__scopeId", "data-v-fa4e9db0"]]);
86929
86999
 
86930
87000
  const _hoisted_1$F = ["value", "required", "placeholder", "disabled"];
86931
87001
  const _sfc_main$O = /* @__PURE__ */ vue.defineComponent({
@@ -90517,7 +90587,6 @@
90517
90587
  vue.watch(
90518
90588
  () => props.collapsed,
90519
90589
  (val) => {
90520
- console.log("watch:collapsed", val);
90521
90590
  collapsedLocal.value = val ?? false;
90522
90591
  }
90523
90592
  );
@@ -90645,7 +90714,7 @@
90645
90714
  vue.renderSlot(_ctx.$slots, "first", {}, void 0, true)
90646
90715
  ], 8, _hoisted_1$v),
90647
90716
  vue.createElementVNode("div", {
90648
- class: "split-window__separator toto",
90717
+ class: "split-window__separator",
90649
90718
  role: "separator",
90650
90719
  tabindex: "0",
90651
90720
  "aria-label": props.ariaLabel || "Séparateur de volet",
@@ -90656,7 +90725,9 @@
90656
90725
  "aria-controls": primaryId.value,
90657
90726
  onPointerdown: vue.withModifiers(onPointerDown, ["prevent", "stop"]),
90658
90727
  onKeydown: onKeyDown
90659
- }, null, 40, _hoisted_2$k),
90728
+ }, [
90729
+ vue.renderSlot(_ctx.$slots, "separator", {}, void 0, true)
90730
+ ], 40, _hoisted_2$k),
90660
90731
  vue.createElementVNode("div", {
90661
90732
  class: "split-window__pane split-window__second-pane",
90662
90733
  id: __props.primary === "second" ? primaryId.value : void 0
@@ -90668,7 +90739,7 @@
90668
90739
  }
90669
90740
  });
90670
90741
 
90671
- const BmsSplitWindow = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["__scopeId", "data-v-15128bb0"]]);
90742
+ const BmsSplitWindow = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["__scopeId", "data-v-4d48c930"]]);
90672
90743
 
90673
90744
  const _hoisted_1$u = { class: "step" };
90674
90745
  const _hoisted_2$j = { class: "step-buttons" };
@@ -98614,7 +98685,7 @@
98614
98685
  }
98615
98686
  });
98616
98687
 
98617
- const BmsTableFilters = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__scopeId", "data-v-4a441463"]]);
98688
+ const BmsTableFilters = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__scopeId", "data-v-94b8e913"]]);
98618
98689
 
98619
98690
  /**
98620
98691
  * Create a bound version of a function with a specified `this` context