@muibook/components 10.0.1 → 11.0.1

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 (150) hide show
  1. package/LICENSE +27 -11
  2. package/README.md +10 -4
  3. package/dist/esm/components/mui-accordion/block/index.js +9 -5
  4. package/dist/esm/components/mui-alert/index.js +88 -52
  5. package/dist/esm/components/mui-badge/index.js +61 -16
  6. package/dist/esm/components/mui-body/index.js +76 -10
  7. package/dist/esm/components/mui-button/index.js +152 -32
  8. package/dist/esm/components/mui-card/card/index.js +13 -8
  9. package/dist/esm/components/mui-checkbox/index.js +64 -30
  10. package/dist/esm/components/mui-chip/index.js +153 -33
  11. package/dist/esm/components/mui-chip-input/index.js +407 -0
  12. package/dist/esm/components/mui-code/index.js +11 -9
  13. package/dist/esm/components/mui-dialog/index.js +17 -8
  14. package/dist/esm/components/mui-dropdown/index.js +44 -44
  15. package/dist/esm/components/mui-field/index.js +56 -21
  16. package/dist/esm/components/mui-form-group/index.js +88 -0
  17. package/dist/esm/components/mui-form-hint/index.js +1 -0
  18. package/dist/esm/components/mui-form-message/index.js +72 -0
  19. package/dist/esm/components/mui-form-section/index.js +108 -0
  20. package/dist/esm/components/mui-form-section-footer/index.js +46 -0
  21. package/dist/esm/components/mui-hint/index.js +146 -0
  22. package/dist/esm/components/mui-icons/accessibility/index.js +5 -4
  23. package/dist/esm/components/mui-icons/add/index.js +1 -0
  24. package/dist/esm/components/mui-icons/ai/index.js +5 -4
  25. package/dist/esm/components/mui-icons/attention/index.js +1 -0
  26. package/dist/esm/components/mui-icons/calendar/index.js +5 -4
  27. package/dist/esm/components/mui-icons/check/index.js +6 -5
  28. package/dist/esm/components/mui-icons/checkmark/index.js +9 -8
  29. package/dist/esm/components/mui-icons/close/index.js +6 -5
  30. package/dist/esm/components/mui-icons/down-arrow-circle/index.js +9 -8
  31. package/dist/esm/components/mui-icons/down-chevron/index.js +8 -7
  32. package/dist/esm/components/mui-icons/ellipsis/index.js +1 -0
  33. package/dist/esm/components/mui-icons/exclamationmark/index.js +49 -0
  34. package/dist/esm/components/mui-icons/game-controller/index.js +8 -7
  35. package/dist/esm/components/mui-icons/gear/index.js +5 -4
  36. package/dist/esm/components/mui-icons/globe/index.js +8 -7
  37. package/dist/esm/components/mui-icons/grid/index.js +1 -0
  38. package/dist/esm/components/mui-icons/home/index.js +9 -8
  39. package/dist/esm/components/mui-icons/index.js +3 -0
  40. package/dist/esm/components/mui-icons/info/index.js +3 -2
  41. package/dist/esm/components/mui-icons/left-arrow/index.js +1 -0
  42. package/dist/esm/components/mui-icons/left-chevron/index.js +6 -5
  43. package/dist/esm/components/mui-icons/left-sidebar/index.js +6 -5
  44. package/dist/esm/components/mui-icons/list-and-film/index.js +1 -0
  45. package/dist/esm/components/mui-icons/menu/index.js +8 -7
  46. package/dist/esm/components/mui-icons/message/index.js +5 -4
  47. package/dist/esm/components/mui-icons/moon/index.js +3 -2
  48. package/dist/esm/components/mui-icons/movie-clapper/index.js +5 -4
  49. package/dist/esm/components/mui-icons/music-microphone/index.js +6 -5
  50. package/dist/esm/components/mui-icons/music-quarter-note/index.js +1 -0
  51. package/dist/esm/components/mui-icons/notification/index.js +5 -4
  52. package/dist/esm/components/mui-icons/pin/index.js +3 -2
  53. package/dist/esm/components/mui-icons/pin-slash/index.js +6 -5
  54. package/dist/esm/components/mui-icons/play-rectangle/index.js +9 -8
  55. package/dist/esm/components/mui-icons/play-stack/index.js +5 -4
  56. package/dist/esm/components/mui-icons/rectangle/index.js +6 -5
  57. package/dist/esm/components/mui-icons/rectangle-bottom-panel/index.js +1 -0
  58. package/dist/esm/components/mui-icons/rectangle-dashed/index.js +1 -0
  59. package/dist/esm/components/mui-icons/rectangle-left-drawer/index.js +1 -0
  60. package/dist/esm/components/mui-icons/rectangle-media-text/index.js +6 -5
  61. package/dist/esm/components/mui-icons/right-chevron/index.js +1 -0
  62. package/dist/esm/components/mui-icons/search/index.js +6 -5
  63. package/dist/esm/components/mui-icons/spinner/index.js +56 -0
  64. package/dist/esm/components/mui-icons/stop/index.js +3 -2
  65. package/dist/esm/components/mui-icons/subtract/index.js +1 -0
  66. package/dist/esm/components/mui-icons/sun/index.js +1 -0
  67. package/dist/esm/components/mui-icons/text-below-folder/index.js +55 -0
  68. package/dist/esm/components/mui-icons/toggle/index.js +8 -6
  69. package/dist/esm/components/mui-icons/translate/index.js +5 -4
  70. package/dist/esm/components/mui-icons/up-arrow/index.js +5 -4
  71. package/dist/esm/components/mui-icons/up-chevron/index.js +6 -5
  72. package/dist/esm/components/mui-icons/warning/index.js +7 -6
  73. package/dist/esm/components/mui-input/index.js +298 -47
  74. package/dist/esm/components/mui-link/index.js +187 -59
  75. package/dist/esm/components/mui-list/item/index.js +3 -0
  76. package/dist/esm/components/mui-markdown/index.js +149 -0
  77. package/dist/esm/components/mui-media-player/index.js +184 -0
  78. package/dist/esm/components/mui-message/index.js +50 -20
  79. package/dist/esm/components/mui-progress/index.js +15 -15
  80. package/dist/esm/components/mui-prompt/index.js +1461 -0
  81. package/dist/esm/components/mui-prompt-message/index.js +114 -0
  82. package/dist/esm/components/mui-prompt-preview/index.js +497 -0
  83. package/dist/esm/components/mui-prompt-toggle/index.js +48 -0
  84. package/dist/esm/components/mui-radio/index.js +155 -0
  85. package/dist/esm/components/mui-radio-group/index.js +104 -0
  86. package/dist/esm/components/mui-range-input/index.js +122 -0
  87. package/dist/esm/components/mui-rule/index.js +11 -3
  88. package/dist/esm/components/mui-select/index.js +89 -30
  89. package/dist/esm/components/mui-spinner/index.js +70 -0
  90. package/dist/esm/components/mui-stepper/step/index.js +255 -18
  91. package/dist/esm/components/mui-stepper/stepper/index.js +68 -72
  92. package/dist/esm/components/mui-table/row/index.js +16 -3
  93. package/dist/esm/components/mui-tabs/controller/index.js +21 -14
  94. package/dist/esm/components/mui-tabs/item/index.js +285 -29
  95. package/dist/esm/components/mui-tabs/panel/index.js +3 -0
  96. package/dist/esm/components/mui-tabs/tab-bar/index.js +85 -34
  97. package/dist/esm/components/mui-textarea/index.js +257 -0
  98. package/dist/esm/css/mui-base.css +27 -0
  99. package/dist/esm/css/mui-brand.css +3 -1
  100. package/dist/esm/css/mui-tokens.css +234 -7
  101. package/dist/esm/custom-elements.json +5202 -1791
  102. package/dist/esm/index.js +24 -4
  103. package/dist/esm/tokens/js/index.js +107 -105
  104. package/dist/types/components/mui-agent-bubble/doc.d.ts +2 -0
  105. package/dist/types/components/mui-agent-bubble/index.d.ts +1 -0
  106. package/dist/types/components/mui-agent-prompt/doc.d.ts +2 -0
  107. package/dist/types/components/mui-agent-prompt/index.d.ts +1 -0
  108. package/dist/types/components/mui-chip-input/doc.d.ts +2 -0
  109. package/dist/types/components/mui-chip-input/index.d.ts +3 -0
  110. package/dist/types/components/mui-form-group/doc.d.ts +2 -0
  111. package/dist/types/components/mui-form-group/index.d.ts +2 -0
  112. package/dist/types/components/mui-form-group-horizontal/index.d.ts +1 -0
  113. package/dist/types/components/mui-form-hint/doc.d.ts +2 -0
  114. package/dist/types/components/mui-form-hint/index.d.ts +1 -0
  115. package/dist/types/components/mui-form-message/index.d.ts +2 -0
  116. package/dist/types/components/mui-form-section/doc.d.ts +2 -0
  117. package/dist/types/components/mui-form-section/index.d.ts +1 -0
  118. package/dist/types/components/mui-form-section-footer/doc.d.ts +2 -0
  119. package/dist/types/components/mui-form-section-footer/index.d.ts +1 -0
  120. package/dist/types/components/mui-hint/doc.d.ts +2 -0
  121. package/dist/types/components/mui-hint/index.d.ts +1 -0
  122. package/dist/types/components/mui-icons/exclamationmark.d.ts +1 -0
  123. package/dist/types/components/mui-icons/index.d.ts +3 -0
  124. package/dist/types/components/mui-icons/spinner.d.ts +1 -0
  125. package/dist/types/components/mui-icons/text-below-folder.d.ts +1 -0
  126. package/dist/types/components/mui-markdown/doc.d.ts +2 -0
  127. package/dist/types/components/mui-markdown/index.d.ts +1 -0
  128. package/dist/types/components/mui-media-player/doc.d.ts +2 -0
  129. package/dist/types/components/mui-media-player/index.d.ts +8 -0
  130. package/dist/types/components/mui-prompt/doc.d.ts +2 -0
  131. package/dist/types/components/mui-prompt/index.d.ts +18 -0
  132. package/dist/types/components/mui-prompt-chip/index.d.ts +1 -0
  133. package/dist/types/components/mui-prompt-message/doc.d.ts +2 -0
  134. package/dist/types/components/mui-prompt-message/index.d.ts +1 -0
  135. package/dist/types/components/mui-prompt-preview/doc.d.ts +2 -0
  136. package/dist/types/components/mui-prompt-preview/index.d.ts +7 -0
  137. package/dist/types/components/mui-prompt-toggle/index.d.ts +1 -0
  138. package/dist/types/components/mui-radio/doc.d.ts +2 -0
  139. package/dist/types/components/mui-radio/index.d.ts +1 -0
  140. package/dist/types/components/mui-radio-group/index.d.ts +1 -0
  141. package/dist/types/components/mui-range-input/doc.d.ts +2 -0
  142. package/dist/types/components/mui-range-input/index.d.ts +1 -0
  143. package/dist/types/components/mui-spinner/doc.d.ts +2 -0
  144. package/dist/types/components/mui-spinner/index.d.ts +1 -0
  145. package/dist/types/components/mui-stepper/step/index.d.ts +4 -1
  146. package/dist/types/components/mui-textarea/doc.d.ts +2 -0
  147. package/dist/types/components/mui-textarea/index.d.ts +1 -0
  148. package/dist/types/index.d.ts +21 -0
  149. package/dist/types/tokens/js/index.d.ts +2 -0
  150. package/package.json +91 -1
