@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
@@ -1,73 +1,134 @@
1
- class m extends HTMLElement {
1
+ class S extends HTMLElement {
2
2
  static get observedAttributes() {
3
- return ["type", "name", "value", "placeholder", "id", "label", "disabled", "hide-label", "variant"];
3
+ return [
4
+ "type",
5
+ "name",
6
+ "value",
7
+ "placeholder",
8
+ "id",
9
+ "label",
10
+ "disabled",
11
+ "hide-label",
12
+ "variant",
13
+ "optional",
14
+ "max-length",
15
+ "size",
16
+ "slot-layout"
17
+ ];
4
18
  }
5
19
  constructor() {
6
20
  super(), this.attachShadow({ mode: "open" });
7
21
  }
8
22
  connectedCallback() {
9
- this.render(), this.setupListener();
23
+ this.hasAttribute("size") || this.setAttribute("size", "medium"), this.render(), this.setupListener();
10
24
  }
11
25
  disconnectedCallback() {
12
26
  this.cleanupListeners();
13
27
  }
14
- attributeChangedCallback(e, r, o) {
15
- var s;
16
- const t = (s = this.shadowRoot) == null ? void 0 : s.querySelector("input");
17
- if (t) {
18
- if (e === "value") {
19
- t.value = o ?? "";
28
+ attributeChangedCallback(t, i, e) {
29
+ var d;
30
+ const o = (d = this.shadowRoot) == null ? void 0 : d.querySelector("input");
31
+ if (o) {
32
+ if (t === "value") {
33
+ o.value = e ?? "", this.updateCharacterCount();
20
34
  return;
21
35
  }
22
- if (e === "disabled") {
23
- o === null || o === "false" ? t.removeAttribute("disabled") : t.setAttribute("disabled", "");
36
+ if (t === "disabled") {
37
+ e === null || e === "false" ? o.removeAttribute("disabled") : o.setAttribute("disabled", "");
24
38
  return;
25
39
  }
26
- ["type", "placeholder", "label", "hide-label", "variant"].includes(e) && (this.render(), this.setupListener());
40
+ ["type", "placeholder", "label", "hide-label", "variant", "optional", "max-length", "size", "slot-layout"].includes(
41
+ t
42
+ ) && (this.render(), this.setupListener());
27
43
  }
28
44
  }
29
45
  cleanupListeners() {
30
- var r;
31
- const e = (r = this.shadowRoot) == null ? void 0 : r.querySelector("input");
32
- e && this._changeHandler && (e.removeEventListener("change", this._changeHandler), e.removeEventListener("input", this._changeHandler));
46
+ var i;
47
+ const t = (i = this.shadowRoot) == null ? void 0 : i.querySelector("input");
48
+ t && this._changeHandler && (t.removeEventListener("change", this._changeHandler), t.removeEventListener("input", this._changeHandler));
33
49
  }
34
50
  setupListener() {
35
51
  if (!this.shadowRoot) return;
36
- const e = this.shadowRoot.querySelector("input");
37
- e && (this.cleanupListeners(), this._changeHandler = (r) => {
38
- const o = r.target;
39
- this.setAttribute("value", o.value);
40
- const t = {
41
- detail: { value: o.value },
52
+ const t = this.shadowRoot.querySelector("input");
53
+ t && (this.cleanupListeners(), this._changeHandler = (i) => {
54
+ const e = i.target;
55
+ this.setAttribute("value", e.value);
56
+ const o = {
57
+ detail: { value: e.value },
42
58
  bubbles: !0,
43
59
  composed: !0
44
60
  };
45
- this.dispatchEvent(new CustomEvent("change", t)), this.dispatchEvent(new CustomEvent("input", t));
46
- }, e.addEventListener("change", this._changeHandler), e.addEventListener("input", this._changeHandler));
61
+ this.dispatchEvent(new CustomEvent("change", o)), this.dispatchEvent(new CustomEvent("input", o)), this.updateCharacterCount();
62
+ }, t.addEventListener("change", this._changeHandler), t.addEventListener("input", this._changeHandler), this.updateCharacterCount());
63
+ }
64
+ updateCharacterCount() {
65
+ var e, o;
66
+ const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("input"), i = (o = this.shadowRoot) == null ? void 0 : o.querySelector(".char-count");
67
+ !t || !i || t.maxLength <= 0 || (i.textContent = `${t.value.length}/${t.maxLength}`);
47
68
  }
48
69
  updateSlottedButtons() {
49
70
  requestAnimationFrame(() => {
50
- var t, s;
51
- const e = (t = this.shadowRoot) == null ? void 0 : t.querySelector('slot[name="before"]'), r = (s = this.shadowRoot) == null ? void 0 : s.querySelector('slot[name="after"]'), o = (l) => {
52
- if (!l) return;
53
- l.assignedNodes({ flatten: !0 }).forEach((i) => {
54
- if (i.nodeType === Node.ELEMENT_NODE) {
55
- const a = i, n = a.tagName.toLowerCase();
56
- (n === "mui-button" || n === "mui-link") && (a.setAttribute("usage", "input"), a.setAttribute("size", "medium"), a.removeAttribute("variant"), a.removeAttribute("weight"));
71
+ var l, h, p;
72
+ const t = this.getAttribute("size") || "medium", e = ["x-small", "small", "medium", "large"].includes(t) ? t : "medium", o = (l = this.shadowRoot) == null ? void 0 : l.querySelector('slot[name="before"]'), d = (h = this.shadowRoot) == null ? void 0 : h.querySelector('slot[name="after"]'), m = (p = this.shadowRoot) == null ? void 0 : p.querySelector('slot[name="hint"]'), u = (c) => {
73
+ if (!c) return;
74
+ c.assignedNodes({ flatten: !0 }).forEach((s) => {
75
+ if (s.nodeType === Node.ELEMENT_NODE) {
76
+ const r = s, a = r.tagName.toLowerCase();
77
+ (a === "mui-button" || a === "mui-link") && (r.setAttribute("usage", "input"), r.setAttribute("size", e), r.removeAttribute("variant"), r.removeAttribute("weight")), a === "mui-chip" && (r.setAttribute("usage", "input"), r.setAttribute("size", e));
57
78
  }
58
79
  });
59
80
  };
60
- o(e), o(r);
81
+ if (u(o), u(d), m) {
82
+ const c = {
83
+ "x-small": "xx-small",
84
+ small: "x-small",
85
+ medium: "x-small",
86
+ large: "small"
87
+ }, b = {
88
+ "x-small": "x-small",
89
+ small: "x-small",
90
+ medium: "small",
91
+ large: "medium"
92
+ }, s = c[e] || "x-small", r = b[e] || "small";
93
+ m.assignedNodes({ flatten: !0 }).forEach((a) => {
94
+ if (a.nodeType !== Node.ELEMENT_NODE) return;
95
+ const n = a, f = n.tagName.toLowerCase();
96
+ f.startsWith("mui-icon-") && !n.hasAttribute("size") && n.setAttribute("size", s), f === "mui-badge" && !n.hasAttribute("size") && n.setAttribute("size", r), n.setAttribute("aria-hidden", "true");
97
+ });
98
+ }
61
99
  });
62
100
  }
63
101
  render() {
64
- const e = ["text", "password", "email", "number", "search", "tel", "url", "date", "time"], r = this.getAttribute("type") || "text", o = e.includes(r) ? r : "text", t = this.getAttribute("name") || "", s = this.getAttribute("value") || "", l = this.getAttribute("placeholder") || "", d = this.getAttribute("id") || `mui-input-${Math.random().toString(36).substr(2, 9)}`, i = this.getAttribute("label") || "", a = this.hasAttribute("hide-label"), n = this.hasAttribute("disabled"), u = a && i ? `aria-label="${i}"` : "", c = this.getAttribute("variant") || "", h = c || "", b = this.querySelector('[slot="before"]') !== null, p = this.querySelector('[slot="after"]') !== null, f = [h, b ? "before" : "", p ? "after" : ""].filter(Boolean).join(" "), v = (
102
+ const t = [
103
+ "text",
104
+ "password",
105
+ "email",
106
+ "number",
107
+ "search",
108
+ "tel",
109
+ "url",
110
+ "date",
111
+ "time",
112
+ "datetime-local",
113
+ "month",
114
+ "week"
115
+ ], i = this.getAttribute("type") || "text", e = t.includes(i) ? i : "text", o = this.getAttribute("name") || "", d = this.getAttribute("value") || "", m = this.getAttribute("placeholder") || "", u = this.getAttribute("id") || `mui-input-${Math.random().toString(36).substr(2, 9)}`, l = this.getAttribute("label") || "", h = this.hasAttribute("optional"), p = this.hasAttribute("hide-label"), c = this.hasAttribute("disabled"), b = p && l ? `aria-label="${l}"` : "", s = this.getAttribute("max-length"), r = s && Number(s) > 0 ? String(Number(s)) : "", a = this.getAttribute("size") || "medium", f = ["x-small", "small", "medium", "large"].includes(a) ? a : "medium", v = this.getAttribute("variant") || "", g = v || "", x = (this.getAttribute("slot-layout") || "inline") === "stack-mobile" ? "input-wrapper stack-mobile" : "input-wrapper", w = this.querySelector('[slot="before"]') !== null, y = this.querySelector('[slot="after"]') !== null, z = this.querySelector('[slot="hint"]') !== null, E = [g, w ? "before" : "", y ? "after" : "", z ? "hint" : ""].filter(Boolean).join(" "), A = (
65
116
  /*html*/
66
117
  `
67
118
  <style>
68
119
  :host {
69
120
  display: inline-block;
70
121
  width: 100%;
122
+ container-type: inline-size;
123
+ }
124
+ :host([type="date"]),
125
+ :host([type="time"]),
126
+ :host([type="datetime-local"]),
127
+ :host([type="month"]),
128
+ :host([type="week"]),
129
+ :host([type="number"]),
130
+ :host([type="search"]) {
131
+ color-scheme: light dark;
71
132
  }
72
133
  label {
73
134
  display: block;
@@ -76,13 +137,153 @@ class m extends HTMLElement {
76
137
  margin-bottom: var(--space-100);
77
138
  color: var(--text-color);
78
139
  }
140
+ .label-with-optional {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: var(--space-100);
144
+ }
79
145
  .input-wrapper {
80
146
  display: flex;
81
147
  width: 100%;
148
+ align-items: stretch;
149
+ position: relative;
150
+ }
151
+ .input-wrapper.stack-mobile {
152
+ display: flex;
153
+ }
154
+ .before-slot,
155
+ .after-slot,
156
+ .hint-slot {
157
+ display: inline-flex;
158
+ align-items: stretch;
159
+ gap: var(--space-050);
160
+ flex-wrap: var(--input-slot-wrap, nowrap);
161
+ overflow-x: var(--input-slot-overflow-x, visible);
162
+ overflow-y: var(--input-slot-overflow-y, visible);
163
+ scrollbar-width: thin;
164
+ flex: 0 1 auto;
165
+ }
166
+ .hint-slot {
167
+ position: absolute;
168
+ right: var(--space-300);
169
+ top: 50%;
170
+ transform: translateY(-50%);
171
+ z-index: 1;
172
+ pointer-events: none;
173
+ display: inline-flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ color: var(--text-color-optional);
177
+ gap: var(--space-100);
178
+ overflow: visible;
179
+ flex: 0 0 auto;
180
+ }
181
+ :host([size="x-small"]) .hint-slot {
182
+ right: var(--space-200);
183
+ }
184
+ :host([size="small"]) .hint-slot {
185
+ right: var(--space-300);
186
+ }
187
+ :host([size="large"]) .hint-slot {
188
+ right: var(--space-400);
189
+ }
190
+ .before-slot {
191
+ max-width: none;
192
+ }
193
+ .after-slot {
194
+ max-width: none;
195
+ }
196
+ @container (min-width: 20rem) {
197
+ .before-slot {
198
+ max-width: var(--input-before-slot-max-width, 50%);
199
+ }
200
+ .after-slot {
201
+ max-width: var(--input-after-slot-max-width, 50%);
202
+ }
203
+ }
204
+ .input-wrapper.stack-mobile {
205
+ display: grid;
206
+ grid-template-columns: minmax(0, 1fr);
207
+ gap: var(--space-000);
208
+ }
209
+ .input-wrapper.stack-mobile .before-slot,
210
+ .input-wrapper.stack-mobile .after-slot {
211
+ display: flex;
212
+ max-width: 100%;
213
+ width: 100%;
214
+ flex: 1 1 auto;
215
+ overflow-x: visible;
216
+ overflow-y: visible;
217
+ }
218
+ .input-wrapper.stack-mobile .hint-slot {
219
+ right: var(--space-200);
220
+ top: calc(var(--action-icon-only-size) / 2);
221
+ transform: translateY(-50%);
222
+ }
223
+ .input-wrapper.stack-mobile slot[name="before"]::slotted(mui-addon),
224
+ .input-wrapper.stack-mobile slot[name="after"]::slotted(mui-addon) {
225
+ width: 100%;
226
+ }
227
+ .input-wrapper.stack-mobile .before-slot {
228
+ grid-row: 1;
229
+ }
230
+ .input-wrapper.stack-mobile input {
231
+ grid-row: 2;
232
+ }
233
+ .input-wrapper.stack-mobile .after-slot {
234
+ grid-row: 3;
235
+ }
236
+ .input-wrapper.stack-mobile input.before:not(.after) {
237
+ border-top-left-radius: 0;
238
+ border-top-right-radius: 0;
239
+ border-bottom-left-radius: var(--radius-100);
240
+ border-bottom-right-radius: var(--radius-100);
241
+ }
242
+ .input-wrapper.stack-mobile input.after:not(.before) {
243
+ border-top-left-radius: var(--radius-100);
244
+ border-top-right-radius: var(--radius-100);
245
+ border-bottom-left-radius: 0;
246
+ border-bottom-right-radius: 0;
247
+ }
248
+ .input-wrapper.stack-mobile input.before.after {
249
+ border-radius: 0;
250
+ }
251
+ .meta {
252
+ display: flex;
253
+ justify-content: flex-end;
254
+ margin-top: var(--space-100);
255
+ min-height: 1.8rem;
256
+ }
257
+ .char-count {
258
+ font-size: var(--text-font-size-xs);
259
+ line-height: var(--text-line-height-xs);
260
+ color: var(--text-color);
261
+ opacity: 0.7;
262
+ }
263
+ .optional {
264
+ color: var(--text-color-optional);
265
+ display: inline-flex;
266
+ align-items: center;
267
+ gap: var(--space-050);
268
+ font-size: var(--text-font-size-xs);
269
+ line-height: var(--text-line-height-xs);
270
+ text-transform: uppercase;
271
+ font-weight: var(--font-weight-medium);
272
+ }
273
+ .optional-dot {
274
+ display: inline-flex;
275
+ align-items: center;
276
+ line-height: 1;
277
+ }
278
+ .optional-text {
279
+ display: inline-flex;
280
+ align-items: center;
82
281
  }
83
282
  input {
84
283
  min-height: 4.4rem;
85
- width: 100%;
284
+ width: auto;
285
+ min-width: 0;
286
+ flex: 1 1 auto;
86
287
  line-height: var(--text-line-height);
87
288
  padding: var(--space-200) var(--space-300);
88
289
  box-sizing: border-box;
@@ -93,6 +294,42 @@ class m extends HTMLElement {
93
294
  color: var(--form-default-text-color);
94
295
  background: var(--input-background);
95
296
  }
297
+ input.size-x-small {
298
+ min-height: var(--action-icon-only-size-x-small);
299
+ padding: var(--action-padding-x-small);
300
+ font-size: var(--text-font-size-xs);
301
+ line-height: var(--text-line-height-xs);
302
+ }
303
+ input.size-x-small.hint:not(.after) {
304
+ padding-right: calc(var(--space-500) + var(--space-200));
305
+ }
306
+ input.size-small {
307
+ min-height: var(--action-icon-only-size-small);
308
+ padding: var(--action-padding-small);
309
+ font-size: var(--text-font-size-s);
310
+ line-height: var(--text-line-height-s);
311
+ }
312
+ input.size-small.hint:not(.after) {
313
+ padding-right: calc(var(--space-500) + var(--space-300));
314
+ }
315
+ input.size-medium {
316
+ min-height: 4.4rem;
317
+ padding: var(--space-200) var(--space-300);
318
+ font-size: var(--text-font-size);
319
+ line-height: var(--text-line-height);
320
+ }
321
+ input.size-medium.hint:not(.after) {
322
+ padding-right: calc(var(--space-600) + var(--space-300));
323
+ }
324
+ input.size-large {
325
+ min-height: var(--action-icon-only-size-large);
326
+ padding: var(--space-300) var(--space-400);
327
+ font-size: var(--text-font-size-l);
328
+ line-height: var(--text-line-height-l);
329
+ }
330
+ input.size-large.hint:not(.after) {
331
+ padding-right: calc(var(--space-700) + var(--space-300));
332
+ }
96
333
  input:hover {
97
334
  border-color: var(--form-default-border-color-hover);
98
335
  color: var(--form-default-text-color-hover);
@@ -105,6 +342,7 @@ class m extends HTMLElement {
105
342
  cursor: not-allowed;
106
343
  background-color: var(--input-background-disabled);
107
344
  }
345
+
108
346
  input.success {
109
347
  color: var(--form-success-text-color);
110
348
  border-color: var(--form-success-border-color);
@@ -227,29 +465,42 @@ class m extends HTMLElement {
227
465
  /* Slotted items */
228
466
  slot[name="before"]::slotted(*),
229
467
  slot[name="after"]::slotted(*) { flex: none; }
468
+ slot[name="hint"]::slotted(*) {
469
+ flex: none;
470
+ pointer-events: none;
471
+ }
230
472
 
231
473
  /* ========================================================================== */
232
474
 
233
475
 
234
476
  </style>
235
- ${i ? `<label for="${d}" class="${a ? "vh" : ""}">${i}</label>` : ""}
236
- <div class="input-wrapper">
237
- <slot name="before"></slot>
477
+ ${l ? `<label for="${u}" class="${[p ? "vh" : "", h ? "label-with-optional" : ""].filter(Boolean).join(" ")}">${l}${h ? ' <span class="optional"><span class="optional-dot" aria-hidden="true">•</span><span class="optional-text">Optional</span></span>' : ""}</label>` : ""}
478
+ <div class="${x}">
479
+ <div class="before-slot">
480
+ <slot name="before"></slot>
481
+ </div>
238
482
  <input
239
- class="${f}"
240
- type="${o}"
241
- name="${t}"
242
- id="${d}"
243
- value="${s}"
244
- placeholder="${l}"
245
- ${n ? 'disabled aria-disabled="true"' : ""}
246
- ${u}
483
+ class="${[E, `size-${f}`].filter(Boolean).join(" ")}"
484
+ type="${e}"
485
+ name="${o}"
486
+ id="${u}"
487
+ value="${d}"
488
+ placeholder="${m}"
489
+ ${c ? 'disabled aria-disabled="true"' : ""}
490
+ ${r ? `maxlength="${r}"` : ""}
491
+ ${b}
247
492
  />
248
- <slot name="after"></slot>
493
+ <div class="hint-slot">
494
+ <slot name="hint"></slot>
495
+ </div>
496
+ <div class="after-slot">
497
+ <slot name="after"></slot>
498
+ </div>
249
499
  </div>
500
+ ${r ? '<div class="meta"><span class="char-count"></span></div>' : ""}
250
501
  `
251
502
  );
252
- this.shadowRoot && (this.shadowRoot.innerHTML = v, this.updateSlottedButtons());
503
+ this.shadowRoot && (this.shadowRoot.innerHTML = A, this.updateSlottedButtons());
253
504
  }
254
505
  }
255
- customElements.get("mui-input") || customElements.define("mui-input", m);
506
+ customElements.get("mui-input") || customElements.define("mui-input", S);