@fkui/vue 6.3.1 → 6.5.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.
@@ -1972,17 +1972,17 @@ const _export_sfc = (sfc, props) => {
1972
1972
  return target;
1973
1973
  };
1974
1974
  const _hoisted_1$X = ["aria-hidden"];
1975
- const _hoisted_2$G = ["xlink:href"];
1976
- function _sfc_render$R(_ctx, _cache, $props, $setup, $data, $options) {
1975
+ const _hoisted_2$G = ["href"];
1976
+ function _sfc_render$Q(_ctx, _cache, $props, $setup, $data, $options) {
1977
1977
  return vue.openBlock(), vue.createElementBlock("svg", vue.mergeProps(_ctx.$attrs, {
1978
1978
  focusable: "false",
1979
1979
  class: ["icon", [_ctx.spriteKey, ..._ctx.modifiers]],
1980
1980
  "aria-hidden": _ctx.ariaHidden
1981
1981
  }), [vue.renderSlot(_ctx.$slots, "default"), _cache[0] || (_cache[0] = vue.createTextVNode()), vue.createElementVNode("use", {
1982
- "xlink:href": _ctx.spriteId
1982
+ href: _ctx.spriteId
1983
1983
  }, null, 8, _hoisted_2$G)], 16, _hoisted_1$X);
1984
1984
  }
1985
- const FIcon = /* @__PURE__ */ _export_sfc(_sfc_main$1d, [["render", _sfc_render$R]]);
1985
+ const FIcon = /* @__PURE__ */ _export_sfc(_sfc_main$1d, [["render", _sfc_render$Q]]);
1986
1986
  const DATA_TEST_ATTRIBUTE_NAME = "data-test";
1987
1987
  function throwErrorIfEmpty(value) {
1988
1988
  if (!value) {
@@ -4604,7 +4604,7 @@ const _hoisted_1$W = ["id"];
4604
4604
  const _hoisted_2$F = {
4605
4605
  class: "modal__backdrop"
4606
4606
  };
4607
- const _hoisted_3$w = {
4607
+ const _hoisted_3$x = {
4608
4608
  class: "modal__inner-container"
4609
4609
  };
4610
4610
  const _hoisted_4$q = {
@@ -4616,7 +4616,7 @@ const _hoisted_5$l = {
4616
4616
  const _hoisted_6$g = {
4617
4617
  class: "modal__header"
4618
4618
  };
4619
- const _hoisted_7$d = {
4619
+ const _hoisted_7$c = {
4620
4620
  key: 0,
4621
4621
  ref: "modalTitle",
4622
4622
  class: "modal__title",
@@ -4634,7 +4634,7 @@ const _hoisted_10$3 = {
4634
4634
  class: "modal__shelf"
4635
4635
  };
4636
4636
  const _hoisted_11$3 = ["aria-label"];
4637
- function _sfc_render$Q(_ctx, _cache, $props, $setup, $data, $options) {
4637
+ function _sfc_render$P(_ctx, _cache, $props, $setup, $data, $options) {
4638
4638
  const _component_f_icon = vue.resolveComponent("f-icon");
4639
4639
  return _ctx.isOpen ? (vue.openBlock(), vue.createElementBlock("div", {
4640
4640
  key: 0,
@@ -4646,13 +4646,13 @@ function _sfc_render$Q(_ctx, _cache, $props, $setup, $data, $options) {
4646
4646
  role: "dialog",
4647
4647
  "aria-modal": "true",
4648
4648
  onKeyup: _cache[3] || (_cache[3] = vue.withKeys((...args) => _ctx.onClose && _ctx.onClose(...args), ["esc"]))
4649
- }, [vue.createElementVNode("div", _hoisted_3$w, [vue.createElementVNode("div", {
4649
+ }, [vue.createElementVNode("div", _hoisted_3$x, [vue.createElementVNode("div", {
4650
4650
  ref: "modalDialogContainer",
4651
4651
  class: vue.normalizeClass(["modal__dialog-container", _ctx.containerClasses])
4652
4652
  }, [vue.createElementVNode("div", _hoisted_4$q, [vue.createElementVNode("div", _hoisted_5$l, [vue.createElementVNode("div", _hoisted_6$g, [vue.createElementVNode("div", {
4653
4653
  tabindex: "0",
4654
4654
  onFocus: _cache[0] || (_cache[0] = (...args) => _ctx.onFocusFirst && _ctx.onFocusFirst(...args))
4655
- }, null, 32), _cache[4] || (_cache[4] = vue.createTextVNode()), _ctx.hasHeaderSlot ? (vue.openBlock(), vue.createElementBlock("h1", _hoisted_7$d, [vue.renderSlot(_ctx.$slots, "header")], 512)) : vue.createCommentVNode("", true)]), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_8$8, [vue.renderSlot(_ctx.$slots, "content")], 512), _cache[6] || (_cache[6] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_9$6, [vue.renderSlot(_ctx.$slots, "footer")])]), _cache[9] || (_cache[9] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_10$3, [vue.createElementVNode("button", {
4655
+ }, null, 32), _cache[4] || (_cache[4] = vue.createTextVNode()), _ctx.hasHeaderSlot ? (vue.openBlock(), vue.createElementBlock("h1", _hoisted_7$c, [vue.renderSlot(_ctx.$slots, "header")], 512)) : vue.createCommentVNode("", true)]), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_8$8, [vue.renderSlot(_ctx.$slots, "content")], 512), _cache[6] || (_cache[6] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_9$6, [vue.renderSlot(_ctx.$slots, "footer")])]), _cache[9] || (_cache[9] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_10$3, [vue.createElementVNode("button", {
4656
4656
  type: "button",
4657
4657
  class: "close-button",
4658
4658
  "aria-label": _ctx.ariaCloseText,
@@ -4664,9 +4664,9 @@ function _sfc_render$Q(_ctx, _cache, $props, $setup, $data, $options) {
4664
4664
  onFocus: _cache[2] || (_cache[2] = (...args) => _ctx.onFocusLast && _ctx.onFocusLast(...args))
4665
4665
  }, null, 32)])])], 2)])], 32)])], 10, _hoisted_1$W)) : vue.createCommentVNode("", true);
4666
4666
  }
4667
- const FModal = /* @__PURE__ */ _export_sfc(_sfc_main$1c, [["render", _sfc_render$Q]]);
4668
- function prepareButtonList(src, buttonOrder = config.buttonOrder) {
4669
- const list = src.map((it) => {
4667
+ const FModal = /* @__PURE__ */ _export_sfc(_sfc_main$1c, [["render", _sfc_render$P]]);
4668
+ function prepareButtonList(src) {
4669
+ return src.map((it) => {
4670
4670
  var _it$event, _ref, _it$reason, _it$type;
4671
4671
  return {
4672
4672
  label: it.label,
@@ -4677,12 +4677,6 @@ function prepareButtonList(src, buttonOrder = config.buttonOrder) {
4677
4677
  buttonType: it.submitButton ? "submit" : "button"
4678
4678
  };
4679
4679
  });
4680
- switch (buttonOrder) {
4681
- case FKUIConfigButtonOrder.LEFT_TO_RIGHT:
4682
- return list;
4683
- case FKUIConfigButtonOrder.RIGHT_TO_LEFT:
4684
- return list.reverse();
4685
- }
4686
4680
  }
4687
4681
  const defaultButtons = [{
4688
4682
  label: "Primärknapp",
@@ -4780,7 +4774,8 @@ const _sfc_main$1b = vue.defineComponent({
4780
4774
  })],
4781
4775
  computed: {
4782
4776
  preparedButtons() {
4783
- return prepareButtonList(this.buttons);
4777
+ const preparedButtonList = prepareButtonList(this.buttons);
4778
+ return config.buttonOrder === FKUIConfigButtonOrder.RIGHT_TO_LEFT ? preparedButtonList.reverse() : preparedButtonList;
4784
4779
  }
4785
4780
  },
4786
4781
  methods: {
@@ -4801,11 +4796,11 @@ const _hoisted_1$V = {
4801
4796
  class: "button-group"
4802
4797
  };
4803
4798
  const _hoisted_2$E = ["onClick"];
4804
- const _hoisted_3$v = {
4799
+ const _hoisted_3$w = {
4805
4800
  key: 0,
4806
4801
  class: "sr-only"
4807
4802
  };
4808
- function _sfc_render$P(_ctx, _cache, $props, $setup, $data, $options) {
4803
+ function _sfc_render$O(_ctx, _cache, $props, $setup, $data, $options) {
4809
4804
  const _component_f_modal = vue.resolveComponent("f-modal");
4810
4805
  return vue.openBlock(), vue.createBlock(_component_f_modal, {
4811
4806
  fullscreen: _ctx.fullscreen,
@@ -4824,12 +4819,12 @@ function _sfc_render$P(_ctx, _cache, $props, $setup, $data, $options) {
4824
4819
  type: "button",
4825
4820
  class: vue.normalizeClass([button.classlist, "button-group__item"]),
4826
4821
  onClick: ($event) => _ctx.onClick(button)
4827
- }, [vue.createElementVNode("span", null, vue.toDisplayString(button.label), 1), _cache[0] || (_cache[0] = vue.createTextVNode()), button.screenreader ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$v, " " + vue.toDisplayString(button.screenreader), 1)) : vue.createCommentVNode("", true)], 10, _hoisted_2$E);
4822
+ }, [vue.createElementVNode("span", null, vue.toDisplayString(button.label), 1), _cache[0] || (_cache[0] = vue.createTextVNode()), button.screenreader ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$w, " " + vue.toDisplayString(button.screenreader), 1)) : vue.createCommentVNode("", true)], 10, _hoisted_2$E);
4828
4823
  }), 128))])]),
4829
4824
  _: 3
4830
4825
  }, 8, ["fullscreen", "is-open", "aria-close-text", "size", "focus", "onClose"]);
4831
4826
  }
4832
- const FConfirmModal = /* @__PURE__ */ _export_sfc(_sfc_main$1b, [["render", _sfc_render$P]]);
4827
+ const FConfirmModal = /* @__PURE__ */ _export_sfc(_sfc_main$1b, [["render", _sfc_render$O]]);
4833
4828
  const GAP = ["1x", "2x", "3x", "4x", "5x", "6x", "7x", "8x"];
4834
4829
  const ALIGNMENT = ["top", "center", "bottom"];
4835
4830
  const FLOAT = ["left", "center", "right"];
@@ -4908,12 +4903,12 @@ const _sfc_main$1a = vue.defineComponent({
4908
4903
  }
4909
4904
  }
4910
4905
  });
