Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
62f76a9
Refactor CommentDialog into entry-editor/comments components.
hahn-kev Jul 22, 2026
e17f850
Redesign FwLite comments panel with responsive docked layout.
hahn-kev Jul 23, 2026
6bab9af
Use a snap-point comments drawer on mobile and tablet.
hahn-kev Jul 23, 2026
3cd4cf9
Add FW Lite design system bundle for design agent sync
hahn-kev Jul 23, 2026
3758c72
Fix drawer handle visibility in mobile comments panel
hahn-kev Jul 23, 2026
f0c8e72
Revert "Add FW Lite design system bundle for design agent sync"
hahn-kev Jul 23, 2026
e32cf01
Merge remote-tracking branch 'origin/develop' into comment-updates
hahn-kev Jul 29, 2026
b94fafa
enable autofocus on mount for text area
hahn-kev Jul 29, 2026
b5a859a
autofocus inputs
hahn-kev Jul 29, 2026
246cf1e
change add button to use an icon and Conversation. Show the button in…
hahn-kev Jul 29, 2026
0e27274
add debug aide for project data and features
hahn-kev Jul 29, 2026
030bd75
commenting requires write permission
hahn-kev Jul 29, 2026
4d6678c
ensure example projects have a user id so we can make comments in them
hahn-kev Jul 29, 2026
1c5067d
move resolved threads into a collapsible section and tooltip the reso…
hahn-kev Jul 29, 2026
cb9113d
show edited on comments and view history on click
hahn-kev Jul 29, 2026
d668d31
show avatar when making comments
hahn-kev Jul 29, 2026
47ad1e8
show a collapse icon and animate on open/close
hahn-kev Jul 29, 2026
70b8314
show unread status and count
hahn-kev Jul 29, 2026
6a7b196
show an unread label on the comments button
hahn-kev Jul 29, 2026
345f688
Fix lint and svelte-check failures in comments panel
hahn-kev Jul 30, 2026
43f9bf2
Merge remote-tracking branch 'origin/develop' into claude/pr-2470-ci-…
hahn-kev Jul 30, 2026
ae3d0f1
Re-trigger CI (flaky timedatectl setup step)
hahn-kev Jul 30, 2026
ebb3e6a
Set test timezone via TZ env var instead of timedatectl
hahn-kev Jul 30, 2026
cd0b288
tweak unread stuff
hahn-kev Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions .github/workflows/fw-lite.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,18 @@ jobs:
- name: Check for stale generated TypeScript types
run: task fw-lite:has-stale-generated-types -- --no-build

- name: Set a non-UTC timezone so timezone bugs are observable
# Hosted runners default to UTC, which hides date bugs: the error equals the local UTC
# offset, which is zero on UTC (see #2092). Eastern is non-UTC, observes DST, and has a
# negative offset, so date round-trips run the way real users actually hit them.
run: sudo timedatectl set-timezone America/New_York

- name: Dotnet test
# Benchmarks run in a separate Release-mode job — see `benchmark` below.
# MAUI tests run in publish-win. `trx` logger writes result files for the TestHistory
# upload below; --results-directory collects one .trx per test project into a single folder.
#
# TZ forces a non-UTC timezone so date bugs are observable: on UTC the error equals the
# local offset, which is zero and hides bugs (see #2092). Eastern is non-UTC, observes DST,
# and has a negative offset. We set TZ instead of `timedatectl set-timezone` because hosted
# runners no longer allow it ("Failed to set time zone: Access denied"); .NET honours TZ for
# TimeZoneInfo.Local on Linux, so this needs no privileges and only affects the tests.
env:
TZ: America/New_York
run: dotnet test FwLiteCore.slnf --logger GitHubActions --logger trx --results-directory "${{ github.workspace }}/TestResults" --no-build -p:BuildAndroid=false --filter "Category!=Benchmark"

