pagy 5.7.5 → 8.6.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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/apps/calendar.ru +745 -0
  4. data/apps/demo.ru +435 -0
  5. data/apps/rails.ru +213 -0
  6. data/apps/repro.ru +177 -0
  7. data/apps/tmp/calendar.sqlite3 +0 -0
  8. data/apps/tmp/calendar.sqlite3-shm +0 -0
  9. data/apps/tmp/calendar.sqlite3-wal +0 -0
  10. data/apps/tmp/local_secret.txt +1 -0
  11. data/bin/pagy +100 -0
  12. data/{lib/config → config}/pagy.rb +72 -96
  13. data/javascripts/pagy-module.js +100 -0
  14. data/javascripts/pagy.d.ts +5 -0
  15. data/javascripts/pagy.js +4 -0
  16. data/javascripts/pagy.min.js +4 -0
  17. data/javascripts/pagy.min.js.map +10 -0
  18. data/javascripts/pagy.mjs +100 -0
  19. data/lib/optimist.rb +1022 -0
  20. data/lib/pagy/backend.rb +16 -4
  21. data/lib/pagy/calendar/day.rb +22 -10
  22. data/lib/pagy/calendar/month.rb +35 -9
  23. data/lib/pagy/calendar/quarter.rb +36 -10
  24. data/lib/pagy/calendar/unit.rb +106 -0
  25. data/lib/pagy/calendar/week.rb +16 -16
  26. data/lib/pagy/calendar/year.rb +15 -9
  27. data/lib/pagy/calendar.rb +60 -68
  28. data/lib/pagy/console.rb +3 -3
  29. data/lib/pagy/countless.rb +17 -12
  30. data/lib/pagy/exceptions.rb +1 -1
  31. data/lib/pagy/extras/arel.rb +2 -2
  32. data/lib/pagy/extras/array.rb +2 -2
  33. data/lib/pagy/extras/bootstrap.rb +57 -53
  34. data/lib/pagy/extras/bulma.rb +53 -57
  35. data/lib/pagy/extras/calendar.rb +54 -37
  36. data/lib/pagy/extras/countless.rb +3 -3
  37. data/lib/pagy/extras/elasticsearch_rails.rb +12 -11
  38. data/lib/pagy/extras/foundation.rb +59 -54
  39. data/lib/pagy/extras/gearbox.rb +32 -19
  40. data/lib/pagy/extras/headers.rb +11 -11
  41. data/lib/pagy/extras/i18n.rb +5 -5
  42. data/lib/pagy/extras/items.rb +34 -24
  43. data/lib/pagy/extras/{frontend_helpers.rb → js_tools.rb} +24 -24
  44. data/lib/pagy/extras/jsonapi.rb +79 -0
  45. data/lib/pagy/extras/materialize.rb +63 -47
  46. data/lib/pagy/extras/meilisearch.rb +26 -22
  47. data/lib/pagy/extras/metadata.rb +13 -9
  48. data/lib/pagy/extras/overflow.rb +13 -10
  49. data/lib/pagy/extras/pagy.rb +82 -0
  50. data/lib/pagy/extras/searchkick.rb +12 -11
  51. data/lib/pagy/extras/semantic.rb +57 -45
  52. data/lib/pagy/extras/size.rb +40 -0
  53. data/lib/pagy/extras/standalone.rb +12 -16
  54. data/lib/pagy/extras/trim.rb +13 -13
  55. data/lib/pagy/extras/uikit.rb +60 -46
  56. data/lib/pagy/frontend.rb +62 -45
  57. data/lib/pagy/i18n.rb +4 -3
  58. data/lib/pagy/url_helpers.rb +13 -25
  59. data/lib/pagy.rb +61 -59
  60. data/locales/ar.yml +28 -0
  61. data/locales/be.yml +25 -0
  62. data/locales/bg.yml +21 -0
  63. data/locales/bs.yml +25 -0
  64. data/locales/ca.yml +21 -0
  65. data/locales/ckb.yml +18 -0
  66. data/locales/cs.yml +23 -0
  67. data/locales/da.yml +21 -0
  68. data/locales/de.yml +21 -0
  69. data/locales/en.yml +21 -0
  70. data/locales/es.yml +21 -0
  71. data/locales/fr.yml +21 -0
  72. data/locales/hr.yml +25 -0
  73. data/locales/id.yml +19 -0
  74. data/locales/it.yml +21 -0
  75. data/locales/ja.yml +19 -0
  76. data/locales/km.yml +19 -0
  77. data/locales/ko.yml +17 -0
  78. data/locales/nb.yml +21 -0
  79. data/locales/nl.yml +21 -0
  80. data/locales/nn.yml +21 -0
  81. data/locales/pl.yml +25 -0
  82. data/locales/pt-BR.yml +21 -0
  83. data/locales/pt.yml +21 -0
  84. data/locales/ru.yml +25 -0
  85. data/locales/sr.yml +25 -0
  86. data/locales/sv-SE.yml +21 -0
  87. data/locales/sv.yml +21 -0
  88. data/locales/sw.yml +23 -0
  89. data/locales/ta.yml +23 -0
  90. data/locales/tr.yml +19 -0
  91. data/locales/uk.yml +25 -0
  92. data/locales/vi.yml +17 -0
  93. data/locales/zh-CN.yml +19 -0
  94. data/locales/zh-HK.yml +19 -0
  95. data/locales/zh-TW.yml +19 -0
  96. data/stylesheets/pagy.css +46 -0
  97. data/stylesheets/pagy.scss +48 -0
  98. data/stylesheets/pagy.tailwind.css +21 -0
  99. metadata +79 -66
  100. data/lib/javascripts/pagy-dev.js +0 -118
  101. data/lib/javascripts/pagy-module.d.ts +0 -30
  102. data/lib/javascripts/pagy-module.js +0 -117
  103. data/lib/javascripts/pagy.js +0 -1
  104. data/lib/locales/ar.yml +0 -26
  105. data/lib/locales/bg.yml +0 -22
  106. data/lib/locales/bs.yml +0 -24
  107. data/lib/locales/ca.yml +0 -22
  108. data/lib/locales/cs.yml +0 -22
  109. data/lib/locales/da.yml +0 -22
  110. data/lib/locales/de.yml +0 -22
  111. data/lib/locales/en.yml +0 -22
  112. data/lib/locales/es.yml +0 -22
  113. data/lib/locales/fr.yml +0 -22
  114. data/lib/locales/hr.yml +0 -24
  115. data/lib/locales/id.yml +0 -20
  116. data/lib/locales/it.yml +0 -22
  117. data/lib/locales/ja.yml +0 -20
  118. data/lib/locales/km.yml +0 -19
  119. data/lib/locales/ko.yml +0 -20
  120. data/lib/locales/nb.yml +0 -22
  121. data/lib/locales/nl.yml +0 -22
  122. data/lib/locales/pl.yml +0 -24
  123. data/lib/locales/pt-BR.yml +0 -22
  124. data/lib/locales/pt.yml +0 -22
  125. data/lib/locales/ru.yml +0 -24
  126. data/lib/locales/sr.yml +0 -23
  127. data/lib/locales/sv-SE.yml +0 -23
  128. data/lib/locales/sv.yml +0 -23
  129. data/lib/locales/sw.yml +0 -22
  130. data/lib/locales/ta.yml +0 -22
  131. data/lib/locales/tr.yml +0 -20
  132. data/lib/locales/uk.yml +0 -24
  133. data/lib/locales/zh-CN.yml +0 -20
  134. data/lib/locales/zh-HK.yml +0 -20
  135. data/lib/locales/zh-TW.yml +0 -20
  136. data/lib/pagy/calendar/month_mixin.rb +0 -49
  137. data/lib/pagy/extras/navs.rb +0 -63
  138. data/lib/pagy/extras/support.rb +0 -54
  139. data/lib/templates/bootstrap_nav.html.erb +0 -24
  140. data/lib/templates/bootstrap_nav.html.haml +0 -34
  141. data/lib/templates/bootstrap_nav.html.slim +0 -34
  142. data/lib/templates/bulma_nav.html.erb +0 -24
  143. data/lib/templates/bulma_nav.html.haml +0 -32
  144. data/lib/templates/bulma_nav.html.slim +0 -32
  145. data/lib/templates/foundation_nav.html.erb +0 -24
  146. data/lib/templates/foundation_nav.html.haml +0 -34
  147. data/lib/templates/foundation_nav.html.slim +0 -34
  148. data/lib/templates/nav.html.erb +0 -22
  149. data/lib/templates/nav.html.haml +0 -30
  150. data/lib/templates/nav.html.slim +0 -29
  151. data/lib/templates/uikit_nav.html.erb +0 -15
  152. data/lib/templates/uikit_nav.html.haml +0 -28
  153. data/lib/templates/uikit_nav.html.slim +0 -28