4911
- function _sfc_render$O(_ctx, _cache, $props, $setup, $data, $options) {
4906
+ function _sfc_render$N(_ctx, _cache, $props, $setup, $data, $options) {
4912
4907
  return vue.openBlock(), vue.createElementBlock("div", {
4913
4908
  class: vue.normalizeClass(["iflex", _ctx.classList])
4914
4909
  }, [vue.renderSlot(_ctx.$slots, "default")], 2);
4915
4910
  }
4916
- const IFlex = /* @__PURE__ */ _export_sfc(_sfc_main$1a, [["render", _sfc_render$O]]);
4911
+ const IFlex = /* @__PURE__ */ _export_sfc(_sfc_main$1a, [["render", _sfc_render$N]]);
4917
4912
  const _sfc_main$19 = vue.defineComponent({
4918
4913
  name: "IFlexItem",
4919
4914
  inheritAttrs: true,
@@ -4961,12 +4956,12 @@ const _sfc_main$19 = vue.defineComponent({
4961
4956
  }
4962
4957
  }
4963
4958
  });
4964
- function _sfc_render$N(_ctx, _cache, $props, $setup, $data, $options) {
4959
+ function _sfc_render$M(_ctx, _cache, $props, $setup, $data, $options) {
4965
4960
  return vue.openBlock(), vue.createElementBlock("div", {
4966
4961
  class: vue.normalizeClass(["iflex__item", _ctx.classList])
4967
4962
  }, [vue.renderSlot(_ctx.$slots, "default")], 2);
4968
4963
  }
4969
- const IFlexItem = /* @__PURE__ */ _export_sfc(_sfc_main$19, [["render", _sfc_render$N]]);
4964
+ const IFlexItem = /* @__PURE__ */ _export_sfc(_sfc_main$19, [["render", _sfc_render$M]]);
4970
4965
  function focusError(item) {
4971
4966
  const element = document.querySelector(`#${item.id}`);
4972
4967
  if (!element) {
@@ -5038,14 +5033,14 @@ const _hoisted_1$U = {
5038
5033
  const _hoisted_2$D = {
5039
5034
  key: 0
5040
5035
  };
5041
- const _hoisted_3$u = {
5036
+ const _hoisted_3$v = {
5042
5037
  class: "error-list__list error-list--list-style-none"
5043
5038
  };
5044
5039
  const _hoisted_4$p = ["onClick"];
5045
5040
  const _hoisted_5$k = {
5046
5041
  class: "error-list__link"
5047
5042
  };
5048
- function _sfc_render$M(_ctx, _cache, $props, $setup, $data, $options) {
5043
+ function _sfc_render$L(_ctx, _cache, $props, $setup, $data, $options) {
5049
5044
  const _component_f_icon = vue.resolveComponent("f-icon");
5050
5045
  const _component_i_flex_item = vue.resolveComponent("i-flex-item");
5051
5046
  const _component_i_flex = vue.resolveComponent("i-flex");
@@ -5068,7 +5063,7 @@ function _sfc_render$M(_ctx, _cache, $props, $setup, $data, $options) {
5068
5063
  })) : vue.createCommentVNode("", true), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.createVNode(_component_i_flex_item, {
5069
5064
  grow: ""
5070
5065
  }, {
5071
- default: vue.withCtx(() => [_ctx.hasTitleSlot ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$D, [vue.renderSlot(_ctx.$slots, "title")])) : vue.createCommentVNode("", true), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("ul", _hoisted_3$u, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.items, (item) => {
5066
+ default: vue.withCtx(() => [_ctx.hasTitleSlot ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$D, [vue.renderSlot(_ctx.$slots, "title")])) : vue.createCommentVNode("", true), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("ul", _hoisted_3$v, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.items, (item) => {
5072
5067
  return vue.openBlock(), vue.createElementBlock("li", {
5073
5068
  key: item.id,
5074
5069
  class: vue.normalizeClass(_ctx.liClasses(item))
@@ -5099,7 +5094,7 @@ function _sfc_render$M(_ctx, _cache, $props, $setup, $data, $options) {
5099
5094
  _: 3
5100
5095
  })]);
5101
5096
  }
5102
- const FErrorList = /* @__PURE__ */ _export_sfc(_sfc_main$18, [["render", _sfc_render$M]]);
5097
+ const FErrorList = /* @__PURE__ */ _export_sfc(_sfc_main$18, [["render", _sfc_render$L]]);
5103
5098
  var es_iterator_every = {};
5104
5099
  var hasRequiredEs_iterator_every;
5105
5100
  function requireEs_iterator_every() {
@@ -5257,13 +5252,13 @@ const _sfc_main$17 = vue.defineComponent({
5257
5252
  }
5258
5253
  }
5259
5254
  });
5260
- function _sfc_render$L(_ctx, _cache, $props, $setup, $data, $options) {
5255
+ function _sfc_render$K(_ctx, _cache, $props, $setup, $data, $options) {
5261
5256
  return vue.openBlock(), vue.createElementBlock("div", {
5262
5257
  onComponentValidity: _cache[0] || (_cache[0] = (...args) => _ctx.onComponentValidity && _ctx.onComponentValidity(...args)),
5263
5258
  onComponentUnmount: _cache[1] || (_cache[1] = (...args) => _ctx.onComponentUnmount && _ctx.onComponentUnmount(...args))
5264
5259
  }, [vue.renderSlot(_ctx.$slots, "default")], 32);
5265
5260
  }
5266
- const FValidationGroup = /* @__PURE__ */ _export_sfc(_sfc_main$17, [["render", _sfc_render$L]]);
5261
+ const FValidationGroup = /* @__PURE__ */ _export_sfc(_sfc_main$17, [["render", _sfc_render$K]]);
5267
5262
  var FValidationFormAction = /* @__PURE__ */ ((FValidationFormAction2) => {
5268
5263
  FValidationFormAction2[FValidationFormAction2["CONTINUE"] = 0] = "CONTINUE";
5269
5264
  FValidationFormAction2[FValidationFormAction2["CANCEL"] = 1] = "CANCEL";
@@ -5415,7 +5410,7 @@ const _hoisted_2$C = {
5415
5410
  tabindex: "-1",
5416
5411
  role: "group"
5417
5412
  };
5418
- function _sfc_render$K(_ctx, _cache, $props, $setup, $data, $options) {
5413
+ function _sfc_render$J(_ctx, _cache, $props, $setup, $data, $options) {
5419
5414
  const _component_f_error_list = vue.resolveComponent("f-error-list");
5420
5415
  const _component_f_validation_group = vue.resolveComponent("f-validation-group");
5421
5416
  return vue.openBlock(), vue.createBlock(_component_f_validation_group, {
@@ -5441,7 +5436,7 @@ function _sfc_render$K(_ctx, _cache, $props, $setup, $data, $options) {
5441
5436
  _: 3
5442
5437
  }, 8, ["modelValue"]);
5443
5438
  }
5444
- const FValidationForm = /* @__PURE__ */ _export_sfc(_sfc_main$16, [["render", _sfc_render$K]]);
5439
+ const FValidationForm = /* @__PURE__ */ _export_sfc(_sfc_main$16, [["render", _sfc_render$J]]);
5445
5440
  const _sfc_main$15 = vue.defineComponent({
5446
5441
  name: "FFormModal",
5447
5442
  components: {
@@ -5540,6 +5535,14 @@ const _sfc_main$15 = vue.defineComponent({
5540
5535
  default() {
5541
5536
  }
5542
5537
  },
5538
+ /**
5539
+ * List of buttons to display in the modal.
5540
+ * Each button is defined as an FModalButtonDescriptor with the following properties:
5541
+ * - `label` (String): The text displayed on the button.
5542
+ * - `event` (String): The event emitted when the button is clicked.
5543
+ * - `type` (String): The button type. Valid values are: "primary" or "secondary".
5544
+ * - `submitButton` (Boolean): Whether the button is a submit button.
5545
+ */
5543
5546
  buttons: {
5544
5547
  type: Array,
5545
5548
  required: false,
@@ -5561,7 +5564,7 @@ const _sfc_main$15 = vue.defineComponent({
5561
5564
  },
5562
5565
  computed: {
5563
5566
  preparedButtons() {
5564
- return prepareButtonList(this.buttons, FKUIConfigButtonOrder.RIGHT_TO_LEFT);
5567
+ return prepareButtonList(this.buttons);
5565
5568
  }
5566
5569
  },
5567
5570
  methods: {
@@ -5595,11 +5598,11 @@ const _hoisted_1$S = {
5595
5598
  class: "button-group"
5596
5599
  };
5597
5600
  const _hoisted_2$B = ["type", "form", "onClick"];
5598
- const _hoisted_3$t = {
5601
+ const _hoisted_3$u = {
5599
5602
  key: 0,
5600
5603
  class: "sr-only"
5601
5604
  };
5602
- function _sfc_render$J(_ctx, _cache, $props, $setup, $data, $options) {
5605
+ function _sfc_render$I(_ctx, _cache, $props, $setup, $data, $options) {
5603
5606
  const _component_f_validation_form = vue.resolveComponent("f-validation-form");
5604
5607
  const _component_f_modal = vue.resolveComponent("f-modal");
5605
5608
  return vue.openBlock(), vue.createBlock(_component_f_modal, {
@@ -5630,12 +5633,12 @@ function _sfc_render$J(_ctx, _cache, $props, $setup, $data, $options) {
5630
5633
  class: vue.normalizeClass([button.classlist, "button-group__item"]),
5631
5634
  form: button.buttonType === "submit" ? _ctx.formId : void 0,
5632
5635
  onClick: ($event) => button.buttonType === "button" ? _ctx.onCancel() : false
5633
- }, [vue.createElementVNode("span", null, vue.toDisplayString(button.label), 1), _cache[2] || (_cache[2] = vue.createTextVNode()), button.screenreader ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$t, " " + vue.toDisplayString(button.screenreader), 1)) : vue.createCommentVNode("", true)], 10, _hoisted_2$B);
5636
+ }, [vue.createElementVNode("span", null, vue.toDisplayString(button.label), 1), _cache[2] || (_cache[2] = vue.createTextVNode()), button.screenreader ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$u, " " + vue.toDisplayString(button.screenreader), 1)) : vue.createCommentVNode("", true)], 10, _hoisted_2$B);
5634
5637
  }), 128))])]),
5635
5638
  _: 3
5636
5639
  }, 8, ["data-test", "fullscreen", "is-open", "size", "aria-close-text", "onClose"]);
5637
5640
  }
5638
- const FFormModal = /* @__PURE__ */ _export_sfc(_sfc_main$15, [["render", _sfc_render$J]]);
5641
+ const FFormModal = /* @__PURE__ */ _export_sfc(_sfc_main$15, [["render", _sfc_render$I]]);
5639
5642
  async function confirmModal(callingInstance, texts) {
5640
5643
  const buttons = [{
5641
5644
  label: texts.confirm,
@@ -5952,6 +5955,9 @@ const ValidationPrefixDirective = {
5952
5955
  };
5953
5956
  const ValidationPlugin = {
5954
5957
  install(app) {
5958
+ for (const validator of logic.availableValidators) {
5959
+ logic.ValidationService.registerValidator(validator);
5960
+ }
5955
5961
  app.directive("validation", ValidationDirective);
5956
5962
  app.directive("validationPrefix", ValidationPrefixDirective);
5957
5963
  }
@@ -6008,12 +6014,12 @@ const _sfc_main$14 = vue.defineComponent({
6008
6014
  const _hoisted_1$R = {
6009
6015
  "data-test": "f-error-page"
6010
6016
  };
6011
- function _sfc_render$I(_ctx, _cache, $props, $setup, $data, $options) {
6017
+ function _sfc_render$H(_ctx, _cache, $props, $setup, $data, $options) {
6012
6018
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$R, _cache[0] || (_cache[0] = [vue.createElementVNode("h1", null, "Fel", -1), vue.createTextVNode(), vue.createElementVNode("p", null, "Ett fel har uppstått.", -1), vue.createTextVNode(), vue.createElementVNode("a", {
6013
6019
  href: "/"
6014
6020
  }, "Gå till startsidan", -1)]));
6015
6021
  }
6016
- const FErrorPage = /* @__PURE__ */ _export_sfc(_sfc_main$14, [["render", _sfc_render$I]]);
6022
+ const FErrorPage = /* @__PURE__ */ _export_sfc(_sfc_main$14, [["render", _sfc_render$H]]);
6017
6023
  const _sfc_main$13 = vue.defineComponent({
6018
6024
  name: "FErrorHandlingApp",
6019
6025
  props: {
@@ -6043,7 +6049,7 @@ const _sfc_main$13 = vue.defineComponent({
6043
6049
  });
6044
6050
  }
6045
6051
  });
6046
- function _sfc_render$H(_ctx, _cache, $props, $setup, $data, $options) {
6052
+ function _sfc_render$G(_ctx, _cache, $props, $setup, $data, $options) {
6047
6053
  return vue.openBlock(), vue.createElementBlock("div", null, [_ctx.hasError ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.errorComponent), {
6048
6054
  key: 0,
6049
6055
  payload: _ctx.payload
@@ -6053,7 +6059,7 @@ function _sfc_render$H(_ctx, _cache, $props, $setup, $data, $options) {
6053
6059
  key: 2
6054
6060
  })]);
6055
6061
  }
6056
- const FErrorHandlingApp = /* @__PURE__ */ _export_sfc(_sfc_main$13, [["render", _sfc_render$H]]);
6062
+ const FErrorHandlingApp = /* @__PURE__ */ _export_sfc(_sfc_main$13, [["render", _sfc_render$G]]);
6057
6063
  function isMonthBefore(date2, minDate) {
6058
6064
  return Boolean(minDate && date2.isBefore(minDate.startOfMonth()));
6059
6065
  }
@@ -6214,7 +6220,7 @@ const _hoisted_2$A = {
6214
6220
  class: "calendar-navbar__month",
6215
6221
  tabindex: "-1"
6216
6222
  };
6217
- const _hoisted_3$s = ["aria-disabled", "aria-live"];
6223
+ const _hoisted_3$t = ["aria-disabled", "aria-live"];
6218
6224
  const _hoisted_4$o = {
6219
6225
  class: "sr-only"
6220
6226
  };
@@ -6222,7 +6228,7 @@ const _hoisted_5$j = ["aria-disabled", "aria-live"];
6222
6228
  const _hoisted_6$f = {
6223
6229
  class: "sr-only"
6224
6230
  };
6225
- function _sfc_render$G(_ctx, _cache, $props, $setup, $data, $options) {
6231
+ function _sfc_render$F(_ctx, _cache, $props, $setup, $data, $options) {
6226
6232
  const _component_f_icon = vue.resolveComponent("f-icon");
6227
6233
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$Q, [vue.createElementVNode("div", _hoisted_2$A, vue.toDisplayString(_ctx.currentText), 1), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.createElementVNode("button", {
6228
6234
  ref: "previousButton",
@@ -6234,7 +6240,7 @@ function _sfc_render$G(_ctx, _cache, $props, $setup, $data, $options) {
6234
6240
  }, [vue.createElementVNode("span", _hoisted_4$o, vue.toDisplayString(_ctx.previousSrText), 1), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createVNode(_component_f_icon, {
6235
6241
  class: vue.normalizeClass(_ctx.previousIconClasses),
6236
6242
  name: "arrow-right"
6237
- }, null, 8, ["class"])], 8, _hoisted_3$s), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("button", {
6243
+ }, null, 8, ["class"])], 8, _hoisted_3$t), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("button", {
6238
6244
  ref: "nextButton",
6239
6245
  class: "calendar-navbar__arrow calendar-navbar__arrow--next",
6240
6246
  type: "button",
@@ -6246,7 +6252,7 @@ function _sfc_render$G(_ctx, _cache, $props, $setup, $data, $options) {
6246
6252
  name: "arrow-right"
6247
6253
  }, null, 8, ["class"])], 8, _hoisted_5$j)]);
6248
6254
  }
6249
- const ICalendarNavbar = /* @__PURE__ */ _export_sfc(_sfc_main$12, [["render", _sfc_render$G]]);
6255
+ const ICalendarNavbar = /* @__PURE__ */ _export_sfc(_sfc_main$12, [["render", _sfc_render$F]]);
6250
6256
  function getDayStartOffset(days) {
6251
6257
  return days[0].weekDay - 1;
6252
6258
  }
@@ -6332,7 +6338,7 @@ const _hoisted_2$z = {
6332
6338
  key: 0,
6333
6339
  class: "calendar-month__col--week"
6334
6340
  };
6335
- const _hoisted_3$r = {
6341
+ const _hoisted_3$s = {
6336
6342
  key: 0,
6337
6343
  scope: "col",
6338
6344
  "aria-hidden": "true",
@@ -6347,7 +6353,7 @@ const _hoisted_6$e = {
6347
6353
  class: "calendar-month__cell calendar-month__cell--week-number",
6348
6354
  "aria-hidden": "true"
6349
6355
  };
6350
- const _hoisted_7$c = ["colspan"];
6356
+ const _hoisted_7$b = ["colspan"];
6351
6357
  const _hoisted_8$7 = ["colspan"];
6352
6358
  const _hoisted_9$5 = {
6353
6359
  key: 0,
@@ -6359,7 +6365,7 @@ const _hoisted_11$2 = {
6359
6365
  "aria-hidden": "true"
6360
6366
  };
6361
6367
  const _hoisted_12$2 = ["colspan"];
6362
- function _sfc_render$F(_ctx, _cache, $props, $setup, $data, $options) {
6368
+ function _sfc_render$E(_ctx, _cache, $props, $setup, $data, $options) {
6363
6369
  return vue.openBlock(), vue.createElementBlock("table", {
6364
6370
  class: "calendar-month__table",
6365
6371
  role: "grid",
@@ -6380,7 +6386,7 @@ function _sfc_render$F(_ctx, _cache, $props, $setup, $data, $options) {
6380
6386
  class: "calendar-month__col--day"
6381
6387
  }, null, -1)), _cache[14] || (_cache[14] = vue.createTextVNode()), _cache[15] || (_cache[15] = vue.createElementVNode("col", {
6382
6388
  class: "calendar-month__col--day"
6383
- }, null, -1))]), _cache[22] || (_cache[22] = vue.createTextVNode()), vue.createElementVNode("thead", null, [vue.createElementVNode("tr", null, [!_ctx.internalHideWeekNumbers ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_3$r)) : vue.createCommentVNode("", true), _cache[16] || (_cache[16] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.weekdays, (weekday) => {
6389
+ }, null, -1))]), _cache[22] || (_cache[22] = vue.createTextVNode()), vue.createElementVNode("thead", null, [vue.createElementVNode("tr", null, [!_ctx.internalHideWeekNumbers ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_3$s)) : vue.createCommentVNode("", true), _cache[16] || (_cache[16] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.weekdays, (weekday) => {
6384
6390
  return vue.openBlock(), vue.createElementBlock("th", {
6385
6391
  key: weekday.name,
6386
6392
  scope: "col",
@@ -6397,7 +6403,7 @@ function _sfc_render$F(_ctx, _cache, $props, $setup, $data, $options) {
6397
6403
  key: 1,
6398
6404
  class: "calendar-month__cell",
6399
6405
  colspan: _ctx.getDayStartOffset(week.days)
6400
- }, null, 8, _hoisted_7$c)) : vue.createCommentVNode("", true), _cache[18] || (_cache[18] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(week.days, (day) => {
6406
+ }, null, 8, _hoisted_7$b)) : vue.createCommentVNode("", true), _cache[18] || (_cache[18] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(week.days, (day) => {
6401
6407
  return vue.openBlock(), vue.createElementBlock("td", {
6402
6408
  key: day.toString(),
6403
6409
  class: "calendar-month__cell",
@@ -6422,7 +6428,7 @@ function _sfc_render$F(_ctx, _cache, $props, $setup, $data, $options) {
6422
6428
  "aria-hidden": "true"
6423
6429
  }, null, 8, _hoisted_12$2)])) : vue.createCommentVNode("", true)])], 40, _hoisted_1$P);
6424
6430
  }
6425
- const ICalendarMonthGrid = /* @__PURE__ */ _export_sfc(_sfc_main$11, [["render", _sfc_render$F]]);
6431
+ const ICalendarMonthGrid = /* @__PURE__ */ _export_sfc(_sfc_main$11, [["render", _sfc_render$E]]);
6426
6432
  const DayStep = {
6427
6433
  ArrowRight: 1,
6428
6434
  ArrowLeft: -1,
@@ -6537,7 +6543,7 @@ const _sfc_main$10 = vue.defineComponent({
6537
6543
  }
6538
6544
  });
6539
6545
  const _hoisted_1$O = ["data-date", "tabindex", "onClick", "onKeydown"];
6540
- function _sfc_render$E(_ctx, _cache, $props, $setup, $data, $options) {
6546
+ function _sfc_render$D(_ctx, _cache, $props, $setup, $data, $options) {
6541
6547
  const _component_i_calendar_month_grid = vue.resolveComponent("i-calendar-month-grid");
6542
6548
  return vue.openBlock(), vue.createBlock(_component_i_calendar_month_grid, {
6543
6549
  value: _ctx.modelValue
@@ -6560,7 +6566,7 @@ function _sfc_render$E(_ctx, _cache, $props, $setup, $data, $options) {
6560
6566
  _: 3
6561
6567
  }, 8, ["value"]);
6562
6568
  }
6563
- const ICalendarMonth = /* @__PURE__ */ _export_sfc(_sfc_main$10, [["render", _sfc_render$E]]);
6569
+ const ICalendarMonth = /* @__PURE__ */ _export_sfc(_sfc_main$10, [["render", _sfc_render$D]]);
6564
6570
  const _sfc_main$$ = vue.defineComponent({
6565
6571
  name: "FCalendar",
6566
6572
  components: {
@@ -6615,7 +6621,7 @@ const _sfc_main$$ = vue.defineComponent({
6615
6621
  const _hoisted_1$N = {
6616
6622
  class: "calendar__wrapper"
6617
6623
  };
6618
- function _sfc_render$D(_ctx, _cache, $props, $setup, $data, $options) {
6624
+ function _sfc_render$C(_ctx, _cache, $props, $setup, $data, $options) {
6619
6625
  const _component_i_calendar_navbar = vue.resolveComponent("i-calendar-navbar");
6620
6626
  const _component_i_calendar_month = vue.resolveComponent("i-calendar-month");
6621
6627
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$N, [vue.createVNode(_component_i_calendar_navbar, {
@@ -6641,7 +6647,7 @@ function _sfc_render$D(_ctx, _cache, $props, $setup, $data, $options) {
6641
6647
  _: 3
6642
6648
  }, 8, ["model-value", "min-date", "max-date", "tab-date", "onClick", "onUpdate:modelValue"])]);
6643
6649
  }
6644
- const FCalendar = /* @__PURE__ */ _export_sfc(_sfc_main$$, [["render", _sfc_render$D]]);
6650
+ const FCalendar = /* @__PURE__ */ _export_sfc(_sfc_main$$, [["render", _sfc_render$C]]);
6645
6651
  function getCalendarDaySrText(day, enabled, selected, t) {
6646
6652
  const parts = [];
6647
6653
  if (!enabled) {
@@ -6731,12 +6737,12 @@ const _hoisted_1$M = {
6731
6737
  const _hoisted_2$y = {
6732
6738
  class: "sr-only"
6733
6739
  };
6734
- function _sfc_render$C(_ctx, _cache, $props, $setup, $data, $options) {
6740
+ function _sfc_render$B(_ctx, _cache, $props, $setup, $data, $options) {
6735
6741
  return vue.openBlock(), vue.createElementBlock("span", {
6736
6742
  class: vue.normalizeClass(_ctx.dayClasses)
6737
6743
  }, [vue.createElementVNode("span", _hoisted_1$M, vue.toDisplayString(_ctx.day.day), 1), _cache[0] || (_cache[0] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_2$y, vue.toDisplayString(_ctx.srText), 1)], 2);
6738
6744
  }
6739
- const FCalendarDay = /* @__PURE__ */ _export_sfc(_sfc_main$_, [["render", _sfc_render$C]]);
6745
+ const FCalendarDay = /* @__PURE__ */ _export_sfc(_sfc_main$_, [["render", _sfc_render$B]]);
6740
6746
  function useEventListener$1(target, event, callback) {
6741
6747
  vue.onMounted(() => {
6742
6748
  var _a;
@@ -6762,7 +6768,7 @@ const _hoisted_2$x = {
6762
6768
  key: 0,
6763
6769
  class: "card__header"
6764
6770
  };
6765
- const _hoisted_3$q = {
6771
+ const _hoisted_3$r = {
6766
6772
  class: "card__content"
6767
6773
  };
6768
6774
  const _hoisted_4$m = {
@@ -6807,6 +6813,9 @@ const _sfc_main$Z = /* @__PURE__ */ vue.defineComponent({
6807
6813
  if (!isMounted.value) {
6808
6814
  return;
6809
6815
  }
6816
+ if (detail.elementId !== props.id) {
6817
+ return;
6818
+ }
6810
6819
  if (!props.focusRef) {
6811
6820
  throw new Error("Element to focus on when card is invalid (`focusRef`) is required when using card validation.");
6812
6821
  }
@@ -6852,7 +6861,7 @@ const _sfc_main$Z = /* @__PURE__ */ vue.defineComponent({
6852
6861
  _: 1
6853
6862
  })]),
6854
6863
  _: 1
6855
- })) : vue.createCommentVNode("", true)]), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_3$q, [vue.renderSlot(_ctx.$slots, "default")]), _cache[3] || (_cache[3] = vue.createTextVNode()), hasFooterSlot.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$m, [vue.renderSlot(_ctx.$slots, "footer", vue.normalizeProps(vue.guardReactiveProps({
6864
+ })) : vue.createCommentVNode("", true)]), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_3$r, [vue.renderSlot(_ctx.$slots, "default")]), _cache[3] || (_cache[3] = vue.createTextVNode()), hasFooterSlot.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$m, [vue.renderSlot(_ctx.$slots, "footer", vue.normalizeProps(vue.guardReactiveProps({
6856
6865
  hasError: hasError.value,
6857
6866
  validationMessage: validationMessage.value
6858
6867
  })))])) : vue.createCommentVNode("", true)], 42, _hoisted_1$L);
@@ -6913,7 +6922,7 @@ const _sfc_main$Y = vue.defineComponent({
6913
6922
  }
6914
6923
  }
6915
6924
  });
6916
- function _sfc_render$B(_ctx, _cache, $props, $setup, $data, $options) {
6925
+ function _sfc_render$A(_ctx, _cache, $props, $setup, $data, $options) {
6917
6926
  return vue.openBlock(), vue.createBlock(vue.Transition, {
6918
6927
  onEnter: _ctx.enter,
6919
6928
  onAfterEnter: _ctx.afterEnter,
@@ -6925,7 +6934,7 @@ function _sfc_render$B(_ctx, _cache, $props, $setup, $data, $options) {
6925
6934
  _: 3
6926
6935
  }, 8, ["onEnter", "onAfterEnter", "onLeave"]);
6927
6936
  }
6928
- const FExpand = /* @__PURE__ */ _export_sfc(_sfc_main$Y, [["render", _sfc_render$B]]);
6937
+ const FExpand = /* @__PURE__ */ _export_sfc(_sfc_main$Y, [["render", _sfc_render$A]]);
6929
6938
  function offset(page, el) {
6930
6939
  const rect = el.getBoundingClientRect();
6931
6940
  return {
@@ -7491,7 +7500,7 @@ const _sfc_main$X = vue.defineComponent({
7491
7500
  }
7492
7501
  }
7493
7502
  });
7494
- function _sfc_render$A(_ctx, _cache, $props, $setup, $data, $options) {
7503
+ function _sfc_render$z(_ctx, _cache, $props, $setup, $data, $options) {
7495
7504
  return _ctx.isOpen ? (vue.openBlock(), vue.createBlock(vue.Teleport, {
7496
7505
  key: 0,
7497
7506
  to: _ctx.teleportTarget,
@@ -7512,7 +7521,7 @@ function _sfc_render$A(_ctx, _cache, $props, $setup, $data, $options) {
7512
7521
  placement: _ctx.placement
7513
7522
  })))], 544)], 16)], 8, ["to", "disabled"])) : vue.createCommentVNode("", true);
7514
7523
  }
7515
- const IPopup = /* @__PURE__ */ _export_sfc(_sfc_main$X, [["render", _sfc_render$A]]);
7524
+ const IPopup = /* @__PURE__ */ _export_sfc(_sfc_main$X, [["render", _sfc_render$z]]);
7516
7525
  function computeArrowOffset(placement, inputIconRect, wrapperRect) {
7517
7526
  switch (placement) {
7518
7527
  case Placement.A: {
@@ -7718,7 +7727,7 @@ const _hoisted_1$K = {
7718
7727
  ref: "wrapper",
7719
7728
  class: "popup-error__wrapper"
7720
7729
  };
7721
- function _sfc_render$z(_ctx, _cache, $props, $setup, $data, $options) {
7730
+ function _sfc_render$y(_ctx, _cache, $props, $setup, $data, $options) {
7722
7731
  const _component_f_icon = vue.resolveComponent("f-icon");
7723
7732
  return _ctx.isOpen ? (vue.openBlock(), vue.createBlock(vue.Teleport, {
7724
7733
  key: 0,
@@ -7742,7 +7751,7 @@ function _sfc_render$z(_ctx, _cache, $props, $setup, $data, $options) {
7742
7751
  class: "button__icon"
7743
7752
  })])], 6)], 512)], 2)], 8, ["to", "disabled"])) : vue.createCommentVNode("", true);
7744
7753
  }
7745
- const IPopupError = /* @__PURE__ */ _export_sfc(_sfc_main$W, [["render", _sfc_render$z]]);
7754
+ const IPopupError = /* @__PURE__ */ _export_sfc(_sfc_main$W, [["render", _sfc_render$y]]);
7746
7755
  function numItems(itemHeight, availableHeight, verticalSpacing) {
7747
7756
  const itemsFit = Math.floor((availableHeight - verticalSpacing) / itemHeight);
7748
7757
  return Math.min(itemsFit, 7);
@@ -8272,13 +8281,13 @@ const _hoisted_2$v = {
8272
8281
  role: "menu",
8273
8282
  class: "ipopupmenu__list"
8274
8283
  };
8275
- const _hoisted_3$p = ["onClick"];
8284
+ const _hoisted_3$q = ["onClick"];
8276
8285
  const _hoisted_4$l = ["data-ref-index", "href", "target"];
8277
8286
  const _hoisted_5$h = {
8278
8287
  key: 0,
8279
8288
  class: "sr-only"
8280
8289
  };
8281
- function _sfc_render$y(_ctx, _cache, $props, $setup, $data, $options) {
8290
+ function _sfc_render$x(_ctx, _cache, $props, $setup, $data, $options) {
8282
8291
  const _component_i_popup = vue.resolveComponent("i-popup");
8283
8292
  return vue.openBlock(), vue.createBlock(_component_i_popup, {
8284
8293
  class: "ipopupmenu",
@@ -8309,12 +8318,12 @@ function _sfc_render$y(_ctx, _cache, $props, $setup, $data, $options) {
8309
8318
  role: "menuitem",
8310
8319
  target: item.target,
8311
8320
  tabindex: "0"
8312
- }, [_ctx.isSelected(index) ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_5$h, [vue.createElementVNode("span", null, vue.toDisplayString(_ctx.selectedMenuItemScreenReaderText) + " ", 1)])) : vue.createCommentVNode("", true), vue.createTextVNode(" " + vue.toDisplayString(item.label), 1)], 8, _hoisted_4$l)], 10, _hoisted_3$p);
8321
+ }, [_ctx.isSelected(index) ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_5$h, [vue.createElementVNode("span", null, vue.toDisplayString(_ctx.selectedMenuItemScreenReaderText) + " ", 1)])) : vue.createCommentVNode("", true), vue.createTextVNode(" " + vue.toDisplayString(item.label), 1)], 8, _hoisted_4$l)], 10, _hoisted_3$q);
8313
8322
  }), 128))])], 8, _hoisted_1$I)]),
