@foxy.io/elements 1.41.0 → 1.42.0-beta.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.
Files changed (226) hide show
  1. package/dist/cdn/foxy-access-recovery-form.js +1 -1
  2. package/dist/cdn/foxy-address-card.js +5 -5
  3. package/dist/cdn/foxy-address-form.js +1 -1
  4. package/dist/cdn/foxy-admin-subscription-card.js +1 -1
  5. package/dist/cdn/foxy-admin-subscription-form.js +1 -1
  6. package/dist/cdn/foxy-api-browser.js +1 -1
  7. package/dist/cdn/foxy-applied-coupon-code-card.js +1 -1
  8. package/dist/cdn/foxy-applied-coupon-code-form.js +1 -1
  9. package/dist/cdn/foxy-applied-tax-card.js +1 -1
  10. package/dist/cdn/foxy-attribute-card.js +1 -1
  11. package/dist/cdn/foxy-attribute-form.js +1 -1
  12. package/dist/cdn/foxy-billing-address-card.js +1 -1
  13. package/dist/cdn/foxy-cancellation-form.js +1 -1
  14. package/dist/cdn/foxy-cart-card.js +1 -1
  15. package/dist/cdn/foxy-cart-form.js +2 -2
  16. package/dist/cdn/foxy-client-card.js +1 -1
  17. package/dist/cdn/foxy-client-form.js +1 -1
  18. package/dist/cdn/foxy-collection-page.js +1 -1
  19. package/dist/cdn/foxy-collection-pages.js +1 -1
  20. package/dist/cdn/foxy-copy-to-clipboard.js +1 -1
  21. package/dist/cdn/foxy-coupon-card.js +1 -1
  22. package/dist/cdn/foxy-coupon-code-card.js +1 -1
  23. package/dist/cdn/foxy-coupon-code-form.js +1 -1
  24. package/dist/cdn/foxy-coupon-codes-form.js +1 -1
  25. package/dist/cdn/foxy-coupon-detail-card.js +1 -1
  26. package/dist/cdn/foxy-coupon-form.js +1 -1
  27. package/dist/cdn/foxy-custom-field-card.js +1 -1
  28. package/dist/cdn/foxy-custom-field-form.js +1 -1
  29. package/dist/cdn/foxy-customer-card.js +1 -1
  30. package/dist/cdn/foxy-customer-form.js +1 -1
  31. package/dist/cdn/foxy-customer-portal-settings-form.js +1 -1
  32. package/dist/cdn/foxy-customer-portal-settings.js +1 -1
  33. package/dist/cdn/foxy-customer-portal.js +1 -1
  34. package/dist/cdn/foxy-customer.js +1 -1
  35. package/dist/cdn/foxy-customers-table.js +1 -1
  36. package/dist/cdn/foxy-discount-builder.js +1 -1
  37. package/dist/cdn/foxy-discount-card.js +1 -1
  38. package/dist/cdn/foxy-discount-detail-card.js +1 -1
  39. package/dist/cdn/foxy-donation.js +1 -1
  40. package/dist/cdn/foxy-downloadable-card.js +1 -1
  41. package/dist/cdn/foxy-downloadable-form.js +6 -6
  42. package/dist/cdn/foxy-email-template-card.js +1 -1
  43. package/dist/cdn/foxy-email-template-form.js +1 -1
  44. package/dist/cdn/foxy-error-entry-card.js +1 -1
  45. package/dist/cdn/foxy-experimental-add-to-cart-builder.js +1 -1
  46. package/dist/cdn/foxy-filter-attribute-card.js +1 -1
  47. package/dist/cdn/foxy-filter-attribute-form.js +1 -1
  48. package/dist/cdn/foxy-form-dialog.js +1 -1
  49. package/dist/cdn/foxy-generate-codes-form.js +1 -1
  50. package/dist/cdn/foxy-gift-card-card.js +1 -1
  51. package/dist/cdn/foxy-gift-card-code-card.js +1 -1
  52. package/dist/cdn/foxy-gift-card-code-form.js +1 -1
  53. package/dist/cdn/foxy-gift-card-code-log-card.js +1 -1
  54. package/dist/cdn/foxy-gift-card-codes-form.js +1 -1
  55. package/dist/cdn/foxy-gift-card-form.js +1 -1
  56. package/dist/cdn/foxy-i18n-editor.js +1 -1
  57. package/dist/cdn/foxy-i18n.js +1 -1
  58. package/dist/cdn/foxy-integration-card.js +1 -1
  59. package/dist/cdn/foxy-integration-form.js +1 -1
  60. package/dist/cdn/foxy-item-card.js +1 -1
  61. package/dist/cdn/foxy-item-category-card.js +1 -1
  62. package/dist/cdn/foxy-item-category-form.js +1 -1
  63. package/dist/cdn/foxy-item-form.js +1 -1
  64. package/dist/cdn/foxy-item-option-card.js +1 -1
  65. package/dist/cdn/foxy-item-option-form.js +1 -1
  66. package/dist/cdn/foxy-items-form.js +1 -1
  67. package/dist/cdn/foxy-native-integration-card.js +1 -1
  68. package/dist/cdn/foxy-native-integration-form.js +1 -1
  69. package/dist/cdn/foxy-pagination.js +1 -1
  70. package/dist/cdn/foxy-passkey-card.js +1 -1
  71. package/dist/cdn/foxy-passkey-form.js +1 -1
  72. package/dist/cdn/foxy-payment-card-embed.js +1 -1
  73. package/dist/cdn/foxy-payment-card.js +1 -1
  74. package/dist/cdn/foxy-payment-method-card.js +1 -1
  75. package/dist/cdn/foxy-payments-api-fraud-protection-card.js +1 -1
  76. package/dist/cdn/foxy-payments-api-fraud-protection-form.js +1 -1
  77. package/dist/cdn/foxy-payments-api-payment-method-card.js +1 -1
  78. package/dist/cdn/foxy-payments-api-payment-method-form.js +1 -1
  79. package/dist/cdn/foxy-payments-api-payment-preset-card.js +1 -1
  80. package/dist/cdn/foxy-payments-api-payment-preset-form.js +1 -1
  81. package/dist/cdn/foxy-query-builder.js +1 -1
  82. package/dist/cdn/foxy-report-form.js +1 -1
  83. package/dist/cdn/foxy-reports-table.js +5 -5
  84. package/dist/cdn/foxy-shipment-card.js +1 -1
  85. package/dist/cdn/foxy-shipping-container-card.js +1 -1
  86. package/dist/cdn/foxy-shipping-drop-type-card.js +1 -1
  87. package/dist/cdn/foxy-shipping-method-card.js +1 -1
  88. package/dist/cdn/foxy-shipping-service-card.js +1 -1
  89. package/dist/cdn/foxy-sign-in-form.js +1 -1
  90. package/dist/cdn/foxy-spinner.js +2 -2
  91. package/dist/cdn/foxy-store-card.js +1 -1
  92. package/dist/cdn/foxy-store-form.js +1 -1
  93. package/dist/cdn/foxy-store-shipping-method-form.js +1 -1
  94. package/dist/cdn/foxy-subscription-card.js +1 -1
  95. package/dist/cdn/foxy-subscription-form.js +1 -1
  96. package/dist/cdn/foxy-subscription-settings-form.js +1 -1
  97. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  98. package/dist/cdn/foxy-table.js +1 -1
  99. package/dist/cdn/foxy-tax-card.js +1 -1
  100. package/dist/cdn/foxy-tax-form.js +1 -1
  101. package/dist/cdn/foxy-template-config-form.js +1 -1
  102. package/dist/cdn/foxy-template-form.js +1 -1
  103. package/dist/cdn/foxy-template-set-card.js +1 -1
  104. package/dist/cdn/foxy-template-set-form.js +1 -1
  105. package/dist/cdn/foxy-transaction-card.js +1 -1
  106. package/dist/cdn/foxy-transaction.js +1 -1
  107. package/dist/cdn/foxy-transactions-table.js +6 -6
  108. package/dist/cdn/foxy-update-payment-method-form.js +1 -1
  109. package/dist/cdn/foxy-user-card.js +1 -1
  110. package/dist/cdn/foxy-user-form.js +1 -1
  111. package/dist/cdn/foxy-user-invitation-card.js +1 -1
  112. package/dist/cdn/foxy-user-invitation-form.js +1 -1
  113. package/dist/cdn/foxy-users-table.js +1 -1
  114. package/dist/cdn/foxy-webhook-card.js +1 -1
  115. package/dist/cdn/foxy-webhook-form.js +1 -1
  116. package/dist/cdn/foxy-webhook-log-card.js +1 -1
  117. package/dist/cdn/foxy-webhook-status-card.js +1 -1
  118. package/dist/cdn/{shared-a477b90e.js → shared-06ea7911.js} +1 -1
  119. package/dist/cdn/{shared-8697a27e.js → shared-0a3456e2.js} +1 -1
  120. package/dist/cdn/{shared-29b0ef56.js → shared-0bd12eb3.js} +1 -1
  121. package/dist/cdn/{shared-f7db49fe.js → shared-145cbef6.js} +1 -1
  122. package/dist/cdn/{shared-c19d73fe.js → shared-1f61d033.js} +1 -1
  123. package/dist/cdn/{shared-ef4d09da.js → shared-20a022b2.js} +1 -1
  124. package/dist/cdn/{shared-c003fbf3.js → shared-230e734d.js} +1 -1
  125. package/dist/cdn/{shared-379b6e13.js → shared-2380c9d2.js} +1 -1
  126. package/dist/cdn/{shared-2931ccbe.js → shared-2771c166.js} +1 -1
  127. package/dist/cdn/{shared-1522e7b0.js → shared-3530c8a0.js} +3 -3
  128. package/dist/cdn/{shared-375c365e.js → shared-3cccbb5d.js} +1 -1
  129. package/dist/cdn/{shared-b82e43e5.js → shared-4209dfe0.js} +1 -1
  130. package/dist/cdn/{shared-43c39c6f.js → shared-49229e84.js} +1 -1
  131. package/dist/cdn/{shared-0ae48c81.js → shared-4bb3e49d.js} +1 -1
  132. package/dist/cdn/{shared-922db328.js → shared-4ee1334c.js} +1 -1
  133. package/dist/cdn/{shared-69943b4f.js → shared-54d27623.js} +1 -1
  134. package/dist/cdn/shared-5946ce36.js +1 -0
  135. package/dist/cdn/{shared-2fe84d72.js → shared-604bd64e.js} +1 -1
  136. package/dist/cdn/{shared-1f659198.js → shared-659c8a65.js} +1 -1
  137. package/dist/cdn/{shared-cdaf66d3.js → shared-6ce6abaa.js} +1 -1
  138. package/dist/cdn/{shared-3ad093b5.js → shared-745dc4d4.js} +1 -1
  139. package/dist/cdn/{shared-0179fbaa.js → shared-77768847.js} +1 -1
  140. package/dist/cdn/{shared-1cd9967e.js → shared-7a590074.js} +1 -1
  141. package/dist/cdn/{shared-3c0dcb9e.js → shared-7cea4c84.js} +1 -1
  142. package/dist/cdn/{shared-58c0c5cc.js → shared-821e79ec.js} +1 -1
  143. package/dist/cdn/shared-86a5f951.js +1 -0
  144. package/dist/cdn/{shared-dc383217.js → shared-87a1acfc.js} +1 -1
  145. package/dist/cdn/{shared-7f14ea13.js → shared-8c7c4256.js} +2 -2
  146. package/dist/cdn/{shared-6ce9d926.js → shared-8d72d808.js} +1 -1
  147. package/dist/cdn/{shared-7eefc244.js → shared-8edadb80.js} +1 -1
  148. package/dist/cdn/shared-8fa71a41.js +1 -0
  149. package/dist/cdn/{shared-d298bb95.js → shared-9159476e.js} +1 -1
  150. package/dist/cdn/{shared-499c03b8.js → shared-9ecf3054.js} +1 -1
  151. package/dist/cdn/shared-a224362a.js +1 -0
  152. package/dist/cdn/{shared-ed3fc85e.js → shared-a5d2debf.js} +1 -1
  153. package/dist/cdn/{shared-34cbd863.js → shared-a92f5e58.js} +1 -1
  154. package/dist/cdn/{shared-3c7e55e4.js → shared-a969a617.js} +1 -1
  155. package/dist/cdn/{shared-a146c6a5.js → shared-adb9ded3.js} +1 -1
  156. package/dist/cdn/{shared-c71fb90f.js → shared-b34d37c9.js} +1 -1
  157. package/dist/cdn/{shared-535d1ec6.js → shared-b68bcfd9.js} +1 -1
  158. package/dist/cdn/{shared-8ae33bf4.js → shared-bb1b557c.js} +1 -1
  159. package/dist/cdn/{shared-504d2acb.js → shared-bd49e2a9.js} +3 -3
  160. package/dist/cdn/{shared-a0570012.js → shared-c1485ee6.js} +1 -1
  161. package/dist/cdn/{shared-cfea6000.js → shared-c2d29bc4.js} +1 -1
  162. package/dist/cdn/{shared-e69c94bd.js → shared-c3244bea.js} +1 -1
  163. package/dist/cdn/{shared-2a941373.js → shared-c6571ff9.js} +1 -1
  164. package/dist/cdn/{shared-12ea5def.js → shared-cbc9e356.js} +1 -1
  165. package/dist/cdn/{shared-619235ab.js → shared-cc4ba2a7.js} +1 -1
  166. package/dist/cdn/{shared-65763e6f.js → shared-ccb20339.js} +1 -1
  167. package/dist/cdn/{shared-acbcad2e.js → shared-ce959545.js} +1 -1
  168. package/dist/cdn/{shared-44209364.js → shared-d5675aee.js} +1 -1
  169. package/dist/cdn/{shared-70bcd6ae.js → shared-d59189e6.js} +1 -1
  170. package/dist/cdn/{shared-14209e60.js → shared-da05b8be.js} +1 -1
  171. package/dist/cdn/{shared-5988dd30.js → shared-de1f3b1b.js} +1 -1
  172. package/dist/cdn/shared-e00ce626.js +1 -0
  173. package/dist/cdn/{shared-a4a847e4.js → shared-e106a219.js} +1 -1
  174. package/dist/cdn/{shared-3f381f99.js → shared-e4a6f686.js} +1 -1
  175. package/dist/cdn/{shared-5231970e.js → shared-f31a41d9.js} +1 -1
  176. package/dist/cdn/{shared-58a50b35.js → shared-f4c2858b.js} +1 -1
  177. package/dist/cdn/{shared-62a913ef.js → shared-f5988321.js} +1 -1
  178. package/dist/cdn/{shared-58f1f368.js → shared-f982fceb.js} +1 -1
  179. package/dist/cdn/{shared-30829c7f.js → shared-fad76cdd.js} +1 -1
  180. package/dist/cdn/{shared-174ae849.js → shared-fccf4b6a.js} +1 -1
  181. package/dist/cdn/{shared-54031a26.js → shared-fd1aad37.js} +2 -2
  182. package/dist/cdn/{shared-fe56bcdb.js → shared-fdd1f5f8.js} +1 -1
  183. package/dist/cdn/{shared-5c6a00e9.js → shared-ff136a00.js} +1 -1
  184. package/dist/cdn/translations/admin-subscription-form/en.json +64 -80
  185. package/dist/cdn/translations/api-browser/en.json +4 -5
  186. package/dist/cdn/translations/cart-form/en.json +52 -65
  187. package/dist/cdn/translations/coupon-code-form/en.json +4 -5
  188. package/dist/cdn/translations/coupon-form/en.json +16 -20
  189. package/dist/cdn/translations/customer/en.json +16 -20
  190. package/dist/cdn/translations/customer-portal/de.json +8 -10
  191. package/dist/cdn/translations/customer-portal/en.json +8 -10
  192. package/dist/cdn/translations/customer-portal/es.json +8 -10
  193. package/dist/cdn/translations/customer-portal/fr.json +8 -10
  194. package/dist/cdn/translations/customer-portal/nl.json +8 -10
  195. package/dist/cdn/translations/customer-portal/pl.json +8 -10
  196. package/dist/cdn/translations/customer-portal/sv.json +8 -10
  197. package/dist/cdn/translations/customer-portal/zh-HK.json +8 -10
  198. package/dist/cdn/translations/customer-portal-settings-form/en.json +8 -10
  199. package/dist/cdn/translations/experimental-add-to-cart-builder/en.json +16 -20
  200. package/dist/cdn/translations/gift-card-code-form/en.json +8 -10
  201. package/dist/cdn/translations/gift-card-form/en.json +20 -25
  202. package/dist/cdn/translations/item-category-form/en.json +8 -10
  203. package/dist/cdn/translations/item-form/en.json +20 -25
  204. package/dist/cdn/translations/native-integration-form/en.json +8 -10
  205. package/dist/cdn/translations/pagination/en.json +5 -6
  206. package/dist/cdn/translations/payment-method-card/en.json +4 -5
  207. package/dist/cdn/translations/store-shipping-method-form/en.json +16 -20
  208. package/dist/cdn/translations/subscription-form/en.json +12 -15
  209. package/dist/cdn/translations/tax-form/en.json +4 -5
  210. package/dist/cdn/translations/template-set-form/en.json +4 -5
  211. package/dist/cdn/translations/transaction/en.json +56 -70
  212. package/dist/cdn/translations/update-payment-method-form/en.json +4 -5
  213. package/dist/cdn/translations/webhook-form/en.json +8 -10
  214. package/dist/elements/public/Pagination/Pagination.d.ts +12 -5
  215. package/dist/elements/public/Pagination/Pagination.js +191 -77
  216. package/dist/elements/public/Pagination/Pagination.js.map +1 -1
  217. package/dist/elements/public/Pagination/index.d.ts +2 -2
  218. package/dist/elements/public/Pagination/index.js +2 -2
  219. package/dist/elements/public/Pagination/index.js.map +1 -1
  220. package/dist/mixins/themeable.js +22 -11
  221. package/dist/mixins/themeable.js.map +1 -1
  222. package/package.json +1 -1
  223. package/dist/cdn/shared-14177287.js +0 -1
  224. package/dist/cdn/shared-1d2c7978.js +0 -1
  225. package/dist/cdn/shared-58bb3dda.js +0 -1
  226. package/dist/cdn/shared-f00ebf92.js +0 -1
