@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.
Files changed (141) hide show
  1. package/README.md +9 -0
  2. package/dist/chunks/addDays-CdyO-PRI.js +1 -0
  3. package/dist/chunks/addSeconds-fO5orJrt.js +1 -0
  4. package/dist/chunks/api-chat-client-DgSWD5IP.js +1 -0
  5. package/dist/chunks/{apple-pay-outcomes-tbZjXEYD.js → apple-pay-outcomes-Bm2QZwZx.js} +1 -1
  6. package/dist/chunks/appointment-details-BYGwLfww.js +1 -0
  7. package/dist/chunks/ca_ES-mW7NQKWA.js +1 -0
  8. package/dist/chunks/chunk-NIAGR3ZC-BDlNUZa1.js +1 -0
  9. package/dist/chunks/custom-element-CiOhPWP1-DPpsGZrV.js +1 -0
  10. package/dist/chunks/de_DE-Bz01AZ5g.js +1 -0
  11. package/dist/chunks/documentation-view-DbtlEQSG.js +1 -0
  12. package/dist/chunks/en_US-CV2TVb45.js +1 -0
  13. package/dist/chunks/format-tMwfQwDf.js +1 -0
  14. package/dist/chunks/{index-C1325SFM.d.ts → index-CsFUct9e.d.ts} +1 -0
  15. package/dist/chunks/index-D2yqKnpP.js +1 -0
  16. package/dist/chunks/{index-C8O_sOOh.js → index-DOkZ23_U.js} +1 -1
  17. package/dist/chunks/index-Detg0o-C.js +1 -0
  18. package/dist/chunks/{index-pnQMnaEN.d.ts → index-MVR2p_EX.d.ts} +1 -0
  19. package/dist/chunks/isBefore-DBi1CiNR.js +1 -0
  20. package/dist/chunks/mq-chat-room-82OqHZDt.js +1 -0
  21. package/dist/chunks/{mq-chat-room-CWIDQUxq.d.ts → mq-chat-room-ZNKKjO5n.d.ts} +4 -0
  22. package/dist/chunks/mq-next-appointments-D4w-LJmF.js +1 -0
  23. package/dist/chunks/{mq-professional-presence-sync-cmg6CXhz.d.ts → mq-professional-presence-sync-BPb8GjLT.d.ts} +0 -1
  24. package/dist/chunks/mq-professional-presence-sync-CnwOuX68.js +1 -0
  25. package/dist/chunks/{mq-recent-documents-B8-mnfxp.js → mq-recent-documents-Cr6u6xRi.js} +1 -1
  26. package/dist/chunks/mq-schedule-D7axS8UJ.js +1 -0
  27. package/dist/chunks/mq-support-chat-C-dyTXms.js +1 -0
  28. package/dist/chunks/{mq-unread-count-sync-DTn9dfR4.d.ts → mq-unread-count-sync-D3KUuLPV.d.ts} +0 -1
  29. package/dist/chunks/mq-unread-count-sync-Dqf98Tn_.js +1 -0
  30. package/dist/chunks/mq-videocall-RE4mE__m.js +1 -0
  31. package/dist/chunks/next-appointment-card-CQxPBnp_.js +1 -0
  32. package/dist/chunks/{next-appointment-card-Cd6GXAne.d.ts → next-appointment-card-CrXZEw8L.d.ts} +18 -4
  33. package/dist/chunks/parseISO-CEksKisk.js +1 -0
  34. package/dist/chunks/pt_PT-9EoQbEa0.js +1 -0
  35. package/dist/chunks/{refund-cancel-policy-C_9LyN_y.js → refund-cancel-policy-DoMzcLlL.js} +1 -1
  36. package/dist/chunks/{telemetry-client-dwDzxn9N.js → telemetry-client-K37KMdy_.js} +1 -1
  37. package/dist/env.js +1 -1
  38. package/dist/i18n.js +1 -1
  39. package/dist/mq-api-client-provider.js +1 -1
  40. package/dist/mq-apple-pay-checkout.js +1 -1
  41. package/dist/mq-appointment-checkout.js +1 -1
  42. package/dist/mq-appointment-documentation.d.ts +2 -2
  43. package/dist/mq-appointment-documentation.js +1 -1
  44. package/dist/mq-chat-room.d.ts +1 -1
  45. package/dist/mq-chat-room.js +1 -1
  46. package/dist/mq-checkout.js +1 -1
  47. package/dist/mq-dashboard.d.ts +3 -3
  48. package/dist/mq-dashboard.js +1 -1
  49. package/dist/mq-documents.d.ts +1 -1
  50. package/dist/mq-documents.js +1 -1
  51. package/dist/mq-google-pay-checkout.js +1 -1
  52. package/dist/mq-immediate-videocall-checkout.js +1 -1
  53. package/dist/mq-my-appointments.d.ts +2 -4
  54. package/dist/mq-my-appointments.js +1 -1
  55. package/dist/mq-next-appointments.d.ts +2 -2
  56. package/dist/mq-next-appointments.js +1 -1
  57. package/dist/mq-payment-poller.js +1 -1
  58. package/dist/mq-professional-presence-sync.d.ts +1 -1
  59. package/dist/mq-professional-presence-sync.js +1 -1
  60. package/dist/mq-recent-documents.d.ts +1 -1
  61. package/dist/mq-recent-documents.js +1 -1
  62. package/dist/mq-schedule-success.d.ts +1 -3
  63. package/dist/mq-schedule-success.js +2 -2
  64. package/dist/mq-schedule.d.ts +14 -7
  65. package/dist/mq-schedule.js +1 -1
  66. package/dist/mq-support-chat.d.ts +1 -1
  67. package/dist/mq-support-chat.js +1 -1
  68. package/dist/mq-terms-and-conditions.js +1 -1
  69. package/dist/mq-unread-count-sync.d.ts +1 -1
  70. package/dist/mq-unread-count-sync.js +1 -1
  71. package/dist/mq-videocall.d.ts +2 -2
  72. package/dist/mq-videocall.js +1 -1
  73. package/dist/react/mq-api-client-provider.js +1 -1
  74. package/dist/react/mq-apple-pay-checkout.js +1 -1
  75. package/dist/react/mq-appointment-checkout.js +1 -1
  76. package/dist/react/mq-appointment-documentation.d.ts +2 -2
  77. package/dist/react/mq-appointment-documentation.js +1 -1
  78. package/dist/react/mq-chat-room.d.ts +1 -1
  79. package/dist/react/mq-chat-room.js +1 -1
  80. package/dist/react/mq-checkout.js +1 -1
  81. package/dist/react/mq-dashboard.d.ts +3 -3
  82. package/dist/react/mq-dashboard.js +1 -1
  83. package/dist/react/mq-documents-page.d.ts +1 -1
  84. package/dist/react/mq-documents-page.js +1 -1
  85. package/dist/react/mq-documents.d.ts +1 -1
  86. package/dist/react/mq-documents.js +1 -1
  87. package/dist/react/mq-google-pay-checkout.js +1 -1
  88. package/dist/react/mq-immediate-videocall-checkout.js +1 -1
  89. package/dist/react/mq-my-appointments.d.ts +2 -3
  90. package/dist/react/mq-my-appointments.js +1 -1
  91. package/dist/react/mq-next-appointments.d.ts +2 -2
  92. package/dist/react/mq-next-appointments.js +1 -1
  93. package/dist/react/mq-payment-poller.js +1 -1
  94. package/dist/react/mq-professional-presence-sync.d.ts +1 -1
  95. package/dist/react/mq-professional-presence-sync.js +1 -1
  96. package/dist/react/mq-recent-documents.d.ts +1 -1
  97. package/dist/react/mq-recent-documents.js +1 -1
  98. package/dist/react/mq-schedule-success.d.ts +1 -2
  99. package/dist/react/mq-schedule-success.js +1 -1
  100. package/dist/react/mq-schedule.d.ts +2 -1
  101. package/dist/react/mq-schedule.js +1 -1
  102. package/dist/react/mq-socket-provider.js +1 -1
  103. package/dist/react/mq-support-chat.d.ts +1 -1
  104. package/dist/react/mq-support-chat.js +1 -1
  105. package/dist/react/mq-terms-and-conditions.js +1 -1
  106. package/dist/react/mq-unread-count-sync.d.ts +1 -1
  107. package/dist/react/mq-unread-count-sync.js +1 -1
  108. package/dist/react/mq-videocall.d.ts +2 -2
  109. package/dist/react/mq-videocall.js +1 -1
  110. package/dist/theme.d.ts +9 -0
  111. package/dist/theme.js +1 -1
  112. package/dist/ui/mq-calendar.d.ts +2 -0
  113. package/dist/ui/mq-calendar.js +1 -1
  114. package/dist/ui/mq-dialog.d.ts +62 -13
  115. package/dist/ui/mq-dialog.js +341 -1
  116. package/dist/ui/mq-tabs.js +5 -5
  117. package/dist/ui/mq-time-slot-picker.d.ts +1 -0
  118. package/dist/ui/mq-time-slot-picker.js +1 -1
  119. package/package.json +2 -1
  120. package/dist/chunks/addSeconds-CXt0dUch.js +0 -1
  121. package/dist/chunks/api-chat-client-3tgSK-oL.js +0 -1
  122. package/dist/chunks/appointment-details-DpawC6lW.js +0 -1
  123. package/dist/chunks/ca_ES-DMretbb7.js +0 -1
  124. package/dist/chunks/chunk-2TKJJNS7-DzhxHWWb.js +0 -1
  125. package/dist/chunks/de_DE-DUtzXD1z.js +0 -1
  126. package/dist/chunks/documentation-view-CSMoGBMk.js +0 -1
  127. package/dist/chunks/en_US-mxYf5Jqv.js +0 -1
  128. package/dist/chunks/format-CRFiCNHw.js +0 -1
  129. package/dist/chunks/index-2xVO6z8H.js +0 -1
  130. package/dist/chunks/index-CV03omw_.js +0 -1
  131. package/dist/chunks/index-D13HvA4a.js +0 -1
  132. package/dist/chunks/isBefore-Dfww5192.js +0 -1
  133. package/dist/chunks/isSameDay-CuhZMy1T.js +0 -1
  134. package/dist/chunks/mq-chat-room-3PU4Fsub.js +0 -1
  135. package/dist/chunks/mq-next-appointments-DfszxI2l.js +0 -1
  136. package/dist/chunks/mq-schedule-aoRvmsws.js +0 -1
  137. package/dist/chunks/mq-support-chat-KBgsUQKV.js +0 -1
  138. package/dist/chunks/mq-videocall-B3iq_BOi.js +0 -1
  139. package/dist/chunks/next-appointment-card-Cj-3N8jg.js +0 -1
  140. package/dist/chunks/parseISO-Dj3qSTG8.js +0 -1
  141. package/dist/chunks/pt_PT-g8meEZVV.js +0 -1
