@frollo/frollo-web-ui 9.0.1 → 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 (96) 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 +11 -11
  51. package/types/components/fw-accordion/fw-accordion.vue.d.ts +9 -7
  52. package/types/components/fw-alert/fw-alert.vue.d.ts +11 -6
  53. package/types/components/fw-bar-chart/fw-bar-chart.vue.d.ts +15 -64
  54. package/types/components/fw-button/fw-button.vue.d.ts +11 -7
  55. package/types/components/fw-card/fw-card.vue.d.ts +6 -6
  56. package/types/components/fw-checkbox/fw-checkbox.vue.d.ts +365 -5
  57. package/types/components/fw-date-picker/fw-date-picker.vue.d.ts +3 -242
  58. package/types/components/fw-drawer/fw-drawer.vue.d.ts +11 -8
  59. package/types/components/fw-dropdown/fw-dropdown.vue.d.ts +20 -12
  60. package/types/components/fw-icons/fw-success-animation.vue.d.ts +1 -1
  61. package/types/components/fw-image/fw-image.vue.d.ts +33 -7
  62. package/types/components/fw-input/fw-input.vue.d.ts +368 -10
  63. package/types/components/fw-loading/fw-loading-bar.vue.d.ts +7 -5
  64. package/types/components/fw-loading/fw-loading-card.vue.d.ts +3 -1
  65. package/types/components/fw-loading/fw-loading-dots.vue.d.ts +8 -1
  66. package/types/components/fw-loading/fw-loading-table.vue.d.ts +11 -6
  67. package/types/components/fw-media-picker/fw-media-picker.vue.d.ts +27 -18
  68. package/types/components/fw-modal/fw-modal.vue.d.ts +11 -7
  69. package/types/components/fw-navigation-menu/fw-navigation-menu.vue.d.ts +12 -8
  70. package/types/components/fw-popover/fw-popover.vue.d.ts +16 -21
  71. package/types/components/fw-progress-bar/fw-progress-bar.vue.d.ts +6 -4
  72. package/types/components/fw-provider-list/fw-provider-list.vue.d.ts +20 -45
  73. package/types/components/fw-sidebar-menu/fw-sidebar-menu.vue.d.ts +13 -7
  74. package/types/components/fw-slider/fw-slider.vue.d.ts +11 -8
  75. package/types/components/fw-switch/fw-switch.vue.d.ts +383 -9
  76. package/types/components/fw-switch/index.types.d.ts +1 -0
  77. package/types/components/fw-table/fw-table-head.vue.d.ts +1 -1
  78. package/types/components/fw-table/fw-table-row.vue.d.ts +1 -1
  79. package/types/components/fw-table/fw-table.vue.d.ts +40 -19
  80. package/types/components/fw-table/index.types.d.ts +36 -2
  81. package/types/components/fw-tabs/fw-tab.vue.d.ts +4 -8
  82. package/types/components/fw-tabs/fw-tabs.vue.d.ts +11 -8
  83. package/types/components/fw-tabs/index.types.d.ts +14 -4
  84. package/types/components/fw-tag/fw-tag.vue.d.ts +14 -8
  85. package/types/components/fw-toast/fw-toast.vue.d.ts +17 -22
  86. package/types/components/fw-transactions-card/fw-transactions-card.vue.d.ts +6 -3
  87. package/types/directives/lazy-loader.d.ts +11 -2
  88. package/types/helpers/get-root-colours.d.ts +1 -0
  89. package/web-components/index.js +16793 -7700
  90. package/esm/fw-button-YMoW4x4c.js +0 -296
  91. package/esm/fw-image-D-OHafdw.js +0 -217
  92. package/esm/fw-loading-bar-DecYSBC_.js +0 -45
  93. package/esm/fw-popover-B4bsfuxm.js +0 -620
  94. package/esm/fw-table-row-Cgi8871h.js +0 -389
  95. package/esm/fw-tag-fDo50Nw7.js +0 -177
  96. package/esm/index-BsEH8YYr.js +0 -979
