@k2b/ui 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/browser/content/FileView.js +203 -136
  2. package/dist/browser/content/FileView.js.map +1 -1
  3. package/dist/browser/content/markdown-title.js +52 -0
  4. package/dist/browser/content/markdown-title.js.map +1 -0
  5. package/dist/browser/feedback/HoverPreview.js +6 -6
  6. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  7. package/dist/browser/feedback/index.js.map +1 -1
  8. package/dist/browser/feedback/prompts.js +18 -19
  9. package/dist/browser/feedback/prompts.js.map +1 -1
  10. package/dist/browser/feedback/toast.js +363 -122
  11. package/dist/browser/feedback/toast.js.map +1 -1
  12. package/dist/browser/inputs/DatePicker.js +263 -222
  13. package/dist/browser/inputs/DatePicker.js.map +1 -1
  14. package/dist/browser/inputs/MultiSelectInput.js +139 -105
  15. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  16. package/dist/browser/inputs/NumberInput.js +209 -122
  17. package/dist/browser/inputs/NumberInput.js.map +1 -1
  18. package/dist/browser/inputs/Select.js +184 -92
  19. package/dist/browser/inputs/Select.js.map +1 -1
  20. package/dist/browser/inputs/index.js.map +1 -1
  21. package/dist/browser/intl/messages.js +4 -0
  22. package/dist/browser/intl/messages.js.map +1 -1
  23. package/dist/browser/layout/AppWorkspace.js +105 -77
  24. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  25. package/dist/browser/layout/DetailPanel.js +2 -1
  26. package/dist/browser/layout/DetailPanel.js.map +1 -1
  27. package/dist/browser/layout/Navigation.js +1 -0
  28. package/dist/browser/layout/Navigation.js.map +1 -1
  29. package/dist/browser/layout/PanelDialog.js +1 -0
  30. package/dist/browser/layout/PanelDialog.js.map +1 -1
  31. package/dist/browser/layout/Settings.js +2 -2
  32. package/dist/browser/layout/Settings.js.map +1 -1
  33. package/dist/browser/layout/app-workspace-controller.js +30 -2
  34. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  35. package/dist/ssr/content/FileView.js +141 -81
  36. package/dist/ssr/content/FileView.js.map +1 -1
  37. package/dist/ssr/content/markdown-title.js +52 -0
  38. package/dist/ssr/content/markdown-title.js.map +1 -0
  39. package/dist/ssr/feedback/HoverPreview.js +6 -6
  40. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  41. package/dist/ssr/feedback/index.js.map +1 -1
  42. package/dist/ssr/feedback/prompts.js +1 -1
  43. package/dist/ssr/feedback/prompts.js.map +1 -1
  44. package/dist/ssr/feedback/toast.js +363 -122
  45. package/dist/ssr/feedback/toast.js.map +1 -1
  46. package/dist/ssr/inputs/DatePicker.js +78 -52
  47. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  48. package/dist/ssr/inputs/MultiSelectInput.js +52 -32
  49. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  50. package/dist/ssr/inputs/NumberInput.js +93 -40
  51. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  52. package/dist/ssr/inputs/Select.js +108 -29
  53. package/dist/ssr/inputs/Select.js.map +1 -1
  54. package/dist/ssr/inputs/index.js.map +1 -1
  55. package/dist/ssr/intl/messages.js +4 -0
  56. package/dist/ssr/intl/messages.js.map +1 -1
  57. package/dist/ssr/layout/AppWorkspace.js +84 -66
  58. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  59. package/dist/ssr/layout/DetailPanel.js +2 -1
  60. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  61. package/dist/ssr/layout/Navigation.js +1 -0
  62. package/dist/ssr/layout/Navigation.js.map +1 -1
  63. package/dist/ssr/layout/PanelDialog.js +1 -0
  64. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  65. package/dist/ssr/layout/Settings.js +2 -2
  66. package/dist/ssr/layout/Settings.js.map +1 -1
  67. package/dist/ssr/layout/app-workspace-controller.js +30 -2
  68. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  69. package/dist/styles.css +1 -1
  70. package/dist/types/content/FileView.d.ts +11 -1
  71. package/dist/types/content/markdown-title.d.ts +9 -0
  72. package/dist/types/feedback/index.d.ts +1 -1
  73. package/dist/types/feedback/toast.d.ts +7 -0
  74. package/dist/types/inputs/DatePicker.d.ts +11 -2
  75. package/dist/types/inputs/MultiSelectInput.d.ts +5 -1
  76. package/dist/types/inputs/NumberInput.d.ts +14 -0
  77. package/dist/types/inputs/Select.d.ts +10 -0
  78. package/dist/types/inputs/index.d.ts +1 -1
  79. package/dist/types/intl/messages.d.ts +2 -0
  80. package/dist/types/layout/AppWorkspace.d.ts +14 -0
  81. package/dist/types/layout/Settings.d.ts +2 -2
  82. package/dist/types/layout/app-workspace-controller.d.ts +5 -0
  83. package/package.json +1 -1
@@ -1,8 +1,6 @@
1
1
  import { template as _$template } from "solid-js/web";
2
2
  import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
3
  import { getNextMarker as _$getNextMarker } from "solid-js/web";
4
- import { spread as _$spread } from "solid-js/web";
5
- import { mergeProps as _$mergeProps } from "solid-js/web";
6
4
  import { insert as _$insert } from "solid-js/web";
7
5
  import { className as _$className } from "solid-js/web";
8
6
  import { createComponent as _$createComponent } from "solid-js/web";
@@ -11,13 +9,18 @@ import { setAttribute as _$setAttribute } from "solid-js/web";
11
9
  import { effect as _$effect } from "solid-js/web";
12
10
  import { getNextElement as _$getNextElement } from "solid-js/web";
13
11
  import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
