@onetype/framework 2.0.53 → 2.0.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/addons/float/popup/css/popup.css +2 -2
  2. package/addons/render/directives/front/functions/process.js +3 -1
  3. package/addons/render/directives/front/items/self/160-slot.js +9 -1
  4. package/addons/render/editor/addon.js +13 -0
  5. package/addons/render/editor/functions/block/add.js +57 -0
  6. package/addons/render/editor/functions/block/delete.js +32 -0
  7. package/addons/render/editor/functions/block/find.js +30 -0
  8. package/addons/render/editor/functions/render/block.js +114 -0
  9. package/addons/render/editor/functions/render/blocks.js +31 -0
  10. package/addons/render/editor/items/elements/editor.js +69 -0
  11. package/addons/render/editor/items/self/paragraph.js +21 -0
  12. package/addons/render/editor/styles/editor.css +252 -0
  13. package/addons/render/elements/front/functions/types/colors/badge.js +19 -0
  14. package/addons/render/elements/front/functions/types/colors/status.js +24 -0
  15. package/addons/render/elements/front/functions/types/escape.js +8 -0
  16. package/addons/render/elements/front/functions/types/format/currency.js +16 -0
  17. package/addons/render/elements/front/functions/types/format/date.js +16 -0
  18. package/addons/render/elements/front/functions/types/format/number.js +24 -0
  19. package/addons/render/elements/front/functions/types/format/timeago.js +43 -0
  20. package/addons/render/elements/front/functions/types/render/avatar.js +10 -0
  21. package/addons/render/elements/front/functions/types/render/badge.js +17 -0
  22. package/addons/render/elements/front/functions/types/render/boolean.js +8 -0
  23. package/addons/render/elements/front/functions/types/render/chip.js +6 -0
  24. package/addons/render/elements/front/functions/types/render/currency.js +7 -0
  25. package/addons/render/elements/front/functions/types/render/date.js +6 -0
  26. package/addons/render/elements/front/functions/types/render/description.js +12 -0
  27. package/addons/render/elements/front/functions/types/render/group.js +11 -0
  28. package/addons/render/elements/front/functions/types/render/icon.js +8 -0
  29. package/addons/render/elements/front/functions/types/render/image.js +9 -0
  30. package/addons/render/elements/front/functions/types/render/link.js +8 -0
  31. package/addons/render/elements/front/functions/types/render/media.js +16 -0
  32. package/addons/render/elements/front/functions/types/render/metric.js +13 -0
  33. package/addons/render/elements/front/functions/types/render/number.js +6 -0
  34. package/addons/render/elements/front/functions/types/render/progress.js +13 -0
  35. package/addons/render/elements/front/functions/types/render/status.js +12 -0
  36. package/addons/render/elements/front/functions/types/render/tag.js +6 -0
  37. package/addons/render/elements/front/functions/types/render/tags.js +11 -0
  38. package/addons/render/elements/front/functions/types/render/text.js +8 -0
  39. package/addons/render/elements/front/functions/types/render/timeago.js +6 -0
  40. package/addons/render/elements/front/functions/types/render.js +16 -0
  41. package/addons/render/elements/front/items/directives/element.js +8 -3
  42. package/addons/render/elements/front/items/self/cards/info/info.css +499 -0
  43. package/addons/render/elements/front/items/self/cards/info/info.js +224 -0
  44. package/addons/render/elements/front/items/self/cards/item/item.css +614 -0
  45. package/addons/render/elements/front/items/self/cards/item/item.js +200 -0
  46. package/addons/render/elements/front/items/self/cards/pricing/pricing.css +318 -46
  47. package/addons/render/elements/front/items/self/cards/pricing/pricing.js +81 -30
  48. package/addons/render/elements/front/items/self/cards/profile/profile.css +446 -0
  49. package/addons/render/elements/front/items/self/cards/profile/profile.js +186 -0
  50. package/addons/render/elements/front/items/self/cards/share/share.css +445 -0
  51. package/addons/render/elements/front/items/self/cards/share/share.js +316 -0
  52. package/addons/render/elements/front/items/self/cards/stat/stat.css +356 -0
  53. package/addons/render/elements/front/items/self/cards/stat/stat.js +146 -0
  54. package/addons/render/elements/front/items/self/charts/bar/bar.css +263 -0
  55. package/addons/render/elements/front/items/self/charts/bar/bar.js +156 -0
  56. package/addons/render/elements/front/items/self/charts/donut/donut.css +222 -0
  57. package/addons/render/elements/front/items/self/charts/donut/donut.js +164 -0
  58. package/addons/render/elements/front/items/self/charts/line/line.css +229 -0
  59. package/addons/render/elements/front/items/self/charts/line/line.js +249 -0
  60. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.css +102 -0
  61. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.js +164 -0
  62. package/addons/render/elements/front/items/self/core/builder/builder.css +71 -116
  63. package/addons/render/elements/front/items/self/core/builder/builder.js +212 -127
  64. package/addons/render/elements/front/items/self/core/repeater/repeater.css +338 -71
  65. package/addons/render/elements/front/items/self/core/repeater/repeater.js +191 -44
  66. package/addons/render/elements/front/items/self/data/filters/filters.css +541 -0
  67. package/addons/render/elements/front/items/self/data/filters/filters.js +504 -0
  68. package/addons/render/elements/front/items/self/data/table/table.css +588 -0
  69. package/addons/render/elements/front/items/self/data/table/table.js +589 -0
  70. package/addons/render/elements/front/items/self/form/button/button.css +430 -103
  71. package/addons/render/elements/front/items/self/form/button/button.js +109 -101
  72. package/addons/render/elements/front/items/self/form/checkbox/checkbox.css +356 -39
  73. package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +109 -75
  74. package/addons/render/elements/front/items/self/form/color/color.css +255 -61
  75. package/addons/render/elements/front/items/self/form/color/color.js +135 -41
  76. package/addons/render/elements/front/items/self/form/date/date.css +289 -38
  77. package/addons/render/elements/front/items/self/form/date/date.js +108 -24
  78. package/addons/render/elements/front/items/self/form/editor/editor.css +447 -0
  79. package/addons/render/elements/front/items/self/form/editor/editor.js +794 -0
  80. package/addons/render/elements/front/items/self/form/field/field.css +160 -29
  81. package/addons/render/elements/front/items/self/form/field/field.js +36 -16
  82. package/addons/render/elements/front/items/self/form/input/input.css +272 -32
  83. package/addons/render/elements/front/items/self/form/input/input.js +324 -124
  84. package/addons/render/elements/front/items/self/form/radio/radio.css +310 -45
  85. package/addons/render/elements/front/items/self/form/radio/radio.js +99 -80
  86. package/addons/render/elements/front/items/self/form/rating/rating.css +234 -57
  87. package/addons/render/elements/front/items/self/form/rating/rating.js +216 -86
  88. package/addons/render/elements/front/items/self/form/section/section.css +247 -32
  89. package/addons/render/elements/front/items/self/form/section/section.js +53 -16
  90. package/addons/render/elements/front/items/self/form/select/select.css +362 -64
  91. package/addons/render/elements/front/items/self/form/select/select.js +156 -30
  92. package/addons/render/elements/front/items/self/form/slider/slider.css +331 -123
  93. package/addons/render/elements/front/items/self/form/slider/slider.js +124 -26
  94. package/addons/render/elements/front/items/self/form/tags/tags.css +328 -53
  95. package/addons/render/elements/front/items/self/form/tags/tags.js +155 -28
  96. package/addons/render/elements/front/items/self/form/textarea/textarea.css +128 -27
  97. package/addons/render/elements/front/items/self/form/textarea/textarea.js +172 -113
  98. package/addons/render/elements/front/items/self/form/toggle/toggle.css +239 -39
  99. package/addons/render/elements/front/items/self/form/toggle/toggle.js +32 -17
  100. package/addons/render/elements/front/items/self/form/transfer/transfer.css +377 -0
  101. package/addons/render/elements/front/items/self/form/transfer/transfer.js +453 -0
  102. package/addons/render/elements/front/items/self/form/upload/upload.css +408 -0
  103. package/addons/render/elements/front/items/self/form/upload/upload.js +469 -0
  104. package/addons/render/elements/front/items/self/global/accordion/accordion.css +377 -0
  105. package/addons/render/elements/front/items/self/global/accordion/accordion.js +135 -0
  106. package/addons/render/elements/front/items/self/global/code/code.css +207 -44
  107. package/addons/render/elements/front/items/self/global/code/code.js +327 -19
  108. package/addons/render/elements/front/items/self/global/gallery/gallery.css +521 -0
  109. package/addons/render/elements/front/items/self/global/gallery/gallery.js +291 -0
  110. package/addons/render/elements/front/items/self/global/heading/heading.css +151 -49
  111. package/addons/render/elements/front/items/self/global/heading/heading.js +30 -15
  112. package/addons/render/elements/front/items/self/global/markdown/markdown.css +284 -135
  113. package/addons/render/elements/front/items/self/global/markdown/markdown.js +35 -5
  114. package/addons/render/elements/front/items/self/global/menu/menu.css +311 -56
  115. package/addons/render/elements/front/items/self/global/menu/menu.js +95 -47
  116. package/addons/render/elements/front/items/self/global/notice/notice.css +263 -23
  117. package/addons/render/elements/front/items/self/global/notice/notice.js +51 -11
  118. package/addons/render/elements/front/items/self/global/parameters/parameters.css +276 -33
  119. package/addons/render/elements/front/items/self/global/parameters/parameters.js +86 -16
  120. package/addons/render/elements/front/items/self/global/tags/tags.css +215 -29
  121. package/addons/render/elements/front/items/self/global/tags/tags.js +91 -17
  122. package/addons/render/elements/front/items/self/navigation/dock/dock.css +221 -0
  123. package/addons/render/elements/front/items/self/navigation/dock/dock.js +134 -0
  124. package/addons/render/elements/front/items/self/navigation/footer/footer.css +356 -0
  125. package/addons/render/elements/front/items/self/navigation/footer/footer.js +219 -0
  126. package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +736 -76
  127. package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +437 -29
  128. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +327 -196
  129. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +115 -62
  130. package/addons/render/elements/front/items/self/navigation/steps/steps.css +345 -0
  131. package/addons/render/elements/front/items/self/navigation/steps/steps.js +113 -0
  132. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +362 -33
  133. package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +62 -19
  134. package/addons/render/elements/front/items/self/status/code/code.css +83 -12
  135. package/addons/render/elements/front/items/self/status/code/code.js +15 -4
  136. package/addons/render/elements/front/items/self/status/empty/empty.css +95 -15
  137. package/addons/render/elements/front/items/self/status/empty/empty.js +17 -12
  138. package/addons/render/elements/front/items/self/status/error/error.css +99 -14
  139. package/addons/render/elements/front/items/self/status/error/error.js +21 -11
  140. package/addons/render/elements/front/items/self/status/loading/loading.css +85 -14
  141. package/addons/render/elements/front/items/self/status/loading/loading.js +5 -6
  142. package/addons/render/elements/front/styles/types.css +363 -0
  143. package/instructions.txt +28 -0
  144. package/lib/load.js +1 -0
  145. package/lib/styles/reset.css +89 -76
  146. package/package.json +1 -1
  147. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +0 -410
  148. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +0 -191
  149. package/addons/render/elements/front/items/self/global/faq/faq.css +0 -98
  150. package/addons/render/elements/front/items/self/global/faq/faq.js +0 -56
