presently 0.20.1 → 0.22.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.
@@ -0,0 +1,115 @@
1
+ /* ========================
2
+ PLAYBACK
3
+ ======================== */
4
+
5
+ body.playback,
6
+ .playback-stage,
7
+ .playback-frame {
8
+ width: 100vw;
9
+ height: 100vh;
10
+ }
11
+
12
+ .playback-stage {
13
+ position: relative;
14
+ background: var(--slide-background);
15
+ }
16
+
17
+ .playback-frame {
18
+ position: absolute;
19
+ inset: 0;
20
+ }
21
+
22
+ .playback-start-screen {
23
+ position: fixed;
24
+ inset: 0;
25
+ z-index: 100;
26
+ display: flex;
27
+ flex-direction: column;
28
+ align-items: center;
29
+ justify-content: center;
30
+ gap: 1rem;
31
+ background: rgba(5, 8, 20, 0.88);
32
+ backdrop-filter: blur(12px);
33
+ }
34
+
35
+ .playback-start-screen[hidden] {
36
+ display: none;
37
+ }
38
+
39
+ .playback-start {
40
+ padding: 0.9rem 1.4rem;
41
+ border: 1px solid rgba(255, 255, 255, 0.2);
42
+ border-radius: 0.6rem;
43
+ background: var(--accent);
44
+ color: white;
45
+ font: inherit;
46
+ font-size: 1.1rem;
47
+ cursor: pointer;
48
+ }
49
+
50
+ .playback-start:disabled {
51
+ opacity: 0.5;
52
+ cursor: default;
53
+ }
54
+
55
+ .playback-status {
56
+ margin: 0;
57
+ opacity: 0.75;
58
+ }
59
+
60
+ .playback-status.error {
61
+ color: #ff4757;
62
+ opacity: 1;
63
+ }
64
+
65
+ .playback-controls {
66
+ position: fixed;
67
+ left: 50%;
68
+ bottom: 1.25rem;
69
+ z-index: 90;
70
+ display: flex;
71
+ align-items: center;
72
+ gap: 0.5rem;
73
+ padding: 0.5rem 0.7rem;
74
+ transform: translateX(-50%);
75
+ border: 1px solid rgba(255, 255, 255, 0.12);
76
+ border-radius: 0.7rem;
77
+ background: rgba(5, 8, 20, 0.72);
78
+ backdrop-filter: blur(8px);
79
+ opacity: 0.2;
80
+ transition: opacity 160ms ease;
81
+ }
82
+
83
+ .playback-controls:hover,
84
+ .playback-controls:focus-within {
85
+ opacity: 1;
86
+ }
87
+
88
+ body.playback[data-controls="false"] .playback-controls {
89
+ display: none;
90
+ }
91
+
92
+ body.playback[data-controls="false"] .playback-start-screen {
93
+ display: none;
94
+ }
95
+
96
+ .playback-controls button {
97
+ min-width: 2.4rem;
98
+ height: 2.2rem;
99
+ border: 0;
100
+ border-radius: 0.35rem;
101
+ background: rgba(255, 255, 255, 0.1);
102
+ color: white;
103
+ cursor: pointer;
104
+ }
105
+
106
+ .playback-controls button:disabled {
107
+ opacity: 0.3;
108
+ cursor: default;
109
+ }
110
+
111
+ .playback-counter {
112
+ min-width: 4rem;
113
+ text-align: center;
114
+ font-variant-numeric: tabular-nums;
115
+ }
@@ -0,0 +1,137 @@
1
+ /* ========================
2
+ PRESENTER VIEW
3
+ ======================== */
4
+
5
+ .presenter {
6
+ width: 100vw;
7
+ height: 100vh;
8
+ display: grid;
9
+ grid-template-rows: auto 1fr auto auto;
10
+ background: #0d0d1a;
11
+ gap: 0.5rem;
12
+ padding: 0.5rem;
13
+ }
14
+
15
+ /* Slide previews */
16
+ .previews {
17
+ display: grid;
18
+ grid-template-columns: 1fr 1fr;
19
+ gap: 0.5rem;
20
+ min-height: 0;
21
+ }
22
+
23
+ .preview {
24
+ display: flex;
25
+ flex-direction: column;
26
+ min-height: 0;
27
+ }
28
+
29
+ .preview h3 {
30
+ margin: 0 0 0.3rem 0;
31
+ font-size: 0.85rem;
32
+ text-transform: uppercase;
33
+ letter-spacing: 0.05em;
34
+ opacity: 0.6;
35
+ }
36
+
37
+ .preview-frame {
38
+ flex: 1;
39
+ background: var(--slide-background);
40
+ border-radius: 8px;
41
+ overflow: hidden;
42
+ position: relative;
43
+ min-height: 0;
44
+ }
45
+
46
+ .preview-frame .no-slide {
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ height: 100%;
51
+ opacity: 0.4;
52
+ font-size: 1.2rem;
53
+ }
54
+
55
+ .current-preview .preview-frame {
56
+ border: 2px solid var(--accent);
57
+ }
58
+
59
+ /* Timing */
60
+ .timing {
61
+ background: linear-gradient(
62
+ to right,
63
+ rgba(233, 69, 96, 0.25) var(--slide-progress, 0%),
64
+ var(--surface) var(--slide-progress, 0%)
65
+ );
66
+ border-radius: 8px;
67
+ padding: 0.5rem 1rem;
68
+ transition: background 1s linear;
69
+ }
70
+
71
+ .timing-info {
72
+ font-size: 1rem;
73
+ }
74
+
75
+ .timing-info.on-time .pacing-indicator {
76
+ color: #2ed573;
77
+ }
78
+
79
+ .timing-info.behind .pacing-indicator {
80
+ color: #ff4757;
81
+ font-weight: 700;
82
+ animation: pulse 1s infinite;
83
+ }
84
+
85
+ .timing-info.ahead .pacing-indicator {
86
+ color: #ffa502;
87
+ }
88
+
89
+ @keyframes pulse {
90
+ 0%, 100% { opacity: 1; }
91
+ 50% { opacity: 0.5; }
92
+ }
93
+
94
+ .timing-info .pause-button {
95
+ color: var(--slide-text);
96
+ padding: 0.3rem 0.75rem;
97
+ cursor: pointer;
98
+ font-size: 0.9rem;
99
+ font-family: var(--font-sans);
100
+ transition: background 0.2s;
101
+ line-height: 1;
102
+ min-width: 6rem;
103
+ }
104
+
105
+ .timing-info .pause-button:hover {
106
+ background: var(--accent);
107
+ }
108
+
109
+ .timing-info .elapsed {
110
+ font-variant-numeric: tabular-nums;
111
+ }
112
+
113
+ .timing-info .remaining {
114
+ font-variant-numeric: tabular-nums;
115
+ }
116
+
117
+ .timing-info .slide-duration {
118
+ opacity: 0.6;
119
+ margin-left: auto;
120
+ }
121
+
122
+ .timing-info .speaker-info {
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 0.25rem;
126
+ font-size: 0.9rem;
127
+ background: rgba(255, 255, 255, 0.08);
128
+ border: 1px solid rgba(255, 255, 255, 0.12);
129
+ border-radius: 6px;
130
+ padding: 0.2rem 0.6rem;
131
+ white-space: nowrap;
132
+ }
133
+
134
+ .timing-info .next-speaker {
135
+ opacity: 0.6;
136
+ font-style: italic;
137
+ }
@@ -0,0 +1,161 @@
1
+ /* ========================
2
+ RECORDING VIEW
3
+ ======================== */
4
+
5
+ .recorder {
6
+ width: 100vw;
7
+ height: 100vh;
8
+ display: grid;
9
+ grid-template-rows: auto 1fr;
10
+ gap: 0.75rem;
11
+ padding: 0.75rem;
12
+ background: #0d0d1a;
13
+ }
14
+
15
+ .recording-workspace {
16
+ display: grid;
17
+ grid-template-columns: minmax(0, 2fr) minmax(20rem, 1fr);
18
+ gap: 0.75rem;
19
+ min-height: 0;
20
+ }
21
+
22
+ .recording-preview {
23
+ position: relative;
24
+ min-height: 0;
25
+ overflow: hidden;
26
+ background: var(--slide-background);
27
+ border: 2px solid var(--accent);
28
+ border-radius: 8px;
29
+ }
30
+
31
+ .recording-sidebar {
32
+ display: grid;
33
+ grid-template-rows: auto 1fr;
34
+ gap: 0.75rem;
35
+ min-height: 0;
36
+ }
37
+
38
+ .recording-panel,
39
+ .recording-notes {
40
+ padding: 1rem;
41
+ background: var(--surface);
42
+ border-radius: 8px;
43
+ }
44
+
45
+ .recording-panel h2,
46
+ .recording-notes h2 {
47
+ margin: 0 0 0.5rem;
48
+ font-size: 1rem;
49
+ letter-spacing: 0.05em;
50
+ text-transform: uppercase;
51
+ }
52
+
53
+ .recording-panel > p {
54
+ margin: 0 0 1rem;
55
+ opacity: 0.65;
56
+ }
57
+
58
+ presently-recorder {
59
+ display: grid;
60
+ gap: 1rem;
61
+ }
62
+
63
+ .recording-actions {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: 0.6rem;
67
+ }
68
+
69
+ .recording-actions button {
70
+ padding: 0.55rem 0.9rem;
71
+ background: var(--surface-light);
72
+ border: 1px solid rgba(255,255,255,0.12);
73
+ border-radius: 6px;
74
+ color: var(--slide-text);
75
+ cursor: pointer;
76
+ font: inherit;
77
+ }
78
+
79
+ .recording-actions button:hover:not(:disabled) {
80
+ background: var(--accent);
81
+ }
82
+
83
+ .recording-actions button:disabled {
84
+ cursor: default;
85
+ opacity: 0.35;
86
+ }
87
+
88
+ .recording-toggle:not(:disabled) {
89
+ color: var(--accent-light);
90
+ }
91
+
92
+ presently-recorder[data-state="recording"] .recording-toggle {
93
+ color: #ef5350;
94
+ }
95
+
96
+ .recording-indicator {
97
+ width: 0.65rem;
98
+ height: 0.65rem;
99
+ margin-left: auto;
100
+ background: rgba(255,255,255,0.2);
101
+ border-radius: 50%;
102
+ }
103
+
104
+ presently-recorder[data-state="preparing"] .recording-indicator,
105
+ presently-recorder[data-state="starting"] .recording-indicator {
106
+ background: #f5b942;
107
+ box-shadow: 0 0 0 0.25rem rgba(245,185,66,0.15);
108
+ animation: recording-indicator-pulse 600ms ease-in-out infinite alternate;
109
+ }
110
+
111
+ presently-recorder[data-state="recording"] .recording-indicator {
112
+ background: #ef5350;
113
+ box-shadow: 0 0 0 0.25rem rgba(239,83,80,0.15);
114
+ }
115
+
116
+ @keyframes recording-indicator-pulse {
117
+ to {
118
+ opacity: 0.45;
119
+ transform: scale(0.8);
120
+ }
121
+ }
122
+
123
+ .recording-time {
124
+ font-family: var(--font-mono);
125
+ font-variant-numeric: tabular-nums;
126
+ }
127
+
128
+ .recording-playback {
129
+ width: 100%;
130
+ }
131
+
132
+ .recording-status {
133
+ min-height: 1.4em;
134
+ margin: 0;
135
+ font-size: 0.9rem;
136
+ opacity: 0.7;
137
+ }
138
+
139
+ .recording-status.error {
140
+ color: #ff4757;
141
+ opacity: 1;
142
+ }
143
+
144
+ .recording-notes {
145
+ min-height: 0;
146
+ overflow-y: auto;
147
+ font-size: 1.05rem;
148
+ line-height: 1.5;
149
+ }
150
+
151
+ .recording-notes p {
152
+ margin: 0.4em 0;
153
+ }
154
+
155
+ @media (max-width: 900px) {
156
+ .recording-workspace {
157
+ grid-template-columns: 1fr;
158
+ grid-template-rows: minmax(20rem, 1fr) auto;
159
+ overflow-y: auto;
160
+ }
161
+ }