@@ -1,14 +1,12 @@
1
- import { LitElement, html } from 'lit-element';
1
+ import { LitElement, html, css } from 'lit-element';
2
2
  import { ConfigurableMixin } from "../../../mixins/configurable.js";
3
- import { NucleonElement } from "../NucleonElement/NucleonElement.js";
4
- import { ResponsiveMixin } from "../../../mixins/responsive.js";
5
- import { ThemeableMixin } from "../../../mixins/themeable.js";
6
3
  import { TranslatableMixin } from "../../../mixins/translatable.js";
7
- import { classMap } from "../../../utils/class-map.js";
8
- import get from 'lodash-es/get';
9
4
  import { InferrableMixin } from "../../../mixins/inferrable.js";
5
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
6
+ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
7
+ import get from 'lodash-es/get';
10
8
  const NS = 'pagination';
11
- const Base = ResponsiveMixin(ConfigurableMixin(ThemeableMixin(TranslatableMixin(InferrableMixin(LitElement), NS))));
9
+ const Base = ConfigurableMixin(ThemeableMixin(TranslatableMixin(InferrableMixin(LitElement), NS)));
12
10
  /**
13
11
  * Helper element that adds pagination controls to elements
14
12
  * representing Hypermedia API collection pages. Works with NucleonElement instances only.
@@ -27,125 +25,241 @@ const Base = ResponsiveMixin(ConfigurableMixin(ThemeableMixin(TranslatableMixin(
27
25
  export class Pagination extends Base {
28
26
  constructor() {
29
27
  super(...arguments);
28
+ this.__handlePageElementUpdate = () => this.requestUpdate();
29
+ this.__handleScrollAndResize = () => {
30
+ var _a;
31
+ (_a = this.renderRoot.querySelector('dialog')) === null || _a === void 0 ? void 0 : _a.close();
32
+ };
30
33
  this.__pageElement = null;
31
- this.__rerender = () => this.requestUpdate();
34
+ this.__customPage = 1;
32
35
  this.__first = '';
36
+ this.__limit = 20;
37
+ this.__page = 1;
33
38
  }
34
39
  static get properties() {
35
40
  return {
36
41
  ...super.properties,
37
42
  first: { type: String },
38
43
  __pageElement: { attribute: false },
44
+ __customPage: { attribute: false },
45
+ __limit: { attribute: false },
46
+ __page: { attribute: false },
39
47
  };
40
48
  }
41
- /** URL of the first page of the colletion. */
49
+ static get styles() {
50
+ return [
51
+ super.styles,
52
+ css `dialog{
53
+ --position-bottom:translate(-100%, var(--lumo-space-m));
54
+ --position-top:translate(calc(-100% - 1px), calc(-100% - var(--lumo-space-m) - 1px));
55
+ border-radius:calc(var(--lumo-border-radius-m) + 1px);
56
+ }
57
+
58
+ dialog::backdrop{
59
+ background:transparent;
60
+ }
61
+ `,
62
+ ];
63
+ }
64
+ /** URL of the first page of the collection. */
42
65
  get first() {
43
66
  return this.__first;
44
67
  }
45
68
  set first(newValue) {
69
+ var _a;
46
70
  this.__first = newValue;
47
- if (this.__pageElement)
48
- this.__pageElement.href = newValue;
71
+ this.__page = 1;
72
+ try {
73
+ const url = new URL(newValue);
74
+ const limit = parseInt((_a = url.searchParams.get('limit')) !== null && _a !== void 0 ? _a : '');
75
+ this.__limit = Number.isNaN(limit) || limit < 1 || limit > 200 ? 20 : limit;
76
+ }
77
+ catch (_b) {
78
+ this.__limit = 20;
79
+ }
49
80
  }
50
81
  connectedCallback() {
51
82
  super.connectedCallback();
52
83
  this.__connectPageElement();
84
+ addEventListener('scroll', this.__handleScrollAndResize);
85
+ addEventListener('resize', this.__handleScrollAndResize);
53
86
  }