8314
8323
  _: 1
8315
8324
  }, 8, ["is-open", "anchor", "focus-element", "onKeyup", "onKeydown"]);
8316
8325
  }
8317
- const IPopupMenu = /* @__PURE__ */ _export_sfc(_sfc_main$U, [["render", _sfc_render$y]]);
8326
+ const IPopupMenu = /* @__PURE__ */ _export_sfc(_sfc_main$U, [["render", _sfc_render$x]]);
8318
8327
  const ANIMATION_DURATION = 500;
8319
8328
  const NO_CSS_CLASSES = "";
8320
8329
  const CLOSED_CSS_CLASS_OPACITY = "animate-expand animate-expand--opacity";
@@ -8517,13 +8526,13 @@ const _hoisted_1$H = {
8517
8526
  ref: "content",
8518
8527
  "data-test": "animation-content"
8519
8528
  };
8520
- function _sfc_render$x(_ctx, _cache, $props, $setup, $data, $options) {
8529
+ function _sfc_render$w(_ctx, _cache, $props, $setup, $data, $options) {
8521
8530
  return vue.openBlock(), vue.createElementBlock("div", {
8522
8531
  class: vue.normalizeClass(_ctx.animationClasses),
8523
8532
  style: vue.normalizeStyle(_ctx.heightStyle)
8524
8533
  }, [_ctx.shouldVIf ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", _hoisted_1$H, [vue.renderSlot(_ctx.$slots, "default")], 512)), [[vue.vShow, _ctx.shouldVShow]]) : vue.createCommentVNode("", true)], 6);
8525
8534
  }
8526
- const IAnimateExpand = /* @__PURE__ */ _export_sfc(_sfc_main$T, [["render", _sfc_render$x]]);
8535
+ const IAnimateExpand = /* @__PURE__ */ _export_sfc(_sfc_main$T, [["render", _sfc_render$w]]);
8527
8536
  const _sfc_main$S = vue.defineComponent({
8528
8537
  name: "ISkipLink",
8529
8538
  mixins: [TranslationMixin],
@@ -8539,13 +8548,13 @@ const _sfc_main$S = vue.defineComponent({
8539
8548
  }
8540
8549
  });
8541
8550
  const _hoisted_1$G = ["href"];
8542
- function _sfc_render$w(_ctx, _cache, $props, $setup, $data, $options) {
8551
+ function _sfc_render$v(_ctx, _cache, $props, $setup, $data, $options) {
8543
8552
  return vue.openBlock(), vue.createElementBlock("a", {
8544
8553
  class: "iskiplink",
8545
8554
  href: _ctx.href
8546
8555
  }, [vue.renderSlot(_ctx.$slots, "default", {}, () => [vue.createTextVNode(vue.toDisplayString(_ctx.$t("fkui.skip-link.text", "Gå direkt till innehåll")), 1)])], 8, _hoisted_1$G);
8547
8556
  }
8548
- const ISkipLink = /* @__PURE__ */ _export_sfc(_sfc_main$S, [["render", _sfc_render$w]]);
8557
+ const ISkipLink = /* @__PURE__ */ _export_sfc(_sfc_main$S, [["render", _sfc_render$v]]);
8549
8558
  function filterOptions(options, filter2, selectMode) {
8550
8559
  if (logic.isEmpty(filter2) || selectMode) {
8551
8560
  return options;
@@ -8795,7 +8804,7 @@ const _hoisted_1$F = {
8795
8804
  class: "combobox"
8796
8805
  };
8797
8806
  const _hoisted_2$u = ["id"];
8798
- const _hoisted_3$o = ["id", "aria-selected", "onClick"];
8807
+ const _hoisted_3$p = ["id", "aria-selected", "onClick"];
8799
8808
  const _sfc_main$R = /* @__PURE__ */ vue.defineComponent({
8800
8809
  __name: "IComboboxDropdown",
8801
8810
  props: {
@@ -8857,7 +8866,7 @@ const _sfc_main$R = /* @__PURE__ */ vue.defineComponent({
8857
8866
  "combobox__listbox__option--highlight": isOptionActive(item)
8858
8867
  }]),
8859
8868
  onClick: vue.withModifiers(($event) => onOptionClick(item), ["stop", "prevent"])
8860
- }, vue.toDisplayString(item), 11, _hoisted_3$o);
8869
+ }, vue.toDisplayString(item), 11, _hoisted_3$p);
8861
8870
  }), 128))], 8, _hoisted_2$u)]),
8862
8871
  _: 1
8863
8872
  }, 8, ["is-open", "anchor", "num-of-items", "active-element"])]);
@@ -9149,7 +9158,7 @@ const _hoisted_1$D = ["aria-expanded"];
9149
9158
  const _hoisted_2$t = {
9150
9159
  class: "icon-stack icon-stack--tooltip"
9151
9160
  };
9152
- const _hoisted_3$n = {
9161
+ const _hoisted_3$o = {
9153
9162
  class: "sr-only"
9154
9163
  };
9155
9164
  const _hoisted_4$k = {
@@ -9163,7 +9172,7 @@ const _hoisted_5$g = {
9163
9172
  const _hoisted_6$d = {
9164
9173
  class: "tooltip__footer"
9165
9174
  };
9166
- function _sfc_render$v(_ctx, _cache, $props, $setup, $data, $options) {
9175
+ function _sfc_render$u(_ctx, _cache, $props, $setup, $data, $options) {
9167
9176
  const _component_f_icon = vue.resolveComponent("f-icon");
9168
9177
  return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [(vue.openBlock(), vue.createBlock(vue.Teleport, {
9169
9178
  disabled: _ctx.iconTarget === null,
@@ -9178,7 +9187,7 @@ function _sfc_render$v(_ctx, _cache, $props, $setup, $data, $options) {
9178
9187
  name: "circle"
9179
9188
  }), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createVNode(_component_f_icon, {
9180
9189
  name: "i"
9181
- }), _cache[3] || (_cache[3] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_3$n, vue.toDisplayString(_ctx.screenReaderText), 1)])], 8, _hoisted_1$D)], 8, ["disabled", "to"])), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.createElementVNode("div", vue.mergeProps({
9190
+ }), _cache[3] || (_cache[3] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_3$o, vue.toDisplayString(_ctx.screenReaderText), 1)])], 8, _hoisted_1$D)], 8, ["disabled", "to"])), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.createElementVNode("div", vue.mergeProps({
9182
9191
  ref: "wrapper",
9183
9192
  class: "tooltip"
9184
9193
  }, _ctx.$attrs), [_ctx.ready ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$k, [_ctx.hasHeader ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.headerTag), {
@@ -9196,7 +9205,7 @@ function _sfc_render$v(_ctx, _cache, $props, $setup, $data, $options) {
9196
9205
  name: "close"
9197
9206
  })])])])) : vue.createCommentVNode("", true)], 16)], 64);
9198
9207
  }
9199
- const FTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$P, [["render", _sfc_render$v]]);
9208
+ const FTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$P, [["render", _sfc_render$u]]);
9200
9209
  function* labelClasses(options) {
9201
9210
  const {
9202
9211
  labelClass
@@ -9470,7 +9479,7 @@ const _hoisted_2$s = {
9470
9479
  key: 0,
9471
9480
  class: "sr-only"
9472
9481
  };
9473
- const _hoisted_3$m = {
9482
+ const _hoisted_3$n = {
9474
9483
  key: 0,
9475
9484
  class: "label__message label__message--error"
9476
9485
  };
@@ -9486,7 +9495,7 @@ const _hoisted_5$f = {
9486
9495
  const _hoisted_6$c = {
9487
9496
  key: 1
9488
9497
  };
9489
- const _hoisted_7$b = {
9498
+ const _hoisted_7$a = {
9490
9499
  ref: "tooltipAttachTo",
9491
9500
  class: "label"
9492
9501
  };
@@ -9497,7 +9506,7 @@ const _hoisted_9$4 = {
9497
9506
  key: 0,
9498
9507
  class: "label__message label__message--error"
9499
9508
  };
9500
- function _sfc_render$u(_ctx, _cache, $props, $setup, $data, $options) {
9509
+ function _sfc_render$t(_ctx, _cache, $props, $setup, $data, $options) {
9501
9510
  const _component_f_icon = vue.resolveComponent("f-icon");
9502
9511
  return vue.openBlock(), vue.createElementBlock("fieldset", {
9503
9512
  id: _ctx.id,
@@ -9512,12 +9521,12 @@ function _sfc_render$u(_ctx, _cache, $props, $setup, $data, $options) {
9512
9521
  }), _cache[3] || (_cache[3] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "error-message", vue.normalizeProps(vue.guardReactiveProps({
9513
9522
  hasError: _ctx.hasError,
9514
9523
  validationMessage: _ctx.validity.validationMessage
9515
- })), () => [_ctx.hasError ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$m, [vue.createVNode(_component_f_icon, {
9524
+ })), () => [_ctx.hasError ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$n, [vue.createVNode(_component_f_icon, {
9516
9525
  class: "label__icon--left",
9517
9526
  name: "error"
9518
9527
  }), vue.createTextVNode(" " + vue.toDisplayString(_ctx.validity.validationMessage), 1)])) : vue.createCommentVNode("", true)])], 2)), _cache[7] || (_cache[7] = vue.createTextVNode()), _ctx.hasCheckbox ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4$j, [_ctx.children.length === 1 ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_5$f, vue.toDisplayString(_ctx.checkboxCheckedScreenReaderText), 1)) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_6$c, vue.toDisplayString(_ctx.numberOfCheckedCheckboxesScreenText), 1))])) : vue.createCommentVNode("", true), _cache[8] || (_cache[8] = vue.createTextVNode()), _ctx.hasTooltipSlot ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, {
9519
9528
  key: 1
9520
- }, [vue.createElementVNode("div", _hoisted_7$b, [vue.createElementVNode("span", _hoisted_8$6, [vue.renderSlot(_ctx.$slots, "label")])], 512), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "tooltip"), _cache[6] || (_cache[6] = vue.createTextVNode()), _ctx.hasDescriptionSlot || _ctx.hasErrorMessageSlot || _ctx.hasError ? (vue.openBlock(), vue.createElementBlock("div", {
9529
+ }, [vue.createElementVNode("div", _hoisted_7$a, [vue.createElementVNode("span", _hoisted_8$6, [vue.renderSlot(_ctx.$slots, "label")])], 512), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "tooltip"), _cache[6] || (_cache[6] = vue.createTextVNode()), _ctx.hasDescriptionSlot || _ctx.hasErrorMessageSlot || _ctx.hasError ? (vue.openBlock(), vue.createElementBlock("div", {
9521
9530
  key: 0,
9522
9531
  class: vue.normalizeClass(["label", _ctx.groupLabelClass]),
9523
9532
  "aria-hidden": "true"
@@ -9534,7 +9543,7 @@ function _sfc_render$u(_ctx, _cache, $props, $setup, $data, $options) {
9534
9543
  class: vue.normalizeClass(_ctx.groupContentClass)
9535
9544
  }, [vue.renderSlot(_ctx.$slots, "default")], 2)], 42, _hoisted_1$C);
9536
9545
  }
9537
- const FFieldset = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["render", _sfc_render$u]]);
9546
+ const FFieldset = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["render", _sfc_render$t]]);
9538
9547
  const anyType$1 = [String, Object, Array, Number, Date, Boolean];
9539
9548
  const _sfc_main$N = vue.defineComponent({
9540
9549
  name: "FCheckboxField",
@@ -9724,7 +9733,7 @@ const _sfc_main$N = vue.defineComponent({
9724
9733
  });
9725
9734
  const _hoisted_1$B = ["id", "disabled"];
9726
9735
  const _hoisted_2$r = ["for"];
9727
- const _hoisted_3$l = {
9736
+ const _hoisted_3$m = {
9728
9737
  key: 0,
9729
9738
  class: "checkbox__details"
9730
9739
  };
@@ -9732,7 +9741,7 @@ const _hoisted_4$i = {
9732
9741
  key: 0,
9733
9742
  class: "checkbox__details"
9734
9743
  };
9735
- function _sfc_render$t(_ctx, _cache, $props, $setup, $data, $options) {
9744
+ function _sfc_render$s(_ctx, _cache, $props, $setup, $data, $options) {
9736
9745
  return vue.openBlock(), vue.createElementBlock("div", {
9737
9746
  class: vue.normalizeClass(["checkbox", _ctx.disabledClass]),
9738
9747
  onValidity: _cache[2] || (_cache[2] = (...args) => _ctx.onValidity && _ctx.onValidity(...args))
@@ -9750,7 +9759,7 @@ function _sfc_render$t(_ctx, _cache, $props, $setup, $data, $options) {
9750
9759
  for: _ctx.id
9751
9760
  }, [vue.renderSlot(_ctx.$slots, "default"), _cache[8] || (_cache[8] = vue.createTextVNode()), _ctx.$slots.details ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, {
9752
9761
  key: 0
9753
- }, [_ctx.showDetails === "always" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$l, [_cache[3] || (_cache[3] = vue.createElementVNode("br", null, null, -1)), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "details")])) : vue.createCommentVNode("", true), _cache[7] || (_cache[7] = vue.createTextVNode()), _ctx.showDetails === "when-selected" ? (vue.openBlock(), vue.createBlock(vue.Transition, {
9762
+ }, [_ctx.showDetails === "always" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$m, [_cache[3] || (_cache[3] = vue.createElementVNode("br", null, null, -1)), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "details")])) : vue.createCommentVNode("", true), _cache[7] || (_cache[7] = vue.createTextVNode()), _ctx.showDetails === "when-selected" ? (vue.openBlock(), vue.createBlock(vue.Transition, {
9754
9763
  key: 1,
9755
9764
  onEnter: _ctx.enter,
9756
9765
  onAfterEnter: _ctx.afterEnter,
@@ -9762,7 +9771,7 @@ function _sfc_render$t(_ctx, _cache, $props, $setup, $data, $options) {
9762
9771
  _: 3
9763
9772
  }, 8, ["onEnter", "onAfterEnter", "onLeave"])) : vue.createCommentVNode("", true)], 64)) : vue.createCommentVNode("", true)], 10, _hoisted_2$r)], 34);
