godown 3.0.0-canary.1 → 3.0.0-canary.11

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 (323) hide show
  1. package/README.md +38 -9
  2. package/components/alert.d.ts +6 -3
  3. package/components/alert.d.ts.map +1 -1
  4. package/components/alert.js +22 -14
  5. package/components/alert.js.map +1 -1
  6. package/components/avatar.d.ts +7 -2
  7. package/components/avatar.d.ts.map +1 -1
  8. package/components/avatar.js +13 -6
  9. package/components/avatar.js.map +1 -1
  10. package/components/breath.d.ts +4 -2
  11. package/components/breath.d.ts.map +1 -1
  12. package/components/breath.js +8 -6
  13. package/components/breath.js.map +1 -1
  14. package/components/button.d.ts +20 -11
  15. package/components/button.d.ts.map +1 -1
  16. package/components/button.js +23 -20
  17. package/components/button.js.map +1 -1
  18. package/components/card.d.ts +2 -2
  19. package/components/card.d.ts.map +1 -1
  20. package/components/card.js +8 -13
  21. package/components/card.js.map +1 -1
  22. package/components/carousel.d.ts +8 -5
  23. package/components/carousel.d.ts.map +1 -1
  24. package/components/carousel.js +18 -11
  25. package/components/carousel.js.map +1 -1
  26. package/components/details.d.ts +7 -3
  27. package/components/details.d.ts.map +1 -1
  28. package/components/details.js +7 -3
  29. package/components/details.js.map +1 -1
  30. package/components/dialog.d.ts +9 -5
  31. package/components/dialog.d.ts.map +1 -1
  32. package/components/dialog.js +20 -14
  33. package/components/dialog.js.map +1 -1
  34. package/components/divider.d.ts +3 -4
  35. package/components/divider.d.ts.map +1 -1
  36. package/components/divider.js +6 -7
  37. package/components/divider.js.map +1 -1
  38. package/components/dragbox.d.ts +9 -8
  39. package/components/dragbox.d.ts.map +1 -1
  40. package/components/dragbox.js +3 -2
  41. package/components/dragbox.js.map +1 -1
  42. package/components/flex.d.ts +3 -1
  43. package/components/flex.d.ts.map +1 -1
  44. package/components/flex.js +13 -4
  45. package/components/flex.js.map +1 -1
  46. package/components/form.d.ts +2 -3
  47. package/components/form.d.ts.map +1 -1
  48. package/components/form.js +0 -2
  49. package/components/form.js.map +1 -1
  50. package/components/grid.d.ts +9 -3
  51. package/components/grid.d.ts.map +1 -1
  52. package/components/grid.js +6 -4
  53. package/components/grid.js.map +1 -1
  54. package/components/input.d.ts +4 -4
  55. package/components/input.d.ts.map +1 -1
  56. package/components/input.js +5 -7
  57. package/components/input.js.map +1 -1
  58. package/components/layout.d.ts +4 -6
  59. package/components/layout.d.ts.map +1 -1
  60. package/components/layout.js +23 -12
  61. package/components/layout.js.map +1 -1
  62. package/components/link.d.ts +3 -1
  63. package/components/link.d.ts.map +1 -1
  64. package/components/link.js +3 -1
  65. package/components/link.js.map +1 -1
  66. package/components/progress.d.ts +4 -12
  67. package/components/progress.d.ts.map +1 -1
  68. package/components/progress.js +9 -17
  69. package/components/progress.js.map +1 -1
  70. package/components/range.d.ts +45 -18
  71. package/components/range.d.ts.map +1 -1
  72. package/components/range.js +133 -62
  73. package/components/range.js.map +1 -1
  74. package/components/rotate.d.ts +3 -2
  75. package/components/rotate.d.ts.map +1 -1
  76. package/components/rotate.js +1 -1
  77. package/components/rotate.js.map +1 -1
  78. package/components/router.d.ts +15 -17
  79. package/components/router.d.ts.map +1 -1
  80. package/components/router.js +10 -10
  81. package/components/router.js.map +1 -1
  82. package/components/select.d.ts +6 -9
  83. package/components/select.d.ts.map +1 -1
  84. package/components/select.js +48 -43
  85. package/components/select.js.map +1 -1
  86. package/components/skeleton.d.ts +2 -1
  87. package/components/skeleton.d.ts.map +1 -1
  88. package/components/skeleton.js +5 -5
  89. package/components/skeleton.js.map +1 -1
  90. package/components/split.d.ts +20 -2
  91. package/components/split.d.ts.map +1 -1
  92. package/components/split.js +54 -20
  93. package/components/split.js.map +1 -1
  94. package/components/switch.d.ts +6 -5
  95. package/components/switch.d.ts.map +1 -1
  96. package/components/switch.js +7 -6
  97. package/components/switch.js.map +1 -1
  98. package/components/text.d.ts +2 -1
  99. package/components/text.d.ts.map +1 -1
  100. package/components/text.js +5 -6
  101. package/components/text.js.map +1 -1
  102. package/components/time.d.ts +6 -22
  103. package/components/time.d.ts.map +1 -1
  104. package/components/time.js +7 -67
  105. package/components/time.js.map +1 -1
  106. package/components/tooltip.d.ts +13 -2
  107. package/components/tooltip.d.ts.map +1 -1
  108. package/components/tooltip.js +24 -5
  109. package/components/tooltip.js.map +1 -1
  110. package/components/typewriter.d.ts +4 -4
  111. package/components/typewriter.d.ts.map +1 -1
  112. package/components/typewriter.js +4 -5
  113. package/components/typewriter.js.map +1 -1
  114. package/core/global-style.d.ts.map +1 -1
  115. package/core/global-style.js +9 -2
  116. package/core/global-style.js.map +1 -1
  117. package/core/super-anchor.d.ts +2 -1
  118. package/core/super-anchor.d.ts.map +1 -1
  119. package/core/super-anchor.js +4 -3
  120. package/core/super-anchor.js.map +1 -1
  121. package/core/super-input.d.ts +5 -5
  122. package/core/super-input.d.ts.map +1 -1
  123. package/core/super-input.js +3 -6
  124. package/core/super-input.js.map +1 -1
  125. package/core/super-openable.d.ts.map +1 -1
  126. package/core/super-openable.js +1 -1
  127. package/core/super-openable.js.map +1 -1
  128. package/custom-elements.json +1 -1
  129. package/dev/components/alert.d.ts +6 -3
  130. package/dev/components/alert.d.ts.map +1 -1
  131. package/dev/components/alert.js +38 -25
  132. package/dev/components/alert.js.map +1 -1
  133. package/dev/components/avatar.d.ts +7 -2
  134. package/dev/components/avatar.d.ts.map +1 -1
  135. package/dev/components/avatar.js +28 -13
  136. package/dev/components/avatar.js.map +1 -1
  137. package/dev/components/breath.d.ts +4 -2
  138. package/dev/components/breath.d.ts.map +1 -1
  139. package/dev/components/breath.js +20 -6
  140. package/dev/components/breath.js.map +1 -1
  141. package/dev/components/button.d.ts +20 -11
  142. package/dev/components/button.d.ts.map +1 -1
  143. package/dev/components/button.js +34 -25
  144. package/dev/components/button.js.map +1 -1
  145. package/dev/components/card.d.ts +2 -2
  146. package/dev/components/card.d.ts.map +1 -1
  147. package/dev/components/card.js +25 -30
  148. package/dev/components/card.js.map +1 -1
  149. package/dev/components/carousel.d.ts +8 -5
  150. package/dev/components/carousel.d.ts.map +1 -1
  151. package/dev/components/carousel.js +35 -20
  152. package/dev/components/carousel.js.map +1 -1
  153. package/dev/components/details.d.ts +7 -3
  154. package/dev/components/details.d.ts.map +1 -1
  155. package/dev/components/details.js +12 -4
  156. package/dev/components/details.js.map +1 -1
  157. package/dev/components/dialog.d.ts +9 -5
  158. package/dev/components/dialog.d.ts.map +1 -1
  159. package/dev/components/dialog.js +30 -24
  160. package/dev/components/dialog.js.map +1 -1
  161. package/dev/components/divider.d.ts +3 -4
  162. package/dev/components/divider.d.ts.map +1 -1
  163. package/dev/components/divider.js +20 -8
  164. package/dev/components/divider.js.map +1 -1
  165. package/dev/components/dragbox.d.ts +9 -8
  166. package/dev/components/dragbox.d.ts.map +1 -1
  167. package/dev/components/dragbox.js +8 -1
  168. package/dev/components/dragbox.js.map +1 -1
  169. package/dev/components/flex.d.ts +3 -1
  170. package/dev/components/flex.d.ts.map +1 -1
  171. package/dev/components/flex.js +24 -4
  172. package/dev/components/flex.js.map +1 -1
  173. package/dev/components/form.d.ts +2 -3
  174. package/dev/components/form.d.ts.map +1 -1
  175. package/dev/components/form.js +0 -2
  176. package/dev/components/form.js.map +1 -1
  177. package/dev/components/grid.d.ts +9 -3
  178. package/dev/components/grid.d.ts.map +1 -1
  179. package/dev/components/grid.js +17 -4
  180. package/dev/components/grid.js.map +1 -1
  181. package/dev/components/input.d.ts +4 -4
  182. package/dev/components/input.d.ts.map +1 -1
  183. package/dev/components/input.js +3 -21
  184. package/dev/components/input.js.map +1 -1
  185. package/dev/components/layout.d.ts +4 -6
  186. package/dev/components/layout.d.ts.map +1 -1
  187. package/dev/components/layout.js +33 -13
  188. package/dev/components/layout.js.map +1 -1
  189. package/dev/components/link.d.ts +3 -1
  190. package/dev/components/link.d.ts.map +1 -1
  191. package/dev/components/link.js +3 -1
  192. package/dev/components/link.js.map +1 -1
  193. package/dev/components/progress.d.ts +4 -12
  194. package/dev/components/progress.d.ts.map +1 -1
  195. package/dev/components/progress.js +14 -18
  196. package/dev/components/progress.js.map +1 -1
  197. package/dev/components/range.d.ts +45 -18
  198. package/dev/components/range.d.ts.map +1 -1
  199. package/dev/components/range.js +164 -109
  200. package/dev/components/range.js.map +1 -1
  201. package/dev/components/rotate.d.ts +3 -2
  202. package/dev/components/rotate.d.ts.map +1 -1
  203. package/dev/components/rotate.js +1 -1
  204. package/dev/components/rotate.js.map +1 -1
  205. package/dev/components/router.d.ts +15 -17
  206. package/dev/components/router.d.ts.map +1 -1
  207. package/dev/components/router.js +10 -10
  208. package/dev/components/router.js.map +1 -1
  209. package/dev/components/select.d.ts +6 -9
  210. package/dev/components/select.d.ts.map +1 -1
  211. package/dev/components/select.js +58 -45
  212. package/dev/components/select.js.map +1 -1
  213. package/dev/components/skeleton.d.ts +2 -1
  214. package/dev/components/skeleton.d.ts.map +1 -1
  215. package/dev/components/skeleton.js +6 -6
  216. package/dev/components/skeleton.js.map +1 -1
  217. package/dev/components/split.d.ts +20 -2
  218. package/dev/components/split.d.ts.map +1 -1
  219. package/dev/components/split.js +69 -32
  220. package/dev/components/split.js.map +1 -1
  221. package/dev/components/switch.d.ts +6 -5
  222. package/dev/components/switch.d.ts.map +1 -1
  223. package/dev/components/switch.js +23 -20
  224. package/dev/components/switch.js.map +1 -1
  225. package/dev/components/text.d.ts +2 -1
  226. package/dev/components/text.d.ts.map +1 -1
  227. package/dev/components/text.js +7 -7
  228. package/dev/components/text.js.map +1 -1
  229. package/dev/components/time.d.ts +6 -22
  230. package/dev/components/time.d.ts.map +1 -1
  231. package/dev/components/time.js +9 -67
  232. package/dev/components/time.js.map +1 -1
  233. package/dev/components/tooltip.d.ts +13 -2
  234. package/dev/components/tooltip.d.ts.map +1 -1
  235. package/dev/components/tooltip.js +55 -20
  236. package/dev/components/tooltip.js.map +1 -1
  237. package/dev/components/typewriter.d.ts +4 -4
  238. package/dev/components/typewriter.d.ts.map +1 -1
  239. package/dev/components/typewriter.js +11 -5
  240. package/dev/components/typewriter.js.map +1 -1
  241. package/dev/core/global-style.d.ts.map +1 -1
  242. package/dev/core/global-style.js +18 -10
  243. package/dev/core/global-style.js.map +1 -1
  244. package/dev/core/super-anchor.d.ts +2 -1
  245. package/dev/core/super-anchor.d.ts.map +1 -1
  246. package/dev/core/super-anchor.js +8 -5
  247. package/dev/core/super-anchor.js.map +1 -1
  248. package/dev/core/super-input.d.ts +5 -5
  249. package/dev/core/super-input.d.ts.map +1 -1
  250. package/dev/core/super-input.js +21 -20
  251. package/dev/core/super-input.js.map +1 -1
  252. package/dev/core/super-openable.d.ts.map +1 -1
  253. package/dev/core/super-openable.js +1 -1
  254. package/dev/core/super-openable.js.map +1 -1
  255. package/dev/range.d.ts +1 -1
  256. package/dev/range.d.ts.map +1 -1
  257. package/index.js +13 -13
  258. package/package.json +11 -8
  259. package/range.d.ts +1 -1
  260. package/range.d.ts.map +1 -1
  261. package/src/alert.ts +11 -0
  262. package/src/avatar.ts +11 -0
  263. package/src/breath.ts +13 -0
  264. package/src/button.ts +11 -0
  265. package/src/card.ts +11 -0
  266. package/src/carousel.ts +11 -0
  267. package/src/components/alert.ts +284 -0
  268. package/src/components/avatar.ts +109 -0
  269. package/src/components/breath.ts +165 -0
  270. package/src/components/button.ts +292 -0
  271. package/src/components/card.ts +83 -0
  272. package/src/components/carousel.ts +183 -0
  273. package/src/components/details.ts +121 -0
  274. package/src/components/dialog.ts +166 -0
  275. package/src/components/divider.ts +56 -0
  276. package/src/components/dragbox.ts +134 -0
  277. package/src/components/flex.ts +82 -0
  278. package/src/components/form.ts +82 -0
  279. package/src/components/grid.ts +87 -0
  280. package/src/components/input.ts +73 -0
  281. package/src/components/layout.ts +89 -0
  282. package/src/components/link.ts +38 -0
  283. package/src/components/progress.ts +100 -0
  284. package/src/components/range.ts +399 -0
  285. package/src/components/rotate.ts +95 -0
  286. package/src/components/router.ts +281 -0
  287. package/src/components/select.ts +281 -0
  288. package/src/components/skeleton.ts +119 -0
  289. package/src/components/split.ts +225 -0
  290. package/src/components/switch.ts +184 -0
  291. package/src/components/text.ts +93 -0
  292. package/src/components/time.ts +84 -0
  293. package/src/components/tooltip.ts +150 -0
  294. package/src/components/typewriter.ts +159 -0
  295. package/src/core/global-style.ts +105 -0
  296. package/src/core/super-anchor.ts +55 -0
  297. package/src/core/super-input.ts +230 -0
  298. package/src/core/super-openable.ts +51 -0
  299. package/src/details.ts +11 -0
  300. package/src/dialog.ts +11 -0
  301. package/src/divider.ts +11 -0
  302. package/src/dragbox.ts +11 -0
  303. package/src/flex.ts +11 -0
  304. package/src/form.ts +11 -0
  305. package/src/grid.ts +11 -0
  306. package/src/index.ts +28 -0
  307. package/src/input.ts +13 -0
  308. package/src/layout.ts +12 -0
  309. package/src/link.ts +13 -0
  310. package/src/progress.ts +12 -0
  311. package/src/range.ts +13 -0
  312. package/src/rotate.ts +13 -0
  313. package/src/router.ts +12 -0
  314. package/src/select.ts +13 -0
  315. package/src/skeleton.ts +13 -0
  316. package/src/split.ts +13 -0
  317. package/src/switch.ts +13 -0
  318. package/src/text.ts +13 -0
  319. package/src/time.ts +13 -0
  320. package/src/tooltip.ts +13 -0
  321. package/src/typewriter.ts +11 -0
  322. package/vscode.html-custom-data.json +1 -1
  323. package/web-types.json +1 -1