54
87
  render() {
55
88
  var _a;
56
89
  const data = (_a = this.__pageElement) === null || _a === void 0 ? void 0 : _a.data;
57
- const { disabled, lang, ns } = this;
58
90
  const returnedItemsValue = Number(get(data, 'returned_items'));
59
91
  const returnedItems = Number.isNaN(returnedItemsValue) ? 0 : returnedItemsValue;
60
92
  const totalValue = Number(get(data, 'total_items'));
61
93
  const total = Number.isNaN(totalValue) ? 0 : totalValue;
94
+ const limitOptions = [20, 50, 100, 150, 200];
95
+ const maxPageLinks = 5;
62
96
  const offsetValue = Number(get(data, 'offset'));
63
97
  const offset = Number.isNaN(offsetValue) ? 0 : offsetValue;
64
- const canGoBack = !disabled && offset > 0;
65
- const canGoForth = !disabled && offset + returnedItems < total;
66
- const labelClass = 'sr-only sm-not-sr-only';
67
- const from = offset + 1;
68
- const to = offset + returnedItems;
98
+ const pages = total && returnedItems ? Math.ceil(total / returnedItems) : 0;
69
99
  return html `
70
100
  <slot @slotchange=${this.__connectPageElement}></slot>
71
101
 
72
102
  ${offset > 0 || offset + returnedItems < total
73
103
  ? html `
74
- <div
75
- class="mt-s grid gap-s items-center -mx-xs"
76
- style="grid-template-columns: 1fr auto 1fr"
77
- >
78
- <div class="flex items-center space-x-s">
79
- <vaadin-button
80
- data-testid="first"
81
- theme="contrast tertiary-inline"
82
- ?disabled=${!canGoBack}
83
- @click=${() => this.__goTo('first')}
84
- >
85
- <iron-icon class="icon-inline text-s" icon="icons:first-page"></iron-icon>
86
- <foxy-i18n class=${labelClass} lang=${lang} key="first" ns=${ns}></foxy-i18n>
87
- </vaadin-button>
104
+ <div class="flex items-center gap-xs mt-s">
105
+ <label class="text-tertiary" for="limit">
106
+ <foxy-i18n infer="" key="per_page"></foxy-i18n>
107
+ </label>
88
108
 
89
- <vaadin-button
90
- data-testid="prev"
91
- theme="contrast tertiary-inline"
92
- ?disabled=${!canGoBack}
93
- @click=${() => this.__goTo('prev')}
94
- >
95
- <iron-icon class="icon-inline text-s" icon="icons:chevron-left"></iron-icon>
96
- <foxy-i18n class=${labelClass} lang=${lang} key="previous" ns=${ns}></foxy-i18n>
97
- </vaadin-button>
98
- </div>
99
-
100
- <foxy-i18n
101
- options=${JSON.stringify({ total, from, to })}
102
- class=${classMap({
103
- 'flex-1 text-xs text-tertiary text-center leading-xs truncate': true,
104
- 'opacity-0': !data,
105
- })}
106
- lang=${lang}
107
- key="pagination"
108
- ns=${ns}
109
+ <select
110
+ class="cursor-pointer appearance-none bg-transparent rounded-s font-medium px-xs hover-underline focus-outline-none focus-ring-2 focus-ring-primary-50"
111
+ id="limit"
112
+ ?disabled=${this.disabled}
113
+ @change=${(evt) => {
114
+ this.__limit = parseInt(evt.currentTarget.value);
115
+ this.__page = 1;
116
+ }}
109
117
  >
110
- </foxy-i18n>
118
+ ${limitOptions.includes(this.__limit)
119
+ ? ''
120
+ : html `<option value=${this.__limit}>${this.__limit}</option>`}
121
+ ${limitOptions.map(option => html `<option value=${option}>${option}</option>`)}
122
+ </select>
111
123
 
112
- <div class="flex items-center justify-end space-x-s">
113
- <vaadin-button
114
- data-testid="next"
115
- theme="contrast tertiary-inline"
116
- ?disabled=${!canGoForth}
117
- @click=${() => this.__goTo('next')}
118
- >
119
- <foxy-i18n class=${labelClass} lang=${lang} key="next" ns=${ns}></foxy-i18n>
120
- <iron-icon class="icon-inline text-s" icon="icons:chevron-right"></iron-icon>
121
- </vaadin-button>
124
+ <foxy-i18n class="text-tertiary ml-auto" infer="" key="jump_to"></foxy-i18n>
122
125
 
123
- <vaadin-button
124
- data-testid="last"
125
- theme="contrast tertiary-inline"
126
- ?disabled=${!canGoForth}
127
- @click=${() => this.__goTo('last')}
128
- >
129
- <foxy-i18n class=${labelClass} lang=${lang} key="last" ns=${ns}></foxy-i18n>
130
- <iron-icon class="icon-inline text-s" icon="icons:last-page"></iron-icon>
131
- </vaadin-button>
132
- </div>
126
+ ${new Array(pages).fill('').map((_, pageIndex) => {
127
+ if (!(pageIndex < maxPageLinks + 1 || pageIndex === pages - 1))
128
+ return;
129
+ const isEllipsis = pageIndex === maxPageLinks && pages > maxPageLinks + 2;
130
+ const isCurrentPage = this.__page === pageIndex + 1;
131
+ return html `
132
+ <vaadin-button
133
+ data-testclass="page-link"
134
+ theme="tertiary-inline contrast"
135
+ class="relative px-xs ${pageIndex === pages - 1 ? '-mr-xs' : ''}"
136
+ ?disabled=${this.disabled || (isCurrentPage && !isEllipsis)}
137
+ @click=${(evt) => {
138
+ if (isEllipsis) {
139
+ const dialog = this.__dialog;
140
+ dialog.showModal();
141
+ const elementRight = this.getBoundingClientRect().right;
142
+ dialog.style.margin = `${evt.clientY}px auto auto ${elementRight}px`;
143
+ const dialogBottom = dialog.getBoundingClientRect().bottom;
144
+ const dialogPosition = dialogBottom > innerHeight ? 'top' : 'bottom';
145
+ dialog.style.transform = `var(--position-${dialogPosition})`;
146
+ }
147
+ else {
148
+ this.__page = pageIndex + 1;
149
+ }
150
+ }}
151
+ >
152
+ ${isEllipsis
153
+ ? this.__page > maxPageLinks && this.__page !== pages
154
+ ? html `
155
+ <span
156
+ class="inline-block transform origin-top scale-50"
157
+ style="--tw-translate-y: 0.1em;"
158
+ >
159
+ ${this.__page}
160
+ </span>
161
+ <span class="absolute inset-x-0 bottom-0">...</span>
162
+ `
163
+ : '...'
164
+ : pageIndex + 1}
165
+ </vaadin-button>
166
+ `;
167
+ })}
133
168
  </div>
134
169
  `
135
170
  : ''}
171
+
172
+ <dialog
173
+ class="p-0 shadow-m bg-transparent"
174
+ @click=${(evt) => {
175
+ const dialog = evt.currentTarget;
176
+ const dialogBox = dialog.getBoundingClientRect();
177
+ const clickedInsideDialog = dialogBox.top <= evt.clientY &&
178
+ evt.clientY <= dialogBox.top + dialogBox.height &&
179
+ dialogBox.left <= evt.clientX &&
180
+ evt.clientX <= dialogBox.left + dialogBox.width;
181
+ if (!clickedInsideDialog)
182
+ dialog.close();
183
+ }}
184
+ >
185
+ <foxy-internal-summary-control
186
+ helper-text=""
187
+ label=""
188
+ infer=""
189
+ class="bg-base rounded border border-base"
190
+ style="width: 18rem"
191
+ >
192
+ <foxy-internal-number-control
193
+ placeholder="1"
194
+ helper-text=""
195
+ layout="summary-item"
196
+ label=${this.t('page_number')}
197
+ infer=""
198
+ step="1"
199
+ min="1"
200
+ max=${pages}
201
+ .getValue=${() => this.__customPage}
202
+ .setValue=${(value) => (this.__customPage = value || 1)}
203
+ @keydown=${(evt) => {
204
+ var _a;
205
+ if (evt.key === 'Enter') {
206
+ this.__page = this.__customPage;
207
+ (_a = this.__dialog) === null || _a === void 0 ? void 0 : _a.close();
208
+ }
209
+ }}
210
+ >
211
+ </foxy-internal-number-control>
212
+ <div>
213
+ <vaadin-button
214
+ theme="tertiary-inline"
215
+ ?disabled=${this.disabled}
216
+ @click=${() => {
217
+ var _a;
218
+ this.__page = this.__customPage;
219
+ (_a = this.__dialog) === null || _a === void 0 ? void 0 : _a.close();
220
+ }}
221
+ >
222
+ <foxy-i18n infer="" key="jump"></foxy-i18n>
223
+ </vaadin-button>
224
+ </div>
225
+ </foxy-internal-summary-control>
226
+ </dialog>
136
227
  `;
137
228
  }
229
+ updated(changes) {
230
+ super.updated(changes);
231
+ const triggerProps = ['__first', '__limit', '__page'];
232
+ if (!triggerProps.some(prop => changes.has(prop)))
233
+ return;
234
+ try {
235
+ const url = new URL(this.__first);
236
+ const limit = this.__limit;
237
+ const offset = this.__limit * (this.__page - 1);
238
+ url.searchParams.delete('limit');
239
+ url.searchParams.delete('offset');
240
+ if (limit)
241
+ url.searchParams.set('limit', limit.toString());
242
+ if (offset)
243
+ url.searchParams.set('offset', offset.toString());
244
+ if (this.__pageElement)
245
+ this.__pageElement.href = url.toString();
246
+ }
247
+ catch (_a) {
248
+ //
249
+ }
250
+ }
138
251
  disconnectedCallback() {
139
252
  super.disconnectedCallback();
140
253
  this.__disconnectPageElement();
254
+ removeEventListener('scroll', this.__handleScrollAndResize);
255
+ removeEventListener('resize', this.__handleScrollAndResize);
141
256
  }
