@operato/input 8.0.0 → 9.0.0-beta.4

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 (119) hide show
  1. package/CHANGELOG.md +165 -24
  2. package/dist/src/index.d.ts +1 -0
  3. package/dist/src/index.js +1 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/ox-buttons-radio.d.ts +1 -1
  6. package/dist/src/ox-buttons-radio.js +1 -1
  7. package/dist/src/ox-buttons-radio.js.map +1 -1
  8. package/dist/src/ox-checkbox.d.ts +1 -1
  9. package/dist/src/ox-checkbox.js +1 -1
  10. package/dist/src/ox-checkbox.js.map +1 -1
  11. package/dist/src/ox-input-3axis.d.ts +1 -1
  12. package/dist/src/ox-input-3axis.js +1 -1
  13. package/dist/src/ox-input-3axis.js.map +1 -1
  14. package/dist/src/ox-input-3dish.d.ts +2 -2
  15. package/dist/src/ox-input-3dish.js +2 -2
  16. package/dist/src/ox-input-3dish.js.map +1 -1
  17. package/dist/src/ox-input-angle.d.ts +1 -1
  18. package/dist/src/ox-input-angle.js +1 -1
  19. package/dist/src/ox-input-angle.js.map +1 -1
  20. package/dist/src/ox-input-code.d.ts +1 -1
  21. package/dist/src/ox-input-code.js +3 -4
  22. package/dist/src/ox-input-code.js.map +1 -1
  23. package/dist/src/ox-input-color-stops.d.ts +4 -4
  24. package/dist/src/ox-input-color-stops.js +4 -4
  25. package/dist/src/ox-input-color-stops.js.map +1 -1
  26. package/dist/src/ox-input-color.d.ts +1 -1
  27. package/dist/src/ox-input-color.js +1 -1
  28. package/dist/src/ox-input-color.js.map +1 -1
  29. package/dist/src/ox-input-crontab.d.ts +1 -1
  30. package/dist/src/ox-input-crontab.js +1 -1
  31. package/dist/src/ox-input-crontab.js.map +1 -1
  32. package/dist/src/ox-input-data.d.ts +1 -1
  33. package/dist/src/ox-input-data.js +1 -1
  34. package/dist/src/ox-input-data.js.map +1 -1
  35. package/dist/src/ox-input-direction.d.ts +2 -1
  36. package/dist/src/ox-input-direction.js +38 -5
  37. package/dist/src/ox-input-direction.js.map +1 -1
  38. package/dist/src/ox-input-duration.d.ts +1 -1
  39. package/dist/src/ox-input-duration.js +1 -1
  40. package/dist/src/ox-input-duration.js.map +1 -1
  41. package/dist/src/ox-input-i18n-label.d.ts +1 -1
  42. package/dist/src/ox-input-i18n-label.js +1 -1
  43. package/dist/src/ox-input-i18n-label.js.map +1 -1
  44. package/dist/src/ox-input-key-values.d.ts +1 -1
  45. package/dist/src/ox-input-key-values.js +1 -1
  46. package/dist/src/ox-input-key-values.js.map +1 -1
  47. package/dist/src/ox-input-layout/ox-input-layout.d.ts +2 -2
  48. package/dist/src/ox-input-layout/ox-input-layout.js +4 -4
  49. package/dist/src/ox-input-layout/ox-input-layout.js.map +1 -1
  50. package/dist/src/ox-input-mass-fraction.d.ts +1 -1
  51. package/dist/src/ox-input-mass-fraction.js +1 -1
  52. package/dist/src/ox-input-mass-fraction.js.map +1 -1
  53. package/dist/src/ox-input-options.d.ts +1 -1
  54. package/dist/src/ox-input-options.js +1 -1
  55. package/dist/src/ox-input-options.js.map +1 -1
  56. package/dist/src/ox-input-partition-keys.d.ts +1 -1
  57. package/dist/src/ox-input-partition-keys.js +1 -1
  58. package/dist/src/ox-input-partition-keys.js.map +1 -1
  59. package/dist/src/ox-input-privilege.d.ts +1 -1
  60. package/dist/src/ox-input-privilege.js +1 -1
  61. package/dist/src/ox-input-privilege.js.map +1 -1
  62. package/dist/src/ox-input-scene-component-id.d.ts +1 -1
  63. package/dist/src/ox-input-scene-component-id.js +1 -1
  64. package/dist/src/ox-input-scene-component-id.js.map +1 -1
  65. package/dist/src/ox-input-search.d.ts +1 -1
  66. package/dist/src/ox-input-search.js +1 -1
  67. package/dist/src/ox-input-search.js.map +1 -1
  68. package/dist/src/ox-input-select-buttons.d.ts +1 -1
  69. package/dist/src/ox-input-select-buttons.js +1 -1
  70. package/dist/src/ox-input-select-buttons.js.map +1 -1
  71. package/dist/src/ox-input-signature.d.ts +4 -2
  72. package/dist/src/ox-input-signature.js +34 -14
  73. package/dist/src/ox-input-signature.js.map +1 -1
  74. package/dist/src/ox-input-stack.d.ts +1 -1
  75. package/dist/src/ox-input-stack.js +1 -1
  76. package/dist/src/ox-input-stack.js.map +1 -1
  77. package/dist/src/ox-input-switch.d.ts +10 -0
  78. package/dist/src/ox-input-switch.js +125 -0
  79. package/dist/src/ox-input-switch.js.map +1 -0
  80. package/dist/src/ox-input-table-column-config.d.ts +1 -1
  81. package/dist/src/ox-input-table-column-config.js +1 -1
  82. package/dist/src/ox-input-table-column-config.js.map +1 -1
  83. package/dist/src/ox-input-table.js +1 -1
  84. package/dist/src/ox-input-table.js.map +1 -1
  85. package/dist/src/ox-input-textarea.d.ts +1 -1
  86. package/dist/src/ox-input-textarea.js +1 -1
  87. package/dist/src/ox-input-textarea.js.map +1 -1
  88. package/dist/src/ox-input-unit-number.d.ts +1 -1
  89. package/dist/src/ox-input-unit-number.js +1 -1
  90. package/dist/src/ox-input-unit-number.js.map +1 -1
  91. package/dist/src/ox-input-value-map.d.ts +2 -2
  92. package/dist/src/ox-input-value-map.js +2 -2
  93. package/dist/src/ox-input-value-map.js.map +1 -1
  94. package/dist/src/ox-input-value-ranges.d.ts +1 -1
  95. package/dist/src/ox-input-value-ranges.js +1 -1
  96. package/dist/src/ox-input-value-ranges.js.map +1 -1
  97. package/dist/src/ox-select-floor.d.ts +35 -0
  98. package/dist/src/ox-select-floor.js +238 -0
  99. package/dist/src/ox-select-floor.js.map +1 -0
  100. package/dist/stories/image-for-select-floor.d.ts +1 -0
  101. package/dist/stories/image-for-select-floor.js +2 -0
  102. package/dist/stories/image-for-select-floor.js.map +1 -0
  103. package/dist/stories/ox-input-direction.stories.js +11 -0
  104. package/dist/stories/ox-input-direction.stories.js.map +1 -1
  105. package/dist/stories/ox-input-switch.stories.d.ts +38 -0
  106. package/dist/stories/ox-input-switch.stories.js +68 -0
  107. package/dist/stories/ox-input-switch.stories.js.map +1 -0
  108. package/dist/stories/ox-select-floor.stories.d.ts +45 -0
  109. package/dist/stories/ox-select-floor.stories.js +166 -0
  110. package/dist/stories/ox-select-floor.stories.js.map +1 -0
  111. package/dist/tsconfig.tsbuildinfo +1 -1
  112. package/package.json +24 -15
  113. package/assets/images/icon-editor-gradient-direction.png +0 -0
  114. package/assets/images/icon-properties-label.png +0 -0
  115. package/assets/images/icon-properties-line-type.png +0 -0
  116. package/assets/images/icon-properties-table.png +0 -0
  117. package/dist/src/ox-zoomable-image.d.ts +0 -17
  118. package/dist/src/ox-zoomable-image.js +0 -80
  119. package/dist/src/ox-zoomable-image.js.map +0 -1
