@streamplace/components 0.7.3 → 0.7.7

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 (85) hide show
  1. package/dist/components/chat/chat-box.js +212 -24
  2. package/dist/components/chat/chat-message.js +5 -5
  3. package/dist/components/chat/chat.js +83 -5
  4. package/dist/components/chat/emoji-suggestions.js +35 -0
  5. package/dist/components/chat/mod-view.js +59 -8
  6. package/dist/components/chat/system-message.js +19 -0
  7. package/dist/components/icons/bluesky-icon.js +9 -0
  8. package/dist/components/keep-awake.js +7 -0
  9. package/dist/components/keep-awake.native.js +16 -0
  10. package/dist/components/mobile-player/fullscreen.js +2 -1
  11. package/dist/components/mobile-player/fullscreen.native.js +3 -3
  12. package/dist/components/mobile-player/player.js +15 -30
  13. package/dist/components/mobile-player/ui/index.js +2 -1
  14. package/dist/components/mobile-player/ui/report-modal.js +90 -0
  15. package/dist/components/mobile-player/ui/{loading.js → streamer-loading-overlay.js} +1 -1
  16. package/dist/components/mobile-player/ui/viewer-context-menu.js +20 -1
  17. package/dist/components/mobile-player/ui/viewer-loading-overlay.js +49 -0
  18. package/dist/components/mobile-player/use-webrtc.js +7 -1
  19. package/dist/components/mobile-player/video-retry.js +29 -0
  20. package/dist/components/mobile-player/video.js +84 -9
  21. package/dist/components/mobile-player/video.native.js +24 -10
  22. package/dist/components/share/sharesheet.js +91 -0
  23. package/dist/components/ui/dialog.js +1 -1
  24. package/dist/components/ui/dropdown.js +6 -6
  25. package/dist/components/ui/index.js +2 -0
  26. package/dist/components/ui/primitives/modal.js +0 -1
  27. package/dist/components/ui/slider.js +5 -0
  28. package/dist/hooks/index.js +1 -0
  29. package/dist/hooks/usePointerDevice.js +71 -0
  30. package/dist/index.js +10 -3
  31. package/dist/lib/system-messages.js +101 -0
  32. package/dist/livestream-store/chat.js +111 -18
  33. package/dist/livestream-store/livestream-store.js +3 -0
  34. package/dist/livestream-store/problems.js +76 -0
  35. package/dist/livestream-store/websocket-consumer.js +39 -4
  36. package/dist/player-store/player-store.js +30 -4
  37. package/dist/streamplace-store/block.js +51 -12
  38. package/dist/ui/index.js +79 -0
  39. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/37be0eec +0 -0
  40. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/56540125 +0 -0
  41. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/67b1eb60 +0 -0
  42. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/7c275f90 +0 -0
  43. package/package.json +6 -2
  44. package/src/components/chat/chat-box.tsx +295 -25
  45. package/src/components/chat/chat-message.tsx +6 -7
  46. package/src/components/chat/chat.tsx +192 -41
  47. package/src/components/chat/emoji-suggestions.tsx +94 -0
  48. package/src/components/chat/mod-view.tsx +119 -40
  49. package/src/components/chat/system-message.tsx +38 -0
  50. package/src/components/icons/bluesky-icon.tsx +9 -0
  51. package/src/components/keep-awake.native.tsx +13 -0
  52. package/src/components/keep-awake.tsx +3 -0
  53. package/src/components/mobile-player/fullscreen.native.tsx +12 -3
  54. package/src/components/mobile-player/fullscreen.tsx +10 -3
  55. package/src/components/mobile-player/player.tsx +28 -36
  56. package/src/components/mobile-player/props.tsx +1 -0
  57. package/src/components/mobile-player/ui/index.ts +2 -1
  58. package/src/components/mobile-player/ui/report-modal.tsx +195 -0
  59. package/src/components/mobile-player/ui/{loading.tsx → streamer-loading-overlay.tsx} +1 -1
  60. package/src/components/mobile-player/ui/viewer-context-menu.tsx +31 -3
  61. package/src/components/mobile-player/ui/viewer-loading-overlay.tsx +66 -0
  62. package/src/components/mobile-player/use-webrtc.tsx +10 -2
  63. package/src/components/mobile-player/video-retry.tsx +28 -0
  64. package/src/components/mobile-player/video.native.tsx +24 -10
  65. package/src/components/mobile-player/video.tsx +100 -21
  66. package/src/components/share/sharesheet.tsx +185 -0
  67. package/src/components/ui/dialog.tsx +1 -1
  68. package/src/components/ui/dropdown.tsx +13 -13
  69. package/src/components/ui/index.ts +2 -0
  70. package/src/components/ui/primitives/modal.tsx +0 -1
  71. package/src/components/ui/slider.tsx +1 -0
  72. package/src/hooks/index.ts +1 -0
  73. package/src/hooks/usePointerDevice.ts +89 -0
  74. package/src/index.tsx +11 -2
  75. package/src/lib/system-messages.ts +135 -0
  76. package/src/livestream-store/chat.tsx +145 -17
  77. package/src/livestream-store/livestream-state.tsx +10 -0
  78. package/src/livestream-store/livestream-store.tsx +3 -0
  79. package/src/livestream-store/problems.tsx +96 -0
  80. package/src/livestream-store/websocket-consumer.tsx +44 -4
  81. package/src/player-store/player-state.tsx +21 -4
  82. package/src/player-store/player-store.tsx +38 -5
  83. package/src/streamplace-store/block.tsx +55 -13
  84. package/src/ui/index.ts +86 -0
  85. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findProblems = void 0;
