@webstudio-is/sdk-components-react 0.90.0 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/lib/__generated__/blockquote.props.js +2 -4
  2. package/lib/__generated__/body.props.js +2 -4
  3. package/lib/__generated__/bold.props.js +2 -4
  4. package/lib/__generated__/box.props.js +2 -4
  5. package/lib/__generated__/button.props.js +2 -4
  6. package/lib/__generated__/checkbox.props.js +2 -4
  7. package/lib/__generated__/code-text.props.js +2 -4
  8. package/lib/__generated__/form.props.js +2 -4
  9. package/lib/__generated__/fragment.props.js +2 -4
  10. package/lib/__generated__/heading.props.js +2 -4
  11. package/lib/__generated__/html-embed.props.js +2 -4
  12. package/lib/__generated__/image.props.js +2 -4
  13. package/lib/__generated__/input.props.js +2 -4
  14. package/lib/__generated__/italic.props.js +2 -4
  15. package/lib/__generated__/label.props.js +2 -4
  16. package/lib/__generated__/link.props.js +2 -4
  17. package/lib/__generated__/list-item.props.js +2 -4
  18. package/lib/__generated__/list.props.js +2 -4
  19. package/lib/__generated__/paragraph.props.js +2 -4
  20. package/lib/__generated__/radio-button.props.js +2 -4
  21. package/lib/__generated__/rich-text-link.props.js +2 -4
  22. package/lib/__generated__/separator.props.js +2 -4
  23. package/lib/__generated__/slot.props.js +2 -4
  24. package/lib/__generated__/span.props.js +2 -4
  25. package/lib/__generated__/subscript.props.js +2 -4
  26. package/lib/__generated__/superscript.props.js +2 -4
  27. package/lib/__generated__/text.props.js +2 -4
  28. package/lib/__generated__/textarea.props.js +2 -4
  29. package/lib/__generated__/vimeo-play-button.props.js +2 -4
  30. package/lib/__generated__/vimeo-preview-image.props.js +2 -4
  31. package/lib/__generated__/vimeo-spinner.props.js +2 -4
  32. package/lib/__generated__/vimeo.props.js +2 -4
  33. package/lib/blockquote.js +3 -6
  34. package/lib/blockquote.stories.js +11 -0
  35. package/lib/blockquote.ws.js +3 -6
  36. package/lib/body.js +3 -6
  37. package/lib/body.stories.js +11 -0
  38. package/lib/body.ws.js +3 -6
  39. package/lib/bold.js +3 -6
  40. package/lib/bold.stories.js +11 -0
  41. package/lib/bold.ws.js +3 -6
  42. package/lib/box.js +3 -6
  43. package/lib/box.stories.js +11 -0
  44. package/lib/box.ws.js +3 -6
  45. package/lib/button.js +3 -6
  46. package/lib/button.stories.js +11 -0
  47. package/lib/button.ws.js +3 -6
  48. package/lib/checkbox.js +3 -6
  49. package/lib/checkbox.ws.js +3 -6
  50. package/lib/code-text.js +3 -6
  51. package/lib/code-text.stories.js +11 -0
  52. package/lib/code-text.ws.js +3 -6
  53. package/lib/components.js +33 -66
  54. package/lib/form.js +3 -6
  55. package/lib/form.stories.js +11 -0
  56. package/lib/form.ws.js +3 -6
  57. package/lib/fragment.js +2 -4
  58. package/lib/fragment.ws.js +3 -6
  59. package/lib/heading.js +2 -4
  60. package/lib/heading.stories.js +11 -0
  61. package/lib/heading.ws.js +3 -6
  62. package/lib/html-embed.js +2 -4
  63. package/lib/html-embed.stories.js +11 -0
  64. package/lib/html-embed.ws.js +3 -6
  65. package/lib/image.js +3 -6
  66. package/lib/image.stories.js +7 -0
  67. package/lib/image.ws.js +4 -8
  68. package/lib/input.js +3 -6
  69. package/lib/input.stories.js +9 -0
  70. package/lib/input.ws.js +9 -11
  71. package/lib/italic.js +3 -6
  72. package/lib/italic.stories.js +11 -0
  73. package/lib/italic.ws.js +3 -6
  74. package/lib/label.js +3 -6
  75. package/lib/label.ws.js +3 -6
  76. package/lib/link.js +3 -6
  77. package/lib/link.stories.js +11 -0
  78. package/lib/link.ws.js +3 -6
  79. package/lib/list-item.js +3 -6
  80. package/lib/list-item.stories.js +11 -0
  81. package/lib/list-item.ws.js +3 -6
  82. package/lib/list.js +2 -4
  83. package/lib/list.stories.js +13 -0
  84. package/lib/list.ws.js +3 -6
  85. package/lib/metas.js +33 -66
  86. package/lib/paragraph.js +3 -6
  87. package/lib/paragraph.stories.js +11 -0
  88. package/lib/paragraph.ws.js +3 -6
  89. package/lib/props.js +33 -66
  90. package/lib/radio-button.js +3 -6
  91. package/lib/radio-button.ws.js +9 -11
  92. package/lib/rich-text-link.js +2 -4
  93. package/lib/rich-text-link.stories.js +11 -0
  94. package/lib/rich-text-link.ws.js +3 -6
  95. package/lib/separator.js +3 -6
  96. package/lib/separator.stories.js +7 -0
  97. package/lib/separator.ws.js +3 -6
  98. package/lib/slot.js +2 -4
  99. package/lib/slot.stories.js +11 -0
  100. package/lib/slot.ws.js +3 -6
  101. package/lib/span.js +3 -6
  102. package/lib/span.stories.js +11 -0
  103. package/lib/span.ws.js +3 -6
  104. package/lib/subscript.js +3 -6
  105. package/lib/subscript.stories.js +11 -0
  106. package/lib/subscript.ws.js +3 -6
  107. package/lib/superscript.js +3 -6
  108. package/lib/superscript.stories.js +11 -0
  109. package/lib/superscript.ws.js +3 -6
  110. package/lib/text.js +3 -6
  111. package/lib/text.stories.js +11 -0
  112. package/lib/text.ws.js +3 -6
  113. package/lib/textarea.js +3 -6
  114. package/lib/textarea.ws.js +9 -11
  115. package/lib/types/__generated__/blockquote.props.d.ts +1 -1
  116. package/lib/types/__generated__/body.props.d.ts +1 -1
  117. package/lib/types/__generated__/bold.props.d.ts +1 -1
  118. package/lib/types/__generated__/box.props.d.ts +1 -1
  119. package/lib/types/__generated__/button.props.d.ts +1 -1
  120. package/lib/types/__generated__/checkbox.props.d.ts +1 -1
  121. package/lib/types/__generated__/code-text.props.d.ts +1 -1
  122. package/lib/types/__generated__/form.props.d.ts +1 -1
  123. package/lib/types/__generated__/fragment.props.d.ts +1 -1
  124. package/lib/types/__generated__/heading.props.d.ts +1 -1
  125. package/lib/types/__generated__/html-embed.props.d.ts +1 -1
  126. package/lib/types/__generated__/image.props.d.ts +1 -1
  127. package/lib/types/__generated__/input.props.d.ts +1 -1
  128. package/lib/types/__generated__/italic.props.d.ts +1 -1
  129. package/lib/types/__generated__/label.props.d.ts +1 -1
  130. package/lib/types/__generated__/link.props.d.ts +1 -1
  131. package/lib/types/__generated__/list-item.props.d.ts +1 -1
  132. package/lib/types/__generated__/list.props.d.ts +1 -1
  133. package/lib/types/__generated__/paragraph.props.d.ts +1 -1
  134. package/lib/types/__generated__/radio-button.props.d.ts +1 -1
  135. package/lib/types/__generated__/rich-text-link.props.d.ts +1 -1
  136. package/lib/types/__generated__/separator.props.d.ts +1 -1
  137. package/lib/types/__generated__/slot.props.d.ts +1 -1
  138. package/lib/types/__generated__/span.props.d.ts +1 -1
  139. package/lib/types/__generated__/subscript.props.d.ts +1 -1
  140. package/lib/types/__generated__/superscript.props.d.ts +1 -1
  141. package/lib/types/__generated__/text.props.d.ts +1 -1
  142. package/lib/types/__generated__/textarea.props.d.ts +1 -1
  143. package/lib/types/__generated__/vimeo-play-button.props.d.ts +1 -1
  144. package/lib/types/__generated__/vimeo-preview-image.props.d.ts +1 -1
  145. package/lib/types/__generated__/vimeo-spinner.props.d.ts +1 -1
  146. package/lib/types/__generated__/vimeo.props.d.ts +1 -1
  147. package/lib/types/vimeo-preview-image.d.ts +1 -1
  148. package/lib/vimeo-play-button.js +3 -5
  149. package/lib/vimeo-play-button.stories.js +11 -0
  150. package/lib/vimeo-play-button.ws.js +3 -6
  151. package/lib/vimeo-preview-image.js +2 -4
  152. package/lib/vimeo-preview-image.stories.js +11 -0
  153. package/lib/vimeo-preview-image.ws.js +3 -6
  154. package/lib/vimeo-spinner.js +2 -4
  155. package/lib/vimeo-spinner.stories.js +11 -0
  156. package/lib/vimeo-spinner.ws.js +3 -6
  157. package/lib/vimeo.js +3 -6
  158. package/lib/vimeo.stories.js +11 -0
  159. package/lib/vimeo.ws.js +3 -6
  160. package/package.json +16 -20
  161. package/lib/cjs/__generated__/blockquote.props.js +0 -536
  162. package/lib/cjs/__generated__/body.props.js +0 -530
  163. package/lib/cjs/__generated__/bold.props.js +0 -530
  164. package/lib/cjs/__generated__/box.props.js +0 -549
  165. package/lib/cjs/__generated__/button.props.js +0 -586
  166. package/lib/cjs/__generated__/checkbox.props.js +0 -688
  167. package/lib/cjs/__generated__/code-text.props.js +0 -530
  168. package/lib/cjs/__generated__/form.props.js +0 -578
  169. package/lib/cjs/__generated__/fragment.props.js +0 -24
  170. package/lib/cjs/__generated__/heading.props.js +0 -538
  171. package/lib/cjs/__generated__/html-embed.props.js +0 -31
  172. package/lib/cjs/__generated__/image.props.js +0 -603
  173. package/lib/cjs/__generated__/input.props.js +0 -695
  174. package/lib/cjs/__generated__/italic.props.js +0 -530
  175. package/lib/cjs/__generated__/label.props.js +0 -542
  176. package/lib/cjs/__generated__/link.props.js +0 -584
  177. package/lib/cjs/__generated__/list-item.props.js +0 -530
  178. package/lib/cjs/__generated__/list.props.js +0 -556
  179. package/lib/cjs/__generated__/paragraph.props.js +0 -530
  180. package/lib/cjs/__generated__/radio-button.props.js +0 -688
  181. package/lib/cjs/__generated__/rich-text-link.props.js +0 -584
  182. package/lib/cjs/__generated__/separator.props.js +0 -530
  183. package/lib/cjs/__generated__/slot.props.js +0 -24
  184. package/lib/cjs/__generated__/span.props.js +0 -530
  185. package/lib/cjs/__generated__/subscript.props.js +0 -530
  186. package/lib/cjs/__generated__/superscript.props.js +0 -530
  187. package/lib/cjs/__generated__/text.props.js +0 -538
  188. package/lib/cjs/__generated__/textarea.props.js +0 -597
  189. package/lib/cjs/__generated__/vimeo-play-button.props.js +0 -585
  190. package/lib/cjs/__generated__/vimeo-preview-image.props.js +0 -602
  191. package/lib/cjs/__generated__/vimeo-spinner.props.js +0 -530
  192. package/lib/cjs/__generated__/vimeo.props.js +0 -687
  193. package/lib/cjs/blockquote.js +0 -32
  194. package/lib/cjs/blockquote.ws.js +0 -96
  195. package/lib/cjs/body.js +0 -29
  196. package/lib/cjs/body.ws.js +0 -52
  197. package/lib/cjs/bold.js +0 -29
  198. package/lib/cjs/bold.ws.js +0 -42
  199. package/lib/cjs/box.js +0 -32
  200. package/lib/cjs/box.ws.js +0 -54
  201. package/lib/cjs/button.js +0 -31
  202. package/lib/cjs/button.ws.js +0 -57
  203. package/lib/cjs/checkbox.js +0 -29
  204. package/lib/cjs/checkbox.ws.js +0 -78
  205. package/lib/cjs/code-text.js +0 -30
  206. package/lib/cjs/code-text.ws.js +0 -75
  207. package/lib/cjs/components.js +0 -86
  208. package/lib/cjs/form.js +0 -29
  209. package/lib/cjs/form.ws.js +0 -84
  210. package/lib/cjs/fragment.js +0 -29
  211. package/lib/cjs/fragment.ws.js +0 -33
  212. package/lib/cjs/heading.js +0 -31
  213. package/lib/cjs/heading.ws.js +0 -58
  214. package/lib/cjs/html-embed.js +0 -80
  215. package/lib/cjs/html-embed.ws.js +0 -51
  216. package/lib/cjs/image.js +0 -86
  217. package/lib/cjs/image.ws.js +0 -70
  218. package/lib/cjs/input.js +0 -29
  219. package/lib/cjs/input.ws.js +0 -63
  220. package/lib/cjs/italic.js +0 -29
  221. package/lib/cjs/italic.ws.js +0 -48
  222. package/lib/cjs/label.js +0 -29
  223. package/lib/cjs/label.ws.js +0 -61
  224. package/lib/cjs/link.js +0 -52
  225. package/lib/cjs/link.ws.js +0 -81
  226. package/lib/cjs/list-item.js +0 -32
  227. package/lib/cjs/list-item.ws.js +0 -53
  228. package/lib/cjs/list.js +0 -31
  229. package/lib/cjs/list.ws.js +0 -74
  230. package/lib/cjs/metas.js +0 -86
  231. package/lib/cjs/package.json +0 -1
  232. package/lib/cjs/paragraph.js +0 -29
  233. package/lib/cjs/paragraph.ws.js +0 -53
  234. package/lib/cjs/props.js +0 -86
  235. package/lib/cjs/radio-button.js +0 -29
  236. package/lib/cjs/radio-button.ws.js +0 -78
  237. package/lib/cjs/rich-text-link.js +0 -28
  238. package/lib/cjs/rich-text-link.ws.js +0 -32
  239. package/lib/cjs/separator.js +0 -32
  240. package/lib/cjs/separator.ws.js +0 -71
  241. package/lib/cjs/slot.js +0 -36
  242. package/lib/cjs/slot.ws.js +0 -37
  243. package/lib/cjs/span.js +0 -29
  244. package/lib/cjs/span.ws.js +0 -42
  245. package/lib/cjs/subscript.js +0 -29
  246. package/lib/cjs/subscript.ws.js +0 -42
  247. package/lib/cjs/superscript.js +0 -29
  248. package/lib/cjs/superscript.ws.js +0 -42
  249. package/lib/cjs/text.js +0 -32
  250. package/lib/cjs/text.ws.js +0 -58
  251. package/lib/cjs/textarea.js +0 -29
  252. package/lib/cjs/textarea.ws.js +0 -64
  253. package/lib/cjs/vimeo-play-button.js +0 -38
  254. package/lib/cjs/vimeo-play-button.ws.js +0 -46
  255. package/lib/cjs/vimeo-preview-image.js +0 -40
  256. package/lib/cjs/vimeo-preview-image.ws.js +0 -37
  257. package/lib/cjs/vimeo-spinner.js +0 -37
  258. package/lib/cjs/vimeo-spinner.ws.js +0 -44
  259. package/lib/cjs/vimeo.js +0 -294
  260. package/lib/cjs/vimeo.ws.js +0 -348
  261. package/src/LICENSE +0 -661
  262. package/src/__generated__/blockquote.props.ts +0 -580
  263. package/src/__generated__/body.props.ts +0 -573
  264. package/src/__generated__/bold.props.ts +0 -573
  265. package/src/__generated__/box.props.ts +0 -593
  266. package/src/__generated__/button.props.ts +0 -636
  267. package/src/__generated__/checkbox.props.ts +0 -748
  268. package/src/__generated__/code-text.props.ts +0 -573
  269. package/src/__generated__/form.props.ts +0 -628
  270. package/src/__generated__/fragment.props.ts +0 -3
  271. package/src/__generated__/heading.props.ts +0 -582
  272. package/src/__generated__/html-embed.props.ts +0 -10
  273. package/src/__generated__/image.props.ts +0 -648
  274. package/src/__generated__/input.props.ts +0 -756
  275. package/src/__generated__/italic.props.ts +0 -573
  276. package/src/__generated__/label.props.ts +0 -586
  277. package/src/__generated__/link.props.ts +0 -630
  278. package/src/__generated__/list-item.props.ts +0 -573
  279. package/src/__generated__/list.props.ts +0 -601
  280. package/src/__generated__/paragraph.props.ts +0 -573
  281. package/src/__generated__/radio-button.props.ts +0 -748
  282. package/src/__generated__/rich-text-link.props.ts +0 -630
  283. package/src/__generated__/separator.props.ts +0 -573
  284. package/src/__generated__/slot.props.ts +0 -3
  285. package/src/__generated__/span.props.ts +0 -573
  286. package/src/__generated__/subscript.props.ts +0 -573
  287. package/src/__generated__/superscript.props.ts +0 -573
  288. package/src/__generated__/text.props.ts +0 -582
  289. package/src/__generated__/textarea.props.ts +0 -645
  290. package/src/__generated__/vimeo-play-button.props.ts +0 -634
  291. package/src/__generated__/vimeo-preview-image.props.ts +0 -647
  292. package/src/__generated__/vimeo-spinner.props.ts +0 -573
  293. package/src/__generated__/vimeo.props.ts +0 -751
  294. package/src/blockquote.stories.tsx +0 -13
  295. package/src/blockquote.tsx +0 -18
  296. package/src/blockquote.ws.tsx +0 -84
  297. package/src/body.stories.tsx +0 -13
  298. package/src/body.tsx +0 -10
  299. package/src/body.ws.tsx +0 -37
  300. package/src/bold.stories.tsx +0 -13
  301. package/src/bold.tsx +0 -10
  302. package/src/bold.ws.tsx +0 -27
  303. package/src/box.stories.tsx +0 -13
  304. package/src/box.tsx +0 -32
  305. package/src/box.ws.ts +0 -54
  306. package/src/button.stories.tsx +0 -13
  307. package/src/button.tsx +0 -15
  308. package/src/button.ws.tsx +0 -43
  309. package/src/checkbox.tsx +0 -13
  310. package/src/checkbox.ws.tsx +0 -64
  311. package/src/code-text.stories.tsx +0 -13
  312. package/src/code-text.tsx +0 -17
  313. package/src/code-text.ws.tsx +0 -61
  314. package/src/components.ts +0 -32
  315. package/src/form.stories.tsx +0 -13
  316. package/src/form.tsx +0 -14
  317. package/src/form.ws.tsx +0 -69
  318. package/src/fragment.tsx +0 -11
  319. package/src/fragment.ws.ts +0 -15
  320. package/src/heading.stories.tsx +0 -13
  321. package/src/heading.tsx +0 -21
  322. package/src/heading.ws.tsx +0 -47
  323. package/src/html-embed.stories.tsx +0 -13
  324. package/src/html-embed.tsx +0 -99
  325. package/src/html-embed.ws.ts +0 -34
  326. package/src/image.stories.tsx +0 -9
  327. package/src/image.tsx +0 -91
  328. package/src/image.ws.tsx +0 -58
  329. package/src/input.stories.tsx +0 -11
  330. package/src/input.tsx +0 -13
  331. package/src/input.ws.tsx +0 -49
  332. package/src/italic.stories.tsx +0 -13
  333. package/src/italic.tsx +0 -10
  334. package/src/italic.ws.tsx +0 -33
  335. package/src/label.tsx +0 -10
  336. package/src/label.ws.tsx +0 -46
  337. package/src/link.stories.tsx +0 -13
  338. package/src/link.tsx +0 -43
  339. package/src/link.ws.tsx +0 -67
  340. package/src/list-item.stories.tsx +0 -13
  341. package/src/list-item.tsx +0 -18
  342. package/src/list-item.ws.tsx +0 -38
  343. package/src/list.stories.tsx +0 -14
  344. package/src/list.tsx +0 -27
  345. package/src/list.ws.tsx +0 -59
  346. package/src/metas.ts +0 -32
  347. package/src/paragraph.stories.tsx +0 -13
  348. package/src/paragraph.tsx +0 -10
  349. package/src/paragraph.ws.tsx +0 -38
  350. package/src/props.ts +0 -32
  351. package/src/radio-button.tsx +0 -13
  352. package/src/radio-button.ws.tsx +0 -64
  353. package/src/rich-text-link.stories.tsx +0 -13
  354. package/src/rich-text-link.tsx +0 -8
  355. package/src/rich-text-link.ws.tsx +0 -14
  356. package/src/separator.stories.tsx +0 -9
  357. package/src/separator.tsx +0 -18
  358. package/src/separator.ws.tsx +0 -58
  359. package/src/slot.stories.tsx +0 -13
  360. package/src/slot.tsx +0 -17
  361. package/src/slot.ws.ts +0 -20
  362. package/src/span.stories.tsx +0 -13
  363. package/src/span.tsx +0 -10
  364. package/src/span.ws.tsx +0 -27
  365. package/src/subscript.stories.tsx +0 -13
  366. package/src/subscript.tsx +0 -10
  367. package/src/subscript.ws.tsx +0 -27
  368. package/src/superscript.stories.tsx +0 -13
  369. package/src/superscript.tsx +0 -10
  370. package/src/superscript.ws.tsx +0 -27
  371. package/src/text.stories.tsx +0 -13
  372. package/src/text.tsx +0 -22
  373. package/src/text.ws.tsx +0 -44
  374. package/src/textarea.tsx +0 -13
  375. package/src/textarea.ws.tsx +0 -50
  376. package/src/vimeo-play-button.stories.tsx +0 -13
  377. package/src/vimeo-play-button.tsx +0 -24
  378. package/src/vimeo-play-button.ws.ts +0 -30
  379. package/src/vimeo-preview-image.stories.tsx +0 -13
  380. package/src/vimeo-preview-image.tsx +0 -30
  381. package/src/vimeo-preview-image.ws.ts +0 -22
  382. package/src/vimeo-spinner.stories.tsx +0 -13
  383. package/src/vimeo-spinner.tsx +0 -25
  384. package/src/vimeo-spinner.ws.ts +0 -28
  385. package/src/vimeo.stories.tsx +0 -13
  386. package/src/vimeo.tsx +0 -431
  387. package/src/vimeo.ws.ts +0 -335
