@frollo/frollo-web-ui 9.0.1 → 9.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/cjs/index.js +10733 -3062
  2. package/esm/{_rollupPluginBabelHelpers-DODWUb5N.js → _rollupPluginBabelHelpers-BKlDnZ7n.js} +1 -1
  3. package/esm/fw-accordion.js +15 -18
  4. package/esm/fw-alert.js +32 -25
  5. package/esm/fw-bar-chart.js +265 -93
  6. package/esm/fw-button-DZTHZLjk.js +318 -0
  7. package/esm/fw-button.js +2 -2
  8. package/esm/{fw-card-D45R4kN-.js → fw-card-XGtsK2bM.js} +7 -10
  9. package/esm/fw-card.js +2 -2
  10. package/esm/fw-checkbox.js +8 -11
  11. package/esm/fw-date-picker.js +85 -49
  12. package/esm/fw-drawer.js +9 -9
  13. package/esm/{fw-dropdown-58wyuzsW.js → fw-dropdown-CSmYTm5O.js} +11 -14
  14. package/esm/fw-dropdown.js +7 -6
  15. package/esm/fw-form.js +1 -1
  16. package/esm/fw-icons.js +11 -12
  17. package/esm/fw-image-A2lXYs0u.js +325 -0
  18. package/esm/fw-image.js +5 -4
  19. package/esm/{fw-input-C2-cZ-BY.js → fw-input-BiPWWfK3.js} +12 -19
  20. package/esm/fw-input.js +3 -3
  21. package/esm/fw-loading-bar-3x4tkF1B.js +37 -0
  22. package/esm/fw-loading.js +89 -40
  23. package/esm/fw-media-picker.js +10 -653
  24. package/esm/fw-modal.js +11 -10
  25. package/esm/fw-navigation-menu.js +36 -41
  26. package/esm/fw-popover-BZ-zqUme.js +330 -0
  27. package/esm/fw-popover.js +2 -3
  28. package/esm/fw-progress-bar.js +1 -1
  29. package/esm/fw-provider-list.js +108 -88
  30. package/esm/fw-sidebar-menu.js +58 -51
  31. package/esm/fw-slider.js +64 -61
  32. package/esm/fw-switch.js +76 -49
  33. package/esm/fw-table-row-BU0xaybR.js +447 -0
  34. package/esm/fw-table.js +5 -6
  35. package/esm/fw-tabs.js +87 -35
  36. package/esm/fw-tag-BRxPc4zc.js +199 -0
  37. package/esm/fw-tag.js +4 -4
  38. package/esm/fw-toast.js +58 -76
  39. package/esm/fw-transactions-card.js +20 -20
  40. package/esm/{get-root-colours-DCjlYelc.js → get-root-colours-DCCAnRF4.js} +3 -1
  41. package/esm/index-C8z11jcJ.js +7583 -0
  42. package/esm/index-DHyRsKsZ.js +843 -0
  43. package/esm/index-eP2GMSdQ.js +755 -0
  44. package/esm/index.js +54 -61
  45. package/esm/{uniqueId-DZdGzBh8.js → uniqueId-DK6xzFd8.js} +1 -1
  46. package/esm/{vee-validate.esm-3ptvCDR1.js → vee-validate-0dtT5GSQ.js} +182 -305
  47. package/frollo-web-ui.esm.js +10790 -3117
  48. package/icons/circle-check.svg +4 -0
  49. package/index.d.ts +1522 -586
  50. package/package.json +11 -11
  51. package/styles/tailwind.css +34 -2
  52. package/types/components/fw-accordion/fw-accordion.vue.d.ts +9 -7
  53. package/types/components/fw-alert/fw-alert.vue.d.ts +11 -6
  54. package/types/components/fw-bar-chart/fw-bar-chart.vue.d.ts +15 -64
  55. package/types/components/fw-button/fw-button.vue.d.ts +11 -7
  56. package/types/components/fw-card/fw-card.vue.d.ts +6 -6
  57. package/types/components/fw-checkbox/fw-checkbox.vue.d.ts +365 -5
  58. package/types/components/fw-date-picker/fw-date-picker.vue.d.ts +3 -242
  59. package/types/components/fw-drawer/fw-drawer.vue.d.ts +11 -8
  60. package/types/components/fw-dropdown/fw-dropdown.vue.d.ts +20 -12
  61. package/types/components/fw-icons/fw-success-animation.vue.d.ts +1 -1
  62. package/types/components/fw-image/fw-image.vue.d.ts +33 -7
  63. package/types/components/fw-input/fw-input.vue.d.ts +368 -10
  64. package/types/components/fw-loading/fw-loading-bar.vue.d.ts +7 -5
  65. package/types/components/fw-loading/fw-loading-card.vue.d.ts +3 -1
  66. package/types/components/fw-loading/fw-loading-dots.vue.d.ts +8 -1
  67. package/types/components/fw-loading/fw-loading-table.vue.d.ts +11 -6
  68. package/types/components/fw-media-picker/fw-media-picker.vue.d.ts +27 -18
  69. package/types/components/fw-modal/fw-modal.vue.d.ts +11 -7
  70. package/types/components/fw-navigation-menu/fw-navigation-menu.vue.d.ts +12 -8
  71. package/types/components/fw-popover/fw-popover.vue.d.ts +16 -21
  72. package/types/components/fw-progress-bar/fw-progress-bar.vue.d.ts +6 -4
  73. package/types/components/fw-provider-list/fw-provider-list.vue.d.ts +20 -45
  74. package/types/components/fw-sidebar-menu/fw-sidebar-menu.vue.d.ts +13 -7
  75. package/types/components/fw-slider/fw-slider.vue.d.ts +11 -8
  76. package/types/components/fw-switch/fw-switch.vue.d.ts +383 -9
  77. package/types/components/fw-switch/index.types.d.ts +1 -0
  78. package/types/components/fw-table/fw-table-head.vue.d.ts +1 -1
  79. package/types/components/fw-table/fw-table-row.vue.d.ts +1 -1
  80. package/types/components/fw-table/fw-table.vue.d.ts +40 -19
  81. package/types/components/fw-table/index.types.d.ts +36 -2
  82. package/types/components/fw-tabs/fw-tab.vue.d.ts +4 -8
  83. package/types/components/fw-tabs/fw-tabs.vue.d.ts +11 -8
  84. package/types/components/fw-tabs/index.types.d.ts +14 -4
  85. package/types/components/fw-tag/fw-tag.vue.d.ts +14 -8
  86. package/types/components/fw-toast/fw-toast.vue.d.ts +17 -22
  87. package/types/components/fw-transactions-card/fw-transactions-card.vue.d.ts +6 -3
  88. package/types/directives/lazy-loader.d.ts +11 -2
  89. package/types/helpers/get-root-colours.d.ts +1 -0
  90. package/web-components/index.js +16793 -7702
  91. package/esm/fw-button-YMoW4x4c.js +0 -296
  92. package/esm/fw-image-D-OHafdw.js +0 -217
  93. package/esm/fw-loading-bar-DecYSBC_.js +0 -45
  94. package/esm/fw-popover-B4bsfuxm.js +0 -620
  95. package/esm/fw-table-row-Cgi8871h.js +0 -389
  96. package/esm/fw-tag-fDo50Nw7.js +0 -177
  97. package/esm/index-BsEH8YYr.js +0 -979
