@videojs/react 10.0.0-beta.29 → 10.0.0-beta.30

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 (123) hide show
  1. package/dist/default/index.js +2 -1
  2. package/dist/default/media/shaka-video/index.js +2 -0
  3. package/dist/default/media/shaka-video/media.js +21 -0
  4. package/dist/default/media/shaka-video/media.js.map +1 -0
  5. package/dist/default/presets/audio/minimal-skin.css +1 -3
  6. package/dist/default/presets/audio/skin.css +1 -3
  7. package/dist/default/presets/live-audio/minimal-skin.css +1 -3
  8. package/dist/default/presets/live-audio/skin.css +1 -3
  9. package/dist/default/presets/live-video/minimal-skin.css +2 -31
  10. package/dist/default/presets/live-video/minimal-skin.js +2 -6
  11. package/dist/default/presets/live-video/minimal-skin.js.map +1 -1
  12. package/dist/default/presets/live-video/minimal-skin.tailwind.js +2 -6
  13. package/dist/default/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  14. package/dist/default/presets/live-video/skin.css +2 -33
  15. package/dist/default/presets/live-video/skin.js +2 -6
  16. package/dist/default/presets/live-video/skin.js.map +1 -1
  17. package/dist/default/presets/live-video/skin.tailwind.js +2 -6
  18. package/dist/default/presets/live-video/skin.tailwind.js.map +1 -1
  19. package/dist/default/presets/video/minimal-skin.css +2 -31
  20. package/dist/default/presets/video/minimal-skin.js +2 -6
  21. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  22. package/dist/default/presets/video/minimal-skin.tailwind.js +2 -6
  23. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  24. package/dist/default/presets/video/skin.css +2 -33
  25. package/dist/default/presets/video/skin.js +2 -6
  26. package/dist/default/presets/video/skin.js.map +1 -1
  27. package/dist/default/presets/video/skin.tailwind.js +2 -6
  28. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  29. package/dist/default/skins/dist/default/default/tailwind/components/button.js +1 -1
  30. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  31. package/dist/default/skins/dist/default/default/tailwind/components/menu.js +2 -2
  32. package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  33. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +1 -7
  34. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  35. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +1 -10
  36. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  37. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  38. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  39. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +2 -2
  40. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  41. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +1 -7
  42. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  43. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -10
  44. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  45. package/dist/default/ui/thumbnail/thumbnail.js +18 -1
  46. package/dist/default/ui/thumbnail/thumbnail.js.map +1 -1
  47. package/dist/default/ui/title/index.js +2 -0
  48. package/dist/default/ui/title/title.js +44 -0
  49. package/dist/default/ui/title/title.js.map +1 -0
  50. package/dist/dev/index.d.ts +3 -2
  51. package/dist/dev/index.js +2 -1
  52. package/dist/dev/media/shaka-video/index.d.ts +2 -0
  53. package/dist/dev/media/shaka-video/index.js +2 -0
  54. package/dist/dev/media/shaka-video/media.d.ts +13 -0
  55. package/dist/dev/media/shaka-video/media.d.ts.map +1 -0
  56. package/dist/dev/media/shaka-video/media.js +21 -0
  57. package/dist/dev/media/shaka-video/media.js.map +1 -0
  58. package/dist/dev/presets/audio/minimal-skin.css +1 -3
  59. package/dist/dev/presets/audio/skin.css +1 -3
  60. package/dist/dev/presets/live-audio/minimal-skin.css +1 -3
  61. package/dist/dev/presets/live-audio/skin.css +1 -3
  62. package/dist/dev/presets/live-video/minimal-skin.css +2 -31
  63. package/dist/dev/presets/live-video/minimal-skin.js +2 -6
  64. package/dist/dev/presets/live-video/minimal-skin.js.map +1 -1
  65. package/dist/dev/presets/live-video/minimal-skin.tailwind.js +2 -6
  66. package/dist/dev/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  67. package/dist/dev/presets/live-video/skin.css +2 -33
  68. package/dist/dev/presets/live-video/skin.js +2 -6
  69. package/dist/dev/presets/live-video/skin.js.map +1 -1
  70. package/dist/dev/presets/live-video/skin.tailwind.js +2 -6
  71. package/dist/dev/presets/live-video/skin.tailwind.js.map +1 -1
  72. package/dist/dev/presets/types.d.ts +0 -2
  73. package/dist/dev/presets/types.d.ts.map +1 -1
  74. package/dist/dev/presets/video/minimal-skin.css +2 -31
  75. package/dist/dev/presets/video/minimal-skin.js +2 -6
  76. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  77. package/dist/dev/presets/video/minimal-skin.tailwind.js +2 -6
  78. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  79. package/dist/dev/presets/video/skin.css +2 -33
  80. package/dist/dev/presets/video/skin.js +2 -6
  81. package/dist/dev/presets/video/skin.js.map +1 -1
  82. package/dist/dev/presets/video/skin.tailwind.js +2 -6
  83. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  84. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +1 -1
  85. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  86. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js +2 -2
  87. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  88. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +1 -7
  89. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  90. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +1 -10
  91. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  92. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  93. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  94. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js +2 -2
  95. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  96. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +1 -7
  97. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  98. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -10
  99. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  100. package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -1
  101. package/dist/dev/ui/thumbnail/thumbnail.js +18 -1
  102. package/dist/dev/ui/thumbnail/thumbnail.js.map +1 -1
  103. package/dist/dev/ui/title/index.d.ts +2 -0
  104. package/dist/dev/ui/title/index.js +2 -0
  105. package/dist/dev/ui/title/title.d.ts +27 -0
  106. package/dist/dev/ui/title/title.d.ts.map +1 -0
  107. package/dist/dev/ui/title/title.js +47 -0
  108. package/dist/dev/ui/title/title.js.map +1 -0
  109. package/docs/README.md +1 -1
  110. package/docs/concepts/presets.md +4 -4
  111. package/docs/concepts/skins.md +8 -48
  112. package/docs/how-to/add-a-poster-placeholder.md +133 -0
  113. package/docs/how-to/customize-skins.md +10 -92
  114. package/docs/how-to/migrate-from-mux-player.md +14 -8
  115. package/docs/llms.txt +3 -0
  116. package/docs/reference/feature-fullscreen.md +9 -8
  117. package/docs/reference/feature-metadata.md +129 -0
  118. package/docs/reference/feature-orientation-lock.md +94 -8
  119. package/docs/reference/feature-text-tracks.md +10 -0
  120. package/docs/reference/menu.md +0 -1
  121. package/docs/reference/thumbnail.md +4 -0
  122. package/docs/reference/title.md +208 -0
  123. package/package.json +8 -8
