@mediquo/elements 0.10.4 → 0.10.6
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.
- package/README.md +9 -0
- package/dist/chunks/addDays-CdyO-PRI.js +1 -0
- package/dist/chunks/addSeconds-fO5orJrt.js +1 -0
- package/dist/chunks/api-chat-client-DgSWD5IP.js +1 -0
- package/dist/chunks/{apple-pay-outcomes-tbZjXEYD.js → apple-pay-outcomes-Bm2QZwZx.js} +1 -1
- package/dist/chunks/appointment-details-BYGwLfww.js +1 -0
- package/dist/chunks/ca_ES-mW7NQKWA.js +1 -0
- package/dist/chunks/chunk-NIAGR3ZC-BDlNUZa1.js +1 -0
- package/dist/chunks/custom-element-CiOhPWP1-DPpsGZrV.js +1 -0
- package/dist/chunks/de_DE-Bz01AZ5g.js +1 -0
- package/dist/chunks/documentation-view-DbtlEQSG.js +1 -0
- package/dist/chunks/en_US-CV2TVb45.js +1 -0
- package/dist/chunks/format-tMwfQwDf.js +1 -0
- package/dist/chunks/{index-C1325SFM.d.ts → index-CsFUct9e.d.ts} +1 -0
- package/dist/chunks/index-D2yqKnpP.js +1 -0
- package/dist/chunks/{index-C8O_sOOh.js → index-DOkZ23_U.js} +1 -1
- package/dist/chunks/index-Detg0o-C.js +1 -0
- package/dist/chunks/{index-pnQMnaEN.d.ts → index-MVR2p_EX.d.ts} +1 -0
- package/dist/chunks/isBefore-DBi1CiNR.js +1 -0
- package/dist/chunks/mq-chat-room-82OqHZDt.js +1 -0
- package/dist/chunks/{mq-chat-room-CWIDQUxq.d.ts → mq-chat-room-ZNKKjO5n.d.ts} +4 -0
- package/dist/chunks/mq-next-appointments-D4w-LJmF.js +1 -0
- package/dist/chunks/{mq-professional-presence-sync-cmg6CXhz.d.ts → mq-professional-presence-sync-BPb8GjLT.d.ts} +0 -1
- package/dist/chunks/mq-professional-presence-sync-CnwOuX68.js +1 -0
- package/dist/chunks/{mq-recent-documents-B8-mnfxp.js → mq-recent-documents-Cr6u6xRi.js} +1 -1
- package/dist/chunks/mq-schedule-D7axS8UJ.js +1 -0
- package/dist/chunks/mq-support-chat-C-dyTXms.js +1 -0
- package/dist/chunks/{mq-unread-count-sync-DTn9dfR4.d.ts → mq-unread-count-sync-D3KUuLPV.d.ts} +0 -1
- package/dist/chunks/mq-unread-count-sync-Dqf98Tn_.js +1 -0
- package/dist/chunks/mq-videocall-RE4mE__m.js +1 -0
- package/dist/chunks/next-appointment-card-CQxPBnp_.js +1 -0
- package/dist/chunks/{next-appointment-card-Cd6GXAne.d.ts → next-appointment-card-CrXZEw8L.d.ts} +18 -4
- package/dist/chunks/parseISO-CEksKisk.js +1 -0
- package/dist/chunks/pt_PT-9EoQbEa0.js +1 -0
- package/dist/chunks/{refund-cancel-policy-C_9LyN_y.js → refund-cancel-policy-DoMzcLlL.js} +1 -1
- package/dist/chunks/{telemetry-client-dwDzxn9N.js → telemetry-client-K37KMdy_.js} +1 -1
- package/dist/env.js +1 -1
- package/dist/i18n.js +1 -1
- package/dist/mq-api-client-provider.js +1 -1
- package/dist/mq-apple-pay-checkout.js +1 -1
- package/dist/mq-appointment-checkout.js +1 -1
- package/dist/mq-appointment-documentation.d.ts +2 -2
- package/dist/mq-appointment-documentation.js +1 -1
- package/dist/mq-chat-room.d.ts +1 -1
- package/dist/mq-chat-room.js +1 -1
- package/dist/mq-checkout.js +1 -1
- package/dist/mq-dashboard.d.ts +3 -3
- package/dist/mq-dashboard.js +1 -1
- package/dist/mq-documents.d.ts +1 -1
- package/dist/mq-documents.js +1 -1
- package/dist/mq-google-pay-checkout.js +1 -1
- package/dist/mq-immediate-videocall-checkout.js +1 -1
- package/dist/mq-my-appointments.d.ts +2 -4
- package/dist/mq-my-appointments.js +1 -1
- package/dist/mq-next-appointments.d.ts +2 -2
- package/dist/mq-next-appointments.js +1 -1
- package/dist/mq-payment-poller.js +1 -1
- package/dist/mq-professional-presence-sync.d.ts +1 -1
- package/dist/mq-professional-presence-sync.js +1 -1
- package/dist/mq-recent-documents.d.ts +1 -1
- package/dist/mq-recent-documents.js +1 -1
- package/dist/mq-schedule-success.d.ts +1 -3
- package/dist/mq-schedule-success.js +2 -2
- package/dist/mq-schedule.d.ts +14 -7
- package/dist/mq-schedule.js +1 -1
- package/dist/mq-support-chat.d.ts +1 -1
- package/dist/mq-support-chat.js +1 -1
- package/dist/mq-terms-and-conditions.js +1 -1
- package/dist/mq-unread-count-sync.d.ts +1 -1
- package/dist/mq-unread-count-sync.js +1 -1
- package/dist/mq-videocall.d.ts +2 -2
- package/dist/mq-videocall.js +1 -1
- package/dist/react/mq-api-client-provider.js +1 -1
- package/dist/react/mq-apple-pay-checkout.js +1 -1
- package/dist/react/mq-appointment-checkout.js +1 -1
- package/dist/react/mq-appointment-documentation.d.ts +2 -2
- package/dist/react/mq-appointment-documentation.js +1 -1
- package/dist/react/mq-chat-room.d.ts +1 -1
- package/dist/react/mq-chat-room.js +1 -1
- package/dist/react/mq-checkout.js +1 -1
- package/dist/react/mq-dashboard.d.ts +3 -3
- package/dist/react/mq-dashboard.js +1 -1
- package/dist/react/mq-documents-page.d.ts +1 -1
- package/dist/react/mq-documents-page.js +1 -1
- package/dist/react/mq-documents.d.ts +1 -1
- package/dist/react/mq-documents.js +1 -1
- package/dist/react/mq-google-pay-checkout.js +1 -1
- package/dist/react/mq-immediate-videocall-checkout.js +1 -1
- package/dist/react/mq-my-appointments.d.ts +2 -3
- package/dist/react/mq-my-appointments.js +1 -1
- package/dist/react/mq-next-appointments.d.ts +2 -2
- package/dist/react/mq-next-appointments.js +1 -1
- package/dist/react/mq-payment-poller.js +1 -1
- package/dist/react/mq-professional-presence-sync.d.ts +1 -1
- package/dist/react/mq-professional-presence-sync.js +1 -1
- package/dist/react/mq-recent-documents.d.ts +1 -1
- package/dist/react/mq-recent-documents.js +1 -1
- package/dist/react/mq-schedule-success.d.ts +1 -2
- package/dist/react/mq-schedule-success.js +1 -1
- package/dist/react/mq-schedule.d.ts +2 -1
- package/dist/react/mq-schedule.js +1 -1
- package/dist/react/mq-socket-provider.js +1 -1
- package/dist/react/mq-support-chat.d.ts +1 -1
- package/dist/react/mq-support-chat.js +1 -1
- package/dist/react/mq-terms-and-conditions.js +1 -1
- package/dist/react/mq-unread-count-sync.d.ts +1 -1
- package/dist/react/mq-unread-count-sync.js +1 -1
- package/dist/react/mq-videocall.d.ts +2 -2
- package/dist/react/mq-videocall.js +1 -1
- package/dist/theme.d.ts +9 -0
- package/dist/theme.js +1 -1
- package/dist/ui/mq-calendar.d.ts +2 -0
- package/dist/ui/mq-calendar.js +1 -1
- package/dist/ui/mq-dialog.d.ts +62 -13
- package/dist/ui/mq-dialog.js +341 -1
- package/dist/ui/mq-tabs.js +5 -5
- package/dist/ui/mq-time-slot-picker.d.ts +1 -0
- package/dist/ui/mq-time-slot-picker.js +1 -1
- package/package.json +2 -1
- package/dist/chunks/addSeconds-CXt0dUch.js +0 -1
- package/dist/chunks/api-chat-client-3tgSK-oL.js +0 -1
- package/dist/chunks/appointment-details-DpawC6lW.js +0 -1
- package/dist/chunks/ca_ES-DMretbb7.js +0 -1
- package/dist/chunks/chunk-2TKJJNS7-DzhxHWWb.js +0 -1
- package/dist/chunks/de_DE-DUtzXD1z.js +0 -1
- package/dist/chunks/documentation-view-CSMoGBMk.js +0 -1
- package/dist/chunks/en_US-mxYf5Jqv.js +0 -1
- package/dist/chunks/format-CRFiCNHw.js +0 -1
- package/dist/chunks/index-2xVO6z8H.js +0 -1
- package/dist/chunks/index-CV03omw_.js +0 -1
- package/dist/chunks/index-D13HvA4a.js +0 -1
- package/dist/chunks/isBefore-Dfww5192.js +0 -1
- package/dist/chunks/isSameDay-CuhZMy1T.js +0 -1
- package/dist/chunks/mq-chat-room-3PU4Fsub.js +0 -1
- package/dist/chunks/mq-next-appointments-DfszxI2l.js +0 -1
- package/dist/chunks/mq-schedule-aoRvmsws.js +0 -1
- package/dist/chunks/mq-support-chat-KBgsUQKV.js +0 -1
- package/dist/chunks/mq-videocall-B3iq_BOi.js +0 -1
- package/dist/chunks/next-appointment-card-Cj-3N8jg.js +0 -1
- package/dist/chunks/parseISO-Dj3qSTG8.js +0 -1
- package/dist/chunks/pt_PT-g8meEZVV.js +0 -1
package/dist/ui/mq-dialog.js
CHANGED
|
@@ -1 +1,341 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,t}from"../chunks/custom-element-CiOhPWP1-DPpsGZrV.js";import{i,a as o,E as s,x as a,r}from"../chunks/lit-element-DiWJYFwC.js";import{n as l}from"../chunks/property-scuRaFcM.js";import{r as n}from"../chunks/state-LQivXIgA.js";const h="4px",d="0px 8px 16px 0px rgb(0 0 0 / 0.1)",c="rgb(0 0 0 / 0.05)",m="200ms",g="0.5rem",b="3.75rem",u="0.75rem",p="1.25rem",v="1rem",f="0.625rem",y="25rem",w="12rem",x=(e,t)=>r(`var(--dialog-${e}, ${t})`),q=x("underlay","rgb(0 0 0 / 0.5)"),S=x("underlay-blur",h),$=x("shadow",d),k=x("close-hover-bg",c),C=x("transition-duration",m),E=x("radius",g),T=x("header-height",b),N=x("padding-inline",u),D=x("padding-block",p),A=x("gap",v),M=x("actions-gap",f),F=i`
|
|
2
|
+
:host {
|
|
3
|
+
display: contents;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
[hidden] {
|
|
7
|
+
display: none !important;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
dialog.root {
|
|
11
|
+
/* Reset user-agent dialog styles */
|
|
12
|
+
padding: 0;
|
|
13
|
+
border: none;
|
|
14
|
+
margin: 0;
|
|
15
|
+
max-width: none;
|
|
16
|
+
max-height: none;
|
|
17
|
+
/* Full-viewport underlay so clicks outside the card hit the dialog */
|
|
18
|
+
position: fixed;
|
|
19
|
+
inset: 0;
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
width: 100%;
|
|
22
|
+
height: 100%;
|
|
23
|
+
background: ${q};
|
|
24
|
+
backdrop-filter: blur(${S});
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: center;
|
|
28
|
+
opacity: 0;
|
|
29
|
+
transition: opacity ${C} ease;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
dialog.root:not([open]) {
|
|
33
|
+
display: none;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* The dim is the dialog's own background, so it can animate via .active */
|
|
37
|
+
dialog.root::backdrop {
|
|
38
|
+
background: transparent;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.dialog {
|
|
42
|
+
position: relative;
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
box-sizing: border-box;
|
|
46
|
+
/* 1rem of air on each side on phones, inside the safe area */
|
|
47
|
+
width: calc(
|
|
48
|
+
100% - 2rem - var(--mq-safe-left, 0px) - var(--mq-safe-right, 0px)
|
|
49
|
+
);
|
|
50
|
+
max-width: ${x("max-width",y)};
|
|
51
|
+
/* vh first for browsers without dvh; dvh wins where it exists, so the
|
|
52
|
+
card never grows under a mobile browser's toolbars. */
|
|
53
|
+
max-height: calc(
|
|
54
|
+
100vh - 2rem - var(--mq-safe-top, 0px) - var(--mq-safe-bottom, 0px)
|
|
55
|
+
);
|
|
56
|
+
max-height: calc(
|
|
57
|
+
100dvh - 2rem - var(--mq-safe-top, 0px) - var(--mq-safe-bottom, 0px)
|
|
58
|
+
);
|
|
59
|
+
margin-top: var(--mq-safe-top, 0px);
|
|
60
|
+
margin-bottom: var(--mq-safe-bottom, 0px);
|
|
61
|
+
margin-left: var(--mq-safe-left, 0px);
|
|
62
|
+
margin-right: var(--mq-safe-right, 0px);
|
|
63
|
+
border: none;
|
|
64
|
+
border-radius: ${E};
|
|
65
|
+
background: var(
|
|
66
|
+
--mq-surface-surface,
|
|
67
|
+
var(--color-neutrals-background-extraWeak, #ffffff)
|
|
68
|
+
);
|
|
69
|
+
color: var(--mq-text-primary, var(--color-neutrals-text-default, #0a0a23));
|
|
70
|
+
font-family: var(--mq-typography-family-sans, var(--font-body, inherit));
|
|
71
|
+
box-shadow: ${$};
|
|
72
|
+
outline: none;
|
|
73
|
+
overflow: hidden;
|
|
74
|
+
opacity: 0;
|
|
75
|
+
transform: scale(0.95);
|
|
76
|
+
transition:
|
|
77
|
+
opacity ${C} ease,
|
|
78
|
+
transform ${C} ease;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
dialog.root.active {
|
|
82
|
+
opacity: 1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
dialog.root.active .dialog {
|
|
86
|
+
opacity: 1;
|
|
87
|
+
transform: scale(1);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Image, header and body scroll together; the close button and the actions
|
|
91
|
+
stay put. */
|
|
92
|
+
.scroll {
|
|
93
|
+
flex: 1;
|
|
94
|
+
min-height: 0;
|
|
95
|
+
overflow-y: auto;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Focusable only while it overflows, so a keyboard user can scroll it —
|
|
99
|
+
Safari does not make scrollers focusable on its own. */
|
|
100
|
+
.scroll:focus-visible {
|
|
101
|
+
outline: 2px solid var(--mq-border-focus, var(--color-primary, #4a1ea7));
|
|
102
|
+
outline-offset: -2px;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.image {
|
|
106
|
+
line-height: 0;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.image ::slotted(img),
|
|
110
|
+
.image ::slotted(picture),
|
|
111
|
+
.image ::slotted(video),
|
|
112
|
+
.image ::slotted(svg) {
|
|
113
|
+
display: block;
|
|
114
|
+
width: 100%;
|
|
115
|
+
max-height: ${x("image-max-height",w)};
|
|
116
|
+
object-fit: cover;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.header {
|
|
120
|
+
display: flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
box-sizing: border-box;
|
|
123
|
+
min-height: ${T};
|
|
124
|
+
/* The end side leaves room for the close button sitting in the band. */
|
|
125
|
+
padding: var(--mq-spacing-2, 0.5rem) var(--mq-spacing-12, 3rem)
|
|
126
|
+
var(--mq-spacing-2, 0.5rem) ${N};
|
|
127
|
+
background: var(--mq-surface-surface-raised, var(--color-muted, #f8f7fa));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Over an image the close button sits on the image, not in the band. */
|
|
131
|
+
.dialog.with-image .header {
|
|
132
|
+
padding-inline-end: ${N};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.heading {
|
|
136
|
+
font-family: var(--mq-typography-family-sans, var(--font-titles, inherit));
|
|
137
|
+
font-size: var(--mq-typography-size-base, 1rem);
|
|
138
|
+
font-weight: var(--mq-typography-weight-medium, 500);
|
|
139
|
+
line-height: 1.25rem;
|
|
140
|
+
color: var(--mq-text-brand, var(--color-primary, #4a1ea7));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.body {
|
|
144
|
+
display: grid;
|
|
145
|
+
gap: ${A};
|
|
146
|
+
padding: ${D} ${N};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* No header band to hold the close button: keep the body clear of it. */
|
|
150
|
+
.dialog:not(.with-heading):not(.with-image) .body {
|
|
151
|
+
padding-inline-end: var(--mq-spacing-12, 3rem);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.subheading {
|
|
155
|
+
font-size: var(--mq-typography-size-xs, 0.75rem);
|
|
156
|
+
font-weight: var(--mq-typography-weight-normal, 400);
|
|
157
|
+
line-height: 1rem;
|
|
158
|
+
/* ≈ Figma's #6d658b on white, and still readable in dark mode;
|
|
159
|
+
--mq-text-secondary would fall under 4.5:1. */
|
|
160
|
+
color: var(
|
|
161
|
+
--color-neutrals-text-medium,
|
|
162
|
+
color-mix(in srgb, var(--mq-text-primary, #0a0a23) 64%, transparent)
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* Headings bring their own UA margins and sizes; start from the design's.
|
|
167
|
+
Styles the owner gives its own heading still win over these. */
|
|
168
|
+
.heading ::slotted(*),
|
|
169
|
+
.subheading ::slotted(*) {
|
|
170
|
+
margin: 0;
|
|
171
|
+
font-family: inherit;
|
|
172
|
+
font-size: inherit;
|
|
173
|
+
font-weight: inherit;
|
|
174
|
+
line-height: inherit;
|
|
175
|
+
color: inherit;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.footer {
|
|
179
|
+
display: flex;
|
|
180
|
+
flex-wrap: wrap;
|
|
181
|
+
flex-shrink: 0;
|
|
182
|
+
align-items: center;
|
|
183
|
+
justify-content: flex-end;
|
|
184
|
+
gap: ${M};
|
|
185
|
+
padding: var(--mq-spacing-3, 0.75rem) ${N}
|
|
186
|
+
var(--mq-spacing-4, 1rem);
|
|
187
|
+
border-top: var(--mq-size-border-default, 1px) solid
|
|
188
|
+
var(--mq-border-default, var(--color-border, #edecf1));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.close-btn {
|
|
192
|
+
position: absolute;
|
|
193
|
+
/* Centred in the header band: (band - button) / 2 */
|
|
194
|
+
top: calc((${T} - var(--mq-size-control-sm, 2rem)) / 2);
|
|
195
|
+
right: var(--mq-spacing-2, 0.5rem);
|
|
196
|
+
z-index: 1;
|
|
197
|
+
display: inline-flex;
|
|
198
|
+
align-items: center;
|
|
199
|
+
justify-content: center;
|
|
200
|
+
box-sizing: border-box;
|
|
201
|
+
width: var(--mq-size-control-sm, 2rem);
|
|
202
|
+
height: var(--mq-size-control-sm, 2rem);
|
|
203
|
+
margin: 0;
|
|
204
|
+
padding: 0;
|
|
205
|
+
border: none;
|
|
206
|
+
border-radius: var(--mq-radius-md, 0.375rem);
|
|
207
|
+
background: transparent;
|
|
208
|
+
/* Not --mq-text-secondary: grey.500 is 2.79:1 on the band, under the 3:1 a
|
|
209
|
+
control's icon needs. Same derivation as the subheading. */
|
|
210
|
+
color: var(
|
|
211
|
+
--color-neutrals-text-medium,
|
|
212
|
+
color-mix(in srgb, var(--mq-text-primary, #0a0a23) 64%, transparent)
|
|
213
|
+
);
|
|
214
|
+
cursor: pointer;
|
|
215
|
+
transition: background-color ${C} ease;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.close-btn svg {
|
|
219
|
+
width: var(--mq-size-icon-lg, 1.5rem);
|
|
220
|
+
height: var(--mq-size-icon-lg, 1.5rem);
|
|
221
|
+
pointer-events: none;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.close-btn:hover {
|
|
225
|
+
background: ${k};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.close-btn:focus-visible {
|
|
229
|
+
outline: 2px solid var(--mq-border-focus, var(--color-primary, #4a1ea7));
|
|
230
|
+
outline-offset: 2px;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* Over a photo the bare glyph can vanish; give it a chip to sit on. */
|
|
234
|
+
.dialog.with-image .close-btn {
|
|
235
|
+
top: var(--mq-spacing-3, 0.75rem);
|
|
236
|
+
right: var(--mq-spacing-3, 0.75rem);
|
|
237
|
+
border-radius: var(--mq-radius-full, 9999px);
|
|
238
|
+
background: var(
|
|
239
|
+
--mq-surface-surface,
|
|
240
|
+
var(--color-neutrals-background-extraWeak, #ffffff)
|
|
241
|
+
);
|
|
242
|
+
opacity: 0.9;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.dialog.with-image .close-btn:hover {
|
|
246
|
+
opacity: 1;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.close-btn:disabled {
|
|
250
|
+
opacity: 0.4;
|
|
251
|
+
cursor: default;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
@media (forced-colors: active) {
|
|
255
|
+
.dialog {
|
|
256
|
+
border: 1px solid CanvasText;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
@media (prefers-reduced-motion: reduce) {
|
|
261
|
+
dialog.root,
|
|
262
|
+
.dialog,
|
|
263
|
+
.close-btn {
|
|
264
|
+
transition: none;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.dialog {
|
|
268
|
+
transform: none;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
`,z=["a[href]","area[href]","button",'input:not([type="hidden"])',"select","textarea","iframe","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"[tabindex]"].join(",");let O=0,R="",H="";class MqDialogCloseEvent extends Event{static{this.eventName="mq-close"}constructor(){super(MqDialogCloseEvent.eventName,{bubbles:!0,composed:!0,cancelable:!0})}}let j=class MqDialog extends o{constructor(){super(...arguments),this.open=!1,this.dismissable=!0,this.alert=!1,this.label="",this.closeLabel="Close dialog",this.isActive=!1,this.hasImage=!1,this.hasHeading=!1,this.hasSubheading=!1,this.hasFooter=!1,this.isModal=!1,this.scrollable=!1,this.enterFrame=null,this.slotObserver=null,this.scrollObserver=null,this.closeTimer=null,this.lockedScroll=!1,this.backdropPointerDown=!1,this.warnedAboutName=!1,this.detaching=!1,this.onSlotChange=()=>{this.readSlots()},this.onDialogPointerDown=e=>{this.backdropPointerDown=e.target===this.dialogEl},this.onDialogClick=e=>{const t=this.backdropPointerDown&&e.target===this.dialogEl;this.backdropPointerDown=!1,t&&this.dismissable&&this.requestClose()},this.onCancel=e=>{e.preventDefault(),this.dismissable&&this.requestClose()},this.onNativeClose=()=>{this.detaching||(this.open?this.dismissable||!this.isConnected?(this.releaseScroll(),this.dispatchEvent(new MqDialogCloseEvent),this.open=!1):this.openNative():this.releaseScroll())},this.onCloseClick=()=>{this.dismissable&&this.requestClose()},this.onKeyDown=e=>{if("Tab"!==e.key)return;const t=this.getTabbableElements();if(0===t.length)return void e.preventDefault();const i=t[0],o=t[t.length-1];if(!i||!o)return;const s=this.getDeepActiveElement();e.shiftKey||s!==o?e.shiftKey&&s===i&&(e.preventDefault(),o.focus()):(e.preventDefault(),i.focus())}}static{this.styles=[F]}get dialogEl(){return this.shadowRoot?.querySelector("dialog")??null}connectedCallback(){super.connectedCallback(),this.readSlots(),this.slotObserver=new MutationObserver(()=>this.readSlots()),this.slotObserver.observe(this,{childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:["slot"]}),this.hasUpdated&&(this.observeScroll(),this.open&&this.openNative())}disconnectedCallback(){this.slotObserver?.disconnect(),this.slotObserver=null,this.scrollObserver?.disconnect(),this.scrollObserver=null,this.cancelEnterFrame(),this.closeTimer&&(window.clearTimeout(this.closeTimer),this.closeTimer=null),this.detaching=!0,this.closeNative(),this.detaching=!1,this.isActive=!1,super.disconnectedCallback()}firstUpdated(){this.observeScroll()}observeScroll(){if(this.scrollObserver||"undefined"==typeof ResizeObserver)return;const e=this.shadowRoot?.querySelector(".scroll");if(!e)return;this.scrollObserver=new ResizeObserver(()=>this.measureScroll()),this.scrollObserver.observe(e);const t=this.shadowRoot?.querySelector(".scroll > .body");t&&this.scrollObserver.observe(t)}updated(e){if(!e.has("open"))return;if(!this.dialogEl)return;if(this.open)return this.closeTimer&&(window.clearTimeout(this.closeTimer),this.closeTimer=null),this.openNative(),void this.warnAboutMissingName();if(this.cancelEnterFrame(),this.isActive=!1,!this.dialogEl.open)return void this.releaseScroll();this.closeTimer&&window.clearTimeout(this.closeTimer);const t=this.shadowRoot?.querySelector(".dialog");this.closeTimer=window.setTimeout(()=>{this.closeNative(),this.closeTimer=null},function(e){if(!e)return 0;const t=getComputedStyle(e).transitionDuration.split(",");return Math.max(0,...t.map(e=>{const t=Number.parseFloat(e);return Number.isNaN(t)?0:e.trim().endsWith("ms")?t:1e3*t}))}(t))}openNative(){const e=this.dialogEl;e&&(e.open||("function"==typeof e.showModal?(e.showModal(),this.isModal=!0):(e.setAttribute("open",""),this.isModal=!1)),this.holdScroll(),this.measureScroll(),this.cancelEnterFrame(),this.enterFrame=requestAnimationFrame(()=>{this.enterFrame=null,this.open&&(this.isActive=!0)}))}cancelEnterFrame(){null!==this.enterFrame&&(cancelAnimationFrame(this.enterFrame),this.enterFrame=null)}measureScroll(){const e=this.shadowRoot?.querySelector(".scroll");e&&(this.scrollable=e.scrollHeight>e.clientHeight+1)}closeNative(){const e=this.dialogEl;e?.open&&("function"==typeof e.close?e.close():e.removeAttribute("open")),this.releaseScroll()}holdScroll(){this.lockedScroll||(function(){if(0===O){const e=document.documentElement,t=window.innerWidth-e.clientWidth;if(R=e.style.overflow,H=e.style.paddingRight,e.style.overflow="hidden",e.clientWidth>0&&t>0){const i=Number.parseFloat(getComputedStyle(e).paddingRight);e.style.paddingRight=`${(Number.isNaN(i)?0:i)+t}px`}}O+=1}(),this.lockedScroll=!0)}releaseScroll(){this.lockedScroll&&(function(){if(0!==O&&(O-=1,0===O)){const e=document.documentElement;e.style.overflow=R,e.style.paddingRight=H}}(),this.lockedScroll=!1)}warnAboutMissingName(){this.hasHeading||this.label||this.warnedAboutName||(this.warnedAboutName=!0,console.warn('mq-dialog: nothing is in the "heading" slot and no label was set, so the dialog has no accessible name and a screen reader will announce it as just "dialog". Add a heading or pass a label attribute.'))}hasSlotted(e,t){const i=Array.from(this.querySelectorAll(`:scope > [slot="${e}"]`));return t?i.some(e=>""!==(e.textContent??"").trim()):i.length>0}readSlots(){this.hasImage=this.hasSlotted("image",!1),this.hasHeading=this.hasSlotted("heading",!0),this.hasSubheading=this.hasSlotted("subheading",!0),this.hasFooter=this.hasSlotted("footer",!1),this.measureScroll(),this.open&&this.warnAboutMissingName()}getDeepActiveElement(){let e=document.activeElement;for(;e?.shadowRoot?.activeElement;)e=e.shadowRoot.activeElement;return e}getTabbableElements(){const e=this.shadowRoot?.querySelector(".dialog");if(!e)return[];const t=[];return this.collectTabbable(e,t),t}collectTabbable(e,t){if(this.isTabbable(e)&&t.push(e),e.shadowRoot)for(const i of e.shadowRoot.children)this.collectTabbable(i,t);else if(e instanceof HTMLSlotElement)for(const i of e.assignedElements({flatten:!0}))this.collectTabbable(i,t);else for(const i of e.children)this.collectTabbable(i,t)}isTabbable(e){if(!(e instanceof HTMLElement))return!1;if(!e.matches(z))return!1;if(e.hasAttribute("disabled")||e.hasAttribute("inert"))return!1;if("true"===e.getAttribute("aria-hidden"))return!1;const t=e.getAttribute("tabindex");return!(null!==t&&Number(t)<0)&&(null!==e.offsetParent||e.getClientRects().length>0)}requestClose(){this.dispatchEvent(new MqDialogCloseEvent)&&(this.open=!1)}render(){const e=["dialog",this.hasImage?"with-image":"",this.hasHeading?"with-heading":""].filter(Boolean).join(" ");return a`
|
|
272
|
+
<dialog
|
|
273
|
+
class="root ${this.isActive?"active":""}"
|
|
274
|
+
role=${this.alert?"alertdialog":s}
|
|
275
|
+
aria-modal=${this.isModal?"true":s}
|
|
276
|
+
closedby=${this.dismissable?"closerequest":"none"}
|
|
277
|
+
aria-labelledby=${this.hasHeading?"dialog-heading":s}
|
|
278
|
+
aria-label=${!this.hasHeading&&this.label?this.label:s}
|
|
279
|
+
aria-describedby=${this.hasSubheading?"dialog-subheading":s}
|
|
280
|
+
@pointerdown=${this.onDialogPointerDown}
|
|
281
|
+
@click=${this.onDialogClick}
|
|
282
|
+
@keydown=${this.onKeyDown}
|
|
283
|
+
@cancel=${this.onCancel}
|
|
284
|
+
@close=${this.onNativeClose}
|
|
285
|
+
>
|
|
286
|
+
<div class=${e} part="dialog">
|
|
287
|
+
<button
|
|
288
|
+
class="close-btn"
|
|
289
|
+
part="close"
|
|
290
|
+
type="button"
|
|
291
|
+
aria-label=${this.closeLabel}
|
|
292
|
+
title=${this.closeLabel}
|
|
293
|
+
?disabled=${!this.dismissable}
|
|
294
|
+
@click=${this.onCloseClick}
|
|
295
|
+
>
|
|
296
|
+
<svg
|
|
297
|
+
aria-hidden="true"
|
|
298
|
+
viewBox="0 0 24 24"
|
|
299
|
+
fill="none"
|
|
300
|
+
stroke="currentColor"
|
|
301
|
+
stroke-width="2"
|
|
302
|
+
stroke-linecap="round"
|
|
303
|
+
stroke-linejoin="round"
|
|
304
|
+
>
|
|
305
|
+
<path d="M18 6 6 18M6 6l12 12" />
|
|
306
|
+
</svg>
|
|
307
|
+
</button>
|
|
308
|
+
<div
|
|
309
|
+
class="scroll"
|
|
310
|
+
part="scroll"
|
|
311
|
+
tabindex=${this.scrollable?"0":s}
|
|
312
|
+
role=${this.scrollable?"region":s}
|
|
313
|
+
aria-labelledby=${this.scrollable&&this.hasHeading?"dialog-heading":s}
|
|
314
|
+
aria-label=${this.scrollable&&!this.hasHeading&&this.label?this.label:s}
|
|
315
|
+
>
|
|
316
|
+
<div class="image" part="image" ?hidden=${!this.hasImage}>
|
|
317
|
+
<slot name="image" @slotchange=${this.onSlotChange}></slot>
|
|
318
|
+
</div>
|
|
319
|
+
<div class="header" part="header" ?hidden=${!this.hasHeading}>
|
|
320
|
+
<div class="heading" part="heading" id="dialog-heading">
|
|
321
|
+
<slot name="heading" @slotchange=${this.onSlotChange}></slot>
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
<div class="body" part="body">
|
|
325
|
+
<div
|
|
326
|
+
class="subheading"
|
|
327
|
+
part="subheading"
|
|
328
|
+
id="dialog-subheading"
|
|
329
|
+
?hidden=${!this.hasSubheading}
|
|
330
|
+
>
|
|
331
|
+
<slot name="subheading" @slotchange=${this.onSlotChange}></slot>
|
|
332
|
+
</div>
|
|
333
|
+
<div class="content" part="content"><slot></slot></div>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
<div class="footer" part="footer" ?hidden=${!this.hasFooter}>
|
|
337
|
+
<slot name="footer" @slotchange=${this.onSlotChange}></slot>
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
340
|
+
</dialog>
|
|
341
|
+
`}};e([l({type:Boolean,reflect:!0})],j.prototype,"open",void 0),e([l({type:Boolean,reflect:!0})],j.prototype,"dismissable",void 0),e([l({type:Boolean,reflect:!0})],j.prototype,"alert",void 0),e([l({type:String})],j.prototype,"label",void 0),e([l({type:String,attribute:"close-label"})],j.prototype,"closeLabel",void 0),e([n()],j.prototype,"isActive",void 0),e([n()],j.prototype,"hasImage",void 0),e([n()],j.prototype,"hasHeading",void 0),e([n()],j.prototype,"hasSubheading",void 0),e([n()],j.prototype,"hasFooter",void 0),e([n()],j.prototype,"isModal",void 0),e([n()],j.prototype,"scrollable",void 0),j=e([t("mq-dialog")],j);export{j as MqDialog,MqDialogCloseEvent};
|
package/dist/ui/mq-tabs.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e as t,t as e}from"../chunks/custom-element-CiOhPWP1-DPpsGZrV.js";import{i as s,a as i,x as a}from"../chunks/lit-element-DiWJYFwC.js";import{n}from"../chunks/property-scuRaFcM.js";const r=s`
|
|
2
2
|
:host {
|
|
3
3
|
display: flex;
|
|
4
4
|
flex-direction: column;
|
|
5
5
|
}
|
|
6
|
-
`,o=
|
|
6
|
+
`,o=s`
|
|
7
7
|
:host {
|
|
8
8
|
display: flex;
|
|
9
9
|
align-items: center;
|
|
@@ -21,7 +21,7 @@ import{i as t,a as e,x as s}from"../chunks/lit-element-DiWJYFwC.js";import{n as
|
|
|
21
21
|
flex-direction: column;
|
|
22
22
|
align-items: stretch;
|
|
23
23
|
}
|
|
24
|
-
`,l=
|
|
24
|
+
`,l=s`
|
|
25
25
|
:host {
|
|
26
26
|
display: inline-flex;
|
|
27
27
|
flex: 1;
|
|
@@ -61,7 +61,7 @@ import{i as t,a as e,x as s}from"../chunks/lit-element-DiWJYFwC.js";import{n as
|
|
|
61
61
|
outline: 2px solid var(--color-primary-background-default, #4a1ea7);
|
|
62
62
|
outline-offset: 1px;
|
|
63
63
|
}
|
|
64
|
-
`,c=
|
|
64
|
+
`,c=s`
|
|
65
65
|
:host {
|
|
66
66
|
display: block;
|
|
67
67
|
padding: var(--mq-tabs-content-padding, var(--sp-5, 20px) 0 0);
|
|
@@ -76,4 +76,4 @@ import{i as t,a as e,x as s}from"../chunks/lit-element-DiWJYFwC.js";import{n as
|
|
|
76
76
|
outline: 2px solid var(--color-primary-background-default, #4a1ea7);
|
|
77
77
|
outline-offset: 2px;
|
|
78
78
|
}
|
|
79
|
-
`;let d=0;function h(t,e){t.hasAttribute("role")||t.setAttribute("role",e)}class MqTabsSelectEvent extends Event{static{this.eventName="onvaluechange"}constructor(t){super(MqTabsSelectEvent.eventName,{bubbles:!0,composed:!0}),this.value=t}}let u=class MqTabs extends
|
|
79
|
+
`;let d=0;function h(t,e){t.hasAttribute("role")||t.setAttribute("role",e)}class MqTabsSelectEvent extends Event{static{this.eventName="onvaluechange"}constructor(t){super(MqTabsSelectEvent.eventName,{bubbles:!0,composed:!0}),this.value=t}}let u=class MqTabs extends i{constructor(){super(...arguments),this.defaultValue=null,this.value=null,this.activationMode="automatic",this.instanceId=(d+=1,d),this.onRequestSelect=t=>{const e=t;e.value&&(this.value=e.value)},this.orphanTriggers=new Set,this.handleSlotChange=()=>{this.applySelection()}}static{this.styles=[r]}connectedCallback(){super.connectedCallback(),this.addEventListener(MqTabsSelectEvent.eventName,this.onRequestSelect)}disconnectedCallback(){this.removeEventListener(MqTabsSelectEvent.eventName,this.onRequestSelect),super.disconnectedCallback()}firstUpdated(){if(!this.value){const t=this.defaultValue??this.triggers[0]?.value??null;t&&(this.value=t)}this.applySelection()}updated(t){t.has("value")&&this.applySelection()}get triggers(){return Array.from(this.querySelectorAll("mq-tabs-trigger"))}get panels(){return Array.from(this.querySelectorAll("mq-tabs-content"))}applySelection(){const{value:t}=this,e=this.triggers,s=this.panels,i=e.some(e=>!!t&&e.value===t);e.forEach((e,a)=>{const n=!!t&&e.value===t,r=s.find(t=>t.value===e.value);e.id||(e.id=`mq-tabs-${this.instanceId}-trigger-${a}`),r&&!r.id&&(r.id=`mq-tabs-${this.instanceId}-panel-${a}`),r?(e.setAttribute("aria-controls",r.id),r.setAttribute("aria-labelledby",e.id)):(e.removeAttribute("aria-controls"),this.warnOrphanTrigger(e.value)),e.active=n,e.tabIndex=n||!i&&0===a?0:-1});for(const e of s)e.active=!!t&&e.value===t}warnOrphanTrigger(t){t&&!this.orphanTriggers.has(t)&&(this.orphanTriggers.add(t),console.warn(`mq-tabs: no <mq-tabs-content value="${t}"> matches the trigger with that value, so the tab controls nothing and its panel will never show.`))}render(){return a`<slot @slotchange=${this.handleSlotChange}></slot>`}};t([n({type:String,attribute:"default-value"})],u.prototype,"defaultValue",void 0),t([n({type:String,reflect:!0})],u.prototype,"value",void 0),t([n({type:String,attribute:"activation-mode"})],u.prototype,"activationMode",void 0),u=t([e("mq-tabs")],u);let p=class MqTabsList extends i{constructor(){super(...arguments),this.label="",this.orientation="horizontal",this.handleSlotChange=()=>{this.closest("mq-tabs")?.applySelection()},this.handleKeyDown=t=>{if(t.key!==this.nextKey&&t.key!==this.previousKey&&"Home"!==t.key&&"End"!==t.key)return;const e=t.composedPath().find(t=>t instanceof HTMLElement&&"MQ-TABS-TRIGGER"===t.tagName);if(!e)return;const s=this.enabledTriggers;if(0===s.length)return;t.preventDefault();const i=s.indexOf(e),a=s.length-1;let n;n="Home"===t.key?0:"End"===t.key?a:t.key===this.nextKey?-1===i?0:(i+1)%s.length:i<=0?a:i-1;const r=s[n];if(!r)return;r.focus();const o=this.closest("mq-tabs");o&&"automatic"!==o.activationMode||r.select()}}static{this.styles=[o]}connectedCallback(){super.connectedCallback(),h(this,"tablist"),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){this.removeEventListener("keydown",this.handleKeyDown),super.disconnectedCallback()}updated(){this.setAttribute("aria-orientation",this.orientation),this.label?this.setAttribute("aria-label",this.label):this.removeAttribute("aria-label")}get enabledTriggers(){return Array.from(this.querySelectorAll("mq-tabs-trigger:not([disabled])"))}get nextKey(){return"vertical"===this.orientation?"ArrowDown":"ArrowRight"}get previousKey(){return"vertical"===this.orientation?"ArrowUp":"ArrowLeft"}render(){return a`<slot @slotchange=${this.handleSlotChange}></slot>`}};t([n({type:String})],p.prototype,"label",void 0),t([n({type:String,reflect:!0})],p.prototype,"orientation",void 0),p=t([e("mq-tabs-list")],p);let b=class MqTabsTrigger extends i{constructor(){super(...arguments),this.disabled=!1,this.active=!1,this.handleClick=()=>{this.select()},this.handleKeyDown=t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),this.select())}}static{this.styles=[l]}connectedCallback(){super.connectedCallback(),h(this,"tab"),this.hasAttribute("tabindex")||(this.tabIndex=-1),this.addEventListener("click",this.handleClick),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){this.removeEventListener("click",this.handleClick),this.removeEventListener("keydown",this.handleKeyDown),super.disconnectedCallback()}updated(){this.setAttribute("aria-selected",this.active?"true":"false"),this.setAttribute("aria-disabled",this.disabled?"true":"false")}select(){!this.disabled&&this.value&&this.dispatchEvent(new MqTabsSelectEvent(this.value))}render(){return a`<slot></slot>`}};t([n({type:String,reflect:!0})],b.prototype,"value",void 0),t([n({type:Boolean,reflect:!0})],b.prototype,"disabled",void 0),t([n({type:Boolean,reflect:!0})],b.prototype,"active",void 0),b=t([e("mq-tabs-trigger")],b);let v=class MqTabsContent extends i{constructor(){super(...arguments),this.active=!1}static{this.styles=[c]}connectedCallback(){super.connectedCallback(),h(this,"tabpanel"),this.hasAttribute("tabindex")||(this.tabIndex=0)}updated(){this.toggleAttribute("hidden",!this.active)}render(){return a`<slot></slot>`}};t([n({type:String,reflect:!0})],v.prototype,"value",void 0),t([n({type:Boolean,reflect:!0})],v.prototype,"active",void 0),v=t([e("mq-tabs-content")],v);export{u as MqTabs,v as MqTabsContent,p as MqTabsList,MqTabsSelectEvent,b as MqTabsTrigger};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../chunks/custom-element-D2ziPxYE.js";import"../chunks/lit-element-DiWJYFwC.js";import"../chunks/property-scuRaFcM.js";import"../chunks/class-map-Co76I6aw.js";
|
|
1
|
+
import{_ as t,c as e}from"../chunks/custom-element-D2ziPxYE.js";import{x as r,i as a,a as i}from"../chunks/lit-element-DiWJYFwC.js";import{n as s}from"../chunks/property-scuRaFcM.js";import{e as o}from"../chunks/class-map-Co76I6aw.js";import{g as n,a as l,i as d}from"../chunks/format-tMwfQwDf.js";import"./mq-skeleton.js";import{m as c}from"../chunks/runtime-Bg1WXVCx.js";import{l as h}from"../chunks/localized-decorator-BlOuLhym.js";import{a as p}from"../chunks/addDays-CdyO-PRI.js";import{p as m,s as v,f as u}from"../chunks/parseISO-CEksKisk.js";import"../chunks/directive-2EDmOukv.js";import"../chunks/style-map-CIdqdn7C.js";const g=a`:host{display:block;font-family:var(--font-body)}.time-slot-picker{display:flex;flex-direction:column;gap:var(--sp-4);border-radius:var(--border-radius-lg);transition:opacity .2s}.time-slot-picker.is-loading{opacity:.6}.picker-content{display:flex;flex-direction:column;gap:var(--sp-4)}.columns-wrapper{position:relative;display:flex;flex-direction:column;gap:var(--sp-4);flex:1;min-width:0}.grid-container{display:grid;grid-template-columns:repeat(var(--visible-days,4),1fr);gap:var(--sp-2);position:relative}.dates-header{position:sticky;top:0;display:contents;z-index:10;padding-bottom:var(--sp-2)}.nav-button{position:absolute;top:var(--sp-9);transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:var(--size-6);height:var(--size-6);border:none;cursor:pointer;transition:background-color .2s;background:var(--color-primary);color:var(--color-white);border-radius:var(--border-radius-full);padding:0;z-index:20}.nav-button-prev{left:0;transform:translate(-50%,-50%)}.nav-button-next{right:0;transform:translate(50%,-50%)}.nav-button:hover:not(:disabled){background:var(--color-primary-dark)}.nav-button:disabled{background:var(--color-neutrals-background-disabled);color:var(--color-neutrals-text-medium);cursor:not-allowed}.date-card{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--sp-2) var(--sp-3);border:1px solid var(--color-neutrals-border-disabled);background:var(--color-white);border-radius:var(--border-radius-lg);transition:all .2s;min-width:var(--sp-16);height:var(--sp-18);flex:1}.date-weekday{font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);color:var(--color-neutrals-text-default);text-transform:capitalize}.date-day{font-size:var(--text-xl);font-weight:var(--font-weight-normal);color:var(--color-neutrals-text-default)}.date-month{font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);color:var(--color-neutrals-text-default);text-transform:capitalize}.time-slots-container{display:contents}.time-slots-column{display:flex;flex-direction:column;gap:var(--sp-2)}.time-slot{padding:var(--sp-2) var(--sp-1);border:1px solid color-mix(in srgb,var(--color-primary) 12%,transparent);background:var(--color-primary-background-extraWeak);border-radius:var(--border-radius-md);cursor:pointer;transition:all .2s;font-family:var(--font-body);font-size:var(--text-sm);font-weight:var(--font-weight-medium);color:var(--color-primary-text-link);text-align:center;min-width:var(--sp-16);height:var(--sp-11)}.time-slot:hover:not(.selected){background:color-mix(in srgb,var(--color-primary) 12%,var(--color-primary-background-extraWeak));border-color:color-mix(in srgb,var(--color-primary) 24%,transparent)}.time-slot.selected{border-color:var(--color-primary);background:var(--color-primary);color:var(--color-white);font-weight:var(--font-weight-bold)}.empty-state{display:flex;align-items:center;justify-content:center;padding:var(--sp-12) var(--sp-6);text-align:center;grid-column:1/-1;font-size:var(--text-sm);color:var(--color-neutrals-text-weak)}`;class WindowChangeEvent extends Event{static{this.eventName="window-change"}constructor(t){super(WindowChangeEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class SlotSelectEvent extends Event{static{this.eventName="slot-select"}constructor(t){super(SlotSelectEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}let y=class MqTimeSlotPicker extends i{constructor(){super(...arguments),this.locale="es-ES",this.slots=[],this.visibleDays=4,this.isLoading=!1,this.handlePrevious=()=>{if(!this.canGoPrevious)return;const t=this.getStartDate(),e=p(t,-this.visibleDays),r=this.getToday(),a=e<r?r:e,i=this.formatDate(a);this.dispatchEvent(new WindowChangeEvent({windowStartDate:i}))},this.handleNext=()=>{const t=this.getStartDate(),e=p(t,this.visibleDays),r=this.formatDate(e);this.dispatchEvent(new WindowChangeEvent({windowStartDate:r}))},this.handleTimeSlotSelect=(t,e)=>{const r=this.formatDate(t.date);this.selectedDate=r,this.selectedSlotKey=e.key,this.dispatchEvent(new SlotSelectEvent({slot:{key:e.key,date:e.date}}))}}static{this.styles=[g]}getToday(){return m(n(new Date,this.timezone))}getStartDate(){return this.windowStartDate?v(m(this.windowStartDate)):this.getToday()}get slotsByDate(){const t=new Map;for(const e of this.slots){const{dateKey:r,label:a}=l(e.date,this.timezone);t.has(r)||t.set(r,[]),t.get(r)?.push({key:e.key,label:a,date:e.date})}for(const e of t.values())e.sort((t,e)=>{const r=m(t.date),a=m(e.date);return r.getTime()-a.getTime()});return t}get visibleDaysList(){const t=this.getStartDate(),e=[],r=this.slotsByDate;for(let a=0;a<this.visibleDays;a++){const i=p(t,a),s=this.formatDate(i),o=r.get(s)||[];e.push({date:i,slots:o})}return e}get canGoPrevious(){return this.getStartDate()>this.getToday()}formatDate(t){return u(t,"yyyy-MM-dd")}formatDayHeader(t){return{weekday:new Intl.DateTimeFormat(this.locale,{weekday:"short"}).format(t),day:new Intl.DateTimeFormat(this.locale,{day:"numeric"}).format(t),month:new Intl.DateTimeFormat(this.locale,{month:"short"}).format(t)}}isDateSelected(t){if(!this.selectedDate)return!1;const e=m(this.selectedDate);return d(t,e)}isTimeSlotSelected(t,e){return this.isDateSelected(t.date)&&this.selectedSlotKey===e.key}get hasSlots(){return this.slots.length>0}renderSkeletonSlots(){return r`${Array.from({length:this.visibleDays}).map((t,e)=>{const a=[2,3,4,3],i=a[e%a.length]??3;return r`<div class="time-slots-column">${Array.from({length:i}).map(()=>r`<mq-skeleton width="100%" height="40px" border-radius="md"></mq-skeleton>`)}</div>`})}`}renderEmptyState(){return r`<div class="empty-state">${c("No hay horarios disponibles")}</div>`}render(){const t=this.canGoPrevious,e=!this.isLoading&&!this.hasSlots;return r`<div class="${o({"time-slot-picker":!0,"is-loading":this.isLoading})}" style="--visible-days:${this.visibleDays}"><div class="picker-content"><div class="columns-wrapper">${t?r`<button class="nav-button nav-button-prev" @click="${this.handlePrevious}" ?disabled="${this.isLoading}" aria-label="${c("Fechas anteriores")}">${r`<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_1510_1791)"><path d="M8.05454 11.9155L2.72136 6.29527C2.69487 6.26742 2.67385 6.23433 2.65951 6.19791C2.64517 6.16149 2.63779 6.12245 2.63779 6.08302C2.63779 6.04359 2.64517 6.00454 2.65951 5.96812C2.67385 5.9317 2.69487 5.89862 2.72136 5.87077L8.2124 0.0844726L8.61523 0.508968L3.32539 6.08302L8.45738 11.491L8.05454 11.9155Z" fill="currentColor"/></g><defs><clipPath id="clip0_1510_1791"><rect width="11.831" height="11.2273" fill="currentColor" transform="translate(11.2402 0.0844727) rotate(90)"/></clipPath></defs></svg>`}</button>`:null} ${r`<button class="nav-button nav-button-next" @click="${this.handleNext}" ?disabled="${this.isLoading}" aria-label="${c("Fechas siguientes")}">${r`<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_1510_474)"><path d="M3.94546 0.0845423L9.27864 5.70473C9.30513 5.73258 9.32615 5.76566 9.34049 5.80209C9.35483 5.83851 9.36221 5.87755 9.36221 5.91698C9.36221 5.95641 9.35483 5.99546 9.34049 6.03188C9.32615 6.0683 9.30513 6.10138 9.27864 6.12923L3.7876 11.9155L3.38477 11.491L8.67461 5.91698L3.54262 0.509039L3.94546 0.0845423Z" fill="currentColor"/></g><defs><clipPath id="clip0_1510_474"><rect width="11.831" height="11.2273" fill="currentColor" transform="translate(0.759766 11.9155) rotate(-90)"/></clipPath></defs></svg>`}</button>`}<div class="grid-container"><div class="dates-header">${this.visibleDaysList.map(t=>{const{weekday:e,day:a,month:i}=this.formatDayHeader(t.date);return r`<div class="date-card"><div class="date-weekday">${e}</div><div class="date-day">${a}</div><div class="date-month">${i}</div></div>`})}</div><div class="time-slots-container">${e?this.renderEmptyState():this.isLoading?this.renderSkeletonSlots():this.visibleDaysList.map(t=>{const e=this.isDateSelected(t.date);return r`<div class="${o({"time-slots-column":!0,active:e})}">${t.slots.map(e=>{const a=this.isTimeSlotSelected(t,e);return r`<button class="${o({"time-slot":!0,selected:a})}" @click="${()=>this.handleTimeSlotSelect(t,e)}">${e.label}</button>`})}</div>`})}</div></div></div></div></div>`}};t([s({type:String})],y.prototype,"locale",void 0),t([s({type:String})],y.prototype,"timezone",void 0),t([s({type:Array})],y.prototype,"slots",void 0),t([s({type:String,attribute:"selected-date"})],y.prototype,"selectedDate",void 0),t([s({type:String,attribute:"selected-slot-key"})],y.prototype,"selectedSlotKey",void 0),t([s({type:String,attribute:"window-start-date"})],y.prototype,"windowStartDate",void 0),t([s({type:Number,attribute:"visible-days"})],y.prototype,"visibleDays",void 0),t([s({type:Boolean,attribute:"is-loading"})],y.prototype,"isLoading",void 0),y=t([h(),e("mq-time-slot-picker")],y);export{y as MqTimeSlotPicker,SlotSelectEvent,WindowChangeEvent};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mediquo/elements",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.6",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Mediquo elements web components",
|
|
7
7
|
"license": "ISC",
|
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"locale:build": "lit-localize build"
|
|
183
183
|
},
|
|
184
184
|
"dependencies": {
|
|
185
|
+
"@date-fns/tz": "^1.5.0",
|
|
185
186
|
"@lit/context": "^1.1.5",
|
|
186
187
|
"@lit/localize": "^0.12.2",
|
|
187
188
|
"@lit/react": "^1.0.8",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as r,t}from"./parseISO-Dj3qSTG8.js";function n(n,s,a){return function(n,s){return r(n,+t(n)+s)}(n,1e3*s)}export{n as a};
|