@@ -1,26 +1,41 @@
1
- import { e as _defineProperty, b as _toConsumableArray } from './_rollupPluginBabelHelpers-DODWUb5N.js';
2
- import { defineComponent, ref, computed, useCssVars, createElementVNode, resolveComponent, createElementBlock, openBlock, toDisplayString, createVNode, withCtx, createBlock, createCommentVNode, createTextVNode } from 'vue';
3
- import { a as script, s as script$1, _ as __default__$4 } from './fw-table-row-Cgi8871h.js';
4
- import { _ as __default__$3 } from './fw-input-C2-cZ-BY.js';
5
- import { _ as __default__$1 } from './fw-tag-fDo50Nw7.js';
6
- import { s as script$2 } from './fw-button-YMoW4x4c.js';
7
- import { _ as __default__$2 } from './fw-dropdown-58wyuzsW.js';
8
- import { l as render$1, m as render$2, n as render$3 } from './index-BsEH8YYr.js';
9
- import { u as useColours } from './get-root-colours-DCjlYelc.js';
1
+ import { f as _createForOfIteratorHelper, e as _defineProperty, b as _toConsumableArray } from './_rollupPluginBabelHelpers-BKlDnZ7n.js';
2
+ import { ref, watch, defineComponent, shallowRef, computed, useCssVars, resolveComponent, createElementBlock, openBlock, createElementVNode, toDisplayString, createVNode, withCtx, createBlock, createCommentVNode, createTextVNode } from 'vue';
3
+ import { a as script, s as script$1, _ as __default__$4 } from './fw-table-row-BU0xaybR.js';
4
+ import { _ as __default__$3 } from './fw-input-BiPWWfK3.js';
5
+ import { _ as __default__$1 } from './fw-tag-BRxPc4zc.js';
6
+ import { s as script$2 } from './fw-button-DZTHZLjk.js';
7
+ import { _ as __default__$2 } from './fw-dropdown-CSmYTm5O.js';
8
+ import { l as render$1, m as render$2, n as render$3 } from './index-DHyRsKsZ.js';
9
+ import { u as useColours } from './get-root-colours-DCCAnRF4.js';
10
10
  import { s as styleInject } from './style-inject.es-tgCJW-Cu.js';