@@ -0,0 +1,114 @@
1
+ import "../mui-body/index.js";
2
+ class u extends HTMLElement {
3
+ constructor() {
4
+ super(), this.resizeObserver = null, this.avatarSlotEl = null, this.contentSlotEl = null, this.attachShadow({ mode: "open" });
5
+ }
6
+ static get observedAttributes() {
7
+ return ["size", "variant", "density"];
8
+ }
9
+ connectedCallback() {
10
+ this.hasAttribute("size") || this.setAttribute("size", "medium"), this.hasAttribute("variant") || this.setAttribute("variant", "default"), this.hasAttribute("density") || this.setAttribute("density", "default"), this.render(), this.bindLayoutSync(), this.bindSlotSync();
11
+ }
12
+ attributeChangedCallback(t, e, s) {
13
+ e !== s && (this.render(), this.bindLayoutSync(), this.bindSlotSync());
14
+ }
15
+ disconnectedCallback() {
16
+ var t;
17
+ (t = this.resizeObserver) == null || t.disconnect(), this.resizeObserver = null, this.avatarSlotEl = null, this.contentSlotEl = null;
18
+ }
19
+ render() {
20
+ if (!this.shadowRoot) return;
21
+ const t = this.getAttribute("size") || "medium", e = {
22
+ "x-small": { gap: "var(--space-100)", padding: "var(--space-200)" },
23
+ small: { gap: "var(--space-200)", padding: "var(--space-300)" },
24
+ medium: { gap: "var(--space-300)", padding: "var(--space-400)" },
25
+ large: { gap: "var(--space-400)", padding: "var(--space-500)" }
26
+ }, s = e[t] || e.medium;
27
+ this.shadowRoot.innerHTML = /*html*/
28
+ `
29
+ <style>
30
+ :host {
31
+ display: block;
32
+ }
33
+ .bubble {
34
+ display: grid;
35
+ grid-template-columns: auto 1fr;
36
+ align-items: center;
37
+ gap: ${s.gap};
38
+ width: 100%;
39
+ box-sizing: border-box;
40
+ padding: ${s.padding};
41
+ border: var(--border-thin);
42
+ border-color: var(--form-default-border-color);
43
+ border-radius: var(--radius-300);
44
+ background: var(--surface-elevated-100);
45
+ }
46
+ :host([density="compact"]) .bubble {
47
+ padding: var(--stroke-size-100);
48
+ border-top-left-radius: var(--avatar-medium);
49
+ border-bottom-left-radius: var(--avatar-medium);
50
+ }
51
+ :host([variant="ghost"]) .bubble {
52
+ border: none;
53
+ background: transparent;
54
+ }
55
+ .content {
56
+ min-width: 0;
57
+ }
58
+ :host([multi-line]) .bubble {
59
+ align-items: start;
60
+ }
61
+ :host([multi-line]) .content {
62
+ margin-top: var(--space-050);
63
+ }
64
+ </style>
65
+
66
+ <div class="bubble">
67
+ <slot name="avatar" id="avatarSlot"></slot>
68
+ <div class="content">
69
+ <slot id="contentSlot">
70
+ <mui-body size="small"></mui-body>
71
+ </slot>
72
+ </div>
73
+ </div>
74
+ `;
75
+ }
76
+ bindSlotSync() {
77
+ if (!this.shadowRoot || (this.avatarSlotEl = this.shadowRoot.querySelector("#avatarSlot"), this.contentSlotEl = this.shadowRoot.querySelector("#contentSlot"), !this.avatarSlotEl || !this.contentSlotEl)) return;
78
+ const t = () => {
79
+ var r, o;
80
+ const e = this.getAttribute("size") || "medium", s = {
81
+ "x-small": "x-small",
82
+ small: "small",
83
+ medium: "small",
84
+ large: "medium"
85
+ }, i = {
86
+ "x-small": "x-small",
87
+ small: "small",
88
+ medium: "small",
89
+ large: "medium"
90
+ }, d = s[e] || "small", l = i[e] || "small";
91
+ (((r = this.avatarSlotEl) == null ? void 0 : r.assignedElements({ flatten: !0 })) || []).forEach((a) => {
92
+ a.tagName.toLowerCase() === "mui-avatar" && a.setAttribute("size", d);
93
+ }), (((o = this.contentSlotEl) == null ? void 0 : o.assignedElements({ flatten: !0 })) || []).forEach((a) => {
94
+ a.tagName.toLowerCase() === "mui-body" && a.setAttribute("size", l);
95
+ });
96
+ };
97
+ this.avatarSlotEl.addEventListener("slotchange", t), this.contentSlotEl.addEventListener("slotchange", t), t();
98
+ }
99
+ bindLayoutSync() {
100
+ var i;
101
+ if (!this.shadowRoot) return;
102
+ (i = this.resizeObserver) == null || i.disconnect(), this.resizeObserver = null;
103
+ const t = this.shadowRoot.querySelector(".content"), e = this.shadowRoot.querySelector("#contentSlot");
104
+ if (!t || !e) return;
105
+ const s = () => {
106
+ requestAnimationFrame(() => {
107
+ const l = e.assignedElements({ flatten: !0 })[0] || t, c = getComputedStyle(l).lineHeight || "0", n = Number.parseFloat(c), r = Number.isFinite(n) && n > 0 ? n : 20, o = Math.round(t.getBoundingClientRect().height / r);
108
+ this.toggleAttribute("multi-line", o > 1);
109
+ });
110
+ };
111
+ e.addEventListener("slotchange", s), typeof ResizeObserver < "u" && (this.resizeObserver = new ResizeObserver(() => s()), this.resizeObserver.observe(t), this.resizeObserver.observe(this)), s();
112
+ }
113
+ }
114
+ customElements.get("mui-prompt-message") || customElements.define("mui-prompt-message", u);
@@ -0,0 +1,497 @@
1
+ import "../mui-badge/index.js";
2
+ import "../mui-body/index.js";
3
+ import "../mui-button/index.js";
4
+ import "../mui-icons/close/index.js";
5
+ import "../mui-icons/play-rectangle/index.js";
6
+ import "../mui-icons/music-microphone/index.js";
7
+ import "../mui-stack/vstack/index.js";
8
+ import { getPartMap as E } from "../../utils/part-map/index.js";
9
+ class C extends HTMLElement {
10
+ constructor() {
11
+ super(), this.onDismiss = (e) => {
12
+ e.preventDefault(), e.stopPropagation(), this.dispatchEvent(
13
+ new CustomEvent("dismiss", {
14
+ detail: {
15
+ id: this.id || "",
16
+ value: this.getAttribute("value") || "",
17
+ label: this.getAttribute("label") || "Pasted Content",
18
+ badge: this.getAttribute("badge") || this.getBadge(this.getAttribute("value") || ""),
19
+ bgImage: this.getAttribute("bg-image") || "",
20
+ imageTint: this.getAttribute("image-tint") || ""
21
+ },
22
+ bubbles: !0,
23
+ composed: !0,
24
+ cancelable: !0
25
+ })
26
+ ) && this.remove();
27
+ }, this.onOpenPreview = (e) => {
28
+ e.preventDefault(), this.dispatchEvent(
29
+ new CustomEvent("prompt-preview-open", {
30
+ detail: {
31
+ id: this.id || "",
32
+ value: this.getAttribute("value") || "",
33
+ label: this.getAttribute("label") || "Pasted Content",
34
+ badge: this.getAttribute("badge") || this.getBadge(this.getAttribute("value") || ""),
35
+ bgImage: this.getAttribute("bg-image") || "",
36
+ imageTint: this.getAttribute("image-tint") || ""
37
+ },
38
+ bubbles: !0,
39
+ composed: !0
40
+ })
41
+ );
42
+ }, this.onKeyOpenPreview = (e) => {
43
+ e.key !== "Enter" && e.key !== " " || e.composedPath().some((s) => {
44
+ var r;
45
+ return s instanceof HTMLElement && ((r = s.classList) == null ? void 0 : r.contains("dismiss-action"));
46
+ }) || (e.preventDefault(), this.onOpenPreview(e));
47
+ }, this.attachShadow({ mode: "open" });
48
+ }
49
+ static get observedAttributes() {
50
+ return [
51
+ "value",
52
+ "badge",
53
+ "label",
54
+ "accent",
55
+ "bg-image",
56
+ "image-tint",
57
+ "inverted",
58
+ "badge-only",
59
+ "show-text",
60
+ "animated",
61
+ "animation-mode",
62
+ "variant",
63
+ "clickable"
64
+ ];
65
+ }
66
+ get value() {
67
+ return this.getAttribute("value") || "";
68
+ }
69
+ set value(e) {
70
+ this.setAttribute("value", e ?? "");
71
+ }
72
+ get badge() {
73
+ return this.getAttribute("badge") || "";
74
+ }
75
+ set badge(e) {
76
+ e == null || e === "" ? this.removeAttribute("badge") : this.setAttribute("badge", e);
77
+ }
78
+ get label() {
79
+ return this.getAttribute("label") || "";
80
+ }
81
+ set label(e) {
82
+ e == null || e === "" ? this.removeAttribute("label") : this.setAttribute("label", e);
83
+ }
84
+ get accent() {
85
+ return this.getAttribute("accent") || "";
86
+ }
87
+ set accent(e) {
88
+ e == null || e === "" ? this.removeAttribute("accent") : this.setAttribute("accent", e);
89
+ }
90
+ get bgImage() {
91
+ return this.getAttribute("bg-image") || "";
92
+ }
93
+ set bgImage(e) {
94
+ e == null || e === "" ? this.removeAttribute("bg-image") : this.setAttribute("bg-image", e);
95
+ }
96
+ get imageTint() {
97
+ return this.getAttribute("image-tint") || "";
98
+ }
99
+ set imageTint(e) {
100
+ e == null || e === "" ? this.removeAttribute("image-tint") : this.setAttribute("image-tint", e);
101
+ }
102
+ connectedCallback() {
103
+ this.applyAnimationDelayOffset(), this.render();
104
+ }
105
+ attributeChangedCallback(e, a, t) {
106
+ a !== t && this.render();
107
+ }
108
+ getBadge(e) {
109
+ const a = this.getAttribute("badge");
110
+ if (a) return a;
111
+ const t = e.trim(), s = t.match(/https?:\/\/[^\s]+/i);
112
+ if (s)
113
+ try {
114
+ const r = new URL(s[0]), i = r.hostname.toLowerCase(), n = r.pathname.toLowerCase();
115
+ if (/\.(png|jpe?g|gif|webp|svg|avif|bmp)$/.test(n)) return "IMG";
116
+ if (i === "youtu.be" || i.endsWith("youtube.com") || i.endsWith("youtube-nocookie.com") || i.endsWith("vimeo.com") || i.endsWith("twitch.tv")) return "VIDEO";
117
+ if (i.endsWith("soundcloud.com") || i.endsWith("spotify.com") || i.endsWith("bandcamp.com") || i.endsWith("mixcloud.com"))
118
+ return "MUSIC";
119
+ if (/\.(mp4|webm|mov|m4v|ogv)$/.test(n)) return "VIDEO";
120
+ if (/\.(mp3|wav|m4a|aac|flac|ogg|oga)$/.test(n)) return "MUSIC";
121
+ } catch {
122
+ }
123
+ return t.startsWith("{") || t.startsWith("[") ? "JSON" : /\{[\s\S]*\}/.test(t) && /:/.test(t) ? "CSS" : "Insightful";
124
+ }
125
+ getAccessibleSummary(e, a) {
126
+ const t = this.getAttribute("aria-label");
127
+ if (t) return t;
128
+ const s = this.getAttribute("label") || "Pasted content", r = e.trim(), i = r ? r.slice(0, 120) : "No preview text";
129
+ return `${s}. Type: ${a}. ${i}`;
130
+ }
131
+ extractUrl(e) {
132
+ const a = e.trim().match(/https?:\/\/[^\s]+/i);
133
+ if (!a) return null;
134
+ try {
135
+ return new URL(a[0]).toString();
136
+ } catch {
137
+ return null;
138
+ }
139
+ }
140
+ isImageUrl(e) {
141
+ try {
142
+ const a = new URL(e);
143
+ return /\.(png|jpe?g|gif|webp|svg|avif|bmp)$/i.test(a.pathname);
144
+ } catch {
145
+ return !1;
146
+ }
147
+ }
148
+ escapeHtml(e) {
149
+ return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
150
+ }
151
+ applyAnimationDelayOffset() {
152
+ const e = this.parentElement;
153
+ if (!e) return;
154
+ const a = Array.from(e.querySelectorAll("mui-prompt-preview")), t = Math.max(0, a.indexOf(this));
155
+ this.style.setProperty("--prompt-preview-sheen-delay", `${t * 220}ms`);
156
+ }
157
+ render() {
158
+ if (!this.shadowRoot) return;
159
+ const e = this.getAttribute("value") || "", a = e.trim() || "Paste long content to preview it here.", t = this.getBadge(e), s = E("text", "spacing", "layout", "visual"), r = this.getAttribute("accent") || "var(--prompt-preview-accent, var(--surface-elevated-200))", i = this.getAttribute("bg-image") || "", n = this.getAttribute("image-tint") || r, m = i ? n : r, b = this.hasAttribute("inverted"), u = this.hasAttribute("badge-only") ? !1 : !i || this.hasAttribute("show-text"), d = (this.getAttribute("animation-mode") || "loop").toLowerCase(), v = (this.getAttribute("variant") || "").toLowerCase(), h = (this.hasAttribute("animated") || !!i) && d !== "off", g = d === "once" ? "1" : "infinite", c = v === "overlay" || !!i, w = c ? "overlay" : "neutral", f = c ? "overlay" : "secondary", x = `dismiss-action${c ? "" : " dismiss-secondary"}`, y = this.hasAttribute("clickable"), o = this.extractUrl(e), A = !!(o && this.isImageUrl(o)), k = !!(o && !i && (t === "VIDEO" || t === "MUSIC")), $ = o ? this.escapeHtml(o) : "", z = i.replace(/"/g, "&quot;"), I = i ? `
160
+ linear-gradient(
161
+ 180deg,
162
+ color-mix(in srgb, ${n} 42%, transparent 58%) 0%,
163
+ color-mix(in srgb, ${n} 22%, transparent 78%) 30%,
164
+ color-mix(in srgb, #000 24%, transparent 76%) 100%
165
+ ),
166
+ url("${z}") center / cover no-repeat
167
+ ` : `
168
+ radial-gradient(
169
+ circle at 12% 18%,
170
+ color-mix(in srgb, ${r} var(--prompt-preview-accent-mix-100), transparent) 0 14%,
171
+ transparent 46%
172
+ ),
173
+ radial-gradient(
174
+ circle at 82% 22%,
175
+ color-mix(in srgb, ${r} var(--prompt-preview-accent-mix-200), transparent) 0 11%,
176
+ transparent 42%
177
+ ),
178
+ radial-gradient(
179
+ circle at 34% 76%,
180
+ color-mix(in srgb, ${r} var(--prompt-preview-accent-mix-300), transparent) 0 12%,
181
+ transparent 44%
182
+ ),
183
+ radial-gradient(
184
+ circle at 74% 70%,
185
+ color-mix(in srgb, ${r} var(--prompt-preview-accent-mix-400), transparent) 0 9%,
186
+ transparent 40%
187
+ ),
188
+ linear-gradient(
189
+ 180deg,
190
+ color-mix(in srgb, ${r} var(--prompt-preview-accent-mix-400), transparent) 0%,
191
+ color-mix(in srgb, ${r} var(--prompt-preview-accent-mix-500), transparent) 30%,
192
+ transparent 100%
193
+ )
194
+ `, P = `box${i ? " has-image" : ""}${c ? " variant-overlay" : ""}${b ? " inverted" : ""}`;
195
+ this.shadowRoot.innerHTML = /*html*/
196
+ `
197
+ <style>
198
+ :host {
199
+ display: block;
200
+ width: min(100%, calc(var(--space-800) * 2));
201
+ }
202
+ :host([clickable]) {
203
+ cursor: pointer;
204
+ }
205
+ :host([clickable]:focus-visible) {
206
+ outline: none;
207
+ }
208
+ :host([clickable]:focus-visible) .box {
209
+ outline: var(--outline-thick);
210
+ outline-width: var(--stroke-size-200);
211
+ outline-offset: 0;
212
+ }
213
+ .box {
214
+ position: relative;
215
+ border: var(--border-thin);
216
+ border-color: var(--form-default-border-color);
217
+ border-radius: var(--radius-200);
218
+ box-shadow:
219
+ var(--shadow-200),
220
+ 0 var(--stroke-size-100) var(--stroke-size-200) var(--black-opacity-20),
221
+ inset 0 0 0 1px color-mix(in srgb, ${m} 12%, transparent 88%),
222
+ inset 0 calc(var(--space-050) * -1) var(--space-300) color-mix(in srgb, #000 12%, transparent 88%);
223
+ filter: var(
224
+ --prompt-preview-box-drop-shadow,
225
+ drop-shadow(0 var(--stroke-size-100) var(--stroke-size-200) var(--black-opacity-20))
226
+ );
227
+ background: ${I};
228
+ box-sizing: border-box;
229
+ width: 100%;
230
+ min-height: calc(var(--space-600) * 2);
231
+ max-height: calc(var(--space-600) * 2);
232
+ overflow: hidden;
233
+ padding: var(--space-200);
234
+ display: flex;
235
+ flex-direction: column;
236
+ --prompt-preview-text-color: var(--text-color);
237
+ --prompt-preview-top-shade-start-active: var(--prompt-preview-top-shade-start);
238
+ --prompt-preview-top-shade-end-active: var(--prompt-preview-top-shade-end);
239
+ color: var(--prompt-preview-text-color);
240
+ }
241
+ .box.animated {
242
+ overflow: hidden;
243
+ }
244
+ .box.variant-overlay,
245
+ .box.has-image,
246
+ .box.inverted {
247
+ --prompt-preview-text-color: var(--white);
248
+ --prompt-preview-top-shade-start-active: var(--prompt-preview-top-shade-start-overlay);
249
+ --prompt-preview-top-shade-end-active: var(--prompt-preview-top-shade-end-overlay);
250
+ }
251
+ .top-shade {
252
+ position: absolute;
253
+ top: 0;
254
+ right: 0;
255
+ left: 0;
256
+ height: var(--prompt-preview-top-shade-height);
257
+ pointer-events: none;
258
+ z-index: 1;
259
+ background: linear-gradient(
260
+ 180deg,
261
+ var(--prompt-preview-top-shade-start-active) 0%,
262
+ var(--prompt-preview-top-shade-end-active) 100%
263
+ );
264
+ }
265
+ .box::before,
266
+ .box::after {
267
+ content: "";
268
+ position: absolute;
269
+ inset: 0;
270
+ border-radius: inherit;
271
+ pointer-events: none;
272
+ z-index: 0;
273
+ }
274
+ .box::before {
275
+ background: radial-gradient(
276
+ 120% 80% at 50% -10%,
277
+ color-mix(in srgb, ${m} 32%, transparent 68%) 0%,
278
+ transparent 70%
279
+ );
280
+ filter: blur(var(--space-050));
281
+ }
282
+ .box::after {
283
+ background: radial-gradient(
284
+ 120% 90% at 50% 110%,
285
+ color-mix(in srgb, #000 14%, transparent 86%) 0%,
286
+ transparent 72%
287
+ );
288
+ filter: blur(var(--space-100));
289
+ }
290
+ .box.animated::before {
291
+ animation: previewPulse 2400ms ease-in-out var(--prompt-preview-iterations);
292
+ }
293
+ .box.animated::after {
294
+ animation: previewPulse 3000ms ease-in-out var(--prompt-preview-iterations) reverse;
295
+ }
296
+ .box.animated .snippet {
297
+ animation: previewSnippetPulse 2600ms ease-in-out var(--prompt-preview-iterations);
298
+ }
299
+ .box.animated:not(.has-image)::before,
300
+ .box.animated:not(.has-image)::after {
301
+ opacity: 0.28;
302
+ }
303
+ .box.animated:not(.has-image) .snippet {
304
+ animation: none;
305
+ }
306
+ .scanline {
307
+ display: none;
308
+ }
309
+ .box.animated .scanline {
310
+ display: block;
311
+ position: absolute;
312
+ inset: 0;
313
+ pointer-events: none;
314
+ border-radius: inherit;
315
+ z-index: 2;
316
+ background: linear-gradient(
317
+ 100deg,
318
+ transparent 0%,
319
+ color-mix(in srgb, var(--white-opacity-70) 35%, transparent 65%) 45%,
320
+ transparent 100%
321
+ );
322
+ transform: translateX(-120%);
323
+ animation: previewScanline 3600ms cubic-bezier(0.22, 1, 0.36, 1) var(--prompt-preview-iterations);
324
+ animation-delay: var(--prompt-preview-sheen-delay, 0ms);
325
+ opacity: 0.16;
326
+ }
327
+ .box.animated:not(.has-image) .scanline {
328
+ opacity: 0.08;
329
+ filter: blur(var(--space-025));
330
+ animation-duration: 4200ms;
331
+ background: linear-gradient(
332
+ 100deg,
333
+ transparent 0%,
334
+ color-mix(in srgb, var(--white-opacity-30) 35%, transparent 65%) 45%,
335
+ transparent 100%
336
+ );
337
+ }
338
+ @keyframes previewScanline {
339
+ 0% { transform: translateX(-120%); opacity: 0; }
340
+ 10% { opacity: 0.62; }
341
+ 65% { opacity: 0.62; }
342
+ 100% { transform: translateX(120%); opacity: 0; }
343
+ }
344
+ @keyframes previewPulse {
345
+ 0%, 100% { opacity: 0.78; }
346
+ 50% { opacity: 1; }
347
+ }
348
+ @keyframes previewSnippetPulse {
349
+ 0%, 100% { opacity: 0.9; }
350
+ 50% { opacity: 1; }
351
+ }
352
+ @media (prefers-reduced-motion: reduce) {
353
+ .box.animated::before,
354
+ .box.animated::after,
355
+ .box.animated .snippet,
356
+ .box.animated .scanline {
357
+ animation: none;
358
+ }
359
+ }
360
+ mui-badge {
361
+ position: absolute;
362
+ z-index: 3;
363
+ top: calc(var(--space-100) + var(--stroke-size-100));
364
+ left: calc(var(--space-100) + var(--stroke-size-100));
365
+
366
+ }
367
+ .dismiss-action {
368
+ position: absolute;
369
+ top: var(--space-100);
370
+ right: var(--space-100);
371
+ z-index: 3;
372
+ opacity: 0;
373
+ pointer-events: none;
374
+ transform: translateY(calc(var(--stroke-size-100) * -1));
375
+ transition: opacity var(--speed-200) ease, transform var(--speed-200) ease;
376
+ }
377
+ :host(:hover) .dismiss-action,
378
+ :host(:focus-within) .dismiss-action {
379
+ opacity: 1;
380
+ pointer-events: auto;
381
+ transform: translateY(0);
382
+ }
383
+ .dismiss-secondary::part(background) {
384
+ background: var(--prompt-preview-dismiss-secondary-background);
385
+ }
386
+ .dismiss-secondary:hover::part(background),
387
+ .dismiss-secondary:focus-visible::part(background) {
388
+ background: var(--prompt-preview-dismiss-secondary-background-hover);
389
+ }
390
+ .dismiss-secondary::part(border) {
391
+ border: var(--prompt-preview-dismiss-secondary-border);
392
+ }
393
+ .dismiss-secondary:hover::part(border),
394
+ .dismiss-secondary:focus-visible::part(border) {
395
+ border: var(--prompt-preview-dismiss-secondary-border-hover);
396
+ }
397
+ .dismiss-action::part(outline) {
398
+ outline-width: var(--stroke-size-200);
399
+ }
400
+ .box.variant-overlay mui-badge,
401
+ .box.has-image mui-badge,
402
+ .box.inverted mui-badge {
403
+ box-shadow:
404
+ 0 var(--space-025) var(--space-100) var(--black-opacity-60);
405
+ border-radius: var(--badge-radius);
406
+ -webkit-backdrop-filter: blur(var(--space-050));
407
+ backdrop-filter: blur(var(--space-050));
408
+ }
409
+
410
+ .name,
411
+ .snippet {
412
+ flex: 1 1 auto;
413
+ min-height: 0;
414
+ min-width: 0;
415
+ position: relative;
416
+ z-index: 1;
417
+ }
418
+
419
+ .name::part(font-size),
420
+ .snippet::part(font-size) {
421
+ font-size: calc(var(--font-size-15) / 2);
422
+ line-height: var(--line-height-100);
423
+ }
424
+
425
+ .name {
426
+ max-width: 100%;
427
+ white-space: nowrap;
428
+ overflow: hidden;
429
+ text-overflow: ellipsis;
430
+ color: var(--prompt-preview-text-color);
431
+ }
432
+
433
+ .snippet {
434
+ overflow: hidden;
435
+ display: -webkit-box;
436
+ -webkit-box-orient: vertical;
437
+ -webkit-line-clamp: 3;
438
+ line-clamp: 3;
439
+ white-space: normal;
440
+ overflow-wrap: anywhere;
441
+ word-break: break-word;
442
+ color: color-mix(in srgb, var(--prompt-preview-text-color) 84%, transparent 16%);
443
+ }
444
+ .snippet-media-only {
445
+ display: inline-flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ width: 100%;
449
+ min-height: calc(var(--space-500) + var(--space-300));
450
+ }
451
+ .snippet-media-icon {
452
+ flex: 0 0 auto;
453
+ opacity: 0.5;
454
+ }
455
+ .snippet-image {
456
+ display: block;
457
+ width: 100%;
458
+ height: 100%;
459
+ max-height: calc(var(--space-600) + var(--space-200));
460
+ object-fit: cover;
461
+ border-radius: var(--radius-100);
462
+ }
463
+
464
+ .inner {
465
+ margin-top: var(--space-500);
466
+ min-width: 0;
467
+ width: 100%;
468
+ }
469
+ .inner.media-inline {
470
+ margin-top: var(--space-300);
471
+ }
472
+
473
+
474
+ .box.inverted .snippet {
475
+ color: color-mix(in srgb, var(--prompt-preview-text-color) 88%, transparent 12%);
476
+ }
477
+ </style>
478
+
479
+ <div class="${P}${h ? " animated" : ""}" part="${s}" style="--prompt-preview-iterations: ${g};">
480
+ <span class="top-shade"></span>
481
+ <span class="scanline"></span>
482
+ <mui-button class="${x}" icon-only size="xx-small" variant="${f}" aria-label="Dismiss preview">
483
+ <mui-icon-close size="xx-small"></mui-icon-close>
484
+ </mui-button>
485
+ <mui-badge variant="${w}" size="x-small">${t}</mui-badge>
486
+ <mui-v-stack class="inner${k ? " media-inline" : ""}" space="var(--space-025)" alignX="stretch">
487
+ ${u ? A && !i ? `<img class="snippet-image" src="${$}" alt="${this.escapeHtml(t)} preview image" />` : `<mui-body class="snippet" size="x-small" variant="optional">${o ? `${t === "VIDEO" ? '<span class="snippet-media-only"><mui-icon-play-rectangle class="snippet-media-icon" size="medium"></mui-icon-play-rectangle></span>' : t === "MUSIC" ? '<span class="snippet-media-only"><mui-icon-music-microphone class="snippet-media-icon" size="medium"></mui-icon-music-microphone></span>' : this.escapeHtml(a.slice(0, 260))}` : this.escapeHtml(a.slice(0, 260))}</mui-body>` : ""}
488
+ </mui-v-stack>
489
+ </div>
490
+ `;
491
+ const l = this.shadowRoot.querySelector(".dismiss-action");
492
+ l == null || l.addEventListener("click", this.onDismiss);
493
+ const p = this.shadowRoot.querySelector(".box");
494
+ p == null || p.removeEventListener("click", this.onOpenPreview), this.removeEventListener("keydown", this.onKeyOpenPreview), y ? (this.setAttribute("tabindex", this.getAttribute("tabindex") || "0"), this.setAttribute("role", this.getAttribute("role") || "button"), this.setAttribute("aria-haspopup", this.getAttribute("aria-haspopup") || "dialog"), this.hasAttribute("aria-label") || this.setAttribute("aria-label", this.getAccessibleSummary(e, t)), p == null || p.addEventListener("click", this.onOpenPreview), this.addEventListener("keydown", this.onKeyOpenPreview)) : (this.getAttribute("tabindex") === "0" && this.removeAttribute("tabindex"), this.getAttribute("role") === "button" && this.removeAttribute("role"), this.getAttribute("aria-haspopup") === "dialog" && this.removeAttribute("aria-haspopup"));
495
+ }
496
+ }
497
+ customElements.get("mui-prompt-preview") || customElements.define("mui-prompt-preview", C);
@@ -0,0 +1,48 @@
1
+ class r extends HTMLElement {
2
+ constructor() {
3
+ super(), this.observer = null, this.attachShadow({ mode: "open" });
4
+ }
5
+ static get observedAttributes() {
6
+ return ["mode"];
7
+ }
8
+ connectedCallback() {
9
+ this.hasAttribute("mode") || this.setAttribute("mode", "icon"), this.observer = new MutationObserver(() => this.syncMode()), this.observer.observe(this, { childList: !0, subtree: !0, attributes: !0, attributeFilter: ["hidden"] }), this.render();
10
+ }
11
+ disconnectedCallback() {
12
+ var t;
13
+ (t = this.observer) == null || t.disconnect();
14
+ }
15
+ attributeChangedCallback(t, s, i) {
16
+ t !== "mode" || s === i || this.syncMode();
17
+ }
18
+ normalizeMode() {
19
+ return this.getAttribute("mode") === "chip" ? "chip" : "icon";
20
+ }
21
+ syncMode() {
22
+ const t = this.normalizeMode(), s = Array.from(this.querySelectorAll('[slot="toggle"], [context-toggle]')), i = Array.from(
23
+ this.querySelectorAll(
24
+ '[slot="active"], [context-active], [context-close], [slot="chip"], [context-chip], [slot="spinner"], [context-spinner]'
25
+ )
26
+ );
27
+ s.forEach((e) => {
28
+ const o = t === "icon";
29
+ e.toggleAttribute("hidden", !o), e.style.display = o ? "" : "none";
30
+ }), i.forEach((e) => {
31
+ const o = t === "chip";
32
+ e.toggleAttribute("hidden", !o), e.style.display = o ? "" : "none";
33
+ });
34
+ }
35
+ render() {
36
+ this.shadowRoot && (this.shadowRoot.innerHTML = /*html*/
37
+ `
38
+ <style>
39
+ :host {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ }
43
+ </style>
44
+ <slot></slot>
45
+ `, this.syncMode());
46
+ }
47
+ }
48
+ customElements.get("mui-prompt-toggle") || customElements.define("mui-prompt-toggle", r);