- Timezone: curated USelectMenu dropdown (app/config/timezones.js), preserves unknown saved values
- Profile save now uses useToast() for success/error; remove inline save banner
- Nav onboarding dot nudged down 1px for optical alignment with lowercase text
- Onboarding: skip a suggestion with POST /api/onboarding/track {skip}; member.onboarding.skipped map; does not affect graduation
- CirclePicker takes :saved-value so 'Current' badge stays until save completes
- PrivacyToggle is binary (USwitch labeled Private); member schema enum reduced to ['members','private']; zod coerces legacy 'public'
- New /member/payment-setup page: HelcimPay $0 verify + update-contribution, wired from account.vue via requiresPaymentSetup redirect
- Helcim portal: NUXT_PUBLIC_HELCIM_PORTAL_URL env + account.vue 'Manage billing in Helcim' link
- Migration script: scripts/migrate-privacy-public-to-members.js
44 lines
909 B
Vue
44 lines
909 B
Vue
<template>
|
|
<label class="priv">
|
|
<USwitch
|
|
:model-value="isPrivate"
|
|
aria-label="Private"
|
|
size="xs"
|
|
@update:model-value="onChange"
|
|
/>
|
|
<span class="priv-label">Private</span>
|
|
</label>
|
|
</template>
|
|
|
|
<script setup>
|
|
const props = defineProps({
|
|
modelValue: { type: String, default: "members" },
|
|
});
|
|
|
|
const emit = defineEmits(["update:modelValue"]);
|
|
|
|
// Treat legacy "public" values as "members" (visible to signed-in members).
|
|
const isPrivate = computed(() => props.modelValue === "private");
|
|
|
|
const onChange = (val) => {
|
|
emit("update:modelValue", val ? "private" : "members");
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
.priv {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
font-size: 10px;
|
|
font-family: "Commit Mono", monospace;
|
|
letter-spacing: 0.04em;
|
|
color: var(--text-faint);
|
|
user-select: none;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.priv-label {
|
|
line-height: 1;
|
|
}
|
|
</style>
|