···11+import React, { useState } from 'react';
22+import './Definitions.css';
33+import { Link } from 'react-router-dom';
44+55+const Definitions = () => {
66+ // State to track which definition is expanded
77+ const [expandedTerm, setExpandedTerm] = useState(null);
88+ // State to track which social status is expanded
99+ const [expandedStatus, setExpandedStatus] = useState(null);
1010+1111+ // Toggle function for definitions accordion
1212+ const toggleTerm = (term) => {
1313+ if (expandedTerm === term) {
1414+ setExpandedTerm(null);
1515+ } else {
1616+ setExpandedTerm(term);
1717+ }
1818+ };
1919+2020+ // Toggle function for social status accordion
2121+ const toggleStatus = (status) => {
2222+ if (expandedStatus === status) {
2323+ setExpandedStatus(null);
2424+ } else {
2525+ setExpandedStatus(status);
2626+ }
2727+ };
2828+2929+ // Helper function to add UTM parameters to links
3030+ const addUtmParams = (url, source = "term_definition") => {
3131+ // Check if URL already has parameters
3232+ const hasParams = url.includes('?');
3333+ const connector = hasParams ? '&' : '?';
3434+3535+ // Add UTM parameters
3636+ return `${url}${connector}utm_source=cred.blue&utm_medium=definitions&utm_campaign=${source}`;
3737+ };
3838+3939+ // Definitions data with added links
4040+ const definitions = [
4141+ {
4242+ id: "pds",
4343+ term: "Personal Data Server (PDS)",
4444+ definition: "A server that hosts your AT Protocol data and content. You can use Bluesky's PDS hosting or choose a third-party PDS host for more control over your data. By default, new Bluesky accounts use Bluesky's PDS hosting, so the vast majority of accounts right now do not use a third-party PDS. Having a third-party PDS host contributes to the further decentralization of the network, but it is currently difficult to do.",
4545+ learnMoreLink: "https://atproto.com/guides/self-hosting"
4646+ },
4747+ {
4848+ id: "bsky-mushroom",
4949+ term: "Bluesky Mushroom",
5050+ definition: "All of Bluesky's PDS hosting servers are named after various types of mushrooms. If your account is on a Bluesky Mushroom, that means you are entrusting Bluesky with holding your data for you. To see a full list of the Bluesky Mushrooms, use the learn more link below.",
5151+ learnMoreLink: "https://bsky-debug.app/"
5252+ },
5353+ {
5454+ id: "did",
5555+ term: "DID",
5656+ definition: "The AT Protocol uses Decentralized Identifiers (DIDs) as persistent, long-term account identifiers. DID is a W3C standard, with many standardized and proposed DID method implementations. There are currently two methods supported by the protocol: did:plc and did:web. New Bluesky accounts use the did:plc method.",
5757+ learnMoreLink: "https://atproto.com/specs/did"
5858+ },
5959+ {
6060+ id: "lexicon",
6161+ term: "Lexicon/Collection",
6262+ definition: "The schema system used by the AT Protocol to define data structures. Lexicons are kind of like a file formats, and different AT Protocol apps can choose which of these file formats to support. Apps can have their own unique file formats as well. Third-party lexicons allow for custom features and extensions to the protocol. Lexicons are written in JSON and are sometimes referred to as collections.",
6363+ learnMoreLink: "https://atproto.com/guides/lexicon"
6464+ },
6565+ {
6666+ id: "rotation-key",
6767+ term: "Rotation Key",
6868+ definition: "A security key that allows you to recover your account if your primary credentials are compromised.",
6969+ learnMoreLink: "https://atproto.com/guides/account-migration#updating-identity"
7070+ },
7171+ {
7272+ id: "bluesky-eras",
7373+ term: "Bluesky Eras",
7474+ definition: "Ever since Bluesky was first incubated from within Twitter in 2019, it has been through numerous different defining eras. Each of these eras has had distinct qualities and even cultures. The main eras are as follows: 1. pre-history (staff, advisors, friends), 2. invite-only (the introduction of the invite system), 3. public release (anyone could create an account)",
7575+ learnMoreLink: "https://atproto.com/guides/account-migration#updating-identity"
7676+ },
7777+ {
7878+ id: "alt-text",
7979+ term: "Alt Text",
8080+ definition: "Text descriptions added to images that make content accessible to users with visual impairments or when images fail to load.",
8181+ learnMoreLink: "https://accessibility.huit.harvard.edu/describe-content-images"
8282+ },
8383+ {
8484+ id: "social-graph",
8585+ term: "Social Graph",
8686+ definition: "The network of connections between accounts, including followers, following, and engagement patterns.",
8787+ learnMoreLink: "https://en.wikipedia.org/wiki/Social_graph"
8888+ },
8989+ {
9090+ id: "labelers",
9191+ term: "Labelers",
9292+ definition: "Entities that can apply labels to content on Bluesky for moderation purposes. Users can choose which labelers they trust.",
9393+ learnMoreLink: "https://docs.bsky.app/docs/advanced-guides/moderation"
9494+ },
9595+ {
9696+ id: "engagement-rate",
9797+ term: "Engagement Rate",
9898+ definition: "A metric that measures how much interaction your content receives relative to your audience size.",
9999+ }
100100+ ];
101101+102102+ // Social status data with added links
103103+ const socialStatuses = [
104104+ {
105105+ id: "newcomer",
106106+ name: "Newcomer",
107107+ description: "Accounts that are new to Bluesky or have minimal activity. These users are just getting started on the platform and beginning to build their presence. After 30 days, Newcomers become Explorers.",
108108+ },
109109+ {
110110+ id: "explorer",
111111+ name: "Explorer",
112112+ description: "Users who are actively engaging with the platform, discovering features, and building their initial network. They have established a basic presence but are still growing their connections and potentially finding their community.",
113113+ },
114114+ {
115115+ id: "pathfinder",
116116+ name: "Pathfinder",
117117+ description: "Established users who have developed a consistent presence and are actively contributing to conversations. These accounts have a growing influence (1,000+ followers) and solid engagement within their communities.",
118118+ },
119119+ {
120120+ id: "guide",
121121+ name: "Guide",
122122+ description: "Well-established users who have significant influence within specific communities (10,000+ followers). They often create valuable content and maintain strong engagement with their followers.",
123123+ },
124124+ {
125125+ id: "leader",
126126+ name: "Leader",
127127+ description: "Highly influential accounts with substantial followings (100,000+) and engagement. These users have a broad impact across multiple communities and consistently contribute high-value content to the platform.",
128128+ }
129129+ ];
130130+131131+ return (
132132+ <>
133133+ <main className="definitions-page">
134134+ <div className="alt-card">
135135+ <h1>Definitions | cred.blue</h1>
136136+137137+ <p className="intro-text">
138138+ This page provides explanations for key terms related to Bluesky, the AT Protocol, and how the cred.blue scoring system works.
139139+ </p>
140140+141141+ <div className="back-to-methodology">
142142+ <Link to="/methodology">← Back to Scoring Methodology</Link>
143143+ </div>
144144+145145+ <section className="definitions-section">
146146+ <h2>Social Status Definitions</h2>
147147+ <p>
148148+ Rather than displaying follower counts on profiles, the cred.blue analysis categorizes each identity into one of five social statuses based on its follower count, social graph ratio, engagement rate, and age. There are additional labels placed before the social status to indicate how engaging the account actually is.
149149+ </p>
150150+ <div className="social-statuses-container definitions-container">
151151+ {socialStatuses.map((status) => (
152152+ <div key={status.id} className="definition-item">
153153+ <dt
154154+ className="definition-term"
155155+ onClick={() => toggleStatus(status.id)}
156156+ role="button"
157157+ aria-expanded={expandedStatus === status.id}
158158+ >
159159+ {status.name}
160160+ {expandedStatus === status.id ?
161161+ <span className="toggle-icon" aria-hidden="true">−</span> :
162162+ <span className="toggle-icon" aria-hidden="true">+</span>
163163+ }
164164+ </dt>
165165+ <dd
166166+ className={`definition-description ${expandedStatus === status.id ? 'expanded' : ''}`}
167167+ aria-hidden={expandedStatus !== status.id}
168168+ >
169169+ {status.description}
170170+ {status.learnMoreLink && (
171171+ <div className="learn-more-link">
172172+ <a
173173+ href={addUtmParams(status.learnMoreLink, `social_status_${status.id}`)}
174174+ target="_blank"
175175+ rel="noopener noreferrer"
176176+ >
177177+ Learn more about {status.name} status →
178178+ </a>
179179+ </div>
180180+ )}
181181+ </dd>
182182+ </div>
183183+ ))}
184184+ </div>
185185+ </section>
186186+187187+ <section className="definitions-section">
188188+ <h2>AT Protocol & Bluesky Terms</h2>
189189+ <p>
190190+ Understanding these terms will help you better navigate the Bluesky ecosystem and interpret your cred.blue score.
191191+ </p>
192192+ <div className="definitions-container">
193193+ {definitions.map((item) => (
194194+ <div key={item.id} className="definition-item">
195195+ <dt
196196+ className="definition-term"
197197+ onClick={() => toggleTerm(item.id)}
198198+ role="button"
199199+ aria-expanded={expandedTerm === item.id}
200200+ >
201201+ {item.term}
202202+ {expandedTerm === item.id ?
203203+ <span className="toggle-icon" aria-hidden="true">−</span> :
204204+ <span className="toggle-icon" aria-hidden="true">+</span>
205205+ }
206206+ </dt>
207207+ <dd
208208+ className={`definition-description ${expandedTerm === item.id ? 'expanded' : ''}`}
209209+ aria-hidden={expandedTerm !== item.id}
210210+ >
211211+ {item.definition}
212212+ {item.learnMoreLink && (
213213+ <div className="learn-more-link">
214214+ <a
215215+ href={addUtmParams(item.learnMoreLink, `term_${item.id}`)}
216216+ target="_blank"
217217+ rel="noopener noreferrer"
218218+ >
219219+ Learn more about {item.term} →
220220+ </a>
221221+ </div>
222222+ )}
223223+ </dd>
224224+ </div>
225225+ ))}
226226+ </div>
227227+ </section>
228228+ </div>
229229+ </main>
230230+ </>
231231+ );
232232+};
233233+234234+export default Definitions;
···11-import React, { useState } from 'react';
11+import React from 'react';
22import './ScoringMethodology.css';
33import ScoreGauge from '../UserProfile/ScoreGauge';
44+import { Link } from 'react-router-dom';
4556const ScoringMethodology = () => {
66- // State to track which definition is expanded
77- const [expandedTerm, setExpandedTerm] = useState(null);
88- // State to track which social status is expanded
99- const [expandedStatus, setExpandedStatus] = useState(null);
1010-1111- // Toggle function for definitions accordion
1212- const toggleTerm = (term) => {
1313- if (expandedTerm === term) {
1414- setExpandedTerm(null);
1515- } else {
1616- setExpandedTerm(term);
1717- }
1818- };
1919-2020- // Toggle function for social status accordion
2121- const toggleStatus = (status) => {
2222- if (expandedStatus === status) {
2323- setExpandedStatus(null);
2424- } else {
2525- setExpandedStatus(status);
2626- }
2727- };
2828-2929- // Helper function to add UTM parameters to links
3030- const addUtmParams = (url, source = "term_definition") => {
3131- // Check if URL already has parameters
3232- const hasParams = url.includes('?');
3333- const connector = hasParams ? '&' : '?';
3434-3535- // Add UTM parameters
3636- return `${url}${connector}utm_source=cred.blue&utm_medium=methodology&utm_campaign=${source}`;
3737- };
3838-3939- // Definitions data with added links
4040- const definitions = [
4141- {
4242- id: "pds",
4343- term: "Personal Data Server (PDS)",
4444- definition: "A server that hosts your AT Protocol data and content. You can use Bluesky's PDS hosting or choose a third-party PDS host for more control over your data. By default, new Bluesky accounts use Bluesky's PDS hosting, so the vast majority of accounts right now do not use a third-party PDS. Having a third-party PDS host contributes to the further decentralization of the network, but it is currently difficult to do.",
4545- learnMoreLink: "https://atproto.com/guides/self-hosting"
4646- },
4747- {
4848- id: "bsky-mushroom",
4949- term: "Bluesky Mushroom",
5050- definition: "All of Bluesky's PDS hosting servers are named after various types of mushrooms. If your account is on a Bluesky Mushroom, that means you are entrusting Bluesky with holding your data for you. To see a full list of the Bluesky Mushrooms, use the learn more link below.",
5151- learnMoreLink: "https://bsky-debug.app/"
5252- },
5353- {
5454- id: "did",
5555- term: "DID",
5656- definition: "The AT Protocol uses Decentralized Identifiers (DIDs) as persistent, long-term account identifiers. DID is a W3C standard, with many standardized and proposed DID method implementations. There are currently two methods supported by the protocol: did:plc and did:web. New Bluesky accounts use the did:plc method.",
5757- learnMoreLink: "https://atproto.com/specs/did"
5858- },
5959- {
6060- id: "lexicon",
6161- term: "Lexicon/Collection",
6262- definition: "The schema system used by the AT Protocol to define data structures. Lexicons are kind of like a file formats, and different AT Protocol apps can choose which of these file formats to support. Apps can have their own unique file formats as well. Third-party lexicons allow for custom features and extensions to the protocol. Lexicons are written in JSON and are sometimes referred to as collections.",
6363- learnMoreLink: "https://atproto.com/guides/lexicon"
6464- },
6565- {
6666- id: "rotation-key",
6767- term: "Rotation Key",
6868- definition: "A security key that allows you to recover your account if your primary credentials are compromised.",
6969- learnMoreLink: "https://atproto.com/guides/account-migration#updating-identity"
7070- },
7171- {
7272- id: "bluesky-eras",
7373- term: "Bluesky Eras",
7474- definition: "Ever since Bluesky was first incubated from within Twitter in 2019, it has been through numerous different defining eras. Each of these eras has had distinct qualities and even cultures. The main eras are as follows: 1. pre-history (staff, advisors, friends), 2. invite-only (the introduction of the invite system), 3. public release (anyone could create an account)",
7575- learnMoreLink: "https://atproto.com/guides/account-migration#updating-identity"
7676- },
7777- {
7878- id: "alt-text",
7979- term: "Alt Text",
8080- definition: "Text descriptions added to images that make content accessible to users with visual impairments or when images fail to load.",
8181- learnMoreLink: "https://accessibility.huit.harvard.edu/describe-content-images"
8282- },
8383- {
8484- id: "social-graph",
8585- term: "Social Graph",
8686- definition: "The network of connections between accounts, including followers, following, and engagement patterns.",
8787- learnMoreLink: "https://en.wikipedia.org/wiki/Social_graph"
8888- },
8989- {
9090- id: "labelers",
9191- term: "Labelers",
9292- definition: "Entities that can apply labels to content on Bluesky for moderation purposes. Users can choose which labelers they trust.",
9393- learnMoreLink: "https://docs.bsky.app/docs/advanced-guides/moderation"
9494- },
9595- {
9696- id: "engagement-rate",
9797- term: "Engagement Rate",
9898- definition: "A metric that measures how much interaction your content receives relative to your audience size.",
9999- }
100100- ];
101101-102102- // Social status data with added links
103103- const socialStatuses = [
104104- {
105105- id: "newcomer",
106106- name: "Newcomer",
107107- description: "Accounts that are new to Bluesky or have minimal activity. These users are just getting started on the platform and beginning to build their presence. After 30 days, Newcomers become Explorers.",
108108- },
109109- {
110110- id: "explorer",
111111- name: "Explorer",
112112- description: "Users who are actively engaging with the platform, discovering features, and building their initial network. They have established a basic presence but are still growing their connections and potentially finding their community.",
113113- },
114114- {
115115- id: "pathfinder",
116116- name: "Pathfinder",
117117- description: "Established users who have developed a consistent presence and are actively contributing to conversations. These accounts have a growing influence (1,000+ followers) and solid engagement within their communities.",
118118- },
119119- {
120120- id: "guide",
121121- name: "Guide",
122122- description: "Well-established users who have significant influence within specific communities (10,000+ followers). They often create valuable content and maintain strong engagement with their followers.",
123123- },
124124- {
125125- id: "leader",
126126- name: "Leader",
127127- description: "Highly influential accounts with substantial followings (100,000+) and engagement. These users have a broad impact across multiple communities and consistently contribute high-value content to the platform.",
128128- }
129129- ];
130130-1317 return (
1328 <main className="methodology-page">
1339 <div className="alt-card">
···18662 entire community.
18763 </p>
18864189189- <h2>What are the different social statuses?</h2>
190190- <p>
191191- Rather than displaying follower counts on profiles, the cred.blue analysis categorizes each identity into one of five social statuses based on its follower count, social graph ratio, engagement rate, and age. There are additional labels placed before the social status to indicate how engaging the account actually is.
192192- </p>
193193- <div className="social-statuses-container definitions-container">
194194- {socialStatuses.map((status) => (
195195- <div key={status.id} className="definition-item">
196196- <dt
197197- className="definition-term"
198198- onClick={() => toggleStatus(status.id)}
199199- role="button"
200200- aria-expanded={expandedStatus === status.id}
201201- >
202202- {status.name}
203203- {expandedStatus === status.id ?
204204- <span className="toggle-icon" aria-hidden="true">−</span> :
205205- <span className="toggle-icon" aria-hidden="true">+</span>
206206- }
207207- </dt>
208208- <dd
209209- className={`definition-description ${expandedStatus === status.id ? 'expanded' : ''}`}
210210- aria-hidden={expandedStatus !== status.id}
211211- >
212212- {status.description}
213213- {status.learnMoreLink && (
214214- <div className="learn-more-link">
215215- <a
216216- href={addUtmParams(status.learnMoreLink, `social_status_${status.id}`)}
217217- target="_blank"
218218- rel="noopener noreferrer"
219219- >
220220- Learn more about {status.name} status →
221221- </a>
222222- </div>
223223- )}
224224- </dd>
225225- </div>
226226- ))}
6565+ <div className="definitions-link-container">
6666+ <p>
6767+ Looking for explanations of terms used in cred.blue or details about social statuses?
6868+ </p>
6969+ <Link to="/definitions" className="definitions-link">
7070+ View Definitions & Social Status Details →
7171+ </Link>
22772 </div>
228228-229229- <h2>Key Terms and Definitions</h2>
230230- <div className="definitions-container">
231231- {definitions.map((item) => (
232232- <div key={item.id} className="definition-item">
233233- <dt
234234- className="definition-term"
235235- onClick={() => toggleTerm(item.id)}
236236- role="button"
237237- aria-expanded={expandedTerm === item.id}
238238- >
239239- {item.term}
240240- {expandedTerm === item.id ?
241241- <span className="toggle-icon" aria-hidden="true">−</span> :
242242- <span className="toggle-icon" aria-hidden="true">+</span>
243243- }
244244- </dt>
245245- <dd
246246- className={`definition-description ${expandedTerm === item.id ? 'expanded' : ''}`}
247247- aria-hidden={expandedTerm !== item.id}
248248- >
249249- {item.definition}
250250- {item.learnMoreLink && (
251251- <div className="learn-more-link">
252252- <a
253253- href={addUtmParams(item.learnMoreLink, `term_${item.id}`)}
254254- target="_blank"
255255- rel="noopener noreferrer"
256256- >
257257- Learn more about {item.term} →
258258- </a>
259259- </div>
260260- )}
261261- </dd>
262262- </div>
263263- ))}
264264- </div>
7373+26574 </div>
26675 </main>
26776 );