11
11
  import './fw-button.js';
12
12
  import './fw-loading.js';
13
- import './fw-loading-bar-DecYSBC_.js';
14
- import './vee-validate.esm-3ptvCDR1.js';
15
- import './fw-image-D-OHafdw.js';
13
+ import './fw-loading-bar-3x4tkF1B.js';
14
+ import './vee-validate-0dtT5GSQ.js';
15
+ import './fw-image-A2lXYs0u.js';
16
16
 
17
+ // tiny debounce helper (no deps)
18
+ var useDebouncedRef = function useDebouncedRef(initial) {
19
+ var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 150;
20
+ var state = ref(initial);
21
+ var debounced = ref(initial);
22
+ var timeNum;
23
+ watch(state, function (val) {
24
+ window.clearTimeout(timeNum);
25
+ timeNum = window.setTimeout(function () {
26
+ debounced.value = val;
27
+ }, delay);
28
+ }, {
29
+ flush: 'sync'
30
+ });
31
+ return {
32
+ state: state,
33
+ debounced: debounced
34
+ };
35
+ };
17
36
  var __default__ = defineComponent({
18
37
  name: 'FwProviderList',
19
- emits: [
20
- /**
21
- * Emits the number of filtered items the user sees.
22
- */
23
- 'changed'],
38
+ emits: ['changed'],
24
39
  components: {
25
40
  FwTable: __default__$4,
26
41
  FwInput: __default__$3,
@@ -34,94 +49,101 @@ var __default__ = defineComponent({
34
49
  SolidXMarkSvg: render$1
35
50
  },
36
51
  props: {
37
- /**
38
- * The header heading of the list.
39
- */
40
52
  heading: {
41
53
  type: String
42
54
  },
43
- /**
44
- * The list items of the table items.
45
- */
46
55
  items: {
47
56
  type: Array,
48
57
  required: true
49
58
  },
50
- /**
51
- * The table header title.
52
- */
53
59
  tableHeaderName: {
54
60
  type: String,
55
61
  "default": 'Name'
56
62
  },
57
- /**
58
- * The placeholder text for the search input.
59
- */
60
63
  searchPlaceholder: {
61
64
  type: String,
62
65
  "default": 'Search'
63
66
  },
64
- /**
65
- * The label text for the search input.
66
- */
67
67
  searchLabel: {
68
68
  type: String,
69
69
  "default": 'Search by provider name'
70
70
  },
71
- /**
72
- * The label text for the status filter dropdown.
73
- */
74
71
  statusFilterLabel: {
75
72
  type: String,
76
73
  "default": 'Filter by status'
77
74
  }
78
75
  },
79
76
  setup: function setup(props, ctx) {
80
- var searchFilterModel = ref('');
77
+ // Debounced search
78
+ var _useDebouncedRef = useDebouncedRef('', 150),
79
+ searchFilterModel = _useDebouncedRef.state,
80
+ debouncedSearch = _useDebouncedRef.debounced;
81
81
  var statusFilterModel = ref('all');
82
- var parsedItems = computed(function () {
83
- if (typeof props.items === 'string') {
84
- return JSON.parse(props.items);
85
- }
82
+ // Parse once per items change (avoid parsing on every reactive tick)
83
+ var parsedItems = shallowRef([]);
84
+ watch(function () {
86
85
  return props.items;
86
+ }, function (items) {
87
+ parsedItems.value = typeof items === 'string' ? JSON.parse(items) : items;
88
+ }, {
89
+ immediate: true
87
90
  });
88
- var filteredTableItems = computed(function () {
89
- var tempFilteredItems = parsedItems.value;
90
- if (searchFilterModel.value) {
91
- tempFilteredItems = tempFilteredItems.filter(function (item) {
92
- return item.name.toString().toLowerCase().includes(searchFilterModel.value.toLowerCase());
93
- });
94
- }
95
- if (statusFilterModel.value && statusFilterModel.value !== 'all') {
96
- tempFilteredItems = tempFilteredItems.filter(function (item) {
97
- return item.status === statusFilterModel.value;
98
- });
99
- }
100
- return tempFilteredItems;
101
- });
102
- var options = _defineProperty(_defineProperty({}, 'status', {
103
- disabled: true
104
- }), props.tableHeaderName, {
105
- isSortable: true,
106
- initSortOrder: 'asc'
91
+ // Stable collator for fast locale-aware compare
92
+ var collator = new Intl.Collator(undefined, {
93
+ sensitivity: 'base',
94
+ numeric: true
107
95
  });
108
- var tableItems = computed(function () {
109
- var _filteredTableItems$v;
110
- return (_filteredTableItems$v = filteredTableItems.value) === null || _filteredTableItems$v === void 0 ? void 0 : _filteredTableItems$v.map(function (item) {
111
- return _defineProperty(_defineProperty({}, 'status', item.status), props.tableHeaderName, "\n <div class=\"flex flex-row-reverse justify-end items-center\">\n <p class=\"mb-0 font-medium\">".concat(item.name, "</p>\n <img class=\"mr-2 w-[48px]\" alt=\"").concat(item.name, " logo\" src=\"").concat(item.image_url, "\" />\n </div>\n "));
96
+ // One pipeline: filter -> sort -> map to table format
97
+ var displayedTableItems = computed(function () {
98
+ var q = debouncedSearch.value.trim().toLowerCase();
99
+ var status = statusFilterModel.value;
100
+ // filter in a single pass
101
+ var filtered = [];
102
+ var _iterator = _createForOfIteratorHelper(parsedItems.value),
103
+ _step;
104
+ try {
105
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
106
+ var item = _step.value;
107
+ if (q && !item.name.toLowerCase().includes(q)) continue;
108
+ if (status !== 'all' && item.status !== status) continue;
109
+ filtered.push(item);
110
+ }
111
+ // sort BEFORE mapping; stable and correct
112
+ } catch (err) {
113
+ _iterator.e(err);
114
+ } finally {
115
+ _iterator.f();
116
+ }
117
+ filtered.sort(function (a, b) {
118
+ if (a.status === 'outage' && b.status !== 'outage') return -1;
119
+ if (b.status === 'outage' && a.status !== 'outage') return 1;
120
+ return collator.compare(a.name, b.name);
121
+ });
122
+ // map once to the shape FwTable expects
123
+ return filtered.map(function (item) {
124
+ return _defineProperty(_defineProperty({
125
+ status: item.status
126
+ }, props.tableHeaderName, "\n <div class=\"flex flex-row-reverse justify-end items-center\">\n <p class=\"mb-0 font-medium\">".concat(item.name, "</p>\n <img class=\"mr-2 w-[48px]\" alt=\"").concat(item.name, " logo\" src=\"").concat(item.image_url, "\" loading=\"lazy\" decoding=\"async\" />\n </div>\n ")), "id", item.name);
112
127
  });
113
128
  });
114
- var sortedTableItems = computed(function () {
115
- var tempItems = _toConsumableArray(tableItems.value);
116
- var sortedItems = tempItems.sort(function (item1, item2) {
117
- var _item1$name, _item2$name;
118
- if (item1.status === 'outage') {
119
- return -1;
129
+ // Emit changes as a watcher (no side effects in computed)
130
+ watch(displayedTableItems, function (items) {
131
+ return ctx.emit('changed', items.length);
132
+ }, {
133
+ immediate: true
134
+ });
135
+ var options = computed(function () {
136
+ return _defineProperty(_defineProperty({
137
+ status: {
138
+ disabled: true
120
139
  }
121
- return (_item1$name = item1.name) === null || _item1$name === void 0 ? void 0 : _item1$name.toString().toLowerCase().localeCompare((_item2$name = item2.name) === null || _item2$name === void 0 ? void 0 : _item2$name.toString().toLowerCase());
140
+ }, props.tableHeaderName, {
141
+ isSortable: true,
142
+ initSortOrder: 'asc',
143
+ html: true
144
+ }), "id", {
145
+ disabled: true
122
146
  });
123
- ctx.emit('changed', sortedItems.length);
124
- return sortedItems;
125
147
  });
126
148
  var _useColours = useColours(),
127
149
  primaryFade5 = _useColours.primaryFade5,
@@ -129,7 +151,8 @@ var __default__ = defineComponent({
129
151
  primaryFade40 = _useColours.primaryFade40;
130
152
  return {
131
153
  options: options,
132
- sortedTableItems: sortedTableItems,
154
+ sortedTableItems: displayedTableItems,
155
+ // keep template the same
133
156
  searchFilterModel: searchFilterModel,
134
157
  statusFilterModel: statusFilterModel,
135
158
  primaryFade5: primaryFade5,
@@ -141,9 +164,7 @@ var __default__ = defineComponent({
141
164
  var __injectCSSVars__ = function __injectCSSVars__() {
142
165
  useCssVars(function (_ctx) {
143
166
  return {
144
- "04475cb7": _ctx.primaryFade5,
145
- "f6b78c08": _ctx.primaryFade20,
146
- "f6b78b8c": _ctx.primaryFade40
167
+ "v1fe77e94": _ctx.primaryFade5
147
168
  };
148
169
  });
149
170
  };
@@ -172,10 +193,6 @@ var _hoisted_5 = {
172
193
  var _hoisted_6 = {
173
194
  key: 1
174
195
  };
175
- var _hoisted_7 = /*#__PURE__*/createElementVNode("h4", {
176
- "class": "w-full font-medium text-center my-6"
177
- }, "Sorry, we could not find any results.", -1);
178
- var _hoisted_8 = [_hoisted_7];
179
196
  function render(_ctx, _cache, $props, $setup, $data, $options) {
180
197
  var _component_SearchSvg = resolveComponent("SearchSvg");
181
198
  var _component_SolidXMarkSvg = resolveComponent("SolidXMarkSvg");
@@ -247,16 +264,17 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
247
264
  value: 'supported'
248
265
  }]
249
266
  }, null, 8, ["modelValue", "label"])])]), _ctx.sortedTableItems && _ctx.sortedTableItems.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5, [createVNode(_component_FwTable, {
250
- "class": "w-full",
267
+ "class": "w-full fw-scrollable-horizontal",
251
268
  items: _ctx.sortedTableItems,
252
- options: _ctx.options
269
+ options: _ctx.options,
270
+ "row-key": "id"
253
271
  }, {
254
272
  preHead: withCtx(function () {
255
273
  return [createVNode(_component_FwTableHead, {
256
274
  "class": "w-[150px] md:w-[200px]"
257
275
  }, {
258
276
  "default": withCtx(function () {
259
- return [createTextVNode(" Status ")];
277
+ return _toConsumableArray(_cache[3] || (_cache[3] = [createTextVNode(" Status ", -1)]));
260
278
  }),
261
279
  _: 1
262
280
  })];
@@ -276,7 +294,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
276
294
  return [createVNode(_component_SolidXMarkSvg, {
277
295
  name: "solid-xmark",
278
296
  "class": "w-4 h-4 mr-1"
279
- }), createTextVNode("Outage ")];
297
+ }), _cache[4] || (_cache[4] = createTextVNode("Outage ", -1))];
280
298
  }),
281
299
  _: 1
282
300
  })) : (openBlock(), createBlock(_component_FwTag, {
@@ -288,7 +306,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
288
306
  return [createVNode(_component_SolidCheckSvg, {
289
307
  name: "solid-check",
290
308
  "class": "w-4 h-4 mr-1"
291
- }), createTextVNode(" Available ")];
309
+ }), _cache[5] || (_cache[5] = createTextVNode(" Available ", -1))];
292
310
  }),
293
311
  _: 1
294
312
  }))];
@@ -297,11 +315,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
297
315
  }, 1024)];
298
316
  }),
299
317
  _: 1
300
- }, 8, ["items", "options"])])) : (openBlock(), createElementBlock("div", _hoisted_6, _hoisted_8))]);
318
+ }, 8, ["items", "options"])])) : (openBlock(), createElementBlock("div", _hoisted_6, _toConsumableArray(_cache[6] || (_cache[6] = [createElementVNode("h4", {
319
+ "class": "w-full font-medium text-center my-6"
320
+ }, "Sorry, we could not find any results.", -1)]))))]);
301
321
  }