- name: Publish test results to TestHistory
Expand Down
2 changes: 1 addition & 1 deletion backend/FwLite/LcmCrdt/CrdtProjectsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ public record CreateProjectRequest(
public async Task<CrdtProject> CreateExampleProject(string name)
{
// Code must satisfy the lowercase-only ProjectCode rule; the display name keeps its casing.
return await CreateProjectFromTemplate(new(name, name.ToLowerInvariant(), AfterCreate: ExampleProjectData.Seed, Role: UserProjectRole.Manager), vernacularWs: "de");
return await CreateProjectFromTemplate(new(name, name.ToLowerInvariant(), AfterCreate: ExampleProjectData.Seed, Role: UserProjectRole.Manager, AuthenticatedUser: "Example User", AuthenticatedUserId: "example-user"), vernacularWs: "de");
}

/// <summary>
Expand Down
2 changes: 2 additions & 0 deletions frontend/viewer/src/css-breakpoints.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
// used in the is-mobile.svelte hook and for the tailwind md breakpoint
export const MOBILE_BREAKPOINT = 768;
// used for comments sidebar vs bottom dock (and Tailwind xl)
export const EXTRA_LARGE_BREAKPOINT = 1280;
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
<script lang="ts">
import {watch} from 'runed';
import {tick} from 'svelte';
import {Drawer as DrawerPrimitive} from 'vaul-svelte';

let {
shouldScaleBackground = true,
open = $bindable(false),
activeSnapPoint = $bindable(null),
snapPoints,
...restProps
}: DrawerPrimitive.RootProps = $props();

// Same Svelte 5 activeSnapPoint workaround as drawer.svelte
// https://github.com/huntabyte/vaul-svelte/issues/129
watch(
() => open,
(isOpen) => {
if (!isOpen || !snapPoints?.length || activeSnapPoint == null) return;
const target = activeSnapPoint;
void tick().then(async () => {
activeSnapPoint = null;
await tick();
if (open) activeSnapPoint = target;
});
},
);
</script>

<DrawerPrimitive.NestedRoot {shouldScaleBackground} bind:open bind:activeSnapPoint {...restProps} />
<DrawerPrimitive.NestedRoot {shouldScaleBackground} {snapPoints} bind:open bind:activeSnapPoint {...restProps} />
22 changes: 21 additions & 1 deletion frontend/viewer/src/lib/components/ui/drawer/drawer.svelte
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<script lang="ts">
import {IsMobile} from '$lib/hooks/is-mobile.svelte';
import {Drawer as DrawerPrimitive} from 'vaul-svelte';
import {useBackHandler} from '$lib/utils/back-handler.svelte';
import {watch} from 'runed';
import {tick} from 'svelte';
import {Drawer as DrawerPrimitive} from 'vaul-svelte';

let {
shouldScaleBackground = true,
Expand All @@ -13,11 +15,29 @@
disableBackHandler?: boolean;
} = $props();

const snapPoints = $derived(restProps.snapPoints);

useBackHandler({
addToStack: () => open && IsMobile.value && !disableBackHandler,
onBack: () => (open = false),
key: 'drawer',
});

// Workaround for vaul-svelte + Svelte 5: bind:activeSnapPoint is ignored on open
// (drawer lands on snapPoints[0] until interaction). Re-apply after mount/tick.
// https://github.com/huntabyte/vaul-svelte/issues/129
watch(
() => open,
(isOpen) => {
if (!isOpen || !snapPoints?.length || activeSnapPoint == null) return;
const target = activeSnapPoint;
void tick().then(async () => {
activeSnapPoint = null;
await tick();
if (open) activeSnapPoint = target;
});
},
);
</script>

<DrawerPrimitive.Root {shouldScaleBackground} bind:open bind:activeSnapPoint {...restProps} />
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<script lang="ts">
import {cn, type WithElementRef, type WithoutChildren} from '$lib/utils.js';
import {onMount} from 'svelte';
import type {HTMLTextareaAttributes} from 'svelte/elements';

let {
Expand All @@ -9,6 +10,11 @@
'data-slot': dataSlot = 'textarea',
...restProps
}: WithoutChildren<WithElementRef<HTMLTextareaAttributes>> = $props();
onMount(() => {
if (restProps.autofocus) {
ref?.focus();
}
});
</script>

<textarea
Expand Down
Loading
Loading