@xhub-short/ui 0.1.0-beta.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.
package/dist/index.js ADDED
@@ -0,0 +1,687 @@
1
+ export { ACTION_BAR_CSS, CompoundBookmark as ActionBarBookmark, CompoundComment as ActionBarComment, ActionBarHeadless, CompoundLike as ActionBarLike, CompoundShare as ActionBarShare, ActionButton, BookmarkButton, CommentButton, LikeButton, ShareButton } from './chunk-OXY5JHVJ.js';
2
+ export { ErrorBoundary } from './chunk-SSJDO24Q.js';
3
+ export { PROGRESS_BAR_CSS, ProgressBarHeadless, calculateProgress, formatTime } from './chunk-YW23IBKF.js';
4
+ export { Skeleton, SkeletonAvatar, SkeletonText, SkeletonVideo } from './chunk-4MN72OZH.js';
5
+ export { SLOT_ACTIVE_ATTR, SLOT_ACTIVE_DATASET_KEY, SLOT_INDEX_ATTR, SLOT_INDEX_DATASET_KEY, VIDEO_FEED_CLASS_PREFIX, VIDEO_FEED_CSS, VideoFeedContext, VideoFeedHeadless, getSlotIndexFromPosition, useOptionalVideoFeedContext, useVideoFeedContext, useVideoFeedPosition } from './chunk-ZZDQKP4R.js';
6
+ export { BUFFERING_STATE_CLASS, ENDED_CLASS, ERROR_CLASS, ERROR_STATE_CLASS, LOADING_CLASS, LOADING_STATE_ATTR, LOADING_STATE_CLASS, PAUSED_CLASS, PLAYBACK_STATE_ATTR, PLAYER_CLASS, PLAYING_CLASS, POSTER_CLASS, READY_CLASS, VIDEO_CLASS, VIDEO_PLAYER_CSS, Z_INDEX as VIDEO_PLAYER_Z_INDEX, Z_INDEX_CSS_VARS as VIDEO_PLAYER_Z_INDEX_CSS_VARS, VIDEO_TYPE_ATTR, VIDEO_WRAPPER_CLASS, VideoElementError, VideoPlayerHeadless, createFirstFrameCache, firstFrameCache, useAutoFirstFrameCapture, useFirstFrameCapture, useVideoElement } from './chunk-UECU42WC.js';
7
+ export { LOADING_ATTR, LOADING_DATASET_KEY, PLAYER_STATE_ATTR, PLAYER_STATE_DATASET_KEY, SLOT_CLASS, SLOT_ERROR_CLASS, SLOT_LOADING_CLASS, SLOT_PAUSED_CLASS, SLOT_PLAYING_CLASS, VIDEO_ID_ATTR, VIDEO_ID_DATASET_KEY, VIDEO_SLOT_CSS, VIDEO_SLOT_LIKE_ANIMATION_CSS, VideoSlotContext, VideoSlotHeadless, VideoSlotLikeAnimation, VideoSlotOverlay, VideoSlotPoster, VideoSlotSkeleton, Z_INDEX, Z_INDEX_CSS_VARS, useDoubleTap, useOptionalVideoSlotContext, useVideoSlotContext, useVideoSlotIsActive, useVideoSlotIsPlaying, useVideoSlotPlayer, useVideoSlotResource, useVideoSlotVideo } from './chunk-QKQUXR3H.js';
8
+ export { BookmarkFilledIcon, BookmarkIcon, CloseIcon, CommentIcon, HeartFilledIcon, HeartIcon, MoreIcon, MusicIcon, PauseIcon, PlayIcon, ShareIcon, UserCheckIcon, UserPlusIcon, VerifiedIcon, VolumeIcon, VolumeMutedIcon } from './chunk-MMTAPG2C.js';
9
+ export { cn, formatCount, formatCountWithSeparators, isGestureLoaded, loadGesture, parseFormattedCount, preloadGesture } from './chunk-WKX2WBVO.js';
10
+ export { injectComponentCSS, isComponentCSSInjected, removeComponentCSS } from './chunk-UXMA4KJZ.js';
11
+ import { useInsertionEffect } from 'react';
12
+ export { clsx } from 'clsx';
13
+
14
+ // src/styles/css-content.ts
15
+ var CSS_CONTENT = `
16
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
17
+ XHub-short UI Styles - Auto-injected
18
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
19
+
20
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
21
+ FONT LOADING
22
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
23
+
24
+ @import url('https://fonts.googleapis.com/css2?family=Urbanist:wght@400;500;600;700&display=swap');
25
+
26
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
27
+ CSS VARIABLES - Light Mode (Default)
28
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
29
+
30
+ :root {
31
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
32
+ COLOR TOKENS - Light Mode
33
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
34
+ --sv-color-primary: #164c8e;
35
+ --sv-color-primary-alpha: #164c8e5b;
36
+ --sv-color-secondary: #9fc5e9;
37
+ --sv-color-tertiary: #e9f8ff;
38
+ --sv-color-quaternary: #164c8e5b;
39
+
40
+ --sv-color-contrast-positive: #121212;
41
+ --sv-color-contrast-negative: #ffffff;
42
+
43
+ --sv-color-accent: #a2a2a2;
44
+ --sv-color-accent-2: #6b7271;
45
+ --sv-color-accent-stroke: #e5e6e6;
46
+
47
+ --sv-color-error: #ff434e;
48
+ --sv-color-success: #1da031;
49
+ --sv-color-warning: #daa000;
50
+ --sv-color-info: #29c8f0;
51
+
52
+ /* Semantic aliases */
53
+ --sv-color-background: var(--sv-color-contrast-negative);
54
+ --sv-color-text: var(--sv-color-contrast-positive);
55
+ --sv-color-text-secondary: var(--sv-color-accent-2);
56
+ --sv-color-text-muted: var(--sv-color-accent);
57
+ --sv-color-border: var(--sv-color-accent-stroke);
58
+
59
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
60
+ TYPOGRAPHY TOKENS - Mobile (Default)
61
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
62
+ --sv-font-family: 'Urbanist', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
63
+ --sv-font-family-display: 'SF Pro Display', 'Urbanist', system-ui, sans-serif;
64
+
65
+ --sv-font-size-xxs: 10px;
66
+ --sv-font-size-xs: 12px;
67
+ --sv-font-size-sm: 13px;
68
+ --sv-font-size-md: 14px;
69
+ --sv-font-size-lg: 16px;
70
+ --sv-font-size-xl: 20px;
71
+
72
+ --sv-font-weight-regular: 400;
73
+ --sv-font-weight-medium: 500;
74
+ --sv-font-weight-semibold: 600;
75
+ --sv-font-weight-bold: 700;
76
+
77
+ --sv-line-height-tight: 1.2;
78
+ --sv-line-height-normal: 1.4;
79
+ --sv-line-height-relaxed: 1.6;
80
+
81
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
82
+ SPACING TOKENS
83
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
84
+ --sv-spacing-xxs: 2px;
85
+ --sv-spacing-xs: 4px;
86
+ --sv-spacing-sm: 8px;
87
+ --sv-spacing-md: 12px;
88
+ --sv-spacing-lg: 16px;
89
+ --sv-spacing-xl: 24px;
90
+ --sv-spacing-xxl: 32px;
91
+
92
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
93
+ BORDER RADIUS
94
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
95
+ --sv-radius-sm: 4px;
96
+ --sv-radius-md: 8px;
97
+ --sv-radius-lg: 12px;
98
+ --sv-radius-xl: 16px;
99
+ --sv-radius-full: 9999px;
100
+
101
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
102
+ TRANSITIONS
103
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
104
+ --sv-transition-fast: 150ms ease;
105
+ --sv-transition-normal: 250ms ease;
106
+ --sv-transition-slow: 350ms ease;
107
+
108
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
109
+ Z-INDEX LAYERS
110
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
111
+ --sv-z-base: 1;
112
+ --sv-z-video: 1;
113
+ --sv-z-overlay: 10;
114
+ --sv-z-controls: 20;
115
+ --sv-z-modal: 100;
116
+ --sv-z-toast: 1000;
117
+
118
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
119
+ SHADOWS
120
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
121
+ --sv-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
122
+ --sv-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
123
+ --sv-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.15);
124
+ }
125
+
126
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
127
+ CSS VARIABLES - Dark Mode
128
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
129
+
130
+ /* System preference */
131
+ @media (prefers-color-scheme: dark) {
132
+ :root:not([data-theme="light"]) {
133
+ --sv-color-primary: #a6cec7;
134
+ --sv-color-primary-alpha: #164c8e5b;
135
+ --sv-color-secondary: #143a0c;
136
+ --sv-color-tertiary: #252825;
137
+ --sv-color-quaternary: #164c8e5b;
138
+
139
+ --sv-color-contrast-positive: #ffffff;
140
+ --sv-color-contrast-negative: #121212;
141
+
142
+ --sv-color-accent: #6b7271;
143
+ --sv-color-accent-2: #d2dddb;
144
+ --sv-color-accent-stroke: #373737;
145
+
146
+ --sv-color-error: #b62a32;
147
+ --sv-color-success: #20a634;
148
+ --sv-color-warning: #c29823;
149
+ --sv-color-info: #1fa0c0;
150
+
151
+ /* Semantic aliases update automatically */
152
+ --sv-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
153
+ --sv-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.3);
154
+ --sv-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.4);
155
+ }
156
+ }
157
+
158
+ /* Explicit dark mode (override) */
159
+ [data-theme="dark"],
160
+ .dark {
161
+ --sv-color-primary: #a6cec7;
162
+ --sv-color-primary-alpha: #164c8e5b;
163
+ --sv-color-secondary: #143a0c;
164
+ --sv-color-tertiary: #252825;
165
+ --sv-color-quaternary: #164c8e5b;
166
+
167
+ --sv-color-contrast-positive: #ffffff;
168
+ --sv-color-contrast-negative: #121212;
169
+
170
+ --sv-color-accent: #6b7271;
171
+ --sv-color-accent-2: #d2dddb;
172
+ --sv-color-accent-stroke: #373737;
173
+
174
+ --sv-color-error: #b62a32;
175
+ --sv-color-success: #20a634;
176
+ --sv-color-warning: #c29823;
177
+ --sv-color-info: #1fa0c0;
178
+
179
+ --sv-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
180
+ --sv-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.3);
181
+ --sv-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.4);
182
+ }
183
+
184
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
185
+ TABLET BREAKPOINT - Typography scaling
186
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
187
+
188
+ @media (min-width: 768px) {
189
+ :root {
190
+ --sv-font-size-xxs: 11px;
191
+ --sv-font-size-xs: 13px;
192
+ --sv-font-size-sm: 14px;
193
+ --sv-font-size-md: 16px;
194
+ --sv-font-size-lg: 18px;
195
+ --sv-font-size-xl: 24px;
196
+ }
197
+ }
198
+
199
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
200
+ BASE STYLES
201
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
202
+
203
+ .sv-root {
204
+ font-family: var(--sv-font-family);
205
+ font-size: var(--sv-font-size-md);
206
+ font-weight: var(--sv-font-weight-regular);
207
+ line-height: var(--sv-line-height-normal);
208
+ color: var(--sv-color-text);
209
+ -webkit-font-smoothing: antialiased;
210
+ -moz-osx-font-smoothing: grayscale;
211
+ }
212
+
213
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
214
+ FEED CONTAINER
215
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
216
+
217
+ .sv-feed {
218
+ position: relative;
219
+ width: 100%;
220
+ height: 100%;
221
+ overflow: hidden;
222
+ background: var(--sv-color-contrast-negative);
223
+ touch-action: pan-y;
224
+ -webkit-overflow-scrolling: touch;
225
+ }
226
+
227
+ .sv-feed::-webkit-scrollbar {
228
+ display: none;
229
+ }
230
+
231
+ .sv-feed {
232
+ -ms-overflow-style: none;
233
+ scrollbar-width: none;
234
+ }
235
+
236
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
237
+ VIDEO SLOT
238
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
239
+
240
+ .sv-slot {
241
+ position: absolute;
242
+ top: 0;
243
+ left: 0;
244
+ width: 100%;
245
+ height: 100%;
246
+ display: flex;
247
+ align-items: center;
248
+ justify-content: center;
249
+ background: var(--sv-color-contrast-negative);
250
+ will-change: transform;
251
+ }
252
+
253
+ .sv-slot--active {
254
+ z-index: var(--sv-z-video);
255
+ }
256
+
257
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
258
+ VIDEO PLAYER
259
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
260
+
261
+ .sv-player {
262
+ position: relative;
263
+ width: 100%;
264
+ height: 100%;
265
+ background: var(--sv-color-contrast-negative);
266
+ }
267
+
268
+ .sv-player__video {
269
+ width: 100%;
270
+ height: 100%;
271
+ object-fit: cover;
272
+ background: var(--sv-color-contrast-negative);
273
+ }
274
+
275
+ .sv-player__poster {
276
+ position: absolute;
277
+ inset: 0;
278
+ width: 100%;
279
+ height: 100%;
280
+ object-fit: cover;
281
+ z-index: 1;
282
+ transition: opacity var(--sv-transition-normal);
283
+ }
284
+
285
+ .sv-player__poster--hidden {
286
+ opacity: 0;
287
+ pointer-events: none;
288
+ }
289
+
290
+ .sv-player__overlay {
291
+ position: absolute;
292
+ inset: 0;
293
+ background: linear-gradient(
294
+ to bottom,
295
+ transparent 0%,
296
+ transparent 50%,
297
+ rgba(0, 0, 0, 0.3) 100%
298
+ );
299
+ pointer-events: none;
300
+ z-index: var(--sv-z-overlay);
301
+ }
302
+
303
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
304
+ PROGRESS BAR
305
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
306
+
307
+ .sv-progress {
308
+ position: absolute;
309
+ bottom: 0;
310
+ left: 0;
311
+ right: 0;
312
+ height: 3px;
313
+ background: rgba(255, 255, 255, 0.2);
314
+ z-index: var(--sv-z-controls);
315
+ }
316
+
317
+ .sv-progress__bar {
318
+ height: 100%;
319
+ background: var(--sv-color-contrast-positive);
320
+ transition: width 100ms linear;
321
+ will-change: width;
322
+ }
323
+
324
+ .sv-progress__bar--buffered {
325
+ position: absolute;
326
+ top: 0;
327
+ left: 0;
328
+ height: 100%;
329
+ background: rgba(255, 255, 255, 0.3);
330
+ }
331
+
332
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
333
+ INTERACTION BAR (Right side actions)
334
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
335
+
336
+ .sv-actions {
337
+ position: absolute;
338
+ right: var(--sv-spacing-md);
339
+ bottom: 120px;
340
+ display: flex;
341
+ flex-direction: column;
342
+ align-items: center;
343
+ gap: var(--sv-spacing-xl);
344
+ z-index: var(--sv-z-controls);
345
+ }
346
+
347
+ .sv-action-btn {
348
+ display: flex;
349
+ flex-direction: column;
350
+ align-items: center;
351
+ gap: var(--sv-spacing-xs);
352
+ background: none;
353
+ border: none;
354
+ padding: 0;
355
+ cursor: pointer;
356
+ color: var(--sv-color-contrast-positive);
357
+ transition: transform var(--sv-transition-fast);
358
+ -webkit-tap-highlight-color: transparent;
359
+ }
360
+
361
+ .sv-action-btn:active {
362
+ transform: scale(0.9);
363
+ }
364
+
365
+ .sv-action-btn__icon {
366
+ width: 44px;
367
+ height: 44px;
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ background: rgba(0, 0, 0, 0.3);
372
+ border-radius: var(--sv-radius-full);
373
+ backdrop-filter: blur(4px);
374
+ -webkit-backdrop-filter: blur(4px);
375
+ }
376
+
377
+ .sv-action-btn__icon svg {
378
+ width: 24px;
379
+ height: 24px;
380
+ fill: currentColor;
381
+ }
382
+
383
+ .sv-action-btn__count {
384
+ font-size: var(--sv-font-size-xs);
385
+ font-weight: var(--sv-font-weight-semibold);
386
+ color: var(--sv-color-contrast-positive);
387
+ }
388
+
389
+ /* Like button states */
390
+ .sv-action-btn--liked .sv-action-btn__icon {
391
+ color: var(--sv-color-error);
392
+ }
393
+
394
+ .sv-action-btn--liked .sv-action-btn__icon svg {
395
+ animation: sv-like-pop 0.3s ease;
396
+ }
397
+
398
+ @keyframes sv-like-pop {
399
+ 0% { transform: scale(1); }
400
+ 50% { transform: scale(1.3); }
401
+ 100% { transform: scale(1); }
402
+ }
403
+
404
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
405
+ AUTHOR INFO (Bottom left)
406
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
407
+
408
+ .sv-author {
409
+ position: absolute;
410
+ left: var(--sv-spacing-md);
411
+ bottom: 80px;
412
+ display: flex;
413
+ flex-direction: column;
414
+ gap: var(--sv-spacing-md);
415
+ max-width: calc(100% - 80px);
416
+ z-index: var(--sv-z-controls);
417
+ }
418
+
419
+ .sv-author__row {
420
+ display: flex;
421
+ align-items: center;
422
+ gap: var(--sv-spacing-md);
423
+ }
424
+
425
+ .sv-author__avatar {
426
+ width: 48px;
427
+ height: 48px;
428
+ border-radius: var(--sv-radius-full);
429
+ border: 2px solid var(--sv-color-contrast-positive);
430
+ object-fit: cover;
431
+ flex-shrink: 0;
432
+ }
433
+
434
+ .sv-author__info {
435
+ display: flex;
436
+ flex-direction: column;
437
+ gap: var(--sv-spacing-xxs);
438
+ min-width: 0;
439
+ }
440
+
441
+ .sv-author__name {
442
+ font-size: var(--sv-font-size-lg);
443
+ font-weight: var(--sv-font-weight-semibold);
444
+ color: var(--sv-color-contrast-positive);
445
+ white-space: nowrap;
446
+ overflow: hidden;
447
+ text-overflow: ellipsis;
448
+ }
449
+
450
+ .sv-author__handle {
451
+ font-size: var(--sv-font-size-sm);
452
+ color: rgba(255, 255, 255, 0.8);
453
+ }
454
+
455
+ .sv-author__description {
456
+ font-size: var(--sv-font-size-sm);
457
+ color: var(--sv-color-contrast-positive);
458
+ display: -webkit-box;
459
+ -webkit-line-clamp: 2;
460
+ -webkit-box-orient: vertical;
461
+ overflow: hidden;
462
+ line-height: var(--sv-line-height-relaxed);
463
+ }
464
+
465
+ /* Follow button */
466
+ .sv-follow-btn {
467
+ display: inline-flex;
468
+ align-items: center;
469
+ justify-content: center;
470
+ padding: var(--sv-spacing-xs) var(--sv-spacing-md);
471
+ font-size: var(--sv-font-size-sm);
472
+ font-weight: var(--sv-font-weight-semibold);
473
+ font-family: var(--sv-font-family);
474
+ color: var(--sv-color-contrast-negative);
475
+ background: var(--sv-color-primary);
476
+ border: none;
477
+ border-radius: var(--sv-radius-sm);
478
+ cursor: pointer;
479
+ transition: all var(--sv-transition-fast);
480
+ -webkit-tap-highlight-color: transparent;
481
+ }
482
+
483
+ .sv-follow-btn:active {
484
+ transform: scale(0.95);
485
+ }
486
+
487
+ .sv-follow-btn--following {
488
+ background: transparent;
489
+ color: var(--sv-color-contrast-positive);
490
+ border: 1px solid var(--sv-color-contrast-positive);
491
+ }
492
+
493
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
494
+ SPINNER / LOADING
495
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
496
+
497
+ .sv-spinner {
498
+ display: inline-flex;
499
+ align-items: center;
500
+ justify-content: center;
501
+ }
502
+
503
+ .sv-spinner__circle {
504
+ width: 32px;
505
+ height: 32px;
506
+ border: 3px solid rgba(255, 255, 255, 0.2);
507
+ border-top-color: var(--sv-color-contrast-positive);
508
+ border-radius: var(--sv-radius-full);
509
+ animation: sv-spin 0.8s linear infinite;
510
+ }
511
+
512
+ .sv-spinner--sm .sv-spinner__circle {
513
+ width: 20px;
514
+ height: 20px;
515
+ border-width: 2px;
516
+ }
517
+
518
+ .sv-spinner--lg .sv-spinner__circle {
519
+ width: 48px;
520
+ height: 48px;
521
+ border-width: 4px;
522
+ }
523
+
524
+ @keyframes sv-spin {
525
+ to { transform: rotate(360deg); }
526
+ }
527
+
528
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
529
+ MUSIC INFO (Bottom - optional)
530
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
531
+
532
+ .sv-music {
533
+ position: absolute;
534
+ left: var(--sv-spacing-md);
535
+ bottom: var(--sv-spacing-lg);
536
+ display: flex;
537
+ align-items: center;
538
+ gap: var(--sv-spacing-sm);
539
+ max-width: calc(100% - 80px);
540
+ z-index: var(--sv-z-controls);
541
+ }
542
+
543
+ .sv-music__icon {
544
+ width: 20px;
545
+ height: 20px;
546
+ flex-shrink: 0;
547
+ }
548
+
549
+ .sv-music__text {
550
+ font-size: var(--sv-font-size-sm);
551
+ color: var(--sv-color-contrast-positive);
552
+ white-space: nowrap;
553
+ overflow: hidden;
554
+ text-overflow: ellipsis;
555
+ }
556
+
557
+ .sv-music__marquee {
558
+ animation: sv-marquee 10s linear infinite;
559
+ }
560
+
561
+ @keyframes sv-marquee {
562
+ 0% { transform: translateX(0); }
563
+ 100% { transform: translateX(-50%); }
564
+ }
565
+
566
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
567
+ UTILITIES
568
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
569
+
570
+ .sv-sr-only {
571
+ position: absolute;
572
+ width: 1px;
573
+ height: 1px;
574
+ padding: 0;
575
+ margin: -1px;
576
+ overflow: hidden;
577
+ clip: rect(0, 0, 0, 0);
578
+ white-space: nowrap;
579
+ border: 0;
580
+ }
581
+
582
+ .sv-tap-highlight-none {
583
+ -webkit-tap-highlight-color: transparent;
584
+ }
585
+
586
+ /* Prevent text selection during gestures */
587
+ .sv-no-select {
588
+ -webkit-user-select: none;
589
+ user-select: none;
590
+ }
591
+
592
+ /* Hardware acceleration hint */
593
+ .sv-gpu {
594
+ transform: translateZ(0);
595
+ will-change: transform;
596
+ }
597
+ `;
598
+
599
+ // src/styles/useStyles.ts
600
+ var isInjected = false;
601
+ var STYLE_ID = "sv-styles";
602
+ function injectStyles() {
603
+ if (isInjected || typeof document === "undefined") {
604
+ return;
605
+ }
606
+ if (document.getElementById(STYLE_ID)) {
607
+ isInjected = true;
608
+ return;
609
+ }
610
+ const style = document.createElement("style");
611
+ style.id = STYLE_ID;
612
+ style.textContent = CSS_CONTENT;
613
+ document.head.appendChild(style);
614
+ isInjected = true;
615
+ }
616
+ function useStyles() {
617
+ useInsertionEffect(() => {
618
+ injectStyles();
619
+ }, []);
620
+ }
621
+ function injectSDKStyles() {
622
+ injectStyles();
623
+ }
624
+ function removeStyles() {
625
+ if (typeof document === "undefined") return;
626
+ const style = document.getElementById(STYLE_ID);
627
+ if (style) {
628
+ style.remove();
629
+ isInjected = false;
630
+ }
631
+ }
632
+ function areStylesInjected() {
633
+ return isInjected;
634
+ }
635
+
636
+ // src/styles/index.ts
637
+ var CSS_VAR_PREFIX = "--sv-";
638
+ function setTheme(theme) {
639
+ if (typeof document === "undefined") return;
640
+ const root = document.documentElement;
641
+ if (theme === "system") {
642
+ root.removeAttribute("data-theme");
643
+ root.classList.remove("dark");
644
+ } else if (theme === "dark") {
645
+ root.setAttribute("data-theme", "dark");
646
+ root.classList.add("dark");
647
+ } else {
648
+ root.setAttribute("data-theme", "light");
649
+ root.classList.remove("dark");
650
+ }
651
+ }
652
+ function getTheme() {
653
+ if (typeof document === "undefined") return "system";
654
+ const root = document.documentElement;
655
+ const dataTheme = root.getAttribute("data-theme");
656
+ if (dataTheme === "dark" || root.classList.contains("dark")) {
657
+ return "dark";
658
+ }
659
+ if (dataTheme === "light") {
660
+ return "light";
661
+ }
662
+ return "system";
663
+ }
664
+ function isDarkMode() {
665
+ if (typeof window === "undefined") return false;
666
+ const theme = getTheme();
667
+ if (theme === "dark") return true;
668
+ if (theme === "light") return false;
669
+ return window.matchMedia("(prefers-color-scheme: dark)").matches;
670
+ }
671
+
672
+ // src/components/index.ts
673
+ var Components = {
674
+ VideoFeedHeadless: () => null,
675
+ // Reference only
676
+ VideoSlotHeadless: () => null,
677
+ VideoPlayerHeadless: () => null,
678
+ ErrorBoundary: () => null,
679
+ Skeleton: () => null
680
+ };
681
+
682
+ // src/layouts/index.ts
683
+ var Layouts = {
684
+ // Placeholder
685
+ };
686
+
687
+ export { CSS_CONTENT, CSS_VAR_PREFIX, Components, Layouts, areStylesInjected, getTheme, injectSDKStyles, isDarkMode, removeStyles, setTheme, useStyles };