@rtsee/ngx 0.0.115 → 0.0.117

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.
@@ -227,43 +227,154 @@
227
227
  }
228
228
  }
229
229
 
230
- /* ── HERO ACTIONS (buttons) ────────────────────────────────── */
230
+ /* ── READING PANEL (slides preview + start reading CTA) ─────── */
231
231
 
232
- .rtsee-story-details-cover-actions {
232
+ .rtsee-story-details-reading-panel {
233
+ position: relative;
234
+ z-index: 3;
233
235
  display: flex;
236
+ flex-direction: column;
234
237
  align-items: stretch;
235
- margin-top: -$rts-offset-md;
236
- padding-bottom: $rts-offset-xl;
238
+ gap: ($rts-offset-md + $rts-offset-xsm);
239
+ margin: (-$rts-offset-lg) 0 $rts-offset-xl;
240
+ padding: ($rts-offset-md + $rts-offset-xsm);
241
+ border-radius: 20px;
242
+ border: 1px solid rgba($rts-rates-accent-purple, 0.25);
243
+ background:
244
+ radial-gradient(
245
+ 120% 140% at 0% 0%,
246
+ rgba($rts-rates-accent-purple, 0.18) 0%,
247
+ rgba($rts-rates-accent-purple, 0) 60%
248
+ ),
249
+ linear-gradient(
250
+ 135deg,
251
+ $rts-rates-bg-card-start 0%,
252
+ $rts-rates-bg-card-end 100%
253
+ );
254
+ backdrop-filter: blur(14px);
255
+ box-shadow:
256
+ 0 12px 40px rgba(0, 0, 0, 0.35),
257
+ 0 0 0 1px rgba(255, 255, 255, 0.02) inset;
258
+ animation: rtseeCardSlideUp 0.6s ease-out both;
237
259
 
238
- // Mobile-first default
239
- flex-direction: column;
240
- gap: $rts-offset-sm;
241
- width: 100%;
260
+ // fan the preview circles out when the panel is hovered
261
+ &:hover .rtsee-story-slides-preview-circle {
262
+ &:nth-child(1) { transform: translateX(-4px) rotate(-8deg); }
263
+ &:nth-child(2) { transform: translateY(-3px); }
264
+ &:nth-child(3) { transform: translateX(4px) rotate(8deg); }
265
+ }
242
266
 
243
- /* Override primeng button defaults to look premium dark theme */
244
- ::v-deep .p-button {
245
- border-radius: 8px;
246
- font-weight: 600;
247
- padding: 12px 24px;
248
- transition:
249
- transform 0.2s ease,
250
- box-shadow 0.2s ease;
251
- width: 100%;
267
+ rtsee-story-slides-preview {
268
+ display: block;
252
269
  }
253
270
 
254
- .rtsee-story-details-start-reading ::v-deep .p-button {
255
- background: linear-gradient(135deg, $rts-rates-accent-purple 0%, $rts-rates-accent-purple-light 100%);
256
- border: none;
257
- box-shadow: 0 4px 16px rgba($rts-rates-accent-purple, 0.3);
271
+ /* ── Start reading CTA ── */
272
+ .rtsee-story-details-start-reading.rts-action-button {
273
+ display: block;
274
+ width: 100%;
258
275
 
259
- &:hover {
260
- transform: translateY(-2px);
261
- box-shadow: 0 6px 20px rgba($rts-rates-accent-purple, 0.4);
276
+ .p-button {
277
+ position: relative;
278
+ overflow: hidden;
279
+ width: 100%;
280
+ min-height: 58px;
281
+ justify-content: center;
282
+ gap: ($rts-offset-sm + $rts-offset-xsm);
283
+ padding: $rts-offset-md $rts-offset-lg;
284
+ border: none;
285
+ border-radius: 14px;
286
+ font-size: 1.12rem;
287
+ font-weight: 700;
288
+ letter-spacing: 0.01em;
289
+ color: #fff;
290
+ background: linear-gradient(
291
+ 135deg,
292
+ $rts-rates-accent-purple 0%,
293
+ $rts-rates-accent-purple-light 100%
294
+ );
295
+ box-shadow:
296
+ 0 8px 24px rgba($rts-rates-accent-purple, 0.45),
297
+ 0 0 0 1px rgba(255, 255, 255, 0.12) inset;
298
+ animation: rtseeStartReadingGlow 2.8s ease-in-out infinite;
299
+ transition:
300
+ transform 0.2s ease,
301
+ box-shadow 0.2s ease,
302
+ filter 0.2s ease;
303
+
304
+ .p-button-icon {
305
+ font-size: 1.15rem;
306
+ }
307
+
308
+ // soft light sweep across the button
309
+ &::after {
310
+ content: "";
311
+ position: absolute;
312
+ top: 0;
313
+ left: -60%;
314
+ width: 40%;
315
+ height: 100%;
316
+ background: linear-gradient(
317
+ 100deg,
318
+ rgba(255, 255, 255, 0) 0%,
319
+ rgba(255, 255, 255, 0.28) 50%,
320
+ rgba(255, 255, 255, 0) 100%
321
+ );
322
+ transform: skewX(-20deg);
323
+ animation: rtseeStartReadingShine 3.6s ease-in-out infinite;
324
+ pointer-events: none;
325
+ }
326
+
327
+ &:hover {
328
+ animation: none;
329
+ transform: translateY(-2px);
330
+ filter: brightness(1.06);
331
+ box-shadow:
332
+ 0 12px 30px rgba($rts-rates-accent-purple, 0.55),
333
+ 0 0 0 1px rgba(255, 255, 255, 0.18) inset;
334
+ }
335
+
336
+ &:active {
337
+ transform: translateY(0) scale(0.99);
338
+ }
339
+
340
+ &:focus-visible {
341
+ outline: 2px solid $rts-rates-accent-purple-light;
342
+ outline-offset: 3px;
343
+ }
262
344
  }
345
+ }
346
+ }
263
347
 
264
- &:active {
265
- transform: translateY(0);
266
- box-shadow: 0 4px 12px rgba($rts-rates-accent-purple, 0.3);
348
+ @keyframes rtseeStartReadingGlow {
349
+ 0%,
350
+ 100% {
351
+ box-shadow:
352
+ 0 8px 24px rgba($rts-rates-accent-purple, 0.4),
353
+ 0 0 0 1px rgba(255, 255, 255, 0.12) inset;
354
+ }
355
+ 50% {
356
+ box-shadow:
357
+ 0 8px 32px rgba($rts-rates-accent-purple, 0.65),
358
+ 0 0 0 1px rgba(255, 255, 255, 0.12) inset;
359
+ }
360
+ }
361
+
362
+ @keyframes rtseeStartReadingShine {
363
+ 0%,
364
+ 60% {
365
+ left: -60%;
366
+ }
367
+ 100% {
368
+ left: 130%;
369
+ }
370
+ }
371
+
372
+ @media (prefers-reduced-motion: reduce) {
373
+ .rtsee-story-details-reading-panel .rtsee-story-details-start-reading .p-button {
374
+ animation: none;
375
+
376
+ &::after {
377
+ display: none;
267
378
  }
268
379
  }
269
380
  }
@@ -351,6 +462,47 @@
351
462
  white-space: pre-line;
352
463
  }
353
464
 
465
+ /* ── STORY ELEMENTS (author / characters / artifacts / places) ── */
466
+
467
+ .rtsee-story-details-elements {
468
+ margin-bottom: $rts-offset-xl;
469
+ }
470
+
471
+ .rtsee-story-details-elements-grid {
472
+ list-style: none;
473
+ margin: 0;
474
+ padding: 0;
475
+ display: grid;
476
+ gap: ($rts-offset-sm + $rts-offset-xsm);
477
+ // compact row thumbnails: single column on phones, auto-filled columns on wider screens
478
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr));
479
+ // an expanded card shouldn't stretch its row neighbours
480
+ align-items: start;
481
+ }
482
+
483
+ .rtsee-story-details-elements-item {
484
+ min-width: 0;
485
+
486
+ rtsee-story-element-thumbnail {
487
+ display: block;
488
+ }
489
+
490
+ // stagger card entrance
491
+ @for $i from 1 through 8 {
492
+ &:nth-child(#{$i}) .rtsee-story-element-thumbnail {
493
+ animation-delay: #{$i * 0.06}s;
494
+ }
495
+ }
496
+ }
497
+
498
+ .rtsee-story-details-elements-featured {
499
+ max-width: 560px;
500
+
501
+ rtsee-story-element-thumbnail {
502
+ display: block;
503
+ }
504
+ }
505
+
354
506
  /* ── COMMENTS SECTION / INTEGRATED LOGIC ─────────────────── */
355
507
 
356
508
  .rtsee-story-details-votes {
@@ -392,15 +544,13 @@
392
544
  gap: $rts-offset-lg;
393
545
  }
394
546
 
395
- .rtsee-story-details-cover-actions {
396
- flex-direction: row;
397
- align-items: center;
547
+ .rtsee-story-details-elements-grid {
398
548
  gap: $rts-offset-md;
399
- width: auto;
549
+ }
400
550
 
401
- ::v-deep .p-button {
402
- width: auto;
403
- }
551
+ .rtsee-story-details-reading-panel {
552
+ max-width: 460px;
553
+ padding: $rts-offset-lg;
404
554
  }
405
555
  }
406
556
 
@@ -0,0 +1,214 @@
1
+ @import "./variables";
2
+
3
+ /* ── STORY ELEMENT THUMBNAIL (author / characters / artifacts / locations) ── */
4
+ /* compact row: small image in the top-left corner, name & description on the right */
5
+
6
+ // opaque approximation of the card background (used to fade the text under the toggle)
7
+ $rts-element-thumbnail-fade-bg: #15151f;
8
+ $rts-element-thumbnail-image-size: 56px;
9
+ $rts-element-thumbnail-image-size-featured: 72px;
10
+
11
+ .rtsee-story-element-thumbnail {
12
+ display: flex;
13
+ flex-direction: row;
14
+ align-items: flex-start;
15
+ gap: ($rts-offset-sm + $rts-offset-xsm);
16
+ height: 100%;
17
+ padding: ($rts-offset-sm + $rts-offset-xsm);
18
+ background: linear-gradient(
19
+ 135deg,
20
+ $rts-rates-bg-card-start 0%,
21
+ $rts-rates-bg-card-end 100%
22
+ );
23
+ border: 1px solid $rts-rates-border-dim;
24
+ border-radius: 14px;
25
+ backdrop-filter: blur(12px);
26
+ color: $rts-rates-text-primary;
27
+ transition:
28
+ transform 0.3s ease,
29
+ border-color 0.3s ease,
30
+ box-shadow 0.3s ease;
31
+ animation: rtseeElementThumbnailSlideUp 0.6s ease-out both;
32
+
33
+ &:hover {
34
+ transform: translateY(-2px);
35
+ border-color: rgba($rts-rates-accent-purple, 0.3);
36
+ box-shadow: 0 8px 28px rgba($rts-rates-accent-purple, 0.12);
37
+
38
+ .rtsee-story-element-thumbnail-image {
39
+ transform: scale(1.06);
40
+ }
41
+ }
42
+
43
+ .rtsee-story-element-thumbnail-media {
44
+ position: relative;
45
+ flex-shrink: 0;
46
+ width: $rts-element-thumbnail-image-size;
47
+ height: $rts-element-thumbnail-image-size;
48
+ margin: 0;
49
+ overflow: hidden;
50
+ border-radius: 12px;
51
+ border: 1px solid $rts-rates-border-med;
52
+ background: linear-gradient(
53
+ 135deg,
54
+ rgba($rts-rates-accent-purple, 0.35) 0%,
55
+ rgba($rts-rates-accent-purple-light, 0.15) 100%
56
+ );
57
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);
58
+ }
59
+
60
+ .rtsee-story-element-thumbnail-image {
61
+ display: block;
62
+ width: 100%;
63
+ height: 100%;
64
+ object-fit: cover;
65
+ transition: transform 0.5s ease;
66
+ }
67
+
68
+ .rtsee-story-element-thumbnail-placeholder {
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: 100%;
73
+ height: 100%;
74
+ font-size: 1.4rem;
75
+ font-weight: 800;
76
+ color: rgba(255, 255, 255, 0.85);
77
+ text-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
78
+ }
79
+
80
+ .rtsee-story-element-thumbnail-body {
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: 2px;
84
+ flex: 1 1 auto;
85
+ min-width: 0;
86
+ }
87
+
88
+ .rtsee-story-element-thumbnail-name {
89
+ margin: 0;
90
+ font-size: 0.98rem;
91
+ font-weight: 700;
92
+ line-height: 1.3;
93
+ color: #fff;
94
+ letter-spacing: -0.01em;
95
+ overflow-wrap: anywhere;
96
+ }
97
+
98
+ .rtsee-story-element-thumbnail-description-wrapper {
99
+ position: relative;
100
+ }
101
+
102
+ .rtsee-story-element-thumbnail-description {
103
+ margin: 0;
104
+ font-size: 0.86rem;
105
+ line-height: 1.55;
106
+ color: $rts-rates-text-secondary;
107
+ overflow-wrap: anywhere;
108
+ white-space: pre-line;
109
+ // the full text stays in the DOM (SEO), only visually clamped
110
+ display: -webkit-box;
111
+ -webkit-line-clamp: 3;
112
+ line-clamp: 3;
113
+ -webkit-box-orient: vertical;
114
+ overflow: hidden;
115
+
116
+ &.rtsee-story-element-thumbnail-description-truncatable {
117
+ cursor: pointer;
118
+ }
119
+ }
120
+
121
+ .rtsee-story-element-thumbnail-toggle {
122
+ padding: 0;
123
+ border: none;
124
+ background: none;
125
+ font: inherit;
126
+ font-size: 0.86rem;
127
+ line-height: 1.55;
128
+ font-weight: 600;
129
+ color: $rts-rates-accent-purple-light;
130
+ cursor: pointer;
131
+ transition: color 0.2s ease;
132
+
133
+ &:hover {
134
+ color: #fff;
135
+ text-decoration: underline;
136
+ text-underline-offset: 3px;
137
+ }
138
+
139
+ &:focus-visible {
140
+ outline: 2px solid rgba($rts-rates-accent-purple-light, 0.7);
141
+ outline-offset: 2px;
142
+ border-radius: 4px;
143
+ }
144
+ }
145
+
146
+ // collapsed: sits over the end of the last visible line
147
+ .rtsee-story-element-thumbnail-toggle-more {
148
+ position: absolute;
149
+ right: 0;
150
+ bottom: 0;
151
+ padding-left: 2.2em;
152
+ background: linear-gradient(
153
+ 90deg,
154
+ rgba($rts-element-thumbnail-fade-bg, 0) 0%,
155
+ $rts-element-thumbnail-fade-bg 1.8em
156
+ );
157
+
158
+ &::before {
159
+ content: "…\00a0";
160
+ color: $rts-rates-text-secondary;
161
+ font-weight: 400;
162
+ }
163
+ }
164
+
165
+ // expanded: the paragraph flows inline so the toggle follows the last word
166
+ &.rtsee-story-element-thumbnail-expanded {
167
+ .rtsee-story-element-thumbnail-description {
168
+ display: inline;
169
+ -webkit-line-clamp: unset;
170
+ line-clamp: none;
171
+ overflow: visible;
172
+ }
173
+
174
+ .rtsee-story-element-thumbnail-toggle-less {
175
+ margin-left: 0.4em;
176
+ }
177
+ }
178
+
179
+ /* featured variant (single item, e.g. author) */
180
+ &.rtsee-story-element-thumbnail-featured {
181
+ gap: $rts-offset-md;
182
+ padding: $rts-offset-md;
183
+
184
+ .rtsee-story-element-thumbnail-media {
185
+ width: $rts-element-thumbnail-image-size-featured;
186
+ height: $rts-element-thumbnail-image-size-featured;
187
+ border-radius: 50%;
188
+ }
189
+
190
+ .rtsee-story-element-thumbnail-placeholder {
191
+ font-size: 1.7rem;
192
+ }
193
+
194
+ .rtsee-story-element-thumbnail-name {
195
+ font-size: 1.08rem;
196
+ }
197
+
198
+ .rtsee-story-element-thumbnail-description {
199
+ -webkit-line-clamp: 4;
200
+ line-clamp: 4;
201
+ }
202
+ }
203
+ }
204
+
205
+ @keyframes rtseeElementThumbnailSlideUp {
206
+ from {
207
+ opacity: 0;
208
+ transform: translateY(16px);
209
+ }
210
+ to {
211
+ opacity: 1;
212
+ transform: translateY(0);
213
+ }
214
+ }
@@ -36,6 +36,18 @@
36
36
  //display: block;
37
37
  }