@@ -1 +1,341 @@
1
- import{_ as e,c as t}from"../chunks/custom-element-D2ziPxYE.js";import{i as o,a as i,x as a}from"../chunks/lit-element-DiWJYFwC.js";import{n as s}from"../chunks/property-scuRaFcM.js";import{r}from"../chunks/state-LQivXIgA.js";import{xIcon as n}from"./icons/x-icon.js";import"../chunks/if-defined-BYeVdwgd.js";import"./icons/types.js";const l=o`:host{display:contents}dialog.root{padding:0;border:none;margin:0;max-width:none;max-height:none;position:fixed;inset:0;width:100%;height:100%;background:var(--dialog-underlay);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity var(--dialog-transition-duration) ease}dialog.root:not([open]){display:none}dialog.root::backdrop{background:0 0}.dialog{background:var(--color-neutrals-background-extraWeak,var(--color-background,var(--color-white)));color:var(--color-neutrals-text-default,var(--color-foreground,var(--color-black)));border-radius:var(--border-radius-lg);width:calc(100% - var(--mq-safe-left,0px) - var(--mq-safe-right,0px));max-height:calc(100vh - var(--mq-safe-top,0px) - var(--mq-safe-bottom,0px));margin-top:var(--mq-safe-top,0);margin-bottom:var(--mq-safe-bottom,0);margin-left:var(--mq-safe-left,0);margin-right:var(--mq-safe-right,0);box-shadow:var(--dialog-shadow);outline:0;display:flex;flex-direction:column;overflow:hidden;opacity:0;transition:opacity var(--dialog-transition-duration,180ms) ease,transform var(--dialog-transition-duration,180ms) ease;transform:scale(.95);position:relative}.heading{padding:var(--sp-4) var(--sp-5) 0 var(--sp-5);font-size:var(--text-lg);font-weight:var(--font-weight-semibold)}.subheading{padding:var(--sp-1) var(--sp-5) 0 var(--sp-5);color:var(--color-neutrals-text-medium,var(--color-gray-darker));font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal)}.content{padding:var(--sp-3) var(--sp-5) var(--sp-5) var(--sp-5);flex:1;min-height:0;overflow-y:auto}dialog.root.active{opacity:1}dialog.root.active .dialog{opacity:1;transform:scale(1)}.close-btn{position:absolute;top:var(--sp-2);right:var(--sp-2);border:none;background:0 0;padding:var(--sp-2);border-radius:var(--border-radius-lg);cursor:pointer;line-height:0;color:inherit}.close-btn:hover{background:var(--dialog-close-hover-bg)}.close-btn:disabled{opacity:.4;cursor:default}@media (min-width:768px){.dialog{min-width:425px;max-width:min(470px,calc(100vw - var(--sp-8)))}}`,d=["a[href]","area[href]","button",'input:not([type="hidden"])',"select","textarea","iframe","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"[tabindex]"].join(",");let c=class MqDialog extends i{constructor(){super(...arguments),this.open=!1,this.dismissable=!0,this.isActive=!1,this.closeTimer=null,this.onDialogClick=e=>{this.dismissable&&e.target===this.shadowRoot?.querySelector("dialog")&&this.requestClose()},this.onCancel=e=>{e.preventDefault(),this.dismissable&&this.requestClose()},this.onNativeClose=()=>{this.open&&(this.open=!1)},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 o=t[0],i=t[t.length-1];if(!o||!i)return;const a=this.getDeepActiveElement();e.shiftKey||a!==i?e.shiftKey&&a===o&&(e.preventDefault(),i.focus()):(e.preventDefault(),o.focus())}}static{this.styles=[l]}updated(e){if(!e.has("open"))return;const t=this.shadowRoot?.querySelector("dialog");t&&(this.open?(this.closeTimer&&(window.clearTimeout(this.closeTimer),this.closeTimer=null),t.open||"function"!=typeof t.showModal||t.showModal(),requestAnimationFrame(()=>{this.isActive=!0})):(this.isActive=!1,this.closeTimer&&window.clearTimeout(this.closeTimer),this.closeTimer=window.setTimeout(()=>{t.open&&t.close(),this.closeTimer=null},200)))}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 o of e.shadowRoot.children)this.collectTabbable(o,t);else if(e instanceof HTMLSlotElement)for(const o of e.assignedElements({flatten:!0}))this.collectTabbable(o,t);else for(const o of e.children)this.collectTabbable(o,t)}isTabbable(e){if(!(e instanceof HTMLElement))return!1;if(!e.matches(d))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 CustomEvent("mq-close",{bubbles:!0,composed:!0})),this.open=!1}render(){return a`<dialog class="root ${this.isActive?"active":""}" @click="${this.onDialogClick}" @keydown="${this.onKeyDown}" @cancel="${this.onCancel}" @close="${this.onNativeClose}" aria-labelledby="dialog-heading" aria-describedby="dialog-subheading"><div class="dialog" part="dialog"><button class="close-btn" part="close" type="button" aria-label="Close dialog" title="Close" ?disabled="${!this.dismissable}" @click="${this.onCloseClick}">${n({size:20})}</button><div class="heading" part="heading" id="dialog-heading"><slot name="heading"></slot></div><div class="subheading" part="subheading" id="dialog-subheading"><slot name="subheading"></slot></div><div class="content" part="content"><slot></slot></div></div></dialog>`}};e([s({type:Boolean,reflect:!0})],c.prototype,"open",void 0),e([s({type:Boolean,reflect:!0})],c.prototype,"dismissable",void 0),e([r()],c.prototype,"isActive",void 0),c=e([t("mq-dialog")],c);export{c as MqDialog};
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};
@@ -1,9 +1,9 @@
1
- import{i as t,a as e,x as s}from"../chunks/lit-element-DiWJYFwC.js";import{n as i}from"../chunks/property-scuRaFcM.js";function a(t,e,s,i){for(var a,n=arguments.length,r=n<3?e:i,o=t.length-1;o>=0;o--)(a=t[o])&&(r=(n<3?a(r):n>3?a(e,s,r):a(e,s))||r);return n>3&&r&&Object.defineProperty(e,s,r),r}"function"==typeof SuppressedError&&SuppressedError;const n=t=>(e,s)=>{const i=()=>{void 0===customElements.get(t)&&customElements.define(t,e)};void 0!==s?s.addInitializer(i):i()},r=t`
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=t`
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=t`
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=t`
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 e{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 s`<slot @slotchange=${this.handleSlotChange}></slot>`}};a([i({type:String,attribute:"default-value"})],u.prototype,"defaultValue",void 0),a([i({type:String,reflect:!0})],u.prototype,"value",void 0),a([i({type:String,attribute:"activation-mode"})],u.prototype,"activationMode",void 0),u=a([n("mq-tabs")],u);let p=class MqTabsList extends e{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 s`<slot @slotchange=${this.handleSlotChange}></slot>`}};a([i({type:String})],p.prototype,"label",void 0),a([i({type:String,reflect:!0})],p.prototype,"orientation",void 0),p=a([n("mq-tabs-list")],p);let b=class MqTabsTrigger extends e{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 s`<slot></slot>`}};a([i({type:String,reflect:!0})],b.prototype,"value",void 0),a([i({type:Boolean,reflect:!0})],b.prototype,"disabled",void 0),a([i({type:Boolean,reflect:!0})],b.prototype,"active",void 0),b=a([n("mq-tabs-trigger")],b);let v=class MqTabsContent extends e{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 s`<slot></slot>`}};a([i({type:String,reflect:!0})],v.prototype,"value",void 0),a([i({type:Boolean,reflect:!0})],v.prototype,"active",void 0),v=a([n("mq-tabs-content")],v);export{u as MqTabs,v as MqTabsContent,p as MqTabsList,MqTabsSelectEvent,b as MqTabsTrigger};
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};
@@ -55,6 +55,7 @@ declare class MqTimeSlotPicker extends LitElement {
55
55
  windowStartDate?: string;
56
56
  visibleDays: number;
57
57
  isLoading: boolean;
58
+ private getToday;
58
59
  private getStartDate;
59
60
  /**
60
61
  * Organizes the flat array of slots into a map by date
@@ -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";export{M as MqTimeSlotPicker,S as SlotSelectEvent,W as WindowChangeEvent}from"../chunks/index-2xVO6z8H.js";import"./mq-skeleton.js";import"../chunks/runtime-Bg1WXVCx.js";import"../chunks/localized-decorator-BlOuLhym.js";import"../chunks/parseISO-Dj3qSTG8.js";import"../chunks/format-CRFiCNHw.js";import"../chunks/isSameDay-CuhZMy1T.js";import"../chunks/directive-2EDmOukv.js";import"../chunks/style-map-CIdqdn7C.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",
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};