AGPL source offer, notices and name cleanup
Every build writes the exact tree it was built from, uncommitted work included, as source.tar.gz next to the app, and names that tree. The sidebar, user menu, sign-in card and version tooltip link to it. Coffey Labs' copyright line is added below Stalwart Labs' in every inherited file changed, and the new files carry Coffey Labs' alone. The upgrade prompt and its links are gone, the edition tooltip is neutral, storage keys and the package description are INBUXA's own, and the README states the lineage once, in the fine print.
This commit is contained in:
@@ -1,55 +1,22 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
|
||||
* SPDX-FileCopyrightText: 2026 Coffey Labs
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
} from '@/components/ui/dialog';
|
||||
import { Button } from '@/components/ui/button';
|
||||
|
||||
interface EnterpriseUpsellProps {
|
||||
open: boolean;
|
||||
onClose: () => void;
|
||||
}
|
||||
|
||||
export function EnterpriseUpsell({ open, onClose }: EnterpriseUpsellProps) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<Dialog open={open} onOpenChange={(isOpen) => !isOpen && onClose()}>
|
||||
<DialogContent className="gap-6">
|
||||
<DialogHeader className="space-y-4">
|
||||
<DialogTitle>{t('enterprise.trialTitle')}</DialogTitle>
|
||||
<DialogDescription>{t('enterprise.trialDescription')}</DialogDescription>
|
||||
</DialogHeader>
|
||||
<DialogFooter className="gap-2 sm:items-center">
|
||||
<a
|
||||
href="https://stalw.art/compare#why-isnt-feature-x-open-source"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-center text-xs text-muted-foreground underline-offset-4 hover:underline sm:mr-auto sm:text-left"
|
||||
>
|
||||
{t('enterprise.whyNotFree')}
|
||||
</a>
|
||||
<Button variant="outline" onClick={onClose}>
|
||||
{t('common.close')}
|
||||
</Button>
|
||||
<Button asChild>
|
||||
<a href="https://license.stalw.art/trial" target="_blank" rel="noopener noreferrer">
|
||||
{t('enterprise.trialButton')}
|
||||
</a>
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
/**
|
||||
* INBUXA: nothing to sell. There is one edition, every feature is in it, and
|
||||
* the edition is never anything but complete (see accountStore), so this
|
||||
* never opens. It stays as an empty component so the places upstream calls
|
||||
* it from merge without conflicts.
|
||||
*/
|
||||
export function EnterpriseUpsell({ open }: EnterpriseUpsellProps) {
|
||||
void open;
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
|
||||
* SPDX-FileCopyrightText: 2026 Coffey Labs
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
@@ -17,7 +18,7 @@ export function DefaultLogo() {
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="165 35 616 130"
|
||||
aria-label={t('logo.stalwartAlt', 'INBUXA')}
|
||||
aria-label={t('logo.inbuxaAlt', 'INBUXA')}
|
||||
className="h-7 w-auto max-w-[320px]"
|
||||
>
|
||||
<image x="165.85" y="35.00" width="109.39" height="130.00" href={inbuxaMark} />
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 Coffey Labs
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { sourceDownloadUrl } from '@/lib/sourceDownload';
|
||||
|
||||
/**
|
||||
* The AGPL's offer to everyone using this interface over the network: the
|
||||
* exact source of the version running, with that version named.
|
||||
*/
|
||||
export function SourceLink({ className }: { className?: string }) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<a href={sourceDownloadUrl()} download className={className}>
|
||||
{t('source.download', 'Source code of this version ({{id}}), AGPL-3.0', { id: __SOURCE_ID__ })}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user