metadata CHANGED
@@ -1,67 +1,48 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagy
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.7.5
4
+ version: 8.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domizio Demichelis
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-13 00:00:00.000000000 Z
11
+ date: 2024-07-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Agnostic pagination in plain ruby. It does it all. Better.
14
14
  email:
15
15
  - dd.nexus@gmail.com
16
- executables: []
16
+ executables:
17
+ - pagy
17
18
  extensions: []
18
19
  extra_rdoc_files: []
19
20
  files:
20
21
  - LICENSE.txt
21
- - lib/config/pagy.rb
22
- - lib/javascripts/pagy-dev.js
23
- - lib/javascripts/pagy-module.d.ts
24
- - lib/javascripts/pagy-module.js
25
- - lib/javascripts/pagy.js
26
- - lib/locales/ar.yml
27
- - lib/locales/bg.yml
28
- - lib/locales/bs.yml
29
- - lib/locales/ca.yml
30
- - lib/locales/cs.yml
31
- - lib/locales/da.yml
32
- - lib/locales/de.yml
33
- - lib/locales/en.yml
34
- - lib/locales/es.yml
35
- - lib/locales/fr.yml
36
- - lib/locales/hr.yml
37
- - lib/locales/id.yml
38
- - lib/locales/it.yml
39
- - lib/locales/ja.yml
40
- - lib/locales/km.yml
41
- - lib/locales/ko.yml
42
- - lib/locales/nb.yml
43
- - lib/locales/nl.yml
44
- - lib/locales/pl.yml
45
- - lib/locales/pt-BR.yml
46
- - lib/locales/pt.yml
47
- - lib/locales/ru.yml
48
- - lib/locales/sr.yml
49
- - lib/locales/sv-SE.yml
50
- - lib/locales/sv.yml
51
- - lib/locales/sw.yml
52
- - lib/locales/ta.yml
53
- - lib/locales/tr.yml
54
- - lib/locales/uk.yml
55
- - lib/locales/zh-CN.yml
56
- - lib/locales/zh-HK.yml
57
- - lib/locales/zh-TW.yml
22
+ - apps/calendar.ru
23
+ - apps/demo.ru
24
+ - apps/rails.ru
25
+ - apps/repro.ru
26
+ - apps/tmp/calendar.sqlite3
27
+ - apps/tmp/calendar.sqlite3-shm
28
+ - apps/tmp/calendar.sqlite3-wal
29
+ - apps/tmp/local_secret.txt
30
+ - bin/pagy
31
+ - config/pagy.rb
32
+ - javascripts/pagy-module.js
33
+ - javascripts/pagy.d.ts
34
+ - javascripts/pagy.js
35
+ - javascripts/pagy.min.js
36
+ - javascripts/pagy.min.js.map
37
+ - javascripts/pagy.mjs
38
+ - lib/optimist.rb
58
39
  - lib/pagy.rb
59
40
  - lib/pagy/backend.rb
60
41
  - lib/pagy/calendar.rb
61
42
  - lib/pagy/calendar/day.rb
62
43
  - lib/pagy/calendar/month.rb
63
- - lib/pagy/calendar/month_mixin.rb
64
44
  - lib/pagy/calendar/quarter.rb
45
+ - lib/pagy/calendar/unit.rb
65
46
  - lib/pagy/calendar/week.rb
66
47
  - lib/pagy/calendar/year.rb
67
48
  - lib/pagy/console.rb
@@ -75,40 +56,65 @@ files:
75
56
  - lib/pagy/extras/countless.rb
