@bexis2/bexis2-core-ui 0.0.30 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +41 -0
  2. package/dist/components/Table/Table.svelte +132 -94
  3. package/dist/components/Table/Table.svelte.d.ts +2 -0
  4. package/dist/components/Table/TableFilter.svelte +50 -5
  5. package/dist/components/Table/TablePagination.svelte +1 -1
  6. package/dist/components/Table/filter.js +43 -3
  7. package/dist/components/form/DropdownKvP.svelte +17 -2
  8. package/dist/components/form/DropdownKvP.svelte.d.ts +2 -0
  9. package/dist/components/form/NumberInput.svelte +2 -0
  10. package/dist/components/form/NumberInput.svelte.d.ts +1 -0
  11. package/dist/components/form/TextArea.svelte +2 -0
  12. package/dist/components/form/TextArea.svelte.d.ts +1 -0
  13. package/dist/components/form/TextInput.svelte +2 -0
  14. package/dist/components/form/TextInput.svelte.d.ts +1 -0
  15. package/dist/components/page/Alert.svelte +39 -0
  16. package/dist/components/page/Alert.svelte.d.ts +22 -0
  17. package/dist/components/spinner/Spinner.svelte +11 -1
  18. package/dist/components/spinner/Spinner.svelte.d.ts +9 -13
  19. package/dist/css/themes/theme-bexis2.css +3 -3
  20. package/dist/index.d.ts +4 -2
  21. package/dist/index.js +4 -1
  22. package/dist/models/Enums.d.ts +5 -0
  23. package/dist/models/Enums.js +6 -0
  24. package/dist/models/Models.d.ts +18 -0
  25. package/package.json +1 -1
  26. package/src/lib/components/Table/Table.svelte +230 -184
  27. package/src/lib/components/Table/TableFilter.svelte +50 -5
  28. package/src/lib/components/Table/TablePagination.svelte +1 -1
  29. package/src/lib/components/Table/filter.ts +141 -94
  30. package/src/lib/components/form/DropdownKvP.svelte +17 -2
  31. package/src/lib/components/form/NumberInput.svelte +2 -0
  32. package/src/lib/components/form/TextArea.svelte +2 -0
  33. package/src/lib/components/form/TextInput.svelte +3 -0
  34. package/src/lib/components/page/Alert.svelte +46 -0
  35. package/src/lib/components/spinner/Spinner.svelte +14 -1
  36. package/src/lib/css/themes/theme-bexis2.css +3 -3
  37. package/src/lib/index.ts +9 -3
  38. package/src/lib/models/Enums.ts +6 -0
  39. package/src/lib/models/Models.ts +102 -78
package/README.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # bexis-core-ui
2
+ ## v.0.0.32
3
+ ### add
4
+ #### types
5
+ - ListItem
6
+ - KvP
7
+
8
+ #### enum
9
+ - Position
10
+
11
+ ### update
12
+ #### components
13
+ - DropdownKVP
14
+ - return of the target to complex or id only
15
+ - TextInput, TextArea, Number
16
+ - add placeholder
17
+
18
+ ## v0.0.31
19
+ ### add
20
+ #### components
21
+ - Alert
2
22
 
23
+ ### updates
24
+ #### components
25
+ - Spinner
26
+ - label
27
+ - color
28
+ - position
29
+
30
+ - Table
31
+ - Date filters
32
+ - Configuration for complex types
33
+ - Custom event dispatcher
34
+ - Updated docs.
35
+ - Disabling of filters
36
+ - Disabling of sorting
37
+
38
+ ### fixes:
39
+ #### table
40
+ - Arrow in pageSize dropdown.
41
+ - Bug with number filter not working on zero values.
42
+ - Table of Contents on the right sidebar.
43
+
3
44
  ## v0.0.29
4
45
 
5
46
  ### add
