svelte-common 4.22.22 → 5.0.1

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.
package/README.md CHANGED
@@ -38,16 +38,22 @@ or the [live example](https://arlac77.github.io/components/svelte-common/example
38
38
  * [Parameters](#parameters-3)
39
39
  * [filter](#filter)
40
40
  * [Parameters](#parameters-4)
41
- * [initializeServiceWorker](#initializeserviceworker)
41
+ * [Pagination](#pagination)
42
42
  * [Parameters](#parameters-5)
43
+ * [page](#page)
44
+ * [Parameters](#parameters-6)
45
+ * [page](#page-1)
46
+ * [pageNavigationElement](#pagenavigationelement)
47
+ * [initializeServiceWorker](#initializeserviceworker)
48
+ * [Parameters](#parameters-7)
43
49
  * [toggleOrderBy](#toggleorderby)
44
- * [Parameters](#parameters-6)
50
+ * [Parameters](#parameters-8)
45
51
  * [sortable](#sortable)
46
- * [Parameters](#parameters-7)
52
+ * [Parameters](#parameters-9)
47
53
  * [sorter](#sorter)
48
- * [Parameters](#parameters-8)
54
+ * [Parameters](#parameters-10)
49
55
  * [keyPrefixStore](#keyprefixstore)
50
- * [Parameters](#parameters-9)
56
+ * [Parameters](#parameters-11)
51
57
 
52
58
  ## AttributeDefinition
53
59
 
@@ -121,6 +127,32 @@ Generate filter function.
121
127
 
122
128
  Returns **[Function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** 
123
129
 
130
+ ## Pagination
131
+
132
+ Pagination support store.
133
+
134
+ ### Parameters
135
+
136
+ * `source`  
137
+ * `itemsPerPage` (optional, default `10`)
138
+
139
+ ### page
140
+
141
+ Set current page
142
+
143
+ #### Parameters
144
+
145
+ * `n` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
146
+
147
+ ### page
148
+
149
+ Returns **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** current page
150
+
151
+ ### pageNavigationElement
152
+
153
+ * **See**: @link <https://getbootstrap.com/docs/4.0/components/pagination>
154
+ * **See**: @link <https://a11y-style-guide.com/style-guide/section-navigation.html#kssref-navigation-pagination>
155
+
124
156
  ## initializeServiceWorker
125
157
 
126
158
  Create a store holding a service worker
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-common",
3
- "version": "4.22.22",
3
+ "version": "5.0.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -23,7 +23,7 @@
23
23
  "prepare": "vite build",
24
24
  "start": "vite",
25
25
  "test": "npm run test:ava && npm run test:cafe",
26
- "test:cafe": "testcafe $BROWSER:headless tests/cafe/*.*js --esm -s build/test --page-request-timeout 5000 --app-init-delay 8000 --app vite",
26
+ "test:cafe": "testcafe $BROWSER:headless tests/cafe/*-cafe.mjs --esm -s build/test --page-request-timeout 5000 --app-init-delay 8000 --app vite",
27
27
  "test:ava": "ava --timeout 2m tests/*-ava.mjs tests/*-ava-node.mjs",
28
28
  "cover": "c8 -x 'tests/**/*' --temp-directory build/tmp ava --timeout 2m tests/*-ava.mjs tests/*-ava-node.mjs && c8 report -r lcov -o build/coverage --temp-directory build/tmp",
29
29
  "docs": "documentation readme --section=API ./src/**/*.mjs",
@@ -33,29 +33,29 @@
33
33
  "preview": "vite preview"
34
34
  },
35
35
  "dependencies": {
36
- "svelte-command": "^1.1.41",
37
- "svelte-entitlement": "^1.2.52"
36
+ "svelte-command": "^1.1.42",
37
+ "svelte-entitlement": "^1.2.53"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@semantic-release/commit-analyzer": "^10.0.1",
41
41
  "@semantic-release/exec": "^6.0.3",
42
42
  "@semantic-release/release-notes-generator": "^11.0.3",
43
- "@sveltejs/vite-plugin-svelte": "^2.4.1",
44
- "ava": "^5.3.0",
45
- "c8": "^7.14.0",
43
+ "@sveltejs/vite-plugin-svelte": "^2.4.2",
44
+ "ava": "^5.3.1",
45
+ "c8": "^8.0.0",
46
46
  "documentation": "^14.0.2",
47
- "mf-styling": "^1.7.57",
48
- "npm-pkgbuild": "^11.8.6",
49
- "semantic-release": "^21.0.3s",
50
- "stylelint": "^15.7.0",
47
+ "mf-styling": "^1.8.1",
48
+ "npm-pkgbuild": "^11.8.9",
49
+ "semantic-release": "^21.0.5",
50
+ "stylelint": "^15.9.0",
51
51
  "stylelint-config-standard": "^33.0.0",
52
- "svelte": "^3.59.1",
53
- "testcafe": "^2.6.2",
52
+ "svelte": "^4.0.0",
53
+ "testcafe": "^3.0.0",
54
54
  "vite": "^4.3.9"
55
55
  },
56
56
  "optionalDependencies": {
57
57
  "mf-hosting-cloudflare": "^1.0.5",
58
- "mf-hosting-frontend": "^1.9.3"
58
+ "mf-hosting-frontend": "^1.9.5"
59
59
  },
60
60
  "repository": {
61
61
  "type": "git",
package/src/attribute.mjs CHANGED
@@ -20,6 +20,7 @@
20
20
  * @yields {string}
21
21
  */
22
22
  export function* tokens(string) {
23
+ let isString = false;
23
24
  let identifier = "";
24
25
  let last;
25
26
 
@@ -27,16 +28,30 @@ export function* tokens(string) {
27
28
  switch (c) {
28
29
  case "\t":
29
30
  case " ":
30
- if (identifier.length) {
31
+ if (isString) {
32
+ identifier += c;
33
+ } else {
34
+ if (identifier.length) {
35
+ yield identifier;
36
+ identifier = "";
37
+ }
38
+ if (last) {
39
+ yield last;
40
+ last = undefined;
41
+ }
42
+ }
43
+ break;
44
+
45
+ case '"':
46
+ case "'":
47
+ if (isString) {
31
48
  yield identifier;
32
49
  identifier = "";
33
- }
34
- if (last) {
35
- yield last;
36
- last = undefined;
50
+ isString = false;
51
+ } else {
52
+ isString = true;
37
53
  }
38
54
  break;
39
-
40
55
  case "!":
41
56
  case ">":
42
57
  case "<":
@@ -53,9 +68,11 @@ export function* tokens(string) {
53
68
  break;
54
69
  }
55
70
 
71
+ case ".":
56
72
  case "+":
57
73
  case "-":
58
- case ".":
74
+ case "*":
75
+ case "/":
59
76
  case "(":
60
77
  case ")":
61
78
  case "[":
package/src/index.svelte CHANGED
@@ -55,5 +55,6 @@
55
55
  SORT_DESCENDING
56
56
  } from "./sorting.mjs";
57
57
  export { filter } from "./filter.mjs";
58
+ export { Pagination, pageNavigation } from "./pagination.mjs";
58
59
  export { initializeServiceWorker } from "./service-worker.mjs";
59
60
  </script>
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Pagination support store.
3
+ */
4
+ export class Pagination {
5
+ subscriptions = new Set();
6
+ data;
7
+ itemsPerPage;
8
+ #page = 0;
9
+
10
+ constructor(source, itemsPerPage = 10) {
11
+ this.data = [...source];
12
+ this.itemsPerPage = itemsPerPage;
13
+ }
14
+
15
+ /**
16
+ * Set current page
17
+ * @param {number} n
18
+ */
19
+ set page(n) {
20
+ if (this.#page !== n && n > 0 && n <= this.numberOfPages) {
21
+ this.#page = n;
22
+ this.subscriptions.forEach(subscription => subscription(this));
23
+ }
24
+ }
25
+
26
+ /**
27
+ * @return {number} current page
28
+ */
29
+ get page() {
30
+ return this.#page;
31
+ }
32
+
33
+ subscribe(s) {
34
+ this.subscriptions.add(s);
35
+
36
+ s(this);
37
+
38
+ return () => this.subscriptions.delete(s);
39
+ }
40
+
41
+ get numberOfPages() {
42
+ return this.data.length / this.itemsPerPage;
43
+ }
44
+
45
+ *items() {
46
+ const n = this.page;
47
+
48
+ for (const item of this.data.slice(
49
+ n * this.itemsPerPage,
50
+ (n + 1) * this.itemsPerPage
51
+ )) {
52
+ yield item;
53
+ }
54
+ }
55
+
56
+ /**
57
+ * @see @link https://getbootstrap.com/docs/4.0/components/pagination
58
+ * @see @link https://a11y-style-guide.com/style-guide/section-navigation.html#kssref-navigation-pagination
59
+ */
60
+ get pageNavigationElement() {
61
+ const nav = document.createElement("nav");
62
+ nav.setAttribute("aria-label", "pagination");
63
+
64
+ this.subscribe(pg => {
65
+ const items = [];
66
+
67
+ function add(innerText, eh) {
68
+ const a = document.createElement("a");
69
+ a.setAttribute("href", "#");
70
+ a.innerText = innerText;
71
+ a.onclick = eh;
72
+ items.push(a);
73
+ return a;
74
+ }
75
+
76
+ add("<<", event => (this.page = 1));
77
+ add("<", event => (this.page = this.page - 1));
78
+
79
+ for (let n = 1; n < this.numberOfPages; n++) {
80
+ if (
81
+ this.numberOfPages > 10 &&
82
+ (n <= 3 ||
83
+ n > this.numberOfPages - 3 ||
84
+ n % 10 === 0 ||
85
+ (n < this.page + 3 && n > this.page - 3))
86
+ ) {
87
+ const a = add(String(n), event => (this.page = n));
88
+ if (n === this.page) {
89
+ a.setAttribute("aria-current", "page");
90
+ }
91
+ }
92
+ }
93
+
94
+ add(">", event => (this.page = this.page + 1));
95
+ add(">>", event => (this.page = this.numberOfPages));
96
+
97
+ nav.replaceChildren(...items);
98
+ });
99
+
100
+ return nav;
101
+ }
102
+ }
103
+
104
+ export function pageNavigation(elem, pg) {
105
+ elem.replaceChildren(pg.pageNavigationElement);
106
+ }