9764
9773
  }
9765
- const FCheckboxField = /* @__PURE__ */ _export_sfc(_sfc_main$N, [["render", _sfc_render$t]]);
9774
+ const FCheckboxField = /* @__PURE__ */ _export_sfc(_sfc_main$N, [["render", _sfc_render$s]]);
9766
9775
  var es_iterator_some = {};
9767
9776
  var hasRequiredEs_iterator_some;
9768
9777
  function requireEs_iterator_some() {
@@ -10012,13 +10021,13 @@ const _hoisted_2$q = {
10012
10021
  tabindex: "-1",
10013
10022
  class: "contextmenu__list"
10014
10023
  };
10015
- const _hoisted_3$k = ["onClick"];
10024
+ const _hoisted_3$l = ["onClick"];
10016
10025
  const _hoisted_4$h = ["tabindex"];
10017
10026
  const _hoisted_5$e = {
10018
10027
  key: 0,
10019
10028
  class: "contextmenu__separator"
10020
10029
  };
10021
- function _sfc_render$s(_ctx, _cache, $props, $setup, $data, $options) {
10030
+ function _sfc_render$r(_ctx, _cache, $props, $setup, $data, $options) {
10022
10031
  const _component_f_icon = vue.resolveComponent("f-icon");
10023
10032
  const _component_i_popup = vue.resolveComponent("i-popup");
10024
10033
  return vue.openBlock(), vue.createBlock(_component_i_popup, {
@@ -10053,12 +10062,12 @@ function _sfc_render$s(_ctx, _cache, $props, $setup, $data, $options) {
10053
10062
  }, null, 8, ["name", "library"])) : vue.createCommentVNode("", true), _cache[3] || (_cache[3] = vue.createTextVNode()), vue.createElementVNode("a", {
10054
10063
  ref_for: true,
10055
10064
  ref: "anchors"
10056
- }, vue.toDisplayString(item.label), 513)], 8, _hoisted_4$h), _cache[4] || (_cache[4] = vue.createTextVNode()), _ctx.hasSeparatorAfterItemAt(index) ? (vue.openBlock(), vue.createElementBlock("hr", _hoisted_5$e)) : vue.createCommentVNode("", true)], 8, _hoisted_3$k);
10065
+ }, vue.toDisplayString(item.label), 513)], 8, _hoisted_4$h), _cache[4] || (_cache[4] = vue.createTextVNode()), _ctx.hasSeparatorAfterItemAt(index) ? (vue.openBlock(), vue.createElementBlock("hr", _hoisted_5$e)) : vue.createCommentVNode("", true)], 8, _hoisted_3$l);
10057
10066
  }), 128))], 512)], 40, _hoisted_1$A)]),
10058
10067
  _: 1
10059
10068
  }, 8, ["is-open", "anchor", "focus-element"]);
10060
10069
  }
10061
- const FContextMenu = /* @__PURE__ */ _export_sfc(_sfc_main$M, [["render", _sfc_render$s]]);
10070
+ const FContextMenu = /* @__PURE__ */ _export_sfc(_sfc_main$M, [["render", _sfc_render$r]]);
10062
10071
  var Operation = /* @__PURE__ */ ((Operation2) => {
10063
10072
  Operation2[Operation2["ADD"] = 0] = "ADD";
10064
10073
  Operation2[Operation2["DELETE"] = 1] = "DELETE";
@@ -10302,7 +10311,7 @@ const _sfc_main$L = /* @__PURE__ */ vue.defineComponent({
10302
10311
  isFormModalOpen.value = true;
10303
10312
  }
10304
10313
  return (_ctx, _cache) => {
10305
- return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$z, [vue.renderSlot(_ctx.$slots, "default"), _cache[5] || (_cache[5] = vue.createTextVNode()), hasAddSlot.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$p, [vue.createElementVNode("button", {
10314
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$z, [vue.renderSlot(_ctx.$slots, "default"), _cache[6] || (_cache[6] = vue.createTextVNode()), hasAddSlot.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$p, [vue.createElementVNode("button", {
10306
10315
  "data-test": "f-crud-dataset-add-button",
10307
10316
  type: "button",
10308
10317
  class: "button button--tertiary crud-dataset__add-button",
@@ -10310,7 +10319,9 @@ const _sfc_main$L = /* @__PURE__ */ vue.defineComponent({
10310
10319
  }, [vue.createVNode(vue.unref(FIcon), {
10311
10320
  class: "button__icon",
10312
10321
  name: "plus"
10313
- }), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "add-button", {}, () => [vue.createTextVNode(vue.toDisplayString(vue.unref($t2)("fkui.crud-dataset.button.add", "Lägg till ny")), 1)])])])) : vue.createCommentVNode("", true), _cache[6] || (_cache[6] = vue.createTextVNode()), vue.createVNode(vue.unref(FFormModal), {
10322
+ }), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "add-button", {}, () => [vue.createTextVNode(vue.toDisplayString(vue.unref($t2)("fkui.crud-dataset.button.add", "Lägg till ny")), 1)])]), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "buttons", vue.normalizeProps(vue.guardReactiveProps({
10323
+ buttonClasses: ["button", "button--tertiary", "crud-dataset__add-button"]
10324
+ })))])) : vue.createCommentVNode("", true), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.createVNode(vue.unref(FFormModal), {
10314
10325
  "is-open": isFormModalOpen.value,
10315
10326
  "aria-close-text": vue.unref($t2)("fkui.crud-dataset.modal.close", "Stäng"),
10316
10327
  buttons: formModalButtons.value,
@@ -10327,13 +10338,13 @@ const _sfc_main$L = /* @__PURE__ */ vue.defineComponent({
10327
10338
  key: 0
10328
10339
  }, {
10329
10340
  item: item.value
10330
- }))) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), operation.value === vue.unref(Operation).MODIFY ? vue.renderSlot(_ctx.$slots, "modify", vue.normalizeProps(vue.mergeProps({
10341
+ }))) : vue.createCommentVNode("", true), _cache[3] || (_cache[3] = vue.createTextVNode()), operation.value === vue.unref(Operation).MODIFY ? vue.renderSlot(_ctx.$slots, "modify", vue.normalizeProps(vue.mergeProps({
10331
10342
  key: 1
10332
10343
  }, {
10333
10344
  item: item.value
10334
10345
  }))) : vue.createCommentVNode("", true)]),
10335
10346
  _: 3