12
+ import { use as _$use } from "solid-js/web";
13
+ import { spread as _$spread } from "solid-js/web";
14
+ import { mergeProps as _$mergeProps } from "solid-js/web";
14
15
  import { memo as _$memo } from "solid-js/web";
15
- var _tmpl$ = /*#__PURE__*/_$template(`<button type=button class=k2b-number-input__step><i class="ti ti-minus"aria-hidden=true>`),
16
- _tmpl$2 = /*#__PURE__*/_$template(`<span class="k2b-input-shell__icon k2b-text-input__icon"aria-hidden=true><i></i><i>`),
17
- _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-input-shell__affix>`),
18
- _tmpl$4 = /*#__PURE__*/_$template(`<button type=button class="k2b-input-shell__clear k2b-input-clear-action"><i class="ti ti-x"aria-hidden=true>`),
19
- _tmpl$5 = /*#__PURE__*/_$template(`<button type=button class=k2b-number-input__step><i class="ti ti-plus"aria-hidden=true>`),
20
- _tmpl$6 = /*#__PURE__*/_$template(`<div class="k2b-input-shell k2b-number-input"><!$><!/><div class=k2b-number-input__value><!$><!/><!$><!/><input><!$><!/><!$><!/></div><!$><!/>`);
16
+ var _tmpl$ = /*#__PURE__*/_$template(`<input>`),
17
+ _tmpl$2 = /*#__PURE__*/_$template(`<button type=button class=k2b-number-input__step><i class="ti ti-minus"aria-hidden=true>`),
18
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class="k2b-input-shell__icon k2b-text-input__icon"aria-hidden=true><i></i><i>`),
19
+ _tmpl$4 = /*#__PURE__*/_$template(`<span class=k2b-input-shell__affix>`),
20
+ _tmpl$5 = /*#__PURE__*/_$template(`<span class=k2b-number-input__sizer>`),
21
+ _tmpl$6 = /*#__PURE__*/_$template(`<button type=button class="k2b-input-shell__clear k2b-input-clear-action"><i class="ti ti-x"aria-hidden=true>`),
22
+ _tmpl$7 = /*#__PURE__*/_$template(`<button type=button class=k2b-number-input__step><i class="ti ti-plus"aria-hidden=true>`),
23
+ _tmpl$8 = /*#__PURE__*/_$template(`<div class="k2b-input-shell k2b-number-input"><!$><!/><div class=k2b-number-input__value><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/></div><!$><!/>`);
21
24
  import { createEffect, createMemo, createSignal, Show, splitProps } from "solid-js";
22
25
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
23
26
  import { decimalSeparator, useLocale } from "../intl/locale";
@@ -30,8 +33,10 @@ function fractionDigits(value) {
30
33
  return Math.max(0, fraction - Number(exponent));
31
34
  }
32
35
  export function NumberInput(props) {
33
- const [local, rest] = splitProps(props, ["activeIcon", "allowNegative", "aria-describedby", "aria-label", "class", "clearLabel", "clearable", "decimalPlaces", "decreaseLabel", "description", "disableSteppers", "error", "icon", "id", "increaseLabel", "label", "locale", "max", "min", "onClear", "onValueCommit", "onValueChange", "prefix", "required", "showSteppers", "step", "suffix", "value"]);
36
+ const [local, rest] = splitProps(props, ["activeIcon", "appearance", "allowNegative", "aria-describedby", "aria-label", "class", "clearLabel", "clearable", "decimalPlaces", "decreaseLabel", "description", "disableSteppers", "error", "formatValue", "icon", "id", "increaseLabel", "label", "locale", "max", "min", "onClear", "onKeyDown", "onValueCommit", "onValueChange", "prefix", "required", "showSteppers", "step", "suffix", "value"]);
34
37
  const meta = createFieldMeta(local.id);
38
+ const plain = () => local.appearance === "plain";
39
+ let input;
35
40
  const [focused, setFocused] = createSignal(false);
36
41
  const value = () => resolveMaybeAccessor(local.value);
37
42
  const error = () => resolveMaybeAccessor(local.error);
@@ -93,6 +98,107 @@ export function NumberInput(props) {
93
98
  if (focused()) return;
94
99
  if (parse(raw()) !== value()) setRaw(display(value()));
95
100
  });
