@burdenoff/microfe-comradecircle 2026.704.2 → 2026.704.3

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.
Files changed (41) hide show
  1. package/dist/comradecircle/components/Avatar.js +40 -17
  2. package/dist/comradecircle/components/Avatar.js.map +1 -1
  3. package/dist/comradecircle/components/AvatarUploadField.js +25 -14
  4. package/dist/comradecircle/components/AvatarUploadField.js.map +1 -1
  5. package/dist/comradecircle/components/CircleCard.js +54 -52
  6. package/dist/comradecircle/components/CircleCard.js.map +1 -1
  7. package/dist/comradecircle/components/CommentThread.js +80 -64
  8. package/dist/comradecircle/components/CommentThread.js.map +1 -1
  9. package/dist/comradecircle/components/EventCard.js +84 -58
  10. package/dist/comradecircle/components/EventCard.js.map +1 -1
  11. package/dist/comradecircle/components/MemberIdentity.js +2 -1
  12. package/dist/comradecircle/components/MemberIdentity.js.map +1 -1
  13. package/dist/comradecircle/components/PollCard.js +65 -44
  14. package/dist/comradecircle/components/PollCard.js.map +1 -1
  15. package/dist/comradecircle/components/PostCard.js +1 -1
  16. package/dist/comradecircle/components/PostCard.js.map +1 -1
  17. package/dist/comradecircle/components/ReactionBar.js +1 -1
  18. package/dist/comradecircle/components/ReactionBar.js.map +1 -1
  19. package/dist/comradecircle/components/StateViews.js +1 -16
  20. package/dist/comradecircle/components/StateViews.js.map +1 -1
  21. package/dist/comradecircle/components/StatusBadge.js +1 -1
  22. package/dist/comradecircle/components/StatusBadge.js.map +1 -1
  23. package/dist/comradecircle/hooks/useComradeCircleApi.js +1 -1
  24. package/dist/comradecircle/hooks/useComradeCircleApi.js.map +1 -1
  25. package/dist/comradecircle/pages/FeedPage.js +79 -33
  26. package/dist/comradecircle/pages/FeedPage.js.map +1 -1
  27. package/dist/comradecircle/pages/circles/CircleDetailPage.js +354 -243
  28. package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -1
  29. package/dist/comradecircle/pages/circles/CirclesPage.js +97 -47
  30. package/dist/comradecircle/pages/circles/CirclesPage.js.map +1 -1
  31. package/dist/comradecircle/pages/events/EventDetailPage.js +193 -126
  32. package/dist/comradecircle/pages/events/EventDetailPage.js.map +1 -1
  33. package/dist/comradecircle/pages/events/EventsPage.js +74 -34
  34. package/dist/comradecircle/pages/events/EventsPage.js.map +1 -1
  35. package/dist/comradecircle/pages/members/MemberProfilePage.js +154 -82
  36. package/dist/comradecircle/pages/members/MemberProfilePage.js.map +1 -1
  37. package/dist/comradecircle/pages/members/MembersPage.js +140 -71
  38. package/dist/comradecircle/pages/members/MembersPage.js.map +1 -1
  39. package/dist/comradecircle/pages/profile/MyProfilePage.js +298 -202
  40. package/dist/comradecircle/pages/profile/MyProfilePage.js.map +1 -1
  41. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MyProfilePage.js","names":[],"sources":["../../../../src/comradecircle/pages/profile/MyProfilePage.tsx"],"sourcesContent":["/**\n * MyProfilePage — create or edit the caller's own social profile.\n * @module comradecircle/pages/profile\n *\n * A member's {@link ComProfile} is their identity across every circle — the\n * name, headline, presence and avatar initials that `MemberIdentity` resolves\n * everywhere a `memberId` appears. This page reads the caller's own profile\n * (`comProfile` by `currentUser.id`) and upserts it (`comUpsertProfile`). It\n * works both when a profile already exists (edit) and when none does yet\n * (create). The editor is only mounted once the profile query has settled and\n * seeds its fields via lazy state initialisers (keyed on the profile id), so no\n * state-syncing effect is needed. A live preview card mirrors the form.\n */\n\nimport { useState } from 'react';\nimport { Save } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n GlassCard,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { Avatar } from '../../components/Avatar';\nimport { AvatarUploadField } from '../../components/AvatarUploadField';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { TagInput } from '../../components/TagInput';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { useComProfile, useComUpsertProfile } from '../../hooks';\nimport { useComradeCircle } from '../../context';\nimport { formatEnumLabel } from '../../utils';\nimport { notify, describeError } from '../../lib/toast';\nimport type { ComPresence, ComProfile } from '../../types';\n\nconst PRESENCE_OPTIONS: ComPresence[] = ['ONLINE', 'AWAY', 'BUSY', 'OFFLINE'];\n\nexport function MyProfilePage() {\n const { currentUser } = useComradeCircle();\n const memberId = currentUser?.id;\n const { data: profile, isLoading, isError, refetch } = useComProfile(memberId);\n\n // Seed create-mode from the shell identity so the name field is not blank.\n const identityName = currentUser?.name ?? currentUser?.email ?? '';\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Profile\">\n <LoadingView label=\"Loading your profile…\" />\n </PageLayout>\n );\n }\n\n // A missing profile is NOT an error (the resolver returns null → create mode).\n // Only a genuine fetch failure lands here — surface it rather than silently\n // showing a blank form, which an upsert save could use to overwrite an\n // existing profile the caller never actually saw.\n if (isError) {\n return (\n <PageLayout title=\"My Profile\">\n <ErrorView\n title=\"We couldn't load your profile\"\n message=\"Something went wrong while fetching your profile. Retry before editing so you don't overwrite saved details.\"\n onRetry={() => refetch()}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"My Profile\"\n description=\"Your profile is your identity across every circle — it's how members recognise, find and follow you.\"\n >\n <ProfileEditor\n key={profile?.id ?? 'new'}\n initialProfile={profile ?? null}\n identityName={identityName}\n />\n </PageLayout>\n );\n}\n\ninterface ProfileEditorProps {\n initialProfile: ComProfile | null;\n identityName: string;\n}\n\nfunction ProfileEditor({ initialProfile, identityName }: ProfileEditorProps) {\n const upsert = useComUpsertProfile();\n\n const [displayName, setDisplayName] = useState(initialProfile?.displayName ?? identityName);\n const [headline, setHeadline] = useState(initialProfile?.headline ?? '');\n const [bio, setBio] = useState(initialProfile?.bio ?? '');\n const [interests, setInterests] = useState<string[]>(initialProfile?.interests ?? []);\n const [skills, setSkills] = useState<string[]>(initialProfile?.skills ?? []);\n const [presence, setPresence] = useState<ComPresence>(initialProfile?.presence ?? 'ONLINE');\n const [discoverable, setDiscoverable] = useState(initialProfile?.discoverable ?? true);\n const [avatarFileId, setAvatarFileId] = useState<string | null>(\n initialProfile?.avatar?.id ?? null\n );\n\n const previewName = displayName.trim();\n\n const handleSave = async () => {\n const name = displayName.trim();\n if (!name) {\n notify.error('Display name required', 'Add a name so members can recognise you.');\n return;\n }\n try {\n await upsert.mutateAsync({\n displayName: name,\n headline: headline.trim() || null,\n bio: bio.trim() || null,\n avatarFileId,\n interests,\n skills,\n presence,\n discoverable,\n });\n notify.success('Profile saved');\n } catch (err) {\n notify.error('Could not save profile', describeError(err));\n }\n };\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-[1fr_320px]\">\n {/* Form */}\n <GlassCard treatment=\"plain\" className=\"order-2 p-5 sm:p-6 lg:order-1\">\n <div className=\"flex flex-col gap-5\">\n <div className=\"grid gap-1.5\">\n <Label>Avatar</Label>\n <AvatarUploadField\n fileId={avatarFileId}\n name={previewName || identityName}\n onUploaded={setAvatarFileId}\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-name\">Display name</Label>\n <Input\n id=\"profile-name\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"How members see you\"\n required\n aria-required=\"true\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-headline\">Headline</Label>\n <Input\n id=\"profile-headline\"\n value={headline}\n onChange={(e) => setHeadline(e.target.value)}\n placeholder=\"e.g. Community organiser · Photographer\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-bio\">Bio</Label>\n <Textarea\n id=\"profile-bio\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n rows={4}\n placeholder=\"Tell circles a little about yourself.\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-interests\">Interests</Label>\n <TagInput\n id=\"profile-interests\"\n value={interests}\n onChange={setInterests}\n placeholder=\"Add an interest…\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-skills\">Skills</Label>\n <TagInput\n id=\"profile-skills\"\n value={skills}\n onChange={setSkills}\n placeholder=\"Add a skill…\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-presence\">Presence</Label>\n <Select value={presence} onValueChange={(v) => setPresence(v as ComPresence)}>\n <SelectTrigger id=\"profile-presence\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRESENCE_OPTIONS.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-start justify-between gap-4 rounded-xl border border-border-seam bg-bg-surface p-3.5\">\n <div className=\"min-w-0\">\n <Label htmlFor=\"profile-discoverable\">List me in the member directory</Label>\n <p className=\"mt-1 text-xs text-text-tertiary\">\n When on, your profile appears in the discoverable member directory so others can\n find and follow you. Turn it off to stay unlisted.\n </p>\n </div>\n <Switch\n id=\"profile-discoverable\"\n checked={discoverable}\n onCheckedChange={setDiscoverable}\n aria-label=\"List me in the member directory\"\n className=\"mt-0.5 shrink-0\"\n />\n </div>\n\n <div className=\"flex justify-end pt-1\">\n <Button onClick={handleSave} disabled={upsert.isPending}>\n <Save className=\"mr-1.5 h-4 w-4\" />\n {upsert.isPending ? 'Saving…' : 'Save profile'}\n </Button>\n </div>\n </div>\n </GlassCard>\n\n {/* Live preview */}\n <div className=\"order-1 lg:order-2\">\n <GlassCard treatment=\"plain\" className=\"p-5 lg:sticky lg:top-6\">\n <p className=\"mb-4 text-xs font-semibold uppercase tracking-wide text-text-tertiary\">\n Preview\n </p>\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Avatar\n name={previewName || identityName}\n size=\"xl\"\n presence={presence}\n fileId={avatarFileId}\n />\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-lg font-semibold text-text-primary\">\n {previewName || 'Your name'}\n </h3>\n {headline.trim() && (\n <p className=\"mt-0.5 text-sm text-text-secondary\">{headline.trim()}</p>\n )}\n </div>\n <StatusBadge status={presence} />\n </div>\n\n {bio.trim() && (\n <p className=\"mt-4 whitespace-pre-wrap break-words text-center text-sm text-text-secondary\">\n {bio.trim()}\n </p>\n )}\n\n {interests.length > 0 && (\n <div className=\"mt-5\">\n <p className=\"mb-1.5 text-xs font-medium text-text-tertiary\">Interests</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {interests.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {skills.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"mb-1.5 text-xs font-medium text-text-tertiary\">Skills</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {skills.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-[var(--color-accent-soft)] px-2.5 py-0.5 text-xs font-medium text-text-primary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {!discoverable && (\n <p className=\"mt-5 text-center text-xs text-text-tertiary\">\n Hidden from the member directory.\n </p>\n )}\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MyProfilePage.js","names":[],"sources":["../../../../src/comradecircle/pages/profile/MyProfilePage.tsx"],"sourcesContent":["/**\n * MyProfilePage — create or edit the caller's own social profile.\n * @module comradecircle/pages/profile\n *\n * A member's {@link ComProfile} is their identity across every circle — the\n * name, headline, presence and avatar initials that `MemberIdentity` resolves\n * everywhere a `memberId` appears. This page reads the caller's own profile\n * (`comProfile` by `currentUser.id`) and upserts it (`comUpsertProfile`). It\n * works both when a profile already exists (edit) and when none does yet\n * (create). The editor is only mounted once the profile query has settled and\n * seeds its fields via lazy state initialisers (keyed on the profile id), so no\n * state-syncing effect is needed. A social-card live preview mirrors the form,\n * a completeness meter nudges the caller to fill it in, and Save stays disabled\n * until something actually changes.\n */\n\nimport { useState, type ReactNode } from 'react';\nimport { Save } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n GlassCard,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { Avatar } from '../../components/Avatar';\nimport { AvatarUploadField } from '../../components/AvatarUploadField';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { TagInput } from '../../components/TagInput';\nimport { MiniBar } from '../../components/MiniBar';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { useComProfile, useComUpsertProfile } from '../../hooks';\nimport { useComradeCircle } from '../../context';\nimport { formatEnumLabel } from '../../utils';\nimport { notify, describeError } from '../../lib/toast';\nimport type { ComPresence, ComProfile } from '../../types';\n\nconst PRESENCE_OPTIONS: ComPresence[] = ['ONLINE', 'AWAY', 'BUSY', 'OFFLINE'];\n\nexport function MyProfilePage() {\n const { currentUser } = useComradeCircle();\n const memberId = currentUser?.id;\n const { data: profile, isLoading, isError, refetch } = useComProfile(memberId);\n\n // Seed create-mode from the shell identity so the name field is not blank.\n const identityName = currentUser?.name ?? currentUser?.email ?? '';\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Profile\">\n <LoadingView label=\"Loading your profile…\" />\n </PageLayout>\n );\n }\n\n // A missing profile is NOT an error (the resolver returns null → create mode).\n // Only a genuine fetch failure lands here — surface it rather than silently\n // showing a blank form, which an upsert save could use to overwrite an\n // existing profile the caller never actually saw.\n if (isError) {\n return (\n <PageLayout title=\"My Profile\">\n <ErrorView\n title=\"We couldn't load your profile\"\n message=\"Something went wrong while fetching your profile. Retry before editing so you don't overwrite saved details.\"\n onRetry={() => refetch()}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"My Profile\"\n description=\"Your profile is your identity across every circle — it's how members recognise, find and follow you.\"\n >\n <ProfileEditor\n key={profile?.id ?? 'new'}\n initialProfile={profile ?? null}\n identityName={identityName}\n />\n </PageLayout>\n );\n}\n\ninterface ProfileEditorProps {\n initialProfile: ComProfile | null;\n identityName: string;\n}\n\n/** A subtle uppercase section header that groups the form. */\nfunction SectionLabel({ children }: { children: ReactNode }) {\n return (\n <p className=\"text-xs font-semibold uppercase tracking-[0.08em] text-text-tertiary\">\n {children}\n </p>\n );\n}\n\n/** Order-sensitive string-array equality (TagInput only appends / removes). */\nfunction sameTags(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\nfunction ProfileEditor({ initialProfile, identityName }: ProfileEditorProps) {\n const upsert = useComUpsertProfile();\n\n // The pristine baseline. Recomputed from props each render, but props are\n // stable for this component's life (ProfileEditor is keyed on the profile id),\n // so after a successful save the refetched profile flows back in here and the\n // form settles to \"no changes\" without any effect.\n const initial = {\n displayName: initialProfile?.displayName ?? identityName,\n headline: initialProfile?.headline ?? '',\n bio: initialProfile?.bio ?? '',\n interests: initialProfile?.interests ?? [],\n skills: initialProfile?.skills ?? [],\n presence: initialProfile?.presence ?? ('ONLINE' as ComPresence),\n discoverable: initialProfile?.discoverable ?? true,\n avatarFileId: initialProfile?.avatar?.id ?? null,\n };\n\n const [displayName, setDisplayName] = useState(initial.displayName);\n const [headline, setHeadline] = useState(initial.headline);\n const [bio, setBio] = useState(initial.bio);\n const [interests, setInterests] = useState<string[]>(initial.interests);\n const [skills, setSkills] = useState<string[]>(initial.skills);\n const [presence, setPresence] = useState<ComPresence>(initial.presence);\n const [discoverable, setDiscoverable] = useState(initial.discoverable);\n const [avatarFileId, setAvatarFileId] = useState<string | null>(initial.avatarFileId);\n\n const previewName = displayName.trim();\n\n // Profile completeness — derived entirely from the live (real) field values.\n const checklist: { done: boolean; nudge: string }[] = [\n {\n done: Boolean(avatarFileId),\n nudge: 'Add a profile photo so members recognise you at a glance.',\n },\n { done: previewName.length > 0, nudge: 'Add a display name so members know who you are.' },\n { done: headline.trim().length > 0, nudge: 'Add a headline to sum yourself up in one line.' },\n { done: bio.trim().length > 0, nudge: 'Write a short bio to help circles get to know you.' },\n { done: interests.length > 0, nudge: 'Add a few interests to help you find your people.' },\n { done: skills.length > 0, nudge: 'List some skills so circles know what you bring.' },\n ];\n const completedCount = checklist.filter((c) => c.done).length;\n const completeness = Math.round((completedCount / checklist.length) * 100);\n const nextNudge =\n checklist.find((c) => !c.done)?.nudge ?? 'Your profile is complete — it looks great.';\n\n // Dirty tracking — Save stays disabled until something actually changes.\n const isDirty =\n displayName !== initial.displayName ||\n headline !== initial.headline ||\n bio !== initial.bio ||\n presence !== initial.presence ||\n discoverable !== initial.discoverable ||\n avatarFileId !== initial.avatarFileId ||\n !sameTags(interests, initial.interests) ||\n !sameTags(skills, initial.skills);\n\n const handleSave = async () => {\n const name = displayName.trim();\n if (!name) {\n notify.error('Display name required', 'Add a name so members can recognise you.');\n return;\n }\n try {\n await upsert.mutateAsync({\n displayName: name,\n headline: headline.trim() || null,\n bio: bio.trim() || null,\n avatarFileId,\n interests,\n skills,\n presence,\n discoverable,\n });\n notify.success('Profile saved');\n } catch (err) {\n notify.error('Could not save profile', describeError(err));\n }\n };\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-[1fr_320px]\">\n {/* Form */}\n <GlassCard treatment=\"plain\" className=\"order-2 p-5 sm:p-6 lg:order-1\">\n <div className=\"flex flex-col gap-6\">\n {/* Completeness meter — nudges the caller toward a richer profile. */}\n <div className=\"grid gap-2 rounded-xl border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <SectionLabel>Profile completeness</SectionLabel>\n <span className=\"text-sm font-semibold tabular-nums text-text-primary\">\n {completeness}%\n </span>\n </div>\n <MiniBar\n value={completeness}\n height={8}\n barClassName=\"bg-gradient-to-r from-accent to-[var(--color-accent-soft)]\"\n />\n <p className=\"text-xs text-text-secondary\">{nextNudge}</p>\n </div>\n\n {/* Identity */}\n <section className=\"grid gap-4\">\n <SectionLabel>Identity</SectionLabel>\n\n <div className=\"grid gap-1.5\">\n <Label>Avatar</Label>\n <AvatarUploadField\n fileId={avatarFileId}\n name={previewName || identityName}\n onUploaded={setAvatarFileId}\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-name\">Display name</Label>\n <Input\n id=\"profile-name\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"How members see you\"\n required\n aria-required=\"true\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-headline\">Headline</Label>\n <Input\n id=\"profile-headline\"\n value={headline}\n onChange={(e) => setHeadline(e.target.value)}\n placeholder=\"e.g. Community organiser · Photographer\"\n />\n </div>\n </section>\n\n {/* About you */}\n <section className=\"grid gap-4 border-t border-border-seam pt-6\">\n <SectionLabel>About you</SectionLabel>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-bio\">Bio</Label>\n <Textarea\n id=\"profile-bio\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n rows={4}\n placeholder=\"Tell circles a little about yourself.\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-interests\">Interests</Label>\n <TagInput\n id=\"profile-interests\"\n value={interests}\n onChange={setInterests}\n placeholder=\"Add an interest…\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-skills\">Skills</Label>\n <TagInput\n id=\"profile-skills\"\n value={skills}\n onChange={setSkills}\n placeholder=\"Add a skill…\"\n />\n </div>\n </section>\n\n {/* Visibility */}\n <section className=\"grid gap-4 border-t border-border-seam pt-6\">\n <SectionLabel>Visibility</SectionLabel>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"profile-presence\">Presence</Label>\n <Select value={presence} onValueChange={(v) => setPresence(v as ComPresence)}>\n <SelectTrigger id=\"profile-presence\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRESENCE_OPTIONS.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-start justify-between gap-4 rounded-xl border border-border-seam bg-bg-surface p-3.5\">\n <div className=\"min-w-0\">\n <Label htmlFor=\"profile-discoverable\">List me in the member directory</Label>\n <p className=\"mt-1 text-xs text-text-tertiary\">\n When on, your profile appears in the discoverable member directory so others can\n find and follow you. Turn it off to stay unlisted.\n </p>\n </div>\n <Switch\n id=\"profile-discoverable\"\n checked={discoverable}\n onCheckedChange={setDiscoverable}\n aria-label=\"List me in the member directory\"\n className=\"mt-0.5 shrink-0\"\n />\n </div>\n </section>\n\n {/* Save */}\n <div className=\"flex flex-wrap items-center justify-end gap-3 border-t border-border-seam pt-5\">\n {!isDirty && !upsert.isPending && (\n <span className=\"text-xs text-text-tertiary\">No changes to save</span>\n )}\n <Button onClick={handleSave} disabled={upsert.isPending || !isDirty}>\n <Save className=\"mr-1.5 h-4 w-4\" />\n {upsert.isPending ? 'Saving…' : 'Save profile'}\n </Button>\n </div>\n </div>\n </GlassCard>\n\n {/* Live preview — the member's-eye view of this profile. */}\n <div className=\"order-1 lg:order-2\">\n <GlassCard treatment=\"plain\" className=\"overflow-hidden p-0 lg:sticky lg:top-6\">\n {/* Social cover strip — the xl avatar overlaps its bottom edge below. */}\n <div className=\"relative h-24 bg-gloss-card\">\n <div\n className=\"absolute inset-0 bg-gradient-to-br from-[var(--color-accent-soft)] via-[var(--color-accent-soft)]/30 to-transparent\"\n aria-hidden=\"true\"\n />\n <span className=\"absolute right-3 top-3 rounded-full bg-bg-surface/80 px-2 py-0.5 text-[0.62rem] font-medium uppercase tracking-[0.08em] text-text-tertiary backdrop-blur\">\n How members see you\n </span>\n </div>\n\n <div className=\"px-5 pb-5\">\n <div className=\"-mt-12 flex flex-col items-center text-center\">\n <Avatar\n name={previewName || identityName}\n size=\"xl\"\n presence={presence}\n fileId={avatarFileId}\n ring\n />\n <h3 className=\"mt-3 max-w-full truncate text-lg font-semibold text-text-primary\">\n {previewName || 'Your name'}\n </h3>\n {headline.trim() && (\n <p className=\"mt-0.5 max-w-full truncate text-sm text-text-secondary\">\n {headline.trim()}\n </p>\n )}\n <div className=\"mt-2.5\">\n <StatusBadge status={presence} />\n </div>\n </div>\n\n {bio.trim() && (\n <p className=\"mt-4 whitespace-pre-wrap break-words text-center text-sm text-text-secondary\">\n {bio.trim()}\n </p>\n )}\n\n {interests.length > 0 && (\n <div className=\"mt-5\">\n <p className=\"mb-1.5 text-xs font-medium text-text-tertiary\">Interests</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {interests.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {skills.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"mb-1.5 text-xs font-medium text-text-tertiary\">Skills</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {skills.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-[var(--color-accent-soft)] px-2.5 py-0.5 text-xs font-medium text-text-primary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {!discoverable && (\n <p className=\"mt-5 text-center text-xs text-text-tertiary\">\n Hidden from the member directory.\n </p>\n )}\n </div>\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-comradecircle",
3
- "version": "2026.704.2",
3
+ "version": "2026.704.3",
4
4
  "description": "Burdenoff ComradeCircle Microfrontend",
5
5
  "type": "module",
6
6
  "files": [