142
- __goTo(rel) {
143
- var _a;
144
- this.__pageElement.href = String(get((_a = this.__pageElement) === null || _a === void 0 ? void 0 : _a.data, `_links.${rel}.href`));
257
+ get __dialog() {
258
+ return this.renderRoot.querySelector('dialog');
145
259
  }
146
260
  __disconnectPageElement() {
147
261
  var _a;
148
- (_a = this.__pageElement) === null || _a === void 0 ? void 0 : _a.removeEventListener('update', this.__rerender);
262
+ (_a = this.__pageElement) === null || _a === void 0 ? void 0 : _a.removeEventListener('update', this.__handlePageElementUpdate);
149
263
  this.__pageElement = null;
150
264
  }
151
265
  __connectPageElement() {
@@ -156,7 +270,7 @@ export class Pagination extends Base {
156
270
  const firstNucleonElement = assignedElements.find(el => el instanceof NucleonElement);
157
271
  if (firstNucleonElement) {
158
272
  this.__pageElement = firstNucleonElement;
159
- this.__pageElement.addEventListener('update', this.__rerender);
273
+ this.__pageElement.addEventListener('update', this.__handlePageElementUpdate);
160
274
  this.__pageElement.href = this.first;
161
275
  }
162
276
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../../../src/elements/public/Pagination/Pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwC,IAAI,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,cAAc,EAAE,4CAAyC;AAClE,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAC7D,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AACpD,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAE7D,MAAM,EAAE,GAAG,YAAY,CAAC;AACxB,MAAM,IAAI,GAAG,eAAe,CAC1B,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CACtF,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,UAAW,SAAQ,IAAI;IAApC;;QASU,kBAAa,GAA+B,IAAI,CAAC;QAEjD,eAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAExC,YAAO,GAAG,EAAE,CAAC;IAwIvB,CAAC;IApJC,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACvB,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SACpC,CAAC;IACJ,CAAC;IAQD,8CAA8C;IAC9C,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,QAAgB;QACxB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,QAAQ,CAAC;IAC7D,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM;;QACJ,MAAM,IAAI,SAAG,IAAI,CAAC,aAAa,0CAAE,IAAI,CAAC;QACtC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAEpC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAEhF,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAExD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAE3D,MAAM,SAAS,GAAG,CAAC,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,CAAC,QAAQ,IAAI,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC;QAE/D,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,GAAG,aAAa,CAAC;QAElC,OAAO,IAAI,CAAA;0BACW,IAAI,CAAC,oBAAoB;;QAE3C,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,aAAa,GAAG,KAAK;YAC5C,CAAC,CAAC,IAAI,CAAA;;;;;;;;;8BASgB,CAAC,SAAS;2BACb,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;;qCAGhB,UAAU,SAAS,IAAI,mBAAmB,EAAE;;;;;;8BAMnD,CAAC,SAAS;2BACb,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;;;qCAGf,UAAU,SAAS,IAAI,sBAAsB,EAAE;;;;;0BAK1D,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;wBACrC,QAAQ,CAAC;gBACf,8DAA8D,EAAE,IAAI;gBACpE,WAAW,EAAE,CAAC,IAAI;aACnB,CAAC;uBACK,IAAI;;qBAEN,EAAE;;;;;;;;8BAQO,CAAC,UAAU;2BACd,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;;qCAEf,UAAU,SAAS,IAAI,kBAAkB,EAAE;;;;;;;8BAOlD,CAAC,UAAU;2BACd,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;;qCAEf,UAAU,SAAS,IAAI,kBAAkB,EAAE;;;;;WAKrE;YACH,CAAC,CAAC,EAAE;KACP,CAAC;IACJ,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAEO,MAAM,CAAC,GAAW;;QACxB,IAAI,CAAC,aAAc,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,OAAC,IAAI,CAAC,aAAa,0CAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IACzF,CAAC;IAEO,uBAAuB;;QAC7B,MAAA,IAAI,CAAC,aAAa,0CAAE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE;QACnE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEO,oBAAoB;;QAC1B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAkB,MAAM,CAAC,CAAC;QACpE,MAAM,gBAAgB,SAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,qCAAM,EAAE,CAAC;QACxD,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,cAAc,CAEvE,CAAC;QAEd,IAAI,mBAAmB,EAAE;YACvB,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;SACtC;IACH,CAAC;CACF","sourcesContent":["import { LitElement, PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { ResponsiveMixin } from '../../../mixins/responsive';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\nimport get from 'lodash-es/get';\nimport { InferrableMixin } from '../../../mixins/inferrable';\n\nconst NS = 'pagination';\nconst Base = ResponsiveMixin(\n ConfigurableMixin(ThemeableMixin(TranslatableMixin(InferrableMixin(LitElement), NS)))\n);\n\n/**\n * Helper element that adds pagination controls to elements\n * representing Hypermedia API collection pages. Works with NucleonElement instances only.\n * Page element **MUST** be a direct descendant of `foxy-pagination`.\n *\n * @example\n * ```html\n * <foxy-pagination first=\"https://demo.api/hapi/customers?limit=3\">\n * <foxy-customers-table></foxy-customers-table>\n * </foxy-pagination>\n * ```\n *\n * @element foxy-pagination\n * @since 1.15.0\n */\nexport class Pagination extends Base {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n first: { type: String },\n __pageElement: { attribute: false },\n };\n }\n\n private __pageElement: NucleonElement<any> | null = null;\n\n private __rerender = () => this.requestUpdate();\n\n private __first = '';\n\n /** URL of the first page of the colletion. */\n get first(): string {\n return this.__first;\n }\n\n set first(newValue: string) {\n this.__first = newValue;\n if (this.__pageElement) this.__pageElement.href = newValue;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.__connectPageElement();\n }\n\n render(): TemplateResult {\n const data = this.__pageElement?.data;\n const { disabled, lang, ns } = this;\n\n const returnedItemsValue = Number(get(data, 'returned_items'));\n const returnedItems = Number.isNaN(returnedItemsValue) ? 0 : returnedItemsValue;\n\n const totalValue = Number(get(data, 'total_items'));\n const total = Number.isNaN(totalValue) ? 0 : totalValue;\n\n const offsetValue = Number(get(data, 'offset'));\n const offset = Number.isNaN(offsetValue) ? 0 : offsetValue;\n\n const canGoBack = !disabled && offset > 0;\n const canGoForth = !disabled && offset + returnedItems < total;\n\n const labelClass = 'sr-only sm-not-sr-only';\n const from = offset + 1;\n const to = offset + returnedItems;\n\n return html`\n <slot @slotchange=${this.__connectPageElement}></slot>\n\n ${offset > 0 || offset + returnedItems < total\n ? html`\n <div\n class=\"mt-s grid gap-s items-center -mx-xs\"\n style=\"grid-template-columns: 1fr auto 1fr\"\n >\n <div class=\"flex items-center space-x-s\">\n <vaadin-button\n data-testid=\"first\"\n theme=\"contrast tertiary-inline\"\n ?disabled=${!canGoBack}\n @click=${() => this.__goTo('first')}\n >\n <iron-icon class=\"icon-inline text-s\" icon=\"icons:first-page\"></iron-icon>\n <foxy-i18n class=${labelClass} lang=${lang} key=\"first\" ns=${ns}></foxy-i18n>\n </vaadin-button>\n\n <vaadin-button\n data-testid=\"prev\"\n theme=\"contrast tertiary-inline\"\n ?disabled=${!canGoBack}\n @click=${() => this.__goTo('prev')}\n >\n <iron-icon class=\"icon-inline text-s\" icon=\"icons:chevron-left\"></iron-icon>\n <foxy-i18n class=${labelClass} lang=${lang} key=\"previous\" ns=${ns}></foxy-i18n>\n </vaadin-button>\n </div>\n\n <foxy-i18n\n options=${JSON.stringify({ total, from, to })}\n class=${classMap({\n 'flex-1 text-xs text-tertiary text-center leading-xs truncate': true,\n 'opacity-0': !data,\n })}\n lang=${lang}\n key=\"pagination\"\n ns=${ns}\n >\n </foxy-i18n>\n\n <div class=\"flex items-center justify-end space-x-s\">\n <vaadin-button\n data-testid=\"next\"\n theme=\"contrast tertiary-inline\"\n ?disabled=${!canGoForth}\n @click=${() => this.__goTo('next')}\n >\n <foxy-i18n class=${labelClass} lang=${lang} key=\"next\" ns=${ns}></foxy-i18n>\n <iron-icon class=\"icon-inline text-s\" icon=\"icons:chevron-right\"></iron-icon>\n </vaadin-button>\n\n <vaadin-button\n data-testid=\"last\"\n theme=\"contrast tertiary-inline\"\n ?disabled=${!canGoForth}\n @click=${() => this.__goTo('last')}\n >\n <foxy-i18n class=${labelClass} lang=${lang} key=\"last\" ns=${ns}></foxy-i18n>\n <iron-icon class=\"icon-inline text-s\" icon=\"icons:last-page\"></iron-icon>\n </vaadin-button>\n </div>\n </div>\n `\n : ''}\n `;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.__disconnectPageElement();\n }\n\n private __goTo(rel: string): void {\n this.__pageElement!.href = String(get(this.__pageElement?.data, `_links.${rel}.href`));\n }\n\n private __disconnectPageElement() {\n this.__pageElement?.removeEventListener('update', this.__rerender);\n this.__pageElement = null;\n }\n\n private __connectPageElement() {\n this.__disconnectPageElement();\n\n const slot = this.renderRoot.querySelector<HTMLSlotElement>('slot');\n const assignedElements = slot?.assignedElements() ?? [];\n const firstNucleonElement = assignedElements.find(el => el instanceof NucleonElement) as\n | NucleonElement<any>\n | undefined;\n\n if (firstNucleonElement) {\n this.__pageElement = firstNucleonElement;\n this.__pageElement.addEventListener('update', this.__rerender);\n this.__pageElement.href = this.first;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../../../src/elements/public/Pagination/Pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PropertyDeclarations, TemplateResult, CSSResultArray } from 'lit-element';\n\nimport { LitElement, html, css } from 'lit-element';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { InferrableMixin } from '../../../mixins/inferrable';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\n\nimport get from 'lodash-es/get';\n\nconst NS = 'pagination';\nconst Base = ConfigurableMixin(ThemeableMixin(TranslatableMixin(InferrableMixin(LitElement), NS)));\n\n/**\n * Helper element that adds pagination controls to elements\n * representing Hypermedia API collection pages. Works with NucleonElement instances only.\n * Page element **MUST** be a direct descendant of `foxy-pagination`.\n *\n * @example\n * ```html\n * <foxy-pagination first=\"https://demo.api/hapi/customers?limit=3\">\n * <foxy-customers-table></foxy-customers-table>\n * </foxy-pagination>\n * ```\n *\n * @element foxy-pagination\n * @since 1.15.0\n */\nexport class Pagination extends Base {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n first: { type: String },\n __pageElement: { attribute: false },\n __customPage: { attribute: false },\n __limit: { attribute: false },\n __page: { attribute: false },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n css`\n dialog {\n --position-bottom: translate(-100%, var(--lumo-space-m));\n --position-top: translate(calc(-100% - 1px), calc(-100% - var(--lumo-space-m) - 1px));\n border-radius: calc(var(--lumo-border-radius-m) + 1px);\n }\n\n dialog::backdrop {\n background: transparent;\n }\n `,\n ];\n }\n\n private readonly __handlePageElementUpdate = () => this.requestUpdate();\n\n private readonly __handleScrollAndResize = () => {\n this.renderRoot.querySelector('dialog')?.close();\n };\n\n private __pageElement: NucleonElement<any> | null = null;\n\n private __customPage = 1;\n\n private __first = '';\n\n private __limit = 20;\n\n private __page = 1;\n\n /** URL of the first page of the collection. */\n get first(): string {\n return this.__first;\n }\n\n set first(newValue: string) {\n this.__first = newValue;\n this.__page = 1;\n\n try {\n const url = new URL(newValue);\n const limit = parseInt(url.searchParams.get('limit') ?? '');\n this.__limit = Number.isNaN(limit) || limit < 1 || limit > 200 ? 20 : limit;\n } catch {\n this.__limit = 20;\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.__connectPageElement();\n addEventListener('scroll', this.__handleScrollAndResize);\n addEventListener('resize', this.__handleScrollAndResize);\n }\n\n render(): TemplateResult {\n const data = this.__pageElement?.data;\n\n const returnedItemsValue = Number(get(data, 'returned_items'));\n const returnedItems = Number.isNaN(returnedItemsValue) ? 0 : returnedItemsValue;\n\n const totalValue = Number(get(data, 'total_items'));\n const total = Number.isNaN(totalValue) ? 0 : totalValue;\n\n const limitOptions = [20, 50, 100, 150, 200];\n const maxPageLinks = 5;\n const offsetValue = Number(get(data, 'offset'));\n const offset = Number.isNaN(offsetValue) ? 0 : offsetValue;\n const pages = total && returnedItems ? Math.ceil(total / returnedItems) : 0;\n\n return html`\n <slot @slotchange=${this.__connectPageElement}></slot>\n\n ${offset > 0 || offset + returnedItems < total\n ? html`\n <div class=\"flex items-center gap-xs mt-s\">\n <label class=\"text-tertiary\" for=\"limit\">\n <foxy-i18n infer=\"\" key=\"per_page\"></foxy-i18n>\n </label>\n\n <select\n class=\"cursor-pointer appearance-none bg-transparent rounded-s font-medium px-xs hover-underline focus-outline-none focus-ring-2 focus-ring-primary-50\"\n id=\"limit\"\n ?disabled=${this.disabled}\n @change=${(evt: Event) => {\n this.__limit = parseInt((evt.currentTarget as HTMLSelectElement).value);\n this.__page = 1;\n }}\n >\n ${limitOptions.includes(this.__limit)\n ? ''\n : html`<option value=${this.__limit}>${this.__limit}</option>`}\n ${limitOptions.map(option => html`<option value=${option}>${option}</option>`)}\n </select>\n\n <foxy-i18n class=\"text-tertiary ml-auto\" infer=\"\" key=\"jump_to\"></foxy-i18n>\n\n ${new Array(pages).fill('').map((_, pageIndex) => {\n if (!(pageIndex < maxPageLinks + 1 || pageIndex === pages - 1)) return;\n\n const isEllipsis = pageIndex === maxPageLinks && pages > maxPageLinks + 2;\n const isCurrentPage = this.__page === pageIndex + 1;\n\n return html`\n <vaadin-button\n data-testclass=\"page-link\"\n theme=\"tertiary-inline contrast\"\n class=\"relative px-xs ${pageIndex === pages - 1 ? '-mr-xs' : ''}\"\n ?disabled=${this.disabled || (isCurrentPage && !isEllipsis)}\n @click=${(evt: MouseEvent) => {\n if (isEllipsis) {\n const dialog = this.__dialog as HTMLDialogElement;\n dialog.showModal();\n\n const elementRight = this.getBoundingClientRect().right;\n dialog.style.margin = `${evt.clientY}px auto auto ${elementRight}px`;\n\n const dialogBottom = dialog.getBoundingClientRect().bottom;\n const dialogPosition = dialogBottom > innerHeight ? 'top' : 'bottom';\n dialog.style.transform = `var(--position-${dialogPosition})`;\n } else {\n this.__page = pageIndex + 1;\n }\n }}\n >\n ${isEllipsis\n ? this.__page > maxPageLinks && this.__page !== pages\n ? html`\n <span\n class=\"inline-block transform origin-top scale-50\"\n style=\"--tw-translate-y: 0.1em;\"\n >\n ${this.__page}\n </span>\n <span class=\"absolute inset-x-0 bottom-0\">...</span>\n `\n : '...'\n : pageIndex + 1}\n </vaadin-button>\n `;\n })}\n </div>\n `\n : ''}\n\n <dialog\n class=\"p-0 shadow-m bg-transparent\"\n @click=${(evt: MouseEvent) => {\n const dialog = evt.currentTarget as HTMLDialogElement;\n const dialogBox = dialog.getBoundingClientRect();\n const clickedInsideDialog =\n dialogBox.top <= evt.clientY &&\n evt.clientY <= dialogBox.top + dialogBox.height &&\n dialogBox.left <= evt.clientX &&\n evt.clientX <= dialogBox.left + dialogBox.width;\n\n if (!clickedInsideDialog) dialog.close();\n }}\n >\n <foxy-internal-summary-control\n helper-text=\"\"\n label=\"\"\n infer=\"\"\n class=\"bg-base rounded border border-base\"\n style=\"width: 18rem\"\n >\n <foxy-internal-number-control\n placeholder=\"1\"\n helper-text=\"\"\n layout=\"summary-item\"\n label=${this.t('page_number')}\n infer=\"\"\n step=\"1\"\n min=\"1\"\n max=${pages}\n .getValue=${() => this.__customPage}\n .setValue=${(value: number) => (this.__customPage = value || 1)}\n @keydown=${(evt: KeyboardEvent) => {\n if (evt.key === 'Enter') {\n this.__page = this.__customPage;\n this.__dialog?.close();\n }\n }}\n >\n </foxy-internal-number-control>\n <div>\n <vaadin-button\n theme=\"tertiary-inline\"\n ?disabled=${this.disabled}\n @click=${() => {\n this.__page = this.__customPage;\n this.__dialog?.close();\n }}\n >\n <foxy-i18n infer=\"\" key=\"jump\"></foxy-i18n>\n </vaadin-button>\n </div>\n </foxy-internal-summary-control>\n </dialog>\n `;\n }\n\n updated(changes: Map<keyof this, unknown>): void {\n super.updated(changes);\n\n const triggerProps = ['__first', '__limit', '__page'] as (keyof this)[];\n if (!triggerProps.some(prop => changes.has(prop))) return;\n\n try {\n const url = new URL(this.__first);\n const limit = this.__limit;\n const offset = this.__limit * (this.__page - 1);\n\n url.searchParams.delete('limit');\n url.searchParams.delete('offset');\n\n if (limit) url.searchParams.set('limit', limit.toString());\n if (offset) url.searchParams.set('offset', offset.toString());\n if (this.__pageElement) this.__pageElement.href = url.toString();\n } catch {\n //\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.__disconnectPageElement();\n removeEventListener('scroll', this.__handleScrollAndResize);\n removeEventListener('resize', this.__handleScrollAndResize);\n }\n\n private get __dialog() {\n return this.renderRoot.querySelector('dialog');\n }\n\n private __disconnectPageElement() {\n this.__pageElement?.removeEventListener('update', this.__handlePageElementUpdate);\n this.__pageElement = null;\n }\n\n private __connectPageElement() {\n this.__disconnectPageElement();\n\n const slot = this.renderRoot.querySelector<HTMLSlotElement>('slot');\n const assignedElements = slot?.assignedElements() ?? [];\n const firstNucleonElement = assignedElements.find(el => el instanceof NucleonElement) as\n | NucleonElement<any>\n | undefined;\n\n if (firstNucleonElement) {\n this.__pageElement = firstNucleonElement;\n this.__pageElement.addEventListener('update', this.__handlePageElementUpdate);\n this.__pageElement.href = this.first;\n }\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
- import '@polymer/iron-icons';
2
- import '@polymer/iron-icon';
3
1
  import '@vaadin/vaadin-button';
2
+ import '../../internal/InternalSummaryControl/index';
3
+ import '../../internal/InternalNumberControl/index';
4
4
  import '../I18n/index';
5
5
  import { Pagination } from './Pagination';
6
6
  export { Pagination };
@@ -1,6 +1,6 @@
1
- import '@polymer/iron-icons';
2
- import '@polymer/iron-icon';
3
1
  import '@vaadin/vaadin-button';
2
+ import "../../internal/InternalSummaryControl/index.js";
3
+ import "../../internal/InternalNumberControl/index.js";
4
4
  import "../I18n/index.js";
5
5
  import { Pagination } from "./Pagination.js";
6
6
  customElements.define('foxy-pagination', Pagination);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/Pagination/index.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,uBAAuB,CAAC;AAC/B,0BAAuB;AAEvB,OAAO,EAAE,UAAU,EAAE,wBAAqB;AAE1C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import '@polymer/iron-icons';\nimport '@polymer/iron-icon';\nimport '@vaadin/vaadin-button';\nimport '../I18n/index';\n\nimport { Pagination } from './Pagination';\n\ncustomElements.define('foxy-pagination', Pagination);\n\nexport { Pagination };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/Pagination/index.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,CAAC;AAE/B,wDAAqD;AACrD,uDAAoD;AAEpD,0BAAuB;AAEvB,OAAO,EAAE,UAAU,EAAE,wBAAqB;AAE1C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import '@vaadin/vaadin-button';\n\nimport '../../internal/InternalSummaryControl/index';\nimport '../../internal/InternalNumberControl/index';\n\nimport '../I18n/index';\n\nimport { Pagination } from './Pagination';\n\ncustomElements.define('foxy-pagination', Pagination);\n\nexport { Pagination };\n"]}
@@ -400,17 +400,6 @@ option{
400
400
  border-width: 0;
401
401
  }
402
402
 
403
- :host([sm]) .sm-not-sr-only {
404
- position: static;
405
- width: auto;
406
- height: auto;
407
- padding: 0;
408
- margin: 0;
409
- overflow: visible;
410
- clip: auto;
411
- white-space: normal;
412
- }
413
-
414
403
  .pointer-events-none {
415
404
  pointer-events: none;
416
405
  }
@@ -457,6 +446,11 @@ option{
457
446
  left: var(--lumo-space-m, 1rem);
458
447
  }
459
448
 
449
+ .inset-x-0 {
450
+ left: 0;
451
+ right: 0;
452
+ }
453
+
460
454
  .top-0 {
461
455
  top: 0;
462
456
  }
@@ -473,6 +467,10 @@ option{
473
467
  right: var(--lumo-space-m, 1rem);
474
468
  }
475
469
 
470
+ .bottom-0 {
471
+ bottom: 0;
472
+ }
473
+
476
474
  .bottom {
477
475
  bottom: var(--lumo-space-m, 1rem);
478
476
  }
@@ -966,6 +964,10 @@ option{
966
964
  table-layout: fixed;
967
965
  }
968
966
 
967
+ .origin-top {
968
+ transform-origin: top;
969
+ }
970
+
969
971
  .origin-top-right {
970
972
  transform-origin: top right;
971
973
  }
@@ -1054,6 +1056,11 @@ option{
1054
1056
  --tw-scale-y: 0;
1055
1057
  }
1056
1058
 
1059
+ .scale-50 {
1060
+ --tw-scale-x: .5;
1061
+ --tw-scale-y: .5;
1062
+ }
1063
+
1057
1064
  .scale-90 {
1058
1065
  --tw-scale-x: .9;
1059
1066
  --tw-scale-y: .9;
@@ -1526,6 +1533,10 @@ option{
1526
1533
  border-color: currentColor;
1527
1534
  }
1528
1535
 
1536
+ .border-base {
1537
+ border-color: var(--lumo-base-color, #fff);
1538
+ }
1539
+
1529
1540
  .border-contrast-5 {
1530
1541
  border-color: var(--lumo-contrast-5pct, hsla(214, 61%, 25%, 0.05));
1531
1542
  }
@@ -1 +1 @@
1
- {"version":3,"file":"themeable.js","sourceRoot":"","sources":["../../src/mixins/themeable.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAA0C,UAAU,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,eAAe,EAAE,wBAAqB;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAI/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,WAAkB,EACkB,EAAE;IACtC,OAAO,MAAM,gBAAiB,SAAQ,WAAW;QAC/C,MAAM,KAAK,MAAM;YACf,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;YAEjC,OAAO;gBACL,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAuKF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI;IACF,cAAc,CACZ,yBAAyB,EACzB,GAAG;;;;;;;;KASF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,cAAc,CACZ,qCAAqC,EACrC,GAAG;;;;;;;KAOF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,cAAc,CACZ,qCAAqC,EACrC,GAAG;;;;;;;KAOF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,cAAc,CACZ,eAAe,EACf,GAAG;;;;;;;KAQF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,uEAAuE;IACvE,cAAc,CACZ,aAAa,EACb,GAAG;;;KAIF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED;;;;;;;GAOG;AACH,MAAM,OAAgB,SAAU,SAAQ,mBAAmB,CACzD,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAC5C;CAAG","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\nimport { CSSResult, CSSResultArray, Constructor, LitElement, css } from 'lit-element';\n\nimport { ResponsiveMixin } from './responsive';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements';\nimport { registerStyles } from '@vaadin/vaadin-themable-mixin/register-styles';\n\ntype Base = Constructor<LitElement> & { styles?: CSSResult | CSSResultArray | CSSStyleSheet };\n\nexport const ThemeableMixin = <TBase extends Base>(\n BaseElement: TBase\n): TBase & { styles: CSSResultArray } => {\n return class ThemeableElement extends BaseElement {\n static get styles(): CSSResultArray {\n const originalCSS = super.styles;\n\n return [\n ...(originalCSS ? (Array.isArray(originalCSS) ? originalCSS : [originalCSS]) : []),\n css`\n @tailwind base;\n\n * {\n -webkit-tap-highlight-color: transparent;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n :host {\n display: block;\n color: var(--lumo-body-text-color);\n line-height: var(--lumo-line-height-m);\n font: normal var(--lumo-font-size-m) var(--lumo-font-family);\n }\n\n details > summary::-webkit-details-marker {\n display: none;\n }\n\n details > summary {\n list-style: none;\n }\n\n vaadin-select {\n margin-top: -4px;\n margin-bottom: -4px;\n }\n\n vaadin-text-area,\n vaadin-text-field,\n vaadin-date-picker,\n vaadin-email-field,\n vaadin-number-field,\n vaadin-custom-field,\n vaadin-integer-field,\n vaadin-password-field,\n vaadin-checkbox-group,\n vaadin-radio-group,\n vaadin-combo-box::part(text-field),\n vaadin-date-picker::part(text-field) {\n padding-top: 0;\n padding-bottom: 0;\n }\n\n vaadin-text-area::part(label),\n vaadin-text-field::part(label),\n vaadin-date-picker::part(label),\n vaadin-email-field::part(label),\n vaadin-number-field::part(label),\n vaadin-custom-field::part(label),\n vaadin-integer-field::part(label),\n vaadin-password-field::part(label),\n vaadin-checkbox-group::part(label),\n vaadin-radio-group::part(label),\n vaadin-combo-box::part(label),\n vaadin-date-picker::part(label) {\n margin-left: 0;\n }\n\n vaadin-time-picker,\n vaadin-date-time-picker {\n width: 100%;\n }\n\n vaadin-button,\n vaadin-checkbox::part(checkbox) {\n margin: 0;\n }\n\n vaadin-checkbox::part(label) {\n margin: 0.1875em var(--lumo-space-m);\n }\n\n .appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n }\n\n .appearance-none::-webkit-calendar-picker-indicator,\n .appearance-none::-webkit-outer-spin-button,\n .appearance-none::-webkit-inner-spin-button,\n .appearance-none::-webkit-list-button {\n opacity: 0 !important;\n width: 0 !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n input::-webkit-date-and-time-value {\n text-align: inherit !important;\n }\n\n [hidden] {\n display: none !important;\n }\n\n option {\n color: var(--lumo-body-text-color);\n }\n\n @tailwind components;\n\n @tailwind utilities;\n\n @layer utilities {\n .border-radius-overflow-fix {\n -webkit-mask-image: -webkit-radial-gradient(white, black);\n }\n\n @variants sm, md, lg, xl {\n .grid-rows-auto {\n grid-auto-rows: 1fr;\n }\n\n .icon-inline {\n --iron-icon-height: 1em;\n --iron-icon-width: 1em;\n }\n\n .bg-blurred {\n backdrop-filter: blur(25px);\n background: var(--lumo-tint-80pct);\n }\n\n .max-w-modal {\n max-width: 28rem;\n }\n\n .max-w-modal-wide {\n max-width: 50rem;\n }\n\n .w-narrow-modal {\n width: 18rem;\n }\n\n .snap-x-mandatory {\n scroll-snap-type: x mandatory;\n }\n\n .snap-start {\n scroll-snap-align: start;\n }\n\n .hljs-tag {\n color: var(--lumo-tertiary-text-color);\n font-weight: 500;\n }\n\n .hljs-name {\n color: var(--lumo-primary-text-color);\n font-weight: 500;\n }\n\n .hljs-attr {\n color: var(--lumo-secondary-text-color);\n font-weight: 500;\n }\n\n .hljs-string {\n color: var(--lumo-success-text-color);\n font-weight: 500;\n }\n }\n }\n `,\n ];\n }\n };\n};\n\ntry {\n registerStyles(\n 'vaadin-date-time-picker',\n css`\n vaadin-date-time-picker-custom-field {\n --lumo-text-field-size: auto;\n padding: 0;\n }\n\n vaadin-date-time-picker-custom-field::part(label) {\n padding-bottom: 0.5em;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n registerStyles(\n 'vaadin-date-time-picker-date-picker',\n css`\n :host {\n --lumo-text-field-size: auto;\n }\n vaadin-date-time-picker-date-text-field {\n padding: 0;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n registerStyles(\n 'vaadin-date-time-picker-time-picker',\n css`\n :host {\n --lumo-text-field-size: auto;\n }\n vaadin-date-time-picker-time-text-field {\n padding: 0;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n registerStyles(\n 'vaadin-button',\n css`\n #button {\n cursor: pointer;\n }\n\n :host([theme~='primary']) {\n font-weight: 500;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n /** https://github.com/vaadin-component-factory/vcf-tooltip/issues/6 */\n registerStyles(\n 'vcf-tooltip',\n css`\n :host([hidden]) [part='container'] {\n display: none !important;\n }\n `\n );\n} catch {\n // ignore\n}\n\n/**\n * One of the base classes for each rel-specific element in the collection\n * providing shared TailwindCSS styles for Shadow DOM content.\n * This class MUST NOT be used on its own (hence the `abstract` keyword) or\n * referenced externally (outside of the package).\n *\n * @deprecated\n */\nexport abstract class Themeable extends ScopedElementsMixin(\n ResponsiveMixin(ThemeableMixin(LitElement))\n) {}\n"]}
1
+ {"version":3,"file":"themeable.js","sourceRoot":"","sources":["../../src/mixins/themeable.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAA0C,UAAU,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,eAAe,EAAE,wBAAqB;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAI/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,WAAkB,EACkB,EAAE;IACtC,OAAO,MAAM,gBAAiB,SAAQ,WAAW;QAC/C,MAAM,KAAK,MAAM;YACf,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;YAEjC,OAAO;gBACL,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAuKF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI;IACF,cAAc,CACZ,yBAAyB,EACzB,GAAG;;;;;;;;KASF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,cAAc,CACZ,qCAAqC,EACrC,GAAG;;;;;;;KAOF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,cAAc,CACZ,qCAAqC,EACrC,GAAG;;;;;;;KAOF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,cAAc,CACZ,eAAe,EACf,GAAG;;;;;;;KAQF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED,IAAI;IACF,uEAAuE;IACvE,cAAc,CACZ,aAAa,EACb,GAAG;;;KAIF,CACF,CAAC;CACH;AAAC,WAAM;IACN,SAAS;CACV;AAED;;;;;;;GAOG;AACH,MAAM,OAAgB,SAAU,SAAQ,mBAAmB,CACzD,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAC5C;CAAG","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\nimport { CSSResult, CSSResultArray, Constructor, LitElement, css } from 'lit-element';\n\nimport { ResponsiveMixin } from './responsive';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements';\nimport { registerStyles } from '@vaadin/vaadin-themable-mixin/register-styles';\n\ntype Base = Constructor<LitElement> & { styles?: CSSResult | CSSResultArray | CSSStyleSheet };\n\nexport const ThemeableMixin = <TBase extends Base>(\n BaseElement: TBase\n): TBase & { styles: CSSResultArray } => {\n return class ThemeableElement extends BaseElement {\n static get styles(): CSSResultArray {\n const originalCSS = super.styles;\n\n return [\n ...(originalCSS ? (Array.isArray(originalCSS) ? originalCSS : [originalCSS]) : []),\n css`\n @tailwind base;\n\n * {\n -webkit-tap-highlight-color: transparent;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n :host {\n display: block;\n color: var(--lumo-body-text-color);\n line-height: var(--lumo-line-height-m);\n font: normal var(--lumo-font-size-m) var(--lumo-font-family);\n }\n\n details > summary::-webkit-details-marker {\n display: none;\n }\n\n details > summary {\n list-style: none;\n }\n\n vaadin-select {\n margin-top: -4px;\n margin-bottom: -4px;\n }\n\n vaadin-text-area,\n vaadin-text-field,\n vaadin-date-picker,\n vaadin-email-field,\n vaadin-number-field,\n vaadin-custom-field,\n vaadin-integer-field,\n vaadin-password-field,\n vaadin-checkbox-group,\n vaadin-radio-group,\n vaadin-combo-box::part(text-field),\n vaadin-date-picker::part(text-field) {\n padding-top: 0;\n padding-bottom: 0;\n }\n\n vaadin-text-area::part(label),\n vaadin-text-field::part(label),\n vaadin-date-picker::part(label),\n vaadin-email-field::part(label),\n vaadin-number-field::part(label),\n vaadin-custom-field::part(label),\n vaadin-integer-field::part(label),\n vaadin-password-field::part(label),\n vaadin-checkbox-group::part(label),\n vaadin-radio-group::part(label),\n vaadin-combo-box::part(label),\n vaadin-date-picker::part(label) {\n margin-left: 0;\n }\n\n vaadin-time-picker,\n vaadin-date-time-picker {\n width: 100%;\n }\n\n vaadin-button,\n vaadin-checkbox::part(checkbox) {\n margin: 0;\n }\n\n vaadin-checkbox::part(label) {\n margin: 0.1875em var(--lumo-space-m);\n }\n\n .appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n }\n\n .appearance-none::-webkit-calendar-picker-indicator,\n .appearance-none::-webkit-outer-spin-button,\n .appearance-none::-webkit-inner-spin-button,\n .appearance-none::-webkit-list-button {\n opacity: 0 !important;\n width: 0 !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n input::-webkit-date-and-time-value {\n text-align: inherit !important;\n }\n\n [hidden] {\n display: none !important;\n }\n\n option {\n color: var(--lumo-body-text-color);\n }\n\n @tailwind components;\n\n @tailwind utilities;\n\n @layer utilities {\n .border-radius-overflow-fix {\n -webkit-mask-image: -webkit-radial-gradient(white, black);\n }\n\n @variants sm, md, lg, xl {\n .grid-rows-auto {\n grid-auto-rows: 1fr;\n }\n\n .icon-inline {\n --iron-icon-height: 1em;\n --iron-icon-width: 1em;\n }\n\n .bg-blurred {\n backdrop-filter: blur(25px);\n background: var(--lumo-tint-80pct);\n }\n\n .max-w-modal {\n max-width: 28rem;\n }\n\n .max-w-modal-wide {\n max-width: 50rem;\n }\n\n .w-narrow-modal {\n width: 18rem;\n }\n\n .snap-x-mandatory {\n scroll-snap-type: x mandatory;\n }\n\n .snap-start {\n scroll-snap-align: start;\n }\n\n .hljs-tag {\n color: var(--lumo-tertiary-text-color);\n font-weight: 500;\n }\n\n .hljs-name {\n color: var(--lumo-primary-text-color);\n font-weight: 500;\n }\n\n .hljs-attr {\n color: var(--lumo-secondary-text-color);\n font-weight: 500;\n }\n\n .hljs-string {\n color: var(--lumo-success-text-color);\n font-weight: 500;\n }\n }\n }\n `,\n ];\n }\n };\n};\n\ntry {\n registerStyles(\n 'vaadin-date-time-picker',\n css`\n vaadin-date-time-picker-custom-field {\n --lumo-text-field-size: auto;\n padding: 0;\n }\n\n vaadin-date-time-picker-custom-field::part(label) {\n padding-bottom: 0.5em;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n registerStyles(\n 'vaadin-date-time-picker-date-picker',\n css`\n :host {\n --lumo-text-field-size: auto;\n }\n vaadin-date-time-picker-date-text-field {\n padding: 0;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n registerStyles(\n 'vaadin-date-time-picker-time-picker',\n css`\n :host {\n --lumo-text-field-size: auto;\n }\n vaadin-date-time-picker-time-text-field {\n padding: 0;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n registerStyles(\n 'vaadin-button',\n css`\n #button {\n cursor: pointer;\n }\n\n :host([theme~='primary']) {\n font-weight: 500;\n }\n `\n );\n} catch {\n // ignore\n}\n\ntry {\n /** https://github.com/vaadin-component-factory/vcf-tooltip/issues/6 */\n registerStyles(\n 'vcf-tooltip',\n css`\n :host([hidden]) [part='container'] {\n display: none !important;\n }\n `\n );\n} catch {\n // ignore\n}\n\n/**\n * One of the base classes for each rel-specific element in the collection\n * providing shared TailwindCSS styles for Shadow DOM content.\n * This class MUST NOT be used on its own (hence the `abstract` keyword) or\n * referenced externally (outside of the package).\n *\n * @deprecated\n */\nexport abstract class Themeable extends ScopedElementsMixin(\n ResponsiveMixin(ThemeableMixin(LitElement))\n) {}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@foxy.io/elements",
3
3
  "type": "module",
4
- "version": "1.41.0",
4
+ "version": "1.42.0-beta.1",
5
5
  "description": "E-commerce web components by Foxy.",
6
6
  "repository": {
7
7
  "type": "git",
@@ -1 +0,0 @@
1
- import"./foxy-spinner.js";import{I as e}from"./shared-d298bb95.js";customElements.define("foxy-internal-card",e);
@@ -1 +0,0 @@
1
- import"./shared-a6b2bd14.js";import"./shared-174ae849.js";import"./shared-922db328.js";import"./shared-2a941373.js";import{b as e,I as t}from"./shared-f00ebf92.js";import"./shared-5c6a00e9.js";import{i as s}from"./shared-53e42a77.js";import{h as o}from"./shared-ba5c42c7.js";import{c as r,_ as n,B as i}from"./shared-cb58dfcd.js";import{S as a,a as l}from"./shared-3c0dcb9e.js";import{v as d}from"./shared-b738ee96.js";import{c}from"./shared-4e709717.js";let h,p=e=>e;customElements.define("foxy-internal-customer-form-legal-notice-control",class extends e{renderControl(){var e,t;const r=this.nucleon;return o(h||(h=p` <p class="leading-s text-xs text-secondary"> <foxy-i18n infer="" key="text"></foxy-i18n> <a class="font-medium text-body rounded hover-underline focus-outline-none focus-ring-2 focus-ring-primary-50" target="_blank" href="${0}" rel="noopener noreferrer"> <foxy-i18n infer="" key="link"></foxy-i18n> </a> </p> `),s(null===(t=null===(e=null==r?void 0:r.settings)||void 0===e?void 0:e.tos_checkbox_settings)||void 0===t?void 0:t.url))}});var u=r((function(e){!function(){const t=[{id:0,value:"Too weak",minDiversity:0,minLength:0},{id:1,value:"Weak",minDiversity:2,minLength:6},{id:2,value:"Medium",minDiversity:4,minLength:8},{id:3,value:"Strong",minDiversity:4,minLength:10}],s=(e,s=t,o="!\"#$%&'()*+,-./:;<=>?@[\\\\\\]^_`{|}~")=>{let r=e||"";s[0].minDiversity=0,s[0].minLength=0;const n=[{regex:"[a-z]",message:"lowercase"},{regex:"[A-Z]",message:"uppercase"},{regex:"[0-9]",message:"number"}];o&&n.push({regex:`[${o}]`,message:"symbol"});let i={};i.contains=n.filter((e=>new RegExp(`${e.regex}`).test(r))).map((e=>e.message)),i.length=r.length;let a=s.filter((e=>i.contains.length>=e.minDiversity)).filter((e=>i.length>=e.minLength)).sort(((e,t)=>t.id-e.id)).map((e=>({id:e.id,value:e.value})));return Object.assign(i,a[0]),i};e.exports={passwordStrength:s,defaultOptions:t}}()}));let m,f,_=e=>e;const g=a(l(t,"customer-form")),x=u.passwordStrength;class v extends g{constructor(){super(...arguments),this.passwordless=!1,this.settings=null,this.__passwordGeneratorOptions={checkStrength:e=>x(e).id>=2},this.__isAnonymousGetValue=()=>{var e;return!1===(null===(e=this.form)||void 0===e?void 0:e.is_anonymous)?"false":"true"},this.__isAnonymousSetValue=e=>{const t="true"===e;this.edit({is_anonymous:t}),t&&this.form.password&&this.edit({password:""}),t&&this.form.password_old&&this.edit({password_old:""}),t&&this.form.forgot_password&&this.edit({forgot_password:""})},this.__isAnonymousOptions=[{value:"true",label:"option_true"},{value:"false",label:"option_false"}],this.__refreshInterval=null}static get scopedElements(){return{"foxy-internal-customer-form-legal-notice-control":customElements.get("foxy-internal-customer-form-legal-notice-control"),"foxy-internal-radio-group-control":customElements.get("foxy-internal-radio-group-control"),"foxy-internal-timestamps-control":customElements.get("foxy-internal-timestamps-control"),"foxy-internal-password-control":customElements.get("foxy-internal-password-control"),"foxy-internal-submit-control":customElements.get("foxy-internal-submit-control"),"foxy-internal-delete-control":customElements.get("foxy-internal-delete-control"),"foxy-internal-text-control":customElements.get("foxy-internal-text-control"),"foxy-internal-undo-control":customElements.get("foxy-internal-undo-control"),"foxy-copy-to-clipboard":customElements.get("foxy-copy-to-clipboard"),"foxy-spinner":customElements.get("foxy-spinner"),"vcf-tooltip":customElements.get("vcf-tooltip"),"foxy-i18n":customElements.get("foxy-i18n"),"h-captcha":customElements.get("h-captcha"),"vaadin-button":customElements.get("vaadin-button")}}static get properties(){return n(n({},super.properties),{},{passwordless:{type:Boolean},settings:{type:Object}})}static get v8n(){return[({password:e,_links:t,is_anonymous:s=!0},o)=>!!o.passwordless||(!!(t||s||e)||"password:v8n_required"),({password_old:e,password:t,_links:s},o)=>{var r;return!s||(void 0===(null===(r=o.settings)||void 0===r?void 0:r.sign_up)||(!(t&&!e)||"password-old:v8n_required"))},({first_name:e})=>!e||e.length<=50||"first-name:v8n_too_long",({last_name:e})=>!e||e.length<=50||"last-name:v8n_too_long",({password:e})=>!e||x(e).id>=2||"password:v8n_too_weak",({password:e})=>!e||e.length<=50||"password:v8n_too_long",({tax_id:e})=>!e||e.length<=50||"tax-id:v8n_too_long",({email:e})=>e&&e.length>0||"email:v8n_required",({email:e})=>!e||e.length<=100||"email:v8n_too_long",({email:e})=>!e||d(e)||"email:v8n_invalid_email"]}get hiddenSelector(){const e=new Set(super.hiddenSelector.toString().split(" "));return this.settings?(e.add("forgot-password"),e.add("is-anonymous"),this.form.password||e.add("password-old"),"none"===this.settings.tos_checkbox_settings.usage&&e.add("legal-notice")):(!1!==this.form.is_anonymous&&(e.add("forgot-password"),e.add("password")),e.add("password-old"),e.add("legal-notice")),this.href&&(e.add("is-anonymous"),e.add("legal-notice")),new i(Array.from(e).join(" ").trim())}get headerTitleOptions(){var e,t;const s=this.data;return!s||(null===(e=s.first_name)||void 0===e?void 0:e.trim())||(null===(t=s.last_name)||void 0===t?void 0:t.trim())?super.headerTitleOptions:n(n({},super.headerTitleOptions),{},{context:"no_name"})}get headerSubtitleKey(){var e;return(null===(e=this.data)||void 0===e?void 0:e.is_anonymous)?"subtitle_anonymous":"subtitle_registered"}get headerSubtitleOptions(){return n(n({},super.headerSubtitleOptions),{},{id:this.headerCopyIdValue})}disconnectedCallback(){super.disconnectedCallback();const e=this.__refreshInterval;e&&clearInterval(e)}connectedCallback(){super.connectedCallback();const e=setInterval((()=>this.requestUpdate()),6e4);this.__refreshInterval=e}renderBody(){var e,t,s,r;const n=this.hiddenSelector.matches("first-name",!0),i=this.hiddenSelector.matches("last-name",!0);return o(m||(m=_` ${0} <div class="${0}"> <foxy-internal-text-control infer="first-name"></foxy-internal-text-control> <foxy-internal-text-control infer="last-name"></foxy-internal-text-control> </div> <foxy-internal-text-control helper-text="${0}" infer="email"> </foxy-internal-text-control> <foxy-internal-radio-group-control infer="is-anonymous" .getValue="${0}" .setValue="${0}" .options="${0}"> </foxy-internal-radio-group-control> <foxy-internal-password-control placeholder="${0}" helper-text="${0}" infer="password" show-generator .generatorOptions="${0}"> </foxy-internal-password-control> <foxy-internal-password-control infer="password-old"></foxy-internal-password-control> <foxy-internal-password-control helper-text="${0}" infer="forgot-password" show-generator> </foxy-internal-password-control> <foxy-internal-text-control infer="tax-id"></foxy-internal-text-control> <foxy-internal-customer-form-legal-notice-control infer="legal-notice"> </foxy-internal-customer-form-legal-notice-control> ${0} ${0} `),this.renderHeader(),c({"grid-cols-2":!n&&!i,hidden:n&&i,"gap-m":!0,grid:!n||!i}),this.__emailHelperText,this.__isAnonymousGetValue,this.__isAnonymousSetValue,this.__isAnonymousOptions,this.__passwordPlaceholder,this.__passwordHelperText,this.__passwordGeneratorOptions,this.__forgotPasswordHelperText,!this.data&&(null===(t=null===(e=this.settings)||void 0===e?void 0:e.sign_up)||void 0===t?void 0:t.enabled)&&"hcaptcha"===(null===(r=null===(s=this.settings)||void 0===s?void 0:s.sign_up)||void 0===r?void 0:r.verification.type)?o(f||(f=_` <h-captcha site-key="${0}" class="hidden" size="invisible" hl="${0}" @verified="${0}"> </h-captcha> `),this.settings.sign_up.verification.site_key,this.lang,(({token:e})=>{this.edit({verification:{type:"hcaptcha",token:e}}),super.submit()})):"",super.renderBody())}submit(){var e,t,s,o,r;"hcaptcha"!==(null===(s=null===(t=null===(e=this.settings)||void 0===e?void 0:e.sign_up)||void 0===t?void 0:t.verification)||void 0===s?void 0:s.type)||this.data?super.submit():(null===(o=this.__hcaptcha)||void 0===o||o.reset(),null===(r=this.__hcaptcha)||void 0===r||r.execute())}async _sendPatch(e){const t=await super._sendPatch(e);if(e.password){const e={key:"password_change_success",options:{email:t.email}};this.status=e}return t}async _sendGet(){return this.status=null,await super._sendGet()}async _fetch(...e){try{return await super._fetch(...e)}catch(e){let t;try{t=(await e.json())._embedded["fx:errors"][0].message}catch(t){throw e}throw"Conflict"===t||t.startsWith("This email address is already in use")?["error:email_already_used"]:t.startsWith("Customer registration is disabled")?["error:registration_disabled"]:t.startsWith("Client verification failed")?["error:verification_failed"]:t.startsWith("Provided password is incorrect")?["error:old_password_incorrect"]:e}}get __forgotPasswordHelperText(){var e,t;const s=null===(e=this.data)||void 0===e?void 0:e.forgot_password_timestamp,o="forgot-password.helper_text";if((null===(t=this.data)||void 0===t?void 0:t.forgot_password)&&s){const e=new Date(new Date(s).getTime()+18e5),t=Math.floor((e.getTime()-Date.now())/1e3/60);return t<=0?this.t(`${o}_expired_on`,{expiresOn:e}):this.t(`${o}_expires_in`,{expiresInMin:`${t}minutes`})}return this.t(o)}get __passwordPlaceholder(){return this.data?this.t("password.placeholder_new"):this.t("password.placeholder")}get __passwordHelperText(){return this.data?this.t("password.helper_text_new"):this.t("password.helper_text")}get __emailHelperText(){var e;return(null===(e=this.data)||void 0===e?void 0:e.last_login_date)?this.t("email.helper_text_last_login_date",{date:this.data.last_login_date}):this.t("email.helper_text")}get __hcaptcha(){return this.renderRoot.querySelector("h-captcha")}}customElements.define("foxy-customer-form",v);export{v as C,u};
@@ -1 +0,0 @@
1
- import"./shared-2fe84d72.js";import"./shared-7f14ea13.js";import{I as e,a as t}from"./shared-f00ebf92.js";import"./foxy-copy-to-clipboard.js";import"./foxy-nucleon-element.js";import"./foxy-form-dialog.js";import"./shared-5c6a00e9.js";import{_ as s,m as i}from"./shared-cb58dfcd.js";import{h as r,s as o}from"./shared-ba5c42c7.js";import{s as l}from"./shared-53e476fd.js";import{g as a}from"./shared-bab2ea2c.js";import{F as n}from"./shared-343d1fd7.js";import{i as d}from"./shared-53e42a77.js";import{c as h}from"./shared-4e709717.js";import{u}from"./shared-f83207fb.js";let c,f=e=>e;let p,y,m,v,x,b,g,$,_=e=>e;customElements.define("foxy-internal-resource-picker-control-form",class extends e{constructor(){super(...arguments),this.selectionProps={}}static get properties(){return s(s({},super.properties),{},{selectionProps:{attribute:!1}})}renderBody(){return r(c||(c=f` <foxy-internal-async-list-control infer="selection" form="foxy-null" hide-delete-button hide-create-button @itemclick="${0}" ...="${0}"> </foxy-internal-async-list-control> `),(e=>{e.preventDefault(),this.edit({selection:e.detail}),this.submit()}),l(this.selectionProps))}}),customElements.define("foxy-internal-resource-picker-control",class extends t{constructor(){super(...arguments),this.getDisplayValueOptions=e=>({resource:e}),this.showCopyIdButton=!1,this.virtualHost=u("internal-resource-picker-control-"),this.getItemUrl=null,this.formProps={},this.filters=[],this.layout=null,this.first=null,this.item=null,this.form=null,this.__getItemRenderer=i((e=>new Function("ctx",`return ctx.html\`\n <${null!=e?e:"foxy-null"}\n related=\${JSON.stringify(ctx.related)}\n parent=\${ctx.parent}\n infer="card"\n href=\${ctx.href}\n ...=\${ctx.spread(ctx.props)}\n >\n </${null!=e?e:"foxy-null"}>\``)))}static get properties(){return s(s({},super.properties),{},{getDisplayValueOptions:{attribute:!1},showCopyIdButton:{type:Boolean,attribute:"show-copy-id-button"},virtualHost:{},getItemUrl:{attribute:!1},formProps:{type:Object},filters:{type:Array},layout:{},first:{},item:{},form:{}})}renderControl(){var e;const t=s(s({},this.formProps),{},{".selectionProps":{".filters":this.filters,".first":this.first,".item":this.item}});return r(p||(p=_` <foxy-form-dialog parent="foxy://${0}/select" header="header" infer="dialog" alert .props="${0}" .form="${0}" @fetch="${0}"> </foxy-form-dialog> ${0} `),this.virtualHost,t,null!==(e=this.form)&&void 0!==e?e:"foxy-internal-resource-picker-control-form",this.__handleFetchEvent,"summary-item"===this.layout?this.__renderSummaryItemLayout():this.__renderStandaloneLayout())}updated(e){var t,s;super.updated(e),e.has("item")&&(null===(s=(t=this.__getItemRenderer.cache).clear)||void 0===s||s.call(t))}__clear(){this._value="",this.dispatchEvent(new CustomEvent("clear"))}__renderSummaryItemLayout(){const e=this.renderRoot.querySelector("#value");return r(y||(y=_` <div class="leading-xs"> <div class="flex items-center gap-xs"> <div class="text-m text-body whitespace-nowrap flex-1">${0}</div> <button aria-label="${0}" class="${0}" ?disabled="${0}" @click="${0}"> <div class="truncate min-w-0"> ${0} </div> </button> <button aria-label="${0}" class="${0}" style="width:1em;height:1em" ?disabled="${0}" ?hidden="${0}" @click="${0}"> ${0} </button> </div> <div style="max-width:32rem"> <div class="text-xs text-secondary">${0}</div> <div class="text-xs text-error" ?hidden="${0}"> ${0} </div> </div> </div> <foxy-nucleon infer="" href="${0}" id="value" @update="${0}"> </foxy-nucleon> `),this.label,this.t("select"),h({"text-right min-w-0 transition-colors transition-opacity":!0,"rounded-s focus-outline-none focus-ring-2 focus-ring-primary-50":!0,"text-secondary":this.readonly,"text-disabled":this.disabled,"cursor-pointer text-body hover-opacity-80":!this.disabled&&!this.readonly,"font-medium":!this.readonly}),this.disabled||this.readonly,(e=>{if(this.disabled||this.readonly)return;const t=e.currentTarget,s=this.renderRoot.querySelector("foxy-form-dialog");s.href="",s.show(t)}),this._value?r(m||(m=_` <foxy-i18n infer="" key="value" .options="${0}"> </foxy-i18n> `),(null==e?void 0:e.data)?this.getDisplayValueOptions(e.data):{context:(null==e?void 0:e.in("fail"))?"fail":"busy"}):this.placeholder,this.t("clear"),h({"rounded-full transition-colors":!0,"focus-outline-none focus-ring-2 focus-ring-primary-50":!0,"cursor-pointer text-tertiary hover-text-body":!this.disabled,"cursor-default text-disabled":this.disabled}),this.disabled,this.readonly||!this._value,this.__clear,o(v||(v=_`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" style="width: 1em; height: 1em; transform: scale(1.25); margin-right: -0.16em"><path d="M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z" /></svg>`)),this.helperText,this.disabled||this.readonly,this._errorMessage,d(this._value||void 0),(()=>this.requestUpdate()))}__renderStandaloneLayout(){var e,t,s,i,o;const n=this.__valueLoader,u="string"==typeof this._value?a(this._value):void 0,c="string"==typeof this._value?null===(e=this.getItemUrl)||void 0===e?void 0:e.call(this,this._value,null!==(t=null==n?void 0:n.data)&&void 0!==t?t:null):void 0;return r(x||(x=_` <div class="block group"> <div class="${0}"> <span class="mr-auto text-l">${0}</span> ${0} ${0} ${0} </div> <div class="text-secondary text-s" ?hidden="${0}">${0}</div> <button class="${0}" style="padding:calc(.625em + (var(--lumo-border-radius)/ 4) - 1px)" ?disabled="${0}" @click="${0}"> <div class="${0}"> <foxy-nucleon class="block" infer="" href="${0}" id="valueLoader" @update="${0}"> ${0} </foxy-nucleon> </div> </button> <div class="mt-xs text-xs leading-xs text-error" ?hidden="${0}"> ${0} </div> </div> `),h({"flex items-center gap-s transition-colors font-medium":!0,"text-disabled":this.disabled}),this.label,c?r(b||(b=_` <a class="text-body rounded transition-opacity hover-opacity-90 focus-outline-none focus-ring-2 focus-ring-primary-50" href="${0}"> <foxy-i18n infer="" key="view"></foxy-i18n> </a> `),c):"",this.showCopyIdButton&&null!==u?r(g||(g=_` <foxy-copy-to-clipboard layout="text" theme="contrast tertiary-inline" infer="copy-id" text="${0}"> </foxy-copy-to-clipboard> `),u):"",this.readonly||!this._value?"":r($||($=_` <vaadin-button theme="error tertiary-inline" ?disabled="${0}" @click="${0}"> <foxy-i18n infer="" key="clear"></foxy-i18n> </vaadin-button> `),this.disabled,this.__clear),!this.helperText,this.helperText,h({"block w-full bg-contrast-5 rounded text-left transition-colors":!0,"focus-outline-none focus-ring-2 focus-ring-primary-50":!0,"cursor-pointer hover-bg-contrast-10":!this.disabled&&!this.readonly,"cursor-default":this.disabled||this.readonly,"mt-s":!!this.label||!!this.helperText}),this.disabled||this.readonly,(e=>{const t=e.currentTarget,s=this.renderRoot.querySelector("foxy-form-dialog");s.href="",s.show(t)}),h({"transition-opacity":!0,"opacity-50":this.disabled}),d(this._value||void 0),(()=>this.requestUpdate()),this.__getItemRenderer(this.item)({html:r,data:null!==(s=null==n?void 0:n.data)&&void 0!==s?s:null,href:this._value||"",related:[],parent:"",props:{},spread:l,simplifyNsLoading:this.simplifyNsLoading,disabled:this.disabled,disabledControls:this.disabledControls,readonly:this.readonly,readonlyControls:this.readonlyControls,hidden:this.hidden,hiddenControls:this.hiddenControls,templates:this.templates,previous:null,next:null,group:null!==(o=null===(i=this.nucleon)||void 0===i?void 0:i.group)&&void 0!==o?o:"",lang:this.lang,ns:this.ns}),!this._errorMessage||this.disabled||this.readonly,this._errorMessage)}__handleFetchEvent(e){if(!(e instanceof n))return;if(e.defaultPrevented)return;const{url:t,method:s}=e.request;return t===`foxy://${this.virtualHost}/select`&&"POST"===s?e.respondWith(this.__handleSelect(e.request)):t===`foxy://${this.virtualHost}/empty`&&"GET"===s?e.respondWith(this.__handleEmpty()):void 0}async __handleSelect(e){const t=await e.clone().json();return this._value=t.selection,new Response(JSON.stringify({_links:{self:{href:`foxy://${this.virtualHost}/empty`}},message:"Resource selected."}))}async __handleEmpty(){return new Response(JSON.stringify({_links:{self:{href:`foxy://${this.virtualHost}/empty`}},message:"Resource selected."}))}get __valueLoader(){return this.renderRoot.querySelector("#valueLoader")}});