10336
- }, 8, ["is-open", "aria-close-text", "buttons", "before-submit", "before-validation", "on-cancel", "onCancel"]), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.createVNode(vue.unref(FConfirmModal), {
10347
+ }, 8, ["is-open", "aria-close-text", "buttons", "before-submit", "before-validation", "on-cancel", "onCancel"]), _cache[8] || (_cache[8] = vue.createTextVNode()), vue.createVNode(vue.unref(FConfirmModal), {
10337
10348
  "is-open": isConfirmModalOpen.value,
10338
10349
  buttons: confirmDeleteButtons.value,
10339
10350
  onConfirm: onDeleteConfirm,
@@ -10361,6 +10372,10 @@ const _sfc_main$K = vue.defineComponent({
10361
10372
  },
10362
10373
  mixins: [TranslationMixin],
10363
10374
  props: {
10375
+ /**
10376
+ * The action to be performed by the button.
10377
+ * Must be one of the following values: "delete" or "modify".
10378
+ */
10364
10379
  action: {
10365
10380
  type: String,
10366
10381
  required: true,
@@ -10368,14 +10383,24 @@ const _sfc_main$K = vue.defineComponent({
10368
10383
  return ["delete", "modify"].includes(value);
10369
10384
  }
10370
10385
  },
10386
+ /**
10387
+ * Determines if an icon should be displayed on the button.
10388
+ */
10371
10389
  icon: {
10372
10390
  type: Boolean,
10373
10391
  default: false
10374
10392
  },
10393
+ /**
10394
+ * The item that the action will be performed on.
10395
+ */
10375
10396
  item: {
10376
10397
  type: Object,
10377
10398
  required: true
10378
10399
  },
10400
+ /**
10401
+ * Determines if the button should display a label.
10402
+ * If false, the button will use a visually hidden text for accessibility.
10403
+ */
10379
10404
  label: {
10380
10405
  type: Boolean,
10381
10406
  default: false
@@ -10414,7 +10439,7 @@ const _hoisted_1$y = {
10414
10439
  key: 1,
10415
10440
  class: "sr-only"
10416
10441
  };
10417
- function _sfc_render$r(_ctx, _cache, $props, $setup, $data, $options) {
10442
+ function _sfc_render$q(_ctx, _cache, $props, $setup, $data, $options) {
10418
10443
  const _component_f_icon = vue.resolveComponent("f-icon");
10419
10444
  return vue.openBlock(), vue.createElementBlock("button", {
10420
10445
  type: "button",
@@ -10428,7 +10453,7 @@ function _sfc_render$r(_ctx, _cache, $props, $setup, $data, $options) {
10428
10453
  key: 2
10429
10454
  }, () => [vue.createTextVNode(vue.toDisplayString(_ctx.buttonText), 1)]) : vue.createCommentVNode("", true)]);
10430
10455
  }
10431
- const FCrudButton = /* @__PURE__ */ _export_sfc(_sfc_main$K, [["render", _sfc_render$r]]);
10456
+ const FCrudButton = /* @__PURE__ */ _export_sfc(_sfc_main$K, [["render", _sfc_render$q]]);
10432
10457
  function ActivateItemInjected() {
10433
10458
  return {
10434
10459
  registerCallbackAfterItemAdd: vue.inject("registerCallbackAfterItemAdd", () => void 0),
@@ -11019,13 +11044,19 @@ var FTableColumnSort = /* @__PURE__ */ ((FTableColumnSort2) => {
11019
11044
  return FTableColumnSort2;
11020
11045
  })(FTableColumnSort || {});
11021
11046
  function addColumn(src, column) {
11022
- if (!src.some((col) => col.name === column.name)) {
11047
+ if (column.name) {
11048
+ const hasDuplicateName = src.some((it) => it.name === column.name);
11049
+ if (hasDuplicateName) {
11050
+ throw new Error(`Expected FTableColumn to have a unique name but encountered duplicate of "${column.name}"`);
11051
+ }
11052
+ }
11053
+ if (!src.some((col) => col.id === column.id)) {
11023
11054
  return [...src, column];
11024
11055
  }
11025
11056
  return src;
11026
11057
  }
11027
11058
  function setVisibilityColumn(src, id, visible) {
11028
- const column = src.find((col) => col.name === id);
11059
+ const column = src.find((col) => col.id === id);
11029
11060
  if (column) {
11030
11061
  column.visible = visible;
11031
11062
  }
@@ -11077,19 +11108,21 @@ function FTableInjected() {
11077
11108
  renderColumns: vue.inject("renderColumns", false)
11078
11109
  };
11079
11110
  }
11080
- const _sfc_main$J = vue.defineComponent({
11081
- name: "FTableColumn",
11082
- inheritAttrs: false,
11111
+ const _sfc_main$J = /* @__PURE__ */ vue.defineComponent({
11112
+ ...{
11113
+ inheritAttrs: false
11114
+ },
11115
+ __name: "FTableColumn",
11083
11116
  props: {
11084
11117
  /**
11085
- * Unique (per-table) identifier.
11118
+ * Unique (per-table) identifier. Typically set to the row
11119
+ * property displayed but any unique string can be used.
11086
11120
  *
11087
- * Typically set to the row property displayed but any unique string can
11088
- * be used.
11121
+ * Only required when used with `FSortFilterDataset`.
11089
11122
  */
11090
11123
  name: {
11091
11124
  type: String,
11092
- required: true
11125
+ default: void 0
11093
11126
  },
11094
11127
  /**
11095
11128
  * If set to true, display the column, set to false to hide it.
@@ -11166,71 +11199,80 @@ const _sfc_main$J = vue.defineComponent({
11166
11199
  }
11167
11200
  }
11168
11201
  },
11169
- setup() {
11202
+ setup(__props) {
11170
11203
  const {
11171
11204
  renderColumns,
11172
11205
  setVisibilityColumn: setVisibilityColumn2,
11173
11206
  addColumn: addColumn2
11174
11207
  } = FTableInjected();
11175
- return {
11176
- renderColumns,
11177
- setVisibilityColumn: setVisibilityColumn2,
11178
- addColumn: addColumn2
11179
- };
11180
- },
11181
- computed: {
11182
- classes() {
11183
- return ["table__column", `table__column--${this.type}`];
11184
- },
11185
- scope() {
11186
- return this.rowHeader ? "row" : null;
11187
- },
11188
- tagName() {
11189
- if (this.rowHeader) {
11208
+ const internalVisible = vue.ref(true);
11209
+ const renderElement = vue.ref(true);
11210
+ const id = logic.ElementIdService.generateElementId("column");
11211
+ const el = vue.useTemplateRef("element");
11212
+ const props = __props;
11213
+ const classes = vue.computed(() => {
11214
+ return ["table__column", `table__column--${props.type}`];
11215
+ });
11216
+ const scope = vue.computed(() => {
11217
+ return props.rowHeader ? "row" : null;
11218
+ });
11219
+ const tagName2 = vue.computed(() => {
11220
+ if (props.rowHeader) {
11190
11221
  return "th";
11191
11222
  } else {
11192
11223
  return "td";
11193
11224
  }
11194
- }
11195
- },
11196
- watch: {
11197
- visible: {
11198
- handler: function() {
11199
- this.setVisibilityColumn(this.name, this.visible);
11225
+ });
11226
+ vue.watch(() => props.visible, () => {
11227
+ internalVisible.value = props.visible;
11228
+ setVisibilityColumn2(id, props.visible);
11229
+ });
11230
+ vue.onMounted(() => {
11231
+ if (props.shrink && props.expand) {
11232
+ throw new Error("Table cannot have both shrink and expand enabled at the same time");
11233
+ }
11234
+ const size = props.shrink ? FTableColumnSize.SHRINK : FTableColumnSize.EXPAND;
11235
+ const header = isHeader();
11236
+ if (header) {
11237
+ addColumn2({
11238
+ name: props.name,
11239
+ title: props.title,
11240
+ description: props.description || void 0,
11241
+ id,
11242
+ size,
11243
+ type: props.type,
11244
+ visible: props.visible,
11245
+ sortable: false,
11246
+ sort: FTableColumnSort.UNSORTED
11247
+ });
11200
11248
  }
11201
- }
11202
- },
11203
- created() {
11204
- if (this.shrink && this.expand) {
11205
- throw new Error("Table cannot have both shrink and expand enabled at the same time");
11206
- }
11207
- const size = this.shrink ? FTableColumnSize.SHRINK : FTableColumnSize.EXPAND;
11208
- this.addColumn({
11209
- name: this.name,
11210
- title: this.title,
11211
- description: this.description || void 0,
11212
- id: logic.ElementIdService.generateElementId("column"),
11213
- size,
11214
- type: this.type,
11215
- visible: this.visible,
11216
- sortable: false,
11217
- sort: FTableColumnSort.UNSORTED
11249
+ renderElement.value = renderColumns && !header;
11250
+ internalVisible.value = props.visible;
11218
11251
  });
11252
+ function isHeader() {
11253
+ if (!el.value || !(el.value instanceof HTMLElement)) {
11254
+ return false;
11255
+ }
11256
+ const closest = el.value.closest("thead, tbody");
11257
+ return (closest == null ? void 0 : closest.tagName) === "THEAD";
11258
+ }
11259
+ return (_ctx, _cache) => {
11260
+ return renderElement.value && internalVisible.value ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(tagName2.value), vue.mergeProps({
11261
+ key: 0,
11262
+ ref: "element",
11263
+ class: classes.value,
11264
+ scope: scope.value
11265
+ }, _ctx.$attrs), {
11266
+ default: vue.withCtx(() => [vue.unref(renderColumns) ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, {
11267
+ key: 0
11268
+ }, [vue.renderSlot(_ctx.$slots, "default"), _cache[0] || (_cache[0] = vue.createTextVNode()), _cache[1] || (_cache[1] = vue.createElementVNode("span", {
11269
+ class: "sr-only"
11270
+ }, " ", -1))], 64)) : vue.createCommentVNode("", true)]),
11271
+ _: 3
11272
+ }, 16, ["class", "scope"])) : vue.createCommentVNode("", true);
11273
+ };
11219
11274
  }
11220
11275
  });
11221
- function _sfc_render$q(_ctx, _cache, $props, $setup, $data, $options) {
11222
- return _ctx.renderColumns && _ctx.visible ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.tagName), vue.mergeProps({
11223
- key: 0,
11224
- class: _ctx.classes,
11225
- scope: _ctx.scope
11226
- }, _ctx.$attrs), {
11227
- default: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "default"), _cache[0] || (_cache[0] = vue.createTextVNode()), _cache[1] || (_cache[1] = vue.createElementVNode("span", {
11228
- class: "sr-only"
11229
- }, " ", -1))]),
11230
- _: 3
11231
- }, 16, ["class", "scope"])) : vue.createCommentVNode("", true);
11232
- }
11233
- const FTableColumn = /* @__PURE__ */ _export_sfc(_sfc_main$J, [["render", _sfc_render$q]]);
11234
11276
  function FSortFilterDatasetInjected() {
11235
11277
  return {
11236
11278
  sort: vue.inject("sort", () => void 0),
@@ -11284,14 +11326,14 @@ const _hoisted_2$o = {
11284
11326
  key: 0,
11285
11327
  ref: "tooltipAttachTo"
11286
11328
  };
11287
- const _hoisted_3$j = ["for"];
11329
+ const _hoisted_3$k = ["for"];
11288
11330
  const _hoisted_4$g = ["for"];
11289
11331
  const _hoisted_5$d = {
11290
11332
  key: 0,
11291
11333
  class: "label__message label__message--error"
11292
11334
  };
11293
11335
  const _hoisted_6$b = ["for"];
11294
- const _hoisted_7$a = {
11336
+ const _hoisted_7$9 = {
11295
11337
  key: 0,
11296
11338
  class: "label__message label__message--error"
11297
11339
  };
@@ -11300,7 +11342,7 @@ function _sfc_render$p(_ctx, _cache, $props, $setup, $data, $options) {
11300
11342
  return _ctx.$slots.tooltip ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$x, [_ctx.hasDefaultSlot ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$o, [vue.createElementVNode("label", {
11301
11343
  class: "label",
11302
11344
  for: _ctx.forProperty
11303
- }, [vue.renderSlot(_ctx.$slots, "default")], 8, _hoisted_3$j)], 512)) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "tooltip"), _cache[3] || (_cache[3] = vue.createTextVNode()), _ctx.hasDescriptionSlot || _ctx.hasErrorMessageSlot ? (vue.openBlock(), vue.createElementBlock("label", {
11345
+ }, [vue.renderSlot(_ctx.$slots, "default")], 8, _hoisted_3$k)], 512)) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "tooltip"), _cache[3] || (_cache[3] = vue.createTextVNode()), _ctx.hasDescriptionSlot || _ctx.hasErrorMessageSlot ? (vue.openBlock(), vue.createElementBlock("label", {
11304
11346
  key: 1,
11305
11347
  class: "label sr-separator",
11306
11348
  for: _ctx.forProperty
@@ -11317,7 +11359,7 @@ function _sfc_render$p(_ctx, _cache, $props, $setup, $data, $options) {
11317
11359
  }, [vue.renderSlot(_ctx.$slots, "default"), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "description", {
11318
11360
  descriptionClass: _ctx.descriptionClass,
11319
11361
  formatDescriptionClass: _ctx.formatDescriptionClass
11320
- }), _cache[6] || (_cache[6] = vue.createTextVNode()), _ctx.hasErrorMessageSlot ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_7$a, [vue.createVNode(_component_f_icon, {
11362
+ }), _cache[6] || (_cache[6] = vue.createTextVNode()), _ctx.hasErrorMessageSlot ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_7$9, [vue.createVNode(_component_f_icon, {
11321
11363
  class: "label__icon--left",
11322
11364
  name: "error"
11323
11365
  }), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "error-message")])) : vue.createCommentVNode("", true)], 8, _hoisted_6$b));
@@ -11895,7 +11937,7 @@ const _hoisted_2$n = {
11895
11937
  key: 0,
11896
11938
  class: "sr-only"
11897
11939
  };
11898
- const _hoisted_3$i = {
11940
+ const _hoisted_3$j = {
11899
11941
  key: 0,
11900
11942
  class: "sr-only"
11901
11943
  };
@@ -11907,7 +11949,7 @@ const _hoisted_6$a = {
11907
11949
  key: 2,
11908
11950
  class: "text-field__append-inner"
11909
11951
  };
11910
- const _hoisted_7$9 = {
11952
+ const _hoisted_7$8 = {
11911
11953
  key: 3,
11912
11954
  class: "text-field__append-inner"
11913
11955
  };
@@ -11938,7 +11980,7 @@ function _sfc_render$n(_ctx, _cache, $props, $setup, $data, $options) {
11938
11980
  }, [_ctx.descriptionScreenReaderText ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$n, vue.toDisplayString(_ctx.descriptionScreenReaderText), 1)) : vue.createCommentVNode("", true), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.createElementVNode("span", null, vue.toDisplayString(_ctx.descriptionText), 1)], 2)) : vue.createCommentVNode("", true), _cache[9] || (_cache[9] = vue.createTextVNode()), _ctx.discreteDescriptionText ? (vue.openBlock(), vue.createElementBlock("span", {
11939
11981
  key: 1,
11940
11982
  class: vue.normalizeClass(formatDescriptionClass)
11941
- }, [_ctx.discreteDescriptionScreenReaderText ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$i, vue.toDisplayString(_ctx.discreteDescriptionScreenReaderText), 1)) : vue.createCommentVNode("", true), _cache[8] || (_cache[8] = vue.createTextVNode()), vue.createElementVNode("span", null, vue.toDisplayString(_ctx.discreteDescriptionText), 1)], 2)) : vue.createCommentVNode("", true)])]),
11983
+ }, [_ctx.discreteDescriptionScreenReaderText ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$j, vue.toDisplayString(_ctx.discreteDescriptionScreenReaderText), 1)) : vue.createCommentVNode("", true), _cache[8] || (_cache[8] = vue.createTextVNode()), vue.createElementVNode("span", null, vue.toDisplayString(_ctx.discreteDescriptionText), 1)], 2)) : vue.createCommentVNode("", true)])]),
11942
11984
  "error-message": vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "error-message", vue.normalizeProps(vue.guardReactiveProps({
11943
11985
  hasError: _ctx.hasError,
11944
11986
  validationMessage: _ctx.validationMessage
@@ -11977,7 +12019,7 @@ function _sfc_render$n(_ctx, _cache, $props, $setup, $data, $options) {
11977
12019
  "is-open": _ctx.showPopupError,
11978
12020
  "error-message": _ctx.validationMessage,
11979
12021
  onClose: _ctx.closePopupError
11980
- }, null, 8, ["anchor", "is-open", "error-message", "onClose"])) : vue.createCommentVNode("", true), _cache[15] || (_cache[15] = vue.createTextVNode()), _ctx.$slots["append-inner"] ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_6$a, [vue.renderSlot(_ctx.$slots, "append-inner")])) : vue.createCommentVNode("", true), _cache[16] || (_cache[16] = vue.createTextVNode()), _ctx.options ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$9, [vue.createVNode(_component_i_combobox_toggle_button, {
12022
+ }, null, 8, ["anchor", "is-open", "error-message", "onClose"])) : vue.createCommentVNode("", true), _cache[15] || (_cache[15] = vue.createTextVNode()), _ctx.$slots["append-inner"] ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_6$a, [vue.renderSlot(_ctx.$slots, "append-inner")])) : vue.createCommentVNode("", true), _cache[16] || (_cache[16] = vue.createTextVNode()), _ctx.options ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$8, [vue.createVNode(_component_i_combobox_toggle_button, {
11981
12023
  disabled: _ctx.disabled,
11982
12024
  "aria-controls": _ctx.dropdownIsOpen ? _ctx.dropdownId : void 0,
11983
12025
  "aria-expanded": _ctx.dropdownIsOpen,
@@ -12825,20 +12867,14 @@ const _hoisted_1$s = {
12825
12867
  const _hoisted_2$m = {
12826
12868
  class: "sort-filter-dataset__search"
12827
12869
  };
12828
- const _hoisted_3$h = {
12870
+ const _hoisted_3$i = {
12829
12871
  class: "sr-only"
12830
12872
  };
12831
12873
  const _hoisted_4$e = ["title"];
12832
12874
  const _hoisted_5$b = {
12833
12875
  class: "sr-only"
12834
12876
  };
12835
- const _hoisted_6$9 = {
12836
- value: {
12837
- attribute: "",
12838
- ascending: false
12839
- }
12840
- };
12841
- const _hoisted_7$8 = ["value"];
12877
+ const _hoisted_6$9 = ["value"];
12842
12878
  const _sfc_main$s = /* @__PURE__ */ vue.defineComponent({
12843
12879
  __name: "FSortFilterDataset",
12844
12880
  props: {
@@ -12906,13 +12942,14 @@ const _sfc_main$s = /* @__PURE__ */ vue.defineComponent({
12906
12942
  }) {
12907
12943
  const $t2 = useTranslate();
12908
12944
  const searchString = vue.ref("");
12909
- const sortAttribute = vue.ref({
12945
+ const defaultSortValue = {
12910
12946
  attribute: "",
12911
12947
  name: "",
12912
12948
  ascendingName: "",
12913
12949
  ascending: false,
12914
12950
  id: 0
12915
- });
12951
+ };
12952
+ const sortAttribute = vue.ref(defaultSortValue);
12916
12953
  const sortFilterResult = vue.ref([]);
12917
12954
  const debouncedFilterResultset = logic.debounce(filterResultset, 250);
12918
12955
  let tableCallbackOnSort = () => {
@@ -13062,7 +13099,7 @@ const _sfc_main$s = /* @__PURE__ */ vue.defineComponent({
13062
13099
  maxlength: "64",
13063
13100
  onInput: onSearchInput
13064
13101
  }, {
13065
- default: vue.withCtx(() => [vue.createElementVNode("span", _hoisted_3$h, vue.toDisplayString(__props.placeholderFilter), 1)]),
13102
+ default: vue.withCtx(() => [vue.createElementVNode("span", _hoisted_3$i, vue.toDisplayString(__props.placeholderFilter), 1)]),
13066
13103
  _: 1
13067
13104
  }, 8, ["modelValue", "placeholder"]), _cache[4] || (_cache[4] = vue.createTextVNode()), showClearButton.value ? (vue.openBlock(), vue.createElementBlock("button", {
13068
13105
  key: 0,
@@ -13087,11 +13124,13 @@ const _sfc_main$s = /* @__PURE__ */ vue.defineComponent({
13087
13124
  onChange: onChangeSortAttribute
13088
13125
  }, {
13089
13126
  label: vue.withCtx(() => [vue.createTextVNode(vue.toDisplayString(vue.unref($t2)("fkui.sort-filter-dataset.label.sort", "Sortera på")), 1)]),
13090
- default: vue.withCtx(() => [_cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("option", _hoisted_6$9, vue.toDisplayString(vue.unref($t2)("fkui.sort-filter-dataset.label.unsorted", "Välj")), 1), _cache[6] || (_cache[6] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(sortOrders.value, (sortOrder) => {
13127
+ default: vue.withCtx(() => [_cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("option", {
13128
+ value: defaultSortValue
13129
+ }, vue.toDisplayString(vue.unref($t2)("fkui.sort-filter-dataset.label.unsorted", "Välj")), 1), _cache[6] || (_cache[6] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(sortOrders.value, (sortOrder) => {
13091
13130
  return vue.openBlock(), vue.createElementBlock("option", {
13092
13131
  key: sortOrder.id,
13093
13132
  value: sortOrder
13094
- }, vue.toDisplayString(sortOrder.name) + " (" + vue.toDisplayString(sortOrder.ascendingName) + ")\n ", 9, _hoisted_7$8);
13133
+ }, vue.toDisplayString(sortOrder.name) + " (" + vue.toDisplayString(sortOrder.ascendingName) + ")\n ", 9, _hoisted_6$9);
13095
13134
  }), 128))]),
13096
13135
  _: 1
13097
13136
  }, 8, ["modelValue"])]),
@@ -13112,7 +13151,7 @@ const _hoisted_1$r = ["tabindex"];
13112
13151
  const _hoisted_2$l = {
13113
13152
  key: 0
13114
13153
  };
13115
- const _hoisted_3$g = {
13154
+ const _hoisted_3$h = {
13116
13155
  class: "table__row"
13117
13156
  };
13118
13157
  const _hoisted_4$d = ["innerHTML"];
@@ -13259,6 +13298,9 @@ const _sfc_main$r = /* @__PURE__ */ vue.defineComponent({
13259
13298
  return;
13260
13299
  }
13261
13300
  let columnName = column.name;
13301
+ if (!columnName) {
13302
+ throw new Error("`FTableColumn` must have a unique `name` when used with `FSortFilterDataset`");
13303
+ }
13262
13304
  if (column.sort === FTableColumnSort.DESCENDING) {
13263
13305
  columnName = "";
13264
13306
  column.sort = FTableColumnSort.UNSORTED;
@@ -13280,12 +13322,14 @@ const _sfc_main$r = /* @__PURE__ */ vue.defineComponent({
13280
13322
  }, [vue.createElementVNode("table", vue.mergeProps({
13281
13323
  class: ["table", tableClasses.value],
13282
13324
  tabindex: tabindex.value
13283
- }, _ctx.$attrs), [hasCaption.value ? (vue.openBlock(), vue.createElementBlock("caption", _hoisted_2$l, [vue.renderSlot(_ctx.$slots, "caption")])) : vue.createCommentVNode("", true), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.createElementVNode("colgroup", null, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(columns.value, (column) => {
13325
+ }, _ctx.$attrs), [hasCaption.value ? (vue.openBlock(), vue.createElementBlock("caption", _hoisted_2$l, [vue.renderSlot(_ctx.$slots, "caption")])) : vue.createCommentVNode("", true), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("colgroup", null, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(columns.value, (column) => {
13284
13326
  return vue.openBlock(), vue.createElementBlock("col", {
13285
13327
  key: column.id,
13286
13328
  class: vue.normalizeClass(column.size)
13287
13329
  }, null, 2);
13288
- }), 128))]), _cache[5] || (_cache[5] = vue.createTextVNode()), vue.createElementVNode("thead", null, [vue.createElementVNode("tr", _hoisted_3$g, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleColumns.value, (column) => {
13330
+ }), 128))]), _cache[6] || (_cache[6] = vue.createTextVNode()), vue.createElementVNode("thead", null, [vue.createElementVNode("tr", _hoisted_3$h, [vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
13331
+ row: {}
13332
+ }))), _cache[2] || (_cache[2] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleColumns.value, (column) => {
13289
13333
  return vue.openBlock(), vue.createElementBlock("th", vue.mergeProps({
13290
13334
  key: column.id,
13291
13335
  scope: "col",
@@ -13299,12 +13343,12 @@ const _sfc_main$r = /* @__PURE__ */ vue.defineComponent({
13299
13343
  class: vue.normalizeClass(iconClasses2(column)),
13300
13344
  name: iconName(column)
13301
13345
  }, null, 8, ["class", "name"])) : vue.createCommentVNode("", true), _cache[1] || (_cache[1] = vue.createTextVNode()), column.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_5$a, vue.toDisplayString(column.description), 1)) : vue.createCommentVNode("", true)], 16);
13302
- }), 128))])]), _cache[6] || (_cache[6] = vue.createTextVNode()), vue.createElementVNode("tbody", null, [isEmpty.value && columns.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_6$8, [vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
13346
+ }), 128))])]), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.createElementVNode("tbody", null, [isEmpty.value && columns.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_6$8, [vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
13303
13347
  row: {}
13304
- })))])) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), isEmpty.value ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_7$7, [vue.createElementVNode("td", {
13348
+ })))])) : vue.createCommentVNode("", true), _cache[3] || (_cache[3] = vue.createTextVNode()), isEmpty.value ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_7$7, [vue.createElementVNode("td", {
13305
13349
  class: "table__column table__column--action",
13306
13350
  colspan: columns.value.length
13307
- }, [vue.renderSlot(_ctx.$slots, "empty", {}, () => [vue.createTextVNode(vue.toDisplayString(vue.unref($t2)("fkui.data-table.empty", "Tabellen är tom")), 1)])], 8, _hoisted_8$5)])) : vue.createCommentVNode("", true), _cache[3] || (_cache[3] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(internalRows.value, (row) => {
13351
+ }, [vue.renderSlot(_ctx.$slots, "empty", {}, () => [vue.createTextVNode(vue.toDisplayString(vue.unref($t2)("fkui.data-table.empty", "Tabellen är tom")), 1)])], 8, _hoisted_8$5)])) : vue.createCommentVNode("", true), _cache[4] || (_cache[4] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(internalRows.value, (row) => {
13308
13352
  return vue.openBlock(), vue.createElementBlock("tr", {
13309
13353
  key: rowKey(row),
13310
13354
  class: "table__row"
@@ -13655,7 +13699,7 @@ const _hoisted_1$q = {
13655
13699
  class: "datepicker-field"
13656
13700
  };
13657
13701
  const _hoisted_2$k = ["disabled", "aria-expanded"];
13658
- const _hoisted_3$f = {
13702
+ const _hoisted_3$g = {
13659
13703
  class: "sr-only"
13660
13704
  };
13661
13705
  const _hoisted_4$c = {
@@ -13706,7 +13750,7 @@ function _sfc_render$j(_ctx, _cache, $props, $setup, $data, $options) {
13706
13750
  onClick: _cache[0] || (_cache[0] = ($event) => _ctx.onClickCalendarButton())
13707
13751
  }, [vue.createVNode(_component_f_icon, {
13708
13752
  name: "calendar"
13709
- }), _cache[6] || (_cache[6] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_3$f, vue.toDisplayString(_ctx.calendarButtonText), 1)], 8, _hoisted_2$k)]),
13753
+ }), _cache[6] || (_cache[6] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_3$g, vue.toDisplayString(_ctx.calendarButtonText), 1)], 8, _hoisted_2$k)]),
13710
13754
  default: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "default", {}, () => [vue.createTextVNode(vue.toDisplayString(_ctx.$t("fkui.datepicker-field.label", "Datum")), 1)]), _cache[7] || (_cache[7] = vue.createTextVNode()), _cache[8] || (_cache[8] = vue.createTextVNode()), _cache[9] || (_cache[9] = vue.createTextVNode()), _cache[10] || (_cache[10] = vue.createTextVNode())]),
13711
13755
  _: 2