302
322
 
303
- var css_248z = ".fw-provider-list--table{background-color:var(--04475cb7);overflow-x:auto}.fw-provider-list--table::-webkit-scrollbar{-webkit-appearance:none;height:8px}.fw-provider-list--table::-webkit-scrollbar-track{background-color:var(--f6b78c08);border-radius:12px}.fw-provider-list--table::-webkit-scrollbar-thumb{background-color:var(--f6b78b8c);border-radius:12px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.fw-provider-list--table::-webkit-scrollbar-thumb:hover{background-color:var(--colorBody);cursor:pointer}";
304
- var stylesheet = ".fw-provider-list--table{background-color:var(--04475cb7);overflow-x:auto}.fw-provider-list--table::-webkit-scrollbar{-webkit-appearance:none;height:8px}.fw-provider-list--table::-webkit-scrollbar-track{background-color:var(--f6b78c08);border-radius:12px}.fw-provider-list--table::-webkit-scrollbar-thumb{background-color:var(--f6b78b8c);border-radius:12px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.fw-provider-list--table::-webkit-scrollbar-thumb:hover{background-color:var(--colorBody);cursor:pointer}";
323
+ var css_248z = ".fw-provider-list--table{background-color:var(--v1fe77e94)}";
324
+ var stylesheet = ".fw-provider-list--table{background-color:var(--v1fe77e94)}";
305
325
  styleInject(css_248z);