76
57
  - lib/pagy/extras/elasticsearch_rails.rb
77
58
  - lib/pagy/extras/foundation.rb
78
- - lib/pagy/extras/frontend_helpers.rb
79
59
  - lib/pagy/extras/gearbox.rb
80
60
  - lib/pagy/extras/headers.rb
81
61
  - lib/pagy/extras/i18n.rb
82
62
  - lib/pagy/extras/items.rb
63
+ - lib/pagy/extras/js_tools.rb
64
+ - lib/pagy/extras/jsonapi.rb
83
65
  - lib/pagy/extras/materialize.rb
84
66
  - lib/pagy/extras/meilisearch.rb
85
67
  - lib/pagy/extras/metadata.rb
86
- - lib/pagy/extras/navs.rb
87
68
  - lib/pagy/extras/overflow.rb
69
+ - lib/pagy/extras/pagy.rb
88
70
  - lib/pagy/extras/searchkick.rb
89
71
  - lib/pagy/extras/semantic.rb
72
+ - lib/pagy/extras/size.rb
90
73
  - lib/pagy/extras/standalone.rb
91
- - lib/pagy/extras/support.rb
92
74
  - lib/pagy/extras/trim.rb
93
75
  - lib/pagy/extras/uikit.rb
94
76
  - lib/pagy/frontend.rb
95
77
  - lib/pagy/i18n.rb
96
78
  - lib/pagy/url_helpers.rb
97
- - lib/templates/bootstrap_nav.html.erb
98
- - lib/templates/bootstrap_nav.html.haml
99
- - lib/templates/bootstrap_nav.html.slim
100
- - lib/templates/bulma_nav.html.erb
101
- - lib/templates/bulma_nav.html.haml
102
- - lib/templates/bulma_nav.html.slim
103
- - lib/templates/foundation_nav.html.erb
104
- - lib/templates/foundation_nav.html.haml
105
- - lib/templates/foundation_nav.html.slim
106
- - lib/templates/nav.html.erb
107
- - lib/templates/nav.html.haml
108
- - lib/templates/nav.html.slim
109
- - lib/templates/uikit_nav.html.erb
110
- - lib/templates/uikit_nav.html.haml
111
- - lib/templates/uikit_nav.html.slim
79
+ - locales/ar.yml
80
+ - locales/be.yml
81
+ - locales/bg.yml
82
+ - locales/bs.yml
83
+ - locales/ca.yml
84
+ - locales/ckb.yml
85
+ - locales/cs.yml
86
+ - locales/da.yml
87
+ - locales/de.yml
88
+ - locales/en.yml
89
+ - locales/es.yml
90
+ - locales/fr.yml
91
+ - locales/hr.yml
92
+ - locales/id.yml
93
+ - locales/it.yml
94
+ - locales/ja.yml
95
+ - locales/km.yml
96
+ - locales/ko.yml
97
+ - locales/nb.yml
98
+ - locales/nl.yml
99
+ - locales/nn.yml
100
+ - locales/pl.yml
101
+ - locales/pt-BR.yml
102
+ - locales/pt.yml
103
+ - locales/ru.yml
104
+ - locales/sr.yml
105
+ - locales/sv-SE.yml
106
+ - locales/sv.yml
107
+ - locales/sw.yml
108
+ - locales/ta.yml
109
+ - locales/tr.yml
110
+ - locales/uk.yml
111
+ - locales/vi.yml
112
+ - locales/zh-CN.yml
113
+ - locales/zh-HK.yml
114
+ - locales/zh-TW.yml
115
+ - stylesheets/pagy.css
116
+ - stylesheets/pagy.scss
117
+ - stylesheets/pagy.tailwind.css
112
118
  homepage: https://github.com/ddnexus/pagy
113
119
  licenses:
114
120
  - MIT
@@ -118,8 +124,15 @@ metadata:
118
124
  documentation_uri: https://ddnexus.github.io/pagy
119
125
  bug_tracker_uri: https://github.com/ddnexus/pagy/issues
120
126
  changelog_uri: https://github.com/ddnexus/pagy/blob/master/CHANGELOG.md
121
- live_support: https://gitter.im/ruby-pagy/Lobby
122
- post_install_message:
127
+ support: https://github.com/ddnexus/pagy/discussions/categories/q-a
128
+ post_install_message: |
129
+ *********************** PAGY WARNING! ***********************
130
+ The foundation, materialize, semantic and uikit CSS extras
131
+ have been discontinued and will be removed in v9
132
+ https://github.com/ddnexus/pagy/discussions/672
133
+ The javascript files have been deprecated/renamed
134
+ https://ddnexus.github.io/pagy/changelog/#deprecations
135
+ *************************************************************
123
136
  rdoc_options: []
124
137
  require_paths:
125
138
  - lib
@@ -127,15 +140,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
140
  requirements:
128
141
  - - ">="
129
142
  - !ruby/object:Gem::Version
130
- version: '2.5'
143
+ version: '3.1'
131
144
  required_rubygems_version: !ruby/object:Gem::Requirement
132
145
  requirements:
133
146
  - - ">="
134
147
  - !ruby/object:Gem::Version
135
148
  version: '0'
136
149
  requirements: []
137
- rubygems_version: 3.2.32
138
- signing_key:
150
+ rubygems_version: 3.5.11
151
+ signing_key:
139
152
  specification_version: 4
140
- summary: The kick-ass pagination ruby gem
153
+ summary: The best pagination ruby gem
141
154
  test_files: []