@@ -0,0 +1,238 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html } from 'lit';
3
+ import { customElement, property, query, state } from 'lit/decorators.js';
4
+ import { OxFormField } from './ox-form-field.js';
5
+ let OxSelectFloor = class OxSelectFloor extends OxFormField {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.cards = [];
9
+ this.bottomLimit = 70;
10
+ this.interval = 0;
11
+ this.selectedIndex = -1;
12
+ this.activeIndex = null;
13
+ this.isDragging = false;
14
+ this.lastMouseY = 0;
15
+ }
16
+ static { this.styles = [
17
+ css `
18
+ :host {
19
+ display: block;
20
+ position: relative;
21
+ overflow: hidden;
22
+ height: 100%;
23
+
24
+ --ox-select-floor-rotate-x: 60deg;
25
+ --ox-select-floor-rotate-x-active: 40deg;
26
+ --ox-select-floor-perspective: 1200px;
27
+ }
28
+
29
+ .carousel-container {
30
+ position: relative;
31
+ width: 100%;
32
+ overflow: hidden;
33
+ user-select: none;
34
+ }
35
+
36
+ .card {
37
+ position: absolute;
38
+ bottom: 0;
39
+ width: 100%;
40
+ background-color: white;
41
+ transition:
42
+ transform 0.3s ease,
43
+ opacity 0.3s ease,
44
+ box-shadow 0.3s ease,
45
+ border 0.3s ease;
46
+ transform-origin: bottom;
47
+ transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x));
48
+ opacity: 0.5;
49
+ border: 2px solid transparent;
50
+ border-radius: 12px;
51
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
52
+ }
53
+
54
+ .card img {
55
+ width: 100%;
56
+ height: auto;
57
+ display: block;
58
+ pointer-events: none;
59
+ border-radius: 12px;
60
+ }
61
+
62
+ .selected {
63
+ opacity: 0.8;
64
+ z-index: 1;
65
+ border: 4px solid #3b82f6;
66
+ box-shadow: 0 8px 16px rgba(59, 130, 246, 0.4);
67
+ }
68
+
69
+ .selected.active {
70
+ opacity: 1;
71
+ z-index: 2;
72
+ transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x-active));
73
+ box-shadow: 0 12px 24px rgba(59, 130, 246, 0.4);
74
+ }
75
+
76
+ [template-container] {
77
+ position: absolute;
78
+ right: 10px;
79
+ z-index: 1;
80
+ }
81
+ `
82
+ ]; }
83
+ render() {
84
+ const length = this.cards.length;
85
+ const cards = this.cards;
86
+ const interval = this.interval;
87
+ return html `
88
+ <div
89
+ class="carousel-container"
90
+ @wheel=${interval ? () => { } : this.handleWheel}
91
+ @pointerdown=${this.handlePointerDown}
92
+ @pointermove=${this.handlePointerMove}
93
+ @pointerup=${this.handlePointerUp}
94
+ @pointerleave=${this.handlePointerLeave}
95
+ style=${interval ? `height: ${interval * length + 200}px;` : 'height: 100%;'}
96
+ >
97
+ ${cards.map(({ image, name }, index) => {
98
+ return html `
99
+ <div
100
+ class="card ${this.getClassForCard(index)} ${this.isActive(index) ? 'active' : ''}"
101
+ style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}
102
+ @click=${() => {
103
+ this.selectCard(index);
104
+ this.toggleActiveCard(index);
105
+ }}
106
+ >
107
+ <img src="${image}" @load=${(e) => this.adjustCardHeight(e, index)} />
108
+ </div>
109
+ `;
110
+ })}
111
+ ${cards.map(({ image, name }, index) => {
112
+ return html `
113
+ <div
114
+ style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}
115
+ @click=${() => this.selectCard(index)}
116
+ template-container
117
+ >
118
+ <slot name="template-${index}"></slot>
119
+ </div>
120
+ `;
121
+ })}
122
+ </div>
123
+ `;
124
+ }
125
+ updated(changes) {
126
+ if (changes.has('value')) {
127
+ if (this.value) {
128
+ this.selectedIndex = this.cards.findIndex(card => card.name == this.value);
129
+ }
130
+ else {
131
+ this.selectedIndex = -1;
132
+ }
133
+ }
134
+ }
135
+ firstUpdated() {
136
+ this.scrollToSelectedCard();
137
+ }
138
+ getClassForCard(index) {
139
+ return index === this.selectedIndex ? 'selected' : 'compressed';
140
+ }
141
+ isActive(index) {
142
+ return this.activeIndex === index;
143
+ }
144
+ handleWheel(event) {
145
+ event.preventDefault();
146
+ const delta = Math.sign(event.deltaY);
147
+ this.updateSelectedIndex(this.selectedIndex + delta);
148
+ }
149
+ handlePointerDown(event) {
150
+ event.preventDefault();
151
+ this.isDragging = true;
152
+ this.lastMouseY = event.clientY;
153
+ }
154
+ handlePointerMove(event) {
155
+ if (!this.isDragging) {
156
+ return;
157
+ }
158
+ event.preventDefault();
159
+ const deltaY = event.clientY - this.lastMouseY;
160
+ if (!this.lastMouseY) {
161
+ this.lastMouseY = event.clientY;
162
+ }
163
+ if (Math.abs(deltaY) > 30) {
164
+ this.lastMouseY = event.clientY;
165
+ const direction = deltaY > 0 ? -1 : 1;
166
+ this.updateSelectedIndex(this.selectedIndex + direction);
167
+ }
168
+ }
169
+ handlePointerUp(event) {
170
+ event.preventDefault();
171
+ this.isDragging = false;
172
+ }
173
+ handlePointerLeave(event) {
174
+ event.preventDefault();
175
+ this.isDragging = false;
176
+ }
177
+ toggleActiveCard(index) {
178
+ if (this.activeIndex === index) {
179
+ this.activeIndex = null;
180
+ }
181
+ else {
182
+ this.activeIndex = index;
183
+ }
184
+ }
185
+ updateSelectedIndex(newIndex) {
186
+ this.activeIndex = null;
187
+ this.selectedIndex = Math.max(-1, Math.min(newIndex, this.cards.length - 1));
188
+ this.scrollToSelectedCard();
189
+ }
190
+ scrollToSelectedCard() {
191
+ const cardHeight = 320;
192
+ const targetScrollTop = this.selectedIndex * cardHeight - (window.innerHeight / 2 - cardHeight / 2);
193
+ this.carouselContainer.scrollTo({ top: targetScrollTop, behavior: 'smooth' });
194
+ }
195
+ selectCard(index) {
196
+ this.selectedIndex = index;
197
+ this.notifySelection();
198
+ this.scrollToSelectedCard();
199
+ }
200
+ notifySelection() {
201
+ this.value = this.selectedIndex !== -1 ? this.cards[this.selectedIndex]?.name : undefined;
202
+ this.dispatchEvent(new CustomEvent('change', {
203
+ detail: this.value
204
+ }));
205
+ }
206
+ adjustCardHeight(e, index) {
207
+ const imgElement = e.target;
208
+ const aspectRatio = imgElement.naturalWidth / imgElement.naturalHeight;
209
+ const newHeight = imgElement.offsetWidth / aspectRatio;
210
+ imgElement.style.height = `${newHeight}px`;
211
+ }
212
+ };
213
+ __decorate([
214
+ property({ type: Array })
215
+ ], OxSelectFloor.prototype, "cards", void 0);
216
+ __decorate([
217
+ property({ type: String })
218
+ ], OxSelectFloor.prototype, "value", void 0);
219
+ __decorate([
220
+ property({ type: Number })
221
+ ], OxSelectFloor.prototype, "bottomLimit", void 0);
222
+ __decorate([
223
+ property({ type: Number })
224
+ ], OxSelectFloor.prototype, "interval", void 0);
225
+ __decorate([
226
+ state()
227
+ ], OxSelectFloor.prototype, "selectedIndex", void 0);
228
+ __decorate([
229
+ state()
230
+ ], OxSelectFloor.prototype, "activeIndex", void 0);
231
+ __decorate([
232
+ query('.carousel-container')
233
+ ], OxSelectFloor.prototype, "carouselContainer", void 0);
234
+ OxSelectFloor = __decorate([
235
+ customElement('ox-select-floor')
236
+ ], OxSelectFloor);
237
+ export { OxSelectFloor };
238
+ //# sourceMappingURL=ox-select-floor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-select-floor.js","sourceRoot":"","sources":["../../src/ox-select-floor.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { OxFormField } from './ox-form-field.js'\n\ntype Card = {\n name: string\n image: string\n}\n\n@customElement('ox-select-floor')\nexport class OxSelectFloor extends OxFormField {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n height: 100%;\n\n --ox-select-floor-rotate-x: 60deg;\n --ox-select-floor-rotate-x-active: 40deg;\n --ox-select-floor-perspective: 1200px;\n }\n\n .carousel-container {\n position: relative;\n width: 100%;\n overflow: hidden;\n user-select: none;\n }\n\n .card {\n position: absolute;\n bottom: 0;\n width: 100%;\n background-color: white;\n transition:\n transform 0.3s ease,\n opacity 0.3s ease,\n box-shadow 0.3s ease,\n border 0.3s ease;\n transform-origin: bottom;\n transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x));\n opacity: 0.5;\n border: 2px solid transparent;\n border-radius: 12px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n }\n\n .card img {\n width: 100%;\n height: auto;\n display: block;\n pointer-events: none;\n border-radius: 12px;\n }\n\n .selected {\n opacity: 0.8;\n z-index: 1;\n border: 4px solid #3b82f6;\n box-shadow: 0 8px 16px rgba(59, 130, 246, 0.4);\n }\n\n .selected.active {\n opacity: 1;\n z-index: 2;\n transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x-active));\n box-shadow: 0 12px 24px rgba(59, 130, 246, 0.4);\n }\n\n [template-container] {\n position: absolute;\n right: 10px;\n z-index: 1;\n }\n `\n ]\n\n @property({ type: Array }) cards: Card[] = []\n @property({ type: String }) value?: string\n @property({ type: Number }) bottomLimit = 70\n @property({ type: Number }) interval = 0\n\n @state() private selectedIndex = -1\n @state() private activeIndex: number | null = null\n @query('.carousel-container') private carouselContainer!: HTMLDivElement\n\n private isDragging = false\n private lastMouseY = 0\n\n render() {\n const length = this.cards.length\n const cards = this.cards\n const interval = this.interval\n\n return html`\n <div\n class=\"carousel-container\"\n @wheel=${interval ? () => {} : this.handleWheel}\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointerleave=${this.handlePointerLeave}\n style=${interval ? `height: ${interval * length + 200}px;` : 'height: 100%;'}\n >\n ${cards.map(({ image, name }, index) => {\n return html`\n <div\n class=\"card ${this.getClassForCard(index)} ${this.isActive(index) ? 'active' : ''}\"\n style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}\n @click=${() => {\n this.selectCard(index)\n this.toggleActiveCard(index)\n }}\n >\n <img src=\"${image}\" @load=${(e: Event) => this.adjustCardHeight(e, index)} />\n </div>\n `\n })}\n ${cards.map(({ image, name }, index) => {\n return html`\n <div\n style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}\n @click=${() => this.selectCard(index)}\n template-container\n >\n <slot name=\"template-${index}\"></slot>\n </div>\n `\n })}\n </div>\n `\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('value')) {\n if (this.value) {\n this.selectedIndex = this.cards.findIndex(card => card.name == this.value)\n } else {\n this.selectedIndex = -1\n }\n }\n }\n\n firstUpdated() {\n this.scrollToSelectedCard()\n }\n\n getClassForCard(index: number) {\n return index === this.selectedIndex ? 'selected' : 'compressed'\n }\n\n isActive(index: number): boolean {\n return this.activeIndex === index\n }\n\n handleWheel(event: WheelEvent) {\n event.preventDefault()\n const delta = Math.sign(event.deltaY)\n this.updateSelectedIndex(this.selectedIndex + delta)\n }\n\n handlePointerDown(event: PointerEvent) {\n event.preventDefault()\n\n this.isDragging = true\n this.lastMouseY = event.clientY\n }\n\n handlePointerMove(event: PointerEvent) {\n if (!this.isDragging) {\n return\n }\n\n event.preventDefault()\n\n const deltaY = event.clientY - this.lastMouseY\n\n if (!this.lastMouseY) {\n this.lastMouseY = event.clientY\n }\n\n if (Math.abs(deltaY) > 30) {\n this.lastMouseY = event.clientY\n const direction = deltaY > 0 ? -1 : 1\n this.updateSelectedIndex(this.selectedIndex + direction)\n }\n }\n\n handlePointerUp(event: PointerEvent) {\n event.preventDefault()\n this.isDragging = false\n }\n\n handlePointerLeave(event: PointerEvent) {\n event.preventDefault()\n\n this.isDragging = false\n }\n\n private toggleActiveCard(index: number) {\n if (this.activeIndex === index) {\n this.activeIndex = null\n } else {\n this.activeIndex = index\n }\n }\n\n private updateSelectedIndex(newIndex: number) {\n this.activeIndex = null\n\n this.selectedIndex = Math.max(-1, Math.min(newIndex, this.cards.length - 1))\n this.scrollToSelectedCard()\n }\n\n private scrollToSelectedCard() {\n const cardHeight = 320\n const targetScrollTop = this.selectedIndex * cardHeight - (window.innerHeight / 2 - cardHeight / 2)\n\n this.carouselContainer.scrollTo({ top: targetScrollTop, behavior: 'smooth' })\n }\n\n private selectCard(index: number) {\n this.selectedIndex = index\n this.notifySelection()\n this.scrollToSelectedCard()\n }\n\n private notifySelection() {\n this.value = this.selectedIndex !== -1 ? this.cards[this.selectedIndex]?.name : undefined\n\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: this.value\n })\n )\n }\n\n private adjustCardHeight(e: Event, index: number) {\n const imgElement = e.target as HTMLImageElement\n const aspectRatio = imgElement.naturalWidth / imgElement.naturalHeight\n const newHeight = imgElement.offsetWidth / aspectRatio\n imgElement.style.height = `${newHeight}px`\n }\n}\n"]}