@frollo/frollo-web-ui 9.0.0 → 9.0.2

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 -3060
  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 +8 -8
  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 +109 -87
  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-D6FdCJMs.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 -3115
  48. package/icons/circle-check.svg +4 -0
  49. package/index.d.ts +1522 -586
  50. package/package.json +18 -18
  51. package/styles/web-components.scss +84 -1
  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 -7700
  91. package/esm/fw-button-CnQvA7oM.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-C61Bi8KB.js +0 -389
  96. package/esm/fw-tag-FWH6KttB.js +0 -177
  97. package/esm/index-BsEH8YYr.js +0 -979
@@ -1,26 +1,41 @@
1
- import { e as _defineProperty } 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-C61Bi8KB.js';
4
- import { _ as __default__$3 } from './fw-input-C2-cZ-BY.js';
5
- import { _ as __default__$1 } from './fw-tag-FWH6KttB.js';
6
- import { s as script$2 } from './fw-button-CnQvA7oM.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-D6FdCJMs.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);
112
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);
127
+ });
128
+ });
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
113
134
  });
114
- var sortedTableItems = computed(function () {
115
- var tempItems = tableItems.value;
116
- var sortedItems = tempItems.sort(function (item1, item2) {
117
- var _item1$name, _item2$name;
118
- if (item1.status === 'outage') {
119
- return -1;
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,9 @@ var __default__ = defineComponent({
141
164
  var __injectCSSVars__ = function __injectCSSVars__() {
142
165
  useCssVars(function (_ctx) {
143
166
  return {
144
- "9bf5c9b4": _ctx.primaryFade5,
145
- "e2c36d26": _ctx.primaryFade20,
146
- "e2c36caa": _ctx.primaryFade40
167
+ "f93b6e8a": _ctx.primaryFade5,
168
+ "v2e326310": _ctx.primaryFade20,
169
+ "v2e326294": _ctx.primaryFade40
147
170
  };
148
171
  });
149
172
  };
@@ -172,10 +195,6 @@ var _hoisted_5 = {
172
195
  var _hoisted_6 = {
173
196
  key: 1
174
197
  };
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
198
  function render(_ctx, _cache, $props, $setup, $data, $options) {
180
199
  var _component_SearchSvg = resolveComponent("SearchSvg");
181
200
  var _component_SolidXMarkSvg = resolveComponent("SolidXMarkSvg");
@@ -249,14 +268,15 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
249
268
  }, null, 8, ["modelValue", "label"])])]), _ctx.sortedTableItems && _ctx.sortedTableItems.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5, [createVNode(_component_FwTable, {
250
269
  "class": "w-full",
251
270
  items: _ctx.sortedTableItems,
252
- options: _ctx.options
271
+ options: _ctx.options,
272
+ "row-key": "id"
253
273
  }, {
254
274
  preHead: withCtx(function () {
255
275
  return [createVNode(_component_FwTableHead, {
256
276
  "class": "w-[150px] md:w-[200px]"
257
277
  }, {
258
278
  "default": withCtx(function () {
259
- return [createTextVNode(" Status ")];
279
+ return _toConsumableArray(_cache[3] || (_cache[3] = [createTextVNode(" Status ", -1)]));
260
280
  }),
261
281
  _: 1
262
282
  })];
@@ -276,7 +296,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
276
296
  return [createVNode(_component_SolidXMarkSvg, {
277
297
  name: "solid-xmark",
278
298
  "class": "w-4 h-4 mr-1"
279
- }), createTextVNode("Outage ")];
299
+ }), _cache[4] || (_cache[4] = createTextVNode("Outage ", -1))];
280
300
  }),
281
301
  _: 1
282
302
  })) : (openBlock(), createBlock(_component_FwTag, {
@@ -288,7 +308,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
288
308
  return [createVNode(_component_SolidCheckSvg, {
289
309
  name: "solid-check",
290
310
  "class": "w-4 h-4 mr-1"
291
- }), createTextVNode(" Available ")];
311
+ }), _cache[5] || (_cache[5] = createTextVNode(" Available ", -1))];
292
312
  }),
293
313
  _: 1
294
314
  }))];
@@ -297,11 +317,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
297
317
  }, 1024)];
298
318
  }),
299
319
  _: 1
300
- }, 8, ["items", "options"])])) : (openBlock(), createElementBlock("div", _hoisted_6, _hoisted_8))]);
320
+ }, 8, ["items", "options"])])) : (openBlock(), createElementBlock("div", _hoisted_6, _toConsumableArray(_cache[6] || (_cache[6] = [createElementVNode("h4", {
321
+ "class": "w-full font-medium text-center my-6"
322
+ }, "Sorry, we could not find any results.", -1)]))))]);
301
323
  }
302
324
 
303
- var css_248z = ".fw-provider-list--table{background-color:var(--9bf5c9b4);overflow-x:auto}.fw-provider-list--table::-webkit-scrollbar{-webkit-appearance:none;height:8px}.fw-provider-list--table::-webkit-scrollbar-track{background-color:var(--e2c36d26);border-radius:12px}.fw-provider-list--table::-webkit-scrollbar-thumb{background-color:var(--e2c36caa);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(--9bf5c9b4);overflow-x:auto}.fw-provider-list--table::-webkit-scrollbar{-webkit-appearance:none;height:8px}.fw-provider-list--table::-webkit-scrollbar-track{background-color:var(--e2c36d26);border-radius:12px}.fw-provider-list--table::-webkit-scrollbar-thumb{background-color:var(--e2c36caa);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}";
325
+ var css_248z = ".fw-provider-list--table{background-color:var(--f93b6e8a);overflow-x:auto}.fw-provider-list--table::-webkit-scrollbar{-webkit-appearance:none;height:8px}.fw-provider-list--table::-webkit-scrollbar-track{background-color:var(--v2e326310);border-radius:12px}.fw-provider-list--table::-webkit-scrollbar-thumb{background-color:var(--v2e326294);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}";
326
+ var stylesheet = ".fw-provider-list--table{background-color:var(--f93b6e8a);overflow-x:auto}.fw-provider-list--table::-webkit-scrollbar{-webkit-appearance:none;height:8px}.fw-provider-list--table::-webkit-scrollbar-track{background-color:var(--v2e326310);border-radius:12px}.fw-provider-list--table::-webkit-scrollbar-thumb{background-color:var(--v2e326294);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}";
305
327
  styleInject(css_248z);
306
328
 
307
329
  __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-CnQvA7oM.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;