@supersoniks/concorde 1.1.31 → 1.1.35

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 (202) hide show
  1. package/README.md +0 -0
  2. package/cli.js +0 -0
  3. package/components.d.ts +0 -0
  4. package/components.js +0 -0
  5. package/concorde-core.bundle.js +102 -115
  6. package/concorde-core.es.js +7589 -55
  7. package/core/components/functional/configuration/configuration.d.ts +0 -0
  8. package/core/components/functional/configuration/configuration.js +0 -0
  9. package/core/components/functional/date/date.d.ts +0 -0
  10. package/core/components/functional/date/date.js +0 -0
  11. package/core/components/functional/example/example.d.ts +0 -0
  12. package/core/components/functional/example/example.js +0 -0
  13. package/core/components/functional/fetch/fetch.d.ts +0 -0
  14. package/core/components/functional/fetch/fetch.js +0 -0
  15. package/core/components/functional/functional.d.ts +0 -0
  16. package/core/components/functional/functional.js +0 -0
  17. package/core/components/functional/if/if.d.ts +0 -0
  18. package/core/components/functional/if/if.js +0 -0
  19. package/core/components/functional/list/list.d.ts +0 -0
  20. package/core/components/functional/list/list.js +0 -0
  21. package/core/components/functional/queue/queue.d.ts +4 -1
  22. package/core/components/functional/queue/queue.js +16 -3
  23. package/core/components/functional/router/redirect.d.ts +0 -0
  24. package/core/components/functional/router/redirect.js +0 -0
  25. package/core/components/functional/router/router.d.ts +0 -0
  26. package/core/components/functional/router/router.js +0 -0
  27. package/core/components/functional/sonic-scope/sonic-scope.d.ts +0 -0
  28. package/core/components/functional/sonic-scope/sonic-scope.js +0 -0
  29. package/core/components/functional/states/states.d.ts +0 -0
  30. package/core/components/functional/states/states.js +0 -0
  31. package/core/components/functional/submit/submit.d.ts +0 -0
  32. package/core/components/functional/submit/submit.js +35 -21
  33. package/core/components/functional/subscriber/subscriber.d.ts +0 -0
  34. package/core/components/functional/subscriber/subscriber.js +0 -0
  35. package/core/components/ui/_css/scroll.d.ts +0 -0
  36. package/core/components/ui/_css/scroll.js +0 -0
  37. package/core/components/ui/_css/size.d.ts +0 -0
  38. package/core/components/ui/_css/size.js +0 -0
  39. package/core/components/ui/_css/type.d.ts +0 -0
  40. package/core/components/ui/_css/type.js +0 -0
  41. package/core/components/ui/alert/alert.d.ts +0 -0
  42. package/core/components/ui/alert/alert.js +0 -0
  43. package/core/components/ui/badge/badge.d.ts +0 -0
  44. package/core/components/ui/badge/badge.js +0 -0
  45. package/core/components/ui/button/button.d.ts +3 -2
  46. package/core/components/ui/button/button.js +0 -0
  47. package/core/components/ui/captcha/captcha.d.ts +1 -0
  48. package/core/components/ui/captcha/captcha.js +14 -2
  49. package/core/components/ui/card/card-footer.d.ts +0 -0
  50. package/core/components/ui/card/card-footer.js +0 -0
  51. package/core/components/ui/card/card-header-descripton.d.ts +0 -0
  52. package/core/components/ui/card/card-header-descripton.js +0 -0
  53. package/core/components/ui/card/card-header.d.ts +0 -0
  54. package/core/components/ui/card/card-header.js +0 -0
  55. package/core/components/ui/card/card-main.d.ts +0 -0
  56. package/core/components/ui/card/card-main.js +0 -0
  57. package/core/components/ui/card/card.d.ts +0 -0
  58. package/core/components/ui/card/card.js +0 -0
  59. package/core/components/ui/divider/divider.d.ts +0 -0
  60. package/core/components/ui/divider/divider.js +0 -0
  61. package/core/components/ui/form/checkbox/checkbox.d.ts +11 -44
  62. package/core/components/ui/form/checkbox/checkbox.js +28 -35
  63. package/core/components/ui/form/css/form-control.d.ts +0 -0
  64. package/core/components/ui/form/css/form-control.js +0 -0
  65. package/core/components/ui/form/fieldset/fieldset.d.ts +0 -0
  66. package/core/components/ui/form/fieldset/fieldset.js +0 -0
  67. package/core/components/ui/form/fieldset/legend-description.d.ts +0 -0
  68. package/core/components/ui/form/fieldset/legend-description.js +0 -0
  69. package/core/components/ui/form/fieldset/legend.d.ts +7 -2
  70. package/core/components/ui/form/fieldset/legend.js +34 -8
  71. package/core/components/ui/form/form-actions/form-actions.d.ts +0 -0
  72. package/core/components/ui/form/form-actions/form-actions.js +0 -0
  73. package/core/components/ui/form/form-layout/form-layout.d.ts +0 -0
  74. package/core/components/ui/form/form-layout/form-layout.js +0 -0
  75. package/core/components/ui/form/input/input.d.ts +6 -2
  76. package/core/components/ui/form/input/input.js +4 -13
  77. package/core/components/ui/form/radio/radio.d.ts +0 -0
  78. package/core/components/ui/form/radio/radio.js +0 -0
  79. package/core/components/ui/form/select/select.d.ts +7 -2
  80. package/core/components/ui/form/select/select.js +32 -7
  81. package/core/components/ui/form/textarea/textarea.d.ts +6 -2
  82. package/core/components/ui/form/textarea/textarea.js +2 -7
  83. package/core/components/ui/group/group.d.ts +0 -0
  84. package/core/components/ui/group/group.js +0 -0
  85. package/core/components/ui/icon/icon.d.ts +0 -0
  86. package/core/components/ui/icon/icon.js +0 -0
  87. package/core/components/ui/icon/icons.d.ts +0 -0
  88. package/core/components/ui/icon/icons.js +0 -0
  89. package/core/components/ui/icon/icons.json +0 -0
  90. package/core/components/ui/image/image.d.ts +0 -0
  91. package/core/components/ui/image/image.js +0 -0
  92. package/core/components/ui/link/link.d.ts +0 -0
  93. package/core/components/ui/link/link.js +0 -0
  94. package/core/components/ui/loader/loader.d.ts +0 -0
  95. package/core/components/ui/loader/loader.js +0 -0
  96. package/core/components/ui/loader/styles/fixed.d.ts +0 -0
  97. package/core/components/ui/loader/styles/fixed.js +0 -0
  98. package/core/components/ui/loader/styles/inline.d.ts +0 -0
  99. package/core/components/ui/loader/styles/inline.js +0 -0
  100. package/core/components/ui/menu/menu-item.d.ts +0 -0
  101. package/core/components/ui/menu/menu-item.js +0 -0
  102. package/core/components/ui/menu/menu.d.ts +0 -0
  103. package/core/components/ui/menu/menu.js +0 -0
  104. package/core/components/ui/modal/modal-actions.d.ts +0 -0
  105. package/core/components/ui/modal/modal-actions.js +0 -0
  106. package/core/components/ui/modal/modal-close.d.ts +0 -0
  107. package/core/components/ui/modal/modal-close.js +0 -0
  108. package/core/components/ui/modal/modal-content.d.ts +0 -0
  109. package/core/components/ui/modal/modal-content.js +0 -0
  110. package/core/components/ui/modal/modal-subtitle.d.ts +0 -0
  111. package/core/components/ui/modal/modal-subtitle.js +0 -0
  112. package/core/components/ui/modal/modal-title.d.ts +0 -0
  113. package/core/components/ui/modal/modal-title.js +0 -0
  114. package/core/components/ui/modal/modal.d.ts +0 -0
  115. package/core/components/ui/modal/modal.js +0 -0
  116. package/core/components/ui/pop/pop.d.ts +0 -0
  117. package/core/components/ui/pop/pop.js +0 -0
  118. package/core/components/ui/progress/progress.d.ts +0 -0
  119. package/core/components/ui/progress/progress.js +0 -0
  120. package/core/components/ui/table/table-caption.d.ts +0 -0
  121. package/core/components/ui/table/table-caption.js +0 -0
  122. package/core/components/ui/table/table-tbody.d.ts +0 -0
  123. package/core/components/ui/table/table-tbody.js +0 -0
  124. package/core/components/ui/table/table-td.d.ts +0 -0
  125. package/core/components/ui/table/table-td.js +0 -0
  126. package/core/components/ui/table/table-tfoot.d.ts +0 -0
  127. package/core/components/ui/table/table-tfoot.js +0 -0
  128. package/core/components/ui/table/table-th.d.ts +0 -0
  129. package/core/components/ui/table/table-th.js +0 -0
  130. package/core/components/ui/table/table-thead.d.ts +0 -0
  131. package/core/components/ui/table/table-thead.js +0 -0
  132. package/core/components/ui/table/table-tr.d.ts +0 -0
  133. package/core/components/ui/table/table-tr.js +0 -0
  134. package/core/components/ui/table/table.d.ts +0 -0
  135. package/core/components/ui/table/table.js +0 -0
  136. package/core/components/ui/tabs/tab.d.ts +0 -0
  137. package/core/components/ui/tabs/tab.js +0 -0
  138. package/core/components/ui/tabs/tabs.d.ts +0 -0
  139. package/core/components/ui/tabs/tabs.js +0 -0
  140. package/core/components/ui/taxonomy/taxonomy.d.ts +0 -0
  141. package/core/components/ui/taxonomy/taxonomy.js +0 -0
  142. package/core/components/ui/theme/css/tailwind.css +0 -0
  143. package/core/components/ui/theme/css/tailwind.d.ts +0 -0
  144. package/core/components/ui/theme/theme-collection/core-variables.d.ts +0 -0
  145. package/core/components/ui/theme/theme-collection/core-variables.js +0 -0
  146. package/core/components/ui/theme/theme-collection/dark.d.ts +0 -0
  147. package/core/components/ui/theme/theme-collection/dark.js +0 -0
  148. package/core/components/ui/theme/theme-collection/light.d.ts +0 -0
  149. package/core/components/ui/theme/theme-collection/light.js +0 -0
  150. package/core/components/ui/theme/theme.d.ts +0 -0
  151. package/core/components/ui/theme/theme.js +0 -0
  152. package/core/components/ui/toast/message-subscriber.d.ts +0 -0
  153. package/core/components/ui/toast/message-subscriber.js +0 -0
  154. package/core/components/ui/toast/toast-item.d.ts +0 -0
  155. package/core/components/ui/toast/toast-item.js +0 -0
  156. package/core/components/ui/toast/toast.d.ts +0 -0
  157. package/core/components/ui/toast/toast.js +0 -0
  158. package/core/components/ui/toast/types.d.ts +0 -0
  159. package/core/components/ui/toast/types.js +0 -0
  160. package/core/components/ui/tooltip/tooltip.d.ts +0 -0
  161. package/core/components/ui/tooltip/tooltip.js +0 -0
  162. package/core/components/ui/ui.d.ts +0 -0
  163. package/core/components/ui/ui.js +0 -0
  164. package/core/core.d.ts +0 -0
  165. package/core/core.js +0 -0
  166. package/core/mixins/Fetcher.d.ts +0 -0
  167. package/core/mixins/Fetcher.js +0 -0
  168. package/core/mixins/FormCheckable.d.ts +3 -5
  169. package/core/mixins/FormCheckable.js +4 -15
  170. package/core/mixins/FormElement.d.ts +0 -0
  171. package/core/mixins/FormElement.js +7 -0
  172. package/core/mixins/FormInput.d.ts +8 -5
  173. package/core/mixins/FormInput.js +39 -2
  174. package/core/mixins/Subscriber.d.ts +0 -0
  175. package/core/mixins/Subscriber.js +4 -0
  176. package/core/mixins/TemplatesContainer.d.ts +0 -0
  177. package/core/mixins/TemplatesContainer.js +0 -0
  178. package/core/mixins/mixins.d.ts +0 -0
  179. package/core/mixins/mixins.js +0 -0
  180. package/core/utils/Arrays.d.ts +0 -0
  181. package/core/utils/Arrays.js +0 -0
  182. package/core/utils/DataBindObserver.d.ts +0 -0
  183. package/core/utils/DataBindObserver.js +0 -0
  184. package/core/utils/Electron.d.ts +0 -0
  185. package/core/utils/Electron.js +0 -0
  186. package/core/utils/Format.d.ts +0 -0
  187. package/core/utils/Format.js +0 -0
  188. package/core/utils/HTML.d.ts +0 -0
  189. package/core/utils/HTML.js +0 -0
  190. package/core/utils/LocationHandler.d.ts +0 -0
  191. package/core/utils/LocationHandler.js +0 -0
  192. package/core/utils/Objects.d.ts +0 -0
  193. package/core/utils/Objects.js +0 -0
  194. package/core/utils/PublisherProxy.d.mts +0 -0
  195. package/core/utils/PublisherProxy.mjs +0 -0
  196. package/core/utils/api.d.ts +4 -0
  197. package/core/utils/api.js +25 -1
  198. package/mixins.d.ts +9 -2
  199. package/mixins.js +0 -0
  200. package/package.json +1 -1
  201. package/utils.d.ts +0 -0
  202. package/utils.js +0 -0