13712
13756
  }, [_ctx.$slots.tooltip ? {
@@ -13846,7 +13890,7 @@ const _hoisted_2$j = {
13846
13890
  key: 0,
13847
13891
  class: "dialogue-tree__list"
13848
13892
  };
13849
- const _hoisted_3$e = ["onClick"];
13893
+ const _hoisted_3$f = ["onClick"];
13850
13894
  function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
13851
13895
  const _component_f_icon = vue.resolveComponent("f-icon");
13852
13896
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$p, [_ctx.options.length > 0 ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_2$j, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.options, (option, index) => {
@@ -13860,7 +13904,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
13860
13904
  onClick: ($event) => _ctx.onClickedOption(option, index)
13861
13905
  }, [vue.createElementVNode("span", null, vue.toDisplayString(option.label), 1), _cache[0] || (_cache[0] = vue.createTextVNode()), vue.createVNode(_component_f_icon, {
13862
13906
  name: "arrow-right"
13863
- })], 8, _hoisted_3$e)]);
13907
+ })], 8, _hoisted_3$f)]);
13864
13908
  }), 128))])) : vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.mergeProps({
13865
13909
  key: 1
13866
13910
  }, {
@@ -13915,6 +13959,10 @@ const _sfc_main$o = vue.defineComponent({
13915
13959
  required: false,
13916
13960
  default: 0
13917
13961
  },
13962
+ /**
13963
+ * Text template for the screen reader notification text.
13964
+ * Use `%VALUE%` as a placeholder for the number of notifications.
13965
+ */
13918
13966
  screenReaderNotificationTemplate: {
13919
13967
  type: String,
13920
13968
  required: false,
@@ -13946,7 +13994,7 @@ const _hoisted_1$o = ["aria-expanded", "aria-controls"];
13946
13994
  const _hoisted_2$i = {
13947
13995
  class: "expandable-panel__icon"
13948
13996
  };
13949
- const _hoisted_3$d = {
13997
+ const _hoisted_3$e = {
13950
13998
  class: "icon-stack"
13951
13999
  };
13952
14000
  const _hoisted_4$b = ["title"];
@@ -13975,7 +14023,7 @@ function _sfc_render$h(_ctx, _cache, $props, $setup, $data, $options) {
13975
14023
  "aria-controls": _ctx.id
13976
14024
  }, _ctx.$attrs, {
13977
14025
  onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClickHeadingButton && _ctx.onClickHeadingButton(...args))
13978
- }), [vue.createElementVNode("span", _hoisted_2$i, [vue.createElementVNode("span", _hoisted_3$d, [vue.createVNode(_component_f_icon, {
14026
+ }), [vue.createElementVNode("span", _hoisted_2$i, [vue.createElementVNode("span", _hoisted_3$e, [vue.createVNode(_component_f_icon, {
13979
14027
  name: "dash"
13980
14028
  }), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.createVNode(_component_f_icon, {
13981
14029
  name: "dash"
@@ -14085,7 +14133,7 @@ const _hoisted_1$n = ["aria-expanded", "aria-controls"];
14085
14133
  const _hoisted_2$h = {
14086
14134
  class: "expandable-paragraph__icon"
14087
14135
  };
14088
- const _hoisted_3$c = {
14136
+ const _hoisted_3$d = {
14089
14137
  class: "icon-stack"
14090
14138
  };
14091
14139
  const _hoisted_4$a = {
@@ -14117,7 +14165,7 @@ function _sfc_render$g(_ctx, _cache, $props, $setup, $data, $options) {
14117
14165
  "aria-controls": _ctx.id
14118
14166
  }, _ctx.$attrs, {
14119
14167
  onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClickMinimize && _ctx.onClickMinimize(...args))
14120
- }), [vue.createElementVNode("span", _hoisted_2$h, [vue.createElementVNode("span", _hoisted_3$c, [vue.createVNode(_component_f_icon, {
14168
+ }), [vue.createElementVNode("span", _hoisted_2$h, [vue.createElementVNode("span", _hoisted_3$d, [vue.createVNode(_component_f_icon, {
14121
14169
  name: "dash"
14122
14170
  }), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.createVNode(_component_f_icon, {
14123
14171
  name: "dash"
@@ -14225,7 +14273,7 @@ const _hoisted_1$m = {
14225
14273
  const _hoisted_2$g = {
14226
14274
  class: "file-item__row"
14227
14275
  };
14228
- const _hoisted_3$b = ["id"];
14276
+ const _hoisted_3$c = ["id"];
14229
14277
  const _hoisted_4$9 = {
14230
14278
  class: "icon-stack button__icon icon-stack--new-window"
14231
14279
  };
@@ -14248,7 +14296,7 @@ function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
14248
14296
  name: "new-window"
14249
14297
  }), _cache[0] || (_cache[0] = vue.createTextVNode()), vue.createVNode(_component_f_icon, {
14250
14298
  name: _ctx.iconName
14251
- }, null, 8, ["name"])]), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_5$7, vue.toDisplayString(_ctx.fileName), 1), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_6$5, " " + vue.toDisplayString(_ctx.$t("fkui.file-item.file-open", "öppnas i nytt fönster")), 1)], 16, _hoisted_3$b), _cache[3] || (_cache[3] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "row")]), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default"), _cache[5] || (_cache[5] = vue.createTextVNode()), _ctx.isMimeTypeChanged ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$4, vue.toDisplayString(_ctx.mimeTypeChangedText), 1)) : vue.createCommentVNode("", true), _cache[6] || (_cache[6] = vue.createTextVNode()), _cache[7] || (_cache[7] = vue.createElementVNode("hr", {
14299
+ }, null, 8, ["name"])]), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_5$7, vue.toDisplayString(_ctx.fileName), 1), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("span", _hoisted_6$5, " " + vue.toDisplayString(_ctx.$t("fkui.file-item.file-open", "öppnas i nytt fönster")), 1)], 16, _hoisted_3$c), _cache[3] || (_cache[3] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "row")]), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default"), _cache[5] || (_cache[5] = vue.createTextVNode()), _ctx.isMimeTypeChanged ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$4, vue.toDisplayString(_ctx.mimeTypeChangedText), 1)) : vue.createCommentVNode("", true), _cache[6] || (_cache[6] = vue.createTextVNode()), _cache[7] || (_cache[7] = vue.createElementVNode("hr", {
14252
14300
  class: "file-item__separator"
14253
14301
  }, null, -1))]);
14254
14302
  }
@@ -14274,6 +14322,9 @@ const _sfc_main$l = vue.defineComponent({
14274
14322
  required: false,
14275
14323
  default: () => logic.ElementIdService.generateElementId()
14276
14324
  },
14325
+ /**
14326
+ * Disables the file selector.
14327
+ */
14277
14328
  disabled: {
14278
14329
  type: Boolean,
14279
14330
  required: false,
@@ -14318,7 +14369,7 @@ const _hoisted_1$l = {
14318
14369
  class: "file-selector"
14319
14370
  };
14320
14371
  const _hoisted_2$f = ["id", "aria-labelledby", "aria-disabled"];
14321
- const _hoisted_3$a = ["id", "for"];
14372
+ const _hoisted_3$b = ["id", "for"];
14322
14373
  function _sfc_render$e(_ctx, _cache, $props, $setup, $data, $options) {
14323
14374
  const _component_f_icon = vue.resolveComponent("f-icon");
14324
14375
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$l, [vue.createElementVNode("input", vue.mergeProps({
@@ -14338,7 +14389,7 @@ function _sfc_render$e(_ctx, _cache, $props, $setup, $data, $options) {
14338
14389
  }, [vue.createVNode(_component_f_icon, {
14339
14390
  class: "button__icon",
14340
14391
  name: "paper-clip"
14341
- }), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default")], 10, _hoisted_3$a)]);
14392
+ }), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default")], 10, _hoisted_3$b)]);
14342
14393
  }
14343
14394
  const FFileSelector = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["render", _sfc_render$e]]);
14344
14395
  const keybindings = {
@@ -14456,7 +14507,7 @@ const _hoisted_1$k = ["role"];
14456
14507
  const _hoisted_2$e = {
14457
14508
  key: 0
14458
14509
  };
14459
- const _hoisted_3$9 = {
14510
+ const _hoisted_3$a = {
14460
14511
  key: 0,
14461
14512
  class: "table__column--shrink"
14462
14513
  };
@@ -14658,7 +14709,7 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14658
14709
  expandableRows,
14659
14710
  hasExpandableContent
14660
14711
  } = expandableTable;
14661
- const tbodyElement = vue.useTemplateRef("tbodyElement");
14712
+ const tbody = vue.useTemplateRef("tbodyElement");
14662
14713
  const hasCaption = vue.computed(() => {
14663
14714
  return hasSlot2("caption", {}, {
14664
14715
  stripClasses: []
@@ -14740,21 +14791,21 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14740
14791
  immediate: true,
14741
14792
  deep: true
14742
14793
  });
14743
- function updateTr(tbodyElement2) {
14744
- const trElements = [].slice.call(tbodyElement2.children);
14794
+ function updateTr(tbodyElement) {
14795
+ const trElements = [].slice.call(tbodyElement.children);
14745
14796
  const trInteractableElements = trElements.filter((tr2) => {
14746
14797
  return tr2.tabIndex === 0;
14747
14798
  });
14748
14799
  tr.value = trInteractableElements;
14749
14800
  }
14750
14801
  vue.onUpdated(() => {
14751
- if (tbodyElement.value) {
14752
- updateTr(tbodyElement.value);
14802
+ if (tbody.value) {
14803
+ updateTr(tbody.value);
14753
14804
  }
14754
14805
  });
14755
14806
  vue.onMounted(() => {
14756
- if (tbodyElement.value) {
14757
- updateTr(tbodyElement.value);
14807
+ if (tbody.value) {
14808
+ updateTr(tbody.value);
14758
14809
  }
14759
14810
  registerCallbackOnSort(callbackOnSort);
14760
14811
  registerCallbackOnMount(callbackSortableColumns);
@@ -14868,6 +14919,9 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14868
14919
  return;
14869
14920
  }
14870
14921
  let columnName = column.name;
14922
+ if (!columnName) {
14923
+ throw new Error("`FTableColumn` must have a unique `name` when used with `FSortFilterDataset`");
14924
+ }
14871
14925
  if (column.sort === FTableColumnSort.DESCENDING) {
14872
14926
  columnName = "";
14873
14927
  column.sort = FTableColumnSort.UNSORTED;
@@ -14912,15 +14966,17 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14912
14966
  return (_ctx, _cache) => {
14913
14967
  return vue.openBlock(), vue.createElementBlock("div", {
14914
14968
  class: vue.normalizeClass(wrapperClasses.value)
14915
- }, [vue.createCommentVNode("", true), _cache[18] || (_cache[18] = vue.createTextVNode()), vue.createElementVNode("table", vue.mergeProps({
14969
+ }, [vue.createCommentVNode("", true), _cache[19] || (_cache[19] = vue.createTextVNode()), vue.createElementVNode("table", vue.mergeProps({
14916
14970
  class: ["table", tableClasses.value],
14917
14971
  role: tableRole.value
14918
- }, _ctx.$attrs), [hasCaption.value ? (vue.openBlock(), vue.createElementBlock("caption", _hoisted_2$e, [vue.renderSlot(_ctx.$slots, "caption")])) : vue.createCommentVNode("", true), _cache[15] || (_cache[15] = vue.createTextVNode()), vue.createElementVNode("colgroup", null, [vue.unref(isExpandableTable) ? (vue.openBlock(), vue.createElementBlock("col", _hoisted_3$9)) : vue.createCommentVNode("", true), _cache[0] || (_cache[0] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("col", _hoisted_4$8)) : vue.createCommentVNode("", true), _cache[1] || (_cache[1] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(columns.value, (column) => {
14972
+ }, _ctx.$attrs), [hasCaption.value ? (vue.openBlock(), vue.createElementBlock("caption", _hoisted_2$e, [vue.renderSlot(_ctx.$slots, "caption")])) : vue.createCommentVNode("", true), _cache[16] || (_cache[16] = vue.createTextVNode()), vue.createElementVNode("colgroup", null, [vue.unref(isExpandableTable) ? (vue.openBlock(), vue.createElementBlock("col", _hoisted_3$a)) : vue.createCommentVNode("", true), _cache[0] || (_cache[0] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("col", _hoisted_4$8)) : vue.createCommentVNode("", true), _cache[1] || (_cache[1] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(columns.value, (column) => {
14919
14973
  return vue.openBlock(), vue.createElementBlock("col", {
14920
14974
  key: column.id,
14921
14975
  class: vue.normalizeClass(column.size)
14922
14976
  }, null, 2);
14923
- }), 128))]), _cache[16] || (_cache[16] = vue.createTextVNode()), vue.createElementVNode("thead", null, [vue.createElementVNode("tr", _hoisted_5$6, [vue.unref(isExpandableTable) ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_6$4, [vue.createElementVNode("span", _hoisted_7$3, vue.toDisplayString(vue.unref($t2)("fkui.interactive-table.select", "Expandera")), 1)])) : vue.createCommentVNode("", true), _cache[4] || (_cache[4] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_8$3, [vue.createElementVNode("span", _hoisted_9$3, vue.toDisplayString(vue.unref($t2)("fkui.interactive-table.select", "Markera")), 1)])) : vue.createCommentVNode("", true), _cache[5] || (_cache[5] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleColumns.value, (column) => {
14977
+ }), 128))]), _cache[17] || (_cache[17] = vue.createTextVNode()), vue.createElementVNode("thead", null, [vue.createElementVNode("tr", _hoisted_5$6, [vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
14978
+ row: {}
14979
+ }))), _cache[4] || (_cache[4] = vue.createTextVNode()), vue.unref(isExpandableTable) ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_6$4, [vue.createElementVNode("span", _hoisted_7$3, vue.toDisplayString(vue.unref($t2)("fkui.interactive-table.select", "Expandera")), 1)])) : vue.createCommentVNode("", true), _cache[5] || (_cache[5] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_8$3, [vue.createElementVNode("span", _hoisted_9$3, vue.toDisplayString(vue.unref($t2)("fkui.interactive-table.select", "Markera")), 1)])) : vue.createCommentVNode("", true), _cache[6] || (_cache[6] = vue.createTextVNode()), (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleColumns.value, (column) => {
14924
14980
  return vue.openBlock(), vue.createElementBlock("th", vue.mergeProps({
14925
14981
  key: column.id,
14926
14982
  scope: "col",
@@ -14934,9 +14990,8 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14934
14990
  class: vue.normalizeClass(iconClasses2(column)),
14935
14991
  name: iconName(column)
14936
14992
  }, null, 8, ["class", "name"])) : vue.createCommentVNode("", true), _cache[3] || (_cache[3] = vue.createTextVNode()), column.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_11$1, vue.toDisplayString(column.description), 1)) : vue.createCommentVNode("", true)], 16);
14937
- }), 128))])]), _cache[17] || (_cache[17] = vue.createTextVNode()), (vue.openBlock(), vue.createElementBlock("tbody", {
14938
- ref_key: "tbodyElement",
14939
- ref: tbodyElement,
14993
+ }), 128))])]), _cache[18] || (_cache[18] = vue.createTextVNode()), (vue.openBlock(), vue.createElementBlock("tbody", {
14994
+ ref: "tbodyElement",
14940
14995
  key: tbodyKey.value
14941
14996
  }, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(internalRows.value, (row, index) => {
14942
14997
  return vue.openBlock(), vue.createElementBlock(vue.Fragment, {
@@ -14953,7 +15008,7 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14953
15008
  }, [vue.unref(isExpandableTable) ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_13, [vue.unref(hasExpandableContent)(row) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_14, [vue.createVNode(vue.unref(FIcon), {
14954
15009
  name: "arrow-right",
14955
15010
  rotate: vue.unref(isExpanded)(row) ? "270" : "90"
14956
- }, null, 8, ["rotate"])])) : vue.createCommentVNode("", true)])) : vue.createCommentVNode("", true), _cache[6] || (_cache[6] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_15, [vue.createElementVNode("div", _hoisted_16, [vue.createVNode(vue.unref(FCheckboxField), {
15011
+ }, null, 8, ["rotate"])])) : vue.createCommentVNode("", true)])) : vue.createCommentVNode("", true), _cache[7] || (_cache[7] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_15, [vue.createElementVNode("div", _hoisted_16, [vue.createVNode(vue.unref(FCheckboxField), {
14957
15012
  value: true,
14958
15013
  "model-value": isSelected(row),
14959
15014
  onClick: vue.withModifiers(($event) => onSelect(row), ["self"])
@@ -14964,20 +15019,20 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14964
15019
  row
14965
15020
  }))])) : vue.createCommentVNode("", true)]),
14966
15021
  _: 2
14967
- }, 1032, ["model-value", "onClick"])])])) : vue.createCommentVNode("", true), _cache[7] || (_cache[7] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default", vue.mergeProps({
15022
+ }, 1032, ["model-value", "onClick"])])])) : vue.createCommentVNode("", true), _cache[8] || (_cache[8] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default", vue.mergeProps({
14968
15023
  ref_for: true
14969
15024
  }, {
14970
15025
  row
14971
- }))], 42, _hoisted_12$1), _cache[11] || (_cache[11] = vue.createTextVNode()), vue.unref(isExpandableTable) && vue.unref(hasExpandableContent)(row) ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, {
15026
+ }))], 42, _hoisted_12$1), _cache[12] || (_cache[12] = vue.createTextVNode()), vue.unref(isExpandableTable) && vue.unref(hasExpandableContent)(row) ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, {
14972
15027
  key: 0
14973
15028
  }, vue.renderList(vue.unref(expandableRows)(row), (expandableRow, expandableIndex) => {
14974
15029
  return vue.openBlock(), vue.createElementBlock("tr", {
14975
15030
  key: rowKey(expandableRow),
14976
15031
  "aria-level": "2",
14977
15032
  class: vue.normalizeClass(vue.unref(expandableRowClasses)(row, expandableIndex))
14978
- }, [_cache[8] || (_cache[8] = vue.createElementVNode("td", {
15033
+ }, [_cache[9] || (_cache[9] = vue.createElementVNode("td", {
14979
15034
  class: "table__column--placeholder"
14980
- }, null, -1)), _cache[9] || (_cache[9] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_18)) : vue.createCommentVNode("", true), _cache[10] || (_cache[10] = vue.createTextVNode()), !vue.unref(hasExpandableSlot) ? vue.renderSlot(_ctx.$slots, "default", vue.mergeProps({
15035
+ }, null, -1)), _cache[10] || (_cache[10] = vue.createTextVNode()), __props.selectable ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_18)) : vue.createCommentVNode("", true), _cache[11] || (_cache[11] = vue.createTextVNode()), !vue.unref(hasExpandableSlot) ? vue.renderSlot(_ctx.$slots, "default", vue.mergeProps({
14981
15036
  key: 1,
14982
15037
  ref_for: true
14983
15038
  }, {
@@ -14993,12 +15048,12 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
14993
15048
  parentRow: row
14994
15049
  }))], 8, _hoisted_19))], 2);
14995
15050
  }), 128)) : vue.createCommentVNode("", true)], 64);
14996
- }), 128)), _cache[13] || (_cache[13] = vue.createTextVNode()), isEmpty.value && columns.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_20, [vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
15051
+ }), 128)), _cache[14] || (_cache[14] = vue.createTextVNode()), isEmpty.value && columns.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_20, [vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
14997
15052
  row: {}
14998
- })))])) : vue.createCommentVNode("", true), _cache[14] || (_cache[14] = vue.createTextVNode()), isEmpty.value ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_21, [vue.createElementVNode("td", {
15053
+ })))])) : vue.createCommentVNode("", true), _cache[15] || (_cache[15] = vue.createTextVNode()), isEmpty.value ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_21, [vue.createElementVNode("td", {
14999
15054
  class: "table__column table__column--action",
15000
15055
  colspan: nbOfColumns.value
15001
- }, [vue.renderSlot(_ctx.$slots, "empty", {}, () => [vue.createTextVNode(vue.toDisplayString(vue.unref($t2)("fkui.interactive-table.empty", "Tabellen är tom")), 1)])], 8, _hoisted_22), _cache[12] || (_cache[12] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
15056
+ }, [vue.renderSlot(_ctx.$slots, "empty", {}, () => [vue.createTextVNode(vue.toDisplayString(vue.unref($t2)("fkui.interactive-table.empty", "Tabellen är tom")), 1)])], 8, _hoisted_22), _cache[13] || (_cache[13] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "default", vue.normalizeProps(vue.guardReactiveProps({
15002
15057
  row: {}
15003
15058
  })))])) : vue.createCommentVNode("", true)]))], 16, _hoisted_1$k)], 2);
15004
15059
  };
@@ -15037,7 +15092,7 @@ const _hoisted_2$d = {
15037
15092
  ref: "header",
15038
15093
  class: "layout-application-template__header"
15039
15094
  };
15040
- const _hoisted_3$8 = {
15095
+ const _hoisted_3$9 = {
15041
15096
  key: 1
15042
15097
  };
15043
15098
  const _hoisted_4$7 = {
@@ -15051,7 +15106,7 @@ const _hoisted_5$5 = {
15051
15106
  function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
15052
15107
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$j, [_ctx.showHeader || _ctx.showTopNavigation ? (vue.openBlock(), vue.createElementBlock("header", _hoisted_2$d, [_ctx.showHeader ? vue.renderSlot(_ctx.$slots, "header", {
15053
15108
  key: 0
15054
- }) : vue.createCommentVNode("", true), _cache[0] || (_cache[0] = vue.createTextVNode()), _ctx.showTopNavigation ? (vue.openBlock(), vue.createElementBlock("nav", _hoisted_3$8, [vue.renderSlot(_ctx.$slots, "top-navigation")])) : vue.createCommentVNode("", true)], 512)) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("main", _hoisted_4$7, [vue.renderSlot(_ctx.$slots, "default"), _cache[1] || (_cache[1] = vue.createTextVNode()), _ctx.showFooter ? (vue.openBlock(), vue.createElementBlock("footer", _hoisted_5$5, [vue.renderSlot(_ctx.$slots, "footer")])) : vue.createCommentVNode("", true)], 512)]);
15109
+ }) : vue.createCommentVNode("", true), _cache[0] || (_cache[0] = vue.createTextVNode()), _ctx.showTopNavigation ? (vue.openBlock(), vue.createElementBlock("nav", _hoisted_3$9, [vue.renderSlot(_ctx.$slots, "top-navigation")])) : vue.createCommentVNode("", true)], 512)) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("main", _hoisted_4$7, [vue.renderSlot(_ctx.$slots, "default"), _cache[1] || (_cache[1] = vue.createTextVNode()), _ctx.showFooter ? (vue.openBlock(), vue.createElementBlock("footer", _hoisted_5$5, [vue.renderSlot(_ctx.$slots, "footer")])) : vue.createCommentVNode("", true)], 512)]);
15055
15110
  }