38
38
 
39
+ // virtual slide whose content is not loaded yet
40
+ .story-player-slide-placeholder {
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ width: 100%;
45
+ height: 100%;
46
+ background: $rts-reading-light-bg;
47
+ color: $rts-reading-light-muted;
48
+ font-size: 2rem;
49
+ }
50
+
39
51
  .rtsee-presentation-slide-controls {
40
52
  padding: $rts-offset-sm;
41
53
  display: flex;
@@ -73,3 +85,46 @@
73
85
 
74
86
 
75
87
 
88
+
89
+ /* ── READING THEMES (story player only) ─────────────────────── */
90
+
91
+ // dark: optimal for bedtime reading in a dark room
92
+ .rtsee-story-player.rtsee-story-player-theme-dark {
93
+ background-color: $rts-reading-dark-bg;
94
+ color: $rts-reading-dark-text;
95
+ color-scheme: dark; // dark scrollbars & native controls
96
+
97
+ .rtsee-presentation-slide {
98
+ background-color: $rts-reading-dark-bg;
99
+ color: $rts-reading-dark-text;
100
+ transition:
101
+ background-color 0.3s ease,
102
+ color 0.3s ease;
103
+
104
+ .rtsee-presentation-slide-default {
105
+ .rtsee-presentation-slide-text {
106
+ color: $rts-reading-dark-text;
107
+ }
108
+
109
+ // slightly soften bright illustrations so they don't glare in the dark
110
+ .rtsee-presentation-slide-image-container {
111
+ filter: brightness(0.9);
112
+ }
113
+ }
114
+
115
+ .slide-navigation-btn.navigation-prev .p-button {
116
+ background: $rts-reading-dark-surface;
117
+ border-color: rgba(255, 255, 255, 0.08);
118
+ color: $rts-reading-dark-text;
119
+ }
120
+ }
121
+
122
+ .story-player-slide-container .story-player-slide-placeholder {
123
+ background: $rts-reading-dark-bg;
124
+ color: $rts-reading-dark-muted;
125
+ }
126
+ }
127
+
128
+ .rtsee-presentation .rtsee-presentation-story-viewer-container.rtsee-presentation-story-viewer-container-dark {
129
+ background-color: $rts-reading-dark-bg;
130
+ }
@@ -0,0 +1,128 @@
1
+ @import "./variables";
2
+
3
+ /* ── STORY SLIDES PREVIEW (circles stack + "N slides" + "~N min") ── */
4
+
5
+ $rts-slides-preview-circle: 52px;
6
+
7
+ .rtsee-story-slides-preview {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: $rts-offset-md;
11
+ color: $rts-rates-text-primary;
12
+
13
+ .rtsee-story-slides-preview-stack {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ flex-shrink: 0;
17
+ padding-left: 14px; // compensates the first circle's negative margin
18
+ }
19
+
20
+ .rtsee-story-slides-preview-circle {
21
+ position: relative;
22
+ display: block;
23
+ width: $rts-slides-preview-circle;
24
+ height: $rts-slides-preview-circle;
25
+ margin-left: -14px;
26
+ border-radius: 50%;
27
+ overflow: hidden;
28
+ border: 2px solid $rts-rates-bg-main;
29
+ box-shadow:
30
+ 0 0 0 1px rgba($rts-rates-accent-purple, 0.45),
31
+ 0 4px 12px rgba(0, 0, 0, 0.35);
32
+ background: linear-gradient(
33
+ 135deg,
34
+ rgba($rts-rates-accent-purple, 0.35) 0%,
35
+ rgba($rts-rates-accent-purple-light, 0.15) 100%
36
+ );
37
+ transition: transform 0.3s ease;
38
+ // backwards: the finished animation must not override the hover transforms
39
+ animation: rtseeSlidesPreviewPop 0.45s ease-out backwards;
40
+
41
+ @for $i from 1 through 3 {
42
+ &:nth-child(#{$i}) {
43
+ z-index: 4 - $i;
44
+ animation-delay: #{$i * 0.08}s;
45
+ }
46
+ }
47
+
48
+ img {
49
+ display: block;
50
+ width: 100%;
51
+ height: 100%;
52
+ object-fit: cover;
53
+ }
54
+
55
+ &.rtsee-story-slides-preview-circle-skeleton {
56
+ background: linear-gradient(
57
+ 90deg,
58
+ rgba(255, 255, 255, 0.06) 0%,
59
+ rgba(255, 255, 255, 0.16) 50%,
60
+ rgba(255, 255, 255, 0.06) 100%
61
+ );
62
+ background-size: 200% 100%;
63
+ animation: rtseeSlidesPreviewShimmer 1.2s linear infinite;
64
+ }
65
+ }
66
+
67
+ .rtsee-story-slides-preview-text {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: 2px;
71
+ min-width: 0;
72
+ }
73
+
74
+ .rtsee-story-slides-preview-total {
75
+ display: inline-flex;
76
+ align-items: baseline;
77
+ gap: 6px;
78
+ white-space: nowrap;
79
+ }
80
+
81
+ .rtsee-story-slides-preview-count {
82
+ font-size: 1.35rem;
83
+ font-weight: 800;
84
+ line-height: 1.1;
85
+ color: #fff;
86
+ }
87
+
88
+ .rtsee-story-slides-preview-label {
89
+ font-size: 0.95rem;
90
+ font-weight: 600;
91
+ color: $rts-rates-text-primary;
92
+ }
93
+
94
+ .rtsee-story-slides-preview-time {
95
+ display: inline-flex;
96
+ align-items: center;
97
+ gap: 6px;
98
+ font-size: 0.85rem;
99
+ font-weight: 500;
100
+ color: $rts-rates-text-secondary;
101
+ white-space: nowrap;
102
+
103
+ .pi {
104
+ font-size: 0.8rem;
105
+ opacity: 0.8;
106
+ }
107
+ }
108
+ }
109
+
110
+ @keyframes rtseeSlidesPreviewPop {
111
+ from {
112
+ opacity: 0;
113
+ transform: scale(0.6);
114
+ }
115
+ to {
116
+ opacity: 1;
117
+ transform: scale(1);
118
+ }
119
+ }
120
+
121
+ @keyframes rtseeSlidesPreviewShimmer {
122
+ from {
123
+ background-position: 200% 0;
124
+ }
125
+ to {
126
+ background-position: -200% 0;
127
+ }
128
+ }
@@ -3,6 +3,16 @@
3
3
  $story-thumb-width: 220px;
4
4
  $story-thumb-image-padding: 68%;
5
5
 
6
+ // story player reading themes
7
+ $rts-reading-light-bg: #ffffff;
8
+ $rts-reading-light-text: #333333;
9
+ $rts-reading-light-muted: #888888;
10
+ // warm near-black + warm off-white: low glare & less blue light for bedtime reading
11
+ $rts-reading-dark-bg: #14121a;
12
+ $rts-reading-dark-surface: #1c1924;
13
+ $rts-reading-dark-text: #ece6da;
14
+ $rts-reading-dark-muted: #9a93a6;
15
+
6
16
  $presentation-dashboard-header-height: 50.5px;
7
17
  $presentation-dashboard-tabs-height: 51.5px;
8
18
  $presentation-header-create-button: 36.5px;