le-kit 0.1.4 → 0.1.5

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 (198) hide show
  1. package/dist/le-kit/assets/custom-elements.json +4305 -0
  2. package/dist/le-kit/index-Da-89pOc.js +4522 -0
  3. package/dist/le-kit/{index-D21JjI31.js.map → index-Da-89pOc.js.map} +1 -1
  4. package/dist/le-kit/index.esm.js +116 -2
  5. package/dist/le-kit/index.esm.js.map +1 -1
  6. package/dist/{esm → le-kit}/le-box.entry.js +3 -3
  7. package/dist/le-kit/le-button.entry.esm.js.map +1 -0
  8. package/dist/le-kit/le-button.entry.js +90 -0
  9. package/dist/{esm → le-kit}/le-card.entry.js +3 -3
  10. package/dist/le-kit/le-checkbox.entry.esm.js.map +1 -0
  11. package/dist/le-kit/le-checkbox.entry.js +59 -0
  12. package/dist/le-kit/le-component.entry.esm.js.map +1 -0
  13. package/dist/{collection/components/le-component/le-component.js → le-kit/le-component.entry.js} +19 -134
  14. package/dist/le-kit/le-kit.css +1010 -1
  15. package/dist/le-kit/le-kit.esm.js +48 -2
  16. package/dist/le-kit/le-kit.esm.js.map +1 -1
  17. package/dist/{esm → le-kit}/le-number-input.entry.js +5 -5
  18. package/dist/le-kit/le-popover.entry.esm.js.map +1 -0
  19. package/dist/{components/le-popover2.js → le-kit/le-popover.entry.js} +9 -45
  20. package/dist/{esm → le-kit}/le-popup.entry.js +6 -6
  21. package/dist/{esm → le-kit}/le-round-progress.entry.js +2 -2
  22. package/dist/le-kit/le-slot.entry.esm.js.map +1 -0
  23. package/dist/{collection/components/le-slot/le-slot.js → le-kit/le-slot.entry.js} +30 -279
  24. package/dist/{esm → le-kit}/le-stack.entry.js +3 -3
  25. package/dist/le-kit/le-string-input.entry.esm.js.map +1 -0
  26. package/dist/le-kit/le-string-input.entry.js +93 -0
  27. package/dist/{esm → le-kit}/le-text.entry.js +3 -3
  28. package/dist/{esm → le-kit}/le-turntable.entry.js +2 -2
  29. package/dist/{esm/utils-CJLZrrdC.js → le-kit/utils-FDOApZ53.js} +3 -3
  30. package/dist/le-kit/{utils-apol-Xc_.js.map → utils-FDOApZ53.js.map} +1 -1
  31. package/package.json +1 -1
  32. package/dist/cjs/index-CO4npcak.js +0 -1796
  33. package/dist/cjs/index-CO4npcak.js.map +0 -1
  34. package/dist/cjs/index.cjs.js +0 -117
  35. package/dist/cjs/index.cjs.js.map +0 -1
  36. package/dist/cjs/le-box.cjs.entry.js +0 -184
  37. package/dist/cjs/le-box.entry.cjs.js.map +0 -1
  38. package/dist/cjs/le-button.le-checkbox.le-component.le-popover.le-slot.le-string-input.entry.cjs.js.map +0 -1
  39. package/dist/cjs/le-button_6.cjs.entry.js +0 -1199
  40. package/dist/cjs/le-card.cjs.entry.js +0 -29
  41. package/dist/cjs/le-card.entry.cjs.js.map +0 -1
  42. package/dist/cjs/le-kit.cjs.js +0 -25
  43. package/dist/cjs/le-kit.cjs.js.map +0 -1
  44. package/dist/cjs/le-number-input.cjs.entry.js +0 -202
  45. package/dist/cjs/le-number-input.entry.cjs.js.map +0 -1
  46. package/dist/cjs/le-popup.cjs.entry.js +0 -212
  47. package/dist/cjs/le-popup.entry.cjs.js.map +0 -1
  48. package/dist/cjs/le-round-progress.cjs.entry.js +0 -106
  49. package/dist/cjs/le-round-progress.entry.cjs.js.map +0 -1
  50. package/dist/cjs/le-stack.cjs.entry.js +0 -135
  51. package/dist/cjs/le-stack.entry.cjs.js.map +0 -1
  52. package/dist/cjs/le-text.cjs.entry.js +0 -335
  53. package/dist/cjs/le-text.entry.cjs.js.map +0 -1
  54. package/dist/cjs/le-turntable.cjs.entry.js +0 -139
  55. package/dist/cjs/le-turntable.entry.cjs.js.map +0 -1
  56. package/dist/cjs/loader.cjs.js +0 -13
  57. package/dist/cjs/loader.cjs.js.map +0 -1
  58. package/dist/cjs/utils-BeT0iyCQ.js +0 -152
  59. package/dist/cjs/utils-BeT0iyCQ.js.map +0 -1
  60. package/dist/collection/collection-manifest.json +0 -26
  61. package/dist/collection/components/le-box/le-box.default.css +0 -37
  62. package/dist/collection/components/le-box/le-box.js +0 -614
  63. package/dist/collection/components/le-box/le-box.js.map +0 -1
  64. package/dist/collection/components/le-button/le-button.default.css +0 -263
  65. package/dist/collection/components/le-button/le-button.js +0 -368
  66. package/dist/collection/components/le-button/le-button.js.map +0 -1
  67. package/dist/collection/components/le-card/le-card.default.css +0 -74
  68. package/dist/collection/components/le-card/le-card.js +0 -102
  69. package/dist/collection/components/le-card/le-card.js.map +0 -1
  70. package/dist/collection/components/le-checkbox/le-checkbox.css +0 -93
  71. package/dist/collection/components/le-checkbox/le-checkbox.js +0 -192
  72. package/dist/collection/components/le-checkbox/le-checkbox.js.map +0 -1
  73. package/dist/collection/components/le-component/le-component.css +0 -189
  74. package/dist/collection/components/le-component/le-component.js.map +0 -1
  75. package/dist/collection/components/le-number-input/le-number-input.css +0 -135
  76. package/dist/collection/components/le-number-input/le-number-input.js +0 -515
  77. package/dist/collection/components/le-number-input/le-number-input.js.map +0 -1
  78. package/dist/collection/components/le-popover/le-popover.css +0 -143
  79. package/dist/collection/components/le-popover/le-popover.js +0 -693
  80. package/dist/collection/components/le-popover/le-popover.js.map +0 -1
  81. package/dist/collection/components/le-popup/le-popup.api.js +0 -101
  82. package/dist/collection/components/le-popup/le-popup.api.js.map +0 -1
  83. package/dist/collection/components/le-popup/le-popup.css +0 -222
  84. package/dist/collection/components/le-popup/le-popup.js +0 -596
  85. package/dist/collection/components/le-popup/le-popup.js.map +0 -1
  86. package/dist/collection/components/le-round-progress/le-round-progress.css +0 -34
  87. package/dist/collection/components/le-round-progress/le-round-progress.js +0 -184
  88. package/dist/collection/components/le-round-progress/le-round-progress.js.map +0 -1
  89. package/dist/collection/components/le-slot/le-slot.default.css +0 -222
  90. package/dist/collection/components/le-slot/le-slot.js.map +0 -1
  91. package/dist/collection/components/le-stack/le-stack.default.css +0 -37
  92. package/dist/collection/components/le-stack/le-stack.js +0 -389
  93. package/dist/collection/components/le-stack/le-stack.js.map +0 -1
  94. package/dist/collection/components/le-string-input/le-string-input.css +0 -83
  95. package/dist/collection/components/le-string-input/le-string-input.js +0 -359
  96. package/dist/collection/components/le-string-input/le-string-input.js.map +0 -1
  97. package/dist/collection/components/le-text/le-text.default.css +0 -169
  98. package/dist/collection/components/le-text/le-text.js +0 -475
  99. package/dist/collection/components/le-text/le-text.js.map +0 -1
  100. package/dist/collection/components/le-turntable/le-turntable.css +0 -10
  101. package/dist/collection/components/le-turntable/le-turntable.js +0 -210
  102. package/dist/collection/components/le-turntable/le-turntable.js.map +0 -1
  103. package/dist/collection/global/app.js +0 -130
  104. package/dist/collection/global/app.js.map +0 -1
  105. package/dist/collection/index.js +0 -15
  106. package/dist/collection/index.js.map +0 -1
  107. package/dist/collection/types/blocks.js +0 -115
  108. package/dist/collection/types/blocks.js.map +0 -1
  109. package/dist/collection/types/options.js +0 -2
  110. package/dist/collection/types/options.js.map +0 -1
  111. package/dist/collection/utils/utils.js +0 -141
  112. package/dist/collection/utils/utils.js.map +0 -1
  113. package/dist/components/index.js +0 -127
  114. package/dist/components/index.js.map +0 -1
  115. package/dist/components/le-box.js +0 -256
  116. package/dist/components/le-box.js.map +0 -1
  117. package/dist/components/le-button.js +0 -9
  118. package/dist/components/le-button.js.map +0 -1
  119. package/dist/components/le-button2.js +0 -1408
  120. package/dist/components/le-button2.js.map +0 -1
  121. package/dist/components/le-card.js +0 -83
  122. package/dist/components/le-card.js.map +0 -1
  123. package/dist/components/le-checkbox.js +0 -9
  124. package/dist/components/le-checkbox.js.map +0 -1
  125. package/dist/components/le-component.js +0 -9
  126. package/dist/components/le-component.js.map +0 -1
  127. package/dist/components/le-number-input.js +0 -271
  128. package/dist/components/le-number-input.js.map +0 -1
  129. package/dist/components/le-popover.js +0 -9
  130. package/dist/components/le-popover.js.map +0 -1
  131. package/dist/components/le-popover2.js.map +0 -1
  132. package/dist/components/le-popup.js +0 -279
  133. package/dist/components/le-popup.js.map +0 -1
  134. package/dist/components/le-round-progress.js +0 -135
  135. package/dist/components/le-round-progress.js.map +0 -1
  136. package/dist/components/le-slot.js +0 -9
  137. package/dist/components/le-slot.js.map +0 -1
  138. package/dist/components/le-stack.js +0 -198
  139. package/dist/components/le-stack.js.map +0 -1
  140. package/dist/components/le-string-input.js +0 -9
  141. package/dist/components/le-string-input.js.map +0 -1
  142. package/dist/components/le-text.js +0 -398
  143. package/dist/components/le-text.js.map +0 -1
  144. package/dist/components/le-turntable.js +0 -164
  145. package/dist/components/le-turntable.js.map +0 -1
  146. package/dist/docs.d.ts +0 -443
  147. package/dist/docs.json +0 -5185
  148. package/dist/esm/index-D71TXvJa.js +0 -1781
  149. package/dist/esm/index-D71TXvJa.js.map +0 -1
  150. package/dist/esm/index.js +0 -106
  151. package/dist/esm/index.js.map +0 -1
  152. package/dist/esm/le-box.entry.js.map +0 -1
  153. package/dist/esm/le-button.le-checkbox.le-component.le-popover.le-slot.le-string-input.entry.js.map +0 -1
  154. package/dist/esm/le-button_6.entry.js +0 -1192
  155. package/dist/esm/le-card.entry.js.map +0 -1
  156. package/dist/esm/le-kit.js +0 -21
  157. package/dist/esm/le-kit.js.map +0 -1
  158. package/dist/esm/le-number-input.entry.js.map +0 -1
  159. package/dist/esm/le-popup.entry.js.map +0 -1
  160. package/dist/esm/le-round-progress.entry.js.map +0 -1
  161. package/dist/esm/le-stack.entry.js.map +0 -1
  162. package/dist/esm/le-text.entry.js.map +0 -1
  163. package/dist/esm/le-turntable.entry.js.map +0 -1
  164. package/dist/esm/loader.js +0 -11
  165. package/dist/esm/loader.js.map +0 -1
  166. package/dist/esm/utils-CJLZrrdC.js.map +0 -1
  167. package/dist/index.cjs.js +0 -1
  168. package/dist/index.js +0 -1
  169. package/dist/le-kit/le-button.le-checkbox.le-component.le-popover.le-slot.le-string-input.entry.esm.js.map +0 -1
  170. package/dist/le-kit/p-024a764e.entry.js +0 -2
  171. package/dist/le-kit/p-024a764e.entry.js.map +0 -1
  172. package/dist/le-kit/p-073cf0b9.entry.js +0 -2
  173. package/dist/le-kit/p-073cf0b9.entry.js.map +0 -1
  174. package/dist/le-kit/p-0955b105.entry.js +0 -2
  175. package/dist/le-kit/p-0955b105.entry.js.map +0 -1
  176. package/dist/le-kit/p-18d79ee2.entry.js +0 -2
  177. package/dist/le-kit/p-18d79ee2.entry.js.map +0 -1
  178. package/dist/le-kit/p-4b1d3b6d.entry.js +0 -2
  179. package/dist/le-kit/p-4b1d3b6d.entry.js.map +0 -1
  180. package/dist/le-kit/p-79d179bd.entry.js +0 -2
  181. package/dist/le-kit/p-79d179bd.entry.js.map +0 -1
  182. package/dist/le-kit/p-D71TXvJa.js +0 -3
  183. package/dist/le-kit/p-D71TXvJa.js.map +0 -1
  184. package/dist/le-kit/p-c8a9288e.entry.js +0 -2
  185. package/dist/le-kit/p-c8a9288e.entry.js.map +0 -1
  186. package/dist/le-kit/p-cfc35bd3.entry.js +0 -2
  187. package/dist/le-kit/p-cfc35bd3.entry.js.map +0 -1
  188. package/dist/le-kit/p-d04da1f5.entry.js +0 -2
  189. package/dist/le-kit/p-d04da1f5.entry.js.map +0 -1
  190. package/dist/le-kit/p-qIai5-eB.js +0 -2
  191. package/dist/le-kit/p-qIai5-eB.js.map +0 -1
  192. package/dist/themes/base.css +0 -89
  193. package/dist/themes/dark.css +0 -100
  194. package/dist/themes/default.css +0 -108
  195. package/dist/themes/gradient.css +0 -100
  196. package/dist/themes/index.css +0 -413
  197. package/dist/themes/minimal.css +0 -100
  198. package/dist/themes/warm.css +0 -100