15056
15111
  const FLayoutApplicationTemplate = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["render", _sfc_render$d]]);
15057
15112
  function getGridClasses(target) {
@@ -15243,7 +15298,7 @@ const _hoisted_1$i = {
15243
15298
  class: "layout-navigation"
15244
15299
  };
15245
15300
  const _hoisted_2$c = ["aria-expanded"];
15246
- const _hoisted_3$7 = {
15301
+ const _hoisted_3$8 = {
15247
15302
  class: "layout-navigation__navigation__inner"
15248
15303
  };
15249
15304
  const _hoisted_4$6 = {
@@ -15257,7 +15312,7 @@ function _sfc_render$c(_ctx, _cache, $props, $setup, $data, $options) {
15257
15312
  class: "layout-navigation__navigation",
15258
15313
  style: vue.normalizeStyle(_ctx.navigationStyle),
15259
15314
  "aria-expanded": _ctx.isOpen
15260
- }, [vue.createElementVNode("div", _hoisted_3$7, [_ctx.isOpen ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, {
15315
+ }, [vue.createElementVNode("div", _hoisted_3$8, [_ctx.isOpen ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, {
15261
15316
  key: 0
15262
15317
  }, [vue.createElementVNode("div", {
15263
15318
  class: "layout-navigation__navigation__inner__title",
@@ -15502,7 +15557,7 @@ const _hoisted_2$a = {
15502
15557
  key: 0,
15503
15558
  class: "list__item"
15504
15559
  };
15505
- const _hoisted_3$6 = {
15560
+ const _hoisted_3$7 = {
15506
15561
  class: "list__item__itempane"
15507
15562
  };
15508
15563
  const _hoisted_4$5 = ["id", "aria-labelledby", "tabindex", "onKeydown"];
@@ -15762,7 +15817,7 @@ const _sfc_main$g = /* @__PURE__ */ vue.defineComponent({
15762
15817
  }, {
15763
15818
  item
15764
15819
  }))], 512)]);
15765
- }), 128)), _cache[0] || (_cache[0] = vue.createTextVNode()), isEmpty.value ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_2$a, [vue.createElementVNode("div", _hoisted_3$6, [vue.renderSlot(_ctx.$slots, "empty", {}, () => [vue.createElementVNode("em", null, vue.toDisplayString(vue.unref($t2)("fkui.list.empty", "Listan är tom")), 1)])])])) : vue.createCommentVNode("", true)])) : (vue.openBlock(), vue.createElementBlock("ul", {
15820
+ }), 128)), _cache[0] || (_cache[0] = vue.createTextVNode()), isEmpty.value ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_2$a, [vue.createElementVNode("div", _hoisted_3$7, [vue.renderSlot(_ctx.$slots, "empty", {}, () => [vue.createElementVNode("em", null, vue.toDisplayString(vue.unref($t2)("fkui.list.empty", "Listan är tom")), 1)])])])) : vue.createCommentVNode("", true)])) : (vue.openBlock(), vue.createElementBlock("ul", {
15766
15821
  key: 1,
15767
15822
  ref_key: "ulElement",
15768
15823
  ref: ulElement,
@@ -16561,7 +16616,7 @@ const _sfc_main$c = vue.defineComponent({
16561
16616
  });
16562
16617
  const _hoisted_1$c = ["aria-label"];
16563
16618
  const _hoisted_2$8 = ["data-ref-index", "onClick"];
16564
- const _hoisted_3$5 = {
16619
+ const _hoisted_3$6 = {
16565
16620
  class: "imenu__list__anchor-container"
16566
16621
  };
16567
16622
  const _hoisted_4$4 = ["data-ref-index", "href", "target"];
@@ -16602,7 +16657,7 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
16602
16657
  class: vue.normalizeClass(_ctx.itemClasses(item, index)),
16603
16658
  role: "none",
16604
16659
  onClick: (event) => _ctx.onClickItem(event, item)
16605
- }, [vue.createElementVNode("div", _hoisted_3$5, [vue.createElementVNode("a", {
16660
+ }, [vue.createElementVNode("div", _hoisted_3$6, [vue.createElementVNode("a", {
16606
16661
  ref_for: true,
16607
16662
  ref: "anchors",
16608
16663
  "data-ref-index": index,
@@ -16697,7 +16752,7 @@ const _hoisted_2$7 = {
16697
16752
  key: 0,
16698
16753
  class: "offline"
16699
16754
  };
16700
- const _hoisted_3$4 = {
16755
+ const _hoisted_3$5 = {
16701
16756
  class: "icon-stack icon-stack--error"
16702
16757
  };
16703
16758
  const _hoisted_4$3 = {
@@ -16720,7 +16775,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
16720
16775
  shrink: "",
16721
16776
  align: "center"
16722
16777
  }, {
16723
- default: vue.withCtx(() => [vue.createElementVNode("span", _hoisted_3$4, [vue.createVNode(_component_f_icon, {
16778
+ default: vue.withCtx(() => [vue.createElementVNode("span", _hoisted_3$5, [vue.createVNode(_component_f_icon, {
16724
16779
  name: "triangle"
16725
16780
  }), _cache[0] || (_cache[0] = vue.createTextVNode()), vue.createVNode(_component_f_icon, {
16726
16781
  name: "alert"
@@ -16849,7 +16904,7 @@ const _hoisted_1$9 = {
16849
16904
  const _hoisted_2$5 = {
16850
16905
  key: 0
16851
16906
  };
16852
- const _hoisted_3$3 = {
16907
+ const _hoisted_3$4 = {
16853
16908
  ref: "header",
16854
16909
  class: "page-header"
16855
16910
  };
@@ -16870,7 +16925,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
16870
16925
  }, {
16871
16926
  default: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "skip-link-text")]),
16872
16927
  _: 3
16873
- }, 8, ["href"])])) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_3$3, [_ctx.hasLogo ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$2, [vue.renderSlot(_ctx.$slots, "logo")])) : vue.createCommentVNode("", true), _cache[0] || (_cache[0] = vue.createTextVNode()), (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.headerTag), {
16928
+ }, 8, ["href"])])) : vue.createCommentVNode("", true), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("div", _hoisted_3$4, [_ctx.hasLogo ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$2, [vue.renderSlot(_ctx.$slots, "logo")])) : vue.createCommentVNode("", true), _cache[0] || (_cache[0] = vue.createTextVNode()), (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.headerTag), {
16874
16929
  class: "page-header__app-name"
16875
16930
  }, {
16876
16931
  default: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "default")]),
@@ -17015,7 +17070,7 @@ registerLayout({
17015
17070
  }
17016
17071
  }
17017
17072
  });
17018
- const styleContent = ':host {\n display: block;\n}\n\n.page-layout {\n display: grid;\n height: 100cqh;\n width: min(100%, 100cqw);\n\n &[part~="simple"] {\n grid-template:\n "header" min-content\n "content" 1fr\n "footer" min-content\n / 1fr;\n\n [part="area header"],\n [part="area footer"] {\n background: var(--f-background-pageheader-primary);\n color: var(--fkds-color-text-inverted);\n }\n\n [part="area content"] {\n background: var(--fkds-color-background-primary);\n color: var(--fkds-color-text-primary);\n }\n }\n\n &[part~="left-panel"] {\n grid-template:\n "header header" min-content\n "left content" 1fr\n "footer footer" min-content\n / min-content 1fr;\n\n [part="area header"],\n [part="area footer"] {\n background: var(--f-background-pageheader-primary);\n color: var(--fkds-color-text-inverted);\n }\n\n [part="area left"] {\n background: var(--fkds-color-background-secondary);\n }\n\n [part="area content"] {\n background: var(--fkds-color-background-primary);\n color: var(--fkds-color-text-primary);\n }\n }\n\n &[part~="right-panel"] {\n grid-template:\n "header header" min-content\n "content right" 1fr\n "footer footer" min-content\n / 1fr min-content;\n\n [part="area header"],\n [part="area footer"] {\n background: var(--f-background-pageheader-primary);\n color: var(--fkds-color-text-inverted);\n }\n\n [part="area right"] {\n background: var(--fkds-color-background-secondary);\n color: var(--fkds-color-text-primary);\n }\n\n [part="area content"] {\n background: var(--fkds-color-background-primary);\n color: var(--fkds-color-text-primary);\n }\n }\n\n &[part~="three-column"] {\n grid-template:\n "header header header" min-content\n "left content right" 1fr\n "footer footer footer" min-content\n / min-content 1fr min-content;\n\n [part="area header"],\n [part="area footer"] {\n background: var(--f-background-pageheader-primary);\n color: var(--fkds-color-text-inverted);\n }\n\n [part="area left"],\n [part="area right"] {\n background: var(--fkds-color-background-secondary);\n color: var(--fkds-color-text-primary);\n }\n\n [part="area content"] {\n background: var(--fkds-color-background-primary);\n color: var(--fkds-color-text-primary);\n }\n }\n}\n\n.page-layout__area {\n display: flex;\n position: relative;\n\n &[data-direction="column"] {\n flex-direction: column;\n }\n\n &[data-direction="row"] {\n flex-direction: row;\n }\n\n &[data-scroll] {\n overflow-y: auto;\n }\n\n &:empty {\n display: none;\n }\n}\n\n:host ::slotted(*) {\n display: contents;\n}\n';
17073
+ const styleContent = ':host {\n display: block;\n}\n\n.page-layout {\n display: grid;\n height: 100cqh;\n width: min(100%, 100cqw);\n\n &[part~="simple"] {\n grid-template:\n "header" min-content\n "content" 1fr\n "footer" min-content\n / 1fr;\n\n [part="area header"],\n [part="area footer"] {\n --f-page-layout-background: var(--f-background-pageheader-primary);\n --f-page-layout-color: var(--fkds-color-text-inverted);\n }\n\n [part="area content"] {\n --f-page-layout-background: var(--fkds-color-background-primary);\n --f-page-layout-color: var(--fkds-color-text-primary);\n }\n }\n\n &[part~="left-panel"] {\n grid-template:\n "header header" min-content\n "left content" 1fr\n "footer footer" min-content\n / min-content 1fr;\n\n [part="area header"],\n [part="area footer"] {\n --f-page-layout-background: var(--f-background-pageheader-primary);\n --f-page-layout-color: var(--fkds-color-text-inverted);\n }\n\n [part="area left"] {\n --f-page-layout-background: var(--fkds-color-background-secondary);\n }\n\n [part="area content"] {\n --f-page-layout-background: var(--fkds-color-background-primary);\n --f-page-layout-color: var(--fkds-color-text-primary);\n }\n }\n\n &[part~="right-panel"] {\n grid-template:\n "header header" min-content\n "content right" 1fr\n "footer footer" min-content\n / 1fr min-content;\n\n [part="area header"],\n [part="area footer"] {\n --f-page-layout-background: var(--f-background-pageheader-primary);\n --f-page-layout-color: var(--fkds-color-text-inverted);\n }\n\n [part="area right"] {\n --f-page-layout-background: var(--fkds-color-background-secondary);\n --f-page-layout-color: var(--fkds-color-text-primary);\n }\n\n [part="area content"] {\n --f-page-layout-background: var(--fkds-color-background-primary);\n --f-page-layout-color: var(--fkds-color-text-primary);\n }\n }\n\n &[part~="three-column"] {\n grid-template:\n "header header header" min-content\n "left content right" 1fr\n "footer footer footer" min-content\n / min-content 1fr min-content;\n\n [part="area header"],\n [part="area footer"] {\n --f-page-layout-background: var(--f-background-pageheader-primary);\n --f-page-layout-color: var(--fkds-color-text-inverted);\n }\n\n [part="area left"],\n [part="area right"] {\n --f-page-layout-background: var(--fkds-color-background-secondary);\n --f-page-layout-color: var(--fkds-color-text-primary);\n }\n\n [part="area content"] {\n --f-page-layout-background: var(--fkds-color-background-primary);\n --f-page-layout-color: var(--fkds-color-text-primary);\n }\n }\n}\n\n.page-layout__area {\n display: flex;\n position: relative;\n background: var(--f-page-layout-background);\n color: var(--f-page-layout-color);\n\n &[data-direction="column"] {\n flex-direction: column;\n }\n\n &[data-direction="row"] {\n flex-direction: row;\n }\n\n &[data-scroll] {\n overflow-y: auto;\n }\n\n &:empty {\n display: none;\n }\n}\n\n:host ::slotted(*) {\n display: contents;\n}\n';
17019
17074
  const stubLayout = defineLayout({
17020
17075
  name: "",
17021
17076
  areas: {}
@@ -17292,7 +17347,7 @@ const _hoisted_1$7 = {
17292
17347
  class: "progress"
17293
17348
  };
17294
17349
  const _hoisted_2$4 = ["aria-label", "aria-valuenow", "aria-valuetext"];
17295
- const _hoisted_3$2 = {
17350
+ const _hoisted_3$3 = {
17296
17351
  class: "sr-only"
17297
17352
  };
17298
17353
  const MIN_VALUE = 0;
@@ -17363,7 +17418,7 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
17363
17418
  "aria-valuenow": progressValueNow.value,
17364
17419
  "aria-valuetext": progressText.value,
17365
17420
  style: vue.normalizeStyle(cssWidth.value)
17366
- }, [vue.createElementVNode("span", _hoisted_3$2, vue.toDisplayString(progressText.value), 1)], 14, _hoisted_2$4)]);
17421
+ }, [vue.createElementVNode("span", _hoisted_3$3, vue.toDisplayString(progressText.value), 1)], 14, _hoisted_2$4)]);
17367
17422
  };
17368
17423
  }
17369
17424
  });
@@ -17526,7 +17581,7 @@ const _sfc_main$6 = vue.defineComponent({
17526
17581
  });
17527
17582
  const _hoisted_1$6 = ["id", "disabled"];
17528
17583
  const _hoisted_2$3 = ["for"];
17529
- const _hoisted_3$1 = {
17584
+ const _hoisted_3$2 = {
17530
17585
  key: 0,
17531
17586
  class: "radio-button__details"
17532
17587
  };
@@ -17548,7 +17603,7 @@ function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
17548
17603
  for: _ctx.id
17549
17604
  }, [vue.renderSlot(_ctx.$slots, "default"), _cache[6] || (_cache[6] = vue.createTextVNode()), _ctx.$slots.details ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, {
17550
17605
  key: 0
17551
- }, [_ctx.showDetails === "always" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$1, [_cache[1] || (_cache[1] = vue.createElementVNode("br", null, null, -1)), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "details")])) : vue.createCommentVNode("", true), _cache[5] || (_cache[5] = vue.createTextVNode()), _ctx.showDetails === "when-selected" ? (vue.openBlock(), vue.createBlock(vue.Transition, {
17606
+ }, [_ctx.showDetails === "always" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$2, [_cache[1] || (_cache[1] = vue.createElementVNode("br", null, null, -1)), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.renderSlot(_ctx.$slots, "details")])) : vue.createCommentVNode("", true), _cache[5] || (_cache[5] = vue.createTextVNode()), _ctx.showDetails === "when-selected" ? (vue.openBlock(), vue.createBlock(vue.Transition, {
17552
17607
  key: 1,
17553
17608
  onEnter: _ctx.enter,
17554
17609
  onAfterEnter: _ctx.afterEnter,
@@ -17679,7 +17734,7 @@ function computeCssValue(raw, total, auto) {
17679
17734
  return percent * total;
17680
17735
  } else if (raw === "0") {
17681
17736
  return 0;
17682
- } else if (raw === "auto") {
17737
+ } else if (raw === "auto" || raw === "") {
17683
17738
  return auto;
17684
17739
  } else {
17685
17740
  throw new Error(`Cant parse size from "${raw}"`);
@@ -17727,10 +17782,17 @@ function useStorage(options) {
17727
17782
  loaded.value = true;
17728
17783
  });
17729
17784
  }
17730
- const _hoisted_1$5 = ["aria-orientation"];
17785
+ const _hoisted_1$5 = {
17786
+ key: 0,
17787
+ class: "resize__offset"
17788
+ };
17731
17789
  const _hoisted_2$2 = ["aria-orientation"];
17790
+ const _hoisted_3$1 = ["aria-orientation"];
17732
17791
  const STEP_SIZE = 10;
17733
17792
  const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17793
+ ...{
17794
+ inheritAttrs: false
17795
+ },
17734
17796
  __name: "FResizePane.ce",
17735
17797
  props: {
17736
17798
  disabled: {
@@ -17748,10 +17810,22 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17748
17810
  initial: {
17749
17811
  default: "50%",
17750
17812
  type: String
17813
+ },
17814
+ overlay: {
17815
+ type: Boolean,
17816
+ default: false
17817
+ },
17818
+ offset: {
17819
+ default: 0,
17820
+ type: Number
17751
17821
  }
17752
17822
  },
17753
- setup(__props) {
17823
+ emits: ["resize"],
17824
+ setup(__props, {
17825
+ emit: __emit
17826
+ }) {
17754
17827
  const props = __props;
17828
+ const emit = __emit;
17755
17829
  const root = vue.shallowRef();
17756
17830
  const content = vue.ref();
17757
17831
  const separator = vue.ref();
@@ -17760,11 +17834,11 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17760
17834
  max: -1,
17761
17835
  current: -1
17762
17836
  });
17763
- const separatorSize = vue.ref(0);
17764
17837
  const layoutSize = vue.ref(0);
17765
17838
  const storageKey = vue.computed(() => area.value ? `layout/${area.value}/size` : null);
17766
17839
  const {
17767
17840
  attachPanel: attachment,
17841
+ direction,
17768
17842
  area
17769
17843
  } = useAreaData(root);
17770
17844
  useKeyboardHandler({
@@ -17797,11 +17871,11 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17797
17871
  });
17798
17872
  const minSize = vue.computed(() => {
17799
17873
  const total = layoutSize.value;
17800
- return Math.floor(aggregateCssValue(props.min, total, 0, Math.max) + separatorSize.value);
17874
+ return Math.floor(aggregateCssValue(props.min, total, 0, Math.max));
17801
17875
  });
17802
17876
  const maxSize = vue.computed(() => {
17803
17877
  const total = layoutSize.value;
17804
- return Math.floor(aggregateCssValue(props.max, total, total, Math.min) + separatorSize.value);
17878
+ return Math.max(Math.floor(aggregateCssValue(props.max, total, total, Math.min)), minSize.value);
17805
17879
  });
17806
17880
  const initialSize = vue.computed(() => {
17807
17881
  const total = layoutSize.value;
@@ -17814,6 +17888,9 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17814
17888
  return "vertical";
17815
17889
  }
17816
17890
  });
17891
+ const classes = vue.computed(() => {
17892
+ return [`resize--${attachment.value}`, `resize--${direction.value}`, props.overlay ? "resize--overlay" : void 0, props.disabled ? "resize--disabled" : void 0];
17893
+ });
17817
17894
  const layoutElement = vue.computed(() => {
17818
17895
  var _host$closest;
17819
17896
  if (!root.value) {
@@ -17823,6 +17900,8 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17823
17900
  const host = shadow.host;
17824
17901
  return (_host$closest = host.closest("ce-page-layout")) !== null && _host$closest !== void 0 ? _host$closest : void 0;
17825
17902
  });
17903
+ vue.watch(() => props.min, onResize);
17904
+ vue.watch(() => props.max, onResize);
17826
17905
  vue.watchEffect(() => {
17827
17906
  const {
17828
17907
  min,
@@ -17830,23 +17909,23 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17830
17909
  current: value
17831
17910
  } = state.value;
17832
17911
  if (root.value) {
17833
- root.value.style.setProperty("--size", `${String(value)}px`);
17834
- root.value.style.setProperty("--min", `${min}px`);
17835
- root.value.style.setProperty("--max", `${max}px`);
17912
+ const shadowRoot = root.value.getRootNode();
17913
+ const host = shadowRoot.host;
17914
+ host.style.setProperty("--size", `${String(value)}px`);
17915
+ host.style.setProperty("--min", `${min}px`);
17916
+ host.style.setProperty("--max", `${max}px`);
17917
+ host.style.setProperty("--offset", `${props.offset}px`);
17836
17918
  }
17837
17919
  if (separator.value) {
17838
17920
  separator.value.setAttribute("aria-valuemin", String(Math.floor(min)));
17839
17921
  separator.value.setAttribute("aria-valuemax", String(Math.floor(max)));
17840
17922
  separator.value.setAttribute("aria-valuenow", String(Math.floor(value)));
17841
17923
  }
17924
+ if (value >= 0) {
17925
+ emit("resize", value);
17926
+ }
17842
17927
  });
17843
17928
  vue.onMounted(() => {
17844
- if (separator.value) {
17845
- const {
17846
- flexBasis
17847
- } = getComputedStyle(separator.value);
17848
- separatorSize.value = computeCssValue(flexBasis, 0, 0);
17849
- }
17850
17929
  layoutSize.value = getLayoutSize();
17851
17930
  state.value = {
17852
17931
  min: minSize.value,
@@ -17877,11 +17956,11 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17877
17956
  }
17878
17957
  }
17879
17958
  return (_ctx, _cache) => {
17880
- return vue.openBlock(), vue.createElementBlock("div", {
17959
+ return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [_ctx.overlay && _ctx.offset ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5)) : vue.createCommentVNode("", true), _cache[1] || (_cache[1] = vue.createTextVNode()), vue.createElementVNode("div", vue.mergeProps({
17881
17960
  ref_key: "root",
17882
17961
  ref: root,
17883
- class: vue.normalizeClass(["resize", `resize--${vue.unref(attachment)}`])
17884
- }, [vue.createElementVNode("div", {
17962
+ class: ["resize", classes.value]
17963
+ }, _ctx.$attrs), [vue.createElementVNode("div", {
17885
17964
  ref_key: "content",
17886
17965
  ref: content,
17887
17966
  class: "resize__content"
@@ -17893,17 +17972,36 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
17893
17972
  class: "resize__handle",
17894
17973
  tabindex: "0",
17895
17974
  "aria-orientation": orientation.value
17896
- }, null, 8, _hoisted_1$5)) : (vue.openBlock(), vue.createElementBlock("div", {
17975
+ }, null, 8, _hoisted_2$2)) : (vue.openBlock(), vue.createElementBlock("div", {
17897
17976
  key: 1,
17898
17977
  role: "separator",
17899
17978
  class: "resize__handle disabled",
17900
17979
  "aria-orientation": orientation.value
17901
- }, null, 8, _hoisted_2$2))], 2);
17980
+ }, null, 8, _hoisted_3$1))], 16)], 64);
17902
17981
  };
17903
17982
  }