4
+ const VARIANCE_THRESHOLD = 0.5;
5
+ const DURATION_THRESHOLD = 5000000000; // 5s in ns
6
+ const detectVariableSegmentLength = (segments) => {
7
+ if (segments.length < 3) {
8
+ // Need at least 3 segments to detect variability
9
+ return { variable: false, duration: false };
10
+ }
11
+ const durations = segments
12
+ .map((segment) => segment.duration)
13
+ .filter((duration) => duration !== undefined && duration > 0);
14
+ if (durations.length < 3) {
15
+ return { variable: false, duration: false };
16
+ }
17
+ // Calculate mean
18
+ const mean = durations.reduce((sum, duration) => sum + duration, 0) /
19
+ durations.length;
20
+ // Calculate standard deviation
21
+ const variance = durations.reduce((sum, duration) => {
22
+ const diff = duration - mean;
23
+ return sum + diff * diff;
24
+ }, 0) / durations.length;
25
+ const stdDev = Math.sqrt(variance);
26
+ // Calculate coefficient of variation (CV)
27
+ const cv = stdDev / mean;
28
+ // CV > 0.5 indicates high variability
29
+ // This threshold can be adjusted based on testing
30
+ return {
31
+ variable: cv > VARIANCE_THRESHOLD,
32
+ duration: mean > DURATION_THRESHOLD,
33
+ };
34
+ };
35
+ const findProblems = (segments) => {
36
+ const problems = [];
37
+ let hasBFrames = false;
38
+ for (const segment of segments) {
39
+ const video = segment.video?.[0];
40
+ if (!video) {
41
+ // i mean yes this is a problem but it can't happen yet
42
+ continue;
43
+ }
44
+ if (video.bframes === true) {
45
+ hasBFrames = true;
46
+ break;
47
+ }
48
+ }
49
+ if (hasBFrames) {
50
+ problems.push({
51
+ code: "bframes",
52
+ message: "Your stream contains B-Frames, which are not supported in Streamplace. Your stream will stutter.",
53
+ severity: "error",
54
+ link: "https://stream.place/docs/guides/start-streaming/obs/#obs-configuration",
55
+ });
56
+ }
57
+ const { variable, duration } = detectVariableSegmentLength(segments);
58
+ if (variable) {
59
+ problems.push({
60
+ code: "variable_segment_length",
61
+ message: "Your stream contains variable segment lengths, which may cause playback issues.",
62
+ severity: "warning",
63
+ link: "https://stream.place/docs/guides/start-streaming/obs/#obs-configuration",
64
+ });
65
+ }
66
+ if (duration) {
67
+ problems.push({
68
+ code: "long_segments",
69
+ message: "Your stream contains long segments (>5s). This will work fine, but increases the delay of the livestream.",
70
+ severity: "warning",
71
+ link: "https://stream.place/docs/guides/start-streaming/obs/#obs-configuration",
72
+ });
73
+ }
74
+ return problems;
75
+ };
76
+ exports.findProblems = findProblems;
@@ -3,13 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handleWebSocketMessages = void 0;
4
4
  const api_1 = require("@atproto/api");