@@ -1,515 +0,0 @@
1
- import { h } from "@stencil/core";
2
- import { classnames } from "../../utils/utils";
3
- /**
4
- * A number input component with validation, keyboard controls, and custom spinners.
5
- *
6
- * @slot - The label text for the input
7
- * @slot description - Additional description text displayed below the input
8
- * @slot icon-start - Icon to display at the start of the input
9
- *
10
- * @cssprop --le-input-bg - Input background color
11
- * @cssprop --le-input-color - Input text color
12
- * @cssprop --le-input-border - Input border style
13
- * @cssprop --le-input-border-focus - Input border style when focused
14
- * @cssprop --le-input-border-error - Input border style when invalid
15
- * @cssprop --le-input-radius - Input border radius
16
- * @cssprop --le-input-padding - Input padding
17
- */
18
- export class LeNumberInput {
19
- el;
20
- /**
21
- * The value of the input
22
- */
23
- value;
24
- /**
25
- * The name of the input
26
- */
27
- name;
28
- /**
29
- * Label for the input
30
- */
31
- label;
32
- /**
33
- * Placeholder text
34
- */
35
- placeholder;
36
- /**
37
- * Minimum allowed value
38
- */
39
- min;
40
- /**
41
- * Maximum allowed value
42
- */
43
- max;
44
- /**
45
- * Step value for increment/decrement
46
- */
47
- step = 1;
48
- /**
49
- * Whether the input is required
50
- */
51
- required = false;
52
- /**
53
- * Whether the input is disabled
54
- */
55
- disabled = false;
56
- /**
57
- * Whether the input is read-only
58
- */
59
- readonly = false;
60
- /**
61
- * Icon for the start icon
62
- */
63
- iconStart;
64
- /**
65
- * Whether to show the spinner controls
66
- */
67
- showSpinners = true;
68
- /**
69
- * External ID for linking with external systems
70
- */
71
- externalId;
72
- /**
73
- * Internal validation state
74
- */
75
- isValid = true;
76
- validationMessage = '';
77
- /**
78
- * Emitted when the value changes (on blur or Enter)
79
- */
80
- leChange;
81
- /**
82
- * Emitted when the input value changes (on keystroke/spin)
83
- */
84
- leInput;
85
- valueChanged() {
86
- this.validate();
87
- }
88
- validate() {
89
- if (this.required && (this.value === undefined || this.value === null || isNaN(this.value))) {
90
- this.isValid = false;
91
- this.validationMessage = 'This field is required';
92
- return;
93
- }
94
- if (this.value !== undefined && this.value !== null && !isNaN(this.value)) {
95
- if (this.min !== undefined && this.value < this.min) {
96
- this.isValid = false;
97
- this.validationMessage = `Value must be at least ${this.min}`;
98
- return;
99
- }
100
- if (this.max !== undefined && this.value > this.max) {
101
- this.isValid = false;
102
- this.validationMessage = `Value must be at most ${this.max}`;
103
- return;
104
- }
105
- }
106
- this.isValid = true;
107
- this.validationMessage = '';
108
- }
109
- emitChange() {
110
- this.leChange.emit({
111
- value: this.value,
112
- name: this.name,
113
- externalId: this.externalId,
114
- isValid: this.isValid
115
- });
116
- }
117
- emitInput() {
118
- this.leInput.emit({
119
- value: this.value,
120
- name: this.name,
121
- externalId: this.externalId,
122
- isValid: this.isValid
123
- });
124
- }
125
- updateValue(newValue) {
126
- if (this.disabled || this.readonly)
127
- return;
128
- // Round to avoid floating point errors
129
- const precision = this.step.toString().split('.')[1]?.length || 0;
130
- const rounded = parseFloat(newValue.toFixed(precision));
131
- this.value = rounded;
132
- this.validate();
133
- this.emitInput();
134
- }
135
- handleInput = (ev) => {
136
- const input = ev.target;
137
- const val = parseFloat(input.value);
138
- if (input.value === '') {
139
- this.value = undefined;
140
- }
141
- else if (!isNaN(val)) {
142
- this.value = val;
143
- }
144
- this.validate();
145
- this.emitInput();
146
- };
147
- handleChange = () => {
148
- this.validate();
149
- this.emitChange();
150
- };
151
- handleKeyDown = (ev) => {
152
- if (this.disabled || this.readonly)
153
- return;
154
- let multiplier = 1;
155
- if (ev.shiftKey)
156
- multiplier = 10;
157
- if (ev.altKey)
158
- multiplier = 0.1;
159
- const current = this.value || 0;
160
- if (ev.key === 'ArrowUp') {
161
- ev.preventDefault();
162
- this.updateValue(current + (this.step * multiplier));
163
- }
164
- else if (ev.key === 'ArrowDown') {
165
- ev.preventDefault();
166
- this.updateValue(current - (this.step * multiplier));
167
- }
168
- };
169
- handleWheel = (ev) => {
170
- if (this.disabled || this.readonly)
171
- return;
172
- // Only handle if input is focused to prevent accidental scrolling
173
- if (document.activeElement !== ev.target)
174
- return;
175
- ev.preventDefault();
176
- const current = this.value || 0;
177
- if (ev.deltaY < 0) {
178
- this.updateValue(current + this.step);
179
- }
180
- else {
181
- this.updateValue(current - this.step);
182
- }
183
- };
184
- increment = (ev) => {
185
- ev.preventDefault(); // Prevent focus loss
186
- const current = this.value || 0;
187
- this.updateValue(current + this.step);
188
- // Trigger change event for buttons as they are "final" actions usually
189
- this.emitChange();
190
- };
191
- decrement = (ev) => {
192
- ev.preventDefault();
193
- const current = this.value || 0;
194
- this.updateValue(current - this.step);
195
- this.emitChange();
196
- };
197
- render() {
198
- return (h("le-component", { key: '6af8d1fd4c89597f7da3be391cabccbb9d1f9800', component: "le-number-input", hostClass: classnames({ 'disabled': this.disabled }) }, h("div", { key: 'e4e0ad02f89b2eb8dd7649d2f2e70bc821cb2774', class: "le-input-wrapper" }, this.label && (h("label", { key: '30ad120d5571018ea9891340b5406f6939a1fe0e', class: "le-input-label", htmlFor: this.name }, this.label)), h("div", { key: '27b835ad1559a1ea4366c4b7c2b31d412e8b8ef7', class: classnames('le-input-container', { 'has-error': !this.isValid }) }, this.iconStart && (h("span", { key: '0164cbb985b900b4b3136061a2609987a2c06e9f', class: "icon-start" }, this.iconStart)), h("input", { key: '6d68b764f45d61b7dd4ffe435bd9e9da04c4d87a', id: this.name, type: "number", name: this.name, placeholder: this.placeholder, min: this.min, max: this.max, step: this.step, value: this.value, disabled: this.disabled, readOnly: this.readonly, required: this.required, onInput: this.handleInput, onChange: this.handleChange, onKeyDown: this.handleKeyDown, onWheel: this.handleWheel }), this.showSpinners && (h("div", { key: '7ed04341c0c27a7d37afd4baf9698ea7776702f6', class: "le-input-controls" }, h("le-button", { key: '80c96f7cbee40efd2b79f33e8401a13f187092a6', mode: "default", variant: "clear", size: "small", "icon-only": true, class: "le-input-control-btn", onClick: this.increment, disabled: this.disabled || this.readonly || (this.max !== undefined && this.value >= this.max), tabindex: "-1" }, h("span", { key: 'd56b463073ce8174c668138179f1bbc16c700d9f', slot: "icon-only" }, "\u2191")), h("le-button", { key: '74e70e65d6668cc1cee7abfaf464a60a29efa3f9', mode: "default", variant: "clear", size: "small", "icon-only": true, class: "le-input-control-btn", onClick: this.decrement, disabled: this.disabled || this.readonly || (this.min !== undefined && this.value <= this.min), tabindex: "-1" }, h("span", { key: 'e2330cdf9f431b2c9f0953e42f71e897879d10fe', slot: "icon-only" }, "\u2193"))))), !this.isValid && h("div", { key: 'ba9bb8af8c4814b4316c1f0947c50a99fd24634c', class: "le-input-error" }, this.validationMessage), h("div", { key: '30e43ac088f995fe24ab47678ca70fe771b6f1ab', class: "le-input-description" }, h("le-slot", { key: '94f4bd21e32595470781eb6b004c9acbee72b81a', name: "description", type: "text", tag: "p", label: "Description" }, h("slot", { key: 'def94a79248d1887c5416ff95b2c625df85c68d0', name: "description" }))))));
199
- }
200
- static get is() { return "le-number-input"; }
201
- static get encapsulation() { return "shadow"; }
202
- static get originalStyleUrls() {
203
- return {
204
- "$": ["le-number-input.css"]
205
- };
206
- }
207
- static get styleUrls() {
208
- return {
209
- "$": ["le-number-input.css"]
210
- };
211
- }
212
- static get properties() {
213
- return {
214
- "value": {
215
- "type": "number",
216
- "mutable": true,
217
- "complexType": {
218
- "original": "number",
219
- "resolved": "number",
220
- "references": {}
221
- },
222
- "required": false,
223
- "optional": false,
224
- "docs": {
225
- "tags": [],
226
- "text": "The value of the input"
227
- },
228
- "getter": false,
229
- "setter": false,
230
- "reflect": true,
231
- "attribute": "value"
232
- },
233
- "name": {
234
- "type": "string",
235
- "mutable": false,
236
- "complexType": {
237
- "original": "string",
238
- "resolved": "string",
239
- "references": {}
240
- },
241
- "required": false,
242
- "optional": false,
243
- "docs": {
244
- "tags": [],
245
- "text": "The name of the input"
246
- },
247
- "getter": false,
248
- "setter": false,
249
- "reflect": false,
250
- "attribute": "name"
251
- },
252
- "label": {
253
- "type": "string",
254
- "mutable": false,
255
- "complexType": {
256
- "original": "string",
257
- "resolved": "string",
258
- "references": {}
259
- },
260
- "required": false,
261
- "optional": false,
262
- "docs": {
263
- "tags": [],
264
- "text": "Label for the input"
265
- },
266
- "getter": false,
267
- "setter": false,
268
- "reflect": false,
269
- "attribute": "label"
270
- },
271
- "placeholder": {
272
- "type": "string",
273
- "mutable": false,
274
- "complexType": {
275
- "original": "string",
276
- "resolved": "string",
277
- "references": {}
278
- },
279
- "required": false,
280
- "optional": false,
281
- "docs": {
282
- "tags": [],
283
- "text": "Placeholder text"
284
- },
285
- "getter": false,
286
- "setter": false,
287
- "reflect": false,
288
- "attribute": "placeholder"
289
- },
290
- "min": {
291
- "type": "number",
292
- "mutable": false,
293
- "complexType": {
294
- "original": "number",
295
- "resolved": "number",
296
- "references": {}
297
- },
298
- "required": false,
299
- "optional": true,
300
- "docs": {
301
- "tags": [],
302
- "text": "Minimum allowed value"
303
- },
304
- "getter": false,
305
- "setter": false,
306
- "reflect": false,
307
- "attribute": "min"
308
- },
309
- "max": {
310
- "type": "number",
311
- "mutable": false,
312
- "complexType": {
313
- "original": "number",
314
- "resolved": "number",
315
- "references": {}
316
- },
317
- "required": false,
318
- "optional": true,
319
- "docs": {
320
- "tags": [],
321
- "text": "Maximum allowed value"
322
- },
323
- "getter": false,
324
- "setter": false,
325
- "reflect": false,
326
- "attribute": "max"
327
- },
328
- "step": {
329
- "type": "number",
330
- "mutable": false,
331
- "complexType": {
332
- "original": "number",
333
- "resolved": "number",
334
- "references": {}
335
- },
336
- "required": false,
337
- "optional": false,
338
- "docs": {
339
- "tags": [],
340
- "text": "Step value for increment/decrement"
341
- },
342
- "getter": false,
343
- "setter": false,
344
- "reflect": false,
345
- "attribute": "step",
346
- "defaultValue": "1"
347
- },
348
- "required": {
349
- "type": "boolean",
350
- "mutable": false,
351
- "complexType": {
352
- "original": "boolean",
353
- "resolved": "boolean",
354
- "references": {}
355
- },
356
- "required": false,
357
- "optional": false,
358
- "docs": {
359
- "tags": [],
360
- "text": "Whether the input is required"
361
- },
362
- "getter": false,
363
- "setter": false,
364
- "reflect": false,
365
- "attribute": "required",
366
- "defaultValue": "false"
367
- },
368
- "disabled": {
369
- "type": "boolean",
370
- "mutable": false,
371
- "complexType": {
372
- "original": "boolean",
373
- "resolved": "boolean",
374
- "references": {}
375
- },
376
- "required": false,
377
- "optional": false,
378
- "docs": {
379
- "tags": [],
380
- "text": "Whether the input is disabled"
381
- },
382
- "getter": false,
383
- "setter": false,
384
- "reflect": false,
385
- "attribute": "disabled",
386
- "defaultValue": "false"
387
- },
388
- "readonly": {
389
- "type": "boolean",
390
- "mutable": false,
391
- "complexType": {
392
- "original": "boolean",
393
- "resolved": "boolean",
394
- "references": {}
395
- },
396
- "required": false,
397
- "optional": false,
398
- "docs": {
399
- "tags": [],
400
- "text": "Whether the input is read-only"
401
- },
402
- "getter": false,
403
- "setter": false,
404
- "reflect": false,
405
- "attribute": "readonly",
406
- "defaultValue": "false"
407
- },
408
- "iconStart": {
409
- "type": "string",
410
- "mutable": false,
411
- "complexType": {
412
- "original": "string",
413
- "resolved": "string",
414
- "references": {}
415
- },
416
- "required": false,
417
- "optional": true,
418
- "docs": {
419
- "tags": [],
420
- "text": "Icon for the start icon"
421
- },
422
- "getter": false,
423
- "setter": false,
424
- "reflect": false,
425
- "attribute": "icon-start"
426
- },
427
- "showSpinners": {
428
- "type": "boolean",
429
- "mutable": false,
430
- "complexType": {
431
- "original": "boolean",
432
- "resolved": "boolean",
433
- "references": {}
434
- },
435
- "required": false,
436
- "optional": false,
437
- "docs": {
438
- "tags": [],
439
- "text": "Whether to show the spinner controls"
440
- },
441
- "getter": false,
442
- "setter": false,
443
- "reflect": false,
444
- "attribute": "show-spinners",
445
- "defaultValue": "true"
446
- },
447
- "externalId": {
448
- "type": "string",
449
- "mutable": false,
450
- "complexType": {
451
- "original": "string",
452
- "resolved": "string",
453
- "references": {}
454
- },
455
- "required": false,
456
- "optional": false,
457
- "docs": {
458
- "tags": [],
459
- "text": "External ID for linking with external systems"
460
- },
461
- "getter": false,
462
- "setter": false,
463
- "reflect": false,
464
- "attribute": "external-id"
465
- }
466
- };
467
- }
468
- static get states() {
469
- return {
470
- "isValid": {},
471
- "validationMessage": {}
472
- };
473
- }
474
- static get events() {
475
- return [{
476
- "method": "leChange",
477
- "name": "leChange",
478
- "bubbles": true,
479
- "cancelable": true,
480
- "composed": true,
481
- "docs": {
482
- "tags": [],
483
- "text": "Emitted when the value changes (on blur or Enter)"
484
- },
485
- "complexType": {
486
- "original": "{ value: number; name: string; externalId: string; isValid: boolean }",
487
- "resolved": "{ value: number; name: string; externalId: string; isValid: boolean; }",
488
- "references": {}
489
- }
490
- }, {
491
- "method": "leInput",
492
- "name": "leInput",
493
- "bubbles": true,
494
- "cancelable": true,
495
- "composed": true,
496
- "docs": {
497
- "tags": [],
498
- "text": "Emitted when the input value changes (on keystroke/spin)"
499
- },
500
- "complexType": {
501
- "original": "{ value: number; name: string; externalId: string; isValid: boolean }",
502
- "resolved": "{ value: number; name: string; externalId: string; isValid: boolean; }",
503
- "references": {}
504
- }
505
- }];
506
- }
507
- static get elementRef() { return "el"; }
508
- static get watchers() {
509
- return [{
510
- "propName": "value",
511
- "methodName": "valueChanged"
512
- }];
513
- }
514
- }
515
- //# sourceMappingURL=le-number-input.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"le-number-input.js","sourceRoot":"","sources":["../../../src/components/le-number-input/le-number-input.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, Event, EventEmitter, State, h, Element, Watch } from '@stencil/core';\nimport { classnames } from '../../utils/utils';\n\n/**\n * A number input component with validation, keyboard controls, and custom spinners.\n *\n * @slot - The label text for the input\n * @slot description - Additional description text displayed below the input\n * @slot icon-start - Icon to display at the start of the input\n *\n * @cssprop --le-input-bg - Input background color\n * @cssprop --le-input-color - Input text color\n * @cssprop --le-input-border - Input border style\n * @cssprop --le-input-border-focus - Input border style when focused\n * @cssprop --le-input-border-error - Input border style when invalid\n * @cssprop --le-input-radius - Input border radius\n * @cssprop --le-input-padding - Input padding\n */\n@Component({\n tag: 'le-number-input',\n styleUrl: 'le-number-input.css',\n shadow: true,\n})\nexport class LeNumberInput {\n @Element() el: HTMLElement;\n\n /**\n * The value of the input\n */\n @Prop({ mutable: true, reflect: true }) value: number;\n\n /**\n * The name of the input\n */\n @Prop() name: string;\n\n /**\n * Label for the input\n */\n @Prop() label: string;\n\n /**\n * Placeholder text\n */\n @Prop() placeholder: string;\n\n /**\n * Minimum allowed value\n */\n @Prop() min?: number;\n\n /**\n * Maximum allowed value\n */\n @Prop() max?: number;\n\n /**\n * Step value for increment/decrement\n */\n @Prop() step: number = 1;\n\n /**\n * Whether the input is required\n */\n @Prop() required: boolean = false;\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input is read-only\n */\n @Prop() readonly: boolean = false;\n\n /**\n * Icon for the start icon\n */\n @Prop() iconStart?: string;\n\n /**\n * Whether to show the spinner controls\n */\n @Prop() showSpinners: boolean = true;\n\n /**\n * External ID for linking with external systems\n */\n @Prop() externalId: string;\n\n /**\n * Internal validation state\n */\n @State() private isValid: boolean = true;\n @State() private validationMessage: string = '';\n\n /**\n * Emitted when the value changes (on blur or Enter)\n */\n @Event() leChange: EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>;\n\n /**\n * Emitted when the input value changes (on keystroke/spin)\n */\n @Event() leInput: EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>;\n\n @Watch('value')\n valueChanged() {\n this.validate();\n }\n\n private validate() {\n if (this.required && (this.value === undefined || this.value === null || isNaN(this.value))) {\n this.isValid = false;\n this.validationMessage = 'This field is required';\n return;\n }\n\n if (this.value !== undefined && this.value !== null && !isNaN(this.value)) {\n if (this.min !== undefined && this.value < this.min) {\n this.isValid = false;\n this.validationMessage = `Value must be at least ${this.min}`;\n return;\n }\n if (this.max !== undefined && this.value > this.max) {\n this.isValid = false;\n this.validationMessage = `Value must be at most ${this.max}`;\n return;\n }\n }\n\n this.isValid = true;\n this.validationMessage = '';\n }\n\n private emitChange() {\n this.leChange.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n isValid: this.isValid\n });\n }\n\n private emitInput() {\n this.leInput.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n isValid: this.isValid\n });\n }\n\n private updateValue(newValue: number) {\n if (this.disabled || this.readonly) return;\n \n // Round to avoid floating point errors\n const precision = this.step.toString().split('.')[1]?.length || 0;\n const rounded = parseFloat(newValue.toFixed(precision));\n \n this.value = rounded;\n this.validate();\n this.emitInput();\n }\n\n private handleInput = (ev: Event) => {\n const input = ev.target as HTMLInputElement;\n const val = parseFloat(input.value);\n \n if (input.value === '') {\n this.value = undefined;\n } else if (!isNaN(val)) {\n this.value = val;\n }\n \n this.validate();\n this.emitInput();\n };\n\n private handleChange = () => {\n this.validate();\n this.emitChange();\n };\n\n private handleKeyDown = (ev: KeyboardEvent) => {\n if (this.disabled || this.readonly) return;\n\n let multiplier = 1;\n if (ev.shiftKey) multiplier = 10;\n if (ev.altKey) multiplier = 0.1;\n\n const current = this.value || 0;\n\n if (ev.key === 'ArrowUp') {\n ev.preventDefault();\n this.updateValue(current + (this.step * multiplier));\n } else if (ev.key === 'ArrowDown') {\n ev.preventDefault();\n this.updateValue(current - (this.step * multiplier));\n }\n };\n\n private handleWheel = (ev: WheelEvent) => {\n if (this.disabled || this.readonly) return;\n // Only handle if input is focused to prevent accidental scrolling\n if (document.activeElement !== ev.target) return;\n\n ev.preventDefault();\n const current = this.value || 0;\n \n if (ev.deltaY < 0) {\n this.updateValue(current + this.step);\n } else {\n this.updateValue(current - this.step);\n }\n };\n\n private increment = (ev: Event) => {\n ev.preventDefault(); // Prevent focus loss\n const current = this.value || 0;\n this.updateValue(current + this.step);\n // Trigger change event for buttons as they are \"final\" actions usually\n this.emitChange();\n };\n\n private decrement = (ev: Event) => {\n ev.preventDefault();\n const current = this.value || 0;\n this.updateValue(current - this.step);\n this.emitChange();\n };\n\n render() {\n return (\n <le-component component=\"le-number-input\" hostClass={classnames({ 'disabled': this.disabled })}>\n <div class=\"le-input-wrapper\">\n {this.label && (\n <label class=\"le-input-label\" htmlFor={this.name}>{this.label}</label>\n )}\n \n <div class={classnames('le-input-container', { 'has-error': !this.isValid })}>\n {this.iconStart && (\n <span class=\"icon-start\">{this.iconStart}</span>\n )}\n \n <input\n id={this.name}\n type=\"number\"\n name={this.name}\n placeholder={this.placeholder}\n min={this.min}\n max={this.max}\n step={this.step}\n value={this.value}\n disabled={this.disabled}\n readOnly={this.readonly}\n required={this.required}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onKeyDown={this.handleKeyDown}\n onWheel={this.handleWheel}\n />\n \n {this.showSpinners && (\n <div class=\"le-input-controls\">\n <le-button\n mode=\"default\"\n variant=\"clear\" \n size=\"small\"\n icon-only\n class=\"le-input-control-btn\" \n onClick={this.increment}\n disabled={this.disabled || this.readonly || (this.max !== undefined && this.value >= this.max)}\n tabindex=\"-1\"\n >\n <span slot=\"icon-only\">↑</span>\n </le-button>\n <le-button\n mode=\"default\"\n variant=\"clear\" \n size=\"small\" \n icon-only \n class=\"le-input-control-btn\" \n onClick={this.decrement}\n disabled={this.disabled || this.readonly || (this.min !== undefined && this.value <= this.min)}\n tabindex=\"-1\"\n >\n <span slot=\"icon-only\">↓</span>\n </le-button>\n </div>\n )}\n </div>\n\n {!this.isValid && <div class=\"le-input-error\">{this.validationMessage}</div>}\n\n <div class=\"le-input-description\">\n <le-slot name=\"description\" type=\"text\" tag=\"p\" label=\"Description\">\n <slot name=\"description\"></slot>\n </le-slot>\n </div>\n </div>\n </le-component>\n );\n }\n}\n"]}