17904
17983
  });
17905
- const _style_0 = '/* background color */\n/* highlight color */\n/* the width of the visible handle */\n/* how much extra click/hover area the handle has */\n/* how much extra space the handle occupies when hovering (not counting the click area) */\n/* how long before visually indicating the hover state */\n/* how long the animation for the visual indicator is */\n:host {\n display: contents;\n}\n.resize {\n flex-grow: 1;\n display: flex;\n align-items: stretch;\n}\n.resize--left {\n flex-direction: row;\n width: var(--size);\n}\n.resize--right {\n flex-direction: row-reverse;\n width: var(--size);\n}\n.resize--top {\n flex-direction: column;\n height: var(--size);\n}\n.resize--bottom {\n flex-direction: column-reverse;\n height: var(--size);\n}\n.resize__content {\n flex: 1 1 auto;\n overflow: auto;\n box-sizing: border-box;\n display: flex;\n}\n.resize--left .resize__content, .resize--right .resize__content {\n min-width: calc(var(--min) - 2px);\n max-width: calc(var(--max) - 2px);\n}\n.resize--top .resize__content, .resize--bottom .resize__content {\n min-height: calc(var(--min) - 2px);\n max-height: calc(var(--max) - 2px);\n}\n.resize__handle {\n flex: 0 0 2px;\n background: var(--fkds-color-border-primary);\n touch-action: none;\n user-select: none;\n z-index: 1;\n position: relative;\n transition: z-index 0s 200ms;\n /* disable regular focus indicator as this component has its own */\n /* when focus by keyboard we dont want the delay or transition */\n /* as the handle area expand we increase z-index for the handle to make sure it covers other separators */\n}\n@media (forced-colors: active) {\n.resize__handle {\n background: CanvasText;\n}\n}\n.resize__handle[aria-orientation=horizontal] {\n cursor: row-resize;\n height: 2px;\n}\n.resize__handle[aria-orientation=horizontal]::before {\n inset: -2px 0;\n}\n.resize__handle[aria-orientation=horizontal]::after {\n inset: -4px 0;\n}\n.resize__handle[aria-orientation=vertical] {\n cursor: col-resize;\n width: 2px;\n}\n.resize__handle[aria-orientation=vertical]::before {\n inset: 0 -2px;\n}\n.resize__handle[aria-orientation=vertical]::after {\n inset: 0 -4px;\n}\n.resize__handle::before {\n content: "";\n pointer-events: none;\n position: absolute;\n background-color: transparent;\n transition: background-color 200ms ease-in;\n}\n.resize__handle::after {\n content: "";\n position: absolute;\n}\n.resize__handle:focus::before, .resize__handle:hover::before, .resize__handle.drag::before {\n background-color: var(--fkds-color-action-border-primary-hover);\n transition-delay: 200ms;\n}\n@media (forced-colors: active) {\n.resize__handle:focus::before, .resize__handle:hover::before, .resize__handle.drag::before {\n background-color: Highlight;\n}\n}\n.resize__handle:focus {\n outline: none;\n box-shadow: none;\n}\n.resize__handle:focus::before {\n transition: none;\n}\n.resize__handle:hover, .resize__handle:focus, .resize__handle.drag {\n z-index: 2;\n transition: z-index 0s 0s;\n}\n.resize__handle.disabled {\n cursor: auto;\n}\n.resize__handle.disabled::before {\n display: none;\n}\n.resize--left .resize__handle {\n left: 2px;\n}\n.resize--right .resize__handle {\n right: 2px;\n}\n.resize--top .resize__handle {\n top: 2px;\n}\n.resize--bottom .resize__handle {\n bottom: 2px;\n}';
17984
+ const _style_0 = '/* background color */\n/* highlight color */\n/* the width of the visible handle */\n/* how much extra click/hover area the handle has */\n/* how much extra space the handle occupies when hovering (not counting the click area) */\n/* how long before visually indicating the hover state */\n/* how long the animation for the visual indicator is */\n:host {\n display: contents;\n}\n:host([hidden]) {\n display: none;\n}\n:host ::slotted(*) {\n display: contents;\n}\n.resize {\n flex-grow: 1;\n display: flex;\n align-items: stretch;\n}\n.resize--overlay {\n position: absolute;\n z-index: 1;\n background: var(--f-page-layout-background);\n}\n.resize--left {\n flex-direction: row;\n}\n.resize--left:not(.resize--disabled) {\n width: calc(var(--size) + 2px);\n}\n.resize--left .resize__content {\n flex-direction: row;\n}\n.resize--left.resize--overlay {\n left: 0;\n top: 0;\n bottom: 0;\n}\n.resize--right {\n flex-direction: row-reverse;\n}\n.resize--right:not(.resize--disabled) {\n width: calc(var(--size) + 2px);\n}\n.resize--right .resize__content {\n flex-direction: row;\n}\n.resize--right.resize--overlay {\n right: 0;\n top: 0;\n bottom: 0;\n}\n.resize--top {\n flex-direction: column;\n}\n.resize--top:not(.resize--disabled) {\n height: calc(var(--size) + 2px);\n}\n.resize--bottom {\n flex-direction: column-reverse;\n}\n.resize--bottom:not(.resize--disabled) {\n height: calc(var(--size) + 2px);\n}\n.resize__offset {\n width: calc(var(--offset) + 2px);\n}\n.resize__content {\n flex: 1 1 auto;\n overflow: auto;\n box-sizing: border-box;\n display: flex;\n}\n.resize--column .resize__content {\n flex-direction: column;\n}\n.resize--row .resize__content {\n flex-direction: row;\n}\n.resize--left:not(.resize--disabled) .resize__content, .resize--right:not(.resize--disabled) .resize__content {\n min-width: var(--min);\n max-width: var(--max);\n flex-basis: var(--size);\n}\n.resize--top:not(.resize--disabled) .resize__content, .resize--bottom:not(.resize--disabled) .resize__content {\n min-height: var(--min);\n max-height: var(--max);\n flex-basis: var(--size);\n}\n.resize__handle {\n flex: 0 0 2px;\n background: var(--fkds-color-border-primary);\n touch-action: none;\n user-select: none;\n z-index: 1;\n position: relative;\n transition: z-index 0s 200ms;\n /* disable regular focus indicator as this component has its own */\n /* when focus by keyboard we dont want the delay or transition */\n /* as the handle area expand we increase z-index for the handle to make sure it covers other separators */\n}\n@media (forced-colors: active) {\n.resize__handle {\n background: CanvasText;\n}\n}\n.resize__handle[aria-orientation=horizontal] {\n cursor: row-resize;\n height: 2px;\n}\n.resize__handle[aria-orientation=horizontal]::before {\n inset: -2px 0;\n}\n.resize__handle[aria-orientation=horizontal]::after {\n inset: -4px 0;\n}\n.resize__handle[aria-orientation=vertical] {\n cursor: col-resize;\n width: 2px;\n}\n.resize__handle[aria-orientation=vertical]::before {\n inset: 0 -2px;\n}\n.resize__handle[aria-orientation=vertical]::after {\n inset: 0 -4px;\n}\n.resize__handle::before {\n content: "";\n pointer-events: none;\n position: absolute;\n background-color: transparent;\n transition: background-color 200ms ease-in;\n}\n.resize__handle::after {\n content: "";\n position: absolute;\n}\n.resize__handle:focus::before, .resize__handle:hover::before, .resize__handle.drag::before {\n background-color: var(--fkds-color-action-border-primary-hover);\n transition-delay: 200ms;\n}\n@media (forced-colors: active) {\n.resize__handle:focus::before, .resize__handle:hover::before, .resize__handle.drag::before {\n background-color: Highlight;\n}\n}\n.resize__handle:focus {\n outline: none;\n box-shadow: none;\n}\n.resize__handle:focus::before {\n transition: none;\n}\n.resize__handle:hover, .resize__handle:focus, .resize__handle.drag {\n z-index: 2;\n transition: z-index 0s 0s;\n}\n.resize__handle.disabled {\n cursor: auto;\n}\n.resize__handle.disabled::before {\n display: none;\n}';
17906
17985
  const FResizePane = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0]]]);
17986
+ const injectionKey = Symbol("FResizePane");
17987
+ function useResize(options = {}) {
17988
+ const api = vue.inject(injectionKey, {
17989
+ register() {
17990
+ return () => void 0;
17991
+ },
17992
+ size: vue.ref(0)
17993
+ });
17994
+ const unregister = api.register({
17995
+ enabled: options.enabled,
17996
+ visible: options.visible,
17997
+ overlay: options.overlay,
17998
+ offset: options.offset
17999
+ });
18000
+ vue.onUnmounted(unregister);
18001
+ return {
18002
+ size: api.size
18003
+ };
18004
+ }
17907
18005
  const _hoisted_1$4 = {
17908
18006
  slot: "content"
17909
18007
  };
@@ -17911,10 +18009,6 @@ const tagName = "ce-resize-pane";
17911
18009
  const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
17912
18010
  __name: "FResizePane",
17913
18011
  props: {
17914
- disabled: {
17915
- type: Boolean,
17916
- default: false
17917
- },
17918
18012
  min: {
17919
18013
  default: "0"
17920
18014
  },
@@ -17929,12 +18023,83 @@ const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
17929
18023
  if (!customElements.get(tagName)) {
17930
18024
  customElements.define(tagName, vue.defineCustomElement(FResizePane));
17931
18025
  }
18026
+ const anyEnabled = vue.ref(true);
18027
+ const anyVisible = vue.ref(true);
18028
+ const anyOverlay = vue.ref(false);
18029
+ const size = vue.ref(-1);
18030
+ const offset2 = vue.ref(0);
18031
+ let components = [];
18032
+ let n = 0;
18033
+ function any(src, predicate) {
18034
+ return src.length === 0 || src.some(predicate);
18035
+ }
18036
+ vue.provide(injectionKey, {
18037
+ register(options) {
18038
+ const component = {
18039
+ ...options,
18040
+ id: n++
18041
+ };
18042
+ components.push(component);
18043
+ const scope = vue.effectScope();
18044
+ scope.run(() => {
18045
+ vue.watchEffect(() => {
18046
+ anyEnabled.value = any(components, (it) => {
18047
+ var _a;
18048
+ var _it$enabled$value;
18049
+ return (_it$enabled$value = (_a = it.enabled) == null ? void 0 : _a.value) !== null && _it$enabled$value !== void 0 ? _it$enabled$value : true;
18050
+ });
18051
+ });
18052
+ vue.watchEffect(() => {
18053
+ anyVisible.value = any(components, (it) => {
18054
+ var _a;
18055
+ var _it$visible$value;
18056
+ return (_it$visible$value = (_a = it.visible) == null ? void 0 : _a.value) !== null && _it$visible$value !== void 0 ? _it$visible$value : true;
18057
+ });
18058
+ });
18059
+ vue.watchEffect(() => {
18060
+ anyOverlay.value = any(components, (it) => {
18061
+ var _a;
18062
+ var _it$overlay$value;
18063
+ return (_it$overlay$value = (_a = it.overlay) == null ? void 0 : _a.value) !== null && _it$overlay$value !== void 0 ? _it$overlay$value : false;
18064
+ });
18065
+ });
18066
+ vue.watchEffect(() => {
18067
+ if (components.length === 0) {
18068
+ return 0;
18069
+ }
18070
+ const offsets = components.map((it) => {
18071
+ var _a;
18072
+ return (_a = it.offset) == null ? void 0 : _a.value;
18073
+ }).filter((it) => typeof it === "number");
18074
+ offset2.value = Math.max(0, ...offsets);
18075
+ });
18076
+ });
18077
+ return () => {
18078
+ components = components.filter((it) => it.id !== component.id);
18079
+ scope.stop();
18080
+ };
18081
+ },
18082
+ size
18083
+ });
18084
+ const disabled = vue.computed(() => anyEnabled.value === false);
18085
+ const hidden = vue.computed(() => anyVisible.value === false);
18086
+ const overlay = vue.computed(() => anyOverlay.value === true);
17932
18087
  const props = __props;
18088
+ function onResize(event) {
18089
+ size.value = event.detail[0];
18090
+ }
17933
18091
  return (_ctx, _cache) => {
17934
- return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(tagName), vue.normalizeProps(vue.guardReactiveProps(props)), {
18092
+ return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(tagName), vue.mergeProps({
18093
+ disabled: disabled.value,
18094
+ hidden: hidden.value,
18095
+ overlay: overlay.value,
18096
+ offset: offset2.value
18097
+ }, props, {
18098
+ onResize
18099
+ }), {
17935
18100
  default: vue.withCtx(() => [vue.createElementVNode("div", _hoisted_1$4, [vue.renderSlot(_ctx.$slots, "default")])]),
17936
18101
  _: 3
17937
- }, 16);
18102
+ }, 16, ["disabled", "hidden", "overlay", "offset"]);
17938
18103
  };
17939
18104
  }
17940
18105
  });
@@ -18372,6 +18537,10 @@ const _sfc_main = vue.defineComponent({
18372
18537
  mixins: [TranslationMixin],
18373
18538
  inheritAttrs: true,
18374
18539
  props: {
18540
+ /**
18541
+ * The title of the wizard step.
18542
+ * This will be displayed as the step's header.
18543
+ */
18375
18544
  title: {
18376
18545
  type: String,
18377
18546
  required: true
@@ -18769,7 +18938,7 @@ exports.FSelectField = FSelectField;
18769
18938
  exports.FSortFilterDataset = _sfc_main$s;
18770
18939
  exports.FSortFilterDatasetInjected = FSortFilterDatasetInjected;
18771
18940
  exports.FStaticField = FStaticField;
18772
- exports.FTableColumn = FTableColumn;
18941
+ exports.FTableColumn = _sfc_main$J;
18773
18942
  exports.FTableColumnSize = FTableColumnSize;
18774
18943
  exports.FTableColumnSort = FTableColumnSort;
18775
18944
  exports.FTableColumnType = FTableColumnType;
@@ -18850,6 +19019,7 @@ exports.tooltipAttachTo = tooltipAttachTo;
18850
19019
  exports.useAreaData = useAreaData;
18851
19020
  exports.useCombobox = useCombobox;
18852
19021
  exports.useModal = useModal;
19022
+ exports.useResize = useResize;
18853
19023
  exports.useSlotUtils = useSlotUtils;
18854
19024
  exports.useTextFieldSetup = useTextFieldSetup;
18855
19025
  exports.useTranslate = useTranslate;