@melodicdev/components 1.0.21 → 1.1.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 (31) hide show
  1. package/assets/melodic-components.js +4 -2
  2. package/assets/melodic-components.js.map +1 -1
  3. package/assets/melodic-components.min.js +4 -3
  4. package/lib/components/forms/date-picker/date-picker.styles.js +2 -2
  5. package/lib/components/forms/date-time-picker/date-time-picker.component.d.ts +61 -0
  6. package/lib/components/forms/date-time-picker/date-time-picker.component.d.ts.map +1 -0
  7. package/lib/components/forms/date-time-picker/date-time-picker.component.js +173 -0
  8. package/lib/components/forms/date-time-picker/date-time-picker.styles.d.ts +2 -0
  9. package/lib/components/forms/date-time-picker/date-time-picker.styles.d.ts.map +1 -0
  10. package/lib/components/forms/date-time-picker/date-time-picker.styles.js +90 -0
  11. package/lib/components/forms/date-time-picker/date-time-picker.template.d.ts +3 -0
  12. package/lib/components/forms/date-time-picker/date-time-picker.template.d.ts.map +1 -0
  13. package/lib/components/forms/date-time-picker/date-time-picker.template.js +45 -0
  14. package/lib/components/forms/date-time-picker/index.d.ts +2 -0
  15. package/lib/components/forms/date-time-picker/index.d.ts.map +1 -0
  16. package/lib/components/forms/date-time-picker/index.js +1 -0
  17. package/lib/components/forms/time-picker/index.d.ts +2 -0
  18. package/lib/components/forms/time-picker/index.d.ts.map +1 -0
  19. package/lib/components/forms/time-picker/index.js +1 -0
  20. package/lib/components/forms/time-picker/time-picker.component.d.ts +89 -0
  21. package/lib/components/forms/time-picker/time-picker.component.d.ts.map +1 -0
  22. package/lib/components/forms/time-picker/time-picker.component.js +369 -0
  23. package/lib/components/forms/time-picker/time-picker.styles.d.ts +2 -0
  24. package/lib/components/forms/time-picker/time-picker.styles.d.ts.map +1 -0
  25. package/lib/components/forms/time-picker/time-picker.styles.js +318 -0
  26. package/lib/components/forms/time-picker/time-picker.template.d.ts +3 -0
  27. package/lib/components/forms/time-picker/time-picker.template.d.ts.map +1 -0
  28. package/lib/components/forms/time-picker/time-picker.template.js +123 -0
  29. package/lib/components/foundation/card/card.styles.d.ts.map +1 -1
  30. package/lib/components/foundation/card/card.styles.js +1 -0
  31. package/package.json +9 -1
