Merge remote-tracking branch 'origin/develop' into bump-1.0

merge-requests/69/head
Alex Gleason 4 years ago
commit 836f37c3e2
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7

@ -30,15 +30,6 @@ jest:
stage: test
script: yarn test:jest
build-development:
stage: build
script: yarn build
variables:
NODE_ENV: development
artifacts:
paths:
- static
build-production:
stage: build
script: yarn build
@ -48,11 +39,13 @@ build-production:
paths:
- static
i18n:
stage: build
script: yarn manage:translations
variables:
NODE_ENV: development
before_script:
- yarn
- yarn build
# Supposed to fail when translations are outdated, instead always passes
#
# i18n:
# stage: build
# script: yarn manage:translations
# variables:
# NODE_ENV: development
# before_script:
# - yarn
# - yarn build

@ -17,7 +17,7 @@ describe('fetchAboutPage()', () => {
const expectedActions = [
{ type: FETCH_ABOUT_PAGE_REQUEST, slug: 'index' },
{ type: FETCH_ABOUT_PAGE_SUCCESS, slug: 'index' },
{ type: FETCH_ABOUT_PAGE_SUCCESS, slug: 'index', html: '<h1>Hello world</h1>' },
];
const store = mockStore(ImmutableMap());
@ -29,11 +29,11 @@ describe('fetchAboutPage()', () => {
it('creates the expected actions on failure', () => {
const expectedActions = [
{ type: FETCH_ABOUT_PAGE_REQUEST, slug: 'asdf' },
{ type: FETCH_ABOUT_PAGE_FAIL, slug: 'asdf' },
{ type: FETCH_ABOUT_PAGE_FAIL, slug: 'asdf', error: new Error('Request failed with status code 404') },
];
const store = mockStore(ImmutableMap());
return store.dispatch(fetchAboutPage('asdf')).then(() => {
return store.dispatch(fetchAboutPage('asdf')).catch(() => {
expect(store.getActions()).toEqual(expectedActions);
});
});

@ -7,10 +7,12 @@ export const FETCH_ABOUT_PAGE_FAIL = 'FETCH_ABOUT_PAGE_FAIL';
export function fetchAboutPage(slug = 'index') {
return (dispatch, getState) => {
dispatch({ type: FETCH_ABOUT_PAGE_REQUEST, slug });
return api(getState).get(`/instance/about/${slug}.html`).then(() => {
dispatch({ type: FETCH_ABOUT_PAGE_SUCCESS, slug });
return api(getState).get(`/instance/about/${slug}.html`).then(response => {
dispatch({ type: FETCH_ABOUT_PAGE_SUCCESS, slug, html: response.data });
return response.data;
}).catch(error => {
dispatch({ type: FETCH_ABOUT_PAGE_FAIL, slug });
dispatch({ type: FETCH_ABOUT_PAGE_FAIL, slug, error });
throw error;
});
};
}

@ -11,9 +11,9 @@ export default class DisplayName extends React.PureComponent {
};
render() {
const { others } = this.props;
const { account, others } = this.props;
let displayName, suffix, account;
let displayName, suffix;
if (others && others.size > 1) {
displayName = others.take(2).map(a => [
@ -27,12 +27,6 @@ export default class DisplayName extends React.PureComponent {
suffix = `+${others.size - 2}`;
}
} else {
if (others && others.size > 0) {
account = others.first();
} else {
account = this.props.account;
}
displayName = (
<>
<bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi>

@ -271,7 +271,7 @@ export default class ScrollableList extends PureComponent {
{alwaysPrepend && prepend}
<div className='empty-column-indicator'>
{emptyMessage}
<div>{emptyMessage}</div>
</div>
</div>
);

@ -386,7 +386,7 @@ class Status extends ImmutablePureComponent {
);
}
if (otherAccounts && otherAccounts.size > 0) {
if (otherAccounts && otherAccounts.size > 1) {
statusAvatar = <AvatarComposite accounts={otherAccounts} size={48} />;
} else if (account === undefined || account === null) {
statusAvatar = <Avatar account={status.get('account')} size={48} />;

@ -1,4 +1,3 @@
import React from 'react';
import { connect } from 'react-redux';
import ImmutablePropTypes from 'react-immutable-proptypes';
@ -244,7 +243,7 @@ class StatusActionBar extends ImmutablePureComponent {
if (publicStatus) {
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
// menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
}
if (!me) {

@ -12,8 +12,8 @@ class AboutPage extends ImmutablePureComponent {
loadPageHtml = () => {
const { dispatch, match } = this.props;
const { slug } = match.params;
dispatch(fetchAboutPage(slug)).then(response => {
this.setState({ pageHtml: response.data });
dispatch(fetchAboutPage(slug)).then(html => {
this.setState({ pageHtml: html });
}).catch(error => {
// TODO: Better error handling. 404 page?
this.setState({ pageHtml: '<h1>Page not found</h1>' });

@ -137,7 +137,7 @@ class AccountGallery extends ImmutablePureComponent {
const media = attachment.getIn(['status', 'media_attachments']);
const index = media.findIndex(x => x.get('id') === attachment.get('id'));
this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status') }));
this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status'), account: attachment.get('account') }));
}
}
@ -204,7 +204,12 @@ class AccountGallery extends ImmutablePureComponent {
{attachments.map((attachment, index) => attachment === null ? (
<LoadMoreMedia key={'more:' + attachments.getIn(index + 1, 'id')} maxId={index > 0 ? attachments.getIn(index - 1, 'id') : null} onLoadMore={this.handleLoadMore} />
) : (
<MediaItem key={attachment.get('id')} attachment={attachment} displayWidth={width} onOpenMedia={this.handleOpenMedia} />
<MediaItem
key={`${attachment.getIn(['status', 'id'])}+${attachment.get('id')}`}
attachment={attachment}
displayWidth={width}
onOpenMedia={this.handleOpenMedia}
/>
))}
{

@ -170,8 +170,6 @@ class EditProfile extends ImmutablePureComponent {
label={<FormattedMessage id='edit_profile.fields.display_name_label' defaultMessage='Display name' />}
name='display_name'
value={this.state.display_name}
maxLength={30}
size={30}
onChange={this.handleTextChange}
/>
<TextInput

@ -236,7 +236,7 @@ class ActionBar extends React.PureComponent {
if (publicStatus) {
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
// menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
menu.push(null);
}

@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { FormattedMessage, injectIntl } from 'react-intl';
import api from '../../../api';
import axios from 'axios';
export default @injectIntl
class EmbedModal extends ImmutablePureComponent {
@ -24,7 +24,7 @@ class EmbedModal extends ImmutablePureComponent {
this.setState({ loading: true });
api().post('/api/web/embed', { url }).then(res => {
axios.post('/api/web/embed', { url }).then(res => {
this.setState({ loading: false, oembed: res.data });
const iframeDocument = this.iframe.contentWindow.document;

@ -25,6 +25,7 @@ class MediaModal extends ImmutablePureComponent {
static propTypes = {
media: ImmutablePropTypes.list.isRequired,
status: ImmutablePropTypes.map,
account: ImmutablePropTypes.map,
index: PropTypes.number.isRequired,
onClose: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
@ -110,7 +111,10 @@ class MediaModal extends ImmutablePureComponent {
handleStatusClick = e => {
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
e.preventDefault();
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/posts/${this.props.status.get('id')}`);
const { status, account } = this.props;
const acct = account.get('acct');
const statusId = status.get('id');
this.context.router.history.push(`/@${acct}/posts/${statusId}`);
}
}

@ -213,11 +213,12 @@ class SwitchingColumnsArea extends React.PureComponent {
<WrappedRoute path='/groups/:id' page={GroupPage} component={GroupTimeline} content={children} />
*/}
{/* Redirects for non-static Pleroma FE config*/}
{/* Redirects from Pleroma FE, etc. to fix old bookmarks */}
<Redirect from='/main/all' to='/timeline/fediverse' />
<Redirect from='/main/public' to='/timeline/local' />
<Redirect from='/main/friends' to='/' />
<Redirect from='/tag/:id' to='/tags/:id' />
<Redirect from='/user-settings' to='/settings/profile' />
<WrappedRoute path='/notice/:statusId' publicRoute exact layout={LAYOUT.STATUS} component={Status} content={children} />
<Redirect from='/users/:username' to='/@:username' />
<Redirect from='/home' to='/' />

@ -135,13 +135,14 @@ export const makeGetNotification = () => {
export const getAccountGallery = createSelector([
(state, id) => state.getIn(['timelines', `account:${id}:media`, 'items'], ImmutableList()),
state => state.get('statuses'),
], (statusIds, statuses) => {
let medias = ImmutableList();
state => state.get('accounts'),
], (statusIds, statuses, accounts) => {
statusIds.forEach(statusId => {
return statusIds.reduce((medias, statusId) => {
const status = statuses.get(statusId);
medias = medias.concat(status.get('media_attachments').map(media => media.set('status', status)));
});
return medias;
const account = accounts.get(status.get('account'));
if (status.get('reblog')) return medias;
return medias.concat(status.get('media_attachments')
.map(media => media.merge({ status, account })));
}, ImmutableList());
});

@ -1,5 +1,5 @@
import { Map as ImmutableMap } from 'immutable';
import hexToHsl from 'hex-to-hsl';
import { convert } from 'chromatism';
export const generateThemeCss = brandColor => {
if (!brandColor) return null;
@ -7,7 +7,7 @@ export const generateThemeCss = brandColor => {
};
export const brandColorToThemeData = brandColor => {
const [ h, s, l ] = hexToHsl(brandColor);
const { h, s, l } = convert(brandColor).hsl;
return ImmutableMap({
'brand-color_h': h,
'brand-color_s': `${s}%`,

@ -182,10 +182,10 @@ body {
a {
color: var(--brand-color--hicontrast);
text-decoration: none;
text-decoration: underline;
&:hover {
text-decoration: underline;
text-decoration: none;
}
}
}

@ -31,7 +31,7 @@
.compose-form__warning {
color: var(--primary-text-color);
margin-bottom: 10px;
background: var(--brand-color--med);
background: var(--brand-color--faint);
box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);
padding: 8px 10px;
border-radius: 4px;
@ -49,7 +49,7 @@
}
a {
color: var(--accent-color--bright);
color: var(--brand-color--hicontrast);
font-weight: 500;
text-decoration: underline;

@ -143,7 +143,7 @@
a {
text-decoration: none;
font-weight: 500;
color: var(--background-color);
color: #fff;
&:hover,
&:focus,

@ -32,7 +32,7 @@
height: 24px;
padding: 0;
border-radius: 30px;
background-color: var(--brand-color);
background-color: var(--foreground-color);
transition: background-color 0.2s ease;
}

@ -1,43 +1,19 @@
# Customizing Soapbox
First [Install Soapbox](https://soapbox.pub/)
If you haven't already, [install Soapbox](https://soapbox.pub/).
Soapbox supports customization of the user interface, to allow per instance branding and other features. Current customization features include:
* Instance name
* Site logo
* Promo panel list items, e.g. blog site link
* Favicon
* About page
* Terms of Service page
* Privacy Policy page
* Copyright Policy page
* Soapbox extensions
* Default settings
There are two main places Soapbox gets its configuration:
## Instance Name
Instance name is edited during the Pleroma installation step or via admin configuration
- `/opt/pleroma/config/prod.secret.exs`
## Instance Description
Instance description is edited during the Pleroma installation step or via admin configuration
- `/opt/pleroma/instance/static/instance/soapbox.json`
## Captcha on Registration Page
Use of the Captcha feature on the registration page is configured during the Pleroma installation step or via admin configuration
Logos, branding, etc. take place in the `soapbox.json` file.
For example:
## Site Logo, Brand Color, and Promo Panel List Items
The site logo, brand color, and promo panel list items are customized by copying `soapbox.example.json` in the `static/instance` folder to `soapbox.json` and editing that file. It is recommended that you test your edited soapbox.json file in a JSON validator, such as [JSONLint](https://jsonlint.com/), before using it.
The site logo, in SVG format, is rendered to be able to allow the site theme colors to appear in the less than 100% opaque sections of the logo.
The logo colors are rendered in a color that provides contrast for the site theme.
The `navlinks` section of the `soapbox.json` file references the links that are displayed at the bottom of the Registration/Login, About, Terms of Service, Privacy Policy and Copyright Policy (DMCA) pages.
The `brandColor` in `soapbox.json` refers to the main color upon which the look of soapbox-fe is defined.
After editing your HTML files and folder names, re-create the webpack and restart the soapbox-fe service to effect the changes.
Following is an example of the contents of `soapbox.example.json`:
```
```json
{
"logo": ""/instance/images/soapbox-logo.svg",
"logo": "/instance/images/soapbox-logo.svg",
"brandColor": "#0482d8",
"promoPanel": {
"items": [{
@ -55,9 +31,9 @@ Following is an example of the contents of `soapbox.example.json`:
},
"defaultSettings": {
"autoPlayGif": false,
"theme": "light"
"themeMode": "light"
},
"copyright": "?2020. Copying is an act of love. Please copy and share.",
"copyright": "2020. Copying is an act of love. Please copy and share.",
"navlinks": {
"homeFooter": [
{ "title": "About", "url": "/about" },
@ -70,24 +46,54 @@ Following is an example of the contents of `soapbox.example.json`:
}
```
Customizable features include:
* Instance name
* Site logo
* Promo panel list items, e.g. blog site link
* Favicon
* About pages
* Default user settings
## Instance Name
Instance name is edited during the Pleroma installation step or via AdminFE.
## Instance Description
Instance description is edited during the Pleroma installation step or via AdminFE.
## Captcha on Registration Page
Use of the Captcha feature on the registration page is configured during the Pleroma installation step or via AdminFE.
## Site Logo, Brand Color, and Promo Panel List Items
The site logo, brand color, and promo panel list items are customized by copying `soapbox.example.json` in the `static/instance` folder to `soapbox.json` and editing that file. It is recommended that you test your edited soapbox.json file in a JSON validator, such as [JSONLint](https://jsonlint.com/), before using it.
The icon names for the promo panel list items can be source from [Fork Awesome](https://forkaweso.me/Fork-Awesome/icons/). Note that you should hover over or click a selected icon to see what the icon's real name is, e.g. `world`
The site logo, in SVG format, is rendered to be able to allow the site theme colors to appear in the less than 100% opaque sections of the logo.
The logo colors are rendered in a color that provides contrast for the site theme.
The `navlinks` section of the `soapbox.json` file references the links that are displayed at the bottom of the Registration/Login, About, Terms of Service, Privacy Policy and Copyright Policy (DMCA) pages.
The `brandColor` in `soapbox.json` refers to the main color upon which the look of soapbox-fe is defined.
After editing your HTML files and folder names, save the file and refresh your browser.
## Favicon
The favicon is customized by dropping a favicon.png file into the `/static` folder.
Re-create the webpack and start the soapbox-fe service to effect the changes.
The favicon is customized by dropping a favicon.png file into the `/static` folder and refreshing your browser.
## About Pages
Soapbox supports any number of custom HTML pages under `yoursite.com/about/:slug`.
## About Page, Terms of Service Page, Privacy Policy Page and Copyright Policy (DMCA) Page
These pages are all available for editing in the `static/instance/about.example` folder, as template files, named as:
The finder will search `/opt/pleroma/instance/static/instance/about/:slug.html` to find your page.
Use the name `index.html` for the root page.
Example templates are available for editing in the `static/instance/about.example` folder, such as:
* index.html
* tos.html
* privacy.html
* dmca.html
The `soapbox.json` file navlinks section's default URL valuess are pointing to the above file location, when the `about.example` folder is renamed to `about`
These four template files have placeholders in them, e.g. "Your_Instance", that should be edited to match your Soapbox instance configuration, and will be meaningless to your users until you edit them.
These pages will not become available resources on your instance until you rename the `static/instance/about.example` folder to `static/instance/about`, re-create the webpack and start the soapbox-fe service.
## Source Code Link
The Source Code link in the `soapbox.json` file, if used, references a bookmark in the `index.html` file in the `about` folder. The template index.html file has a default bookmark and URL defined in it that you can edit.
Simply rename `about.example` to `about`, or create your own.
The `soapbox.json` file navlinks section's default URL values are pointing to the above file location, when the `about.example` folder is renamed to `about`
These four template files have placeholders in them, e.g. "Your_Instance", that should be edited to match your Soapbox instance configuration, and will be meaningless to your users until you edit them.

@ -56,6 +56,7 @@
"babel-plugin-transform-react-remove-prop-types": "^0.4.24",
"babel-runtime": "^6.26.0",
"blurhash": "^1.0.0",
"chromatism": "^3.0.0",
"classnames": "^2.2.5",
"compression-webpack-plugin": "^3.0.0",
"cross-env": "^6.0.0",
@ -71,7 +72,6 @@
"file-loader": "^4.0.0",
"font-awesome": "^4.7.0",
"glob": "^7.1.1",
"hex-to-hsl": "^1.0.2",
"html-webpack-harddisk-plugin": "^1.0.1",
"html-webpack-plugin": "^4.3.0",
"http-link-header": "^1.0.2",

@ -1,42 +1,37 @@
<html>
<body>
<div class='rich-formatting'>
<h1>COPYRIGHT POLICY</h1>
<h3>Reporting Claims of Copyright Infringement</h3>
<p>We take claims of copyright infringement seriously. We will respond to notices of alleged copyright infringement that comply with applicable law. If you believe any materials accessible on or from this site (the &quot;Website&quot;) infringe your copyright, you may request removal of those materials (or access to them) from the Website by submitting written notification to our copyright agent designated below. In accordance with the Online Copyright Infringement Liability Limitation Act of the Digital Millennium Copyright Act (17 U.S.C. &sect; 512) (&quot;DMCA&quot;), the written notice (the &quot;DMCA Notice&quot;) must include substantially the following:</p>
<ul>
<li>Your physical or electronic signature.</li>
<li>Identification of the copyrighted work you believe to have been infringed or, if the claim involves multiple works on the Website, a representative list of such works.</li>
<li>Identification of the material you believe to be infringing in a sufficiently precise manner to allow us to locate that material.</li>
<li>Adequate information by which we can contact you (including your name, postal address, telephone number, and, if available, email address).</li>
<li>A statement that you have a good faith belief that use of the copyrighted material is not authorized by the copyright owner, its agent, or the law.</li>
<li>A statement that the information in the written notice is accurate.</li>
<li>A statement, under penalty of perjury, that you are authorized to act on behalf of the copyright owner.</li>
<li>Your physical or electronic signature.</li>
<li>Identification of the copyrighted work you believe to have been infringed or, if the claim involves multiple works on the Website, a representative list of such works.</li>
<li>Identification of the material you believe to be infringing in a sufficiently precise manner to allow us to locate that material.</li>
<li>Adequate information by which we can contact you (including your name, postal address, telephone number, and, if available, email address).</li>
<li>A statement that you have a good faith belief that use of the copyrighted material is not authorized by the copyright owner, its agent, or the law.</li>
<li>A statement that the information in the written notice is accurate.</li>
<li>A statement, under penalty of perjury, that you are authorized to act on behalf of the copyright owner.</li>
</ul>
<p>Please send copyright notices to</p>
<p>
Your_Entity_Name
<br>
Your_Street_Address
<br>
Your_City_State_Zip
Your_Entity_Name<br>
Your_Street_Address<br>
Your_City_State_Zip
</p>
<p>Or via any contact form at the bottom of this page.</p>
<p>If you fail to comply with all of the requirements of Section 512(c)(3) of the DMCA, your DMCA Notice may not be effective.</p>
<p>Please be aware that if you knowingly materially misrepresent that material or activity on the Website is infringing your copyright, you may be held liable for damages (including costs and attorney's fees) under Section 512(f) of the DMCA.</p>
<h3>Counter Notification Procedures</h3>
<p>If you believe that material you posted on the Website was removed or access to it was disabled by mistake or misidentification, you may file a counter notification with us (a &quot;Counter Notice&quot;) by submitting written notification to our DMCA address (above) Pursuant to the DMCA, the Counter Notice must include substantially the following:</p>
<ul>
<li>Your physical or electronic signature.</li>
<li>An identification of the material that has been removed or to which access has been disabled and the location at which the material appeared before it was removed or access disabled.</li>
<li>Adequate information by which we can contact you (including your name, postal address, telephone number, and, if available, email address).</li>
<li>A statement under penalty of perjury by you that you have a good faith belief that the material identified above was removed or disabled as a result of a mistake or misidentification of the material to be removed or disabled.</li>
<li>A statement that you will consent to the jurisdiction of the Federal District Court for the judicial district in which your address is located (or if you reside outside the United States for any judicial district in which the Website may be found) and that you will accept service from the person (or an agent of that person) who provided the Website with the complaint at issue.</li>
<li>Your physical or electronic signature.</li>
<li>An identification of the material that has been removed or to which access has been disabled and the location at which the material appeared before it was removed or access disabled.</li>
<li>Adequate information by which we can contact you (including your name, postal address, telephone number, and, if available, email address).</li>
<li>A statement under penalty of perjury by you that you have a good faith belief that the material identified above was removed or disabled as a result of a mistake or misidentification of the material to be removed or disabled.</li>
<li>A statement that you will consent to the jurisdiction of the Federal District Court for the judicial district in which your address is located (or if you reside outside the United States for any judicial district in which the Website may be found) and that you will accept service from the person (or an agent of that person) who provided the Website with the complaint at issue.</li>
</ul>
<p>The DMCA allows us to restore the removed content if the party filing the original DMCA Notice does not file a court action against you within ten business days of receiving the copy of your Counter Notice.</p>
<p>Please be aware that if you knowingly materially misrepresent that material or activity on the Website was removed or disabled by mistake or misidentification, you may be held liable for damages (including costs and attorney's fees) under Section 512(f) of the DMCA.</p>
<h3>Repeat Infringers</h3>
<p>It is our policy in appropriate circumstances to disable and/or terminate the accounts of users who are repeat infringers.</p>
</div>
</body>
</html>

@ -1,13 +1,8 @@
<html>
<body>
<div class='rich-formatting'><h1>About Your_Instance</h1>
<h1>About Your_Instance</h1>
<p>Your_Instance description</p>
<p>Your_Instance is a way to join the Fediverse, to be part of a community, and to reclaim your freedom of speech in social media.</p>
<h1 id="site-rules">Site rules</h1>
<p>Please refrain from:</p>
<ol>
<li>Posting anything illegal.</li>
@ -31,6 +26,3 @@
<p>Soapbox is free and open source (FOSS) software that runs atop a Pleroma server</p>
<p>The Soapbox repository can be found at <a href="https://gitlab.com/soapbox-pub/soapbox-fe">Soapbox-fe</a></p>
<p>The Pleroma server repository can be found at <a href="https://git.pleroma.social/pleroma/pleroma">Pleroma-be</a></p>
</div>
</body>
</html>

@ -1,13 +1,11 @@
<html>
<body>
<div class='rich-formatting'>
<h1>PRIVACY POLICY</h1>
<h3>Last Updated: Your_Update_Date</h3>
<p>Your_Entity_Name (&quot;Company&quot; or &quot;We&quot;) respect your privacy and are committed to protecting it through our compliance with this policy.</p>
<p>
This policy describes the types of information we may collect from you or that you may provide when you visit the website
<a href="https://your_url.com">Your_Instance_Name</a>
and our practices for collecting, using, maintaining, protecting, and disclosing that information.
This policy describes the types of information we may collect from you or that you may provide when you visit the website
<a href="https://your_url.com">Your_Instance_Name</a>
and our practices for collecting, using, maintaining, protecting, and disclosing that information.
</p>
<p>This policy applies to information we collect:</p>
<p>On the Website.</p>
@ -16,106 +14,111 @@ and our practices for collecting, using, maintaining, protecting, and disclosing
<p>When you interact with our advertising and applications on third-party websites and services, if those applications or advertising include links to this policy.</p>
<p>It does not apply to information collected by:</p>
<ul>
<li>Us offline or through any other means, including on any other website operated by Company or any third party (including our affiliates and subsidiaries); or</li>
<li>Any third party (including our affiliates and subsidiaries), including through any application or content (including advertising) that may link to or be accessible from from the Website.</li>
<li>Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. If you do not agree with our policies and practices, your choice is not to use our Website. By accessing or using this Website, you agree to this privacy policy. This policy may change from time to time (see Changes to our Privacy Policy, below). Your continued use of this Website after we make changes is deemed to be acceptance of those changes, so please check the policy periodically for updates.</li>
<li>Us offline or through any other means, including on any other website operated by Company or any third party (including our affiliates and subsidiaries); or</li>
<li>Any third party (including our affiliates and subsidiaries), including through any application or content (including advertising) that may link to or be accessible from from the Website.</li>
<li>Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. If you do not agree with our policies and practices, your choice is not to use our Website. By accessing or using this Website, you agree to this privacy policy. This policy may change from time to time (see Changes to our Privacy Policy, below). Your continued use of this Website after we make changes is deemed to be acceptance of those changes, so please check the policy periodically for updates.</li>
</ul>
<h3>Children Under the Age of 18</h3>
<p>Our Website is not intended for children under 18 years of age. No one under age 18 may provide any information to or on the Website. We do not knowingly collect personal information from children under 18. If you are under 18, do not use or provide any information on this Website, register on the Website, make any purchases through the Website, use any of the interactive or public comment features of this Website, or provide any information about yourself to us, including your name, address, telephone number, email address, or any screen name or user name you may use. If we learn we have collected or received personal information from a child under 18 without verification of parental consent, we will delete that information and any associated accounts. If you believe we might have any information from or about a child under 18, please contact us at support [at] Your_Instance [dot] com.</p>
<h3>Information We Collect About You and How We Collect It</h3>
<p>We collect several types of information from and about users of our Website, including information:</p>
<ul>
<li>By which you may be personally identified, such as an e-mail address (&quot;personal information&quot;);</li>
<li>That is about you but individually does not identify you, such as the content of your user profile; and/or</li>
<li>About your internet connection, the equipment you use to access our Website, and usage details.</li>
<li>By which you may be personally identified, such as an e-mail address (&quot;personal information&quot;);</li>
<li>That is about you but individually does not identify you, such as the content of your user profile; and/or</li>
<li>About your internet connection, the equipment you use to access our Website, and usage details.</li>
</ul>
<ul>
<li>We collect this information:</li>
<li>Directly from you when you provide it to us.</li>
<li>Automatically as you navigate through the site. Information collected automatically may include usage details and IP addresses.</li>
<li>From third parties, for example, our business partners.</li>
<li>We collect this information:</li>
<li>Directly from you when you provide it to us.</li>
<li>Automatically as you navigate through the site. Information collected automatically may include usage details and IP addresses.</li>
<li>From third parties, for example, our business partners.</li>
</ul>
<h3>Information You Provide to Us</h3>
<p>The information we collect on or through our Website may include:</p>
<p>Information that you provide by filling in forms on our Website. This includes information provided at the time of registering to use our Website, subscribing to our service, posting material, or requesting further services. We may also ask you for information when you report a problem with our Website.</p>
<p>Records and copies of your correspondence (including email addresses), if you contact us.</p>
<p>Details of transactions you carry out through our Website and of the fulfillment of your orders. You may be required to provide financial information before placing an order through our Website.</p>
<p>You also may provide information to be published or displayed (hereinafter, &quot;posted&quot;) on public areas of the Website, or transmitted to other users of the Website or third parties (collectively, &quot;User Contributions&quot;). The overwhelming majority of User Contributions are public and may be seen by any person who navigates to them. Your User Contributions are posted on and transmitted to others at your own risk. Although you may set certain privacy settings for such information by logging into your account profile, please be aware that no security measures are perfect or impenetrable. Additionally, we cannot control the actions of other users of the Website with whom you may choose to share your User Contributions. Therefore, we cannot and do not guarantee that your User Contributions will not be viewed by unauthorized persons.</p>
<h3>Information We Collect Through Automatic Data Collection</h3>
<p>As you navigate through and interact with our Website, we may use automatic data collection technologies to collect certain information about your equipment, browsing actions, and patterns, including:</p>
<ul>
<li>Details of your visits to our Website, including traffic data, logs, and other communication data and the resources that you access and use on the Website.</li>
<li>Information about your computer and internet connection, including your IP address, operating system, and browser type.</li>
<li>Details of your visits to our Website, including traffic data, logs, and other communication data and the resources that you access and use on the Website.</li>
<li>Information about your computer and internet connection, including your IP address, operating system, and browser type.</li>
</ul>
<p>The information we collect automatically may be only statistical data and may not include personal information. It helps us to improve our Website and to deliver a better and more personalized service, including by enabling us to:</p>
<ul>
<li>Estimate our audience size and usage patterns.</li>
<li>Store information about your preferences, allowing us to customize our Website according to your individual interests.</li>
<li>Speed up your searches.</li>
<li>Recognize you when you return to our Website.</li>
<li>Estimate our audience size and usage patterns.</li>
<li>Store information about your preferences, allowing us to customize our Website according to your individual interests.</li>
<li>Speed up your searches.</li>
<li>Recognize you when you return to our Website.</li>
</ul>
<p>The technologies we use for this automatic data collection may include:</p>
<ul>
<li>Cookies (or browser cookies). A cookie is a small file placed on the hard drive of your computer. You may refuse to accept browser cookies by activating the appropriate setting on your browser. However, if you select this setting you may be unable to access certain parts of our Website. Unless you have adjusted your browser setting so that it will refuse cookies, our system will issue cookies when you direct your browser to our Website.</li>
<li>We do not collect personal information automatically, but we may tie this information to personal information about you that we collect from other sources or you provide to us.</li>
<ul>
<li>Cookies (or browser cookies). A cookie is a small file placed on the hard drive of your computer. You may refuse to accept browser cookies by activating the appropriate setting on your browser. However, if you select this setting you may be unable to access certain parts of our Website. Unless you have adjusted your browser setting so that it will refuse cookies, our system will issue cookies when you direct your browser to our Website.</li>
<li>We do not collect personal information automatically, but we may tie this information to personal information about you that we collect from other sources or you provide to us.</li>
</ul>
<h3>How We Use Your Information</h3>
<p>We use information that we collect about you or that you provide to us, including any personal information:</p>
<ul>
<li>To present our Website and its contents to you.</li>
<li>To provide you with information about our products or services.</li>
<li>To fulfill any other purpose for which you provide it.</li>
<li>To provide you with notices about your account, including expiration and renewal notices.</li>
<li>To carry out our obligations and enforce our rights arising from any contracts entered into between you and us, including for billing and collection.</li>
<li>To notify you about changes to our Website or any products or services we offer or provide though it.</li>
<li>To allow you to participate in interactive features on our Website.</li>
<li>In any other way we may describe when you provide the information.</li>
<li>For any other purpose with your consent.</li>
<li>To present our Website and its contents to you.</li>
<li>To provide you with information about our products or services.</li>
<li>To fulfill any other purpose for which you provide it.</li>
<li>To provide you with notices about your account, including expiration and renewal notices.</li>
<li>To carry out our obligations and enforce our rights arising from any contracts entered into between you and us, including for billing and collection.</li>
<li>To notify you about changes to our Website or any products or services we offer or provide though it.</li>
<li>To allow you to participate in interactive features on our Website.</li>
<li>In any other way we may describe when you provide the information.</li>
<li>For any other purpose with your consent.</li>
</ul>
<p>We may also use your information to contact you about our own and third-parties' goods and services that may be of interest to you.</p>
<h3>Disclosure of Your Information</h3>
<p>We may disclose aggregated information about our users, and information that does not identify any individual, without restriction.</p>
<p>It is the policy of the Company to not provide any user data to any person unless compelled by a court order issued by a U.S. court, except in cases of life-threatening emergency. The Company reserves the right to change or deviate from this policy at any time, in its sole and absolute discretion, with or without notice to you.</p>
<p>We may disclose personal information that we collect or you provide as described in this privacy policy:</p>
<ul>
<li>To our subsidiaries and affiliates.</li>
<li>To contractors, service providers, and other third parties we use to support our business and who are bound by contractual obligations to keep personal information confidential and use it only for the purposes for which we disclose it to them.</li>
<li>To a buyer or other successor in the event of a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Your_Entity_Name's assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which personal information held by Your_Entity_Name about our Website users is among the assets transferred.</li>
<li>To fulfill the purpose for which you provide it.</li>
<li>For any other purpose disclosed by us when you provide the information.</li>
<li>With your consent.</li>
<li>We may also disclose your personal information:</li>
<li>To comply with any court order, law, or legal process, including to respond to any government or regulatory request.</li>
<li>
To enforce or apply our
<a href="/about/tos">Terms of Service</a>
and other agreements, including for billing and collection purposes.
</li>
<li>If we believe disclosure is necessary or appropriate to protect the rights, property, or safety of Your_Entity_Name, our employees, our customers, or any other person.</li>
<li>To our subsidiaries and affiliates.</li>
<li>To contractors, service providers, and other third parties we use to support our business and who are bound by contractual obligations to keep personal information confidential and use it only for the purposes for which we disclose it to them.</li>
<li>To a buyer or other successor in the event of a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Your_Entity_Name's assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which personal information held by Your_Entity_Name about our Website users is among the assets transferred.</li>
<li>To fulfill the purpose for which you provide it.</li>
<li>For any other purpose disclosed by us when you provide the information.</li>
<li>With your consent.</li>
<li>We may also disclose your personal information:</li>
<li>To comply with any court order, law, or legal process, including to respond to any government or regulatory request.</li>
<li>
To enforce or apply our
<a href="/about/tos">Terms of Service</a>
and other agreements, including for billing and collection purposes.
</li>
<li>If we believe disclosure is necessary or appropriate to protect the rights, property, or safety of Your_Entity_Name, our employees, our customers, or any other person.</li>
</ul>
<h3>Accessing, Correcting and Deleting Your Information</h3>
<p>You can review and change your personal information by logging into the Website and visiting your account profile page.</p>
<p>You may also send us an email at support [at] Your_Instance_URL [dot] Your_Instance_TLD to request access to, correct or delete any personal information that you have provided to us. We cannot delete your personal information except by also deleting your user account. We may not accommodate a request to change information if we believe the change would violate any law or legal requirement or cause the information to be incorrect.</p>
<p>
If you delete your User Contributions from the Website, copies of your User Contributions may remain viewable in cached and archived pages, or might have been copied or stored by other Website users. Proper access and use of information provided on the Website, including User Contributions, is governed by our
<a href="/about/tos">Terms of Service.</a>
If you delete your User Contributions from the Website, copies of your User Contributions may remain viewable in cached and archived pages, or might have been copied or stored by other Website users. Proper access and use of information provided on the Website, including User Contributions, is governed by our
<a href="/about/tos">Terms of Service.</a>
</p>
<h3>Data Security</h3>
<p>We have implemented measures designed to secure your personal information from accidental loss and from unauthorized access, use, alteration, and disclosure. All information you provide to us is stored on our secure servers behind firewalls. Any payment transactions will be encrypted using SSL.</p>
<p>The safety and security of your information also depends on you. Most information on the Website is public. Where we have given you (or where you have chosen) a password for access to certain parts of our Website, you are responsible for keeping this password confidential. We ask you not to share your password with anyone. We urge you to be careful about giving out information in public areas of the Website like message boards. The information you share in public areas may be viewed by any user of the Website, whether that user is registered on the site or not.</p>
<p>Unfortunately, the transmission of information via the internet is not completely secure. Although we do our best to protect your personal information, we cannot guarantee the security of your personal information transmitted to our Website. Any transmission of personal information is at your own risk. We are not responsible for circumvention of any privacy settings or security measures contained on the Website.</p>
<h3>Changes to Our Privacy Policy</h3>
<p>It is our policy to post any changes we make to our privacy policy on this page with a notice that the privacy policy has been updated on the Website home page. If we make material changes to how we treat our users personal information, we will notify you through a notice on the Website home page. The date the privacy policy was last revised is identified at the top of the page. You are responsible for ensuring we have an up-to-date active and deliverable email address for you, and for periodically visiting our Website and this privacy policy to check for any changes.</p>
<h3>Contact Information</h3>
<p>To ask questions or comment about this privacy policy and our privacy practices, contact us at</p>
<p>
Your_Entity_Name
<br>
Your_Street_Address
<br>
Your_City_State_Zip
Your_Entity_Name<br>
Your_Street_Address<br>
Your_City_State_Zip
</p>
<p>Or by any contact form at the bottom of this page.</p>
</div>
</body>
</html>

@ -1,11 +1,9 @@
<html>
<body>
<div class='rich-formatting'><h1>Terms of Service</h1>
<p>
By using this web site, you agree to these Terms of Use, to our
<a href="/about/dmca">Copyright Policy</a>, and to our
<a href="/about/privacy">Privacy Policy</a>.
</p>
<p>Our Terms of Use are simple:</p>
<ul>
<li>
@ -28,6 +26,3 @@
You are liable for what you post, and we are not liable for it.
</li>
</ul>
</div>
</body>
</html>

@ -3055,6 +3055,11 @@ chownr@^1.1.1:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
chromatism@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/chromatism/-/chromatism-3.0.0.tgz#a7249d353c1e4f3577e444ac41171c4e2e624b12"
integrity sha1-pySdNTweTzV35ESsQRccTi5iSxI=
chrome-trace-event@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
@ -5607,19 +5612,6 @@ hex-color-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
hex-to-hsl@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/hex-to-hsl/-/hex-to-hsl-1.0.2.tgz#d5c59ece00178444e821c8fc58a430afc09831c2"
integrity sha1-1cWezgAXhEToIcj8WKQwr8CYMcI=
dependencies:
hex-to-rgb "^1.0.1"
rgb-to-hsl "0.0.2"
hex-to-rgb@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hex-to-rgb/-/hex-to-rgb-1.0.1.tgz#100b9df126b32f2762adf8486be68c65ef8ed2a4"
integrity sha1-EAud8SazLydirfhIa+aMZe+O0qQ=
history@^4.7.2:
version "4.10.1"
resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
@ -10214,11 +10206,6 @@ rgb-regex@^1.0.1:
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
rgb-to-hsl@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/rgb-to-hsl/-/rgb-to-hsl-0.0.2.tgz#36f9fc286376b90acc457e699005b4cb42d350ec"
integrity sha1-Nvn8KGN2uQrMRX5pkAW0y0LTUOw=
rgba-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"

Loading…
Cancel
Save