Skip to content

Commit 11861eb

Browse files
committed
Unify RSVP practice entry point (#33)
1 parent fc39b1b commit 11861eb

20 files changed

Lines changed: 145 additions & 161 deletions

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ Rule format:
116116
- TPS archetype cues must not create reader-facing decorative word styles; archetypes are structural/semantic context for block markup, LLM guidance, and assistant reasoning unless a later task explicitly defines a user-visible archetype treatment.
117117
- User-facing file transfer actions in the shell should use `Import` and `Export` wording instead of `Open Script` and `Save File`, because the app also has its own internal script/workspace structure.
118118
- File workflows must stay local-first inside PrompterOne: scripts need in-app autosave and an internal change-history path in the browser environment, not only external disk import/export actions.
119+
- RSVP rehearsal must not expose separate `Learn` and `Prep` user-facing entry points when they open the same workflow; use one clear user-facing `Practice` surface unless a future task defines a functionally distinct preparation mode.
119120
- Hotkey work must target PrompterOne’s own browser surfaces and settings inventory only; do not design around OBS commands or claim OBS integration paths that the product does not have.
120121
- When the vendored TPS SDK already owns parsing or compile semantics, prefer removing redundant local TPS parser wrappers and keep only thin PrompterOne adapters that translate SDK models into app-owned contracts.
121122
- After syncing the vendored TPS SDK, delete repo-local TPS catalogs, constants, wrappers, or helper code that only duplicate the SDK contract; do not keep parallel spec copies in `Core` once consumers can read the vendored SDK directly.

src/PrompterOne.Shared/Contracts/DesignStylesheetPaths.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ namespace PrompterOne.Shared.Contracts;
22

33
public static class DesignStylesheetPaths
44
{
5-
public const string Learn = "_content/PrompterOne.Shared/design/learn.css";
5+
public const string Learn = "/_content/PrompterOne.Shared/design/learn.css";
66
public const string Teleprompter = "_content/PrompterOne.Shared/design/teleprompter.css";
77
}

src/PrompterOne.Shared/Learn/Pages/LearnPage.razor.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ public partial class LearnPage : IAsyncDisposable
7272

7373
protected override Task OnParametersSetAsync()
7474
{
75+
if (TryRedirectLegacyPrepRoute())
76+
{
77+
return Task.CompletedTask;
78+
}
79+
7580
StopPlaybackLoop();
7681
_loadState = true;
7782
_focusScreenAfterRender = true;
@@ -158,6 +163,21 @@ private void PopulateLearnState()
158163

159164
private Task StepRsvpForwardLargeAsync() => StepRsvpToIndexAsync(ResolveNextPhraseIndex());
160165

166+
private bool TryRedirectLegacyPrepRoute()
167+
{
168+
var relativePath = Navigation.ToBaseRelativePath(Navigation.Uri);
169+
if (!relativePath.StartsWith("prep", StringComparison.OrdinalIgnoreCase))
170+
{
171+
return false;
172+
}
173+
174+
var suffix = relativePath.Length > AppRoutes.Prep.Length - 1
175+
? relativePath[(AppRoutes.Prep.Length - 1)..]
176+
: string.Empty;
177+
Navigation.NavigateTo(AppRoutes.Learn + suffix, replace: true);
178+
return true;
179+
}
180+
161181
private Task RestartCurrentPhraseAsync() => StepRsvpToIndexAsync(ResolveCurrentPhraseStartIndex());
162182

163183
private async Task NavigateBackToEditorAsync()

src/PrompterOne.Shared/Library/Components/LibraryCardsGrid.razor

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
OnDeleteScript="@(() => HandleDeleteScriptAsync(card.Id))"
1717
OnDuplicateScript="@(() => HandleDuplicateScriptAsync(card.Id))"
1818
OnLearnScript="@(() => OnLearnScript.InvokeAsync(card.Id))"
19-
OnPrepScript="@(() => OnPrepScript.InvokeAsync(card.Id))"
2019
OnMoveScript="@(folderId => HandleMoveScriptAsync(card.Id, folderId))"
2120
OnOpenScript="@(() => HandleOpenScriptAsync(card.Id))"
2221
OnReadScript="@(() => OnReadScript.InvokeAsync(card.Id))"
@@ -78,8 +77,6 @@
7877

7978
[Parameter, EditorRequired] public EventCallback<string> OnLearnScript { get; set; }
8079

81-
[Parameter, EditorRequired] public EventCallback<string> OnPrepScript { get; set; }
82-
8380
[Parameter, EditorRequired] public EventCallback<string> OnReadScript { get; set; }
8481

8582
[Parameter, EditorRequired] public EventCallback OnCreateScript { get; set; }

src/PrompterOne.Shared/Library/Components/LibraryScriptCard.razor

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,6 @@
143143
</svg>
144144
<span class="dcard-act-label">@Text(UiTextKey.LibraryCardLearn)</span>
145145
</button>
146-
<button class="dcard-act dcard-act-prep"
147-
@onclick:stopPropagation="true"
148-
@onclick="HandlePrepScriptAsync"
149-
data-test="@UiTestIds.Library.CardPrep(Card.Id)">
150-
<UiIcon Kind="UiIconKind.TextLines" Size="14" />
151-
<span class="dcard-act-label">@Text(UiTextKey.LibraryCardPrep)</span>
152-
</button>
153146
<button class="dcard-act dcard-act-go"
154147
@onclick:stopPropagation="true"
155148
@onclick="HandleReadScriptAsync"
@@ -191,7 +184,6 @@
191184
[Parameter] public EventCallback OnDeleteScript { get; set; }
192185
[Parameter] public EventCallback OnDuplicateScript { get; set; }
193186
[Parameter] public EventCallback OnLearnScript { get; set; }
194-
[Parameter] public EventCallback OnPrepScript { get; set; }
195187
[Parameter] public EventCallback<string?> OnMoveScript { get; set; }
196188
[Parameter] public EventCallback OnOpenScript { get; set; }
197189
[Parameter] public EventCallback OnReadScript { get; set; }
@@ -213,8 +205,6 @@
213205

214206
private Task HandleLearnScriptAsync() => OnLearnScript.InvokeAsync();
215207

216-
private Task HandlePrepScriptAsync() => OnPrepScript.InvokeAsync();
217-
218208
private Task HandleMoveScriptAsync(string? folderId) => OnMoveScript.InvokeAsync(folderId);
219209

220210
private Task HandleOpenScriptAsync() => OnOpenScript.InvokeAsync();

src/PrompterOne.Shared/Library/Pages/LibraryPage.ScriptActions.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,6 @@ private Task LearnScriptAsync(string id)
4040
return Task.CompletedTask;
4141
}
4242

43-
private Task PrepScriptAsync(string id)
44-
{
45-
Navigation.NavigateTo(AppRoutes.PrepWithId(id));
46-
return Task.CompletedTask;
47-
}
48-
4943
private Task ReadScriptAsync(string id)
5044
{
5145
Navigation.NavigateTo(AppRoutes.TeleprompterWithId(id));

src/PrompterOne.Shared/Library/Pages/LibraryPage.razor

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@
9191
OnToggleFavorite="ToggleFavoriteAsync"
9292
OnDeleteScript="DeleteScriptAsync"
9393
OnLearnScript="LearnScriptAsync"
94-
OnPrepScript="PrepScriptAsync"
9594
OnReadScript="ReadScriptAsync"
9695
OnCreateScript="CreateScriptAsync"
9796
OnStartCreateFolder="StartCreateFolder" />

src/PrompterOne.Shared/Localization/SharedResource.de.resx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@
199199
<value>Lernen</value>
200200
</data>
201201
<data name="HeaderPrep" xml:space="preserve">
202-
<value>Vorbereitung</value>
202+
<value>Practice</value>
203203
</data>
204204
<data name="HeaderRead" xml:space="preserve">
205205
<value>Lesen</value>
@@ -337,7 +337,7 @@
337337
<value>Von der Skriptbibliothek bis zur Live-Ausgabe</value>
338338
</data>
339339
<data name="SettingsHelpAppFlowCopy" xml:space="preserve">
340-
<value>Beginnen Sie in Library, schreiben oder importieren Sie ein Skript in Editor, wechseln Sie zu Cards, wenn Sie visuell ohne TPS-Syntax bearbeiten möchten, proben Sie in Learn, lesen Sie in Teleprompter und verwenden Sie Go Live, wenn Sie aufnehmen oder streamen möchten.</value>
340+
<value>Beginnen Sie in Library, schreiben oder importieren Sie ein Skript in Editor, wechseln Sie zu Cards, wenn Sie visuell ohne TPS-Syntax bearbeiten möchten, proben Sie in Practice, lesen Sie in Teleprompter und verwenden Sie Go Live, wenn Sie aufnehmen oder streamen möchten.</value>
341341
</data>
342342
<data name="SettingsHelpTpsBasicsTitle" xml:space="preserve">
343343
<value>TPS-Standardgrundlagen</value>
@@ -355,7 +355,7 @@
355355
<value>Wählen Sie die Oberfläche für die jeweilige Aufgabe</value>
356356
</data>
357357
<data name="SettingsHelpModesCopy" xml:space="preserve">
358-
<value>Source dient der direkten TPS-Bearbeitung, Cards der Bearbeitung gerenderter Blöcke, Graph zeigt die Skriptstruktur, Learn nutzt RSVP für Wort-für-Wort-Übung, Teleprompter ist der Live-Reader, und Go Live kombiniert Lesen mit Kamera-, Aufnahme- und Streaming-Steuerung.</value>
358+
<value>Source dient der direkten TPS-Bearbeitung, Cards der Bearbeitung gerenderter Blöcke, Graph zeigt die Skriptstruktur, Practice nutzt RSVP für Wort-für-Wort-Übung, Teleprompter ist der Live-Reader, und Go Live kombiniert Lesen mit Kamera-, Aufnahme- und Streaming-Steuerung.</value>
359359
</data>
360360
<data name="SettingsHelpLocalFilesTitle" xml:space="preserve">
361361
<value>Lokale Dateien und Verlauf</value>
@@ -1072,7 +1072,7 @@
10721072
<value>Editor öffnen</value>
10731073
</data>
10741074
<data name="OnboardingOpenLearn" xml:space="preserve">
1075-
<value>Learn öffnen</value>
1075+
<value>Practice öffnen</value>
10761076
</data>
10771077
<data name="OnboardingOpenTeleprompter" xml:space="preserve">
10781078
<value>Teleprompter öffnen</value>
@@ -1093,7 +1093,7 @@
10931093
<value>Editor</value>
10941094
</data>
10951095
<data name="OnboardingStepLearn" xml:space="preserve">
1096-
<value>Learn</value>
1096+
<value>Practice</value>
10971097
</data>
10981098
<data name="OnboardingStepTeleprompter" xml:space="preserve">
10991099
<value>Teleprompter</value>
@@ -1114,7 +1114,7 @@
11141114
<value>Durchsuchen Sie Skripte nach Titel, Dateiname oder Textinhalt.</value>
11151115
</data>
11161116
<data name="OnboardingWelcomeBulletModes" xml:space="preserve">
1117-
<value>Ein einziges TPS-Skript speist Editor, Learn, Teleprompter und Go Live statt getrennter Kopien.</value>
1117+
<value>Ein einziges TPS-Skript speist Editor, Practice, Teleprompter und Go Live statt getrennter Kopien.</value>
11181118
</data>
11191119
<data name="OnboardingWelcomeBulletLocal" xml:space="preserve">
11201120
<value>Ihr Workspace bleibt in diesem Browser local-first, mit Autosave, Verlauf, Import und Export.</value>
@@ -1132,7 +1132,7 @@
11321132
<value>TPS bleibt portabel: Sie können es versionieren, diffen, importieren und exportieren, ohne Ihr Skript in eine proprietäre Projektdatei einzusperren.</value>
11331133
</data>
11341134
<data name="OnboardingTpsBulletRuntime" xml:space="preserve">
1135-
<value>PrompterOne verwendet dieselbe TPS-Quelle in Editor, Learn, Teleprompter und Go Live, damit Authoring, Probe und Live-Wiedergabe abgestimmt bleiben.</value>
1135+
<value>PrompterOne verwendet dieselbe TPS-Quelle in Editor, Practice, Teleprompter und Go Live, damit Authoring, Probe und Live-Wiedergabe abgestimmt bleiben.</value>
11361136
</data>
11371137
<data name="OnboardingTpsBulletGlossary" xml:space="preserve">
11381138
<value>Begriffe wie Segment, Block, effektive WPM, Archetyp, Compiler und Player stammen aus der offiziellen TPS-Spezifikation und dem Glossar.</value>
@@ -1162,7 +1162,7 @@
11621162
<value>Mit RSVP proben</value>
11631163
</data>
11641164
<data name="OnboardingLearnBody" xml:space="preserve">
1165-
<value>Learn nutzt RSVP, also Rapid Serial Visual Presentation, um jeweils ein Wort in einem fokussierten Rhythmus anzuzeigen, damit Sie Tempo, Artikulation und Behalten trainieren können.</value>
1165+
<value>Practice nutzt RSVP, also Rapid Serial Visual Presentation, um jeweils ein Wort in einem fokussierten Rhythmus anzuzeigen, damit Sie Tempo, Artikulation und Behalten trainieren können.</value>
11661166
</data>
11671167
<data name="OnboardingLearnBulletRsvp" xml:space="preserve">
11681168
<value>RSVP hält das aktive Wort zentriert, während der nahe Kontext sichtbar bleibt.</value>
@@ -1171,7 +1171,7 @@
11711171
<value>Geschwindigkeitsregler und TPS-Timing-Hinweise helfen Ihnen, näher an der gesprochenen Kadenz zu proben.</value>
11721172
</data>
11731173
<data name="OnboardingLearnBulletContext" xml:space="preserve">
1174-
<value>Nutzen Sie Learn für Wiederholung, Gedächtnisstütze und Tempo-Feedback, bevor Sie vor die Kamera gehen.</value>
1174+
<value>Nutzen Sie Practice für Wiederholung, Gedächtnisstütze und Tempo-Feedback, bevor Sie vor die Kamera gehen.</value>
11751175
</data>
11761176
<data name="OnboardingTeleprompterEyebrow" xml:space="preserve">
11771177
<value>LIVE-LESEN</value>
@@ -1219,7 +1219,7 @@
12191219
<value>Geführte Tour erneut öffnen</value>
12201220
</data>
12211221
<data name="OnboardingReopenBody" xml:space="preserve">
1222-
<value>Verwenden Sie dies, wenn Sie PrompterOne, TPS, RSVP, Editor, Learn, Teleprompter und Go Live erneut sehen möchten.</value>
1222+
<value>Verwenden Sie dies, wenn Sie PrompterOne, TPS, RSVP, Editor, Practice, Teleprompter und Go Live erneut sehen möchten.</value>
12231223
</data>
12241224
<data name="EditorFindPlaceholder" xml:space="preserve">
12251225
<value>Im Skript suchen</value>
@@ -1732,7 +1732,7 @@
17321732
<value>Üben</value>
17331733
</data>
17341734
<data name="LibraryCardPrep" xml:space="preserve">
1735-
<value>Vorbereiten</value>
1735+
<value>Practice</value>
17361736
</data>
17371737
<data name="LibraryCardRead" xml:space="preserve">
17381738
<value>Teleprompter</value>
@@ -1762,7 +1762,7 @@
17621762
<value>{0}/{1} · {2}:{3:00}</value>
17631763
</data>
17641764
<data name="LearnNotesTitle" xml:space="preserve">
1765-
<value>Vorbereitungsnotizen</value>
1765+
<value>Notizen</value>
17661766
</data>
17671767
<data name="LearnNotesSectionFormat" xml:space="preserve">
17681768
<value>Abschnitt: {0}</value>
@@ -1774,7 +1774,7 @@
17741774
<value>Notiz hinzufügen</value>
17751775
</data>
17761776
<data name="LearnNotesEmpty" xml:space="preserve">
1777-
<value>Noch keine Vorbereitungsnotizen.</value>
1777+
<value>Noch keine Notizen.</value>
17781778
</data>
17791779
<data name="RoutesNotFoundTitle" xml:space="preserve">
17801780
<value>Bildschirm nicht gefunden</value>
@@ -2716,7 +2716,7 @@
27162716
<value>Zurück zum Herausgeber</value>
27172717
</data>
27182718
<data name="SettingsHotkeyLearnBackDescription" xml:space="preserve">
2719-
<value>Verlassen Sie Learn und kehren Sie zum aktuellen Skript zurück.</value>
2719+
<value>Verlassen Sie Practice und kehren Sie zum aktuellen Skript zurück.</value>
27202720
</data>
27212721
<data name="SettingsHotkeyLearnPlayPauseLabel" xml:space="preserve">
27222722
<value>Spielen oder pausieren</value>

0 commit comments

Comments
 (0)