@@ -0,0 +1,208 @@
1
+ # Title
2
+
3
+ Displays the resolved content title for the current media
4
+
5
+ ## Anatomy
6
+
7
+ tsx
8
+
9
+ ```
10
+ <Title />
11
+ ```
12
+
13
+ ## Behavior
14
+
15
+ The component shows the name of what is playing. It writes its own text, so set the title on the player instead of passing children.
16
+
17
+ tsx
18
+
19
+ ```
20
+ <Player title="Big Buck Bunny">
21
+ <Container>
22
+ <Video src="video.mp4" />
23
+ <Title />
24
+ </Container>
25
+ </Player>
26
+ ```
27
+
28
+ A title can come from two places. The player uses the first one that has a value:
29
+
30
+ 1. The title you set on the player.
31
+ 2. The title the media reports about itself.
32
+
33
+ If neither has a value, there is nothing to show and the title hides itself.
34
+
35
+ The title is player input, not player state, so change it the way you set it in the first place. The store exposes the resolved `title` to read, and nothing to write.
36
+
37
+ tsx
38
+
39
+ ```
40
+ const [title, setTitle] = useState("Big Buck Bunny");
41
+
42
+ <Player title={title}>...</Player>;
43
+ ```
44
+
45
+ Set it to `null` to hand the title back to the media.
46
+
47
+ The title shows whenever there is a title to show. It does not follow the controls or playback on its own — when you want it to come and go with the controls, style it against the controls in your own layout, the same way you would any other piece of chrome.
48
+
49
+ ## Styling
50
+
51
+ React renders a `<span>`, or nothing at all when no title resolves. Add a `className` to style it:
52
+
53
+ css
54
+
55
+ ```
56
+ .title {
57
+ opacity: 0;
58
+ transition: opacity 150ms ease-out;
59
+ }
60
+ ```
61
+
62
+ To fade the title in and out with the controls, style it against a sibling `Controls` rather than reaching for state on the title itself:
63
+
64
+ css
65
+
66
+ ```
67
+ .controls[data-visible] ~ .title {
68
+ opacity: 1;
69
+ }
70
+ ```
71
+
72
+ `className` and `style` also accept a function of component state when you would rather branch in JavaScript than in CSS:
73
+
74
+ tsx
75
+
76
+ ```
77
+ <Title className={(state) => (state.title.length > 40 ? "title title--long" : "title")} />
78
+ ```
79
+
80
+ ## Accessibility
81
+
82
+ The title is ordinary text, so it reaches assistive technology as content with no ARIA of its own. The native `hidden` attribute it sets when there is no title also removes it from the accessibility tree, so nothing is announced when there is nothing to announce.
83
+
84
+ Fading the title out with `opacity` leaves it readable by a screen reader while it is not painted. That is deliberate — the name of what is playing stays relevant whether or not the controls happen to be on screen.
85
+
86
+ The component does not name the player. To give the player region an accessible name, set `aria-label` or `aria-labelledby` on the container yourself.
87
+
88
+ ## Examples
89
+
90
+ ### Basic Usage
91
+
92
+ Big Buck BunnyPlay
93
+
94
+ App.tsx
95
+
96
+ App.css
97
+
98
+ ```
99
+ import { Container, createPlayer, PlayButton, Title } from '@videojs/react';
100
+ import { Video, videoFeatures } from '@videojs/react/video';
101
+
102
+ import './BasicUsage.css';
103
+
104
+ const { Player } = createPlayer({ features: videoFeatures });
105
+
106
+ export default function BasicUsage() {
107
+ return (
108
+ <Player title="Big Buck Bunny">
109
+ <Container className="react-title-basic">
110
+ <Video loop muted playsInline src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4" />
111
+ <Title className="react-title-basic__title" />
112
+ <PlayButton
113
+ className="react-title-basic__button"
114
+ render={(props, state) => <button {...props}>{state.paused ? 'Play' : 'Pause'}</button>}
115
+ />
116
+ </Container>
117
+ </Player>
118
+ );
119
+ }
120
+ ```
121
+ ```
122
+ .react-title-basic {
123
+ position: relative;
124
+ display: block;
125
+ }
126
+
127
+ .react-title-basic video {
128
+ display: block;
129
+ width: 100%;
130
+ }
131
+
132
+ /* React renders nothing until a title resolves, so the gradient never sits
133
+ over empty space without this demo doing anything. */
134
+ .react-title-basic__title {
135
+ position: absolute;
136
+ inset-inline: 0;
137
+ top: 0;
138
+ padding: 16px 20px 48px;
139
+ font-size: 16px;
140
+ font-weight: 500;
141
+ color: white;
142
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
143
+ pointer-events: none;
144
+ background: linear-gradient(to bottom, rgba(0, 0, 0, 0.7), transparent);
145
+ }
146
+
147
+ .react-title-basic__button {
148
+ position: absolute;
149
+ bottom: 10px;
150
+ left: 10px;
151
+ padding-block: 8px;
152
+ padding-inline: 20px;
153
+ color: black;
154
+ cursor: pointer;
155
+ background: rgba(255, 255, 255, 0.7);
156
+ border: 1px solid rgba(255, 255, 255, 0.3);
157
+ border-radius: 9999px;
158
+ backdrop-filter: blur(10px);
159
+ }
160
+ ```
161
+
162
+ ## API Reference
163
+
164
+ ### State
165
+
166
+ State is accessible via the `render`, `className`, and `style` props.
167
+
168
+ Property
169
+
170
+ Type
171
+
172
+ Details
173
+
174
+ `title`
175
+
176
+ `string`
177
+
178
+
179
+
180
+ Description
181
+
182
+ The resolved content title. Empty when no source supplied one.
183
+
184
+ `hidden`
185
+
186
+ `boolean`
187
+
188
+
189
+
190
+ Description
191
+
192
+ Whether the component is hidden because no title is available.
193
+
194
+ ### Data attributes
195
+
196
+ Attribute
197
+
198
+ Type
199
+
200
+ Details
201
+
202
+ `data-hidden`
203
+
204
+
205
+
206
+ Description
207
+
208
+ Present when the element is hidden because no title is available.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@videojs/react",
3
3
  "type": "module",