306
326
 
307
327
  __default__.render = render;
@@ -1,6 +1,6 @@
1
- import { defineComponent, computed, resolveComponent, createElementBlock, createCommentVNode, openBlock, normalizeClass, createVNode, withCtx, Transition, withDirectives, createElementVNode, renderSlot, Fragment, renderList, createBlock, createTextVNode, toDisplayString, vShow } from 'vue';
2
- import { s as script$1 } from './fw-button-YMoW4x4c.js';
3
- import { o as render$1 } from './index-BsEH8YYr.js';
1
+ import { defineComponent, computed, resolveComponent, withDirectives, openBlock, createElementBlock, normalizeClass, createVNode, createElementVNode, withCtx, createCommentVNode, renderSlot, Fragment, renderList, createBlock, createTextVNode, toDisplayString, vShow } from 'vue';
2
+ import { s as script$1 } from './fw-button-DZTHZLjk.js';
3
+ import { o as render$1 } from './index-DHyRsKsZ.js';
4
4
  import { s as styleInject } from './style-inject.es-tgCJW-Cu.js';
5
5
 
6
6
  var script = defineComponent({
@@ -58,7 +58,7 @@ var script = defineComponent({
58
58
  }
59
59
  },
60
60
  setup: function setup(props, ctx) {
61
- var baseClass = "h-full shadow-md border-r border-grey-20 \n fixed top-0 left-0 transition-all duration-300";
61
+ var baseClass = 'h-full shadow-md border-r border-grey-20 fixed top-0 left-0 ' + 'transition-[width] duration-300 ease-out';
62
62
  var isMenuOpen = computed({
63
63
  get: function get() {
64
64
  return props.modelValue;
@@ -67,84 +67,91 @@ var script = defineComponent({
67
67
  return ctx.emit('update:modelValue', state);
68
68
  }
69
69
  });
70
+ var hasItems = computed(function () {
71
+ return Array.isArray(props.menuItems) && props.menuItems.length > 0;
72
+ });
73
+ var enabledItems = computed(function () {
74
+ var _props$menuItems;
75
+ return ((_props$menuItems = props.menuItems) !== null && _props$menuItems !== void 0 ? _props$menuItems : []).filter(function (i) {
76
+ return !i.disabled;
77
+ });
78
+ });
79
+ var widthClass = computed(function () {
80
+ return isMenuOpen.value ? props.openWidth : props.closedWidth;
81
+ });
70
82
  var toggleMenu = function toggleMenu() {
71
- isMenuOpen.value = !isMenuOpen.value;
72
- ctx.emit('toggled', isMenuOpen.value ? props.openWidth : props.closedWidth);
83
+ var next = !isMenuOpen.value;
84
+ isMenuOpen.value = next;
85
+ ctx.emit('toggled', next ? props.openWidth : props.closedWidth);
73
86
  };
74
87
  return {
75
88
  baseClass: baseClass,
76
89
  isMenuOpen: isMenuOpen,
77
- toggleMenu: toggleMenu
90
+ toggleMenu: toggleMenu,
91
+ enabledItems: enabledItems,
92
+ hasItems: hasItems,
93
+ widthClass: widthClass
78
94
  };
79
95
  }
80
96
  });
81
97
 
82
98
  var _hoisted_1 = {
83
- "class": "flex flex-col px-4 py-8"
84
- };
85
- var _hoisted_2 = {
86
99
  key: 0,
87
100
  "class": "text-left px-4 pb-6"
88
101
  };
89
- var _hoisted_3 = {
102
+ var _hoisted_2 = {
90
103
  "class": "flex flex-col space-y-1"
91
104
  };
92
105
  function render(_ctx, _cache, $props, $setup, $data, $options) {
93
- var _ctx$menuItems;
94
106
  var _component_ChevronRightSvg = resolveComponent("ChevronRightSvg");
95
107
  var _component_FwButton = resolveComponent("FwButton");
96
- return _ctx.menuItems && ((_ctx$menuItems = _ctx.menuItems) === null || _ctx$menuItems === void 0 ? void 0 : _ctx$menuItems.length) > 0 ? (openBlock(), createElementBlock("div", {
97
- key: 0,
98
- "class": normalizeClass(["fw-sidebar-menu", [_ctx.baseClass, _ctx.isMenuOpen ? _ctx.openWidth : _ctx.closedWidth]]),
108
+ return withDirectives((openBlock(), createElementBlock("aside", {
109
+ "class": normalizeClass(["fw-sidebar-menu", [_ctx.baseClass, _ctx.widthClass]]),
99
110
  "aria-label": "Aside navigation menu"
100
111
  }, [createVNode(_component_FwButton, {
101
112
  variant: _ctx.toggleButtonVariant,
102
- tabindex: "",
113
+ tabindex: "0",
103
114
  title: _ctx.isMenuOpen ? 'Close sidebar navigation menu' : 'Open sidebar navigation menu',
104
- onClick: _cache[0] || (_cache[0] = function ($event) {
105
- return _ctx.toggleMenu();
106
- }),
107
- "class": normalizeClass(["inline-block w-9 h-9 !p-0 shadow absolute top-4 -right-4 rounded-full", _ctx.toggleButtonClass])
115
+ onClick: _ctx.toggleMenu,
116
+ "class": normalizeClass(["inline-block w-9 h-9 !p-0 shadow !absolute top-4 -right-4 rounded-full z-[2]", _ctx.toggleButtonClass])
108
117
  }, {
109
118
  "default": withCtx(function () {
110
119
  return [createVNode(_component_ChevronRightSvg, {
111
120
  name: "chevron-right",
112
- "class": normalizeClass(["size-6 inline-block m-0 transition-rotate duration-200", _ctx.isMenuOpen ? 'rotate-180' : ''])
121
+ "class": normalizeClass(["size-6 inline-block m-0 fw-sidebar-menu-toggle", {
122
+ 'fw-sidebar-menu-toggle--open': _ctx.isMenuOpen
123
+ }])
113
124
  }, null, 8, ["class"])];
114
125
  }),
115
126
  _: 1
116
- }, 8, ["variant", "title", "class"]), createVNode(Transition, {
117
- name: "sidebarMenuSlide"
118
- }, {
119
- "default": withCtx(function () {
120
- return [withDirectives(createElementVNode("div", _hoisted_1, [_ctx.$slots.title ? (openBlock(), createElementBlock("div", _hoisted_2, [renderSlot(_ctx.$slots, "title")])) : createCommentVNode("", true), createElementVNode("div", _hoisted_3, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.menuItems, function (item, i) {
121
- return openBlock(), createElementBlock(Fragment, {
122
- key: i
123
- }, [!item.disabled ? (openBlock(), createBlock(_component_FwButton, {
124
- key: 0,
125
- rounded: false,
126
- "class": "!text-left !px-4 bg-transparent border-none !no-underline hover:!bg-brand-bg4 focus:bg-brand-bg4",
127
- variant: "quaternary",
128
- href: item.href,
129
- to: item.to,
130
- external: item.external,
131
- size: "lg",
132
- "aria-current": "page",
133
- onClick: item.onClick
134
- }, {
135
- "default": withCtx(function () {
136
- return [createTextVNode(toDisplayString(item.label), 1)];
137
- }),
138
- _: 2
139
- }, 1032, ["href", "to", "external", "onClick"])) : createCommentVNode("", true)], 64);
140
- }), 128))])], 512), [[vShow, _ctx.isMenuOpen]])];
141
- }),
142
- _: 3
143
- })], 2)) : createCommentVNode("", true);
127
+ }, 8, ["variant", "title", "onClick", "class"]), createElementVNode("div", {
128
+ "class": normalizeClass(["fw-sidebar-menu-contents", {
129
+ 'fw-sidebar-menu-contents--closed': !_ctx.isMenuOpen
130
+ }])
131
+ }, [_ctx.$slots.title ? (openBlock(), createElementBlock("div", _hoisted_1, [renderSlot(_ctx.$slots, "title")])) : createCommentVNode("", true), createElementVNode("div", _hoisted_2, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.enabledItems, function (item, i) {
132
+ var _ref, _ref2;
133
+ return openBlock(), createBlock(_component_FwButton, {
134
+ key: (_ref = (_ref2 = i !== null && i !== void 0 ? i : item.href) !== null && _ref2 !== void 0 ? _ref2 : item.to) !== null && _ref !== void 0 ? _ref : item.label,
135
+ rounded: false,
136
+ "class": "!text-left !px-4 bg-transparent border-none !no-underline hover:!bg-brand-bg4 focus:bg-brand-bg4",
137
+ variant: "quaternary",
138
+ href: item.href,
139
+ to: item.to,
140
+ external: item.external,
141
+ size: "lg",
142
+ "aria-current": "page",
143
+ onClick: item.onClick
144
+ }, {
145
+ "default": withCtx(function () {
146
+ return [createTextVNode(toDisplayString(item.label), 1)];
147
+ }),
148
+ _: 2
149
+ }, 1032, ["href", "to", "external", "onClick"]);
150
+ }), 128))])], 2)], 2)), [[vShow, _ctx.hasItems]]);
144
151
  }
