@watermarkinsights/ripple 3.0.1 → 3.0.2-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/cjs/{global-ccb9500c.js → global-1e540de6.js} +1 -1
  2. package/dist/cjs/loader.cjs.js +2 -2
  3. package/dist/cjs/priv-datepicker.cjs.entry.js +1 -1
  4. package/dist/cjs/ripple.cjs.js +2 -2
  5. package/dist/cjs/wm-datepicker.cjs.entry.js +25 -30
  6. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.css +9 -0
  7. package/dist/collection/components/wm-datepicker/wm-datepicker.js +26 -32
  8. package/dist/esm/{global-4f914bb2.js → global-d6b49e98.js} +1 -1
  9. package/dist/esm/loader.js +2 -2
  10. package/dist/esm/priv-datepicker.entry.js +1 -1
  11. package/dist/esm/ripple.js +2 -2
  12. package/dist/esm/wm-datepicker.entry.js +25 -30
  13. package/dist/ripple/p-129d94fa.entry.js +1 -0
  14. package/dist/ripple/{p-454ad552.entry.js → p-c0fe5201.entry.js} +1 -1
  15. package/dist/ripple/{p-69a73e86.js → p-e3843249.js} +1 -1
  16. package/dist/ripple/ripple.esm.js +1 -1
  17. package/dist/types/components/wm-datepicker/wm-datepicker.d.ts +3 -3
  18. package/package.json +1 -1
  19. package/dist/cjs/app-globals-a07327ae.js +0 -47
  20. package/dist/cjs/css-shim-a7379e2b.js +0 -6
  21. package/dist/cjs/dom-3e7d9c3b.js +0 -75
  22. package/dist/cjs/functions-65513c61.js +0 -8360
  23. package/dist/cjs/global-06317e3f.js +0 -36
  24. package/dist/cjs/global-f6930bb0.js +0 -38
  25. package/dist/cjs/index-8dea8c13.js +0 -2976
  26. package/dist/cjs/shadow-css-09555044.js +0 -391
  27. package/dist/esm/app-globals-f62991a4.js +0 -45
  28. package/dist/esm/css-shim-bbdf0cc6.js +0 -4
  29. package/dist/esm/dom-1f98a75f.js +0 -73
  30. package/dist/esm/functions-316c1b23.js +0 -8340
  31. package/dist/esm/global-03372f70.js +0 -34
  32. package/dist/esm/global-fedbc323.js +0 -36
  33. package/dist/esm/index-e34aa595.js +0 -2938
  34. package/dist/esm/shadow-css-67b66845.js +0 -389
  35. package/dist/ripple/app-globals-b5693c90.js +0 -45
  36. package/dist/ripple/app-globals-d72c2d3c.js +0 -45
  37. package/dist/ripple/app-globals-f62991a4.js +0 -45
  38. package/dist/ripple/css-shim-bbdf0cc6.js +0 -4
  39. package/dist/ripple/dom-1f98a75f.js +0 -73
  40. package/dist/ripple/functions-316c1b23.js +0 -8340
  41. package/dist/ripple/http-service-5d037e16.js +0 -52
  42. package/dist/ripple/index-20b65f86.js +0 -2938
  43. package/dist/ripple/index-e34aa595.js +0 -2938
  44. package/dist/ripple/interfaces-50753346.js +0 -51
  45. package/dist/ripple/p-0c2498f4.js +0 -1
  46. package/dist/ripple/p-42ca2e15.entry.js +0 -1
  47. package/dist/ripple/p-e91befe3.js +0 -1
  48. package/dist/ripple/priv-chart-popover.entry.js +0 -85
  49. package/dist/ripple/priv-datepicker.entry.js +0 -668
  50. package/dist/ripple/priv-navigator-button.entry.js +0 -25
  51. package/dist/ripple/priv-navigator-item.entry.js +0 -30
  52. package/dist/ripple/ripple.css +0 -84
  53. package/dist/ripple/shadow-css-67b66845.js +0 -389
  54. package/dist/ripple/wm-action-menu.entry.js +0 -202
  55. package/dist/ripple/wm-button.entry.js +0 -148
  56. package/dist/ripple/wm-chart-slice.entry.js +0 -18
  57. package/dist/ripple/wm-chart.entry.js +0 -504
  58. package/dist/ripple/wm-datepicker.entry.js +0 -258
  59. package/dist/ripple/wm-input.entry.js +0 -106
  60. package/dist/ripple/wm-menuitem.entry.js +0 -114
  61. package/dist/ripple/wm-modal-footer.entry.js +0 -39
  62. package/dist/ripple/wm-modal-header.entry.js +0 -41
  63. package/dist/ripple/wm-modal.entry.js +0 -145
  64. package/dist/ripple/wm-navigator.entry.js +0 -275
  65. package/dist/ripple/wm-network-uploader.entry.js +0 -427
  66. package/dist/ripple/wm-option.entry.js +0 -119
  67. package/dist/ripple/wm-pagination.entry.js +0 -172
  68. package/dist/ripple/wm-search.entry.js +0 -227
  69. package/dist/ripple/wm-select.entry.js +0 -362
  70. package/dist/ripple/wm-snackbar.entry.js +0 -156
  71. package/dist/ripple/wm-tab-item.entry.js +0 -78
  72. package/dist/ripple/wm-tab-list.entry.js +0 -201
  73. package/dist/ripple/wm-tab-panel.entry.js +0 -38
  74. package/dist/ripple/wm-tag-input.entry.js +0 -534
  75. package/dist/ripple/wm-timepicker.entry.js +0 -382
  76. package/dist/ripple/wm-toggletip.entry.js +0 -124
  77. package/dist/ripple/wm-uploader.entry.js +0 -338
  78. package/dist/ripple/wm-wrapper.entry.js +0 -17
  79. package/dist/types/components/wm-tag-input/wm-tag-input.d.ts~ds312_tagInputMaxTags +0 -87
  80. package/dist/types/components.d.ts~ds312_tagInputMaxTags +0 -879
  81. package/dist/types/stencil-public-runtime.d.ts~ds312_tagInputMaxTags +0 -1555