4
- "version": "10.0.0-beta.29",
4
+ "version": "10.0.0-beta.30",
5
5
  "description": "React library for building media players",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
@@ -132,11 +132,11 @@
132
132
  "react-dom": "^18.0.0 || ^19.0.0"
133
133
  },
134
134
  "dependencies": {
135
- "@videojs/core": "10.0.0-beta.29",
136
- "@videojs/spf": "10.0.0-beta.29",
137
- "@videojs/store": "10.0.0-beta.29",
138
- "@videojs/utils": "10.0.0-beta.29",
139
- "@videojs/media": "10.0.0-beta.29"
135
+ "@videojs/core": "10.0.0-beta.30",
136
+ "@videojs/spf": "10.0.0-beta.30",
137
+ "@videojs/media": "10.0.0-beta.30",
138
+ "@videojs/store": "10.0.0-beta.30",
139
+ "@videojs/utils": "10.0.0-beta.30"
140
140
  },
141
141
  "devDependencies": {
142
142
  "@testing-library/react": "^16.3.0",
@@ -148,8 +148,8 @@
148
148
  "typescript": "6.0.2",
149
149
  "vitest": "^4.1.10",
150
150
  "vjsc": "0.0.0",
151
- "@videojs/icons": "10.0.0-beta.29",
152
- "@videojs/skins": "10.0.0-beta.29"
151
+ "@videojs/icons": "10.0.0-beta.30",
152
+ "@videojs/skins": "10.0.0-beta.30"
153
153
  },
154
154
  "publishConfig": {
155
155
  "access": "public"