@@ -1,118 +0,0 @@
1
- "use strict";
2
- const Pagy = {
3
- version: "5.7.5",
4
- // Scan for "data-pagy-json" elements, parse their JSON content and call their init functions
5
- init(arg) {
6
- const target = arg instanceof Element ? arg : document;
7
- const elements = target.querySelectorAll("[data-pagy-json]");
8
- const warn = (el, err) => console.warn("Pagy.init() skipped element: %o\n%s", el, err);
9
- for (const element of elements) {
10
- const json = element.getAttribute("data-pagy-json");
11
- try {
12
- const [keyword, ...args] = JSON.parse(json);
13
- if (keyword === "nav") {
14
- Pagy.initNav(element, args);
15
- }
16
- else if (keyword === "combo") {
17
- Pagy.initCombo(element, args);
18
- }
19
- else if (keyword === "selector") {
20
- Pagy.initSelector(element, args);
21
- }
22
- else {
23
- warn(element, `Illegal PagyJSON keyword: expected "nav"|"combo"|"selector", got "${keyword}"`);
24
- }
25
- }
26
- catch (err) {
27
- warn(element, err);
28
- }
29
- }
30
- },
31
- // Init the *_nav_js helpers
32
- initNav(el, [tags, sequels, labelSequels, trimParam]) {
33
- const container = el.parentElement ?? el;
34
- const widths = Object.getOwnPropertyNames(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
35
- let lastWidth = -1;
36
- const fillIn = (link, page, label) => link.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
37
- (el.pagyRender = function () {
38
- const width = widths.find(w => w < container.clientWidth) || 0;
39
- if (width === lastWidth) {
40
- return;
41
- } // no change: abort
42
- let html = tags.before;
43
- const series = sequels[width.toString()];
44
- const labels = labelSequels?.[width.toString()] ?? series.map(l => l.toString());
45
- for (const i in series) {
46
- const item = series[i];
47
- const label = labels[i];
48
- if (typeof trimParam === "string" && item === 1) {
49
- html += Pagy.trim(fillIn(tags.link, item.toString(), label), trimParam);
50
- }
51
- else if (typeof item === "number") {
52
- html += fillIn(tags.link, item.toString(), label);
53
- }
54
- else if (item === "gap") {
55
- html += tags.gap;
56
- }
57
- else { // active page
58
- html += fillIn(tags.active, item, label);
59
- }
60
- }
61
- html += tags.after; // eslint-disable-line align-assignments/align-assignments
62
- el.innerHTML = "";
63
- el.insertAdjacentHTML("afterbegin", html);
64
- lastWidth = width;
65
- })();
66
- if (el.classList.contains("pagy-rjs")) {
67
- Pagy.rjsObserver.observe(container);
68
- }
69
- },
70
- // The observer instance for responsive navs
71
- rjsObserver: new ResizeObserver(entries => {
72
- entries.filter(e => e.contentBoxSize)
73
- .forEach(e => e.target.querySelectorAll(".pagy-rjs")
74
- .forEach(rjs => rjs.pagyRender()));
75
- }),
76
- // Init the *_combo_nav_js helpers
77
- initCombo(el, [link, trimParam]) {
78
- Pagy.initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
79
- },
80
- // Init the items_selector_js helper
81
- initSelector(el, [from, link, trimParam]) {
82
- Pagy.initInput(el, inputValue => {
83
- const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
84
- const html = link.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
85
- return [page, html];
86
- }, trimParam);
87
- },
88
- // Init the input element
89
- initInput(el, getVars, trimParam) {
90
- const input = el.querySelector("input");
91
- const initial = input.value;
92
- const action = function () {
93
- if (input.value === initial) {
94
- return;
95
- } // not changed
96
- const [min, val, max] = [input.min, input.value, input.max].map(n => parseInt(n) || 0);
97
- if (val < min || val > max) { // reset invalid/out-of-range
98
- input.value = initial;
99
- input.select();
100
- return;
101
- }
102
- let [page, html] = getVars(input.value); // eslint-disable-line prefer-const
103
- if (typeof trimParam === "string" && page === "1") {
104
- html = Pagy.trim(html, trimParam);
105
- }
106
- el.insertAdjacentHTML("afterbegin", html);
107
- el.querySelector("a").click();
108
- };
109
- ["change", "focus"].forEach(e => input.addEventListener(e, input.select)); // auto-select
110
- input.addEventListener("focusout", action); // trigger action
111
- input.addEventListener("keypress", e => { if (e.key === "Enter") {
112
- action();
113
- } }); // trigger action
114
- },
115
- // Trim the ${page-param}=1 params in links
116
- trim: (link, param) => link.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "")
117
- };
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWVBLE1BQU0sSUFBSSxHQUFHO0lBQ1QsT0FBTyxFQUFFLE9BQU87SUFFaEIsNkZBQTZGO0lBQzdGLElBQUksQ0FBQyxHQUFrQjtRQUNuQixNQUFNLE1BQU0sR0FBSyxHQUFHLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBTyxDQUFDLEVBQVUsRUFBRSxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNHLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQVcsQ0FBQztZQUM5RCxJQUFJO2dCQUNBLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBYSxDQUFDO2dCQUN4RCxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBcUIsRUFBRSxJQUFlLENBQUMsQ0FBQztpQkFDeEQ7cUJBQU0sSUFBSSxPQUFPLEtBQUssT0FBTyxFQUFFO29CQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFpQixDQUFDLENBQUM7aUJBQzlDO3FCQUFNLElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBb0IsQ0FBQyxDQUFDO2lCQUNwRDtxQkFBTTtvQkFDSCxJQUFJLENB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Q0FBRyxtQ0FBbUM7WUFDOUUsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtnQkFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7YUFBRTtZQUN4RixFQUFFLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pELENBQUMsQ0FBQztRQUNGLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBUSxjQUFjO1FBQ2hHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBdUMsaUJBQWlCO1FBQ25HLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxFQUFFO1lBQUUsTUFBTSxFQUFFLENBQUE7U0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO0lBQ3ZHLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsSUFBSSxFQUFFLENBQUMsSUFBVyxFQUFFLEtBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssaUJBQWlCLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzdHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIFBhZ3lKU09OICAgICA9IHJlYWRvbmx5IFtcIm5hdlwiLCAuLi5OYXZBcmdzXSB8IFtcImNvbWJvXCIsIC4uLkNvbWJvQXJnc10gfCBbXCJzZWxlY3RvclwiLCAuLi5TZWxlY3RvckFyZ3NdXG50eXBlIE5hdkFyZ3MgICAgICA9IHJlYWRvbmx5IFtUYWdzLCBTZXF1ZWxzLCBudWxsfExhYmVsU2VxdWVscywgc3RyaW5nP11cbnR5cGUgQ29tYm9BcmdzICAgID0gcmVhZG9ubHkgW3N0cmluZywgc3RyaW5nP11cbnR5cGUgU2VsZWN0b3JBcmdzID0gcmVhZG9ubHkgW251bWJlciwgc3RyaW5nLCBzdHJpbmc/XVxuaW50ZXJmYWNlIFRhZ3Mge1xuICAgIHJlYWRvbmx5IGJlZm9yZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgbGluazogICBzdHJpbmdcbiAgICByZWFkb25seSBhY3RpdmU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGdhcDogICAgc3RyaW5nXG4gICAgcmVhZG9ubHkgYWZ0ZXI6ICBzdHJpbmdcbn1cbmludGVyZmFjZSBTZXF1ZWxzICAgICAgeyByZWFkb25seSBbd2lkdGg6c3RyaW5nXTogKHN0cmluZ3xudW1iZXJ8XCJnYXBcIilbXSB9XG5pbnRlcmZhY2UgTGFiZWxTZXF1ZWxzIHsgcmVhZG9ubHkgW3dpZHRoOnN0cmluZ106IHN0cmluZ1tdIH1cbmludGVyZmFjZSBOYXZFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7IHBhZ3lSZW5kZXIoKTogdm9pZCB9XG5cbmNvbnN0IFBhZ3kgPSB7XG4gICAgdmVyc2lvbjogXCI1LjcuNVwiLFxuXG4gICAgLy8gU2NhbiBmb3IgXCJkYXRhLXBhZ3ktanNvblwiIGVsZW1lbnRzLCBwYXJzZSB0aGVpciBKU09OIGNvbnRlbnQgYW5kIGNhbGwgdGhlaXIgaW5pdCBmdW5jdGlvbnNcbiAgICBpbml0KGFyZz86RWxlbWVudHxuZXZlcikge1xuICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0YXJnZXQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLXBhZ3ktanNvbl1cIik7XG4gICAgICAgIGNvbnN0IHdhcm4gICAgID0gKGVsOkVsZW1lbnQsIGVycjp1bmtub3duKSA9PiBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQoKSBza2lwcGVkIGVsZW1lbnQ6ICVvXFxuJXNcIiwgZWwsIGVycik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QganNvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYWd5LWpzb25cIikgYXMgc3RyaW5nO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKGpzb24pIGFzIFBhZ3lKU09OO1xuICAgICAgICAgICAgICAgIGlmIChrZXl3b3JkID09PSBcIm5hdlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIFBhZ3kuaW5pdE5hdihlbGVtZW50IGFzIE5hdkVsZW1lbnQsIGFyZ3MgYXMgTmF2QXJncyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXl3b3JkID09PSBcImNvbWJvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgUGFneS5pbml0Q29tYm8oZWxlbWVudCwgYXJncyBhcyBDb21ib0FyZ3MpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIFBhZ3kuaW5pdFNlbGVjdG9yKGVsZW1lbnQsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKGVsZW1lbnQsIGBJbGxlZ2FsIFBhZ3lKU09OIGtleXdvcmQ6IGV4cGVjdGVkIFwibmF2XCJ8XCJjb21ib1wifFwic2VsZWN0b3JcIiwgZ290IFwiJHtrZXl3b3JkfVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IHdhcm4oZWxlbWVudCwgZXJyKSB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgKl9uYXZfanMgaGVscGVyc1xuICAgIGluaXROYXYoZWw6TmF2RWxlbWVudCwgW3RhZ3MsIHNlcXVlbHMsIGxhYmVsU2VxdWVscywgdHJpbVBhcmFtXTpOYXZBcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsLnBhcmVudEVsZW1lbnQgPz8gZWw7XG4gICAgICAgIGNvbnN0IHdpZHRocyAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNlcXVlbHMpLm1hcCh3ID0+IHBhcnNlSW50KHcpKS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG4gICAgICAgIGxldCBsYXN0V2lkdGggICA9IC0xO1xuICAgICAgICBjb25zdCBmaWxsSW4gICAgPSAobGluazpzdHJpbmcsIHBhZ2U6c3RyaW5nLCBsYWJlbDpzdHJpbmcpOnN0cmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fL2csIHBhZ2UpLnJlcGxhY2UoL19fcGFneV9sYWJlbF9fL2csIGxhYmVsKTtcbiAgICAgICAgKGVsLnBhZ3lSZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gd2lkdGhzLmZpbmQodyA9PiB3IDwgY29udGFpbmVyLmNsaWVudFdpZHRoKSB8fCAwO1xuICAgICAgICAgICAgaWYgKHdpZHRoID09PSBsYXN0V2lkdGgpIHsgcmV0dXJuIH0gLy8gbm8gY2hhbmdlOiBhYm9ydFxuICAgICAgICAgICAgbGV0IGh0bWwgICAgID0gdGFncy5iZWZvcmU7XG4gICAgICAgICAgICBjb25zdCBzZXJpZXMgPSBzZXF1ZWxzW3dpZHRoLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxzID0gbGFiZWxTZXF1ZWxzPy5bd2lkdGgudG9TdHJpbmcoKV0gPz8gc2VyaWVzLm1hcChsID0+IGwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSAgPSBzZXJpZXNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmltUGFyYW0gPT09IFwic3RyaW5nXCIgJiYgaXRlbSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9IFBhZ3kudHJpbShmaWxsSW4odGFncy5saW5rLCBpdGVtLnRvU3RyaW5nKCksIGxhYmVsKSwgdHJpbVBhcmFtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gZmlsbEluKHRhZ3MubGluaywgaXRlbS50b1N0cmluZygpLCBsYWJlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtID09PSBcImdhcFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gdGFncy5nYXA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gYWN0aXZlIHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBmaWxsSW4odGFncy5hY3RpdmUsIGl0ZW0sIGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBodG1sICs9IHRhZ3MuYWZ0ZXI7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBhbGlnbi1hc3NpZ25tZW50cy9hbGlnbi1hc3NpZ25tZW50c1xuICAgICAgICAgICAgZWwuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIGVsLmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIiwgaHRtbCk7XG4gICAgICAgICAgICBsYXN0V2lkdGggPSB3aWR0aDtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucyhcInBhZ3ktcmpzXCIpKSB7IFBhZ3kucmpzT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpIH1cbiAgICB9LFxuXG4gICAgLy8gVGhlIG9ic2VydmVyIGluc3RhbmNlIGZvciByZXNwb25zaXZlIG5hdnNcbiAgICByanNPYnNlcnZlcjogbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICBlbnRyaWVzLmZpbHRlcihlID0+IGUuY29udGVudEJveFNpemUpXG4gICAgICAgICAgICAgICAuZm9yRWFjaChlID0+IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGw8TmF2RWxlbWVudD4oXCIucGFneS1yanNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChyanMgPT4gcmpzLnBhZ3lSZW5kZXIoKSkpO1xuICAgIH0pLFxuXG4gICAgLy8gSW5pdCB0aGUgKl9jb21ib19uYXZfanMgaGVscGVyc1xuICAgIGluaXRDb21ibyhlbDpFbGVtZW50LCBbbGluaywgdHJpbVBhcmFtXTpDb21ib0FyZ3MpIHtcbiAgICAgICAgUGFneS5pbml0SW5wdXQoZWwsIGlucHV0VmFsdWUgPT4gW2lucHV0VmFsdWUsIGxpbmsucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy8sIGlucHV0VmFsdWUpXSwgdHJpbVBhcmFtKTtcbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgaXRlbXNfc2VsZWN0b3JfanMgaGVscGVyXG4gICAgaW5pdFNlbGVjdG9yKGVsOkVsZW1lbnQsIFtmcm9tLCBsaW5rLCB0cmltUGFyYW1dOlNlbGVjdG9yQXJncykge1xuICAgICAgICBQYWd5LmluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgcGFnZSkucmVwbGFjZSgvX19wYWd5X2l0ZW1zX18vLCBpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBbcGFnZSwgaHRtbF07XG4gICAgICAgIH0sIHRyaW1QYXJhbSk7XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGlucHV0IGVsZW1lbnRcbiAgICBpbml0SW5wdXQoZWw6RWxlbWVudCwgZ2V0VmFyczoodjpzdHJpbmcpPT5bc3RyaW5nLCBzdHJpbmddLCB0cmltUGFyYW0/OnN0cmluZykge1xuICAgICAgICBjb25zdCBpbnB1dCAgID0gZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgY29uc3QgYWN0aW9uICA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgW21pbiwgdmFsLCBtYXhdID0gW2lucHV0Lm1pbiwgaW5wdXQudmFsdWUsIGlucHV0Lm1heF0ubWFwKG4gPT4gcGFyc2VJbnQobikgfHwgMCk7XG4gICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGluaXRpYWw7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IFtwYWdlLCBodG1sXSA9IGdldFZhcnMoaW5wdXQudmFsdWUpOyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyaW1QYXJhbSA9PT0gXCJzdHJpbmdcIiAmJiBwYWdlID09PSBcIjFcIikgeyBodG1sID0gUGFneS50cmltKGh0bWwsIHRyaW1QYXJhbSkgfVxuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIChlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfSxcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICB0cmltOiAobGluazpzdHJpbmcsIHBhcmFtOnN0cmluZykgPT4gbGluay5yZXBsYWNlKG5ldyBSZWdFeHAoYFs/Jl0ke3BhcmFtfT0xXFxcXGIoPyEmKXxcXFxcYiR7cGFyYW19PTEmYCksIFwiXCIpXG59O1xuIl19
@@ -1,30 +0,0 @@
1
- declare type NavArgs = readonly [Tags, Sequels, null | LabelSequels, string?];
2
- declare type ComboArgs = readonly [string, string?];
3
- declare type SelectorArgs = readonly [number, string, string?];
4
- interface Tags {
5
- readonly before: string;
6
- readonly link: string;
7
- readonly active: string;
8
- readonly gap: string;
9
- readonly after: string;
10
- }
11
- interface Sequels {
12
- readonly [width: string]: (string | number | "gap")[];
13
- }
14
- interface LabelSequels {
15
- readonly [width: string]: string[];
16
- }
17
- interface NavElement extends Element {
18
- pagyRender(): void;
19
- }
20
- declare const Pagy: {
21
- version: string;
22
- init(arg?: Element | never): void;
23
- initNav(el: NavElement, [tags, sequels, labelSequels, trimParam]: NavArgs): void;
24
- rjsObserver: ResizeObserver;
25
- initCombo(el: Element, [link, trimParam]: ComboArgs): void;
26
- initSelector(el: Element, [from, link, trimParam]: SelectorArgs): void;
27
- initInput(el: Element, getVars: (v: string) => [string, string], trimParam?: string): void;
28
- trim: (link: string, param: string) => string;
29
- };
30
- export default Pagy;
@@ -1,117 +0,0 @@
1
- const Pagy = {
2
- version: "5.7.5",
3
- // Scan for "data-pagy-json" elements, parse their JSON content and call their init functions
4
- init(arg) {
5
- const target = arg instanceof Element ? arg : document;
6
- const elements = target.querySelectorAll("[data-pagy-json]");
7
- const warn = (el, err) => console.warn("Pagy.init() skipped element: %o\n%s", el, err);
8
- for (const element of elements) {
9
- const json = element.getAttribute("data-pagy-json");
10
- try {
11
- const [keyword, ...args] = JSON.parse(json);
12
- if (keyword === "nav") {
13
- Pagy.initNav(element, args);
14
- }
15
- else if (keyword === "combo") {
16
- Pagy.initCombo(element, args);
17
- }
18
- else if (keyword === "selector") {
19
- Pagy.initSelector(element, args);
20
- }
21
- else {
22
- warn(element, `Illegal PagyJSON keyword: expected "nav"|"combo"|"selector", got "${keyword}"`);
23
- }
24
- }
25
- catch (err) {
26
- warn(element, err);
27
- }
28
- }
29
- },
30
- // Init the *_nav_js helpers
31
- initNav(el, [tags, sequels, labelSequels, trimParam]) {
32
- const container = el.parentElement ?? el;
33
- const widths = Object.getOwnPropertyNames(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
34
- let lastWidth = -1;
35
- const fillIn = (link, page, label) => link.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
36
- (el.pagyRender = function () {
37
- const width = widths.find(w => w < container.clientWidth) || 0;
38
- if (width === lastWidth) {
39
- return;
40
- } // no change: abort
41
- let html = tags.before;
42
- const series = sequels[width.toString()];
43
- const labels = labelSequels?.[width.toString()] ?? series.map(l => l.toString());
44
- for (const i in series) {
45
- const item = series[i];
46
- const label = labels[i];
47
- if (typeof trimParam === "string" && item === 1) {
48
- html += Pagy.trim(fillIn(tags.link, item.toString(), label), trimParam);
49
- }
50
- else if (typeof item === "number") {
51
- html += fillIn(tags.link, item.toString(), label);
52
- }
53
- else if (item === "gap") {
54
- html += tags.gap;
55
- }
56
- else { // active page
57
- html += fillIn(tags.active, item, label);
58
- }
59
- }
60
- html += tags.after; // eslint-disable-line align-assignments/align-assignments
61
- el.innerHTML = "";
62
- el.insertAdjacentHTML("afterbegin", html);
63
- lastWidth = width;
64
- })();
65
- if (el.classList.contains("pagy-rjs")) {
66
- Pagy.rjsObserver.observe(container);
67
- }
68
- },
69
- // The observer instance for responsive navs
70
- rjsObserver: new ResizeObserver(entries => {
71
- entries.filter(e => e.contentBoxSize)
72
- .forEach(e => e.target.querySelectorAll(".pagy-rjs")
73
- .forEach(rjs => rjs.pagyRender()));
74
- }),
75
- // Init the *_combo_nav_js helpers
76
- initCombo(el, [link, trimParam]) {
77
- Pagy.initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
78
- },
79
- // Init the items_selector_js helper
80
- initSelector(el, [from, link, trimParam]) {
81
- Pagy.initInput(el, inputValue => {
82
- const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
83
- const html = link.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
84
- return [page, html];
85
- }, trimParam);
86
- },
87
- // Init the input element
88
- initInput(el, getVars, trimParam) {
89
- const input = el.querySelector("input");
90
- const initial = input.value;
91
- const action = function () {
92
- if (input.value === initial) {
93
- return;
94
- } // not changed
95
- const [min, val, max] = [input.min, input.value, input.max].map(n => parseInt(n) || 0);
96
- if (val < min || val > max) { // reset invalid/out-of-range
97
- input.value = initial;
98
- input.select();
99
- return;
100
- }
101
- let [page, html] = getVars(input.value); // eslint-disable-line prefer-const
102
- if (typeof trimParam === "string" && page === "1") {
103
- html = Pagy.trim(html, trimParam);
104
- }
105
- el.insertAdjacentHTML("afterbegin", html);
106
- el.querySelector("a").click();
107
- };
108
- ["change", "focus"].forEach(e => input.addEventListener(e, input.select)); // auto-select
109
- input.addEventListener("focusout", action); // trigger action
110
- input.addEventListener("keypress", e => { if (e.key === "Enter") {
111
- action();
112
- } }); // trigger action
113
- },
114
- // Trim the ${page-param}=1 params in links
115
- trim: (link, param) => link.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "")
116
- };
117
- export default Pagy;
@@ -1 +0,0 @@
1
- !function(){function t(t){if(Array.isArray(t))return t}function n(t){if(Symbol.iterator in Object(t)||"[object Arguments]"===Object.prototype.toString.call(t))return Array.from(t)}function e(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function r(r,i){return t(r)||n(r)||e()}var i={version:"5.7.5",init:function(r){var a,o=(r instanceof Element?r:document).querySelectorAll("[data-pagy-json]"),c=function(t,n){return console.warn("Pagy.init() skipped element: %o\n%s",t,n)},u=!0,l=!1,f=void 0;try{for(var p,s=o[Symbol.iterator]();!(u=(p=s.next()).done);u=!0){var v=p.value,g=v.getAttribute("data-pagy-json");try{var y=t(a=JSON.parse(g))||n(a)||e(),d=y[0],m=y.slice(1);"nav"===d?i.initNav(v,m):"combo"===d?i.initCombo(v,m):"selector"===d?i.initSelector(v,m):c(v,'Illegal PagyJSON keyword: expected "nav"|"combo"|"selector", got "'.concat(d,'"'))}catch(t){c(v,t)}}}catch(t){l=!0,f=t}finally{try{u||null==s.return||s.return()}finally{if(l)throw f}}},initNav:function(t,n){var e,a=r(n),o=a[0],c=a[1],u=a[2],l=a[3],f=null!==(e=t.parentElement)&&void 0!==e?e:t,p=Object.getOwnPropertyNames(c).map((function(t){return parseInt(t)})).sort((function(t,n){return n-t})),s=-1,v=function(t,n,e){return t.replace(/__pagy_page__/g,n).replace(/__pagy_label__/g,e)};(t.pagyRender=function(){var n=p.find((function(t){return t<f.clientWidth}))||0;if(n!==s){var e,r=o.before,a=c[n.toString()],g=null!==(e=null==u?void 0:u[n.toString()])&&void 0!==e?e:a.map((function(t){return t.toString()}));for(var y in a){var d=a[y],m=g[y];r+="string"==typeof l&&1===d?i.trim(v(o.link,d.toString(),m),l):"number"==typeof d?v(o.link,d.toString(),m):"gap"===d?o.gap:v(o.active,d,m)}r+=o.after,t.innerHTML="",t.insertAdjacentHTML("afterbegin",r),s=n}})(),t.classList.contains("pagy-rjs")&&i.rjsObserver.observe(f)},rjsObserver:new ResizeObserver((function(t){t.filter((function(t){return t.contentBoxSize})).forEach((function(t){return t.target.querySelectorAll(".pagy-rjs").forEach((function(t){return t.pagyRender()}))}))})),initCombo:function(t,n){var e=r(n),a=e[0],o=e[1];i.initInput(t,(function(t){return[t,a.replace(/__pagy_page__/,t)]}),o)},initSelector:function(t,n){var e=r(n),a=e[0],o=e[1],c=e[2];i.initInput(t,(function(t){var n=Math.max(Math.ceil(a/parseInt(t)),1).toString();return[n,o.replace(/__pagy_page__/,n).replace(/__pagy_items__/,t)]}),c)},initInput:function(t,n,e){var a=t.querySelector("input"),o=a.value,c=function(){if(a.value!==o){var c=r([a.min,a.value,a.max].map((function(t){return parseInt(t)||0}))),u=c[0],l=c[1],f=c[2];if(l<u||l>f)return a.value=o,void a.select();var p=r(n(a.value)),s=p[0],v=p[1];"string"==typeof e&&"1"===s&&(v=i.trim(v,e)),t.insertAdjacentHTML("afterbegin",v),t.querySelector("a").click()}};["change","focus"].forEach((function(t){return a.addEventListener(t,a.select)})),a.addEventListener("focusout",c),a.addEventListener("keypress",(function(t){"Enter"===t.key&&c()}))},trim:function(t,n){return t.replace(new RegExp("[?&]".concat(n,"=1\\b(?!&)|\\b").concat(n,"=1&")),"")}},a=i;window.Pagy=a}();
data/lib/locales/ar.yml DELETED
@@ -1,26 +0,0 @@
1
- # :arabic pluralization (see https://github.com/ddnexus/pagy/blob/master/lib/locales/utils/p11n.rb)
2
-
3
- ar:
4
- pagy:
5
-
6
- item_name:
7
- zero: "صفر"
8
- one: "عنصر"
9
- two: "عنصرين"
10
- few: "قليل"
11
- many: "كثير"
12
- other: "عناصر"
13
-
14
- nav:
15
- prev: "&lsaquo;&nbsp;السابق"
16
- next: "التالي&nbsp;&rsaquo;"
17
- gap: "&hellip;"
18
-
19
- info:
20
- no_items: "لا يوجد %{item_name}"
21
- single_page: "عرض <b>%{count}</b> %{item_name}"
22
- multiple_pages: "عرض %{item_name} <b>%{from}-%{to}</b> من اجمالي <b>%{count}</b>"
23
-
24
- combo_nav_js: "الصفحة %{page_input} من %{pages}"
25
-
26
- items_selector_js: "عرض %{items_input} %{item_name} لكل صفحة"
data/lib/locales/bg.yml DELETED
@@ -1,22 +0,0 @@
1
- # :one_other pluralization (see https://github.com/ddnexus/pagy/blob/master/lib/locales/utils/p11n.rb)
2
-
3
- bg:
4
- pagy:
5
-
6
- item_name:
7
- one: "резултат"
8
- other: "резултати"
9
-
10
- nav:
11
- prev: "&lsaquo;&nbsp;Предишна"
12
- next: "Следваща&nbsp;&rsaquo;"
13
- gap: "&hellip;"
14
-
15
- info:
16
- no_items: "Няма намерени %{item_name}"
17
- single_page: "Показани са <b>%{count}</b> %{item_name}"
18
- multiple_pages: "Показани са %{item_name} <b>%{from}-%{to}</b> от <b>%{count}</b> общо"
19
-
20
- combo_nav_js: "<label>Страница %{page_input} от %{pages}</label>"
21
-
22
- items_selector_js: "<label>Покажи %{items_input} %{item_name} на страница</label>"
data/lib/locales/bs.yml DELETED
@@ -1,24 +0,0 @@
1
- # :east_slavic pluralization (see https://github.com/ddnexus/pagy/blob/master/lib/locales/utils/p11n.rb)
2
-
3
- bs:
4
- pagy:
5
-
6
- item_name:
7
- one: "stavka"
8
- few: "stavke"
9
- many: "stavki"
10
- other: "stavki"
11
-
12
- nav:
13
- prev: "&lsaquo;&nbsp;Prethodna"
14
- next: "Sljedeća &nbsp;&rsaquo;"
15
- gap: "&hellip;"
16
-
17
- info:
18
- no_items: "Nije pronađena %{item_name}"
19
- single_page: "Prikazuje se <b>%{count}</b> %{item_name}"
20
- multiple_pages: "Prikaz %{item_name} <b>%{from}-%{to}</b> od <b>%{count}</b> ukupno"
21
-
22
- combo_nav_js: "<label>Stranica %{page_input} od %{pages}</label>"
23
-
24
- items_selector_js: "<label>Prikaži %{items_input} %{item_name} po stranici</label>"
data/lib/locales/ca.yml DELETED
@@ -1,22 +0,0 @@
1
- # :one_other pluralization (see https://github.com/ddnexus/pagy/blob/master/lib/locales/utils/p11n.rb)
2
-
3
- ca:
4
- pagy:
5
-
6
- item_name:
7
- one: "element"
8
- other: "elements"
9
-
10
- nav:
11
- prev: "&lsaquo;&nbsp;Anterior"
12
- next: "Següent&nbsp;&rsaquo;"
13
- gap: "&hellip;"
14
-
15
- info:
16
- no_items: "No s'ha trobat cap resultat"
17
- single_page: "Mostrant <b>%{count}</b> %{item_name}"
18
- multiple_pages: "Mostrant %{item_name} <b>%{from}-%{to}</b> de <b>%{count}</b> en total"
19
-
20
- combo_nav_js: "<label>Pàgina %{page_input} de %{pages}</label>"
21
-
22
- items_selector_js: "<label>Mostra %{items_input} %{item_name} per pàgina</label>"
data/lib/locales/cs.yml DELETED
@@ -1,22 +0,0 @@
1
- # :czech pluralization (see https://github.com/ddnexus/pagy/blob/master/lib/locales/utils/p11n.rb)
2
-
3
- cs:
4
- pagy:
5
- item_name:
6
- one: "položka"
7
- few: "položek"
8
- other: "položky"
9
-
10
- nav:
11
- prev: "&lsaquo;&nbsp;Předchozí"
12
- next: "Další&nbsp;&rsaquo;"
13
- gap: "&hellip;"
14
-
15
- info:
16
- no_items: "Nic nebylo nalezeno"
17
- single_page: "Zobrazeno <b>%{count}</b> %{item_name}"
18
- multiple_pages: "Zobrazeno %{item_name} <b>%{from}-%{to}</b> z <b>%{count}</b> celkem"
19
-
20
- combo_nav_js: "<label>Strana %{page_input} z %{pages}</label>"
21
-
22
- items_selector_js: "<label>Zobrazit %{items_input} %{item_name} na stránce</label>"