@@ -1,382 +0,0 @@
1
- import { r as registerInstance, e as createEvent, h, f as Host, g as getElement } from './index-e34aa595.js';
2
- import { i as intl, g as generateId, a as shouldOpenUp, h as isRelatedTarget } from './functions-316c1b23.js';
3
-
4
- const wmTimepickerCss = "@charset \"UTF-8\";:host,wm-timepicker{font-family:inherit}:host *,wm-timepicker *{box-sizing:border-box}:host .sr-only,wm-timepicker .sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;border:0 !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;clip-path:inset(50%) !important;white-space:nowrap !important;margin:-1px !important}:host .wrapper,wm-timepicker .wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;font-size:0.875rem}:host .wrapper .label,wm-timepicker .wrapper .label{display:block;line-height:normal;font-weight:600;white-space:nowrap;margin-bottom:0.25rem}:host .wrapper .label .required,wm-timepicker .wrapper .label .required{color:#c0392b}:host .wrapper.label-left,wm-timepicker .wrapper.label-left{flex-direction:row}:host .wrapper.label-left .label-wrapper,wm-timepicker .wrapper.label-left .label-wrapper{line-height:2.5rem}:host .wrapper.label-left .label-wrapper .label,wm-timepicker .wrapper.label-left .label-wrapper .label{display:flex;align-items:center;min-height:2.5rem;white-space:normal;margin-bottom:0;margin-right:0.75rem}:host .wrapper.label-none label,wm-timepicker .wrapper.label-none label{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;border:0 !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;clip-path:inset(50%) !important;white-space:nowrap !important;margin:-1px !important}:host .wrapper.invalid .label,wm-timepicker .wrapper.invalid .label{color:#c0392b}:host .wrapper.invalid .label:after,wm-timepicker .wrapper.invalid .label:after{display:inline-block;font:normal normal normal 24px/1 \"Material Design Icons\";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\";margin-left:0.3125rem}[dir=RTL] :host .wrapper.invalid .label:after,[dir=RTL] wm-timepicker .wrapper.invalid .label:after{margin-left:0;margin-right:0.3125rem}:host .wrapper.rtl.label-left .label,wm-timepicker .wrapper.rtl.label-left .label{margin-right:0;margin-left:0.75rem}:host .wrapper .inner-wrapper,wm-timepicker .wrapper .inner-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;align-items:center;height:2.5rem;border:1px solid #4a4a4a;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;border-radius:3px;max-width:236px;justify-content:space-between;position:relative}:host .wrapper .inner-wrapper input,wm-timepicker .wrapper .inner-wrapper input{-moz-border-top-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-bottom-left-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;border:none;font-size:0.875rem;padding:0.625rem 0.9375rem 0.5rem;min-width:0;height:100%;flex:1;margin:0}:host .wrapper .inner-wrapper input:disabled,wm-timepicker .wrapper .inner-wrapper input:disabled{background-color:#f0f0f0;color:#737373}:host .wrapper .inner-wrapper input:focus,wm-timepicker .wrapper .inner-wrapper input:focus{outline:none}:host .wrapper .inner-wrapper button,wm-timepicker .wrapper .inner-wrapper button{all:unset;cursor:pointer;padding:0 0.375rem;height:2.375rem;background-color:#fff;border:none;-moz-border-top-right-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-bottom-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-top-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-bottom-left-radius:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}:host .wrapper .inner-wrapper button .clock::after,wm-timepicker .wrapper .inner-wrapper button .clock::after{display:inline-block;font:normal normal normal 24px/1 \"Material Design Icons\";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\";color:#575195;font-size:1.5rem;padding:0;line-height:2.5rem}:host .wrapper .inner-wrapper button:hover,wm-timepicker .wrapper .inner-wrapper button:hover{background:#e6e6e6;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}:host .wrapper .inner-wrapper button:disabled,wm-timepicker .wrapper .inner-wrapper button:disabled{background-color:rgba(74, 74, 74, 0.05);pointer-events:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}:host .wrapper .inner-wrapper button:disabled .clock::after,wm-timepicker .wrapper .inner-wrapper button:disabled .clock::after{color:#7b7b7b}[dir=RTL] :host .wrapper .inner-wrapper button,[dir=RTL] wm-timepicker .wrapper .inner-wrapper button{right:auto;left:0}:host .wrapper .inner-wrapper button:focus,wm-timepicker .wrapper .inner-wrapper button:focus{outline:none}:host .wrapper .inner-wrapper button.user-is-tabbing:focus,wm-timepicker .wrapper .inner-wrapper button.user-is-tabbing:focus{-webkit-box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e;-moz-box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e;box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e}:host .wrapper .inner-wrapper button.user-is-tabbing:focus::-moz-focus-inner,wm-timepicker .wrapper .inner-wrapper button.user-is-tabbing:focus::-moz-focus-inner{border:0}:host .wrapper .inner-wrapper button::-moz-focus-inner,wm-timepicker .wrapper .inner-wrapper button::-moz-focus-inner{border:0}:host .wrapper .inner-wrapper .options,wm-timepicker .wrapper .inner-wrapper .options{margin:0;padding:0;-webkit-overflow-scrolling:touch;overflow:auto;max-height:19.0625rem;-webkit-box-shadow:0 4px 15px 0 rgba(0, 0, 0, 0.2);-moz-box-shadow:0 4px 15px 0 rgba(0, 0, 0, 0.2);box-shadow:0 4px 15px 0 rgba(0, 0, 0, 0.2);-ms-transition:transform 0.25s ease;-webkit-transition:transform 0.25s ease;-moz-transition:transform 0.25s ease;transition:transform 0.25s ease;-ms-transform:scale(1, 0);-webkit-transform:scale(1, 0);-moz-transform:scale(1, 0);transform:scale(1, 0);-ms-transform-origin:center top;-webkit-transform-origin:center top;-moz-transform-origin:center top;transform-origin:center top;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;border-radius:3px;position:absolute;top:2.5rem;right:0;background:#fff;z-index:100;width:100%;font-size:0.875rem}:host .wrapper .inner-wrapper .options.upwards,wm-timepicker .wrapper .inner-wrapper .options.upwards{top:unset;bottom:2.5rem;-ms-transform-origin:center bottom;-webkit-transform-origin:center bottom;-moz-transform-origin:center bottom;transform-origin:center bottom}:host .wrapper .inner-wrapper .options.hidden,wm-timepicker .wrapper .inner-wrapper .options.hidden{visibility:hidden}:host .wrapper .inner-wrapper .options [role=option],wm-timepicker .wrapper .inner-wrapper .options [role=option]{display:block;cursor:pointer;position:relative;padding:1.25rem;background:#fff;font-family:inherit;list-style:none;color:#4a4a4a}:host .wrapper .inner-wrapper .options [role=option]:hover,wm-timepicker .wrapper .inner-wrapper .options [role=option]:hover{background:#f4f4f4;outline:none}:host .wrapper .inner-wrapper .options [role=option][aria-selected=true],wm-timepicker .wrapper .inner-wrapper .options [role=option][aria-selected=true]{outline:none;background:#f4f4f4}:host .wrapper .inner-wrapper .options [role=option]:not(:last-child),wm-timepicker .wrapper .inner-wrapper .options [role=option]:not(:last-child){border-bottom:2px solid rgba(46, 27, 70, 0.05)}:host .wrapper .inner-wrapper .options.open,wm-timepicker .wrapper .inner-wrapper .options.open{-ms-transform:scale(1, 1);-webkit-transform:scale(1, 1);-moz-transform:scale(1, 1);transform:scale(1, 1)}:host .wrapper.invalid .inner-wrapper,wm-timepicker .wrapper.invalid .inner-wrapper{-webkit-box-shadow:0 0 0 1px #c0392b;-moz-box-shadow:0 0 0 1px #c0392b;box-shadow:0 0 0 1px #c0392b;border-color:#c0392b}:host .wrapper.invalid .error,wm-timepicker .wrapper.invalid .error{color:#c0392b;margin-top:4px;margin-bottom:4px;display:block;top:100%;left:0;font-style:italic}:host .wrapper:focus .inner-wrapper,:host .wrapper.focus .inner-wrapper,wm-timepicker .wrapper:focus .inner-wrapper,wm-timepicker .wrapper.focus .inner-wrapper{-webkit-box-shadow:0 0 0 1px #20cbd4;-moz-box-shadow:0 0 0 1px #20cbd4;box-shadow:0 0 0 1px #20cbd4;outline:none;border-color:#20cbd4}";
5
-
6
- const Timepicker = class {
7
- constructor(hostRef) {
8
- registerInstance(this, hostRef);
9
- this.wmTimepickerOnChange = createEvent(this, "wmTimepickerOnChange", 7);
10
- this.disabled = false;
11
- this.value = "";
12
- this.label = "";
13
- this.labelPosition = "top";
14
- this.requiredField = false;
15
- this.isExpanded = false;
16
- this.isTabbing = false;
17
- this.twelveHrValid = /^(0?[0-9]|1[0-2])\s*:?\s*([0-5][0-9])?\s?(a|p|am|pm)?$/i;
18
- this.twentyFourHrValid = /^(0?[0-9]|1[0-9]|2[0-4])\s*:?\s*([0-5][0-9])?$/;
19
- this.uid = "";
20
- this.timeFormat = "hh:mm";
21
- this.times = [];
22
- this.openUp = false;
23
- this.buttonAriaLabel = intl.formatMessage({
24
- id: "time.selectTime",
25
- defaultMessage: "Select time",
26
- });
27
- }
28
- toggleTabbingOn() {
29
- this.isTabbing = true;
30
- }
31
- toggleTabbingOff() {
32
- this.isTabbing = false;
33
- }
34
- blurHandler(ev) {
35
- if (ev.target !== this.el && this.isExpanded) {
36
- this.close();
37
- }
38
- }
39
- handleKey(ev) {
40
- switch (ev.key) {
41
- case "ArrowDown":
42
- ev.preventDefault();
43
- if (this.isExpanded === false) {
44
- this.open("next");
45
- }
46
- else {
47
- this.moveDown(this.selectedOption);
48
- }
49
- break;
50
- case "ArrowUp":
51
- ev.preventDefault();
52
- if (this.isExpanded === false) {
53
- this.open("previous");
54
- }
55
- else {
56
- this.moveUp(this.selectedOption);
57
- }
58
- break;
59
- case "Enter":
60
- case " ":
61
- if (this.isExpanded) {
62
- ev.preventDefault();
63
- this.handleOptionClick(this.selectedOption.textContent);
64
- }
65
- break;
66
- case "Escape":
67
- ev.preventDefault();
68
- if (this.isExpanded) {
69
- ev.stopPropagation(); // for instance if select is in a modal, esc should close the select but not the modal
70
- this.close();
71
- }
72
- break;
73
- case "Tab":
74
- if (this.isExpanded) {
75
- this.close();
76
- }
77
- break;
78
- case "Home":
79
- ev.preventDefault();
80
- if (this.isExpanded) {
81
- this.focusOption(this.optionsList[0]);
82
- this.setDropdownPosition("first");
83
- }
84
- break;
85
- case "End":
86
- ev.preventDefault();
87
- if (this.isExpanded) {
88
- this.focusOption(this.optionsList[this.optionsList.length - 1]);
89
- this.setDropdownPosition("last");
90
- }
91
- break;
92
- }
93
- }
94
- updateErrorState() {
95
- this.displayedErrorMessage = this.errorMessage;
96
- }
97
- componentWillLoad() {
98
- if (this.label === "") {
99
- throw new Error("You must include a label prop for the datepicker input (for accessibility requirements), even if the label position is none.");
100
- }
101
- this.el.focus = function () {
102
- if (!this.disabled) {
103
- this.shadowRoot.querySelector("input").focus();
104
- }
105
- };
106
- this.uid = this.el.id ? this.el.id : generateId();
107
- this.updateErrorState();
108
- this.timeFormat = intl.formatMessage({
109
- id: "time.timeFormat",
110
- defaultMessage: "hh:mm",
111
- });
112
- this.times = this.generateTimes();
113
- }
114
- componentDidLoad() {
115
- this.optionsEl.classList.add("hidden");
116
- this.optionsList = Array.from(this.optionsEl.querySelectorAll("li"));
117
- if (this.value) {
118
- this.processInput();
119
- }
120
- }
121
- isValidTime(input) {
122
- return this.twelveHrValid.test(input) || this.twentyFourHrValid.test(input);
123
- }
124
- generateTimes() {
125
- let times = [];
126
- let startTime = 0;
127
- for (let i = 0; startTime < 24 * 60; i++) {
128
- const h = Math.floor(startTime / 60);
129
- const hour = h.toString().padStart(2, "0");
130
- const m = (startTime % 60).toString();
131
- const min = m.padStart(2, "0");
132
- times[i] = `${hour}:${min}`;
133
- startTime = startTime + 15;
134
- }
135
- return times;
136
- }
137
- findNearestTimeInterval(time) {
138
- let formattedTime = this.formatToStorage(time);
139
- const minutes = parseInt(formattedTime.slice(3, 5));
140
- // first find the closest 15 min increment
141
- if (minutes % 15 !== 0) {
142
- const hour = parseInt(formattedTime.slice(0, 2));
143
- let roundedMinutes = (Math.round(minutes / 15) * 15).toString().padStart(2, "0");
144
- if (roundedMinutes === "60") {
145
- roundedMinutes = "00";
146
- let roundedHour = hour + 1;
147
- if (roundedHour === 24) {
148
- roundedHour = 0;
149
- }
150
- formattedTime = formattedTime.replace(`${hour.toString().padStart(2, "0")}:`, `${roundedHour.toString().padStart(2, "0")}:`);
151
- }
152
- if (parseInt(roundedMinutes) < 8) {
153
- roundedMinutes = "00";
154
- }
155
- time = formattedTime.replace(`:${minutes.toString().padStart(2, "0")}`, `:${roundedMinutes}`);
156
- }
157
- return time;
158
- }
159
- handleListSelection(time) {
160
- time = this.findNearestTimeInterval(time);
161
- const option = this.optionsList.filter((o) => o.textContent == this.formatToDisplay(time))[0];
162
- // not DOM focus, just setting the proper ARIA attributes
163
- option && this.focusOption(option);
164
- }
165
- setValue(time) {
166
- this.inputEl.value = this.formatToDisplay(time);
167
- this.value = this.formatToStorage(time);
168
- // update the selection in the list
169
- // so it opens on the closest item
170
- this.handleListSelection(time);
171
- this.wmTimepickerOnChange.emit({
172
- value: this.value,
173
- isValid: !!this.displayedErrorMessage,
174
- });
175
- }
176
- processInput() {
177
- if (this.isValidTime(this.value)) {
178
- this.setValue(this.value);
179
- }
180
- const newErrorMessage = this.determineErrorMessage();
181
- this.displayedErrorMessage = newErrorMessage;
182
- }
183
- determineErrorMessage() {
184
- let message = this.errorMessage;
185
- const requiredError = intl.formatMessage({
186
- id: "time.requiredError",
187
- defaultMessage: "A time is required.",
188
- });
189
- const invalidError = intl.formatMessage({
190
- id: "time.invalidTime",
191
- defaultMessage: "Please enter a valid time.",
192
- });
193
- const isValid = this.isValidTime(this.value);
194
- if (isValid && !this.errorMessage) {
195
- message = null;
196
- }
197
- else if (!isValid && !this.errorMessage) {
198
- if (this.requiredField && !this.value) {
199
- message = requiredError;
200
- }
201
- else if (this.value) {
202
- message = invalidError;
203
- }
204
- else {
205
- message = null;
206
- }
207
- }
208
- return message;
209
- }
210
- splitTime(time) {
211
- const splitTime = this.twelveHrValid.exec(time) || this.twentyFourHrValid.exec(time);
212
- let hours = parseInt(splitTime[1]);
213
- let minutes = splitTime[2] || "00";
214
- let amPm = splitTime ? splitTime[3] : undefined;
215
- // handles edge case uncaught by regex '0pm'
216
- if (hours === 0 && (amPm === null || amPm === void 0 ? void 0 : amPm.toUpperCase().includes("P"))) {
217
- // if user types '0pm' we change it to midnight
218
- amPm = "AM";
219
- }
220
- return [hours, minutes, amPm];
221
- }
222
- formatToDisplay(time) {
223
- let [hours, minutes, amPm] = this.splitTime(time);
224
- // at the moment the component only displays in 12hr AM/PM
225
- if (hours === 12 && !amPm) {
226
- amPm = "PM";
227
- }
228
- if (hours === 0 || hours === 24) {
229
- hours = 12;
230
- }
231
- if (hours > 12) {
232
- hours -= 12;
233
- amPm = "PM";
234
- }
235
- if (amPm && amPm.toUpperCase().includes("P")) {
236
- amPm = "PM";
237
- }
238
- else {
239
- amPm = "AM";
240
- }
241
- return `${hours.toString().padStart(2, "0")}:${minutes} ${amPm}`;
242
- }
243
- formatToStorage(time) {
244
- let [hours, minutes, amPm] = this.splitTime(time);
245
- if (hours === 24) {
246
- hours = 0;
247
- }
248
- if (hours === 12 && amPm && amPm.toUpperCase().includes("A")) {
249
- hours -= 12;
250
- }
251
- if (amPm && amPm.toUpperCase().includes("P") && hours !== 12) {
252
- hours += 12;
253
- }
254
- return `${hours.toString().padStart(2, "0")}:${minutes}`;
255
- }
256
- open(itemToSelect) {
257
- this.el.focus();
258
- this.openUp = shouldOpenUp(this.el, this.optionsEl);
259
- this.isExpanded = true;
260
- this.optionsEl.classList.remove("hidden");
261
- if (this.errorMessage || !this.value) {
262
- this.handleListSelection("09:00");
263
- }
264
- this.setDropdownPosition("center", this.selectedOption);
265
- window.requestAnimationFrame(() => {
266
- if (itemToSelect === "next") {
267
- this.moveDown(this.selectedOption);
268
- }
269
- else if (itemToSelect === "previous") {
270
- this.moveUp(this.selectedOption);
271
- }
272
- });
273
- }
274
- close() {
275
- this.isExpanded = false;
276
- window.setTimeout(() => {
277
- this.optionsEl.classList.add("hidden");
278
- // Returns focus to button after popup closes (no need if user is tabbing)
279
- // Delay is necessary for screenreader to get new expanded state before focus
280
- // window.requestAnimationFrame is probably enough, but since we are already using setTimeout it may as well be here
281
- // also UX wise, it makes sense for the button to only be focused after the animation is complete
282
- this.buttonEl.focus();
283
- }, 150);
284
- }
285
- focusOption(item) {
286
- // not an actual focus, just accessibility stuff
287
- this.optionsList.forEach((option) => {
288
- option.removeAttribute("aria-selected");
289
- });
290
- this.inputEl.setAttribute("aria-activedescendant", item.id);
291
- item.setAttribute("aria-selected", "true");
292
- this.selectedOption = item;
293
- }
294
- setDropdownPosition(position, item) {
295
- switch (position) {
296
- case "top":
297
- const prevItem = item === null || item === void 0 ? void 0 : item.previousElementSibling;
298
- this.optionsEl.scrollTop =
299
- prevItem.getBoundingClientRect().top - this.optionsEl.getBoundingClientRect().top + this.optionsEl.scrollTop;
300
- break;
301
- case "bottom":
302
- const nextItem = item === null || item === void 0 ? void 0 : item.nextElementSibling;
303
- this.optionsEl.scrollTop =
304
- nextItem.getBoundingClientRect().bottom -
305
- this.optionsEl.getBoundingClientRect().top +
306
- this.optionsEl.scrollTop -
307
- this.optionsEl.offsetHeight;
308
- break;
309
- case "center":
310
- this.optionsEl.scrollTop =
311
- (this.optionsList.findIndex((x) => x.textContent === (item === null || item === void 0 ? void 0 : item.textContent)) - 2) * item.offsetHeight;
312
- break;
313
- case "first":
314
- this.optionsEl.scrollTop = 0;
315
- break;
316
- case "last":
317
- this.optionsEl.scrollTop = this.optionsList[0].clientHeight * this.optionsList.length;
318
- break;
319
- }
320
- }
321
- moveUp(el) {
322
- const prevEl = el.previousElementSibling;
323
- if (prevEl) {
324
- // scroll option to top of dropdown if partially obscured / out of view
325
- if (prevEl.getBoundingClientRect().top < this.optionsEl.getBoundingClientRect().top) {
326
- this.setDropdownPosition("top", el);
327
- }
328
- this.focusOption(prevEl);
329
- }
330
- else {
331
- this.focusOption(this.optionsList[this.optionsList.length - 1]);
332
- this.setDropdownPosition("last");
333
- }
334
- }
335
- moveDown(el) {
336
- const nextEl = el.nextElementSibling;
337
- if (nextEl) {
338
- // scroll option to bottom of dropdown if partially obscured / out of view
339
- if (nextEl.getBoundingClientRect().bottom > this.optionsEl.getBoundingClientRect().bottom) {
340
- this.setDropdownPosition("bottom", el);
341
- }
342
- this.focusOption(nextEl);
343
- }
344
- else {
345
- this.focusOption(this.optionsList[0]);
346
- this.setDropdownPosition("first");
347
- }
348
- }
349
- handleOptionClick(time) {
350
- this.close();
351
- this.value = time;
352
- this.processInput();
353
- }
354
- handleInput() {
355
- this.value = this.inputEl.value;
356
- if (this.isValidTime(this.value)) {
357
- this.handleListSelection(this.findNearestTimeInterval(this.value));
358
- this.setDropdownPosition("center", this.selectedOption);
359
- }
360
- }
361
- handleBlur(ev) {
362
- // do not validate if clicking to an element that should prevent validation (e.g. close button on modal)
363
- const shouldPreventValidation = this.preventValidation && isRelatedTarget(ev, this.preventValidation);
364
- if (!shouldPreventValidation) {
365
- this.processInput();
366
- }
367
- this.tpWrapper.classList.remove("focus");
368
- }
369
- renderOptions() {
370
- return this.times.map((time, index) => (h("li", { id: `option${index + 1}`, role: "option", "aria-selected": time === "09:00" ? "true" : false, onClick: () => this.handleOptionClick(time) }, this.formatToDisplay(time))));
371
- }
372
- render() {
373
- return (h(Host, { id: this.uid, invalid: !!this.displayedErrorMessage ? "true" : null }, h("div", { class: `wrapper label-${this.labelPosition} ${!!this.displayedErrorMessage ? "invalid" : ""}`, ref: (t) => (this.tpWrapper = t) }, h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { id: `label-${this.uid}`, class: "label", htmlFor: `time-input-${this.uid}` }, this.label, this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))), h("div", null, h("div", { class: "inner-wrapper" }, h("input", { id: `time-input-${this.uid}`, "aria-label": this.label, "aria-describedby": `error-${this.uid}`, ref: (el) => (this.inputEl = el), onBlur: (ev) => this.handleBlur(ev), onInput: () => this.handleInput(), disabled: this.disabled, required: this.requiredField, placeholder: this.timeFormat, autocomplete: "off", onFocus: () => this.tpWrapper.classList.add("focus") }), h("button", { id: `btn-${this.uid}`, class: this.isTabbing ? "user-is-tabbing" : "", ref: (el) => (this.buttonEl = el), disabled: this.disabled, "aria-controls": `list-${this.uid}`, "aria-expanded": this.isExpanded ? "true" : "false", "aria-label": this.buttonAriaLabel, "aria-describedby": `time-input-${this.uid}`, onClick: () => (this.isExpanded ? this.close() : this.open()) }, h("span", { class: "clock" })), h("ul", { class: `options ${this.isExpanded ? "open" : ""} ${this.openUp ? "upwards" : ""}`, id: `list-${this.uid}`, role: "listbox", "aria-labelledby": `label-${this.uid}`, "aria-describedby": this.isExpanded ? "collapsed" : null, ref: (el) => (this.optionsEl = el) }, this.renderOptions())), h("div", { id: `error-${this.uid}`, class: "error", "aria-live": "assertive", "aria-atomic": "true" }, this.displayedErrorMessage)))));
374
- }
375
- get el() { return getElement(this); }
376
- static get watchers() { return {
377
- "errorMessage": ["updateErrorState"]
378
- }; }
379
- };
380
- Timepicker.style = wmTimepickerCss;
381
-
382
- export { Timepicker as wm_timepicker };
@@ -1,124 +0,0 @@
1
- import { r as registerInstance, h, f as Host, g as getElement } from './index-e34aa595.js';
2
- import { i as intl, a as shouldOpenUp, o as shouldOpenDown, s as shouldShiftRight, p as shouldShiftLeft } from './functions-316c1b23.js';
3
-
4
- const wmToggletipCss = "@charset \"UTF-8\";:host,wm-toggletip{display:inline-block;position:relative;height:40px;width:40px}:host .button,wm-toggletip .button{display:flex;background:none;border:none;padding:0;width:inherit;height:inherit;border-radius:50%;justify-content:center;align-items:center;position:relative;cursor:pointer}:host .button:before,wm-toggletip .button:before{display:inline-block;font:normal normal normal 24px/1 \"Material Design Icons\";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\";font-size:16px;color:#4a4a4a;background:radial-gradient(white 40%, transparent 0%)}:host .button:focus,wm-toggletip .button:focus{outline:none}:host .button:focus.user-is-tabbing,wm-toggletip .button:focus.user-is-tabbing{-webkit-box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e;-moz-box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e;box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e}:host .button:focus.user-is-tabbing::-moz-focus-inner,wm-toggletip .button:focus.user-is-tabbing::-moz-focus-inner{border:0}:host .tooltip,wm-toggletip .tooltip{position:absolute;opacity:0;width:1px;height:1px;overflow:hidden;clip:rect(0, 0, 0, 0);pointer-events:none;font-family:inherit;font-size:0.875rem;text-transform:none;font-weight:normal;background:black;color:#fff;padding:0.375rem;line-height:normal;z-index:30;white-space:nowrap}:host .tooltip.hover,wm-toggletip .tooltip.hover{clip:auto;width:auto;height:auto;opacity:1;transition:opacity 500ms 500ms;padding:0.375rem;white-space:nowrap}:host .toggletip,wm-toggletip .toggletip{position:absolute;max-width:13.75rem;width:max-content;padding:0.5rem 0.75rem;border-radius:0.1875rem;background:#4a4a4a;color:white;font-size:14px;z-index:30}:host .toggletip.top:before,wm-toggletip .toggletip.top:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;top:100%;border-top-color:#4a4a4a;border-top-width:0.25rem;border-left-width:0.375rem;border-right-width:0.375rem;margin-left:-0.375rem;left:50%}:host .toggletip.bottom:before,wm-toggletip .toggletip.bottom:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;bottom:100%;border-bottom-color:#4a4a4a;border-bottom-width:0.25rem;border-left-width:0.375rem;border-right-width:0.375rem;margin-left:-0.375rem;left:50%}:host .toggletip.right:before,wm-toggletip .toggletip.right:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;bottom:100%;border-right-color:#4a4a4a;border-right-width:0.25rem;border-top-width:0.375rem;border-bottom-width:0.375rem;border-left-width:0px;top:calc(50% - 6px);left:-0.1875rem}:host .toggletip.left:before,wm-toggletip .toggletip.left:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;bottom:100%;border-left-color:#4a4a4a;border-left-width:0.25rem;border-top-width:0.375rem;border-bottom-width:0.375rem;border-right-width:0px;top:calc(50% - 6px);right:-0.1875rem}:host .toggletip.bottom-right:before,wm-toggletip .toggletip.bottom-right:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;bottom:100%;border-bottom-color:#4a4a4a;border-bottom-width:0.25rem;border-left-width:0.375rem;border-right-width:0.375rem;margin-left:-0.375rem;left:50%;margin-left:unset;left:0.875rem}:host .toggletip.bottom-left:before,wm-toggletip .toggletip.bottom-left:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;bottom:100%;border-bottom-color:#4a4a4a;border-bottom-width:0.25rem;border-left-width:0.375rem;border-right-width:0.375rem;margin-left:-0.375rem;left:50%;left:unset;margin-left:unset;right:0.875rem}:host .toggletip.top-right:before,wm-toggletip .toggletip.top-right:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;top:100%;border-top-color:#4a4a4a;border-top-width:0.25rem;border-left-width:0.375rem;border-right-width:0.375rem;margin-left:-0.375rem;left:50%;margin-left:unset;left:0.875rem}:host .toggletip.top-left:before,wm-toggletip .toggletip.top-left:before{content:\"\";position:absolute;border:solid transparent;height:0;width:0;pointer-events:none;top:100%;border-top-color:#4a4a4a;border-top-width:0.25rem;border-left-width:0.375rem;border-right-width:0.375rem;margin-left:-0.375rem;left:50%;left:unset;margin-left:unset;right:0.875rem}:host .toggletip.hidden,wm-toggletip .toggletip.hidden{transform:scale(0, 0) !important;visibility:hidden}:host .toggletip.top,:host .tooltip.top,wm-toggletip .toggletip.top,wm-toggletip .tooltip.top{transform:translate(-50%, 0%);bottom:40px;left:20px}:host .toggletip.bottom,:host .tooltip.bottom,wm-toggletip .toggletip.bottom,wm-toggletip .tooltip.bottom{transform:translate(-50%, 0%);top:40px;left:20px}:host .toggletip.right,:host .tooltip.right,wm-toggletip .toggletip.right,wm-toggletip .tooltip.right{transform:translate(100%, calc(-50% - 20px));right:0px}:host .toggletip.left,:host .tooltip.left,wm-toggletip .toggletip.left,wm-toggletip .tooltip.left{transform:translate(-100%, calc(-50% - 20px));left:0px}:host .toggletip.bottom-right,:host .tooltip.bottom-right,wm-toggletip .toggletip.bottom-right,wm-toggletip .tooltip.bottom-right{top:40px;left:0px}:host .toggletip.bottom-left,:host .tooltip.bottom-left,wm-toggletip .toggletip.bottom-left,wm-toggletip .tooltip.bottom-left{top:40px;right:0px}:host .toggletip.top-right,:host .tooltip.top-right,wm-toggletip .toggletip.top-right,wm-toggletip .tooltip.top-right{bottom:40px;left:0px}:host .toggletip.top-left,:host .tooltip.top-left,wm-toggletip .toggletip.top-left,wm-toggletip .tooltip.top-left{bottom:40px;right:0px}:host .sr-only,wm-toggletip .sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;border:0 !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;clip-path:inset(50%) !important;white-space:nowrap !important;margin:-1px !important}";
5
-
6
- const Toggletip = class {
7
- constructor(hostRef) {
8
- registerInstance(this, hostRef);
9
- this.tooltipPosition = "bottom-right";
10
- this.isOpen = false;
11
- this.isTabbing = false;
12
- this.tooltipMessage = intl.formatMessage({
13
- id: "toggletip.moreInformation",
14
- defaultMessage: "More information",
15
- });
16
- }
17
- componentWillLoad() {
18
- const validTooltipPositions = [
19
- "top",
20
- "right",
21
- "bottom",
22
- "left",
23
- "top-right",
24
- "top-left",
25
- "bottom-right",
26
- "bottom-left",
27
- ];
28
- if (!this.label) {
29
- console.error("wm-toggletip must have a label property");
30
- }
31
- if (!this.tooltipText) {
32
- console.error("wm-toggletip must have a tooltip-text property");
33
- }
34
- if (!validTooltipPositions.includes(this.tooltipPosition)) {
35
- console.error(`wm-toggletip property tooltip-position has an invalid value of "${this.tooltipPosition}", make sure to use one of the following values: ${validTooltipPositions}`);
36
- }
37
- this.el.focus = function () {
38
- this.shadowRoot.querySelector("button").focus();
39
- };
40
- }
41
- handleKeydown(ev) {
42
- switch (ev.key) {
43
- case "Escape":
44
- ev.preventDefault();
45
- if (this.isOpen) {
46
- ev.stopPropagation(); // prevent closing modal if within one
47
- this.close();
48
- }
49
- break;
50
- case "Tab":
51
- if (this.isOpen) {
52
- this.close();
53
- }
54
- }
55
- }
56
- toggleTabbingOn() {
57
- this.isTabbing = true;
58
- }
59
- toggleTabbingOff() {
60
- this.isTabbing = false;
61
- }
62
- handleClick(ev) {
63
- if (this.isOpen) {
64
- if (ev.target === this.el || this.el.contains(ev.target)) {
65
- // Re-announce if clicking any part of the component while open
66
- this.announceToggletip();
67
- }
68
- else {
69
- this.close();
70
- }
71
- }
72
- }
73
- open() {
74
- this.isOpen = true;
75
- this.announceToggletip();
76
- }
77
- close() {
78
- this.isOpen = false;
79
- this.hideTooltip();
80
- }
81
- showTooltip() {
82
- // Because a :hover pseudoclass would apply before the tooltip is repositioned, hover styles must be applied through a class
83
- // Otherwise, the tooltip will flash on-screen and possibly create scrollbars
84
- this.setToggletipPosition();
85
- this.tooltipEl.classList.add("hover");
86
- }
87
- hideTooltip() {
88
- this.tooltipEl.classList.remove("hover");
89
- }
90
- announceToggletip() {
91
- this.liveRegionEl.innerHTML = "";
92
- setTimeout(() => {
93
- this.liveRegionEl.innerHTML = this.tooltipText;
94
- }, 10);
95
- }
96
- setToggletipPosition() {
97
- // Vertical
98
- if (this.tooltipPosition.includes("bottom") && shouldOpenUp(this.el, this.toggletipEl)) {
99
- this.tooltipPosition = this.tooltipPosition.replace("bottom", "top");
100
- }
101
- else if (this.tooltipPosition.includes("top") && shouldOpenDown(this.el, this.toggletipEl)) {
102
- this.tooltipPosition = this.tooltipPosition.replace("top", "bottom");
103
- }
104
- // Horizontal
105
- if (this.tooltipPosition.includes("left") && shouldShiftRight(this.el, this.toggletipEl)) {
106
- this.tooltipPosition = this.tooltipPosition.replace("left", "right");
107
- }
108
- else if (this.tooltipPosition.includes("right") && shouldShiftLeft(this.el, this.toggletipEl)) {
109
- this.tooltipPosition = this.tooltipPosition.replace("right", "left");
110
- }
111
- }
112
- render() {
113
- return (h(Host, null, h("button", { class: `button ${this.isTabbing ? "user-is-tabbing" : ""}`, type: "button", "aria-label": this.label, onClick: () => {
114
- this.setToggletipPosition();
115
- this.open();
116
- },
117
- // In order to position the tooltip identically to the toggletip, it's presence is determined by these four events
118
- onMouseEnter: () => this.showTooltip(), onMouseLeave: () => this.hideTooltip(), onFocus: () => this.showTooltip(), onBlur: () => this.hideTooltip() }), h("div", { ref: (el) => (this.tooltipEl = el), class: `tooltip ${this.tooltipPosition} ${this.isOpen ? "hidden" : ""}`, "aria-hidden": "true" }, this.tooltipMessage), h("div", { ref: (el) => (this.toggletipEl = el), class: `toggletip ${this.isOpen ? "" : "hidden"} ${this.tooltipPosition}` }, this.tooltipText), h("div", { ref: (el) => (this.liveRegionEl = el), class: "live-region sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true" })));
119
- }
120
- get el() { return getElement(this); }
121
- };
122
- Toggletip.style = wmToggletipCss;
123
-
124
- export { Toggletip as wm_toggletip };