101
+ // Enter already committed the current text, so leaving the field does not commit it twice.
102
+ let committedOnEnter = false;
103
+ const onKeyDown = event => {
104
+ const handler = local.onKeyDown;
105
+ if (typeof handler === "function") handler(event);else if (Array.isArray(handler)) handler[0](handler[1], event);
106
+ if (!plain() || event.defaultPrevented) return;
107
+ // Both keys keep focus in the field, so keyboard and screen reader users stay in place.
108
+ if (event.key === "Enter") {
109
+ event.preventDefault();
110
+ commit(parse(raw()), true);
111
+ committedOnEnter = true;
112
+ } else if (event.key === "Escape" && parse(raw()) !== value()) {
113
+ // Only an edit in progress swallows Escape; otherwise it reaches an enclosing panel.
114
+ event.preventDefault();
115
+ event.stopPropagation();
116
+ setRaw(display(value()));
117
+ }
118
+ };
119
+ const placeholderText = () => typeof rest.placeholder === "string" ? rest.placeholder : "";
120
+ /** What a plain field shows: the formatted value at rest, the text being edited while focused. */
121
+ const shownText = () => {
122
+ const current = value();
123
+ if (!focused() && current != null && local.formatValue) return local.formatValue(current);
124
+ return raw() || placeholderText();
125
+ };
126
+ const valueText = () => {
127
+ if (rest["aria-valuetext"] !== undefined) return rest["aria-valuetext"];
128
+ const current = focused() ? parse(raw()) : value();
129
+ if (current == null) return undefined;
130
+ if (local.formatValue) return local.formatValue(current);
131
+ const unit = typeof local.suffix === "string" ? local.suffix : "";
132
+ return unit ? `${display(current)} ${unit}` : undefined;
133
+ };
134
+ const control = () => (() => {
135
+ var _el$ = _$getNextElement(_tmpl$);
136
+ var _ref$ = input;
137
+ typeof _ref$ === "function" ? _$use(_ref$, _el$) : input = _el$;
138
+ _$spread(_el$, _$mergeProps(rest, {
139
+ get id() {
140
+ return meta.controlId;
141
+ },
142
+ "class": "k2b-input k2b-number-input__control",
143
+ get ["data-filled"]() {
144
+ return raw() ? "true" : undefined;
145
+ },
146
+ "type": "text",
147
+ "role": "spinbutton",
148
+ get inputmode() {
149
+ return places() === 0 ? "numeric" : "decimal";
150
+ },
151
+ get value() {
152
+ return raw();
153
+ },
154
+ get required() {
155
+ return local.required;
156
+ }
157
+ }, () => fieldControlAria(meta, local), {
158
+ get ["aria-valuemin"]() {
159
+ return _$memo(() => !!Number.isFinite(min()))() ? min() : undefined;
160
+ },
161
+ get ["aria-valuemax"]() {
162
+ return _$memo(() => !!Number.isFinite(max()))() ? max() : undefined;
163
+ },
164
+ get ["aria-valuenow"]() {
165
+ return (focused() ? parse(raw()) : value()) ?? undefined;
166
+ },
167
+ get ["aria-valuetext"]() {
168
+ return valueText();
169
+ },
170
+ get size() {
171
+ return _$memo(() => !!plain())() ? 1 : rest.size;
172
+ },
173
+ "onFocus": () => setFocused(true),
174
+ "onKeyDown": onKeyDown,
175
+ "onInput": event => {
176
+ const input = event.currentTarget;
177
+ const current = input.value;
178
+ const selectionStart = input.selectionStart;
179
+ const selectionEnd = input.selectionEnd;
180
+ const next = filter(current);
181
+ // Only write back when the filter actually dropped something —
182
+ // re-assigning an unchanged value moves the caret to the end.
183
+ if (current !== next) {
184
+ input.value = next;
185
+ if (selectionStart !== null && selectionEnd !== null) {
186
+ input.setSelectionRange(filter(current.slice(0, selectionStart)).length, filter(current.slice(0, selectionEnd)).length);
187
+ }
188
+ }
189
+ setRaw(next);
190
+ committedOnEnter = false;
191
+ emit(parse(next));
192
+ },
193
+ "onBlur": () => {
194
+ if (!committedOnEnter) commit(parse(raw()), true);
195
+ committedOnEnter = false;
196
+ setFocused(false);
197
+ }
198
+ }), false, false);
199
+ _$runHydrationEvents();
200
+ return _el$;
201
+ })();
96
202
  return _$createComponent(Field, {
97
203
  get ["class"]() {
98
204
  return local.class;
@@ -114,180 +220,161 @@ export function NumberInput(props) {
114
220
  return rest.disabled;
115
221
  },
116
222
  get children() {
117
- var _el$ = _$getNextElement(_tmpl$6),
118
- _el$18 = _el$.firstChild,
223
+ var _el$2 = _$getNextElement(_tmpl$8),
224
+ _el$21 = _el$2.firstChild,
225
+ [_el$22, _co$6] = _$getNextMarker(_el$21.nextSibling),
226
+ _el$4 = _el$22.nextSibling,
227
+ _el$10 = _el$4.firstChild,
228
+ [_el$11, _co$] = _$getNextMarker(_el$10.nextSibling),
229
+ _el$12 = _el$11.nextSibling,
230
+ [_el$13, _co$2] = _$getNextMarker(_el$12.nextSibling),
231
+ _el$14 = _el$13.nextSibling,
232
+ [_el$15, _co$3] = _$getNextMarker(_el$14.nextSibling),
233
+ _el$16 = _el$15.nextSibling,
234
+ [_el$17, _co$4] = _$getNextMarker(_el$16.nextSibling),
235
+ _el$18 = _el$17.nextSibling,
119
236
  [_el$19, _co$5] = _$getNextMarker(_el$18.nextSibling),
120
- _el$3 = _el$19.nextSibling,
121
- _el$1 = _el$3.firstChild,
122
- [_el$10, _co$] = _$getNextMarker(_el$1.nextSibling),
123
- _el$11 = _el$10.nextSibling,
124
- [_el$12, _co$2] = _$getNextMarker(_el$11.nextSibling),
125
- _el$8 = _el$12.nextSibling,
126
- _el$13 = _el$8.nextSibling,
127
- [_el$14, _co$3] = _$getNextMarker(_el$13.nextSibling),
128
- _el$15 = _el$14.nextSibling,
129
- [_el$16, _co$4] = _$getNextMarker(_el$15.nextSibling),
130
- _el$20 = _el$3.nextSibling,
131
- [_el$21, _co$6] = _$getNextMarker(_el$20.nextSibling);
132
- _$insert(_el$, _$createComponent(Show, {
237
+ _el$23 = _el$4.nextSibling,
238
+ [_el$24, _co$7] = _$getNextMarker(_el$23.nextSibling);
239
+ _el$2.$$click = event => {
240
+ if (plain() && event.target !== input && !rest.disabled) input?.focus();
241
+ };
242
+ _$insert(_el$2, _$createComponent(Show, {
133
243
  get when() {
134
- return local.showSteppers ?? true;
244
+ return local.showSteppers ?? !plain();
135
245
  },
136
246
  get children() {
137
- var _el$2 = _$getNextElement(_tmpl$);
138
- _el$2.$$click = () => stepBy(-1);
247
+ var _el$3 = _$getNextElement(_tmpl$2);
248
+ _el$3.$$click = () => stepBy(-1);
139
249
  _$effect(_p$ => {
140
250
  var _v$ = local.decreaseLabel ?? messages().decreaseValue,
141
251
  _v$2 = rest.disabled || local.disableSteppers || value() !== null && value() !== undefined && value() <= min();
142
- _v$ !== _p$.e && _$setAttribute(_el$2, "aria-label", _p$.e = _v$);
143
- _v$2 !== _p$.t && _$setProperty(_el$2, "disabled", _p$.t = _v$2);
252
+ _v$ !== _p$.e && _$setAttribute(_el$3, "aria-label", _p$.e = _v$);
253
+ _v$2 !== _p$.t && _$setProperty(_el$3, "disabled", _p$.t = _v$2);
144
254
  return _p$;
145
255
  }, {
146
256
  e: undefined,
147
257
  t: undefined
148
258
  });
149
259
  _$runHydrationEvents();
150
- return _el$2;
260
+ return _el$3;
151
261
  }
152
- }), _el$19, _co$5);
153
- _$insert(_el$3, _$createComponent(Show, {
262
+ }), _el$22, _co$6);
263
+ _$insert(_el$4, _$createComponent(Show, {
154
264
  get when() {
155
265
  return local.icon;
156
266
  },
157
267
  get children() {
158
- var _el$4 = _$getNextElement(_tmpl$2),
159
- _el$5 = _el$4.firstChild,
160
- _el$6 = _el$5.nextSibling;
268
+ var _el$5 = _$getNextElement(_tmpl$3),
269
+ _el$6 = _el$5.firstChild,
270
+ _el$7 = _el$6.nextSibling;
161
271
  _$effect(_p$ => {
162
272
  var _v$3 = local.icon,
163
273
  _v$4 = local.activeIcon ?? local.icon;
164
- _v$3 !== _p$.e && _$className(_el$5, _p$.e = _v$3);
165
- _v$4 !== _p$.t && _$className(_el$6, _p$.t = _v$4);
274
+ _v$3 !== _p$.e && _$className(_el$6, _p$.e = _v$3);
275
+ _v$4 !== _p$.t && _$className(_el$7, _p$.t = _v$4);
166
276
  return _p$;
167
277
  }, {
168
278
  e: undefined,
169
279
  t: undefined
170
280
  });
171
- return _el$4;
281
+ return _el$5;
172
282
  }
173
- }), _el$10, _co$);
174
- _$insert(_el$3, _$createComponent(Show, {
283
+ }), _el$11, _co$);
284
+ _$insert(_el$4, _$createComponent(Show, {
175
285
  get when() {
176
286
  return local.prefix;
177
287
  },
178
288
  get children() {
179
- var _el$7 = _$getNextElement(_tmpl$3);
180
- _$insert(_el$7, () => local.prefix);
181
- return _el$7;
182
- }
183
- }), _el$12, _co$2);
184
- _$spread(_el$8, _$mergeProps(rest, {
185
- get id() {
186
- return meta.controlId;
187
- },
188
- "class": "k2b-input k2b-number-input__control",
189
- get ["data-filled"]() {
190
- return raw() ? "true" : undefined;
191
- },
192
- "type": "text",
193
- "role": "spinbutton",
194
- get inputmode() {
195
- return places() === 0 ? "numeric" : "decimal";
196
- },
197
- get value() {
198
- return raw();
199
- },
200
- get required() {
201
- return local.required;
289
+ var _el$8 = _$getNextElement(_tmpl$4);
290
+ _$insert(_el$8, () => local.prefix);
291
+ return _el$8;
202
292
  }
203
- }, () => fieldControlAria(meta, local), {
204
- get ["aria-valuemin"]() {
205
- return _$memo(() => !!Number.isFinite(min()))() ? min() : undefined;
206
- },
207
- get ["aria-valuemax"]() {
208
- return _$memo(() => !!Number.isFinite(max()))() ? max() : undefined;
293
+ }), _el$13, _co$2);
294
+ _$insert(_el$4, _$createComponent(Show, {
295
+ get when() {
296
+ return plain();
209
297
  },
210
- get ["aria-valuenow"]() {
211
- return (focused() ? parse(raw()) : value()) ?? undefined;
298
+ get fallback() {
299
+ return control();
212
300
  },
213
- "onFocus": () => setFocused(true),
214
- "onInput": event => {
215
- const input = event.currentTarget;
216
- const current = input.value;
217
- const selectionStart = input.selectionStart;
218
- const selectionEnd = input.selectionEnd;
219
- const next = filter(current);
220
- // Only write back when the filter actually dropped something —
221
- // re-assigning an unchanged value moves the caret to the end.
222
- if (current !== next) {
223
- input.value = next;
224
- if (selectionStart !== null && selectionEnd !== null) {
225
- input.setSelectionRange(filter(current.slice(0, selectionStart)).length, filter(current.slice(0, selectionEnd)).length);
226
- }
227
- }
228
- setRaw(next);
229
- emit(parse(next));
230
- },
231
- "onBlur": () => {
232
- commit(parse(raw()), true);
233
- setFocused(false);
301
+ get children() {
302
+ var _el$9 = _$getNextElement(_tmpl$5);
303
+ _$insert(_el$9, control);
304
+ _$effect(_p$ => {
305
+ var _v$5 = shownText(),
306
+ _v$6 = raw() ? undefined : "true",
307
+ _v$7 = focused() ? "true" : undefined;
308
+ _v$5 !== _p$.e && _$setAttribute(_el$9, "data-value", _p$.e = _v$5);
309
+ _v$6 !== _p$.t && _$setAttribute(_el$9, "data-placeholder", _p$.t = _v$6);
310
+ _v$7 !== _p$.a && _$setAttribute(_el$9, "data-editing", _p$.a = _v$7);
311
+ return _p$;
312
+ }, {
313
+ e: undefined,
314
+ t: undefined,
315
+ a: undefined
316
+ });
317
+ return _el$9;
234
318
  }
235
- }), false, false);
236
- _$insert(_el$3, _$createComponent(Show, {
319
+ }), _el$15, _co$3);
320
+ _$insert(_el$4, _$createComponent(Show, {
237
321
  get when() {
238
- return local.suffix;
322
+ return _$memo(() => !!local.suffix)() && (!plain() || raw() && (focused() || !local.formatValue));
239
323
  },
240
324
  get children() {
241
- var _el$9 = _$getNextElement(_tmpl$3);
242
- _$insert(_el$9, () => local.suffix);
243
- return _el$9;
325
+ var _el$0 = _$getNextElement(_tmpl$4);
326
+ _$insert(_el$0, () => local.suffix);
327
+ return _el$0;
244
328
  }
245
- }), _el$14, _co$3);
246
- _$insert(_el$3, _$createComponent(Show, {
329
+ }), _el$17, _co$4);
330
+ _$insert(_el$4, _$createComponent(Show, {
247
331
  get when() {
248
- return _$memo(() => !!(local.clearable && raw() && !rest.disabled))() && !rest.readOnly;
332
+ return _$memo(() => !!(local.clearable && raw() && !rest.disabled && !rest.readOnly))() && !plain();
249
333
  },
250
334
  get children() {
251
- var _el$0 = _$getNextElement(_tmpl$4);
252
- _el$0.$$click = () => local.onClear ? local.onClear() : commit(null);
253
- _$effect(() => _$setAttribute(_el$0, "aria-label", local.clearLabel ?? messages().clear));
335
+ var _el$1 = _$getNextElement(_tmpl$6);
336
+ _el$1.$$click = () => local.onClear ? local.onClear() : commit(null);
337
+ _$effect(() => _$setAttribute(_el$1, "aria-label", local.clearLabel ?? messages().clear));
254
338
  _$runHydrationEvents();
255
- return _el$0;
339
+ return _el$1;
256
340
  }
257
- }), _el$16, _co$4);
258
- _$insert(_el$, _$createComponent(Show, {
341
+ }), _el$19, _co$5);
342
+ _$insert(_el$2, _$createComponent(Show, {
259
343
  get when() {
260
- return local.showSteppers ?? true;
344
+ return local.showSteppers ?? !plain();
261
345
  },
262
346
  get children() {
263
- var _el$17 = _$getNextElement(_tmpl$5);
264
- _el$17.$$click = () => stepBy(1);
347
+ var _el$20 = _$getNextElement(_tmpl$7);
348
+ _el$20.$$click = () => stepBy(1);
265
349
  _$effect(_p$ => {
266
- var _v$5 = local.increaseLabel ?? messages().increaseValue,
267
- _v$6 = rest.disabled || local.disableSteppers || value() !== null && value() !== undefined && value() >= max();
268
- _v$5 !== _p$.e && _$setAttribute(_el$17, "aria-label", _p$.e = _v$5);
269
- _v$6 !== _p$.t && _$setProperty(_el$17, "disabled", _p$.t = _v$6);
350
+ var _v$8 = local.increaseLabel ?? messages().increaseValue,
351
+ _v$9 = rest.disabled || local.disableSteppers || value() !== null && value() !== undefined && value() >= max();
352
+ _v$8 !== _p$.e && _$setAttribute(_el$20, "aria-label", _p$.e = _v$8);
353
+ _v$9 !== _p$.t && _$setProperty(_el$20, "disabled", _p$.t = _v$9);
270
354
  return _p$;
271
355
  }, {
272
356
  e: undefined,
273
357
  t: undefined
274
358
  });
275
359
  _$runHydrationEvents();
276
- return _el$17;
360
+ return _el$20;
277
361
  }
278
- }), _el$21, _co$6);
362
+ }), _el$24, _co$7);
279
363
  _$effect(_p$ => {
280
- var _v$7 = rest.disabled ? "true" : undefined,
281
- _v$8 = error() ? "true" : undefined;
282
- _v$7 !== _p$.e && _$setAttribute(_el$, "data-disabled", _p$.e = _v$7);
283
- _v$8 !== _p$.t && _$setAttribute(_el$, "data-invalid", _p$.t = _v$8);
364
+ var _v$0 = local.appearance ?? "field",
365
+ _v$1 = rest.disabled ? "true" : undefined,
366
+ _v$10 = error() ? "true" : undefined;
367
+ _v$0 !== _p$.e && _$setAttribute(_el$2, "data-appearance", _p$.e = _v$0);
368
+ _v$1 !== _p$.t && _$setAttribute(_el$2, "data-disabled", _p$.t = _v$1);
369
+ _v$10 !== _p$.a && _$setAttribute(_el$2, "data-invalid", _p$.a = _v$10);
284
370
  return _p$;
285
371
  }, {
286
372
  e: undefined,
287
- t: undefined
373
+ t: undefined,
374
+ a: undefined
288
375
  });
289
376
  _$runHydrationEvents();
290
- return _el$;
377
+ return _el$2;
291
378
  }
292
379
  });
293
380
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/NumberInput.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { decimalSeparator, useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type NumberInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"max\" | \"min\" | \"onChange\" | \"onInput\" | \"prefix\" | \"step\" | \"type\" | \"value\" | keyof ValueFieldProps<number | null>\n> &\n ValueFieldProps<number | null> & {\n max?: number;\n min?: number;\n /** Stepper increment and commit grid; defaults to `1`. A fractional step also sets the default `decimalPlaces`. */\n step?: number;\n /** Accepted fraction digits. Defaults to the fraction digits of `step` (`0.01` → `2`, `1` → `0`); an explicit value wins. */\n decimalPlaces?: number;\n allowNegative?: boolean;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n increaseLabel?: string;\n decreaseLabel?: string;\n /** Explicit locale for the decimal separator; defaults to the inherited render locale. */\n locale?: string;\n showSteppers?: boolean;\n disableSteppers?: boolean;\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n };\n\nfunction fractionDigits(value: number): number {\n if (!Number.isFinite(value)) return 0;\n const [mantissa = \"\", exponent = \"0\"] = String(value).split(\"e\");\n const fraction = mantissa.split(\".\")[1]?.length ?? 0;\n return Math.max(0, fraction - Number(exponent));\n}\n\nexport function NumberInput(props: NumberInputProps): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"allowNegative\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"decimalPlaces\",\n \"decreaseLabel\",\n \"description\",\n \"disableSteppers\",\n \"error\",\n \"icon\",\n \"id\",\n \"increaseLabel\",\n \"label\",\n \"locale\",\n \"max\",\n \"min\",\n \"onClear\",\n \"onValueCommit\",\n \"onValueChange\",\n \"prefix\",\n \"required\",\n \"showSteppers\",\n \"step\",\n \"suffix\",\n \"value\",\n ]);\n const meta = createFieldMeta(local.id);\n const [focused, setFocused] = createSignal(false);\n const value = () => resolveMaybeAccessor(local.value);\n const error = () => resolveMaybeAccessor(local.error);\n const contextLocale = useLocale();\n const messages = useUiMessages();\n const separator = createMemo(() => decimalSeparator(local.locale ?? contextLocale()));\n // The visible text keeps the canonical number, only the decimal separator\n // follows the effective locale; grouping is never rendered while editing.\n const display = (value: number | null | undefined) => (value == null ? \"\" : String(value).replace(\".\", separator()));\n const [raw, setRaw] = createSignal(display(value()));\n const min = () => local.min ?? -Infinity;\n const max = () => local.max ?? Infinity;\n const step = () => local.step ?? 1;\n // `step` and the accepted decimals never disagree: a fractional step implies\n // its own precision unless the caller states `decimalPlaces` explicitly.\n const places = () => Math.max(0, local.decimalPlaces ?? fractionDigits(step()));\n\n const filter = (input: string) => {\n let output = \"\";\n let decimal = false;\n for (const character of input) {\n if (/\\d/.test(character)) output += character;\n else if (character === \"-\" && output === \"\" && (local.allowNegative ?? true)) output += character;\n else if ((character === \".\" || character === \",\" || character === separator()) && !decimal && places() > 0) {\n output += separator();\n decimal = true;\n }\n }\n if (decimal) {\n const [integer = \"\", fraction = \"\"] = output.split(separator());\n return `${integer}${separator()}${fraction.slice(0, places())}`;\n }\n return output;\n };\n const parse = (input: string) => {\n const canonical = input.replace(separator(), \".\");\n if (!canonical || canonical === \"-\" || canonical === \".\") return null;\n const number = places() === 0 ? Number.parseInt(canonical, 10) : Number(canonical);\n return Number.isFinite(number) ? number : null;\n };\n const normalize = (value: number | null) => {\n if (value === null) return null;\n const clamped = Math.max(min(), Math.min(max(), value));\n const anchor = Number.isFinite(min()) ? min() : 0;\n const snapped = step() > 0 ? Math.round((clamped - anchor) / step()) * step() + anchor : clamped;\n const bounded = Math.max(min(), Math.min(max(), snapped));\n return places() === 0 ? Math.round(bounded) : Number(bounded.toFixed(places()));\n };\n const emit = (value: number | null) => local.onValueChange?.(value);\n const commit = (value: number | null, changeAlreadyEmitted = false) => {\n const next = normalize(value);\n setRaw(display(next));\n if (!changeAlreadyEmitted || !Object.is(next, value)) emit(next);\n local.onValueCommit?.(next);\n };\n const stepBy = (direction: number) => {\n if (rest.disabled || local.disableSteppers) return;\n const seed = value() ?? (Number.isFinite(min()) ? min() : 0);\n commit(seed + direction * step());\n };\n\n createEffect(() => {\n if (focused()) return;\n if (parse(raw()) !== value()) setRaw(display(value()));\n });\n\n return (\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-number-input\"\n data-disabled={rest.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n >\n <Show when={local.showSteppers ?? true}>\n <button\n type=\"button\"\n class=\"k2b-number-input__step\"\n aria-label={local.decreaseLabel ?? messages().decreaseValue}\n disabled={rest.disabled || local.disableSteppers || (value() !== null && value() !== undefined && value()! <= min())}\n onClick={() => stepBy(-1)}\n >\n <i class=\"ti ti-minus\" aria-hidden=\"true\" />\n </button>\n </Show>\n <div class=\"k2b-number-input__value\">\n <Show when={local.icon}>\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={local.icon} />\n <i class={local.activeIcon ?? local.icon} />\n </span>\n </Show>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <input\n {...rest}\n id={meta.controlId}\n class=\"k2b-input k2b-number-input__control\"\n data-filled={raw() ? \"true\" : undefined}\n type=\"text\"\n role=\"spinbutton\"\n inputmode={places() === 0 ? \"numeric\" : \"decimal\"}\n value={raw()}\n required={local.required}\n {...fieldControlAria(meta, local)}\n aria-valuemin={Number.isFinite(min()) ? min() : undefined}\n aria-valuemax={Number.isFinite(max()) ? max() : undefined}\n aria-valuenow={(focused() ? parse(raw()) : value()) ?? undefined}\n onFocus={() => setFocused(true)}\n onInput={(event) => {\n const input = event.currentTarget;\n const current = input.value;\n const selectionStart = input.selectionStart;\n const selectionEnd = input.selectionEnd;\n const next = filter(current);\n // Only write back when the filter actually dropped something —\n // re-assigning an unchanged value moves the caret to the end.\n if (current !== next) {\n input.value = next;\n if (selectionStart !== null && selectionEnd !== null) {\n input.setSelectionRange(filter(current.slice(0, selectionStart)).length, filter(current.slice(0, selectionEnd)).length);\n }\n }\n setRaw(next);\n emit(parse(next));\n }}\n onBlur={() => {\n commit(parse(raw()), true);\n setFocused(false);\n }}\n />\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && raw() && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={() => (local.onClear ? local.onClear() : commit(null))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n <Show when={local.showSteppers ?? true}>\n <button\n type=\"button\"\n class=\"k2b-number-input__step\"\n aria-label={local.increaseLabel ?? messages().increaseValue}\n disabled={rest.disabled || local.disableSteppers || (value() !== null && value() !== undefined && value()! >= max())}\n onClick={() => stepBy(1)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n );\n}\n\nexport default NumberInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/NumberInput.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { decimalSeparator, useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport type { ChoiceAppearance } from \"./Select\";\n\nexport type NumberInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"max\" | \"min\" | \"onChange\" | \"onInput\" | \"prefix\" | \"step\" | \"type\" | \"value\" | keyof ValueFieldProps<number | null>\n> &\n ValueFieldProps<number | null> & {\n max?: number;\n min?: number;\n /** Stepper increment and commit grid; defaults to `1`. A fractional step also sets the default `decimalPlaces`. */\n step?: number;\n /** Accepted fraction digits. Defaults to the fraction digits of `step` (`0.01` → `2`, `1` → `0`); an explicit value wins. */\n decimalPlaces?: number;\n allowNegative?: boolean;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n increaseLabel?: string;\n decreaseLabel?: string;\n /** Explicit locale for the decimal separator; defaults to the inherited render locale. */\n locale?: string;\n showSteppers?: boolean;\n disableSteppers?: boolean;\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n /**\n * `plain` edits the value in place for property rows: no box and no steppers\n * or clear button. The field sizes to its text, Enter commits, Escape\n * restores the current value, and clearing the text clears the value. Focus\n * stays in the field.\n */\n appearance?: ChoiceAppearance;\n /**\n * Text for a set value while a plain field is not being edited, such as\n * `90` as \"1 h 30 min\". It also names the value for assistive technology.\n * The suffix then shows only while editing.\n */\n formatValue?: (value: number) => string;\n };\n\nfunction fractionDigits(value: number): number {\n if (!Number.isFinite(value)) return 0;\n const [mantissa = \"\", exponent = \"0\"] = String(value).split(\"e\");\n const fraction = mantissa.split(\".\")[1]?.length ?? 0;\n return Math.max(0, fraction - Number(exponent));\n}\n\nexport function NumberInput(props: NumberInputProps): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"appearance\",\n \"allowNegative\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"decimalPlaces\",\n \"decreaseLabel\",\n \"description\",\n \"disableSteppers\",\n \"error\",\n \"formatValue\",\n \"icon\",\n \"id\",\n \"increaseLabel\",\n \"label\",\n \"locale\",\n \"max\",\n \"min\",\n \"onClear\",\n \"onKeyDown\",\n \"onValueCommit\",\n \"onValueChange\",\n \"prefix\",\n \"required\",\n \"showSteppers\",\n \"step\",\n \"suffix\",\n \"value\",\n ]);\n const meta = createFieldMeta(local.id);\n const plain = () => local.appearance === \"plain\";\n let input: HTMLInputElement | undefined;\n const [focused, setFocused] = createSignal(false);\n const value = () => resolveMaybeAccessor(local.value);\n const error = () => resolveMaybeAccessor(local.error);\n const contextLocale = useLocale();\n const messages = useUiMessages();\n const separator = createMemo(() => decimalSeparator(local.locale ?? contextLocale()));\n // The visible text keeps the canonical number, only the decimal separator\n // follows the effective locale; grouping is never rendered while editing.\n const display = (value: number | null | undefined) => (value == null ? \"\" : String(value).replace(\".\", separator()));\n const [raw, setRaw] = createSignal(display(value()));\n const min = () => local.min ?? -Infinity;\n const max = () => local.max ?? Infinity;\n const step = () => local.step ?? 1;\n // `step` and the accepted decimals never disagree: a fractional step implies\n // its own precision unless the caller states `decimalPlaces` explicitly.\n const places = () => Math.max(0, local.decimalPlaces ?? fractionDigits(step()));\n\n const filter = (input: string) => {\n let output = \"\";\n let decimal = false;\n for (const character of input) {\n if (/\\d/.test(character)) output += character;\n else if (character === \"-\" && output === \"\" && (local.allowNegative ?? true)) output += character;\n else if ((character === \".\" || character === \",\" || character === separator()) && !decimal && places() > 0) {\n output += separator();\n decimal = true;\n }\n }\n if (decimal) {\n const [integer = \"\", fraction = \"\"] = output.split(separator());\n return `${integer}${separator()}${fraction.slice(0, places())}`;\n }\n return output;\n };\n const parse = (input: string) => {\n const canonical = input.replace(separator(), \".\");\n if (!canonical || canonical === \"-\" || canonical === \".\") return null;\n const number = places() === 0 ? Number.parseInt(canonical, 10) : Number(canonical);\n return Number.isFinite(number) ? number : null;\n };\n const normalize = (value: number | null) => {\n if (value === null) return null;\n const clamped = Math.max(min(), Math.min(max(), value));\n const anchor = Number.isFinite(min()) ? min() : 0;\n const snapped = step() > 0 ? Math.round((clamped - anchor) / step()) * step() + anchor : clamped;\n const bounded = Math.max(min(), Math.min(max(), snapped));\n return places() === 0 ? Math.round(bounded) : Number(bounded.toFixed(places()));\n };\n const emit = (value: number | null) => local.onValueChange?.(value);\n const commit = (value: number | null, changeAlreadyEmitted = false) => {\n const next = normalize(value);\n setRaw(display(next));\n if (!changeAlreadyEmitted || !Object.is(next, value)) emit(next);\n local.onValueCommit?.(next);\n };\n const stepBy = (direction: number) => {\n if (rest.disabled || local.disableSteppers) return;\n const seed = value() ?? (Number.isFinite(min()) ? min() : 0);\n commit(seed + direction * step());\n };\n\n createEffect(() => {\n if (focused()) return;\n if (parse(raw()) !== value()) setRaw(display(value()));\n });\n // Enter already committed the current text, so leaving the field does not commit it twice.\n let committedOnEnter = false;\n const onKeyDown: JSX.EventHandler<HTMLInputElement, KeyboardEvent> = (event) => {\n const handler = local.onKeyDown;\n if (typeof handler === \"function\") handler(event);\n else if (Array.isArray(handler)) handler[0](handler[1], event);\n if (!plain() || event.defaultPrevented) return;\n // Both keys keep focus in the field, so keyboard and screen reader users stay in place.\n if (event.key === \"Enter\") {\n event.preventDefault();\n commit(parse(raw()), true);\n committedOnEnter = true;\n } else if (event.key === \"Escape\" && parse(raw()) !== value()) {\n // Only an edit in progress swallows Escape; otherwise it reaches an enclosing panel.\n event.preventDefault();\n event.stopPropagation();\n setRaw(display(value()));\n }\n };\n const placeholderText = () => (typeof rest.placeholder === \"string\" ? rest.placeholder : \"\");\n /** What a plain field shows: the formatted value at rest, the text being edited while focused. */\n const shownText = () => {\n const current = value();\n if (!focused() && current != null && local.formatValue) return local.formatValue(current);\n return raw() || placeholderText();\n };\n const valueText = () => {\n if (rest[\"aria-valuetext\"] !== undefined) return rest[\"aria-valuetext\"];\n const current = focused() ? parse(raw()) : value();\n if (current == null) return undefined;\n if (local.formatValue) return local.formatValue(current);\n const unit = typeof local.suffix === \"string\" ? local.suffix : \"\";\n return unit ? `${display(current)} ${unit}` : undefined;\n };\n const control = () => (\n <input\n {...rest}\n ref={input}\n id={meta.controlId}\n class=\"k2b-input k2b-number-input__control\"\n data-filled={raw() ? \"true\" : undefined}\n type=\"text\"\n role=\"spinbutton\"\n inputmode={places() === 0 ? \"numeric\" : \"decimal\"}\n value={raw()}\n required={local.required}\n {...fieldControlAria(meta, local)}\n aria-valuemin={Number.isFinite(min()) ? min() : undefined}\n aria-valuemax={Number.isFinite(max()) ? max() : undefined}\n aria-valuenow={(focused() ? parse(raw()) : value()) ?? undefined}\n aria-valuetext={valueText()}\n // The plain sizer sets the width; the smallest intrinsic size keeps the input from widening it.\n size={plain() ? 1 : rest.size}\n onFocus={() => setFocused(true)}\n onKeyDown={onKeyDown}\n onInput={(event) => {\n const input = event.currentTarget;\n const current = input.value;\n const selectionStart = input.selectionStart;\n const selectionEnd = input.selectionEnd;\n const next = filter(current);\n // Only write back when the filter actually dropped something —\n // re-assigning an unchanged value moves the caret to the end.\n if (current !== next) {\n input.value = next;\n if (selectionStart !== null && selectionEnd !== null) {\n input.setSelectionRange(filter(current.slice(0, selectionStart)).length, filter(current.slice(0, selectionEnd)).length);\n }\n }\n setRaw(next);\n committedOnEnter = false;\n emit(parse(next));\n }}\n onBlur={() => {\n if (!committedOnEnter) commit(parse(raw()), true);\n committedOnEnter = false;\n setFocused(false);\n }}\n />\n );\n\n return (\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions lint/a11y/useKeyWithClickEvents: the input inside is the keyboard target; a plain field's row only forwards a pointer click beside the text to it. */}\n <div\n class=\"k2b-input-shell k2b-number-input\"\n data-appearance={local.appearance ?? \"field\"}\n data-disabled={rest.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n onClick={(event) => {\n if (plain() && event.target !== input && !rest.disabled) input?.focus();\n }}\n >\n <Show when={local.showSteppers ?? !plain()}>\n <button\n type=\"button\"\n class=\"k2b-number-input__step\"\n aria-label={local.decreaseLabel ?? messages().decreaseValue}\n disabled={rest.disabled || local.disableSteppers || (value() !== null && value() !== undefined && value()! <= min())}\n onClick={() => stepBy(-1)}\n >\n <i class=\"ti ti-minus\" aria-hidden=\"true\" />\n </button>\n </Show>\n <div class=\"k2b-number-input__value\">\n <Show when={local.icon}>\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={local.icon} />\n <i class={local.activeIcon ?? local.icon} />\n </span>\n </Show>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show when={plain()} fallback={control()}>\n {/* The sizer shows the text in the input's grid cell, so the field is as wide as what it shows. At rest it is\n the visible value; while editing the input takes over. */}\n <span\n class=\"k2b-number-input__sizer\"\n data-value={shownText()}\n data-placeholder={raw() ? undefined : \"true\"}\n data-editing={focused() ? \"true\" : undefined}\n >\n {control()}\n </span>\n </Show>\n <Show when={local.suffix && (!plain() || (raw() && (focused() || !local.formatValue)))}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && raw() && !rest.disabled && !rest.readOnly && !plain()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={() => (local.onClear ? local.onClear() : commit(null))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n <Show when={local.showSteppers ?? !plain()}>\n <button\n type=\"button\"\n class=\"k2b-number-input__step\"\n aria-label={local.increaseLabel ?? messages().increaseValue}\n disabled={rest.disabled || local.disableSteppers || (value() !== null && value() !== undefined && value()! >= max())}\n onClick={() => stepBy(1)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n );\n}\n\nexport default NumberInput;\n"],"mappings":"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","ignoreList":[]}