@@ -0,0 +1,369 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { MelodicComponent } from '@melodicdev/core';
8
+ import { computePosition, autoUpdate, offset, flip, shift } from '../../../utils/positioning/index.js';
9
+ import { timePickerTemplate } from './time-picker.template.js';
10
+ import { timePickerStyles } from './time-picker.styles.js';
11
+ function pad(n) {
12
+ return String(n).padStart(2, '0');
13
+ }
14
+ function formatDisplay(value, use12Hour) {
15
+ if (!value)
16
+ return '';
17
+ const parts = value.split(':');
18
+ if (parts.length < 2)
19
+ return value;
20
+ let h = parseInt(parts[0], 10);
21
+ const m = parts[1];
22
+ const s = parts[2];
23
+ const timeSuffix = s ? `:${s}` : '';
24
+ if (!use12Hour)
25
+ return `${pad(h)}:${m}${timeSuffix}`;
26
+ const period = h >= 12 ? 'PM' : 'AM';
27
+ if (h === 0)
28
+ h = 12;
29
+ else if (h > 12)
30
+ h -= 12;
31
+ return `${h}:${m}${timeSuffix} ${period}`;
32
+ }
33
+ function clamp(val, min, max) {
34
+ if (val < min)
35
+ return max;
36
+ if (val > max)
37
+ return min;
38
+ return val;
39
+ }
40
+ /**
41
+ * ml-time-picker - Time input with dropdown selector
42
+ *
43
+ * @example
44
+ * ```html
45
+ * <ml-time-picker label="Start time" value="09:30"></ml-time-picker>
46
+ * <ml-time-picker label="Meeting" use-12-hour value="14:00"></ml-time-picker>
47
+ * <ml-time-picker label="Precise" step="1"></ml-time-picker>
48
+ * ```
49
+ *
50
+ * @fires ml:change - Emitted when the time changes. Detail: { value: string }
51
+ */
52
+ let TimePickerComponent = class TimePickerComponent {
53
+ constructor() {
54
+ /** Selected time in HH:mm or HH:mm:ss format */
55
+ this.value = '';
56
+ /** Placeholder text */
57
+ this.placeholder = 'Select time';
58
+ /** Field label */
59
+ this.label = '';
60
+ /** Hint text */
61
+ this.hint = '';
62
+ /** Error message */
63
+ this.error = '';
64
+ /** Input size */
65
+ this.size = 'md';
66
+ /** Disabled state */
67
+ this.disabled = false;
68
+ /** Required state */
69
+ this.required = false;
70
+ /** Minimum selectable time (HH:mm) */
71
+ this.min = '';
72
+ /** Maximum selectable time (HH:mm) */
73
+ this.max = '';
74
+ /** Step in minutes (default 15) for the preset list. Use 1 to show seconds spinner. */
75
+ this.step = 15;
76
+ /** Use 12-hour format with AM/PM (default: true) */
77
+ this.twelveHour = true;
78
+ /** Whether the popover is open */
79
+ this.isOpen = false;
80
+ /** Current editing hour */
81
+ this.editHour = 0;
82
+ /** Current editing minute */
83
+ this.editMinute = 0;
84
+ /** Current editing second */
85
+ this.editSecond = 0;
86
+ /** AM or PM when in 12-hour mode */
87
+ this.editPeriod = 'AM';
88
+ this._cleanupAutoUpdate = null;
89
+ this.togglePopover = () => {
90
+ if (this.disabled)
91
+ return;
92
+ const popoverEl = this.getPopoverEl();
93
+ if (popoverEl) {
94
+ popoverEl.togglePopover();
95
+ }
96
+ };
97
+ this.incrementHour = () => {
98
+ if (this.use12Hour) {
99
+ // Cycle within the current 12-hour half (AM: 0–11, PM: 12–23)
100
+ const base = this.editPeriod === 'AM' ? 0 : 12;
101
+ const offset = (this.editHour - base + 1) % 12;
102
+ this.editHour = base + offset;
103
+ }
104
+ else {
105
+ this.editHour = clamp(this.editHour + 1, 0, 23);
106
+ }
107
+ };
108
+ this.decrementHour = () => {
109
+ if (this.use12Hour) {
110
+ const base = this.editPeriod === 'AM' ? 0 : 12;
111
+ const offset = (this.editHour - base - 1 + 12) % 12;
112
+ this.editHour = base + offset;
113
+ }
114
+ else {
115
+ this.editHour = clamp(this.editHour - 1, 0, 23);
116
+ }
117
+ };
118
+ this.incrementMinute = () => {
119
+ this.editMinute = clamp(this.editMinute + 1, 0, 59);
120
+ };
121
+ this.decrementMinute = () => {
122
+ this.editMinute = clamp(this.editMinute - 1, 0, 59);
123
+ };
124
+ this.incrementSecond = () => {
125
+ this.editSecond = clamp(this.editSecond + 1, 0, 59);
126
+ };
127
+ this.decrementSecond = () => {
128
+ this.editSecond = clamp(this.editSecond - 1, 0, 59);
129
+ };
130
+ this.togglePeriod = () => {
131
+ this.editPeriod = this.editPeriod === 'AM' ? 'PM' : 'AM';
132
+ const h12 = this.editHour % 12 || 12;
133
+ this.editHour = this.to24Hour(h12, this.editPeriod);
134
+ };
135
+ this.confirmSelection = () => {
136
+ let timeStr = `${pad(this.editHour)}:${pad(this.editMinute)}`;
137
+ if (this.showSeconds) {
138
+ timeStr += `:${pad(this.editSecond)}`;
139
+ }
140
+ this.commitValue(timeStr);
141
+ this.closePopover();
142
+ };
143
+ this.handleNowClick = () => {
144
+ const now = new Date();
145
+ this.editHour = now.getHours();
146
+ this.editMinute = now.getMinutes();
147
+ this.editSecond = now.getSeconds();
148
+ this.editPeriod = this.editHour >= 12 ? 'PM' : 'AM';
149
+ };
150
+ this.handleKeyDown = (event) => {
151
+ if (event.key === 'Escape' && this.isOpen) {
152
+ event.preventDefault();
153
+ this.closePopover();
154
+ }
155
+ else if ((event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') && !this.isOpen) {
156
+ event.preventDefault();
157
+ this.togglePopover();
158
+ }
159
+ };
160
+ this.handleHourInput = (event) => {
161
+ const input = event.target;
162
+ const digits = input.value.replace(/\D/g, '').slice(0, 2);
163
+ if (digits === '') {
164
+ input.value = '';
165
+ return;
166
+ }
167
+ const max = this.use12Hour ? 12 : 23;
168
+ const min = this.use12Hour ? 1 : 0;
169
+ const n = Math.max(min, Math.min(parseInt(digits, 10), max));
170
+ input.value = String(n);
171
+ if (this.use12Hour) {
172
+ this.editHour = this.to24Hour(n, this.editPeriod);
173
+ }
174
+ else {
175
+ this.editHour = n;
176
+ }
177
+ };
178
+ this.handleMinuteInput = (event) => {
179
+ const input = event.target;
180
+ const digits = input.value.replace(/\D/g, '').slice(0, 2);
181
+ if (digits === '') {
182
+ input.value = '';
183
+ return;
184
+ }
185
+ const n = Math.min(parseInt(digits, 10), 59);
186
+ input.value = String(n);
187
+ this.editMinute = n;
188
+ };
189
+ this.handleSecondInput = (event) => {
190
+ const input = event.target;
191
+ const digits = input.value.replace(/\D/g, '').slice(0, 2);
192
+ if (digits === '') {
193
+ input.value = '';
194
+ return;
195
+ }
196
+ const n = Math.min(parseInt(digits, 10), 59);
197
+ input.value = String(n);
198
+ this.editSecond = n;
199
+ };
200
+ this.handleHourBlur = () => {
201
+ if (this.use12Hour) {
202
+ const h12 = this.editHour % 12 || 12;
203
+ this.editHour = this.to24Hour(h12, this.editPeriod);
204
+ }
205
+ };
206
+ this.handleMinuteBlur = () => {
207
+ // Re-render to reformat with padding
208
+ };
209
+ this.handleSecondBlur = () => {
210
+ // Re-render to reformat with padding
211
+ };
212
+ this.handleInputFocus = (event) => {
213
+ event.target.select();
214
+ };
215
+ this.handleSpinnerKeyDown = (event) => {
216
+ const target = event.target;
217
+ if (event.key === 'ArrowUp') {
218
+ event.preventDefault();
219
+ const label = target.getAttribute('aria-label');
220
+ if (label === 'Hour')
221
+ this.incrementHour();
222
+ else if (label === 'Minute')
223
+ this.incrementMinute();
224
+ else if (label === 'Second')
225
+ this.incrementSecond();
226
+ }
227
+ else if (event.key === 'ArrowDown') {
228
+ event.preventDefault();
229
+ const label = target.getAttribute('aria-label');
230
+ if (label === 'Hour')
231
+ this.decrementHour();
232
+ else if (label === 'Minute')
233
+ this.decrementMinute();
234
+ else if (label === 'Second')
235
+ this.decrementSecond();
236
+ }
237
+ else if (event.key === 'Enter') {
238
+ event.preventDefault();
239
+ this.confirmSelection();
240
+ }
241
+ };
242
+ this._handleToggle = (event) => {
243
+ const toggleEvent = event;
244
+ if (toggleEvent.newState === 'open') {
245
+ this.isOpen = true;
246
+ this.syncEditFromValue();
247
+ this.startPositioning();
248
+ }
249
+ else {
250
+ this.isOpen = false;
251
+ this._cleanupAutoUpdate?.();
252
+ this._cleanupAutoUpdate = null;
253
+ this.returnFocus();
254
+ }
255
+ };
256
+ }
257
+ get use12Hour() {
258
+ return this.twelveHour;
259
+ }
260
+ get showSeconds() {
261
+ return Number(this.step) === 1;
262
+ }
263
+ get displayValue() {
264
+ return formatDisplay(this.value, this.use12Hour);
265
+ }
266
+ get displayHour() {
267
+ if (this.use12Hour) {
268
+ let h = this.editHour;
269
+ if (h === 0)
270
+ h = 12;
271
+ else if (h > 12)
272
+ h -= 12;
273
+ return String(h);
274
+ }
275
+ return pad(this.editHour);
276
+ }
277
+ get displayMinute() {
278
+ return pad(this.editMinute);
279
+ }
280
+ get displaySecond() {
281
+ return pad(this.editSecond);
282
+ }
283
+ onCreate() {
284
+ const popoverEl = this.getPopoverEl();
285
+ if (popoverEl) {
286
+ popoverEl.addEventListener('toggle', this._handleToggle);
287
+ }
288
+ }
289
+ onDestroy() {
290
+ this._cleanupAutoUpdate?.();
291
+ const popoverEl = this.getPopoverEl();
292
+ if (popoverEl) {
293
+ popoverEl.removeEventListener('toggle', this._handleToggle);
294
+ }
295
+ }
296
+ to24Hour(h12, period) {
297
+ if (period === 'AM')
298
+ return h12 === 12 ? 0 : h12;
299
+ return h12 === 12 ? 12 : h12 + 12;
300
+ }
301
+ syncEditFromValue() {
302
+ if (this.value) {
303
+ const parts = this.value.split(':');
304
+ this.editHour = parseInt(parts[0], 10) || 0;
305
+ this.editMinute = parseInt(parts[1], 10) || 0;
306
+ this.editSecond = parts[2] ? parseInt(parts[2], 10) : 0;
307
+ }
308
+ else {
309
+ const now = new Date();
310
+ this.editHour = now.getHours();
311
+ this.editMinute = now.getMinutes();
312
+ this.editSecond = 0;
313
+ }
314
+ this.editPeriod = this.editHour >= 12 ? 'PM' : 'AM';
315
+ }
316
+ commitValue(timeStr) {
317
+ this.value = timeStr;
318
+ this.elementRef.dispatchEvent(new CustomEvent('ml:change', {
319
+ bubbles: true,
320
+ composed: true,
321
+ detail: { value: timeStr }
322
+ }));
323
+ }
324
+ closePopover() {
325
+ const popoverEl = this.getPopoverEl();
326
+ if (popoverEl && this.isOpen) {
327
+ popoverEl.hidePopover();
328
+ }
329
+ }
330
+ startPositioning() {
331
+ const triggerEl = this.getTriggerEl();
332
+ const popoverEl = this.getPopoverEl();
333
+ if (!triggerEl || !popoverEl)
334
+ return;
335
+ const update = () => this.updatePosition(triggerEl, popoverEl);
336
+ this._cleanupAutoUpdate?.();
337
+ this._cleanupAutoUpdate = autoUpdate(triggerEl, popoverEl, update);
338
+ }
339
+ updatePosition(triggerEl, popoverEl) {
340
+ const middleware = [offset(4), flip(), shift({ padding: 8 })];
341
+ const { x, y } = computePosition(triggerEl, popoverEl, {
342
+ placement: 'bottom-start',
343
+ middleware
344
+ });
345
+ popoverEl.style.left = `${x}px`;
346
+ popoverEl.style.top = `${y}px`;
347
+ }
348
+ returnFocus() {
349
+ const triggerEl = this.getTriggerEl();
350
+ if (triggerEl) {
351
+ triggerEl.focus();
352
+ }
353
+ }
354
+ getTriggerEl() {
355
+ return this.elementRef.shadowRoot?.querySelector('.ml-time-picker__trigger');
356
+ }
357
+ getPopoverEl() {
358
+ return this.elementRef.shadowRoot?.querySelector('.ml-time-picker__popover');
359
+ }
360
+ };
361
+ TimePickerComponent = __decorate([
362
+ MelodicComponent({
363
+ selector: 'ml-time-picker',
364
+ template: timePickerTemplate,
365
+ styles: timePickerStyles,
366
+ attributes: ['value', 'placeholder', 'label', 'hint', 'error', 'size', 'disabled', 'required', 'min', 'max', 'step', 'twelve-hour']
367
+ })
368
+ ], TimePickerComponent);
369
+ export { TimePickerComponent };
@@ -0,0 +1,2 @@
1
+ export declare const timePickerStyles: () => import("@melodicdev/core").TemplateResult;
2
+ //# sourceMappingURL=time-picker.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-picker.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/time-picker/time-picker.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,iDA4T5B,CAAC"}
@@ -0,0 +1,318 @@
1
+ import { css } from '@melodicdev/core';
2
+ export const timePickerStyles = () => css `
3
+ :host {
4
+ display: block;
5
+ }
6
+
7
+ /* Label */
8
+ .ml-time-picker__label {
9
+ display: block;
10
+ font-size: var(--ml-text-sm);
11
+ font-weight: var(--ml-font-medium);
12
+ color: var(--ml-color-text-secondary);
13
+ margin-bottom: var(--ml-space-1-5);
14
+ line-height: var(--ml-leading-tight);
15
+ }
16
+
17
+ .ml-time-picker__required {
18
+ color: var(--ml-color-danger);
19
+ margin-left: var(--ml-space-0-5);
20
+ }
21
+
22
+ /* Trigger button */
23
+ .ml-time-picker__trigger {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--ml-space-2);
27
+ width: 100%;
28
+ border: var(--ml-border) solid var(--ml-color-border);
29
+ border-radius: var(--ml-radius-md);
30
+ background-color: var(--ml-color-input-bg);
31
+ color: var(--ml-color-text);
32
+ cursor: pointer;
33
+ font-family: var(--ml-font-sans);
34
+ text-align: left;
35
+ transition:
36
+ border-color var(--ml-duration-150) var(--ml-ease-in-out),
37
+ box-shadow var(--ml-duration-150) var(--ml-ease-in-out);
38
+ }
39
+
40
+ .ml-time-picker__trigger:hover:not(:disabled) {
41
+ border-color: var(--ml-color-border-strong);
42
+ }
43
+
44
+ .ml-time-picker__trigger:focus-visible {
45
+ outline: none;
46
+ border-color: var(--ml-trigger-focus-border, var(--ml-color-primary));
47
+ box-shadow: var(--ml-shadow-focus-ring);
48
+ }
49
+
50
+ .ml-time-picker--open .ml-time-picker__trigger {
51
+ border-color: var(--ml-trigger-focus-border, var(--ml-color-primary));
52
+ box-shadow: var(--ml-shadow-focus-ring);
53
+ }
54
+
55
+ .ml-time-picker--error .ml-time-picker__trigger {
56
+ border-color: var(--ml-color-danger);
57
+ }
58
+
59
+ .ml-time-picker--error .ml-time-picker__trigger:focus-visible,
60
+ .ml-time-picker--error.ml-time-picker--open .ml-time-picker__trigger {
61
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);
62
+ }
63
+
64
+ .ml-time-picker--disabled .ml-time-picker__trigger {
65
+ opacity: 0.5;
66
+ cursor: not-allowed;
67
+ background-color: var(--ml-color-surface-sunken);
68
+ }
69
+
70
+ /* Sizes */
71
+ .ml-time-picker--sm .ml-time-picker__trigger {
72
+ padding: var(--ml-space-1-5) var(--ml-space-2-5);
73
+ font-size: var(--ml-text-xs);
74
+ }
75
+
76
+ .ml-time-picker--md .ml-time-picker__trigger {
77
+ padding: var(--ml-space-2) var(--ml-space-3);
78
+ font-size: var(--ml-text-sm);
79
+ }
80
+
81
+ .ml-time-picker--lg .ml-time-picker__trigger {
82
+ padding: var(--ml-space-2-5) var(--ml-space-3-5);
83
+ font-size: var(--ml-text-base);
84
+ }
85
+
86
+ /* Icon */
87
+ .ml-time-picker__icon {
88
+ flex-shrink: 0;
89
+ color: var(--ml-color-text-muted);
90
+ }
91
+
92
+ /* Value */
93
+ .ml-time-picker__value {
94
+ flex: 1;
95
+ min-width: 0;
96
+ overflow: hidden;
97
+ text-overflow: ellipsis;
98
+ white-space: nowrap;
99
+ }
100
+
101
+ .ml-time-picker__value--placeholder {
102
+ color: var(--ml-color-text-muted);
103
+ }
104
+
105
+ /* Popover */
106
+ .ml-time-picker__popover {
107
+ position: fixed;
108
+ inset: unset;
109
+ margin: 0;
110
+ padding: var(--ml-space-4);
111
+ border: var(--ml-border) solid var(--ml-color-border);
112
+ border-radius: var(--ml-radius-lg);
113
+ background-color: var(--ml-color-surface);
114
+ box-shadow: var(--ml-shadow-lg);
115
+ z-index: 50;
116
+
117
+ opacity: 0;
118
+ transform: scale(0.95);
119
+ transition:
120
+ opacity var(--ml-duration-150) var(--ml-ease-out),
121
+ transform var(--ml-duration-150) var(--ml-ease-out),
122
+ display var(--ml-duration-150) allow-discrete;
123
+ }
124
+
125
+ .ml-time-picker__popover:popover-open {
126
+ opacity: 1;
127
+ transform: scale(1);
128
+ }
129
+
130
+ @starting-style {
131
+ .ml-time-picker__popover:popover-open {
132
+ opacity: 0;
133
+ transform: scale(0.95);
134
+ }
135
+ }
136
+
137
+ /* Spinner group */
138
+ .ml-time-picker__spinner-group {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: var(--ml-space-1);
142
+ justify-content: center;
143
+ }
144
+
145
+ .ml-time-picker__spinner {
146
+ display: flex;
147
+ flex-direction: column;
148
+ align-items: center;
149
+ gap: var(--ml-space-1);
150
+ }
151
+
152
+ .ml-time-picker__spin-btn {
153
+ display: flex;
154
+ align-items: center;
155
+ justify-content: center;
156
+ width: 2rem;
157
+ height: 2rem;
158
+ border: none;
159
+ border-radius: var(--ml-radius-md);
160
+ background: none;
161
+ color: var(--ml-color-text-muted);
162
+ cursor: pointer;
163
+ transition:
164
+ background-color var(--ml-duration-150) var(--ml-ease-in-out),
165
+ color var(--ml-duration-150) var(--ml-ease-in-out);
166
+ }
167
+
168
+ .ml-time-picker__spin-btn:hover {
169
+ background-color: var(--ml-color-surface-raised);
170
+ color: var(--ml-color-text);
171
+ }
172
+
173
+ .ml-time-picker__spin-btn:focus-visible {
174
+ outline: none;
175
+ box-shadow: var(--ml-shadow-focus-ring);
176
+ }
177
+
178
+ .ml-time-picker__spin-input {
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ width: 3rem;
183
+ height: 2.5rem;
184
+ font-size: var(--ml-text-xl);
185
+ font-weight: var(--ml-font-semibold);
186
+ font-family: var(--ml-font-mono, var(--ml-font-sans));
187
+ color: var(--ml-color-text);
188
+ background-color: var(--ml-color-surface-sunken);
189
+ border: var(--ml-border) solid transparent;
190
+ border-radius: var(--ml-radius-md);
191
+ text-align: center;
192
+ padding: 0;
193
+ outline: none;
194
+ -moz-appearance: textfield;
195
+ }
196
+
197
+ .ml-time-picker__spin-input::-webkit-outer-spin-button,
198
+ .ml-time-picker__spin-input::-webkit-inner-spin-button {
199
+ -webkit-appearance: none;
200
+ margin: 0;
201
+ }
202
+
203
+ .ml-time-picker__spin-input:focus {
204
+ border-color: var(--ml-color-primary);
205
+ background-color: var(--ml-color-surface);
206
+ }
207
+
208
+ .ml-time-picker__separator {
209
+ font-size: var(--ml-text-xl);
210
+ font-weight: var(--ml-font-semibold);
211
+ color: var(--ml-color-text-muted);
212
+ padding: 0 var(--ml-space-0-5);
213
+ align-self: center;
214
+ }
215
+
216
+ /* AM/PM toggle */
217
+ .ml-time-picker__period {
218
+ display: flex;
219
+ flex-direction: column;
220
+ align-items: center;
221
+ justify-content: center;
222
+ margin-left: var(--ml-space-2);
223
+ }
224
+
225
+ .ml-time-picker__period-btn {
226
+ display: flex;
227
+ align-items: center;
228
+ justify-content: center;
229
+ padding: var(--ml-space-1-5) var(--ml-space-2-5);
230
+ border: var(--ml-border) solid var(--ml-color-border);
231
+ border-radius: var(--ml-radius-md);
232
+ background-color: var(--ml-color-surface);
233
+ font-family: var(--ml-font-sans);
234
+ font-size: var(--ml-text-sm);
235
+ font-weight: var(--ml-font-semibold);
236
+ color: var(--ml-color-text);
237
+ cursor: pointer;
238
+ transition:
239
+ background-color var(--ml-duration-150) var(--ml-ease-in-out),
240
+ border-color var(--ml-duration-150) var(--ml-ease-in-out);
241
+ }
242
+
243
+ .ml-time-picker__period-btn:hover {
244
+ background-color: var(--ml-color-surface-raised);
245
+ border-color: var(--ml-color-border-strong);
246
+ }
247
+
248
+ .ml-time-picker__period-btn:focus-visible {
249
+ outline: none;
250
+ box-shadow: var(--ml-shadow-focus-ring);
251
+ }
252
+
253
+ /* Footer */
254
+ .ml-time-picker__footer {
255
+ display: flex;
256
+ justify-content: space-between;
257
+ align-items: center;
258
+ padding-top: var(--ml-space-3);
259
+ margin-top: var(--ml-space-3);
260
+ border-top: var(--ml-border) solid var(--ml-color-border);
261
+ }
262
+
263
+ .ml-time-picker__now-btn,
264
+ .ml-time-picker__confirm-btn {
265
+ border: var(--ml-border) solid var(--ml-color-border);
266
+ border-radius: var(--ml-radius-md);
267
+ background-color: var(--ml-color-surface);
268
+ font-family: var(--ml-font-sans);
269
+ font-size: var(--ml-text-sm);
270
+ font-weight: var(--ml-font-medium);
271
+ color: var(--ml-color-text);
272
+ padding: var(--ml-space-1-5) var(--ml-space-3);
273
+ cursor: pointer;
274
+ transition:
275
+ background-color var(--ml-duration-150) var(--ml-ease-in-out),
276
+ border-color var(--ml-duration-150) var(--ml-ease-in-out);
277
+ }
278
+
279
+ .ml-time-picker__now-btn:hover,
280
+ .ml-time-picker__confirm-btn:hover {
281
+ background-color: var(--ml-color-surface-raised);
282
+ border-color: var(--ml-color-border-strong);
283
+ }
284
+
285
+ .ml-time-picker__now-btn:focus-visible,
286
+ .ml-time-picker__confirm-btn:focus-visible {
287
+ outline: none;
288
+ box-shadow: var(--ml-shadow-focus-ring);
289
+ }
290
+
291
+ .ml-time-picker__confirm-btn {
292
+ background-color: var(--ml-color-primary);
293
+ border-color: var(--ml-color-primary);
294
+ color: var(--ml-color-text-inverse);
295
+ }
296
+
297
+ .ml-time-picker__confirm-btn:hover {
298
+ background-color: var(--ml-color-primary-hover);
299
+ border-color: var(--ml-color-primary-hover);
300
+ }
301
+
302
+ /* Hint / Error */
303
+ .ml-time-picker__hint,
304
+ .ml-time-picker__error {
305
+ display: block;
306
+ margin-top: var(--ml-space-1-5);
307
+ font-size: var(--ml-text-sm);
308
+ line-height: var(--ml-leading-tight);
309
+ }
310
+
311
+ .ml-time-picker__hint {
312
+ color: var(--ml-color-text-muted);
313
+ }
314
+
315
+ .ml-time-picker__error {
316
+ color: var(--ml-color-danger);
317
+ }
318
+ `;
@@ -0,0 +1,3 @@
1
+ import type { TimePickerComponent } from './time-picker.component.js';
2
+ export declare function timePickerTemplate(c: TimePickerComponent): import("@melodicdev/core").TemplateResult;
3
+ //# sourceMappingURL=time-picker.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-picker.template.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/time-picker/time-picker.template.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,mBAAmB,6CA6HxD"}