@@ -1,57 +1,234 @@
1
- /* Root */
2
-
3
- .e-13e502f0
4
- {
5
- display: flex;
6
- }
7
-
8
- /* Holder */
9
-
10
- .e-13e502f0 > .holder
11
- {
12
- display: inline-flex;
13
- align-items: center;
14
- gap: var(--ot-spacing-x);
15
- }
16
-
17
- /* Star */
18
-
19
- .e-13e502f0 > .holder > .star
20
- {
21
- color: var(--ot-bg-3);
22
- cursor: pointer;
23
- transition: color 0.15s ease, transform 0.15s ease;
24
- user-select: none;
25
- }
26
-
27
- .e-13e502f0 > .holder > .star:hover
28
- {
29
- transform: scale(1.1);
30
- }
31
-
32
- /* Readonly */
33
-
34
- .e-13e502f0 > .holder.readonly > .star
35
- {
36
- cursor: default;
37
- pointer-events: none;
38
- }
39
-
40
- /* Color variants */
41
-
42
- .e-13e502f0 > .holder.brand > .star.filled { color: var(--ot-brand); }
43
- .e-13e502f0 > .holder.blue > .star.filled { color: var(--ot-blue); }
44
- .e-13e502f0 > .holder.red > .star.filled { color: var(--ot-red); }
45
- .e-13e502f0 > .holder.orange > .star.filled { color: var(--ot-orange); }
46
- .e-13e502f0 > .holder.green > .star.filled { color: var(--ot-green); }
47
-
48
- /* Size variants */
49
-
50
- .e-13e502f0 > .holder.size-s { gap: 2px; }
51
- .e-13e502f0 > .holder.size-s > .star { font-size: 16px; }
52
-
53
- .e-13e502f0 > .holder.size-m { gap: var(--ot-spacing-x); }
54
- .e-13e502f0 > .holder.size-m > .star { font-size: 24px; }
55
-
56
- .e-13e502f0 > .holder.size-l { gap: var(--ot-spacing-s); }
57
- .e-13e502f0 > .holder.size-l > .star { font-size: 32px; }
1
+ /* Root */
2
+
3
+ .e-13e502f0
4
+ {
5
+ display: inline-flex;
6
+ }
7
+
8
+ /* Holder */
9
+
10
+ .e-13e502f0 > .holder
11
+ {
12
+ display: inline-flex;
13
+ flex-direction: column;
14
+ gap: var(--ot-spacing-s);
15
+ font-family: var(--ot-font-primary);
16
+ }
17
+
18
+ /* Info (label + description) */
19
+
20
+ .e-13e502f0 > .holder > .info
21
+ {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: 2px;
25
+ }
26
+
27
+ .e-13e502f0 > .holder > .info > .label
28
+ {
29
+ font-size: var(--ot-size-m);
30
+ font-weight: 500;
31
+ color: var(--ot-text-1);
32
+ line-height: 1.3;
33
+ }
34
+
35
+ .e-13e502f0 > .holder > .info > .description
36
+ {
37
+ font-size: var(--ot-size-s);
38
+ color: var(--ot-text-3);
39
+ line-height: 1.4;
40
+ }
41
+
42
+ /* Row (stars + meta) */
43
+
44
+ .e-13e502f0 > .holder > .row
45
+ {
46
+ display: inline-flex;
47
+ align-items: center;
48
+ gap: var(--ot-spacing-s);
49
+ }
50
+
51
+ /* Stars container */
52
+
53
+ .e-13e502f0 > .holder > .row > .stars
54
+ {
55
+ display: inline-flex;
56
+ align-items: center;
57
+ gap: var(--ot-spacing-x);
58
+ }
59
+
60
+ /* Single star */
61
+
62
+ .e-13e502f0 .star
63
+ {
64
+ position: relative;
65
+ display: inline-flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ padding: 0;
69
+ border: none;
70
+ background: transparent;
71
+ cursor: pointer;
72
+ outline: none;
73
+ color: var(--ot-bg-3-border);
74
+ transition: transform 0.2s cubic-bezier(0.22, 1, 0.36, 1), color 0.2s cubic-bezier(0.22, 1, 0.36, 1);
75
+ }
76
+
77
+ .e-13e502f0 .star:hover:not(:disabled)
78
+ {
79
+ transform: scale(1.15);
80
+ }
81
+
82
+ .e-13e502f0 .star:active:not(:disabled)
83
+ {
84
+ transform: scale(1);
85
+ transition-duration: 0.1s;
86
+ }
87
+
88
+ .e-13e502f0 .star:disabled
89
+ {
90
+ cursor: default;
91
+ }
92
+
93
+ .e-13e502f0 .star:focus-visible
94
+ {
95
+ outline: none;
96
+ }
97
+
98
+ .e-13e502f0 .star:focus-visible > .base
99
+ {
100
+ filter: drop-shadow(0 0 6px var(--ot-brand-opacity));
101
+ }
102
+
103
+ /* Base icon (outline) */
104
+
105
+ .e-13e502f0 .star > .base
106
+ {
107
+ position: relative;
108
+ z-index: 1;
109
+ color: var(--ot-bg-3-border);
110
+ font-variation-settings: 'FILL' 0;
111
+ }
112
+
113
+ /* Fill icon (overlay) */
114
+
115
+ .e-13e502f0 .star > .fill
116
+ {
117
+ position: absolute;
118
+ top: 50%;
119
+ left: 50%;
120
+ z-index: 2;
121
+ transform: translate(-50%, -50%);
122
+ width: 0;
123
+ overflow: hidden;
124
+ font-variation-settings: 'FILL' 1;
125
+ transition: width 0.25s cubic-bezier(0.22, 1, 0.36, 1);
126
+ pointer-events: none;
127
+ }
128
+
129
+ .e-13e502f0 .star.fill-50 > .fill
130
+ {
131
+ width: 50%;
132
+ left: 0;
133
+ transform: translate(0, -50%);
134
+ }
135
+
136
+ .e-13e502f0 .star.fill-100 > .fill
137
+ {
138
+ width: 100%;
139
+ left: 0;
140
+ transform: translate(0, -50%);
141
+ }
142
+
143
+ /* Half-click area (left half of star for 0.5 precision) */
144
+
145
+ .e-13e502f0 .star > .half
146
+ {
147
+ position: absolute;
148
+ top: 0;
149
+ left: 0;
150
+ z-index: 3;
151
+ width: 50%;
152
+ height: 100%;
153
+ cursor: pointer;
154
+ }
155
+
156
+ /* Readonly / disabled */
157
+
158
+ .e-13e502f0 > .holder.readonly .star,
159
+ .e-13e502f0 > .holder.disabled .star
160
+ {
161
+ cursor: default;
162
+ pointer-events: none;
163
+ }
164
+
165
+ .e-13e502f0 > .holder.readonly .star:hover,
166
+ .e-13e502f0 > .holder.disabled .star:hover
167
+ {
168
+ transform: none;
169
+ }
170
+
171
+ .e-13e502f0 > .holder.disabled
172
+ {
173
+ opacity: 0.5;
174
+ }
175
+
176
+ /* Meta (value + count) */
177
+
178
+ .e-13e502f0 > .holder > .row > .meta
179
+ {
180
+ display: inline-flex;
181
+ align-items: baseline;
182
+ gap: var(--ot-spacing-x);
183
+ margin-left: var(--ot-spacing-x);
184
+ }
185
+
186
+ .e-13e502f0 > .holder > .row > .meta > .value
187
+ {
188
+ font-size: var(--ot-size-m);
189
+ font-weight: 600;
190
+ color: var(--ot-text-1);
191
+ font-variant-numeric: tabular-nums;
192
+ }
193
+
194
+ .e-13e502f0 > .holder > .row > .meta > .count
195
+ {
196
+ font-size: var(--ot-size-s);
197
+ color: var(--ot-text-3);
198
+ font-variant-numeric: tabular-nums;
199
+ }
200
+
201
+ /* ===== COLOR VARIANTS ===== */
202
+
203
+ .e-13e502f0 > .holder.brand .star > .fill { color: var(--ot-brand); }
204
+ .e-13e502f0 > .holder.brand .star:focus-visible > .base { filter: drop-shadow(0 0 6px var(--ot-brand-opacity)); }
205
+
206
+ .e-13e502f0 > .holder.blue .star > .fill { color: var(--ot-blue); }
207
+ .e-13e502f0 > .holder.blue .star:focus-visible > .base { filter: drop-shadow(0 0 6px var(--ot-blue-opacity)); }
208
+
209
+ .e-13e502f0 > .holder.red .star > .fill { color: var(--ot-red); }
210
+ .e-13e502f0 > .holder.red .star:focus-visible > .base { filter: drop-shadow(0 0 6px var(--ot-red-opacity)); }
211
+
212
+ .e-13e502f0 > .holder.orange .star > .fill { color: var(--ot-orange); }
213
+ .e-13e502f0 > .holder.orange .star:focus-visible > .base { filter: drop-shadow(0 0 6px var(--ot-orange-opacity)); }
214
+
215
+ .e-13e502f0 > .holder.green .star > .fill { color: var(--ot-green); }
216
+ .e-13e502f0 > .holder.green .star:focus-visible > .base { filter: drop-shadow(0 0 6px var(--ot-green-opacity)); }
217
+
218
+ /* ===== SIZE VARIANTS ===== */
219
+
220
+ .e-13e502f0 > .holder.size-s > .row > .stars { gap: 2px; }
221
+ .e-13e502f0 > .holder.size-s .star > .base,
222
+ .e-13e502f0 > .holder.size-s .star > .fill { font-size: 16px; }
223
+ .e-13e502f0 > .holder.size-s > .row > .meta > .value { font-size: var(--ot-size-s); }
224
+ .e-13e502f0 > .holder.size-s > .row > .meta > .count { font-size: 10.5px; }
225
+
226
+ .e-13e502f0 > .holder.size-m > .row > .stars { gap: var(--ot-spacing-x); }
227
+ .e-13e502f0 > .holder.size-m .star > .base,
228
+ .e-13e502f0 > .holder.size-m .star > .fill { font-size: 22px; }
229
+
230
+ .e-13e502f0 > .holder.size-l > .row > .stars { gap: var(--ot-spacing-s); }
231
+ .e-13e502f0 > .holder.size-l .star > .base,
232
+ .e-13e502f0 > .holder.size-l .star > .fill { font-size: 30px; }
233
+ .e-13e502f0 > .holder.size-l > .row > .meta > .value { font-size: 15px; }
234
+ .e-13e502f0 > .holder.size-l > .row > .meta > .count { font-size: var(--ot-size-m); }
@@ -1,86 +1,216 @@
1
- onetype.AddonReady('elements', (elements) =>
2
- {
3
- elements.ItemAdd({
4
- id: 'form-rating',
5
- icon: 'star',
6
- name: 'Rating',
7
- description: 'Star rating with interactive and readonly modes.',
8
- category: 'Form',
9
- author: 'OneType',
10
- config: {
11
- value: {
12
- type: 'number',
13
- value: 3
14
- },
15
- max: {
16
- type: 'number',
17
- value: 5
18
- },
19
- readonly: {
20
- type: 'boolean',
21
- value: false
22
- },
23
- variant: {
24
- type: 'array',
25
- value: ['brand', 'size-m'],
26
- options: ['brand', 'blue', 'red', 'orange', 'green', 'size-s', 'size-m', 'size-l']
27
- },
28
- _change: {
29
- type: 'function'
30
- }
31
- },
32
- render: function()
33
- {
34
- this.hover = null;
35
-
36
- this.stars = () =>
37
- {
38
- const result = [];
39
- for (let i = 0; i < this.max; i++)
40
- {
41
- result.push(i);
42
- }
43
- return result;
44
- };
45
-
46
- this.filled = (index) =>
47
- {
48
- return this.hover !== null ? index <= this.hover : index < this.value;
49
- };
50
-
51
- this.select = (index) =>
52
- {
53
- if (this.readonly) return;
54
- this.value = index + 1;
55
-
56
- if (this._change)
57
- {
58
- this._change({ value: this.value });
59
- }
60
- };
61
-
62
- this.enter = (index) =>
63
- {
64
- if (this.readonly) return;
65
- this.hover = index;
66
- };
67
-
68
- this.leave = () =>
69
- {
70
- if (this.readonly) return;
71
- this.hover = null;
72
- };
73
-
74
- return `
75
- <div :class="'holder ' + variant.join(' ') + (readonly ? ' readonly' : '')" ot-mouse-leave="leave">
76
- <i
77
- ot-for="index in stars()"
78
- :class="'star' + (filled(index) ? ' filled' : '')"
79
- ot-click="() => select(index)"
80
- ot-mouse-enter="() => enter(index)"
81
- >star</i>
82
- </div>
83
- `;
84
- }
85
- });
86
- });
1
+ onetype.AddonReady('elements', (elements) =>
2
+ {
3
+ elements.ItemAdd({
4
+ id: 'form-rating',
5
+ icon: 'star',
6
+ name: 'Rating',
7
+ description: 'Premium star rating with half-stars, custom icon, label and review count.',
8
+ category: 'Form',
9
+ author: 'OneType',
10
+ config: {
11
+ label: {
12
+ type: 'string'
13
+ },
14
+ description: {
15
+ type: 'string'
16
+ },
17
+ value: {
18
+ type: 'number',
19
+ value: 0
20
+ },
21
+ max: {
22
+ type: 'number',
23
+ value: 5
24
+ },
25
+ precision: {
26
+ type: 'number',
27
+ value: 1,
28
+ options: [1, 0.5]
29
+ },
30
+ icon: {
31
+ type: 'string',
32
+ value: 'star'
33
+ },
34
+ count: {
35
+ type: 'number'
36
+ },
37
+ showValue: {
38
+ type: 'boolean'
39
+ },
40
+ readonly: {
41
+ type: 'boolean'
42
+ },
43
+ disabled: {
44
+ type: 'boolean'
45
+ },
46
+ variant: {
47
+ type: 'array',
48
+ value: ['brand', 'size-m'],
49
+ options: ['brand', 'blue', 'red', 'orange', 'green', 'size-s', 'size-m', 'size-l']
50
+ },
51
+ _change: {
52
+ type: 'function'
53
+ }
54
+ },
55
+ render: function()
56
+ {
57
+ this.hover = null;
58
+ this.hasInfo = !!this.label || !!this.description;
59
+ this.hasMeta = this.showValue || this.count != null;
60
+ this.locked = this.readonly || this.disabled;
61
+
62
+ this.stars = () =>
63
+ {
64
+ const result = [];
65
+
66
+ for(let i = 0; i < this.max; i++)
67
+ {
68
+ result.push(i);
69
+ }
70
+
71
+ return result;
72
+ };
73
+
74
+ this.fillFor = (index) =>
75
+ {
76
+ const current = this.hover !== null ? this.hover : this.value;
77
+ const diff = current - index;
78
+
79
+ if(diff >= 1)
80
+ {
81
+ return 100;
82
+ }
83
+
84
+ if(diff >= 0.5 && this.precision === 0.5)
85
+ {
86
+ return 50;
87
+ }
88
+
89
+ if(diff > 0 && this.precision === 1)
90
+ {
91
+ return 100;
92
+ }
93
+
94
+ return 0;
95
+ };
96
+
97
+ this.computed = () =>
98
+ {
99
+ return this.stars().map(index =>
100
+ {
101
+ const fill = this.fillFor(index);
102
+
103
+ return {
104
+ index,
105
+ fill,
106
+ active: fill > 0
107
+ };
108
+ });
109
+ };
110
+
111
+ this.select = (event, index, half) =>
112
+ {
113
+ if(this.locked)
114
+ {
115
+ return;
116
+ }
117
+
118
+ let next;
119
+
120
+ if(this.precision === 0.5 && half)
121
+ {
122
+ next = index + 0.5;
123
+ }
124
+ else
125
+ {
126
+ next = index + 1;
127
+ }
128
+
129
+ if(this.value === next)
130
+ {
131
+ this.value = 0;
132
+ }
133
+ else
134
+ {
135
+ this.value = next;
136
+ }
137
+
138
+ if(this._change)
139
+ {
140
+ this._change({ event, value: this.value });
141
+ }
142
+ };
143
+
144
+ this.enter = (index, half) =>
145
+ {
146
+ if(this.locked)
147
+ {
148
+ return;
149
+ }
150
+
151
+ if(this.precision === 0.5 && half)
152
+ {
153
+ this.hover = index + 0.5;
154
+ }
155
+ else
156
+ {
157
+ this.hover = index + 1;
158
+ }
159
+ };
160
+
161
+ this.leave = () =>
162
+ {
163
+ if(this.locked)
164
+ {
165
+ return;
166
+ }
167
+
168
+ this.hover = null;
169
+ };
170
+
171
+ this.formatValue = (value) =>
172
+ {
173
+ if(value == null)
174
+ {
175
+ return '';
176
+ }
177
+
178
+ return Number(value).toFixed(this.precision === 0.5 ? 1 : 0);
179
+ };
180
+
181
+ return /* html */ `
182
+ <div :class="'holder ' + variant.join(' ') + (readonly ? ' readonly' : '') + (disabled ? ' disabled' : '')">
183
+ <div ot-if="hasInfo" class="info">
184
+ <span ot-if="label" class="label">{{ label }}</span>
185
+ <span ot-if="description" class="description">{{ description }}</span>
186
+ </div>
187
+ <div class="row">
188
+ <div class="stars" ot-mouse-leave="leave">
189
+ <button
190
+ ot-for="star in computed()"
191
+ type="button"
192
+ :class="'star fill-' + star.fill + (star.active ? ' active' : '')"
193
+ :disabled="locked"
194
+ ot-click="(event) => select(event, star.index, false)"
195
+ ot-mouse-enter="() => enter(star.index, false)"
196
+ >
197
+ <i class="base">{{ icon }}</i>
198
+ <i class="fill">{{ icon }}</i>
199
+ <span
200
+ ot-if="precision === 0.5"
201
+ class="half"
202
+ ot-click.stop="(event) => select(event, star.index, true)"
203
+ ot-mouse-enter="() => enter(star.index, true)"
204
+ ></span>
205
+ </button>
206
+ </div>
207
+ <div ot-if="hasMeta" class="meta">
208
+ <span ot-if="showValue" class="value">{{ formatValue(value) }}</span>
209
+ <span ot-if="count != null" class="count">({{ count }})</span>
210
+ </div>
211
+ </div>
212
+ </div>
213
+ `;
214
+ }
215
+ });
216
+ });