@@ -0,0 +1,399 @@
1
+ import { godown } from "@godown/element/decorators/godown.js";
2
+ import { part } from "@godown/element/decorators/part.js";
3
+ import { styles } from "@godown/element/decorators/styles.js";
4
+ import { attr } from "@godown/element/directives/attr.js";
5
+ import { classList } from "@godown/element/directives/class-list.js";
6
+ import { joinProperties } from "@godown/element/tools/css.js";
7
+ import { isNil } from "@godown/element/tools/lib.js";
8
+ import { css, html, type TemplateResult } from "lit";
9
+ import { property, queryAll, state } from "lit/decorators.js";
10
+
11
+ import { cssGlobalVars, scopePrefix } from "../core/global-style.js";
12
+ import SuperInput from "../core/super-input.js";
13
+
14
+ const protoName = "range";
15
+ const cssScope = scopePrefix(protoName);
16
+
17
+ /**
18
+ * {@linkcode Range} is similar to `<input type="range">`.
19
+ *
20
+ * Value accepts number, or array.
21
+ *
22
+ * Number has 1 handle, the array has the number of its elements and the minimum is 2.
23
+ *
24
+ * @category input
25
+ */
26
+ @godown(protoName)
27
+ @styles(
28
+ css`
29
+ :host {
30
+ ${cssScope}-handle-active: var(${cssGlobalVars._colors.blue[7]});
31
+ ${cssScope}-track-width: .5em;
32
+ background: var(${cssGlobalVars.input}-background);
33
+ width: var(${cssGlobalVars.input}-width);
34
+ display: block;
35
+ margin: 0.25em 0;
36
+ }
37
+
38
+ :host([vertical]) {
39
+ height: var(${cssGlobalVars.input}-width);
40
+ width: fit-content;
41
+ }
42
+
43
+ :host(:not([disabled])) .last-focus {
44
+ z-index: 1;
45
+ ${cssScope}-handle-scale:1.05;
46
+ background: var(${cssScope}-handle-active);
47
+ }
48
+
49
+ [part=root] {
50
+ min-height: inherit;
51
+ position: relative;
52
+ border-radius: inherit;
53
+ width: 100%;
54
+ --from: 0%;
55
+ --to: 50%;
56
+ height: var(${cssScope}-track-width);
57
+ }
58
+
59
+ [part=track] {
60
+ height: 100%;
61
+ min-height:inherit;
62
+ display: flex;
63
+ position: absolute;
64
+ pointer-events: none;
65
+ border-radius: inherit;
66
+ justify-content: space-between;
67
+ left: min(var(--from), var(--to));
68
+ background: var(${cssGlobalVars.active});
69
+ width: max(calc(var(--to) - var(--from)), calc(var(--from) - var(--to)));
70
+ }
71
+
72
+ [part=handle] {
73
+ width: 1em;
74
+ height: 1em;
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ user-select: none;
79
+ position: absolute;
80
+ border: 0.1em solid;
81
+ border-radius: 50%;
82
+ transform-origin: 0% 25%;
83
+ transform: scale(var(${cssScope}-handle-scale, 1)) translate(-50%, -25%);
84
+ background: var(${cssGlobalVars.active});
85
+ border-color: var(${cssGlobalVars.input}-control);
86
+ }
87
+ `,
88
+ css`
89
+ [vertical] {
90
+ height: inherit;
91
+ width: var(${cssScope}-track-width);
92
+ }
93
+
94
+ [vertical] i {
95
+ transform: translate(-25%, -50%);
96
+ }
97
+
98
+ [vertical] [part=track] {
99
+ width: 100%;
100
+ height: max(calc(var(--to) - var(--from)), calc(var(--from) - var(--to)));
101
+ top: min(var(--from), var(--to));
102
+ left: 0;
103
+ }
104
+ `,
105
+ css`
106
+ [part=handle] {
107
+ left: var(--handle);
108
+ top: 0;
109
+ }
110
+
111
+ [vertical] [part=handle] {
112
+ top: var(--handle);
113
+ left: 0;
114
+ }
115
+ `,
116
+ )
117
+ class Range extends SuperInput {
118
+ /**
119
+ * Minimum value.
120
+ */
121
+ @property({ type: Number })
122
+ min = 0;
123
+
124
+ /**
125
+ * Maximum value.
126
+ */
127
+ @property({ type: Number })
128
+ max = 100;
129
+
130
+ /**
131
+ * Sliding step length.
132
+ */
133
+ @property({ type: Number })
134
+ step: number;
135
+
136
+ /**
137
+ * Display vertically.
138
+ */
139
+ @property({ type: Boolean, reflect: true })
140
+ vertical: boolean;
141
+
142
+ /**
143
+ * Value, or each of values, will render a handle.
144
+ *
145
+ * Accepts number or array of numbers.
146
+ */
147
+ @property({ type: Array })
148
+ value: number | number[];
149
+
150
+ /**
151
+ * The default of `{@linkcode this.value}`.
152
+ */
153
+ @property({ type: Array })
154
+ default: typeof this.value;
155
+
156
+ @part("root")
157
+ protected _root: HTMLElement;
158
+
159
+ @queryAll("[part=handle]")
160
+ protected _handles: NodeListOf<HTMLElement>;
161
+
162
+ @state()
163
+ lastFocus?: number;
164
+
165
+ /**
166
+ * Returns true when the second number is greater than the first number.
167
+ */
168
+ get reverse(): boolean {
169
+ return this.range ? this.value[0] > this.value[1] : false;
170
+ }
171
+
172
+ /**
173
+ * If value is array.
174
+ */
175
+ get range(): boolean {
176
+ return Array.isArray(this.value);
177
+ }
178
+
179
+ /**
180
+ * Return values in the form of an array.
181
+ */
182
+ get rangeValue(): number[] {
183
+ return (this.range ? this.value : [this.value]) as number[];
184
+ }
185
+
186
+ /**
187
+ * @param len Minimum result length.
188
+ * @param value Fill value.
189
+ * @returns Array with length of len.
190
+ */
191
+ padValue(len: number, value = 0): number[] {
192
+ const { rangeValue } = this;
193
+ const miss = len - rangeValue.length;
194
+ if (miss > 0) {
195
+ return new Array(miss).fill(value).concat(rangeValue);
196
+ }
197
+ return rangeValue;
198
+ }
199
+
200
+ protected render(): TemplateResult<1> {
201
+ const rangeValue = this.padValue(2);
202
+ const from = Math.min(...rangeValue);
203
+ const to = Math.max(...rangeValue);
204
+ const gap = this.max - this.min;
205
+
206
+ return html`<div
207
+ part="root"
208
+ ${attr(this.observedRecord)}
209
+ @mousedown="${this.disabled ? null : this._handleMousedownRoot}"
210
+ style="${
211
+ joinProperties({
212
+ "--from": `${((from - this.min) / gap) * 100}%`,
213
+ "--to": `${((to - this.min) / gap) * 100}%`,
214
+ ...(this.range
215
+ ? Object.fromEntries(
216
+ rangeValue.map((value, index) => [
217
+ `--handle-${index}`,
218
+ `${((value - this.min) / gap) * 100}%`,
219
+ ]),
220
+ )
221
+ : {}),
222
+ })
223
+ }"><div part="track"></div>
224
+ ${
225
+ this.range
226
+ ? (this.value as number[]).map((_, index) => this.renderHandle(index))
227
+ : this.renderHandle(0)
228
+ }
229
+ </div>`;
230
+ }
231
+
232
+ protected renderHandle(index: number): TemplateResult<1> {
233
+ const { range } = this;
234
+ const end = !range || index === (this.value as number[]).length - 1;
235
+ return html`<i
236
+ tabindex="0"
237
+ part="handle"
238
+ class="${classList({ "last-focus": this.lastFocus === index })}"
239
+ @mousedown="${this.disabled ? null : this.createMouseDown(index)}"
240
+ @focus="${this.disabled ? null : () => this.focusHandle(index)}"
241
+ @blur="${this.disabled ? null : this.blurHandle}"
242
+ style="--handle:var(--${
243
+ /* In single-handle mod or end, it is max value */
244
+ (!range && end) ? `to` : `handle-${index}`})"
245
+ ></i>
246
+ `;
247
+ }
248
+
249
+ private _keydownEvent: EventListenerOrEventListenerObject;
250
+
251
+ focusHandle(index: number): void {
252
+ this.lastFocus = index;
253
+ const handleItem = this._handles.item(index);
254
+ handleItem?.focus();
255
+ if (!this._keydownEvent) {
256
+ this._keydownEvent = this.events.add(document, "keydown", this.createKeydownEvent(index));
257
+ }
258
+ }
259
+
260
+ blurHandle(): void {
261
+ this.lastFocus = undefined;
262
+ this._keydownEvent = this.events.remove(document, "keydown", this._keydownEvent);
263
+ }
264
+
265
+ protected createKeydownEvent(index: number) {
266
+ if (!this.range) {
267
+ index = 0;
268
+ }
269
+ return (e: KeyboardEvent): void => {
270
+ if (e.key === "ArrowLeft" || e.key === "ArrowDown") {
271
+ e.preventDefault();
272
+ this.createSetValue(index)(old => old - this.step);
273
+ } else if (e.key === "ArrowRight" || e.key === "ArrowUp") {
274
+ e.preventDefault();
275
+ this.createSetValue(index)(old => old + this.step);
276
+ }
277
+ };
278
+ }
279
+
280
+ createMouseDown(index: number) {
281
+ return (e: MouseEvent): void => {
282
+ this.focusHandle(index);
283
+ this.createMousedownListener(this.createSetValue(index))(e);
284
+ };
285
+ }
286
+
287
+ protected _handleMousedownEnd(e: MouseEvent): void {
288
+ this.lastFocus = 0;
289
+ this.createMousedownListener(this.setEnd)(e);
290
+ this.focusHandle(0);
291
+ }
292
+
293
+ createSetValue(index: number) {
294
+ return (numberOrModifier: number | ((value: number) => number)): void => {
295
+ const number = typeof numberOrModifier === "number"
296
+ ? this.normalizeValue(numberOrModifier)
297
+ : numberOrModifier(this.rangeValue[index]);
298
+ let newValue: any = number;
299
+ if (this.range) {
300
+ newValue = [...this.rangeValue];
301
+ newValue[index] = number;
302
+ }
303
+ this.value = newValue;
304
+ };
305
+ }
306
+
307
+ setEnd(value: number): void {
308
+ this.createSetValue((this.value as any)?.length - 1 || 0)(value);
309
+ }
310
+
311
+ /**
312
+ * Compute value from event.
313
+ */
314
+ protected _computeValue(e: MouseEvent): number {
315
+ const rect = this._root.getBoundingClientRect();
316
+ const div = this.vertical ? (e.clientY - rect.top) / rect.height : (e.clientX - rect.left) / rect.width;
317
+ const value = Math.round((div * (this.max - this.min)) / this.step) * this.step;
318
+ return this.normalizeValue(value);
319
+ }
320
+
321
+ /**
322
+ * Ensure that the values do not exceed the range of max and min.
323
+ */
324
+ protected normalizeValue(value: number): number {
325
+ if (value > this.max) { value -= this.step; }
326
+ else if (value < this.min) { value += this.step; }
327
+ return value;
328
+ }
329
+
330
+ protected _handleMousedownRoot(e: MouseEvent): void {
331
+ const value = this._computeValue(e);
332
+ const index = this.range
333
+ ? this.rangeValue.reduce((acc, item, index) => {
334
+ const diff = Math.abs(value - item);
335
+ const prevDiff = Math.abs(value - this.rangeValue[acc]);
336
+ return diff < prevDiff ? index : acc;
337
+ }, 0)
338
+ : 0;
339
+
340
+ const set = this.createSetValue(index);
341
+ set(value);
342
+ this.createMousedownListener(set)(e);
343
+ this.focusHandle(index);
344
+ }
345
+
346
+ protected createMousedownListener(mouseMoveCallback: (arg0: number) => void) {
347
+ return (e: MouseEvent): void => {
348
+ e.preventDefault();
349
+ e.stopPropagation();
350
+ const move = this.createMousemoveListener(mouseMoveCallback);
351
+ this.events.add(document, "mousemove", move);
352
+ const stop = () => {
353
+ this.events.remove(document, "mousemove", move);
354
+ this.events.remove(document, "mouseup", stop);
355
+ };
356
+ this.events.add(document, "mouseup", stop);
357
+ };
358
+ }
359
+
360
+ protected createMousemoveListener(callback: (arg0: number) => void) {
361
+ return (e: MouseEvent): void => {
362
+ const value = this._computeValue(e);
363
+ if (value > this.max || value < this.min) {
364
+ return;
365
+ }
366
+ callback?.call(this, value);
367
+ };
368
+ }
369
+
370
+ protected _connectedInit(): void {
371
+ const gap = this.max - this.min;
372
+ this.step ||= gap / 100;
373
+ if (isNil(this.value)) {
374
+ if (!isNil(this.default)) {
375
+ this.value = this.default;
376
+ } else {
377
+ this.value = Math.round(gap / 2 / this.step) * this.step;
378
+ }
379
+ }
380
+ this.default ??= this.value;
381
+ }
382
+
383
+ reset(): void {
384
+ this.value = this.default;
385
+ }
386
+
387
+ sort(): number | number[] {
388
+ return this.value = this.toSorted();
389
+ }
390
+
391
+ toSorted(): number | number[] {
392
+ if (this.range) {
393
+ return [...this.value as number[]].sort((a, b) => a - b);
394
+ }
395
+ return this.value;
396
+ }
397
+ }
398
+
399
+ export default Range;
@@ -0,0 +1,95 @@
1
+ import { godown } from "@godown/element/decorators/godown.js";
2
+ import { part } from "@godown/element/decorators/part.js";
3
+ import { styles } from "@godown/element/decorators/styles.js";
4
+ import { htmlSlot } from "@godown/element/directives/html-slot.js";
5
+ import { css, html, type TemplateResult } from "lit";
6
+
7
+ import { GlobalStyle, scopePrefix } from "../core/global-style.js";
8
+
9
+ const protoName = "rotate";
10
+ const cssScope = scopePrefix(protoName);
11
+
12
+ /**
13
+ * {@linkcode Rotate} Make child elements rotate.
14
+ *
15
+ * @category wrapper
16
+ */
17
+ @godown(protoName)
18
+ @styles(
19
+ css`
20
+ :host {
21
+ display: block;
22
+ width: -moz-fit-content;
23
+ width: fit-content;
24
+ transition: all 0.5s ease-in-out;
25
+ ${cssScope}--padding: .75em;
26
+ ${cssScope}--offset: .5em;
27
+ }
28
+
29
+ div {
30
+ position: relative;
31
+ transition: inherit;
32
+ transition-property: transform;
33
+ }
34
+
35
+ i {
36
+ width: 100%;
37
+ height: 100%;
38
+ position: absolute;
39
+ top: 0;
40
+ box-sizing: content-box;
41
+ padding: var(${cssScope}--offset);
42
+ margin: calc(-1 * var(${cssScope}--offset));
43
+ }
44
+
45
+ [part=slot] {
46
+ z-index: 2;
47
+ }
48
+ `,
49
+ )
50
+ class Rotate extends GlobalStyle {
51
+ @part("root")
52
+ protected _root: HTMLElement;
53
+
54
+ protected render(): TemplateResult<1> {
55
+ return html`<div part="root">
56
+ <div part="slot" @mousemove="${this._handleRotate}">${htmlSlot()}</div>
57
+ <i @mouseleave="${this.reset}"></i>
58
+ </div>`;
59
+ }
60
+
61
+ reset(): void {
62
+ this._root.style.removeProperty("transform");
63
+ this._root.style.removeProperty("transition");
64
+ }
65
+
66
+ protected _handleRotate(e: MouseEvent): void {
67
+ const { rotateX, rotateY } = this._computeOffset(e);
68
+ this._root.style.setProperty("transform", `rotateX(${rotateX}rad) rotateY(${rotateY}rad)`);
69
+ this._root.style.setProperty("transition", "0s");
70
+ }
71
+
72
+ /**
73
+ * Compute offset.
74
+ * ```
75
+ * `rotateX(${rotateX}rad) rotateY(${rotateY}rad)`
76
+ * ```
77
+ * @param e Mouse move event.
78
+ * @returns rotateX, rotateY
79
+ */
80
+ _computeOffset(e: MouseEvent): {
81
+ rotateX: number;
82
+ rotateY: number;
83
+ } {
84
+ const { left, top, width, height } = this._root.getBoundingClientRect();
85
+ const { clientX, clientY } = e;
86
+ const offsetX = clientX - left;
87
+ const offsetY = clientY - top;
88
+
89
+ const rotateX = -(offsetY - height / 2) / height / 2;
90
+ const rotateY = (offsetX - width / 2) / width / 2;
91
+ return { rotateX, rotateY };
92
+ }
93
+ }
94
+
95
+ export default Rotate;