@@ -1,4 +1,5 @@
1
- <script>import { createTable, Subscribe, Render, createRender } from "svelte-headless-table";
1
+ <script>import { createEventDispatcher } from "svelte";
2
+ import { createTable, Subscribe, Render, createRender } from "svelte-headless-table";
2
3
  import {
3
4
  addSortBy,
4
5
  addPagination,
@@ -18,6 +19,8 @@ let {
18
19
  defaultPageSize = 10,
19
20
  pageSizes = [5, 10, 15, 20]
20
21
  } = config;
22
+ const dispatch = createEventDispatcher();
23
+ const actionDispatcher = (obj) => dispatch("action", obj);
21
24
  const table = createTable(data, {
22
25
  colFilter: addColumnFilters(),
23
26
  tableFilter: addTableFilter({
@@ -27,7 +30,7 @@ const table = createTable(data, {
27
30
  page: addPagination({ initialPageSize: defaultPageSize }),
28
31
  expand: addExpandedRows()
29
32
  });
30
- const accessors = Object.keys($data[0]);
33
+ const accessors = $data.length > 0 ? Object.keys($data[0]) : [];
31
34
  const tableColumns = [
32
35
  ...accessors.filter((accessor) => {
33
36
  const key = accessor;
@@ -38,20 +41,47 @@ const tableColumns = [
38
41
  }).map((accessor) => {
39
42
  const key = accessor;
40
43
  if (columns !== void 0 && key in columns) {
41
- const { header, colFilterFn, colFilterComponent } = columns[key];
44
+ const {
45
+ header,
46
+ colFilterFn,
47
+ colFilterComponent,
48
+ instructions,
49
+ disableFiltering = false,
50
+ disableSorting = false
51
+ } = columns[key];
52
+ const { toSortableValueFn, toFilterableValueFn, toStringFn } = instructions ?? {};
42
53
  return table.column({
43
54
  header: header ?? key,
44
55
  accessor,
56
+ cell: ({ value }) => {
57
+ return toStringFn ? toStringFn(value) : value;
58
+ },
45
59
  plugins: {
46
- sort: { invert: true },
47
- colFilter: {
48
- fn: colFilterFn ?? columnFilter,
49
- render: ({ filterValue: filterValue2, values, id }) => createRender(colFilterComponent ?? TableFilter, {
50
- filterValue: filterValue2,
51
- values,
52
- id,
53
- tableId
54
- })
60
+ sort: {
61
+ disable: disableSorting,
62
+ invert: true,
63
+ getSortValue: (row) => {
64
+ return toSortableValueFn ? toSortableValueFn(row) : row;
65
+ }
66
+ },
67
+ colFilter: !disableFiltering ? {
68
+ fn: ({ filterValue: filterValue2, value }) => {
69
+ const val = toFilterableValueFn ? toFilterableValueFn(value) : value;
70
+ return colFilterFn ? colFilterFn({ filterValue: filterValue2, value: val }) : columnFilter({ filterValue: filterValue2, value: val });
71
+ },
72
+ render: ({ filterValue: filterValue2, values, id }) => {
73
+ return createRender(colFilterComponent ?? TableFilter, {
74
+ filterValue: filterValue2,
75
+ id,
76
+ tableId,
77
+ values
78
+ });
79
+ }
80
+ } : void 0,
81
+ tableFilter: {
82
+ getFilterValue: (row) => {
83
+ return toStringFn ? toStringFn(row) : row;
84
+ }
55
85
  }
56
86
  }
57
87
  });
@@ -60,10 +90,17 @@ const tableColumns = [
60
90
  header: key,
61
91
  accessor,
62
92
  plugins: {
63
- sort: { invert: true },
93
+ sort: {
94
+ invert: true
95
+ },
64
96
  colFilter: {
65
97
  fn: columnFilter,
66
- render: ({ filterValue: filterValue2, values, id }) => createRender(TableFilter, { filterValue: filterValue2, values, id, tableId })
98
+ render: ({ filterValue: filterValue2, values, id }) => createRender(TableFilter, {
99
+ filterValue: filterValue2,
100
+ id,
101
+ tableId,
102
+ values
103
+ })
67
104
  }
68
105
  }
69
106
  });
@@ -77,7 +114,8 @@ if (optionsComponent !== void 0) {
77
114
  header: "",
78
115
  cell: ({ row }, _) => {
79
116
  return createRender(optionsComponent, {
80
- row: row.isData() ? row.original : null
117
+ row: row.isData() ? row.original : null,
118
+ dispatchFn: actionDispatcher
81
119
  });
82
120
  }
83
121
  })
@@ -86,82 +124,82 @@ if (optionsComponent !== void 0) {
86
124
  const createdTableColumns = table.createColumns(tableColumns);
87
125
  const { headerRows, pageRows, tableAttrs, tableBodyAttrs, pluginStates } = table.createViewModel(createdTableColumns);
88
126
  const { filterValue } = pluginStates.tableFilter;
89
- </script>
90
-
91
- <div class="grid gap-2">
92
- <div class="table-container">
93
- <input
94
- class="input p-2 mb-2 border border-primary-500"
95
- type="text"
96
- bind:value={$filterValue}
97
- placeholder="Search rows..."
98
- />
99
- <table {...$tableAttrs} class="table table-compact bg-tertiary-200">
100
- <thead>
101
- {#each $headerRows as headerRow (headerRow.id)}
102
- <Subscribe
103
- rowAttrs={headerRow.attrs()}
104
- let:rowAttrs
105
- rowProps={headerRow.props()}
106
- let:rowProps
107
- >
108
- <tr {...rowAttrs} class="bg-primary-300">
109
- {#each headerRow.cells as cell (cell.id)}
110
- <Subscribe attrs={cell.attrs()} props={cell.props()} let:props let:attrs>
111
- <th scope="col" class="!p-2" {...attrs}>
112
- <div class="flex w-full justify-between items-center">
113
- <div class="flex gap-1">
114
- <span
115
- class:underline={props.sort.order}
116
- class:normal-case={cell.id !== cell.label}
117
- on:click={props.sort.toggle}
118
- on:keydown={props.sort.toggle}
119
- >
120
- {cell.render()}
121
- </span>
122
- <div class="w-2">
123
- {#if props.sort.order === 'asc'}
124
-
125
- {:else if props.sort.order === 'desc'}
126
-
127
- {/if}
128
- </div>
129
- </div>
130
- {#if cell.isData()}
131
- {#if props.colFilter?.render}
132
- <div>
133
- <Render of={props.colFilter.render} />
134
- </div>
135
- {/if}
136
- {/if}
137
- </div>
138
- </th>
139
- </Subscribe>
140
- {/each}
141
- </tr>
142
- </Subscribe>
143
- {/each}
144
- </thead>
145
-
146
- <tbody class="" {...$tableBodyAttrs}>
147
- {#each $pageRows as row (row.id)}
148
- <Subscribe rowAttrs={row.attrs()} let:rowAttrs>
149
- <tr {...rowAttrs}>
150
- {#each row.cells as cell (cell?.id)}
151
- <Subscribe attrs={cell.attrs()} let:attrs>
152
- <td {...attrs} class="!p-2">
153
- <div class="flex items-center w-full h-full table-cell-fit">
154
- <Render of={cell.render()} />
155
- </div>
156
- </td>
157
- </Subscribe>
158
- {/each}
159
- </tr>
160
- </Subscribe>
161
- {/each}
162
- </tbody>
163
- </table>
164
- </div>
165
-
166
- <TablePagination pageConfig={pluginStates.page} {pageSizes} />
167
- </div>
127
+ </script>
128
+
129
+ <div class="grid gap-2">
130
+ <div class="table-container">
131
+ <input
132
+ class="input p-2 mb-2 border border-primary-500"
133
+ type="text"
134
+ bind:value={$filterValue}
135
+ placeholder="Search rows..."
136
+ />
137
+ <table {...$tableAttrs} class="table table-compact bg-tertiary-200">
138
+ <thead>
139
+ {#each $headerRows as headerRow (headerRow.id)}
140
+ <Subscribe
141
+ rowAttrs={headerRow.attrs()}
142
+ let:rowAttrs
143
+ rowProps={headerRow.props()}
144
+ let:rowProps
145
+ >
146
+ <tr {...rowAttrs} class="bg-primary-300">
147
+ {#each headerRow.cells as cell (cell.id)}
148
+ <Subscribe attrs={cell.attrs()} props={cell.props()} let:props let:attrs>
149
+ <th scope="col" class="!p-2" {...attrs}>
150
+ <div class="flex w-full justify-between items-center">
151
+ <div class="flex gap-1">
152
+ <span
153
+ class:underline={props.sort.order}
154
+ class:normal-case={cell.id !== cell.label}
155
+ on:click={props.sort.toggle}
156
+ on:keydown={props.sort.toggle}
157
+ >
158
+ {cell.render()}
159
+ </span>
160
+ <div class="w-2">
161
+ {#if props.sort.order === 'asc'}
162
+
163
+ {:else if props.sort.order === 'desc'}
164
+
165
+ {/if}
166
+ </div>
167
+ </div>
168
+ {#if cell.isData()}
169
+ {#if props.colFilter?.render}
170
+ <div>
171
+ <Render of={props.colFilter.render} />
172
+ </div>
173
+ {/if}
174
+ {/if}
175
+ </div>
176
+ </th>
177
+ </Subscribe>
178
+ {/each}
179
+ </tr>
180
+ </Subscribe>
181
+ {/each}
182
+ </thead>
183
+
184
+ <tbody class="" {...$tableBodyAttrs}>
185
+ {#each $pageRows as row (row.id)}
186
+ <Subscribe rowAttrs={row.attrs()} let:rowAttrs>
187
+ <tr {...rowAttrs}>
188
+ {#each row.cells as cell (cell?.id)}
189
+ <Subscribe attrs={cell.attrs()} let:attrs>
190
+ <td {...attrs} class="!p-2">
191
+ <div class="flex items-center w-full h-full table-cell-fit">
192
+ <Render of={cell.render()} />
193
+ </div>
194
+ </td>
195
+ </Subscribe>
196
+ {/each}
197
+ </tr>
198
+ </Subscribe>
199
+ {/each}
200
+ </tbody>
201
+ </table>
202
+ </div>
203
+
204
+ <TablePagination pageConfig={pluginStates.page} {pageSizes} />
205
+ </div>
@@ -5,6 +5,8 @@ declare const __propDef: {
5
5
  config: TableConfig<any>;
6
6
  };
7
7
  events: {
8
+ action: CustomEvent<any>;
9
+ } & {
8
10
  [evt: string]: CustomEvent<any>;
9
11
  };
10
12
  slots: {};
@@ -62,6 +62,32 @@ const options = {
62
62
  value: "ends",
63
63
  label: "Ends with"
64
64
  }
65
+ ],
66
+ date: [
67
+ {
68
+ value: "ison",
69
+ label: "Is on"
70
+ },
71
+ {
72
+ value: "isstartingfrom",
73
+ label: "Is starting from"
74
+ },
75
+ {
76
+ value: "isafter",
77
+ label: "Is after"
78
+ },
79
+ {
80
+ value: "isuntil",
81
+ label: "Is until"
82
+ },
83
+ {
84
+ value: "isbefore",
85
+ label: "Is before"
86
+ },
87
+ {
88
+ value: "isnoton",
89
+ label: "Is not on"
90
+ }
65
91
  ]
66
92
  };
67
93
  const popupId = `${tableId}-${id}`;
@@ -70,7 +96,12 @@ const popupFeatured = {
70
96
  target: popupId,
71
97
  placement: "bottom-start"
72
98
  };
73
- const type = typeof $values[0];
99
+ let type = typeof $values[0];
100
+ if (type === "object") {
101
+ if ($values[0] instanceof Date) {
102
+ type = "date";
103
+ }
104
+ }
74
105
  </script>
75
106
 
76
107
  <form class="">
@@ -87,7 +118,7 @@ const type = typeof $values[0];
87
118
  <div class="card p-3 absolute grid gap-2 shadow-lg z-10 w-min">
88
119
  <button
89
120
  class="btn variant-filled-primary btn-sm"
90
- type="submit"
121
+ type="button"
91
122
  on:click|preventDefault={() => {
92
123
  firstOption = 'isequal';
93
124
  firstValue = undefined;
@@ -118,13 +149,20 @@ const type = typeof $values[0];
118
149
  bind:value={firstValue}
119
150
  on:click|stopPropagation
120
151
  />
121
- {:else}
152
+ {:else if type === 'string'}
122
153
  <input
123
154
  type="text"
124
155
  class="input p-1 border border-primary-500"
125
156
  bind:value={firstValue}
126
157
  on:click|stopPropagation
127
158
  />
159
+ {:else}
160
+ <input
161
+ type="date"
162
+ class="input p-1 border border-primary-500"
163
+ bind:value={firstValue}
164
+ on:click|stopPropagation
165
+ />
128
166
  {/if}
129
167
  </div>
130
168
  <label for="" class="label normal-case">And</label>
@@ -146,18 +184,25 @@ const type = typeof $values[0];
146
184
  bind:value={secondValue}
147
185
  on:click|stopPropagation
148
186
  />
149
- {:else}
187
+ {:else if type === 'string'}
150
188
  <input
151
189
  type="text"
152
190
  class="input p-1 border border-primary-500"
153
191
  bind:value={secondValue}
154
192
  on:click|stopPropagation
155
193
  />
194
+ {:else}
195
+ <input
196
+ type="date"
197
+ class="input p-1 border border-primary-500"
198
+ bind:value={secondValue}
199
+ on:click|stopPropagation
200
+ />
156
201
  {/if}
157
202
  </div>
158
203
  <button
159
204
  class="btn variant-filled-primary btn-sm"
160
- type="submit"
205
+ type="button"
161
206
  on:click|preventDefault={() => {
162
207
  active = firstValue?.toString().length > 0 || secondValue?.toString().length > 0;
163
208
  $filterValue = [firstOption, firstValue, secondOption, secondValue];
@@ -39,7 +39,7 @@ $:
39
39
  <select
40
40
  name="pageSize"
41
41
  id="pageSize"
42
- class="select btn btn-sm variant-filled-primary w-min font-bold"
42
+ class="select variant-filled-primary w-min font-bold"
43
43
  bind:value={$pageSize}
44
44
  >
45
45
  {#each pageSizes as size}
@@ -34,15 +34,38 @@ const numberFilter = (filterOption, filterValue, value) => {
34
34
  return false;
35
35
  }
36
36
  };
37
+ const dateFilter = (filterOption, filterValue, value) => {
38
+ const filter = new Date(filterValue);
39
+ switch (filterOption) {
40
+ case 'ison':
41
+ return value === filter;
42
+ case 'isstartingfrom':
43
+ return value >= filter;
44
+ case 'isafter':
45
+ return value > filter;
46
+ case 'isuntil':
47
+ return value <= filter;
48
+ case 'isbefore':
49
+ return value < filter;
50
+ case 'isnoton':
51
+ return value !== filter;
52
+ default:
53
+ return false;
54
+ }
55
+ };
37
56
  const numericFilter = ({ filterValue, value }) => {
38
57
  const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
39
- if (!firstFilterValue && !secondFilterValue) {
58
+ if (firstFilterValue == null && !secondFilterValue == null) {
40
59
  return true;
41
60
  }
42
- else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
61
+ else if ((firstFilterOption == null || firstFilterValue == null) &&
62
+ secondFilterOption != null &&
63
+ secondFilterValue != null) {
43
64
  return numberFilter(secondFilterOption, secondFilterValue, value);
44
65
  }
45
- else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
66
+ else if ((secondFilterOption == null || secondFilterValue == null) &&
67
+ firstFilterOption != null &&
68
+ firstFilterValue != null) {
46
69
  return numberFilter(firstFilterOption, firstFilterValue, value);
47
70
  }
48
71
  return (numberFilter(firstFilterOption, firstFilterValue, value) &&
@@ -66,6 +89,20 @@ const stringFilter = ({ filterValue, value }) => {
66
89
  return (textFilter(firstFilterOption, firstFilterValue, value) &&
67
90
  textFilter(secondFilterOption, secondFilterValue, value));
68
91
  };
92
+ const dateTypeFilter = ({ filterValue, value }) => {
93
+ const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
94
+ if (!firstFilterValue && !secondFilterValue) {
95
+ return true;
96
+ }
97
+ else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
98
+ return dateFilter(secondFilterOption, secondFilterValue, value);
99
+ }
100
+ else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
101
+ return dateFilter(firstFilterOption, firstFilterValue, value);
102
+ }
103
+ return (dateFilter(firstFilterOption, firstFilterValue, value) &&
104
+ dateFilter(secondFilterOption, secondFilterValue, value));
105
+ };
69
106
  export const columnFilter = ({ filterValue, value }) => {
70
107
  if (typeof value === 'string') {
71
108
  return stringFilter({ filterValue, value });
@@ -73,6 +110,9 @@ export const columnFilter = ({ filterValue, value }) => {
73
110
  else if (typeof value === 'number') {
74
111
  return numericFilter({ filterValue, value });
75
112
  }
113
+ else if (typeof value === 'object' && value instanceof Date) {
114
+ return dateTypeFilter({ filterValue, value });
115
+ }
76
116
  return false;
77
117
  };
78
118
  export const searchFilter = ({ filterValue, value }) => {
@@ -9,6 +9,7 @@
9
9
  export let invalid = false;
10
10
  export let feedback = [''];
11
11
  export let required = false;
12
+ export let targetIsComplex = false;
12
13
 
13
14
  $: selected = null;
14
15
 
@@ -17,12 +18,26 @@
17
18
 
18
19
  function updatedSelectedValue(selection) {
19
20
  if (selection != null) {
20
- selected = selection.id;
21
+ if(targetIsComplex)
22
+ {
23
+ selected = selection.id;
24
+ }
25
+ else
26
+ {
27
+ selected = selection
28
+ }
21
29
  }
22
30
  }
23
31
 
24
32
  function updatedTarget(id) {
25
- target = source.find((opt) => opt.id === id);
33
+ if(targetIsComplex)
34
+ {
35
+ target = source.find((opt) => opt.id === id);
36
+ }
37
+ else
38
+ {
39
+ target = id;
40
+ }
26
41
  }
27
42
  </script>
28
43
 
@@ -10,6 +10,7 @@ export default class DropdownKvP extends SvelteComponentTyped<{
10
10
  invalid?: boolean | undefined;
11
11
  valid?: boolean | undefined;
12
12
  feedback?: string[] | undefined;
13
+ targetIsComplex?: boolean | undefined;
13
14
  }, {
14
15
  change: Event;
15
16
  select: Event;
@@ -31,6 +32,7 @@ declare const __propDef: {
31
32
  invalid?: boolean | undefined;
32
33
  valid?: boolean | undefined;
33
34
  feedback?: string[] | undefined;
35
+ targetIsComplex?: boolean | undefined;
34
36
  };
35
37
  events: {
36
38
  change: Event;
@@ -6,6 +6,7 @@ export let valid = false;
6
6
  export let invalid = false;
7
7
  export let required = false;
8
8
  export let feedback = [""];
9
+ export let placeholder = "";
9
10
  </script>
10
11
 
11
12
  <InputContainer {label} {feedback} {required}>
@@ -17,5 +18,6 @@ export let feedback = [""];
17
18
  class:input-error={invalid}
18
19
  bind:value
19
20
  on:input
21
+ {placeholder}
20
22
  />
21
23
  </InputContainer>
@@ -8,6 +8,7 @@ declare const __propDef: {
8
8
  invalid?: boolean | undefined;
9
9
  required?: boolean | undefined;
10
10
  feedback?: string[] | undefined;
11
+ placeholder?: string | undefined;
11
12
  };
12
13
  events: {
13
14
  input: Event;
@@ -6,6 +6,7 @@ export let valid = false;
6
6
  export let invalid = false;
7
7
  export let required = false;
8
8
  export let feedback = [""];
9
+ export let placeholder = "";
9
10
  </script>
10
11
 
11
12
  <InputContainer {label} {feedback} {required}>
@@ -16,5 +17,6 @@ export let feedback = [""];
16
17
  class:input-error={invalid}
17
18
  bind:value
18
19
  on:input
20
+ {placeholder}
19
21
  />
20
22
  </InputContainer>
@@ -8,6 +8,7 @@ declare const __propDef: {
8
8
  invalid?: boolean | undefined;
9
9
  required?: boolean | undefined;
10
10
  feedback?: string[] | undefined;
11
+ placeholder?: string | undefined;
11
12
  };
12
13
  events: {
13
14
  input: Event;
@@ -6,6 +6,7 @@ export let valid = false;
6
6
  export let invalid = false;
7
7
  export let required = false;
8
8
  export let feedback = [""];
9
+ export let placeholder = "";
9
10
  </script>
10
11
 
11
12
  <InputContainer {label} {feedback} {required}>
@@ -17,5 +18,6 @@ export let feedback = [""];
17
18
  class:input-error={invalid}
18
19
  bind:value
19
20
  on:input
21
+ {placeholder}
20
22
  />
21
23
  </InputContainer>
@@ -8,6 +8,7 @@ declare const __propDef: {
8
8
  invalid?: boolean | undefined;
9
9
  required?: boolean | undefined;
10
10
  feedback?: string[] | undefined;
11
+ placeholder?: string | undefined;
11
12
  };
12
13
  events: {
13
14
  input: Event;
@@ -0,0 +1,39 @@
1
+ <script>import Fa from "svelte-fa";
2
+ import { faXmark } from "@fortawesome/free-solid-svg-icons";
3
+ import { fade } from "svelte/transition";
4
+ export let title = "";
5
+ export let message = "";
6
+ export let cssClass = "";
7
+ export let deleteBtn = true;
8
+ $:
9
+ show = true;
10
+ </script>
11
+ {#if show}
12
+
13
+ <aside class="alert {cssClass}" transition:fade|local={{ duration: 100 }}>
14
+ <!-- Icon -->
15
+ <!-- <div>(icon)</div> -->
16
+ <!-- Message -->
17
+ <div class="alert-message">
18
+
19
+ {#if title}
20
+ <h3 class="h3">{title}</h3>
21
+ {/if}
22
+ <p>{message}
23
+ <slot></slot>
24
+ </p>
25
+ </div>
26
+ <!-- Actions -->
27
+ <div class="alert-actions">
28
+ <slot name="actions"/>
29
+
30
+ {#if deleteBtn}
31
+ <button class="btn hover:text-primary-100" on:click={()=>show = false}>
32
+ <Fa icon={faXmark} />
33
+ </button>
34
+ {/if}
35
+
36
+ </div>
37
+ </aside>
38
+
39
+ {/if}