5
5
  const streamplace_1 = require("streamplace");
6
+ const system_messages_1 = require("../lib/system-messages");
6
7
  const chat_1 = require("./chat");
8
+ const problems_1 = require("./problems");
9
+ const MAX_RECENT_SEGMENTS = 10;
7
10
  const handleWebSocketMessages = (state, messages) => {
8
11
  for (const message of messages) {
9
12
  if (streamplace_1.PlaceStreamLivestream.isLivestreamView(message)) {
13
+ const newLivestream = message;
14
+ const oldLivestream = state.livestream;
15
+ // check if this is actually new
16
+ if (!oldLivestream || oldLivestream.uri !== newLivestream.uri) {
17
+ const streamTitle = newLivestream.record.title || "something cool!";
18
+ const systemMessage = system_messages_1.SystemMessages.streamStart(streamTitle);
19
+ // set proper times
20
+ systemMessage.indexedAt = newLivestream.indexedAt;
21
+ systemMessage.record.createdAt = newLivestream.record.createdAt;
22
+ state = (0, chat_1.reduceChat)(state, [systemMessage], []);
23
+ }
10
24
  state = {
11
25
  ...state,
12
- livestream: message,
26
+ livestream: newLivestream,
13
27
  };
14
28
  }
15
29
  else if (streamplace_1.PlaceStreamLivestream.isViewerCount(message)) {
@@ -28,18 +42,26 @@ const handleWebSocketMessages = (state, messages) => {
28
42
  indexedAt: message.indexedAt,
29
43
  chatProfile: message.chatProfile,
30
44
  replyTo: message.replyTo,
45
+ deleted: message.deleted,
31
46
  };
32
- state = (0, chat_1.reduceChat)(state, [hydrated], []);
47
+ state = (0, chat_1.reduceChat)(state, [hydrated], [], []);
33
48
  }
34
49
  else if (streamplace_1.PlaceStreamSegment.isRecord(message)) {
50
+ const newRecentSegments = [...state.recentSegments];
51
+ newRecentSegments.unshift(message);
52
+ if (newRecentSegments.length > MAX_RECENT_SEGMENTS) {
53
+ newRecentSegments.pop();
54
+ }
35
55
  state = {
36
56
  ...state,
37
57
  segment: message,
58
+ recentSegments: newRecentSegments,
59
+ problems: (0, problems_1.findProblems)(newRecentSegments),
38
60
  };
39
61
  }
40
62
  else if (streamplace_1.PlaceStreamDefs.isBlockView(message)) {
41
63
  const block = message;
42
- state = (0, chat_1.reduceChat)(state, [], [block]);
64
+ state = (0, chat_1.reduceChat)(state, [], [block], []);
43
65
  }
44
66
  else if (streamplace_1.PlaceStreamDefs.isRenditions(message)) {
45
67
  state = {
@@ -53,7 +75,20 @@ const handleWebSocketMessages = (state, messages) => {
53
75
  profile: message,
54
76
  };
55
77
  }
78
+ else if (streamplace_1.PlaceStreamChatGate.isRecord(message)) {
79
+ const hideRecord = message;
80
+ const hiddenMessageUri = hideRecord.hiddenMessage;
81
+ const newPendingHides = [...state.pendingHides];
82
+ if (!newPendingHides.includes(hiddenMessageUri)) {
83
+ newPendingHides.push(hiddenMessageUri);
84
+ }
85
+ state = {
86
+ ...state,
87
+ pendingHides: newPendingHides,
88
+ };
89
+ state = (0, chat_1.reduceChat)(state, [], [], [hiddenMessageUri]);
90
+ }
56
91
  }
57
- return (0, chat_1.reduceChat)(state, [], []);
92
+ return (0, chat_1.reduceChat)(state, [], [], []);
58
93
  };
59
94
  exports.handleWebSocketMessages = handleWebSocketMessages;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.intoPlayerProtocol = exports.usePlayerProtocol = exports.makePlayerStore = void 0;
3
+ exports.useOffline = exports.intoPlayerProtocol = exports.usePlayerProtocol = exports.makePlayerStore = void 0;
4
4
  exports.usePlayerContext = usePlayerContext;
5
5
  exports.getPlayerStoreById = getPlayerStoreById;
6
6
  exports.getFirstPlayerID = getFirstPlayerID;
@@ -8,6 +8,7 @@ exports.getPlayerStoreFromContext = getPlayerStoreFromContext;
8
8
  exports.usePlayerStore = usePlayerStore;
9
9
  const react_1 = require("react");
10
10
  const zustand_1 = require("zustand");
11
+ const livestream_store_1 = require("../livestream-store");
11
12
  const context_1 = require("./context");
12
13
  const player_state_1 = require("./player-state");
13
14
  const makePlayerStore = (id) => {
@@ -41,8 +42,6 @@ const makePlayerStore = (id) => {
41
42
  setStatus: (status) => set(() => ({ status })),
42
43
  playTime: 0,
43
44
  setPlayTime: (playTime) => set(() => ({ playTime })),
44
- offline: false,
45
- setOffline: (offline) => set(() => ({ offline })),
46
45
  videoRef: undefined,
47
46
  setVideoRef: (videoRef) => set(() => ({ videoRef })),
48
47
  pipMode: false,
@@ -68,6 +67,8 @@ const makePlayerStore = (id) => {
68
67
  setTelemetry: (telemetry) => set(() => ({ telemetry })),
69
68
  ingestLive: false,
70
69
  setIngestLive: (ingestLive) => set(() => ({ ingestLive })),
70
+ reportingURL: null,
71
+ setReportingURL: (reportingURL) => set(() => ({ reportingURL })),
71
72
  playerEvent: async (url, time, eventType, meta) => set((x) => {
72
73
  const data = {
73
74
  time: time,
@@ -79,7 +80,8 @@ const makePlayerStore = (id) => {
79
80
  };
80
81
  try {
81
82
  // fetch url from sp provider
82
- fetch(`${url}/api/player-event`, {
83
+ const reportingURL = x.reportingURL ?? `${url}/api/player-event`;
84
+ fetch(reportingURL, {
83
85
  method: "POST",
84
86
  body: JSON.stringify(data),
85
87
  });
@@ -109,6 +111,10 @@ const makePlayerStore = (id) => {
109
111
  setShowDebugInfo: (showDebugInfo) => set(() => ({ showDebugInfo })),
110
112
  modMessage: null,
111
113
  setModMessage: (modMessage) => set(() => ({ modMessage })),
114
+ reportModalOpen: false,
115
+ setReportModalOpen: (reportModalOpen) => set(() => ({ reportModalOpen })),
116
+ reportSubject: null,
117
+ setReportSubject: (subject) => set(() => ({ reportSubject: subject })),
112
118
  }));
113
119
  };
114
120
  exports.makePlayerStore = makePlayerStore;
@@ -171,3 +177,23 @@ const intoPlayerProtocol = (protocol) => {
171
177
  }
172
178
  };
173
179
  exports.intoPlayerProtocol = intoPlayerProtocol;
180
+ // returns true if the livestream has been offline for more than 10 seconds and we're not playing
181
+ const useOffline = () => {
182
+ const status = usePlayerStore((x) => x.status);
183
+ const segment = (0, livestream_store_1.useLivestreamStore)((x) => x.segment);
184
+ const [now, setNow] = (0, react_1.useState)(Date.now());
185
+ (0, react_1.useEffect)(() => {
186
+ const interval = setInterval(() => {
187
+ setNow(Date.now());
188
+ }, 500);
189
+ return () => clearInterval(interval);
190
+ }, []);
191
+ if (status === player_state_1.PlayerStatus.PLAYING) {
192
+ return false;
193
+ }
194
+ if (!segment?.startTime) {
195
+ return false;
196
+ }
197
+ return now - Date.parse(segment.startTime) > 10000;
198
+ };
199
+ exports.useOffline = useOffline;
@@ -1,26 +1,65 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useCreateBlockRecord = useCreateBlockRecord;
4
+ exports.useCreateHideChatRecord = useCreateHideChatRecord;
5
+ const react_1 = require("react");
4
6
  const xrpc_1 = require("./xrpc");
5
7
  function useCreateBlockRecord() {
6
8
  let agent = (0, xrpc_1.usePDSAgent)();
7
- return async (subjectDID) => {
9
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
10
+ const createBlock = async (subjectDID) => {
8
11
  if (!agent) {
9
12
  throw new Error("No PDS agent found");
10
13
  }
11
14
  if (!agent.did) {
12
15
  throw new Error("No user DID found, assuming not logged in");
13
16
  }
14
- const record = {
15
- $type: "app.bsky.graph.block",
16
- subject: subjectDID,
17
- createdAt: new Date().toISOString(),
18
- };
19
- return await agent.com.atproto.repo.createRecord({
20
- repo: agent.did,
21
- collection: "app.bsky.graph.block",
22
- record,
23
- });
24
- return record;
17
+ setIsLoading(true);
18
+ try {
19
+ const record = {
20
+ $type: "app.bsky.graph.block",
21
+ subject: subjectDID,
22
+ createdAt: new Date().toISOString(),
23
+ };
24
+ const result = await agent.com.atproto.repo.createRecord({
25
+ repo: agent.did,
26
+ collection: "app.bsky.graph.block",
27
+ record,
28
+ });
29
+ return result;
30
+ }
31
+ finally {
32
+ setIsLoading(false);
33
+ }
34
+ };
35
+ return { createBlock, isLoading };
36
+ }
37
+ function useCreateHideChatRecord() {
38
+ let agent = (0, xrpc_1.usePDSAgent)();
39
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
40
+ const createHideChat = async (chatMessageUri) => {
41
+ if (!agent) {
42
+ throw new Error("No PDS agent found");
43
+ }
44
+ if (!agent.did) {
45
+ throw new Error("No user DID found, assuming not logged in");
46
+ }
47
+ setIsLoading(true);
48
+ try {
49
+ const record = {
50
+ $type: "place.stream.chat.gate",
51
+ hiddenMessage: chatMessageUri,
52
+ };
53
+ const result = await agent.com.atproto.repo.createRecord({
54
+ repo: agent.did,
55
+ collection: "place.stream.chat.gate",
56
+ record,
57
+ });
58
+ return result;
59
+ }
60
+ finally {
61
+ setIsLoading(false);
62
+ }
25
63
  };
64
+ return { createHideChat, isLoading };
26
65
  }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * @streamplace/components/ui - Streamplace ZeroCSS
4
+ *
5
+ * Clean export path for ZeroCSS styling utilities, design tokens, and atomic styles.
6
+ * ZeroCSS provides a zero-config, atomic styling system optimized for React Native.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.atomsNS = exports.theme = exports.useTheme = exports.usePlatformTypography = exports.lightTheme = exports.darkTheme = exports.createThemedStyles = exports.createThemeStyles = exports.createThemeIcons = exports.createThemeColors = exports.ThemeProvider = exports.responsiveValue = exports.platformStyle = exports.mergeStyles = exports.debounce = exports.typography = exports.spacing = exports.shadows = exports.colors = exports.breakpoints = exports.borderRadius = exports.w = exports.top = exports.text = exports.right = exports.r = exports.py = exports.px = exports.pt = exports.pr = exports.position = exports.pl = exports.pb = exports.p = exports.my = exports.mx = exports.mt = exports.mr = exports.ml = exports.mb = exports.m = exports.left = exports.layout = exports.h = exports.gap = exports.flex = exports.bottom = exports.borders = exports.bg = exports.atoms = void 0;
10
+ exports.utils = exports.tokens = void 0;
11
+ const tslib_1 = require("tslib");
12
+ // Export the most commonly used ZeroCSS utilities
13
+ var atoms_1 = require("../lib/theme/atoms");
14
+ // Core atoms object
15
+ Object.defineProperty(exports, "atoms", { enumerable: true, get: function () { return atoms_1.atoms; } });
16
+ // Common shorthand utilities
17
+ Object.defineProperty(exports, "bg", { enumerable: true, get: function () { return atoms_1.bg; } });
18
+ // Border utilities
19
+ Object.defineProperty(exports, "borders", { enumerable: true, get: function () { return atoms_1.borders; } });
20
+ Object.defineProperty(exports, "bottom", { enumerable: true, get: function () { return atoms_1.bottom; } });
21
+ // Flex utilities
22
+ Object.defineProperty(exports, "flex", { enumerable: true, get: function () { return atoms_1.flex; } });
23
+ // Gap utilities (React Native 0.71+)
24
+ Object.defineProperty(exports, "gap", { enumerable: true, get: function () { return atoms_1.gap; } });
25
+ Object.defineProperty(exports, "h", { enumerable: true, get: function () { return atoms_1.h; } });
26
+ // Layout utilities
27
+ Object.defineProperty(exports, "layout", { enumerable: true, get: function () { return atoms_1.layout; } });
28
+ Object.defineProperty(exports, "left", { enumerable: true, get: function () { return atoms_1.left; } });
29
+ Object.defineProperty(exports, "m", { enumerable: true, get: function () { return atoms_1.m; } });
30
+ Object.defineProperty(exports, "mb", { enumerable: true, get: function () { return atoms_1.mb; } });
31
+ Object.defineProperty(exports, "ml", { enumerable: true, get: function () { return atoms_1.ml; } });
32
+ Object.defineProperty(exports, "mr", { enumerable: true, get: function () { return atoms_1.mr; } });
33
+ Object.defineProperty(exports, "mt", { enumerable: true, get: function () { return atoms_1.mt; } });
34
+ Object.defineProperty(exports, "mx", { enumerable: true, get: function () { return atoms_1.mx; } });
35
+ Object.defineProperty(exports, "my", { enumerable: true, get: function () { return atoms_1.my; } });
36
+ Object.defineProperty(exports, "p", { enumerable: true, get: function () { return atoms_1.p; } });
37
+ Object.defineProperty(exports, "pb", { enumerable: true, get: function () { return atoms_1.pb; } });
38
+ Object.defineProperty(exports, "pl", { enumerable: true, get: function () { return atoms_1.pl; } });
39
+ // Position utilities
40
+ Object.defineProperty(exports, "position", { enumerable: true, get: function () { return atoms_1.position; } });
41
+ Object.defineProperty(exports, "pr", { enumerable: true, get: function () { return atoms_1.pr; } });
42
+ Object.defineProperty(exports, "pt", { enumerable: true, get: function () { return atoms_1.pt; } });
43
+ Object.defineProperty(exports, "px", { enumerable: true, get: function () { return atoms_1.px; } });
44
+ Object.defineProperty(exports, "py", { enumerable: true, get: function () { return atoms_1.py; } });
45
+ Object.defineProperty(exports, "r", { enumerable: true, get: function () { return atoms_1.r; } });
46
+ Object.defineProperty(exports, "right", { enumerable: true, get: function () { return atoms_1.right; } });
47
+ Object.defineProperty(exports, "text", { enumerable: true, get: function () { return atoms_1.text; } });
48
+ Object.defineProperty(exports, "top", { enumerable: true, get: function () { return atoms_1.top; } });
49
+ Object.defineProperty(exports, "w", { enumerable: true, get: function () { return atoms_1.w; } });
50
+ // Export ZeroCSS design tokens
51
+ var tokens_1 = require("../lib/theme/tokens");
52
+ Object.defineProperty(exports, "borderRadius", { enumerable: true, get: function () { return tokens_1.borderRadius; } });
53
+ Object.defineProperty(exports, "breakpoints", { enumerable: true, get: function () { return tokens_1.breakpoints; } });
54
+ Object.defineProperty(exports, "colors", { enumerable: true, get: function () { return tokens_1.colors; } });
55
+ Object.defineProperty(exports, "shadows", { enumerable: true, get: function () { return tokens_1.shadows; } });
56
+ Object.defineProperty(exports, "spacing", { enumerable: true, get: function () { return tokens_1.spacing; } });
57
+ Object.defineProperty(exports, "typography", { enumerable: true, get: function () { return tokens_1.typography; } });
58
+ // Export ZeroCSS utility functions
59
+ var utils_1 = require("../lib/utils");
60
+ Object.defineProperty(exports, "debounce", { enumerable: true, get: function () { return utils_1.debounce; } });
61
+ Object.defineProperty(exports, "mergeStyles", { enumerable: true, get: function () { return utils_1.mergeStyles; } });
62
+ Object.defineProperty(exports, "platformStyle", { enumerable: true, get: function () { return utils_1.platformStyle; } });
63
+ Object.defineProperty(exports, "responsiveValue", { enumerable: true, get: function () { return utils_1.responsiveValue; } });
64
+ // Export ZeroCSS theme system
65
+ var theme_1 = require("../lib/theme/theme");
66
+ Object.defineProperty(exports, "ThemeProvider", { enumerable: true, get: function () { return theme_1.ThemeProvider; } });
67
+ Object.defineProperty(exports, "createThemeColors", { enumerable: true, get: function () { return theme_1.createThemeColors; } });
68
+ Object.defineProperty(exports, "createThemeIcons", { enumerable: true, get: function () { return theme_1.createThemeIcons; } });
69
+ Object.defineProperty(exports, "createThemeStyles", { enumerable: true, get: function () { return theme_1.createThemeStyles; } });
70
+ Object.defineProperty(exports, "createThemedStyles", { enumerable: true, get: function () { return theme_1.createThemedStyles; } });
71
+ Object.defineProperty(exports, "darkTheme", { enumerable: true, get: function () { return theme_1.darkTheme; } });
72
+ Object.defineProperty(exports, "lightTheme", { enumerable: true, get: function () { return theme_1.lightTheme; } });
73
+ Object.defineProperty(exports, "usePlatformTypography", { enumerable: true, get: function () { return theme_1.usePlatformTypography; } });
74
+ Object.defineProperty(exports, "useTheme", { enumerable: true, get: function () { return theme_1.useTheme; } });
75
+ // Namespace exports for power users
76
+ exports.theme = tslib_1.__importStar(require("../lib/theme"));
77
+ exports.atomsNS = tslib_1.__importStar(require("../lib/theme/atoms"));
78
+ exports.tokens = tslib_1.__importStar(require("../lib/theme/tokens"));
79
+ exports.utils = tslib_1.__importStar(require("../lib/utils"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamplace/components",
3
- "version": "0.7.3",
3
+ "version": "0.7.7",
4
4
  "description": "Streamplace React (Native) Components",
5
5
  "main": "dist/index.js",
6
6
  "types": "src/index.tsx",
@@ -28,11 +28,14 @@
28
28
  "dependencies": {
29
29
  "@atproto/api": "^0.15.7",
30
30
  "@atproto/crypto": "^0.4.4",
31
+ "@emoji-mart/react": "^1.1.1",
31
32
  "@gorhom/bottom-sheet": "^5.1.6",
32
33
  "@react-navigation/native": "^6.1.18",
33
34
  "@rn-primitives/dropdown-menu": "^1.2.0",
34
35
  "@rn-primitives/portal": "^1.3.0",
36
+ "@rn-primitives/slider": "^1.2.0",
35
37
  "class-variance-authority": "^0.6.1",
38
+ "expo-keep-awake": "~14.1.4",
36
39
  "expo-video": "~2.2.1",
37
40
  "hls.js": "^1.5.17",
38
41
  "lucide-react-native": "^0.514.0",
@@ -41,6 +44,7 @@
41
44
  "react-native-gesture-handler": "~2.26.0",
42
45
  "react-native-reanimated": "~3.18.0",
43
46
  "react-native-safe-area-context": "5.4.1",
47
+ "react-native-svg": "15.12.0",
44
48
  "react-native-webrtc": "git+https://github.com/streamplace/react-native-webrtc.git#6b8472a771ac47f89217d327058a8a4124a6ae56",
45
49
  "react-use-websocket": "^4.13.0",
46
50
  "streamplace": "0.7.2",
@@ -50,5 +54,5 @@
50
54
  "peerDependencies": {
51
55
  "react": "*"
52
56
  },
53
- "gitHead": "70367834f75a94f074bd81299c2e72c36b0dbbf0"
57
+ "gitHead": "8c2cad31c840efeda8aa7f797f91dddbedb95397"
54
58
  }