@@ -1,13 +1,20 @@
1
1
  import { FormElementInterface } from "@supersoniks/concorde/core/mixins/FormElement";
2
2
  declare type Constructor<T> = new (...args: any[]) => T;
3
+ declare type Type = "button" | "checkbox" | "color" | "date" | "datetime-local" | "email" | "file" | "hidden" | "image" | "month" | "number" | "password" | "radio" | "range" | "reset" | "search" | "submit" | "tel" | "text" | "time" | "url" | "week";
3
4
  declare const Form: <T extends Constructor<FormElementInterface>>(superClass: T) => {
4
5
  new (...args: any[]): {
5
6
  validateFormElement(): void;
7
+ forceAutoFill: boolean;
6
8
  /**
7
9
  * Le type De l'input, comme en html cependant tous les types ne sont pas actuellements compatibles en raison du style en vigueur
8
10
  * On peut essayer text, date, color, email par exemple, mais pas radio/checkbox/range a priori
9
11
  */
10
- type: "button" | "checkbox" | "color" | "date" | "datetime-local" | "email" | "file" | "hidden" | "image" | "month" | "number" | "password" | "radio" | "range" | "reset" | "search" | "submit" | "tel" | "text" | "time" | "url" | "week";
12
+ _type: Type;
13
+ type: Type;
14
+ _description?: string | undefined;
15
+ description: string | undefined;
16
+ _label?: string | undefined;
17
+ label: string | undefined;
11
18
  tabindex?: number | undefined;
12
19
  autocomplete?: "url" | "name" | "language" | "on" | "tel" | "email" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo" | undefined;
13
20
  getFormPublisher(): any;
@@ -20,10 +27,6 @@ declare const Form: <T extends Constructor<FormElementInterface>>(superClass: T)
20
27
  required: boolean;
21
28
  disabled: true | null;
22
29
  formDataProvider: string;
23
- /**
24
- * Le type De l'input, comme en html cependant tous les types ne sont pas actuellements compatibles en raison du style en vigueur
25
- * On peut essayer text, date, color, email par exemple, mais pas radio/checkbox/range a priori
26
- */
27
30
  _value: any;
28
31
  value: any;
29
32
  _name: string;
@@ -9,11 +9,12 @@ const Form = (superClass) => {
9
9
  class FormInput extends superClass {
10
10
  constructor(...args) {
11
11
  super();
12
+ this.forceAutoFill = false;
12
13
  /**
13
14
  * Le type De l'input, comme en html cependant tous les types ne sont pas actuellements compatibles en raison du style en vigueur
14
15
  * On peut essayer text, date, color, email par exemple, mais pas radio/checkbox/range a priori
15
16
  */
16
- this.type = "text";
17
+ this._type = "text";
17
18
  args;
18
19
  }
19
20
  validateFormElement() {
@@ -25,10 +26,46 @@ const Form = (superClass) => {
25
26
  this.getFormPublisher().isFormValid = false;
26
27
  input.reportValidity();
27
28
  }
29
+ set type(value) {
30
+ if (this.hasAttribute("type") && !this.forceAutoFill)
31
+ value = this.getAttribute("type");
32
+ this._type = value;
33
+ this.requestUpdate();
34
+ }
35
+ get type() {
36
+ return this._type;
37
+ }
38
+ get description() {
39
+ return this._description;
40
+ }
41
+ set description(value) {
42
+ if (this.hasAttribute("description") && !this.forceAutoFill)
43
+ value = this.getAttribute("description");
44
+ this._description = value;
45
+ this.requestUpdate();
46
+ }
47
+ get label() {
48
+ return this._label;
49
+ }
50
+ set label(value) {
51
+ if (this.hasAttribute("label") && !this.forceAutoFill)
52
+ value = this.getAttribute("label");
53
+ this._label = value;
54
+ this.requestUpdate();
55
+ }
28
56
  }
57
+ __decorate([
58
+ property()
59
+ ], FormInput.prototype, "forceAutoFill", void 0);
29
60
  __decorate([
30
61
  property({ type: String })
31
- ], FormInput.prototype, "type", void 0);
62
+ ], FormInput.prototype, "type", null);
63
+ __decorate([
64
+ property()
65
+ ], FormInput.prototype, "description", null);
66
+ __decorate([
67
+ property()
68
+ ], FormInput.prototype, "label", null);
32
69
  __decorate([
33
70
  property({ type: Number })
34
71
  ], FormInput.prototype, "tabindex", void 0);
File without changes
@@ -50,6 +50,7 @@ const Subscriber = (superClass) => {
50
50
  * noAutoFill permet de désactiver le remplissage automatique des propriétés par le publisher dans le cas ou on utilise "props" seulement ou le dataBinding par exemple
51
51
  */
52
52
  this.noAutoFill = false;
53
+ this.forceAutoFill = false;
53
54
  /**
54
55
  *
55
56
  */
@@ -361,6 +362,9 @@ const Subscriber = (superClass) => {
361
362
  __decorate([
362
363
  property({ type: Boolean })
363
364
  ], SubscriberElement.prototype, "noAutoFill", void 0);
365
+ __decorate([
366
+ property({ type: Boolean })
367
+ ], SubscriberElement.prototype, "forceAutoFill", void 0);
364
368
  __decorate([
365
369
  property({ type: Object })
366
370
  ], SubscriberElement.prototype, "propertyMap", void 0);
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -50,6 +50,10 @@ declare class API {
50
50
  */
51
51
  computeURL(path: String): string;
52
52
  send(path: String, data: any, method?: string, additionalHeaders?: HeadersInit): Promise<any>;
53
+ /**
54
+ * Agit comme une soumission de formulaire, mais attends un json en réponse
55
+ */
56
+ submitFormData(path: String, data: any, method?: string, additionalHeaders?: HeadersInit): Promise<any>;
53
57
  /**
54
58
  * Appel send en utilisant le méthode PUT
55
59
  */
package/core/utils/api.js CHANGED
@@ -95,7 +95,6 @@ class API {
95
95
  */
96
96
  send(path, data, method = "POST", additionalHeaders) {
97
97
  return __awaiter(this, void 0, void 0, function* () {
98
- yield this.auth();
99
98
  let headers = yield this.createHeaders(additionalHeaders);
100
99
  headers["Accept"] = "application/json";
101
100
  headers["Content-Type"] = "application/json";
@@ -114,6 +113,31 @@ class API {
114
113
  }
115
114
  });
116
115
  }
116
+ /**
117
+ * Agit comme une soumission de formulaire, mais attends un json en réponse
118
+ */
119
+ submitFormData(path, data, method = "POST", additionalHeaders) {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ let headers = yield this.createHeaders(additionalHeaders);
122
+ headers["Accept"] = "application/json";
123
+ let formData = new FormData();
124
+ for (let z in data)
125
+ formData.set(z, data[z]);
126
+ let result = yield fetch(this.computeURL(path), {
127
+ headers: headers,
128
+ method: method,
129
+ body: formData,
130
+ });
131
+ try {
132
+ let json = yield result.json();
133
+ json._sonic_http_response_ = result;
134
+ return json;
135
+ }
136
+ catch (e) {
137
+ return { _sonic_http_response_: result };
138
+ }
139
+ });
140
+ }
117
141
  /**
118
142
  * Appel send en utilisant le méthode PUT
119
143
  */
package/mixins.d.ts CHANGED
@@ -41,8 +41,7 @@ export declare const FormCheckable: <T extends new (...args: any[]) => myFormEle
41
41
  new (...args: any[]): {
42
42
  _value: string | null;
43
43
  value: string | null;
44
- _name: string;
45
- name: string;
44
+ forceAutoFill: boolean;
46
45
  unique: true | null;
47
46
  radio: true | null;
48
47
  _checked: true | null;
@@ -61,6 +60,8 @@ export declare const FormCheckable: <T extends new (...args: any[]) => myFormEle
61
60
  required: boolean;
62
61
  disabled: true | null;
63
62
  formDataProvider: string;
63
+ _name: string;
64
+ name: string;
64
65
  props: any;
65
66
  isConnected: boolean;
66
67
  getAncestorAttributeValue(attributeName: string): string;
@@ -89,7 +90,13 @@ export declare const FormElement: <T extends new (...args: any[]) => mySubscribe
89
90
  export declare const FormInput: <T extends new (...args: any[]) => myFormElement.FormElementInterface>(superClass: T) => {
90
91
  new (...args: any[]): {
91
92
  validateFormElement(): void;
93
+ forceAutoFill: boolean;
94
+ _type: "number" | "search" | "file" | "button" | "password" | "url" | "color" | "hidden" | "time" | "image" | "text" | "reset" | "submit" | "month" | "week" | "checkbox" | "radio" | "range" | "tel" | "email" | "date" | "datetime-local";
92
95
  type: "number" | "search" | "file" | "button" | "password" | "url" | "color" | "hidden" | "time" | "image" | "text" | "reset" | "submit" | "month" | "week" | "checkbox" | "radio" | "range" | "tel" | "email" | "date" | "datetime-local";
96
+ _description?: string | undefined;
97
+ description: string | undefined;
98
+ _label?: string | undefined;
99
+ label: string | undefined;
93
100
  tabindex?: number | undefined;
94
101
  autocomplete?: "url" | "name" | "language" | "on" | "tel" | "email" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo" | undefined;
95
102
  getFormPublisher(): any;
package/mixins.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supersoniks/concorde",
3
- "version": "1.1.31",
3
+ "version": "1.1.35",
4
4
  "customElements": "custom-elements.json",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
package/utils.d.ts CHANGED
File without changes
package/utils.js CHANGED
File without changes