package/src/vimeo.tsx DELETED
@@ -1,431 +0,0 @@
1
- // Many implementation ideas came from
2
- // https://github.com/slightlyoff/lite-vimeo
3
- // Main reasons to not use it as is:
4
- // - we don't want to render player by default
5
- // - we want to expose Webstudio components to the user for customization
6
-
7
- import { colord } from "colord";
8
- import {
9
- forwardRef,
10
- useState,
11
- useRef,
12
- useEffect,
13
- type ElementRef,
14
- type ComponentProps,
15
- useContext,
16
- createContext,
17
- type ContextType,
18
- useMemo,
19
- } from "react";
20
- import { ReactSdkContext } from "@webstudio-is/react-sdk";
21
- import { shallowEqual } from "shallow-equal";
22
-
23
- const defaultTag = "div";
24
-
25
- // https://developer.vimeo.com/player/sdk/embed
26
- type VimeoPlayerOptions = {
27
- background?: boolean;
28
- color?: string;
29
- controls?: boolean;
30
- dnt?: boolean;
31
- interactive_params?: string;
32
- title?: boolean;
33
- portrait?: boolean;
34
- // @todo url type to validate url on the input
35
- /** The ID or the URL of the video on Vimeo. You must supply one of these values to identify the video. When the video's privacy setting is Private, you must use the URL, and the URL must include the h parameter. For more information, see Vimeo’s introductory guide. */
36
- url?: string;
37
- /** Whether to pause the current video when another Vimeo video on the same page starts to play. Set this value to false to permit simultaneous playback of all the videos on the page. This option has no effect if you've disabled cookies in your browser, either through browser settings or with an extension or plugin. */
38
- autopause?: boolean;
39
- /** Whether to enable the browser to enter picture-in-picture mode automatically when switching tabs or windows, where supported. */
40
- autopip?: boolean;
41
- /** Whether to start playback of the video automatically. This feature might not work on all devices. */
42
- autoplay?: boolean;
43
- /** Whether to display the video owner's name. */
44
- byline?: boolean;
45
- /** Whether to enable keyboard input to trigger player events. This setting doesn't affect tab control. */
46
- keyboard?: boolean;
47
- /** Whether to restart the video automatically after reaching the end. */
48
- loop?: boolean;
49
- /** Whether the video is muted upon loading. The true value is required for the autoplay behavior in some browsers. */
50
- muted?: boolean;
51
- /** Whether to include the picture-in-picture button among the player controls and enable the picture-in-picture API. */
52
- pip?: boolean;
53
- /** Whether the video plays inline on supported mobile devices. To force the device to play the video in fullscreen mode instead, set this value to false. */
54
- playsinline?: boolean;
55
- /** For videos on a Vimeo Plus account or higher: the playback quality of the video. Use auto for the best possible quality given available bandwidth and other factors. You can also specify 360p, 540p, 720p, 1080p, 2k, and 4k. */
56
- quality?: "auto" | "360p" | "540p" | "720p" | "1080p" | "2k" | "4k";
57
- /** Whether to return a responsive embed code, or one that provides intelligent adjustments based on viewing conditions. We recommend this option for mobile-optimized sites. */
58
- responsive?: boolean;
59
- /** Whether the player displays speed controls in the preferences menu and enables the playback rate API. */
60
- speed?: boolean;
61
- /**
62
- * The text track to display with the video. Specify the text track by its language code (en), the language code and locale (en-US), or the language code and kind (en.captions). For this argument to work, the video must already have a text track of the given type; see our Help Center or Working with Text Track Uploads for more information.
63
- * To enable automatically generated closed captions instead, provide the value en-x-autogen. Please note that, at the present time, automatic captions are always in English.
64
- */
65
- texttrack?: string;
66
- /** Whether the responsive player and transparent background are enabled. */
67
- transparent?: boolean;
68
- };
69
-
70
- const getUrl = (options: VimeoPlayerOptions) => {
71
- if (options.url === undefined) {
72
- return;
73
- }
74
- let url;
75
- try {
76
- const userUrl = new URL(options.url);
77
- url = new URL(IFRAME_CDN);
78
- url.pathname = `/video${userUrl.pathname}`;
79
- // eslint-disable-next-line no-empty
80
- } catch {}
81
-
82
- if (url === undefined) {
83
- return;
84
- }
85
-
86
- let option: keyof VimeoPlayerOptions;
87
- for (option in options) {
88
- const value = options[option];
89
- if (option === "url" || value === undefined) {
90
- continue;
91
- }
92
- url.searchParams.append(option, value.toString());
93
- }
94
-
95
- // We always set autoplay to true because we have a button that starts the video
96
- url.searchParams.set("autoplay", "true");
97
-
98
- // Vimeo needs a hex color value without the hash
99
- if (typeof options.color === "string") {
100
- const color = colord(options.color).toHex().replace("#", "");
101
- url.searchParams.set("color", color);
102
- }
103
-
104
- // Portrait option won't work if at title is not set to true
105
- if (options.portrait) {
106
- url.searchParams.set("title", "true");
107
- }
108
- // Byline won't show up if portrait and title is not set to true
109
- if (options.byline) {
110
- url.searchParams.set("portrait", "true");
111
- url.searchParams.set("title", "true");
112
- }
113
-
114
- return url.toString();
115
- };
116
-
117
- const preconnect = (url: string) => {
118
- const link = document.createElement("link");
119
- link.rel = "preconnect";
120
- link.href = url;
121
- link.crossOrigin = "true";
122
- document.head.append(link);
123
- };
124
-
125
- let warmed = false;
126
-
127
- // Host that Vimeo uses to serve JS needed by player
128
- const PLAYER_CDN = "https://f.vimeocdn.com";
129
- // The iframe document comes from player.vimeo.com
130
- const IFRAME_CDN = "https://player.vimeo.com";
131
- // Image for placeholder comes from i.vimeocdn.com
132
- const IMAGE_CDN = "https://i.vimeocdn.com";
133
-
134
- const warmConnections = () => {
135
- if (warmed) {
136
- return;
137
- }
138
- preconnect(PLAYER_CDN);
139
- preconnect(IFRAME_CDN);
140
- preconnect(IMAGE_CDN);
141
- warmed = true;
142
- };
143
-
144
- const createPlayer = (
145
- parent: Element,
146
- options: VimeoPlayerOptions,
147
- callback: () => void
148
- ) => {
149
- const url = getUrl(options);
150
- if (url === undefined) {
151
- return;
152
- }
153
- const iframe = document.createElement("iframe");
154
- iframe.setAttribute(
155
- "allow",
156
- "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture;"
157
- );
158
- iframe.setAttribute("frameborder", "0");
159
- iframe.setAttribute("allowfullscreen", "true");
160
- iframe.setAttribute("src", url);
161
- iframe.setAttribute(
162
- "style",
163
- "position: absolute; width: 100%; height: 100%; opacity: 0; transition: opacity 1s;"
164
- );
165
-
166
- // Show iframe only once it's loaded to avoid weird flashes.
167
- iframe.addEventListener(
168
- "load",
169
- () => {
170
- iframe.style.opacity = "1";
171
- callback();
172
- },
173
- { once: true }
174
- );
175
- parent.appendChild(iframe);
176
-
177
- return () => {
178
- iframe.parentElement?.removeChild(iframe);
179
- };
180
- };
181
-
182
- const getVideoId = (url: string) => {
183
- try {
184
- const parsedUrl = new URL(url);
185
- const id = parsedUrl.pathname.split("/")[1];
186
- if (id === "" || id == null) {
187
- return;
188
- }
189
- return id;
190
- // eslint-disable-next-line no-empty
191
- } catch {}
192
- };
193
-
194
- const loadPreviewImage = async (element: HTMLElement, videoUrl: string) => {
195
- const videoId = getVideoId(videoUrl);
196
- // API is the video-id based
197
- // http://vimeo.com/api/v2/video/364402896.json
198
- const apiUrl = `https://vimeo.com/api/v2/video/${videoId}.json`;
199
-
200
- // Now fetch the JSON that locates our placeholder from vimeo's JSON API
201
- const response = (await (await fetch(apiUrl)).json())[0];
202
-
203
- // Extract the image id, e.g. 819916979, from a URL like:
204
- // thumbnail_large: "https://i.vimeocdn.com/video/819916979_640.jpg"
205
- const thumbnail = response.thumbnail_large;
206
- const imgId = thumbnail.substr(thumbnail.lastIndexOf("/") + 1).split("_")[0];
207
-
208
- const imageUrl = new URL(IMAGE_CDN);
209
- imageUrl.pathname = `/video/${imgId}.webp`;
210
- imageUrl.searchParams.append("mw", "1100");
211
- imageUrl.searchParams.append("mh", "619");
212
- imageUrl.searchParams.append("q", "70");
213
- return imageUrl;
214
- };
215
-
216
- type PlayerStatus = "initial" | "initialized" | "ready";
217
-
218
- const useVimeo = ({
219
- options,
220
- renderer,
221
- showPreview,
222
- }: {
223
- options: VimeoPlayerOptions;
224
- showPreview?: boolean;
225
- renderer: ContextType<typeof ReactSdkContext>["renderer"];
226
- }) => {
227
- const [playerStatus, setPlayerStatus] = useState<PlayerStatus>("initial");
228
- const elementRef = useRef<ElementRef<typeof defaultTag> | null>(null);
229
- const [previewImageUrl, setPreviewImageUrl] = useState<URL>();
230
-
231
- useEffect(() => {
232
- setPlayerStatus(
233
- options.autoplay && renderer !== "canvas" ? "initialized" : "initial"
234
- );
235
- }, [options.autoplay, renderer]);
236
-
237
- useEffect(() => {
238
- if (
239
- elementRef.current === null ||
240
- playerStatus === "ready" ||
241
- options.url === undefined
242
- ) {
243
- return;
244
- }
245
- if (showPreview) {
246
- loadPreviewImage(elementRef.current, options.url).then(
247
- setPreviewImageUrl
248
- );
249
- return;
250
- }
251
- setPreviewImageUrl(undefined);
252
- }, [renderer, showPreview, options.url, playerStatus]);
253
-
254
- const optionsRef = useRef(options);
255
- const stableOptions = useMemo(() => {
256
- if (shallowEqual(options, optionsRef.current) === false) {
257
- optionsRef.current = options;
258
- }
259
- return optionsRef.current;
260
- }, [options]);
261
-
262
- useEffect(() => {
263
- if (elementRef.current === null || playerStatus === "initial") {
264
- return;
265
- }
266
- return createPlayer(elementRef.current, stableOptions, () => {
267
- setPlayerStatus("ready");
268
- });
269
- }, [stableOptions, playerStatus]);
270
- return { previewImageUrl, playerStatus, setPlayerStatus, elementRef };
271
- };
272
-
273
- export type VimeoOptions = Omit<
274
- VimeoPlayerOptions,
275
- | "dnt"
276
- | "interactive_params"
277
- | "background"
278
- | "controls"
279
- | "color"
280
- | "byline"
281
- | "title"
282
- | "portrait"
283
- > & {
284
- /** Whether the preview image should be loaded from Vimeo API. Ideally don't use it, because it will show up with some delay and will make your site feel slower. */
285
- showPreview?: boolean;
286
- /** Whether to prevent the player from tracking session data, including cookies. Keep in mind that setting this argument to true also blocks video stats. */
287
- doNotTrack?: VimeoPlayerOptions["dnt"];
288
- /** Key-value pairs representing dynamic parameters that are utilized on interactive videos with live elements, such as title=my-video,subtitle=interactive. */
289
- interactiveParams?: VimeoPlayerOptions["interactive_params"];
290
- /** Whether the player is in background mode, which hides the playback controls, enables autoplay, and loops the video. */
291
- backgroundMode?: VimeoPlayerOptions["background"];
292
- /** Whether to display the player's interactive elements, including the play bar and sharing buttons. Set this option to false for a chromeless experience. To control playback when the play/pause button is hidden, set autoplay to true, use keyboard controls (which remain active), or implement our player SDK. */
293
- showControls?: VimeoPlayerOptions["controls"];
294
- // @todo use color type to use color control
295
- /** A color value of the playback controls, which is normally #00ADEF. The embed settings of the video might override this value. */
296
- controlsColor?: VimeoPlayerOptions["color"];
297
- /** Whether to display the video owner's name. */
298
- showByline?: VimeoPlayerOptions["byline"];
299
- /** Whether the player displays the title overlay. */
300
- showTitle?: VimeoPlayerOptions["title"];
301
- /** Whether to display the video owner's portrait. Only works if either title or byline are also enabled */
302
- showPortrait?: VimeoPlayerOptions["portrait"];
303
- };
304
-
305
- type Props = Omit<ComponentProps<typeof defaultTag>, keyof VimeoOptions> &
306
- VimeoOptions;
307
- type Ref = ElementRef<typeof defaultTag>;
308
-
309
- export const Vimeo = forwardRef<Ref, Props>(
310
- (
311
- {
312
- url,
313
- autoplay = false,
314
- autopause = true,
315
- backgroundMode = false,
316
- showByline = false,
317
- showControls = true,
318
- doNotTrack = false,
319
- keyboard = true,
320
- loop = false,
321
- muted = false,
322
- pip = false,
323
- playsinline = true,
324
- showPortrait = true,
325
- quality = "auto",
326
- responsive = true,
327
- speed = false,
328
- showTitle = false,
329
- transparent = true,
330
- showPreview = false,
331
- autopip,
332
- controlsColor,
333
- interactiveParams,
334
- texttrack,
335
- children,
336
- ...rest
337
- },
338
- ref
339
- ) => {
340
- const { renderer } = useContext(ReactSdkContext);
341
- const { previewImageUrl, playerStatus, setPlayerStatus, elementRef } =
342
- useVimeo({
343
- renderer,
344
- showPreview,
345
- options: {
346
- url,
347
- autoplay,
348
- autopause,
349
- keyboard,
350
- loop,
351
- muted,
352
- pip,
353
- playsinline,
354
- quality,
355
- responsive,
356
- speed,
357
- transparent,
358
- portrait: showPortrait,
359
- byline: showByline,
360
- title: showTitle,
361
- color: controlsColor,
362
- controls: showControls,
363
- interactive_params: interactiveParams,
364
- background: backgroundMode,
365
- dnt: doNotTrack,
366
- },
367
- });
368
-
369
- return (
370
- <VimeoContext.Provider
371
- value={{
372
- status: playerStatus,
373
- previewImageUrl,
374
- onInitPlayer() {
375
- if (renderer !== "canvas") {
376
- setPlayerStatus("initialized");
377
- }
378
- },
379
- }}
380
- >
381
- <div
382
- {...rest}
383
- ref={(value: Ref) => {
384
- elementRef.current = value;
385
- if (ref !== null) {
386
- typeof ref === "function" ? ref(value) : (ref.current = value);
387
- }
388
- }}
389
- onPointerOver={() => {
390
- if (renderer !== "canvas") {
391
- warmConnections();
392
- }
393
- }}
394
- >
395
- {url === undefined ? <EmptyState /> : children}
396
- </div>
397
- </VimeoContext.Provider>
398
- );
399
- }
400
- );
401
-
402
- Vimeo.displayName = "Vimeo";
403
-
404
- const EmptyState = () => {
405
- return (
406
- <div
407
- style={{
408
- display: "flex",
409
- width: "100%",
410
- height: "100%",
411
- alignItems: "center",
412
- justifyContent: "center",
413
- fontSize: "1.2em",
414
- }}
415
- >
416
- {
417
- 'Open the "Settings" panel and paste a video URL, e.g. https://vimeo.com/831343124.'
418
- }
419
- </div>
420
- );
421
- };
422
-
423
- export const VimeoContext = createContext<{
424
- previewImageUrl?: URL;
425
- onInitPlayer: () => void;
426
- status: PlayerStatus;
427
- }>({
428
- // eslint-disable-next-line @typescript-eslint/no-empty-function
429
- onInitPlayer: () => {},
430
- status: "initial",
431
- });