145
152
 
146
- var css_248z = ".sidebarMenuSlide-enter-active{-webkit-transition:all .6s ease-in;-moz-transition:all .6s ease-in;transition:all .6s ease-in}.sidebarMenuSlide-leave-active{-webkit-transition:opacity 10ms ease-in;-moz-transition:opacity 10ms ease-in;transition:opacity 10ms ease-in}.sidebarMenuSlide-enter-from,.sidebarMenuSlide-leave-to{opacity:0}.sidebarMenuSlide-enter-to,.sidebarMenuSlide-leave-from{opacity:1}.fw-sidebar-menu .fw-button--quaternary.router-link-active{background-color:var(--colorBg4)}";
147
- var stylesheet = ".sidebarMenuSlide-enter-active{-webkit-transition:all .6s ease-in;-moz-transition:all .6s ease-in;transition:all .6s ease-in}.sidebarMenuSlide-leave-active{-webkit-transition:opacity 10ms ease-in;-moz-transition:opacity 10ms ease-in;transition:opacity 10ms ease-in}.sidebarMenuSlide-enter-from,.sidebarMenuSlide-leave-to{opacity:0}.sidebarMenuSlide-enter-to,.sidebarMenuSlide-leave-from{opacity:1}.fw-sidebar-menu .fw-button--quaternary.router-link-active{background-color:var(--colorBg4)}";
153
+ var css_248z = ".sidebarMenuSlide-enter-active,.sidebarMenuSlide-leave-active{-webkit-transition:opacity .18s ease,-webkit-transform .22s ease;transition:opacity .18s ease,-webkit-transform .22s ease;-moz-transition:transform .22s ease,opacity .18s ease,-moz-transform .22s ease;transition:transform .22s ease,opacity .18s ease;transition:transform .22s ease,opacity .18s ease,-webkit-transform .22s ease,-moz-transform .22s ease;will-change:transform,opacity}.sidebarMenuSlide-enter-from,.sidebarMenuSlide-leave-to{opacity:0;-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);-ms-transform:translateX(-8px);transform:translateX(-8px)}.fw-sidebar-menu-contents,.sidebarMenuSlide-enter-to,.sidebarMenuSlide-leave-from{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.fw-sidebar-menu-contents{-webkit-box-orient:vertical;-webkit-box-direction:normal;-moz-box-orient:vertical;-moz-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow:hidden;padding:2rem 1rem;-webkit-transition:opacity .16s ease,-webkit-transform .2s ease;transition:opacity .16s ease,-webkit-transform .2s ease;-moz-transition:opacity .16s ease,transform .2s ease,-moz-transform .2s ease;transition:opacity .16s ease,transform .2s ease;transition:opacity .16s ease,transform .2s ease,-webkit-transform .2s ease,-moz-transform .2s ease;-webkit-transition-delay:.16s;-moz-transition-delay:.16s;transition-delay:.16s;white-space:nowrap;will-change:opacity,transform}.fw-sidebar-menu-contents--closed{opacity:0;pointer-events:none;-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);-ms-transform:translateX(-8px);transform:translateX(-8px);-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms;visibility:hidden}.fw-sidebar-menu-toggle{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;-moz-transition:transform .2s ease,-moz-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease,-moz-transform .2s ease;will-change:transform}.fw-sidebar-menu-toggle--open{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.fw-sidebar-menu-toggle,.sidebarMenuSlide-enter-active,.sidebarMenuSlide-leave-active{-webkit-transition:none!important;-moz-transition:none!important;transition:none!important}}.fw-sidebar-menu .fw-button--quaternary.router-link-active{background-color:var(--colorBg4)}";
154
+ var stylesheet = ".sidebarMenuSlide-enter-active,.sidebarMenuSlide-leave-active{-webkit-transition:opacity .18s ease,-webkit-transform .22s ease;transition:opacity .18s ease,-webkit-transform .22s ease;-moz-transition:transform .22s ease,opacity .18s ease,-moz-transform .22s ease;transition:transform .22s ease,opacity .18s ease;transition:transform .22s ease,opacity .18s ease,-webkit-transform .22s ease,-moz-transform .22s ease;will-change:transform,opacity}.sidebarMenuSlide-enter-from,.sidebarMenuSlide-leave-to{opacity:0;-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);-ms-transform:translateX(-8px);transform:translateX(-8px)}.fw-sidebar-menu-contents,.sidebarMenuSlide-enter-to,.sidebarMenuSlide-leave-from{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.fw-sidebar-menu-contents{-webkit-box-orient:vertical;-webkit-box-direction:normal;-moz-box-orient:vertical;-moz-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow:hidden;padding:2rem 1rem;-webkit-transition:opacity .16s ease,-webkit-transform .2s ease;transition:opacity .16s ease,-webkit-transform .2s ease;-moz-transition:opacity .16s ease,transform .2s ease,-moz-transform .2s ease;transition:opacity .16s ease,transform .2s ease;transition:opacity .16s ease,transform .2s ease,-webkit-transform .2s ease,-moz-transform .2s ease;-webkit-transition-delay:.16s;-moz-transition-delay:.16s;transition-delay:.16s;white-space:nowrap;will-change:opacity,transform}.fw-sidebar-menu-contents--closed{opacity:0;pointer-events:none;-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);-ms-transform:translateX(-8px);transform:translateX(-8px);-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms;visibility:hidden}.fw-sidebar-menu-toggle{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;-moz-transition:transform .2s ease,-moz-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease,-moz-transform .2s ease;will-change:transform}.fw-sidebar-menu-toggle--open{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.fw-sidebar-menu-toggle,.sidebarMenuSlide-enter-active,.sidebarMenuSlide-leave-active{-webkit-transition:none!important;-moz-transition:none!important;transition:none!important}}.fw-sidebar-menu .fw-button--quaternary.router-link-active{background-color:var(--colorBg4)}";
148
155
  styleInject(css_248z);
149
156
 
150
157
  script.render = render;