@@ -0,0 +1,447 @@
1
+ import { defineComponent, computed, ref, shallowRef, watch, onMounted, useCssVars, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, normalizeClass, createVNode, renderSlot, Fragment, renderList, withDirectives, withKeys, toDisplayString, createBlock, vShow, TransitionGroup, withCtx, resolveDynamicComponent, mergeProps, toHandlers } from 'vue';
2
+ import { u as useColours } from './get-root-colours-DCCAnRF4.js';
3
+ import './fw-button.js';
4
+ import { o as render$3, p as render$4, q as render$5, s as render$6 } from './index-DHyRsKsZ.js';
5
+ import './fw-loading.js';
6
+ import { s as script$2 } from './fw-button-DZTHZLjk.js';
7
+ import { s as script$3 } from './fw-loading-bar-3x4tkF1B.js';
8
+ import { s as styleInject } from './style-inject.es-tgCJW-Cu.js';
9
+
10
+ var __default__ = defineComponent({
11
+ name: 'FwTable',
12
+ components: {
13
+ FwLoadingBar: script$3,
14
+ FwButton: script$2,
15
+ ArrowDownSvg: render$6,
16
+ ArrowSortSvg: render$5,
17
+ ChevronLeftSvg: render$4,
18
+ ChevronRightSvg: render$3
19
+ },
20
+ props: {
21
+ items: {
22
+ type: Array,
23
+ required: true
24
+ },
25
+ options: {
26
+ type: Object,
27
+ required: false
28
+ },
29
+ loading: {
30
+ type: Boolean,
31
+ "default": false
32
+ },
33
+ /**
34
+ * Enable click events on rows.
35
+ * Emits row data when clicked
36
+ */
37
+ clickableRows: {
38
+ type: Boolean,
39
+ "default": false
40
+ },
41
+ autoSortColumn: {
42
+ type: Number
43
+ },
44
+ enablePagination: {
45
+ type: Boolean,
46
+ "default": false
47
+ },
48
+ totalAmount: {
49
+ type: Number
50
+ },
51
+ pageSize: {
52
+ type: Number
53
+ },
54
+ /**
55
+ * Optional stable row key. If omitted, falls back to index-based key.
56
+ */
57
+ rowKey: {
58
+ type: [String, Function],
59
+ required: false
60
+ }
61
+ },
62
+ emits: [/** Fired when a row is clicked with row data */
63
+ 'rowClicked', /** Fired when a column is sorted */
64
+ 'columnSorted', /** Fired when a page number or arrow is clicked */
65
+ 'pageChanged'],
66
+ setup: function setup(props, ctx) {
67
+ var _props$items2;
68
+ var _useColours = useColours(),
69
+ bgHoverColor = _useColours.primaryFade5;
70
+ // Guard for empty items
71
+ var rawColumns = computed(function () {
72
+ var _props$items;
73
+ return (_props$items = props.items) !== null && _props$items !== void 0 && _props$items[0] ? Object.keys(props.items[0]) : [];
74
+ });
75
+ // Build per-column metadata ONCE per items/options change.
76
+ var colMeta = computed(function () {
77
+ var _props$options;
78
+ var opts = (_props$options = props.options) !== null && _props$options !== void 0 ? _props$options : {};
79
+ return rawColumns.value.map(function (key) {
80
+ var _opts$key, _option$initSortOrder;
81
+ var option = (_opts$key = opts[key]) !== null && _opts$key !== void 0 ? _opts$key : {};
82
+ return {
83
+ key: key,
84
+ disabled: !!option.disabled,
85
+ sortable: !!option.isSortable,
86
+ initSortOrder: (_option$initSortOrder = option.initSortOrder) !== null && _option$initSortOrder !== void 0 ? _option$initSortOrder : 'asc',
87
+ sortFn: option.sort,
88
+ html: !!option.html,
89
+ // allow html opt-in
90
+ format: function format(val, row) {
91
+ return option.formatter ? option.formatter(val, row) : val;
92
+ },
93
+ component: option.component,
94
+ componentProps: option.componentProps,
95
+ componentEventHandlers: option.componentEventHandlers,
96
+ isActiveSort: key === currentSortedColumn.value
97
+ };
98
+ });
99
+ });
100
+ var sortBy = ref('');
101
+ var sortDirection = ref('asc');
102
+ var currentSortedColumn = ref('');
103
+ // Cache last sorted result to avoid extra array churn when irrelevant state changes.
104
+ var sortedCache = shallowRef((_props$items2 = props.items) !== null && _props$items2 !== void 0 ? _props$items2 : []);
105
+ var doSort = function doSort() {
106
+ if (props.loading || !sortBy.value) {
107
+ sortedCache.value = props.items;
108
+ return;
109
+ }
110
+ var data = props.items.slice(); // shallow copy
111
+ var meta = colMeta.value.find(function (c) {
112
+ return c.key === sortBy.value;
113
+ });
114
+ var customSort = meta === null || meta === void 0 ? void 0 : meta.sortFn;
115
+ if (customSort) {
116
+ var _customSort;
117
+ sortedCache.value = (_customSort = customSort(data, sortBy.value, sortDirection.value)) !== null && _customSort !== void 0 ? _customSort : data;
118
+ return;
119
+ }
120
+ // Fast comparator: normalize once per comparison
121
+ var dir = sortDirection.value === 'asc' ? 1 : -1;
122
+ var key = sortBy.value;
123
+ data.sort(function (a, b) {
124
+ var av = a[key];
125
+ var bv = b[key];
126
+ if (av == null && bv == null) return 0;
127
+ if (av == null) return -1 * dir;
128
+ if (bv == null) return 1 * dir;
129
+ if (typeof av === 'string' || typeof bv === 'string') {
130
+ var as = String(av).toLowerCase();
131
+ var bs = String(bv).toLowerCase();
132
+ return as > bs ? dir : as < bs ? -dir : 0;
133
+ }
134
+ return av > bv ? dir : av < bv ? -dir : 0;
135
+ });
136
+ sortedCache.value = data;
137
+ };
138
+ watch(function () {
139
+ return [props.items, props.options, props.loading, sortBy.value, sortDirection.value];
140
+ }, doSort, {
141
+ immediate: true
142
+ });
143
+ var displayRows = computed(function () {
144
+ return sortedCache.value;
145
+ });
146
+ var onSort = function onSort(column) {
147
+ var isAction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
148
+ var meta = colMeta.value.find(function (c) {
149
+ return c.key === column;
150
+ });
151
+ if (!(meta !== null && meta !== void 0 && meta.sortable)) return;
152
+ currentSortedColumn.value = column;
153
+ if (sortBy.value === column) {
154
+ sortDirection.value = sortDirection.value === 'asc' ? 'desc' : 'asc';
155
+ } else {
156
+ sortBy.value = column;
157
+ sortDirection.value = meta.initSortOrder;
158
+ }
159
+ if (isAction) ctx.emit('columnSorted', column, sortDirection.value);
160
+ };
161
+ onMounted(function () {
162
+ if (Number(props.autoSortColumn) >= 0) {
163
+ var col = rawColumns.value[Number(props.autoSortColumn)];
164
+ if (col) onSort(col, false);
165
+ }
166
+ if (props.totalAmount && props.pageSize) {
167
+ maxPageAmount.value = Math.ceil(props.totalAmount / props.pageSize);
168
+ }
169
+ });
170
+ var currentPage = ref(1);
171
+ var maxPageAmount = ref();
172
+ var pageArrowClick = function pageArrowClick(next) {
173
+ currentPage.value += next ? 1 : -1;
174
+ ctx.emit('pageChanged', next);
175
+ window.scrollTo({
176
+ top: 0,
177
+ behavior: 'smooth'
178
+ });
179
+ };
180
+ var rowClicked = function rowClicked(row) {
181
+ if (props.clickableRows) ctx.emit('rowClicked', row);
182
+ };
183
+ var getRowKey = function getRowKey(row, index) {
184
+ if (typeof props.rowKey === 'function') return props.rowKey(row);
185
+ if (typeof props.rowKey === 'string') return row[props.rowKey];
186
+ return index !== null && index !== void 0 ? index : row; // fallback, not ideal but safe
187
+ };
188
+ var skeletonRowCount = computed(function () {
189
+ var _props$items3;
190
+ return Math.min(((_props$items3 = props.items) === null || _props$items3 === void 0 ? void 0 : _props$items3.length) || 5, 8);
191
+ });
192
+ var getComponentProps = function getComponentProps(col, row) {
193
+ var value = row[col.key];
194
+ var ctx = {
195
+ value: value,
196
+ row: row,
197
+ column: col.key
198
+ };
199
+ var p = col.componentProps;
200
+ return typeof p === 'function' ? p(ctx) : p !== null && p !== void 0 ? p : {};
201
+ };
202
+ var getComponentHandlers = function getComponentHandlers(col, row) {
203
+ var value = row[col.key];
204
+ var ctx = {
205
+ value: value,
206
+ row: row,
207
+ column: col.key
208
+ };
209
+ var h = col.componentEventHandlers;
210
+ return typeof h === 'function' ? h(ctx) : h !== null && h !== void 0 ? h : {};
211
+ };
212
+ return {
213
+ colMeta: colMeta,
214
+ sortBy: sortBy,
215
+ sortDirection: sortDirection,
216
+ currentSortedColumn: currentSortedColumn,
217
+ onSort: onSort,
218
+ displayRows: displayRows,
219
+ rowClicked: rowClicked,
220
+ bgHoverColor: bgHoverColor,
221
+ currentPage: currentPage,
222
+ maxPageAmount: maxPageAmount,
223
+ pageArrowClick: pageArrowClick,
224
+ getRowKey: getRowKey,
225
+ skeletonRowCount: skeletonRowCount,
226
+ getComponentProps: getComponentProps,
227
+ getComponentHandlers: getComponentHandlers
228
+ };
229
+ }
230
+ });
231
+ var __injectCSSVars__ = function __injectCSSVars__() {
232
+ useCssVars(function (_ctx) {
233
+ return {
234
+ "v6ed5b746": _ctx.bgHoverColor
235
+ };
236
+ });
237
+ };
238
+ var __setup__ = __default__.setup;
239
+ __default__.setup = __setup__ ? function (props, ctx) {
240
+ __injectCSSVars__();
241
+ return __setup__(props, ctx);
242
+ } : __injectCSSVars__;
243
+
244
+ var _hoisted_1$2 = {
245
+ "class": "flex flex-col"
246
+ };
247
+ var _hoisted_2$1 = ["aria-busy"];
248
+ var _hoisted_3$1 = {
249
+ "class": "text-base border-b border-grey-60"
250
+ };
251
+ var _hoisted_4 = ["tabindex", "onKeydown", "onClick"];
252
+ var _hoisted_5 = {
253
+ "class": "flex flex-row items-center"
254
+ };
255
+ var _hoisted_6 = {
256
+ key: 0,
257
+ "class": "ml-1 flex items-center justify-center size-5"
258
+ };
259
+ var _hoisted_7 = {
260
+ key: 0,
261
+ "class": "py-4 pl-5 pr-3 text-left"
262
+ };
263
+ var _hoisted_8 = ["tabindex", "onClick", "onKeydown"];
264
+ var _hoisted_9 = {
265
+ key: 1
266
+ };
267
+ var _hoisted_10 = ["innerHTML"];
268
+ var _hoisted_11 = {
269
+ key: 0,
270
+ "class": "flex flex-row justify-center h-[44px] mt-8 space-x-2 mb-[40px]"
271
+ };
272
+ function render$2(_ctx, _cache, $props, $setup, $data, $options) {
273
+ var _component_ArrowSortSvg = resolveComponent("ArrowSortSvg");
274
+ var _component_ArrowDownSvg = resolveComponent("ArrowDownSvg");
275
+ var _component_FwLoadingBar = resolveComponent("FwLoadingBar");
276
+ var _component_ChevronLeftSvg = resolveComponent("ChevronLeftSvg");
277
+ var _component_FwButton = resolveComponent("FwButton");
278
+ var _component_ChevronRightSvg = resolveComponent("ChevronRightSvg");
279
+ return openBlock(), createElementBlock("div", _hoisted_1$2, [createElementVNode("table", {
280
+ "class": normalizeClass(["fw-table table-auto flex-1", {
281
+ 'cursor-wait': _ctx.loading
282
+ }]),
283
+ "aria-live": "polite",
284
+ "aria-busy": _ctx.loading
285
+ }, [createElementVNode("thead", _hoisted_3$1, [createElementVNode("tr", null, [_ctx.$slots.preHead ? renderSlot(_ctx.$slots, "preHead", {
286
+ key: 0
287
+ }) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.colMeta, function (col) {
288
+ return withDirectives((openBlock(), createElementBlock("th", {
289
+ key: col.key,
290
+ "class": normalizeClass(["fw-table-head py-6 pl-5 pr-3 text-left font-medium text-brand-text1", col.sortable ? 'cursor-pointer fw-table-head--sortable' : '']),
291
+ tabindex: col.sortable ? 0 : -1,
292
+ onKeydown: withKeys(function ($event) {
293
+ return _ctx.onSort(col.key);
294
+ }, ["enter", "space"]),
295
+ onClick: function onClick($event) {
296
+ return _ctx.onSort(col.key);
297
+ }
298
+ }, [createElementVNode("div", _hoisted_5, [createElementVNode("span", {
299
+ "class": normalizeClass(col.isActiveSort ? 'text-primary' : '')
300
+ }, toDisplayString(col.key), 3), col.sortable ? (openBlock(), createElementBlock("span", _hoisted_6, [!col.isActiveSort ? (openBlock(), createBlock(_component_ArrowSortSvg, {
301
+ key: 0,
302
+ name: "arrow-sort",
303
+ "class": "inline-block size-5 text-brand-text2"
304
+ })) : (openBlock(), createBlock(_component_ArrowDownSvg, {
305
+ key: 1,
306
+ name: "arrow-down",
307
+ "class": normalizeClass(["inline-block size-4 text-primary", _ctx.sortDirection === 'asc' ? 'rotate-180' : ''])
308
+ }, null, 8, ["class"]))])) : createCommentVNode("", true)])], 42, _hoisted_4)), [[vShow, !col.disabled]]);
309
+ }), 128)), _ctx.$slots.head ? renderSlot(_ctx.$slots, "head", {
310
+ key: 1
311
+ }) : createCommentVNode("", true)])]), createVNode(TransitionGroup, {
312
+ tag: "tbody",
313
+ name: "fw-table-animate",
314
+ "class": "fw-table--tbody text-base bg-white font-normal",
315
+ mode: "out-in"
316
+ }, {
317
+ "default": withCtx(function () {
318
+ return [_ctx.loading ? (openBlock(true), createElementBlock(Fragment, {
319
+ key: 0
320
+ }, renderList(_ctx.skeletonRowCount, function (n) {
321
+ return openBlock(), createElementBlock("tr", {
322
+ key: 'skeleton-' + n
323
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.colMeta, function (col) {
324
+ return withDirectives((openBlock(), createElementBlock("td", {
325
+ key: 'skeleton-' + n + '-' + col.key,
326
+ "class": "py-4 pl-5 pr-3 text-left"
327
+ }, [createVNode(_component_FwLoadingBar, {
328
+ "class": "w-full h-7"
329
+ })])), [[vShow, !col.disabled]]);
330
+ }), 128)), _ctx.$slots.row ? (openBlock(), createElementBlock("td", _hoisted_7, [createVNode(_component_FwLoadingBar, {
331
+ "class": "w-full h-7"
332
+ })])) : createCommentVNode("", true)]);
333
+ }), 128)) : (openBlock(true), createElementBlock(Fragment, {
334
+ key: 1
335
+ }, renderList(_ctx.displayRows, function (row) {
336
+ return openBlock(), createElementBlock("tr", {
337
+ key: _ctx.getRowKey(row),
338
+ "class": normalizeClass(["fw-table-row border-b last:border-b-0 border-grey-60", {
339
+ 'cursor-pointer': _ctx.clickableRows
340
+ }]),
341
+ tabindex: _ctx.clickableRows ? 0 : -1,
342
+ onClick: function onClick($event) {
343
+ return _ctx.rowClicked(row);
344
+ },
345
+ onKeydown: withKeys(function ($event) {
346
+ return _ctx.rowClicked(row);
347
+ }, ["enter", "space"])
348
+ }, [_ctx.$slots.preRow ? renderSlot(_ctx.$slots, "preRow", {
349
+ key: 0,
350
+ row: row
351
+ }) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.colMeta, function (col) {
352
+ return withDirectives((openBlock(), createElementBlock("td", {
353
+ key: col.key,
354
+ "class": "py-5 pl-5 pr-3 text-left"
355
+ }, [col.component ? (openBlock(), createBlock(resolveDynamicComponent(col.component), mergeProps({
356
+ key: 0,
357
+ ref_for: true
358
+ }, _ctx.getComponentProps(col, row), toHandlers(_ctx.getComponentHandlers(col, row))), null, 16)) : !col.html ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(col.format(row[col.key], row)), 1)) : (openBlock(), createElementBlock("span", {
359
+ key: 2,
360
+ innerHTML: col.format(row[col.key], row)
361
+ }, null, 8, _hoisted_10))])), [[vShow, !col.disabled]]);
362
+ }), 128)), _ctx.$slots.row ? renderSlot(_ctx.$slots, "row", {
363
+ key: 1,
364
+ row: row
365
+ }) : createCommentVNode("", true)], 42, _hoisted_8);
366
+ }), 128))];
367
+ }),
368
+ _: 3
369
+ })], 10, _hoisted_2$1), _ctx.enablePagination ? (openBlock(), createElementBlock("div", _hoisted_11, [createVNode(_component_FwButton, {
370
+ variant: "tertiary",
371
+ disabled: _ctx.currentPage === 1,
372
+ size: "sm",
373
+ "class": "border-grey-40",
374
+ onClick: _cache[0] || (_cache[0] = function ($event) {
375
+ return _ctx.pageArrowClick(false);
376
+ })
377
+ }, {
378
+ "default": withCtx(function () {
379
+ return [createVNode(_component_ChevronLeftSvg, {
380
+ name: "chevron-left",
381
+ "class": "h-4 w-4",
382
+ "stroke-width": "3"
383
+ })];
384
+ }),
385
+ _: 1
386
+ }, 8, ["disabled"]), renderSlot(_ctx.$slots, "page"), createVNode(_component_FwButton, {
387
+ variant: "tertiary",
388
+ disabled: _ctx.currentPage === _ctx.maxPageAmount,
389
+ size: "sm",
390
+ "class": "border-grey-40",
391
+ onClick: _cache[1] || (_cache[1] = function ($event) {
392
+ return _ctx.pageArrowClick(true);
393
+ })
394
+ }, {
395
+ "default": withCtx(function () {
396
+ return [createVNode(_component_ChevronRightSvg, {
397
+ name: "chevron-right",
398
+ "class": "h-4 w-4"
399
+ })];
400
+ }),
401
+ _: 1
402
+ }, 8, ["disabled"])])) : createCommentVNode("", true)]);
403
+ }
404
+
405
+ var css_248z = ".fw-table-head[data-v-2c8e41ee]{-webkit-transition:background-color .16s ease,color .16s ease;-moz-transition:background-color .16s ease,color .16s ease;transition:background-color .16s ease,color .16s ease}.fw-table-head--sortable[data-v-2c8e41ee]:hover{background-color:var(--v6ed5b746)}.fw-table-row[data-v-2c8e41ee]{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:background-color .16s ease;-moz-transition:background-color .16s ease;transition:background-color .16s ease}.fw-table-row[data-v-2c8e41ee]:hover{background-color:var(--v6ed5b746)}.fw-table--tbody[data-v-2c8e41ee]{overflow-anchor:none;position:relative;will-change:transform,opacity}.fw-table-animate-move[data-v-2c8e41ee]{-webkit-transition:-webkit-transform .22s cubic-bezier(.16,1,.3,1);transition:-webkit-transform .22s cubic-bezier(.16,1,.3,1);-moz-transition:transform .22s cubic-bezier(.16,1,.3,1),-moz-transform .22s cubic-bezier(.16,1,.3,1);transition:transform .22s cubic-bezier(.16,1,.3,1);transition:transform .22s cubic-bezier(.16,1,.3,1),-webkit-transform .22s cubic-bezier(.16,1,.3,1),-moz-transform .22s cubic-bezier(.16,1,.3,1);will-change:transform}.fw-table-animate-enter-active[data-v-2c8e41ee]{-webkit-transition:opacity .12s ease;-moz-transition:opacity .12s ease;transition:opacity .12s ease}.fw-table-animate-enter-from[data-v-2c8e41ee]{opacity:0}.fw-table-animate-enter-active[data-v-2c8e41ee],.fw-table-animate-leave-active[data-v-2c8e41ee]{will-change:transform,opacity}.fw-table-animate-leave-active[data-v-2c8e41ee]{-webkit-transition:none!important;-moz-transition:none!important;transition:none!important}.fw-table-animate-leave-to[data-v-2c8e41ee]{opacity:1;-webkit-transform:none;-moz-transform:none;-ms-transform:none;transform:none}@media (prefers-reduced-motion:reduce){.fw-table-animate-enter-active[data-v-2c8e41ee],.fw-table-animate-leave-active[data-v-2c8e41ee],.fw-table-animate-move[data-v-2c8e41ee],.fw-table-head[data-v-2c8e41ee],.fw-table-row[data-v-2c8e41ee]{-webkit-transition:none!important;-moz-transition:none!important;transition:none!important}}";
406
+ var stylesheet = ".fw-table-head[data-v-2c8e41ee]{-webkit-transition:background-color .16s ease,color .16s ease;-moz-transition:background-color .16s ease,color .16s ease;transition:background-color .16s ease,color .16s ease}.fw-table-head--sortable[data-v-2c8e41ee]:hover{background-color:var(--v6ed5b746)}.fw-table-row[data-v-2c8e41ee]{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:background-color .16s ease;-moz-transition:background-color .16s ease;transition:background-color .16s ease}.fw-table-row[data-v-2c8e41ee]:hover{background-color:var(--v6ed5b746)}.fw-table--tbody[data-v-2c8e41ee]{overflow-anchor:none;position:relative;will-change:transform,opacity}.fw-table-animate-move[data-v-2c8e41ee]{-webkit-transition:-webkit-transform .22s cubic-bezier(.16,1,.3,1);transition:-webkit-transform .22s cubic-bezier(.16,1,.3,1);-moz-transition:transform .22s cubic-bezier(.16,1,.3,1),-moz-transform .22s cubic-bezier(.16,1,.3,1);transition:transform .22s cubic-bezier(.16,1,.3,1);transition:transform .22s cubic-bezier(.16,1,.3,1),-webkit-transform .22s cubic-bezier(.16,1,.3,1),-moz-transform .22s cubic-bezier(.16,1,.3,1);will-change:transform}.fw-table-animate-enter-active[data-v-2c8e41ee]{-webkit-transition:opacity .12s ease;-moz-transition:opacity .12s ease;transition:opacity .12s ease}.fw-table-animate-enter-from[data-v-2c8e41ee]{opacity:0}.fw-table-animate-enter-active[data-v-2c8e41ee],.fw-table-animate-leave-active[data-v-2c8e41ee]{will-change:transform,opacity}.fw-table-animate-leave-active[data-v-2c8e41ee]{-webkit-transition:none!important;-moz-transition:none!important;transition:none!important}.fw-table-animate-leave-to[data-v-2c8e41ee]{opacity:1;-webkit-transform:none;-moz-transform:none;-ms-transform:none;transform:none}@media (prefers-reduced-motion:reduce){.fw-table-animate-enter-active[data-v-2c8e41ee],.fw-table-animate-leave-active[data-v-2c8e41ee],.fw-table-animate-move[data-v-2c8e41ee],.fw-table-head[data-v-2c8e41ee],.fw-table-row[data-v-2c8e41ee]{-webkit-transition:none!important;-moz-transition:none!important;transition:none!important}}";
407
+ styleInject(css_248z);
408
+
409
+ __default__.render = render$2;
410
+ __default__.__scopeId = "data-v-2c8e41ee";
411
+
412
+ var script$1 = defineComponent({
413
+ name: 'FwTableHead'
414
+ });
415
+
416
+ var _hoisted_1$1 = {
417
+ "class": "py-6 px-5 text-left font-medium"
418
+ };
419
+ var _hoisted_2 = {
420
+ "class": "flex flex-row"
421
+ };
422
+ var _hoisted_3 = {
423
+ key: 0,
424
+ "class": "w-full"
425
+ };
426
+ function render$1(_ctx, _cache, $props, $setup, $data, $options) {
427
+ return openBlock(), createElementBlock("th", _hoisted_1$1, [createElementVNode("div", _hoisted_2, [_ctx.$slots["default"] ? (openBlock(), createElementBlock("div", _hoisted_3, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)])]);
428
+ }
429
+
430
+ script$1.render = render$1;
431
+
432
+ var script = defineComponent({
433
+ name: 'FwTableRow'
434
+ });
435
+
436
+ var _hoisted_1 = {
437
+ "class": "py-3 px-4 text-left whitespace-nowrap"
438
+ };
439
+ function render(_ctx, _cache, $props, $setup, $data, $options) {
440
+ return openBlock(), createElementBlock("td", _hoisted_1, [_ctx.$slots["default"] ? renderSlot(_ctx.$slots, "default", {
441
+ key: 0
442
+ }) : createCommentVNode("", true)]);
443
+ }
444
+
445
+ script.render = render;
446
+
447
+ export { __default__ as _, script as a, script$1 as s };
package/esm/fw-table.js CHANGED
@@ -1,10 +1,9 @@
1
- export { _ as FwTable, s as FwTableHead, a as FwTableRow } from './fw-table-row-Cgi8871h.js';
2
- import './_rollupPluginBabelHelpers-DODWUb5N.js';
1
+ export { _ as FwTable, s as FwTableHead, a as FwTableRow } from './fw-table-row-D6FdCJMs.js';
3
2
  import 'vue';
4
- import './get-root-colours-DCjlYelc.js';
3
+ import './get-root-colours-DCCAnRF4.js';
5
4
  import './fw-button.js';
6
- import './fw-button-YMoW4x4c.js';
7
- import './index-BsEH8YYr.js';
5
+ import './fw-button-DZTHZLjk.js';
6
+ import './index-DHyRsKsZ.js';
8
7
  import './style-inject.es-tgCJW-Cu.js';
9
8
  import './fw-loading.js';
10
- import './fw-loading-bar-DecYSBC_.js';
9
+ import './fw-loading-bar-3x4tkF1B.js';
package/esm/fw-tabs.js CHANGED
@@ -1,7 +1,13 @@
1
- import { defineComponent, reactive, ref, computed, provide, createElementBlock, openBlock, createCommentVNode, renderSlot, Fragment, renderList, createElementVNode, normalizeClass, toDisplayString, getCurrentInstance, inject, watchEffect, withDirectives, vShow } from 'vue';
1
+ import { defineComponent, shallowReactive, shallowRef, computed, provide, resolveComponent, createElementBlock, openBlock, createCommentVNode, createElementVNode, Fragment, renderList, createVNode, normalizeClass, withCtx, createTextVNode, toDisplayString, renderSlot, inject, getCurrentInstance, ref, onMounted, onBeforeUnmount, createBlock, Transition, withDirectives, vShow } from 'vue';
2
+ import { s as script$2 } from './fw-button-DZTHZLjk.js';
3
+ import { s as styleInject } from './style-inject.es-tgCJW-Cu.js';
4
+ import './index-DHyRsKsZ.js';
2
5
 
3
6
  var script$1 = defineComponent({
4
7
  name: 'FwTabs',
8
+ components: {
9
+ FwButton: script$2
10
+ },
5
11
  props: {
6
12
  /**
7
13
  * The active tab v-model
@@ -13,18 +19,41 @@ var script$1 = defineComponent({
13
19
  },
14
20
  emits: ['update:modelValue'],
15
21
  setup: function setup(props, ctx) {
16
- var state = reactive({
17
- active: computed(function () {
18
- return props.modelValue;
19
- }),
20
- tabs: ref([])
22
+ var tabs = shallowReactive([]);
23
+ var nextIndex = shallowRef(0);
24
+ var active = computed(function () {
25
+ return props.modelValue;
21
26
  });
22
- var selectTab = function selectTab(tab) {
23
- ctx.emit('update:modelValue', tab);
27
+ var registerTabs = function registerTabs(uid, label) {
28
+ var index = nextIndex.value++;
29
+ tabs.push({
30
+ uid: uid,
31
+ label: label,
32
+ index: index
33
+ });
34
+ return index;
35
+ };
36
+ var unregisterTabs = function unregisterTabs(uid) {
37
+ var i = tabs.findIndex(function (t) {
38
+ return t.uid === uid;
39
+ });
40
+ if (i !== -1) tabs.splice(i, 1);
41
+ };
42
+ var selectTab = function selectTab(index) {
43
+ if (index !== active.value) {
44
+ ctx.emit('update:modelValue', index);
45
+ }
46
+ };
47
+ var api = {
48
+ active: active,
49
+ registerTabs: registerTabs,
50
+ unregisterTabs: unregisterTabs,
51
+ tabs: tabs
24
52
  };
25
- provide('tabsState', state);
53
+ provide('tabsApi', api);
26
54
  return {
27
- state: state,
55
+ tabs: tabs,
56
+ active: active,
28
57
  selectTab: selectTab
29
58
  };
30
59
  }
@@ -37,23 +66,39 @@ var _hoisted_2 = {
37
66
  key: 0,
38
67
  "class": "flex flex-wrap -mb-px border-b border-brand-border2"
39
68
  };
40
- var _hoisted_3 = ["onClick"];
69
+ var _hoisted_3 = {
70
+ "class": "fw-tabs--panels relative"
71
+ };
41
72
  function render$1(_ctx, _cache, $props, $setup, $data, $options) {
42
- return openBlock(), createElementBlock("div", _hoisted_1$1, [_ctx.state.tabs ? (openBlock(), createElementBlock("ul", _hoisted_2, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.state.tabs, function (tab, i) {
73
+ var _component_FwButton = resolveComponent("FwButton");
74
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [_ctx.tabs.length ? (openBlock(), createElementBlock("ul", _hoisted_2, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.tabs, function (tab) {
43
75
  return openBlock(), createElementBlock("li", {
44
- key: i,
76
+ key: tab.uid,
45
77
  "class": "mr-2"
46
- }, [createElementVNode("button", {
78
+ }, [createVNode(_component_FwButton, {
47
79
  type: "button",
48
- "class": normalizeClass(["inline-block p-4 outline-primary border-b-2 border-transparent transition ease-in", _ctx.state.active === i && '!border-primary']),
80
+ variant: "transparent",
81
+ rounded: false,
82
+ "class": normalizeClass(["fw-tab-btn !no-underline relative inline-block p-4 outline-primary", _ctx.active === tab.index && 'is-active']),
83
+ selected: _ctx.active === tab.index,
49
84
  onClick: function onClick($event) {
50
- return _ctx.selectTab(i);
85
+ return _ctx.selectTab(tab.index);
51
86
  }
52
- }, toDisplayString(tab.props.label), 11, _hoisted_3)]);
53
- }), 128))])) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default")]);
87
+ }, {
88
+ "default": withCtx(function () {
89
+ return [createTextVNode(toDisplayString(tab.label), 1)];
90
+ }),
91
+ _: 2
92
+ }, 1032, ["selected", "class", "onClick"])]);
93
+ }), 128))])) : createCommentVNode("", true), createElementVNode("div", _hoisted_3, [renderSlot(_ctx.$slots, "default")])]);
54
94
  }
55
95
 
96
+ var css_248z$1 = ".fw-tab-btn[data-v-1f725c9a]:after{background:var(--colorPrimary);bottom:-1px;content:\"\";height:2px;left:0;pointer-events:none;position:absolute;right:0;-webkit-transform:scaleX(0);-moz-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:center;-moz-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transition:-webkit-transform .22s ease;transition:-webkit-transform .22s ease;-moz-transition:transform .22s ease,-moz-transform .22s ease;transition:transform .22s ease;transition:transform .22s ease,-webkit-transform .22s ease,-moz-transform .22s ease;will-change:transform}.fw-tab-btn[data-v-1f725c9a]:hover:after{-webkit-transform:scaleX(.15);-moz-transform:scaleX(.15);-ms-transform:scaleX(.15);transform:scaleX(.15)}.fw-tab-btn.is-active[data-v-1f725c9a]{color:var(--color-primary)}.fw-tab-btn.is-active[data-v-1f725c9a]:after{-webkit-transform:scaleX(1)!important;-moz-transform:scaleX(1)!important;-ms-transform:scaleX(1)!important;transform:scaleX(1)!important}.fw-tab-btn[data-v-1f725c9a]:focus-visible:after{-webkit-transform:scaleX(.35);-moz-transform:scaleX(.35);-ms-transform:scaleX(.35);transform:scaleX(.35)}";
97
+ var stylesheet$1 = ".fw-tab-btn[data-v-1f725c9a]:after{background:var(--colorPrimary);bottom:-1px;content:\"\";height:2px;left:0;pointer-events:none;position:absolute;right:0;-webkit-transform:scaleX(0);-moz-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:center;-moz-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transition:-webkit-transform .22s ease;transition:-webkit-transform .22s ease;-moz-transition:transform .22s ease,-moz-transform .22s ease;transition:transform .22s ease;transition:transform .22s ease,-webkit-transform .22s ease,-moz-transform .22s ease;will-change:transform}.fw-tab-btn[data-v-1f725c9a]:hover:after{-webkit-transform:scaleX(.15);-moz-transform:scaleX(.15);-ms-transform:scaleX(.15);transform:scaleX(.15)}.fw-tab-btn.is-active[data-v-1f725c9a]{color:var(--color-primary)}.fw-tab-btn.is-active[data-v-1f725c9a]:after{-webkit-transform:scaleX(1)!important;-moz-transform:scaleX(1)!important;-ms-transform:scaleX(1)!important;transform:scaleX(1)!important}.fw-tab-btn[data-v-1f725c9a]:focus-visible:after{-webkit-transform:scaleX(.35);-moz-transform:scaleX(.35);-ms-transform:scaleX(.35);transform:scaleX(.35)}";
98
+ styleInject(css_248z$1);
99
+
56
100
  script$1.render = render$1;
101
+ script$1.__scopeId = "data-v-1f725c9a";
57
102
 
58
103
  var script = defineComponent({
59
104
  name: 'FwTab',
@@ -67,27 +112,21 @@ var script = defineComponent({
67
112
  }
68
113
  },
69
114
  setup: function setup(props) {
115
+ var api = inject('tabsApi');
116
+ if (!api) throw new Error('FwTab must be used inside FwTabs.');
70
117
  var instance = getCurrentInstance();
71
- var state = inject('tabsState');
72
- var index = computed(function () {
73
- var _state$tabs;
74
- return state === null || state === void 0 || (_state$tabs = state.tabs) === null || _state$tabs === void 0 ? void 0 : _state$tabs.findIndex(function (target) {
75
- return target.uid === (instance === null || instance === void 0 ? void 0 : instance.uid);
76
- });
118
+ var myIndex = ref(-1);
119
+ onMounted(function () {
120
+ myIndex.value = api.registerTabs(instance.uid, props.label);
77
121
  });
78
- var isActive = computed(function () {
79
- return index.value === (state === null || state === void 0 ? void 0 : state.active);
122
+ onBeforeUnmount(function () {
123
+ api.unregisterTabs(instance.uid);
80
124
  });
81
- watchEffect(function () {
82
- if (instance && index.value === -1) {
83
- var _state$tabs2;
84
- state === null || state === void 0 || (_state$tabs2 = state.tabs) === null || _state$tabs2 === void 0 || _state$tabs2.push(instance);
85
- }
125
+ var isActive = computed(function () {
126
+ return myIndex.value === api.active.value;
86
127
  });
87
128
  return {
88
- isActive: isActive,
89
- index: index,
90
- props: props
129
+ isActive: isActive
91
130
  };
92
131
  }
93
132
  });
@@ -96,9 +135,22 @@ var _hoisted_1 = {
96
135
  "class": "fw-tab w-full"
97
136
  };
98
137
  function render(_ctx, _cache, $props, $setup, $data, $options) {
99
- return withDirectives((openBlock(), createElementBlock("div", _hoisted_1, [renderSlot(_ctx.$slots, "default")], 512)), [[vShow, _ctx.isActive]]);
138
+ return openBlock(), createBlock(Transition, {
139
+ name: "fw-tab-slide",
140
+ appear: ""
141
+ }, {
142
+ "default": withCtx(function () {
143
+ return [withDirectives(createElementVNode("div", _hoisted_1, [renderSlot(_ctx.$slots, "default")], 512), [[vShow, _ctx.isActive]])];
144
+ }),
145
+ _: 3
146
+ });
100
147
  }
101
148
 
149
+ var css_248z = ".fw-tab[data-v-334b8b64]{inset:0;position:absolute}.fw-tab[style*=\"display: none\"][data-v-334b8b64]{pointer-events:none}.fw-tab-slide-enter-active[data-v-334b8b64],.fw-tab-slide-leave-active[data-v-334b8b64]{-webkit-transition:opacity .32s cubic-bezier(.22,1,.36,1),-webkit-transform .32s cubic-bezier(.22,1,.36,1);transition:opacity .32s cubic-bezier(.22,1,.36,1),-webkit-transform .32s cubic-bezier(.22,1,.36,1);-moz-transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .32s cubic-bezier(.22,1,.36,1),-moz-transform .32s cubic-bezier(.22,1,.36,1);transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .32s cubic-bezier(.22,1,.36,1);transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .32s cubic-bezier(.22,1,.36,1),-webkit-transform .32s cubic-bezier(.22,1,.36,1),-moz-transform .32s cubic-bezier(.22,1,.36,1);will-change:opacity,transform}.fw-tab-slide-enter-from[data-v-334b8b64],.fw-tab-slide-leave-to[data-v-334b8b64]{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}.fw-tab-slide-enter-to[data-v-334b8b64],.fw-tab-slide-leave-from[data-v-334b8b64]{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}";
150
+ var stylesheet = ".fw-tab[data-v-334b8b64]{inset:0;position:absolute}.fw-tab[style*=\"display: none\"][data-v-334b8b64]{pointer-events:none}.fw-tab-slide-enter-active[data-v-334b8b64],.fw-tab-slide-leave-active[data-v-334b8b64]{-webkit-transition:opacity .32s cubic-bezier(.22,1,.36,1),-webkit-transform .32s cubic-bezier(.22,1,.36,1);transition:opacity .32s cubic-bezier(.22,1,.36,1),-webkit-transform .32s cubic-bezier(.22,1,.36,1);-moz-transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .32s cubic-bezier(.22,1,.36,1),-moz-transform .32s cubic-bezier(.22,1,.36,1);transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .32s cubic-bezier(.22,1,.36,1);transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .32s cubic-bezier(.22,1,.36,1),-webkit-transform .32s cubic-bezier(.22,1,.36,1),-moz-transform .32s cubic-bezier(.22,1,.36,1);will-change:opacity,transform}.fw-tab-slide-enter-from[data-v-334b8b64],.fw-tab-slide-leave-to[data-v-334b8b64]{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}.fw-tab-slide-enter-to[data-v-334b8b64],.fw-tab-slide-leave-from[data-v-334b8b64]{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}";
151
+ styleInject(css_248z);
152
+
102
153
  script.render = render;
154
+ script.__scopeId = "data-v-334b8b64";
103
155
 
104
156
  export { script as FwTab, script$1 as FwTabs };