Compare commits
34 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5ac20af085 | ||
![]() |
10dce74c8a | ||
![]() |
93b30395f8 | ||
![]() |
33beb8e74b | ||
![]() |
573e1c21ad | ||
![]() |
d6fd8a28b1 | ||
![]() |
23f2f1095f | ||
![]() |
915605c637 | ||
![]() |
a292324f01 | ||
![]() |
2a384ae6ba | ||
![]() |
3e580dbca6 | ||
![]() |
3e71e529e2 | ||
![]() |
7eff8dee81 | ||
![]() |
61ff1bff39 | ||
![]() |
a13ec80c62 | ||
![]() |
b29c8b23d5 | ||
![]() |
8defce6119 | ||
![]() |
24b374f557 | ||
![]() |
df23da72c2 | ||
![]() |
13bdbe44ae | ||
![]() |
0e2edc3135 | ||
![]() |
98b9cba737 | ||
![]() |
54afafdf2b | ||
![]() |
b223dbddd3 | ||
![]() |
4db16003e2 | ||
![]() |
716d98a748 | ||
![]() |
d098044f87 | ||
![]() |
e3ce08ce19 | ||
![]() |
606fc39204 | ||
![]() |
949ed19bcb | ||
![]() |
b0af864541 | ||
![]() |
5a2ed1592a | ||
![]() |
2348491382 | ||
![]() |
aede738f1a |
@ -1,28 +0,0 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/alpine
|
||||
{
|
||||
"name": "Alpine",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
"image": "mcr.microsoft.com/devcontainers/base:alpine",
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
// "forwardPorts": [],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "uname -a",
|
||||
|
||||
"customizations": {
|
||||
// Configure properties specific to VS Code.
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"ritwickdey.liveserver"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
42
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
## 📄 Description
|
||||
<!-- Provide a short description of the brand you're adding or the changes you're making. Include context about why this is a valuable addition. -->
|
||||
|
||||
---
|
||||
|
||||
## ✅ Contribution Checklist
|
||||
Please confirm that you've met the following criteria before submitting your contribution:
|
||||
|
||||
- [ ] **Widespread Recognition:** The brand has widespread recognition and is suitable for the core LittleLink repository (most additions belong in [LittleLink Extended](https://github.com/sethcottle/littlelink-extended)).
|
||||
- [ ] **Brand Styling Guidelines:** You’ve followed the brand's official styling guidelines (if available).
|
||||
- [ ] **Consistent Styling:** If no guidelines exist, the button style is consistent with the brand's public image (e.g., website, social media).
|
||||
- [ ] **Icon Clarity:** The brand's logo/icon is clear and recognizable in a 24x24px format.
|
||||
- [ ] If the primary logo doesn’t scale well, you’ve adapted it using the brand’s social media avatar or favicon while maintaining the essence of the original logo.
|
||||
- [ ] The icon is provided in `.svg` format.
|
||||
- [ ] **Theme Testing:** You've tested the button against both light and dark themes:
|
||||
- [ ] Manually swapped `theme-auto.css` with `theme-light.css` and `theme-dark.css` in `index.html` to check contrast or used [LittleLink Button Builder](https://builder.littlelink.io) contrast checker.
|
||||
- [ ] Added a `#000000`/`#FFFFFF` stroke if necessary to improve contrast and accessibility. [LittleLink Button Builder](https://builder.littlelink.io) will automatically recommend when to add a stroke.
|
||||
- [ ] **Accessibility Compliance:** The button's background and text colors meet visual accessibility standards (unless it contradicts brand guidelines).
|
||||
- [ ] **Alphabetical Order:** Your contribution is alphabetically organized in `brands.css` and `index.html`.
|
||||
- [ ] **Button Preview:** You've added a button preview in `index.html`.
|
||||
- [ ] **Variant Naming Schema:** If adding a variant button (e.g., inverted color scheme):
|
||||
- [ ] Naming follows the existing pattern (`[Brand Name] Alt` and `.button-brandname-alt`).
|
||||
- [ ] Any additional icons are named according to `brandname-alt.svg` schema.
|
||||
- [ ] **Proper Capitalization:**
|
||||
- [ ] In `brands.css`, the brand name comment follows `/* Brand Name */` format.
|
||||
- [ ] Code uses lowercase for `.button.button-brandname`.
|
||||
- [ ] In `index.html`, comments reflect `<!-- Brand Name -->` format.
|
||||
- [ ] Button text and `alt` attributes match the brand’s official capitalization.
|
||||
- [ ] **PR Details:**
|
||||
- [ ] Included a brief description of the brand addition.
|
||||
- [ ] Included a screenshot of the new button(s).
|
||||
- [ ] Provided relevant information on the brand’s global/regional reach or usage stats.
|
||||
|
||||
---
|
||||
|
||||
## 📸 Screenshot
|
||||
<!-- Attach a screenshot of the new button(s) to ensure consistency and clarity. -->
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Additional Notes
|
||||
<!-- Add any other information that might help the reviewer understand the changes better (e.g., source of logo, special handling, etc.). -->
|
242
.github/workflows/contrast-check.yml
vendored
Normal file
@ -0,0 +1,242 @@
|
||||
name: "Contrast Check"
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'css/brands.css'
|
||||
workflow_dispatch: # Manual trigger for testing
|
||||
|
||||
jobs:
|
||||
contrast-check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup for PR comparison
|
||||
run: |
|
||||
echo "Fetching base branch for comparison"
|
||||
git fetch origin ${{ github.base_ref }}
|
||||
|
||||
- name: Contrast Check (Review Me)
|
||||
run: |
|
||||
cat > contrast-check.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
# WCAG Minimum Contrast Ratio
|
||||
MIN_CONTRAST=4.5
|
||||
|
||||
FAILED=0
|
||||
ALL_RESOLVED=1
|
||||
NEEDS_MANUAL_REVIEW=0
|
||||
|
||||
# Only get buttons that were modified in the PR
|
||||
echo "Finding changed button styles..."
|
||||
BUTTON_CLASSES=$(git diff origin/$GITHUB_BASE_REF -- css/brands.css | grep -E "^\+.*\.button-[a-zA-Z0-9]+" | sed -E 's/.*\.button-([a-zA-Z0-9]+).*/\1/' | sort -u)
|
||||
|
||||
if [[ -z "$BUTTON_CLASSES" ]]; then
|
||||
echo "✅ No button changes to check."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found button classes to check: $BUTTON_CLASSES"
|
||||
echo "🔍 Auditing CSS for contrast issues..."
|
||||
|
||||
# Function to normalize hex colors to lowercase
|
||||
normalize_color() {
|
||||
local color="$1"
|
||||
if [[ -n "$color" ]]; then
|
||||
echo "$color" | tr '[:upper:]' '[:lower:]'
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to calculate luminance
|
||||
get_luminance() {
|
||||
local color="$1"
|
||||
|
||||
if [[ -z "$color" || "$color" == "#" ]]; then
|
||||
echo 0
|
||||
return
|
||||
fi
|
||||
|
||||
color="${color#'#'}"
|
||||
|
||||
if [[ ${#color} -ne 6 ]]; then
|
||||
echo 0
|
||||
return
|
||||
fi
|
||||
|
||||
r=$(printf "%d" 0x${color:0:2} 2>/dev/null || echo 0)
|
||||
g=$(printf "%d" 0x${color:2:2} 2>/dev/null || echo 0)
|
||||
b=$(printf "%d" 0x${color:4:2} 2>/dev/null || echo 0)
|
||||
|
||||
r=$(awk "BEGIN { print ($r/255 <= 0.03928) ? ($r/255)/12.92 : ((($r/255) + 0.055)/1.055) ^ 2.4 }")
|
||||
g=$(awk "BEGIN { print ($g/255 <= 0.03928) ? ($g/255)/12.92 : ((($g/255) + 0.055)/1.055) ^ 2.4 }")
|
||||
b=$(awk "BEGIN { print ($b/255 <= 0.03928) ? ($b/255)/12.92 : ((($b/255) + 0.055)/1.055) ^ 2.4 }")
|
||||
|
||||
echo $(awk "BEGIN { print (0.2126 * $r) + (0.7152 * $g) + (0.0722 * $b) }")
|
||||
}
|
||||
|
||||
# Function to calculate contrast ratio
|
||||
get_contrast_ratio() {
|
||||
local lum1=$(get_luminance "$1")
|
||||
local lum2=$(get_luminance "$2")
|
||||
|
||||
if [[ -z "$lum1" || -z "$lum2" ]]; then
|
||||
echo 0
|
||||
return
|
||||
fi
|
||||
|
||||
if (( $(awk "BEGIN { print ($lum1 > $lum2) ? 1 : 0 }") )); then
|
||||
awk "BEGIN { printf \"%.5f\", ($lum1 + 0.05) / ($lum2 + 0.05) }"
|
||||
else
|
||||
awk "BEGIN { printf \"%.5f\", ($lum2 + 0.05) / ($lum1 + 0.05) }"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to extract hex color
|
||||
extract_color() {
|
||||
local input="$1"
|
||||
local color=""
|
||||
|
||||
if [[ "$input" =~ "#[0-9a-fA-F]{6}" ]]; then
|
||||
color=$(echo "$input" | grep -o "#[0-9a-fA-F]\{6\}")
|
||||
elif [[ "$input" =~ "1px solid #" ]]; then
|
||||
color=$(echo "$input" | sed -E 's/.*1px solid (#[0-9a-fA-F]{6}).*/\1/')
|
||||
elif [[ "$input" =~ "solid #" ]]; then
|
||||
color=$(echo "$input" | sed -E 's/.*solid (#[0-9a-fA-F]{6}).*/\1/')
|
||||
elif [[ "$input" =~ "#" ]]; then
|
||||
color=$(echo "$input" | grep -o "#[0-9a-fA-F]*" | head -1)
|
||||
fi
|
||||
|
||||
# Return normalized (lowercase) hex color
|
||||
normalize_color "$color"
|
||||
}
|
||||
|
||||
# Check contrast
|
||||
check_contrast() {
|
||||
local text_color="$1"
|
||||
local background_color="$2"
|
||||
local context="$3"
|
||||
local border_color="$4"
|
||||
local recommend_stroke="$5"
|
||||
local is_background_check="$6"
|
||||
local button_name="$7"
|
||||
local check_failed=0
|
||||
|
||||
# Normalize all colors to lowercase for comparison
|
||||
text_color=$(normalize_color "$text_color")
|
||||
background_color=$(normalize_color "$background_color")
|
||||
border_color=$(normalize_color "$border_color")
|
||||
recommend_stroke=$(normalize_color "$recommend_stroke")
|
||||
|
||||
if [[ -z "$text_color" || -z "$background_color" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
local contrast_ratio=$(get_contrast_ratio "$text_color" "$background_color")
|
||||
|
||||
if [[ -z "$contrast_ratio" ]]; then
|
||||
contrast_ratio=0
|
||||
fi
|
||||
|
||||
contrast_ratio=$(printf "%.2f" "$contrast_ratio")
|
||||
|
||||
# Case-insensitive comparison for hex colors
|
||||
if (( $(awk "BEGIN { print ($contrast_ratio < $MIN_CONTRAST) ? 1 : 0 }") )); then
|
||||
if [[ -n "$border_color" && "$border_color" == "$recommend_stroke" && "$is_background_check" -eq 1 ]]; then
|
||||
echo "✅ [$context → $button_name] Contrast ratio $contrast_ratio fails WCAG but has a $recommend_stroke border → Treated as passing."
|
||||
echo "✅ [$context → $button_name] Issue resolved by stroke → Fully passing."
|
||||
check_failed=0
|
||||
else
|
||||
echo "❌ [$context → $button_name] Contrast ratio $contrast_ratio fails WCAG — Recommend adding a $recommend_stroke stroke."
|
||||
check_failed=1
|
||||
fi
|
||||
else
|
||||
echo "✅ [$context → $button_name] Contrast ratio $contrast_ratio passes WCAG"
|
||||
check_failed=0
|
||||
fi
|
||||
|
||||
return $check_failed
|
||||
}
|
||||
|
||||
# For each button class, check its properties
|
||||
for button_class in $BUTTON_CLASSES; do
|
||||
echo "Checking button: $button_class"
|
||||
|
||||
# Extract button section
|
||||
# Avoid partial matches
|
||||
button_start=$(grep -n "\.button-$button_class\( \|{\)" css/brands.css | cut -d: -f1)
|
||||
if [[ -z "$button_start" ]]; then
|
||||
button_start=$(grep -n "\.button-$button_class$" css/brands.css | cut -d: -f1)
|
||||
fi
|
||||
|
||||
if [[ -z "$button_start" ]]; then
|
||||
echo "Could not find button-$button_class in css/brands.css"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Look for the next closing bracket
|
||||
button_end=$(tail -n +$button_start css/brands.css | grep -n "}" | head -1 | cut -d: -f1)
|
||||
if [[ -z "$button_end" ]]; then
|
||||
button_end=10
|
||||
fi
|
||||
|
||||
button_section=$(tail -n +$button_start css/brands.css | head -n $button_end)
|
||||
|
||||
# Check for gradient
|
||||
if echo "$button_section" | grep -q "background-image"; then
|
||||
echo "🚩 [./css/brands.css → $button_class] Detected gradient background → Flagging for manual review."
|
||||
NEEDS_MANUAL_REVIEW=1
|
||||
continue
|
||||
fi
|
||||
|
||||
# Extract colors
|
||||
text_color=$(echo "$button_section" | grep "button-text" | grep -o "#[0-9A-Fa-f]*")
|
||||
bg_color=$(echo "$button_section" | grep "button-background" | grep -o "#[0-9A-Fa-f]*")
|
||||
border_color=$(extract_color "$(echo "$button_section" | grep "button-border")")
|
||||
|
||||
button_failed=0
|
||||
|
||||
# Check text vs background
|
||||
if [[ -n "$text_color" && -n "$bg_color" ]]; then
|
||||
check_contrast "$text_color" "$bg_color" "TEXT vs BUTTON" "$border_color" "" 0 "$button_class"
|
||||
button_failed=$((button_failed | $?))
|
||||
fi
|
||||
|
||||
# Check button vs light theme
|
||||
if [[ -n "$bg_color" ]]; then
|
||||
check_contrast "#ffffff" "$bg_color" "BUTTON vs LIGHT THEME" "$border_color" "#000000" 1 "$button_class"
|
||||
button_failed=$((button_failed | $?))
|
||||
|
||||
# Check button vs dark theme
|
||||
check_contrast "#121212" "$bg_color" "BUTTON vs DARK THEME" "$border_color" "#ffffff" 1 "$button_class"
|
||||
button_failed=$((button_failed | $?))
|
||||
fi
|
||||
|
||||
if [[ $button_failed -eq 1 ]]; then
|
||||
FAILED=1
|
||||
ALL_RESOLVED=0
|
||||
fi
|
||||
done
|
||||
|
||||
# Final report
|
||||
if [[ "$NEEDS_MANUAL_REVIEW" -eq 1 ]]; then
|
||||
echo "⚠️ Manual review required for gradients!"
|
||||
exit 1
|
||||
elif [[ "$ALL_RESOLVED" -eq 1 ]]; then
|
||||
echo "✅ All contrast checks passed!"
|
||||
exit 0
|
||||
else
|
||||
echo "❌ Contrast issues found!"
|
||||
exit 1
|
||||
fi
|
||||
EOF
|
||||
|
||||
chmod +x contrast-check.sh
|
||||
./contrast-check.sh
|
||||
env:
|
||||
GITHUB_BASE_REF: ${{ github.base_ref }}
|
37
README.md
@ -3,6 +3,10 @@
|
||||
# LittleLink
|
||||
The DIY self-hosted LinkTree alternative. LittleLink has more than 100 branded button styles you can easily use, with more regularly added by our community in this repo and in [LittleLink Extended](https://github.com/sethcottle/littlelink-extended).
|
||||
|
||||
---
|
||||
### 🆕 LittleLink Button Builder
|
||||
Want to make your own buttons for LittleLink but you're not too sure where to start? [Check out our new Button Builder](https://builder.littlelink.io). This new builder lets you preview button styles and with a single click, copy the generated CSS code to put in `css/brands.css`, and copy the generated HTML code to put in `index.html`. This builder also helps automate accessibility features by checking contrast ratios and suggesting strokes when needed, ensuring your custom buttons maintain LittleLink's high standards for visibility in both light and dark themes. Design your buttons visually, preview them live, and get ready to go code. [Live Site](https://builder.littlelink.io) | [GitHub Repo](https://github.com/sethcottle/littlelink-button-builder)
|
||||
|
||||
---
|
||||
### 🌞 Themes and Accessibility
|
||||
LittleLink offers `auto`, `light`, and `dark` themes right out of the box. If the default color schemes don't match your preference, you can easily customize them by updating the values in `style.css`. You can set any of the themes right in `index.html`. To enhance visual accessibility in both `light` and `dark` modes, buttons lacking sufficient contrast with the background are outlined with an inverse stroke to ensure visibility. While LittleLink emphasizes accessibility, it's important to acknowledge that not all brands incorporated into LittleLink achieve this standard. Branded buttons that come into LittleLink always retain the original essence of the brand and some branded buttons might fall short of optimal accessibility in terms of contrast.
|
||||
@ -62,6 +66,8 @@ Duplicate the [LittleLink Template on Figma Community](https://www.figma.com/com
|
||||
You can support LittleLink by [buying me a coffee](https://www.buymeacoffee.com/seth). You can also have your name or your company added to this section and the supporters page of the [LittleLink.io](https://littlelink.io) website.
|
||||
|
||||
#### 🏢 Business Supporters
|
||||
• **[Unallocated Space](https://connect.unallocatedspace.org/)** | Hacker/Makerspace in Millersville, MD, serving the greater Baltimore-Washington area
|
||||
|
||||
• **[links.dev](https://github.com/fatih-yavuz/links.dev)**
|
||||
|
||||
[](https://www.buymeacoffee.com/seth/e/50574)
|
||||
@ -73,16 +79,11 @@ You can support LittleLink by [buying me a coffee](https://www.buymeacoffee.com/
|
||||
|
||||
[](https://www.buymeacoffee.com/seth/e/50573)
|
||||
|
||||
#### 🐙 GitHub Sponsors
|
||||
#### 🐙 Active GitHub Sponsors
|
||||
• **[Your Name Here](https://github.com/sponsors/sethcottle)**
|
||||
|
||||
[](https://github.com/sponsors/sethcottle)
|
||||
|
||||
#### ❤️ Patreon Members
|
||||
• **[Your Name Here](https://www.patreon.com/sethcottle)**
|
||||
|
||||
[](https://www.patreon.com/sethcottle)
|
||||
|
||||
|
||||
#### 🥰 More Ways to Support LittleLink
|
||||
[](https://www.buymeacoffee.com/seth/)
|
||||
@ -93,6 +94,14 @@ You can support LittleLink by [buying me a coffee](https://www.buymeacoffee.com/
|
||||
|
||||
---
|
||||
|
||||
### 🆕 Stay Connected
|
||||
|
||||
Join the [Seth's Nook Discord](https://discord.gg/PrAEQFF2fK) server to get updates on LittleLink and more. Use the invite code `PrAEQFF2fK` or click the button below.
|
||||
|
||||
[](https://discord.gg/PrAEQFF2fK)
|
||||
|
||||
---
|
||||
|
||||
### 📊 Analytics
|
||||
|
||||
To help build a more privacy focused product, we recommend using [Fathom Analytics](https://usefathom.com/ref/EQVZMV)*. [View our Fathom analytics dashboard](https://app.usefathom.com/share/xbmnwxxl/littlelink.io#/?filters=%5B%5D&range=last_7_days&site=2251799827005303)**.
|
||||
@ -102,3 +111,19 @@ To help build a more privacy focused product, we recommend using [Fathom Analyti
|
||||
###### ** Analytics in this dashboard start May 03, 2022. View this [Google Sheets file](https://docs.google.com/spreadsheets/d/1GL4SroAdH-OZphBVR5z-BoSukHIEVJfao25q_e9-Ii8/edit?usp=sharing) with the generic unique pageview data from Google Analytics.
|
||||
|
||||
[](https://usefathom.com/ref/EQVZMV)
|
||||
|
||||
---
|
||||
### 🐳 Docker Support
|
||||
LittleLink includes Docker support for easy deployment and development. All Docker-related files are located in the `docker/` directory.
|
||||
|
||||
To run LittleLink using Docker:
|
||||
|
||||
```bash
|
||||
docker compose -f docker/compose.yaml up
|
||||
```
|
||||
|
||||
This will make the site available at http://localhost:8080
|
||||
|
||||
For more information about Docker configuration, see [docker/README.md](docker/README.md).
|
||||
|
||||
---
|
||||
|
31
VERSION.md
@ -1,8 +1,35 @@
|
||||
# LittleLink Version History
|
||||
|
||||
## Current Version: v3.1.0
|
||||
## Current Version: v3.7.0
|
||||
|
||||
### v3.1.0 - 1/20/2024
|
||||
### v3.7.0 - 4/18/2025
|
||||
- Added [Meetup](https://www.meetup.com/).
|
||||
|
||||
### v3.6.0 - 3/25/2025
|
||||
- Finally adds Docker support to LittleLink. See [PR #151](https://github.com/sethcottle/littlelink/pull/151), thank you [@lllahaye](https://github.com/lllahaye).
|
||||
- Docker support has been a long-standing community request. While I previously closed similar PRs in an effort to keep the LittleLink repo as minimal as possible, several community forks emerged that added Docker support independently. Over the last few weeks I had been reconsidering this stance—this PR arrived at just the right time.
|
||||
- Updated the brand color for Signal.
|
||||
|
||||
### v3.5.0 - 3/10/2025
|
||||
- Added LittleLink Extended information in `index.html`
|
||||
- Added `PULL_REQUEST_TEMPLATE.md` to `.github` which is a reflection of [submitting a new brand](https://github.com/sethcottle/littlelink/wiki/Submitting-a-new-brand-to-LittleLink) wiki.
|
||||
|
||||
### v3.4.0 - 3/04/2025
|
||||
- Added Matrix
|
||||
|
||||
### v3.3.0 - 03/01/2025
|
||||
- Updated Facebook Logo
|
||||
- Updated Messenger Logo
|
||||
- Updated Messenger Button Color
|
||||
|
||||
### v3.2.0 - 2/14/2025
|
||||
- Added Apple Invites
|
||||
- Removed Read.cv (service is winding down)
|
||||
|
||||
### v3.1.1 - 1/28/2025
|
||||
- Fixed the alt text for Obsidian (`PR #138` / `@timtjtim`)
|
||||
|
||||
### v3.1.0 - 1/20/2025
|
||||
- Added alternate YouTube button (`PR #138` / `@Omikorin`)
|
||||
- Fixed `index.html` accessibilty issues (`PR #137` / `@rosahaj`)
|
||||
|
||||
|
@ -58,6 +58,13 @@
|
||||
--button-border:1px solid #FFFFFF;
|
||||
}
|
||||
|
||||
/* Apple Invites */
|
||||
.button-invites {
|
||||
--button-text:#FFFFFF;
|
||||
--button-background:#000000;
|
||||
--button-border:1px solid #FFFFFF;
|
||||
}
|
||||
|
||||
/* Apple Music */
|
||||
.button-apple-music {
|
||||
--button-text:#ffffff;
|
||||
@ -178,13 +185,13 @@
|
||||
/* Facebook */
|
||||
.button-faceb {
|
||||
--button-text:#ffffff;
|
||||
--button-background:#1877f2;
|
||||
--button-background:#0866FF;
|
||||
}
|
||||
|
||||
/* Facebook Messenger */
|
||||
.button-messenger {
|
||||
--button-text:#ffffff;
|
||||
background-image:linear-gradient(25deg,#0099ff,#5f5dff,#a033ff,#c740cc,#ff5280,#ff7061);
|
||||
--button-background:#0866FF;
|
||||
}
|
||||
|
||||
/* Figma */
|
||||
@ -338,6 +345,26 @@
|
||||
--button-border:1px solid #FFFFFF;
|
||||
}
|
||||
|
||||
/* Matrix */
|
||||
.button-matrix {
|
||||
--button-text:#000000;
|
||||
--button-background:#ffffff;
|
||||
--button-border:1px solid #000000;
|
||||
}
|
||||
|
||||
/* Meetup */
|
||||
.button-meetup {
|
||||
--button-text:#000000;
|
||||
--button-background:#ffffff;
|
||||
--button-border:1px solid #000000;
|
||||
}
|
||||
|
||||
/* Meetup Alt */
|
||||
.button-meetup-alt {
|
||||
--button-text:#ffffff;
|
||||
--button-background:#ED1C40;
|
||||
}
|
||||
|
||||
/* Medium */
|
||||
.button-medium {
|
||||
--button-text:#ffffff;
|
||||
@ -400,13 +427,6 @@
|
||||
--button-border:1px solid #212121;
|
||||
}
|
||||
|
||||
/* Read.cv */
|
||||
.button-read-cv {
|
||||
--button-text:#FFFFFF;
|
||||
--button-background:#000000;
|
||||
--button-border:1px solid #FFFFFF;
|
||||
}
|
||||
|
||||
/* Reddit */
|
||||
.button-reddit {
|
||||
--button-text:#FFFFFF;
|
||||
@ -422,7 +442,14 @@
|
||||
/* Signal */
|
||||
.button-signal {
|
||||
--button-text:#ffffff;
|
||||
--button-background:#3a76f0;
|
||||
--button-background:#3B45FD;
|
||||
}
|
||||
|
||||
/* Signal Alt */
|
||||
.button-signal-alt {
|
||||
--button-text:#3B45FD;
|
||||
--button-background:#E3E8FE;
|
||||
--button-border:1px solid #000000;
|
||||
}
|
||||
|
||||
/* Slack */
|
||||
|
46
docker/.dockerignore
Normal file
@ -0,0 +1,46 @@
|
||||
# Include any files or directories that you don't want to be copied to your
|
||||
# container here (e.g., local build artifacts, temporary files, etc.).
|
||||
#
|
||||
# For more help, visit the .dockerignore file reference guide at
|
||||
# https://docs.docker.com/go/build-context-dockerignore/
|
||||
|
||||
# Git
|
||||
.git
|
||||
.github
|
||||
.gitignore
|
||||
|
||||
# Docker
|
||||
.dockerignore
|
||||
docker-compose*
|
||||
compose.yaml
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
**/.DS_Store
|
||||
|
||||
# Documentation files
|
||||
README*
|
||||
LICENSE*
|
||||
VERSION*
|
||||
CONTRIBUTING*
|
||||
|
||||
# Exclude unnecessary files
|
||||
**/__pycache__
|
||||
**/.venv
|
||||
**/bin
|
||||
**/obj
|
||||
**/charts
|
||||
**/.env
|
||||
**/secrets.dev.yaml
|
||||
**/values.dev.yaml
|
||||
|
||||
# Keep only essential files for the static website
|
||||
!index.html
|
||||
!privacy.html
|
||||
!css/
|
||||
!images/
|
||||
!fonts/
|
35
docker/Dockerfile
Normal file
@ -0,0 +1,35 @@
|
||||
FROM nginx:alpine
|
||||
|
||||
# Copy static website files
|
||||
COPY . /usr/share/nginx/html/
|
||||
|
||||
# Configure nginx with basic optimization and logging to stdout/stderr
|
||||
RUN echo 'server { \
|
||||
listen 80; \
|
||||
server_name localhost; \
|
||||
root /usr/share/nginx/html; \
|
||||
index index.html index.htm; \
|
||||
\
|
||||
# Enable access logging to stdout \
|
||||
access_log /dev/stdout; \
|
||||
error_log /dev/stderr; \
|
||||
\
|
||||
# Enable gzip compression \
|
||||
gzip on; \
|
||||
gzip_vary on; \
|
||||
gzip_types text/plain text/css application/json application/javascript; \
|
||||
\
|
||||
# Basic cache settings \
|
||||
location ~* \\.(?:css|js|jpg|jpeg|gif|png|ico|svg)$ { \
|
||||
expires 7d; \
|
||||
add_header Cache-Control "public"; \
|
||||
} \
|
||||
}' > /etc/nginx/conf.d/default.conf
|
||||
|
||||
# Forward nginx logs to Docker log collector
|
||||
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
|
||||
ln -sf /dev/stderr /var/log/nginx/error.log
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
231
docker/README.md
Normal file
@ -0,0 +1,231 @@
|
||||
# Docker for LittleLink
|
||||
|
||||
Docker configuration to run LittleLink in a container.
|
||||
|
||||
## File Structure
|
||||
|
||||
- `Dockerfile`: Defines how the image is built using nginx:alpine
|
||||
- `compose.yaml`: Configuration for Docker Compose with volumes for development
|
||||
- `.dockerignore`: Excludes unnecessary files from the image
|
||||
|
||||
## Technical Details
|
||||
|
||||
### Base Image
|
||||
- Uses `nginx:alpine` for minimal image size (~20MB)
|
||||
- Includes gzip compression for static files
|
||||
- Optimized cache configuration for CSS, JavaScript, and images
|
||||
- Configured to forward nginx logs to Docker log collector
|
||||
|
||||
### Volumes and Ports
|
||||
- Mounts the project root directory as a volume for live development
|
||||
- Exposes port 80 in the container, mapped to 8080 on the host
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Creating Personal Link Pages for Different People
|
||||
|
||||
One of the main advantages of this Docker setup is how easily you can create multiple personalized instances of LittleLink:
|
||||
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://github.com/sethcottle/littlelink.git littlelink-john
|
||||
|
||||
# Customize the content for John
|
||||
cd littlelink-john
|
||||
# Edit index.html with John's links, customize images, etc.
|
||||
|
||||
# Build a Docker image for John's page
|
||||
docker build -f docker/Dockerfile -t littlelink-john .
|
||||
|
||||
# Run John's page on port 8080
|
||||
docker run -d --name john-links -p 8080:80 littlelink-john
|
||||
```
|
||||
|
||||
For additional pages:
|
||||
|
||||
```bash
|
||||
# Similarly for another person
|
||||
git clone https://github.com/sethcottle/littlelink.git littlelink-jane
|
||||
cd littlelink-jane
|
||||
# Customize for Jane...
|
||||
|
||||
# Build and run on a different port
|
||||
docker build -f docker/Dockerfile -t littlelink-jane .
|
||||
docker run -d --name jane-links -p 8081:80 littlelink-jane
|
||||
```
|
||||
|
||||
This approach allows you to:
|
||||
- Maintain separate customized sites for different people
|
||||
- Run multiple instances on different ports
|
||||
- Update each site independently
|
||||
- Easily deploy to various environments
|
||||
|
||||
## Development vs. Production
|
||||
|
||||
There are two main ways to use Docker with LittleLink:
|
||||
|
||||
### Development Workflow
|
||||
|
||||
In development, we use Docker Compose with mounted volumes to allow for live editing:
|
||||
|
||||
```bash
|
||||
# Start development environment
|
||||
docker compose -f docker/compose.yaml up
|
||||
```
|
||||
|
||||
This configuration:
|
||||
- Mounts local files as a volume, so changes are reflected immediately
|
||||
- Requires manual browser refresh to see changes
|
||||
- Is ideal for testing and development
|
||||
|
||||
### Production Workflow
|
||||
|
||||
For production, you have two options:
|
||||
|
||||
#### Option 1: Production with Docker Compose
|
||||
|
||||
Create a production-specific docker-compose file:
|
||||
|
||||
```yaml
|
||||
# docker/compose.prod.yaml
|
||||
|
||||
services:
|
||||
web:
|
||||
image: yourname/littlelink:latest
|
||||
restart: always
|
||||
ports:
|
||||
- "8080:80"
|
||||
# Optional volume for customizable content
|
||||
volumes:
|
||||
- /path/on/server/custom-content:/usr/share/nginx/html
|
||||
```
|
||||
|
||||
Deploy using:
|
||||
|
||||
```bash
|
||||
# Build and tag the image
|
||||
docker build -f docker/Dockerfile -t yourname/littlelink:latest .
|
||||
|
||||
# Run in production with compose
|
||||
docker compose -f docker/compose.prod.yaml up -d
|
||||
```
|
||||
|
||||
#### Option 2: Production with Docker Run
|
||||
|
||||
```bash
|
||||
# Build a production image
|
||||
docker build -f docker/Dockerfile -t yourname/littlelink:latest .
|
||||
|
||||
# Run in production (no volumes mounted)
|
||||
docker run -d --name littlelink -p 80:80 --restart always yourname/littlelink:latest
|
||||
```
|
||||
|
||||
## Using Volumes in Production
|
||||
|
||||
You can customize the content in production by mounting a local directory:
|
||||
|
||||
```bash
|
||||
# Prepare a directory with your custom content
|
||||
mkdir -p /path/on/server/custom-content
|
||||
cp -r index.html css/ images/ /path/on/server/custom-content/
|
||||
|
||||
# Run with the custom content mounted
|
||||
docker run -d --name littlelink -p 80:80 \
|
||||
-v /path/on/server/custom-content:/usr/share/nginx/html \
|
||||
yourname/littlelink:latest
|
||||
```
|
||||
|
||||
With Docker Compose:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
web:
|
||||
image: yourname/littlelink:latest
|
||||
ports:
|
||||
- "80:80"
|
||||
volumes:
|
||||
- /path/on/server/custom-content:/usr/share/nginx/html
|
||||
```
|
||||
|
||||
This approach:
|
||||
- Allows content customization without rebuilding the image
|
||||
- Makes it easy to update content independently of the container
|
||||
|
||||
## Docker Commands Reference
|
||||
|
||||
### Development Commands
|
||||
|
||||
```bash
|
||||
# Start in development mode
|
||||
docker compose -f docker/compose.yaml up
|
||||
|
||||
# Start in background
|
||||
docker compose -f docker/compose.yaml up -d
|
||||
|
||||
# Stop container
|
||||
docker compose -f docker/compose.yaml down
|
||||
|
||||
# View logs (including HTTP request logs)
|
||||
docker compose -f docker/compose.yaml logs -f
|
||||
```
|
||||
|
||||
### Production Commands
|
||||
|
||||
```bash
|
||||
# Build production image
|
||||
docker build -f docker/Dockerfile -t yourname/littlelink:latest .
|
||||
|
||||
# Run production container
|
||||
docker run -d --name littlelink -p 80:80 yourname/littlelink:latest
|
||||
|
||||
# View logs for the running container
|
||||
docker logs -f littlelink
|
||||
```
|
||||
|
||||
## Customization
|
||||
|
||||
### Change Port
|
||||
Edit `docker/compose.yaml` for development:
|
||||
```yaml
|
||||
ports:
|
||||
- "8081:80" # Change 8080 to desired port
|
||||
```
|
||||
|
||||
Or specify port when running production container:
|
||||
```bash
|
||||
docker run -p 8081:80 yourname/littlelink:latest
|
||||
```
|
||||
|
||||
### Additional nginx Configuration
|
||||
To modify the nginx configuration, you can edit the `Dockerfile` and add your own configuration:
|
||||
|
||||
```dockerfile
|
||||
# Example: add custom configuration
|
||||
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
|
||||
```
|
||||
|
||||
## Deploying to Production
|
||||
|
||||
### Docker on VPS
|
||||
```bash
|
||||
# Pull image
|
||||
docker pull yourname/littlelink:latest
|
||||
|
||||
# Run container
|
||||
docker run -d --name littlelink -p 80:80 yourname/littlelink:latest
|
||||
|
||||
# With restart policy for auto-recovery
|
||||
docker run -d --name littlelink --restart unless-stopped -p 80:80 yourname/littlelink:latest
|
||||
```
|
||||
|
||||
### Multiple Sites on One Server
|
||||
You can run multiple LittleLink instances on the same server:
|
||||
|
||||
```bash
|
||||
# Run first site on port 8080
|
||||
docker run -d --name site1 -p 8080:80 littlelink-site1
|
||||
|
||||
# Run second site on port 8081
|
||||
docker run -d --name site2 -p 8081:80 littlelink-site2
|
||||
```
|
||||
|
10
docker/compose.yaml
Normal file
@ -0,0 +1,10 @@
|
||||
services:
|
||||
web:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile
|
||||
ports:
|
||||
- "8080:80"
|
||||
volumes:
|
||||
- ..:/usr/share/nginx/html
|
||||
restart: unless-stopped
|
1
images/icons/apple-invites.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="12" x2="12" y1=".5" y2="8.5"><stop offset="0" stop-color="#fecb00"/><stop offset="1" stop-color="#f3c200"/></linearGradient><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="12" x2="12" y1="4.93463" y2="24"><stop offset="0" stop-color="#fedf00"/><stop offset="1" stop-color="#ffce00"/></linearGradient><clipPath id="c"><path d="m0 0h24v24h-24z"/></clipPath><g clip-path="url(#c)"><rect fill="#fff" height="17" rx="6" width="24"/><path d="m5.10545 9.1754c.86078 0 1.55858-.6978 1.55858-1.55857 0-.86078-.6978-1.55858-1.55858-1.55858s-1.55857.6978-1.55857 1.55858c0 .86077.69779 1.55857 1.55857 1.55857z" fill="#ff284c"/><path d="m3.52537 10.8893c.86078 0 1.55858-.6978 1.55858-1.55855 0-.86078-.6978-1.55858-1.55858-1.55858s-1.55857.6978-1.55857 1.55858c0 .86075.69779 1.55855 1.55857 1.55855z" fill="#00cbf4" opacity=".9"/><path d="m12.8922 14.2188c.8951 0 1.6207-.7256 1.6207-1.6207s-.7256-1.6208-1.6207-1.6208-1.6207.7257-1.6207 1.6208.7256 1.6207 1.6207 1.6207z" fill="#00c3f3"/><path d="m14.6068 16.4557c.9208 0 1.6673-.7465 1.6673-1.6674 0-.9208-.7465-1.6673-1.6673-1.6673-.9209 0-1.6673.7465-1.6673 1.6673 0 .9209.7464 1.6674 1.6673 1.6674z" fill="#00a102" opacity=".9"/><path d="m17.0618 13.0796c.9209 0 1.6674-.7465 1.6674-1.6673s-.7465-1.66731-1.6674-1.66731c-.9208 0-1.6673.74651-1.6673 1.66731s.7465 1.6673 1.6673 1.6673z" fill="#ff8600"/><path d="m20.2611 10.9722c.9208 0 1.6673-.7465 1.6673-1.66734s-.7465-1.66732-1.6673-1.66732c-.9209 0-1.6673.74648-1.6673 1.66732s.7464 1.66734 1.6673 1.66734z" fill="#ff284c"/><path d="m16.4447 9.52751c.9208 0 1.6673-.74648 1.6673-1.66732 0-.92083-.7465-1.66731-1.6673-1.66731-.9209 0-1.6674.74648-1.6674 1.66731 0 .92084.7465 1.66732 1.6674 1.66732z" fill="#ffc100"/><path d="m14.1203 10.9722c.8722 0 1.5793-.7071 1.5793-1.57932s-.7071-1.57929-1.5793-1.57929-1.5793.70707-1.5793 1.57929.7071 1.57932 1.5793 1.57932z" fill="#ad42cf" opacity=".9"/><path d="m13.748 5.71133c.8608 0 1.5586-.6978 1.5586-1.55858 0-.86077-.6978-1.55857-1.5586-1.55857-.8607 0-1.5585.6978-1.5585 1.55857 0 .86078.6978 1.55858 1.5585 1.55858z" fill="#00c3f3"/><path d="m8.52733 7.11457c.86077 0 1.55857-.6978 1.55857-1.55858s-.6978-1.55858-1.55857-1.55858c-.86078 0-1.55858.6978-1.55858 1.55858s.6978 1.55858 1.55858 1.55858z" fill="#ffc100"/><path d="m9.62498 10.6667c.86082 0 1.55862-.69783 1.55862-1.55861s-.6978-1.55858-1.55862-1.55858c-.86078 0-1.55857.6978-1.55857 1.55858s.69779 1.55861 1.55857 1.55861z" fill="#ff8600"/><path d="m9.75584 13.1262c.86076 0 1.55856-.6978 1.55856-1.5586 0-.8607-.6978-1.5585-1.55856-1.5585-.86078 0-1.55857.6978-1.55857 1.5585 0 .8608.69779 1.5586 1.55857 1.5586z" fill="#ffc100" opacity=".9"/><path d="m6.46678 12.6395c.86078 0 1.55857-.6978 1.55857-1.5586s-.69779-1.55857-1.55857-1.55857-1.55858.69777-1.55858 1.55857.6978 1.5586 1.55858 1.5586z" fill="#ad42cf"/><path d="m10.4121 16.4142c.8608 0 1.5586-.6978 1.5586-1.5585 0-.8608-.6978-1.5586-1.5586-1.5586-.86079 0-1.55858.6978-1.55858 1.5586 0 .8607.69779 1.5585 1.55858 1.5585z" fill="#ff59c2"/><path d="m23.9697 4.93981c-.1709.23301-.3573.45048-.5644.6576l-.901.90097v-.33139c0-2.57864-2.0919-4.67055-4.6705-4.67055h-11.67122c-2.57864 0-4.67055 2.09191-4.67055 4.67055v.37799l-.947568-.94757c-.191586-.19159-.367638-.39353-.5229776-.60582.2381876-2.79612 2.5838156-4.99159 5.4420656-4.99159h13.07445c2.8375 0 5.1728 2.1644 5.4369 4.93463z" fill="url(#a)"/><path d="m23.9689 4.93981c-.1708.23301-.3572.45048-.5644.6576l-.9009.90098-8.0052 8.00521c-1.3929 1.3928-3.6557 1.3928-5.04856 0l-7.95858-7.95861-.947571-.94758c-.191585-.19158-.367638-.39352-.5229773-.60582-.01553402.15534-.0207117.31068-.0207117.4712v13.07441c0 3.0188 2.44401 5.4628 5.46278 5.4628h13.07442c3.0188 0 5.4628-2.444 5.4628-5.4628v-13.07441c0-.17606-.0104-.35211-.0259-.52816z" fill="url(#b)"/><path d="m12.3125 8c.8608 0 1.5586-.6978 1.5586-1.55857 0-.86078-.6978-1.55858-1.5586-1.55858s-1.5586.6978-1.5586 1.55858c0 .86077.6978 1.55857 1.5586 1.55857z" fill="#00a102" opacity=".9"/><path d="m16.7775 7.8602c.9094 0 1.6466-.73721 1.6466-1.6466 0-.9094-.7372-1.64661-1.6466-1.64661s-1.6466.73721-1.6466 1.64661c0 .90939.7372 1.6466 1.6466 1.6466z" fill="#ff59c2" opacity=".9"/></g></svg>
|
After Width: | Height: | Size: 4.3 KiB |
@ -1 +1,10 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m0 0h24v24h-24z"/></clipPath><g clip-path="url(#a)"><path d="m23.625 12c0-6.42188-5.2031-11.625-11.625-11.625-6.42188 0-11.625 5.20312-11.625 11.625 0 5.8022 4.25109 10.6116 9.8086 11.4844v-8.1239h-2.95313v-3.3605h2.95313v-2.56125c0-2.91328 1.7344-4.5225 4.3908-4.5225 1.2722 0 2.6025.22688 2.6025.22688v2.85937h-1.4663c-1.4437 0-1.8942.89625-1.8942 1.81547v2.18203h3.2241l-.5157 3.3605h-2.7084v8.1239c5.5575-.8728 9.8086-5.6822 9.8086-11.4844z" fill="#fff"/></g></svg>
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_4_34)">
|
||||
<path d="M24 12C24 5.37264 18.6274 0 12 0C5.37264 0 0 5.37264 0 12C0 17.6275 3.87456 22.3498 9.10128 23.6467V15.6672H6.62688V12H9.10128V10.4198C9.10128 6.33552 10.9498 4.4424 14.9597 4.4424C15.72 4.4424 17.0318 4.59168 17.5685 4.74048V8.06448C17.2853 8.03472 16.7933 8.01984 16.1822 8.01984C14.2147 8.01984 13.4544 8.76528 13.4544 10.703V12H17.3741L16.7006 15.6672H13.4544V23.9122C19.3963 23.1946 24.0005 18.1354 24.0005 12H24Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_4_34">
|
||||
<rect width="24" height="24" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 633 B After Width: | Height: | Size: 683 B |
7
images/icons/matrix.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 520 520" style="enable-background:new 0 0 520 520;" xml:space="preserve">
|
||||
<path d="M13.7,11.9v496.2h35.7V520H0V0h49.4v11.9H13.7z"/>
|
||||
<path d="M166.3,169.2v25.1h0.7c6.7-9.6,14.8-17,24.2-22.2c9.4-5.3,20.3-7.9,32.5-7.9c11.7,0,22.4,2.3,32.1,6.8 c9.7,4.5,17,12.6,22.1,24c5.5-8.1,13-15.3,22.4-21.5c9.4-6.2,20.6-9.3,33.5-9.3c9.8,0,18.9,1.2,27.3,3.6c8.4,2.4,15.5,6.2,21.5,11.5 c6,5.3,10.6,12.1,14,20.6c3.3,8.5,5,18.7,5,30.7v124.1h-50.9V249.6c0-6.2-0.2-12.1-0.7-17.6c-0.5-5.5-1.8-10.3-3.9-14.3 c-2.2-4.1-5.3-7.3-9.5-9.7c-4.2-2.4-9.9-3.6-17-3.6c-7.2,0-13,1.4-17.4,4.1c-4.4,2.8-7.9,6.3-10.4,10.8c-2.5,4.4-4.2,9.4-5,15.1 c-0.8,5.6-1.3,11.3-1.3,17v103.3h-50.9v-104c0-5.5-0.1-10.9-0.4-16.3c-0.2-5.4-1.3-10.3-3.1-14.9c-1.8-4.5-4.8-8.2-9-10.9 c-4.2-2.7-10.3-4.1-18.5-4.1c-2.4,0-5.6,0.5-9.5,1.6c-3.9,1.1-7.8,3.1-11.5,6.1c-3.7,3-6.9,7.3-9.5,12.9c-2.6,5.6-3.9,13-3.9,22.1 v107.6h-50.9V169.2H166.3z"/>
|
||||
<path d="M506.3,508.1V11.9h-35.7V0H520v520h-49.4v-11.9H506.3z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
18
images/icons/meetup-alt.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_75_35)">
|
||||
<path d="M5.24266 6.07504C5.58752 5.83689 5.67392 5.3639 5.43576 5.01904C5.19724 4.67418 4.72426 4.58778 4.37939 4.82593C4.03453 5.06409 3.94813 5.53707 4.18629 5.88193C4.42481 6.22643 4.89779 6.3132 5.24266 6.07504Z" fill="white"/>
|
||||
<path d="M23.9889 10.5173C23.9342 10.2651 23.6857 10.1045 23.4335 10.1591C23.181 10.2138 23.0207 10.4622 23.075 10.7148C23.1297 10.967 23.3785 11.1272 23.6307 11.073C23.8829 11.0183 24.0435 10.7694 23.9892 10.5173H23.9889Z" fill="white"/>
|
||||
<path d="M3.97041 19.1599C3.7197 19.2142 3.55982 19.4612 3.6141 19.7123C3.66801 19.9633 3.91576 20.1229 4.16647 20.0686C4.41754 20.0143 4.57705 19.7673 4.52278 19.5162C4.4685 19.2651 4.22111 19.106 3.97004 19.1599H3.97041Z" fill="white"/>
|
||||
<path d="M7.09894 2.05112C7.3862 1.98909 7.5686 1.70626 7.50657 1.41937C7.44454 1.13248 7.16171 0.950078 6.87482 1.01211C6.58756 1.07414 6.40516 1.3566 6.46719 1.64386C6.52922 1.93076 6.81205 2.11316 7.09894 2.05112Z" fill="white"/>
|
||||
<path d="M13.9419 3.48169C14.4116 3.1996 14.5637 2.59037 14.282 2.12108C13.9999 1.65141 13.3903 1.49929 12.921 1.78138C12.4513 2.06311 12.2992 2.67234 12.5809 3.142C12.863 3.61166 13.4726 3.76341 13.9419 3.48169Z" fill="white"/>
|
||||
<path d="M1.56559 11.1325C1.10996 10.8201 0.48781 10.936 0.175441 11.3913C-0.136928 11.8466 -0.0209898 12.4687 0.434272 12.7811C0.889903 13.0935 1.51206 12.9775 1.82443 12.5223C2.13679 12.067 2.02086 11.4448 1.56523 11.1325H1.56559Z" fill="white"/>
|
||||
<path d="M20.3268 7.21426C19.9428 7.47937 19.8464 8.00552 20.1119 8.38952C20.3774 8.77352 20.9035 8.86952 21.2875 8.60441C21.6715 8.3393 21.7679 7.81315 21.5024 7.42915C21.2369 7.04515 20.7108 6.94915 20.3268 7.21426Z" fill="white"/>
|
||||
<path d="M22.1769 13.065C21.8375 13.1381 21.6215 13.4727 21.695 13.812C21.7681 14.1517 22.1026 14.3669 22.4423 14.2938C22.7817 14.2204 22.9977 13.8862 22.9242 13.5469C22.8507 13.2072 22.5162 12.9919 22.1769 13.065Z" fill="white"/>
|
||||
<path d="M20.4671 10.1458C20.1344 9.67393 19.6637 9.36414 19.1501 9.21128C19.2254 8.22728 18.9795 7.21338 18.3747 6.3383C17.1953 4.63245 15.0424 4.00661 13.18 4.68193C11.5158 3.61596 9.31448 3.57128 7.58685 4.76464C6.71252 5.3687 6.08925 6.19947 5.73812 7.12291C5.22968 7.19159 4.72827 7.36181 4.2767 7.67381C2.78501 8.70433 2.39141 10.7137 3.33775 12.2368C2.05319 13.4131 1.75707 15.3715 2.73295 16.8843C3.3119 17.7811 4.22132 18.3217 5.19793 18.4823C5.21602 19.2145 5.43572 19.9496 5.88322 20.5969C7.10722 22.3677 9.53565 22.8112 11.3069 21.5879C11.3744 21.541 11.4269 21.4816 11.4907 21.4313C12.4781 22.3123 13.9598 22.4574 15.0966 21.6721C15.7033 21.2534 16.091 20.6438 16.2605 19.9814C17.1499 20.0142 18.0553 19.7883 18.844 19.2433C20.7355 17.9366 21.2429 15.3819 20.0329 13.4541C21.0043 12.6352 21.2133 11.2029 20.4671 10.1454V10.1458ZM14.219 17.2483C13.3871 16.8407 12.882 15.9091 13.098 14.989C13.2593 14.3008 14.7972 11.4909 14.8548 11.0589C14.9135 10.6184 14.6783 10.5808 14.5313 10.5734C14.3419 10.5634 14.1924 10.6557 14.0063 10.9363C13.8372 11.1922 11.9242 15.0215 11.7584 15.3346C11.4616 15.894 11.0879 16.0288 10.7128 16.0088C10.1656 15.9804 9.91522 15.6872 9.99424 15.16C10.0408 14.8498 11.2537 12.1105 11.3165 11.6829C11.3552 11.4185 11.3028 11.1379 11.0406 11.0035C10.7781 10.8691 10.4687 11.0752 10.376 11.2313C10.2483 11.4466 8.52839 15.9376 8.34525 16.2702C8.02845 16.8462 7.69504 17.0294 7.19325 17.053C6.00692 17.1091 5.12741 16.134 5.51547 14.9381C5.68864 14.4053 6.83067 10.3662 7.40962 9.33793C7.79842 8.64673 8.87842 8.12205 9.62722 8.44587C10.0153 8.61387 10.5525 8.8823 10.7113 8.95208C11.0772 9.11418 11.4701 8.67479 11.6244 8.54039C11.7795 8.40599 11.9272 8.26458 12.1158 8.18371C12.3041 8.10322 12.6003 8.06962 12.8292 8.10322C13.0577 8.13682 13.1944 8.22322 13.28 8.29153C13.4484 8.42556 13.5533 8.5319 13.7124 8.68291C13.9517 8.91036 14.1241 8.77264 14.2441 8.70322C14.452 8.58248 14.6144 8.48427 15.2296 8.49534C15.8628 8.50642 16.5905 8.73276 16.7416 9.81239C16.9099 11.0117 14.7776 14.1014 14.9268 15.5347C15.032 16.5449 16.7397 15.8338 16.8845 16.7561C17.0717 17.9528 14.7503 17.5075 14.2193 17.2476L14.219 17.2483Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_75_35">
|
||||
<rect width="24" height="21.2795" fill="white" transform="translate(0 1)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
30
images/icons/meetup.svg
Normal file
@ -0,0 +1,30 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_75_34)">
|
||||
<g clip-path="url(#clip1_75_34)">
|
||||
<path d="M5.24266 6.07504C5.58752 5.83689 5.67392 5.3639 5.43576 5.01904C5.19724 4.67418 4.72426 4.58778 4.37939 4.82593C4.03453 5.06409 3.94813 5.53707 4.18629 5.88193C4.42481 6.22643 4.89779 6.3132 5.24266 6.07504Z" fill="white"/>
|
||||
<path d="M23.9889 10.5173C23.9342 10.2651 23.6857 10.1045 23.4335 10.1591C23.181 10.2138 23.0207 10.4622 23.075 10.7148C23.1297 10.967 23.3785 11.1272 23.6307 11.073C23.8829 11.0183 24.0435 10.7694 23.9892 10.5173H23.9889Z" fill="white"/>
|
||||
<path d="M3.97041 19.1599C3.7197 19.2142 3.55982 19.4612 3.6141 19.7123C3.66801 19.9633 3.91576 20.1229 4.16647 20.0686C4.41754 20.0143 4.57705 19.7673 4.52278 19.5162C4.4685 19.2651 4.22111 19.106 3.97004 19.1599H3.97041Z" fill="white"/>
|
||||
<path d="M7.09894 2.05112C7.3862 1.98909 7.5686 1.70626 7.50657 1.41937C7.44454 1.13248 7.16171 0.950078 6.87482 1.01211C6.58756 1.07414 6.40516 1.3566 6.46719 1.64386C6.52922 1.93076 6.81205 2.11316 7.09894 2.05112Z" fill="white"/>
|
||||
<path d="M13.9419 3.48169C14.4116 3.1996 14.5637 2.59037 14.282 2.12108C13.9999 1.65141 13.3903 1.49929 12.921 1.78138C12.4513 2.06311 12.2992 2.67234 12.5809 3.142C12.863 3.61166 13.4726 3.76341 13.9419 3.48169Z" fill="white"/>
|
||||
<path d="M1.56559 11.1325C1.10996 10.8201 0.48781 10.936 0.175441 11.3913C-0.136928 11.8466 -0.0209898 12.4687 0.434272 12.7811C0.889903 13.0935 1.51206 12.9775 1.82443 12.5223C2.13679 12.067 2.02086 11.4448 1.56523 11.1325H1.56559Z" fill="white"/>
|
||||
<path d="M20.3268 7.21426C19.9428 7.47937 19.8464 8.00552 20.1119 8.38952C20.3774 8.77352 20.9035 8.86952 21.2875 8.60441C21.6715 8.3393 21.7679 7.81315 21.5024 7.42915C21.2369 7.04515 20.7108 6.94915 20.3268 7.21426Z" fill="white"/>
|
||||
<path d="M22.1769 13.065C21.8375 13.1381 21.6215 13.4727 21.695 13.812C21.7681 14.1517 22.1026 14.3669 22.4423 14.2938C22.7817 14.2204 22.9977 13.8862 22.9242 13.5469C22.8507 13.2072 22.5162 12.9919 22.1769 13.065Z" fill="white"/>
|
||||
<path d="M20.4671 10.1458C20.1344 9.67393 19.6637 9.36414 19.1501 9.21128C19.2254 8.22728 18.9795 7.21338 18.3747 6.3383C17.1953 4.63245 15.0424 4.00661 13.18 4.68193C11.5158 3.61596 9.31448 3.57128 7.58685 4.76464C6.71252 5.3687 6.08925 6.19947 5.73812 7.12291C5.22968 7.19159 4.72827 7.36181 4.2767 7.67381C2.78501 8.70433 2.39141 10.7137 3.33775 12.2368C2.05319 13.4131 1.75707 15.3715 2.73295 16.8843C3.3119 17.7811 4.22132 18.3217 5.19793 18.4823C5.21602 19.2145 5.43572 19.9496 5.88322 20.5969C7.10722 22.3677 9.53565 22.8112 11.3069 21.5879C11.3744 21.541 11.4269 21.4816 11.4907 21.4313C12.4781 22.3123 13.9598 22.4574 15.0966 21.6721C15.7033 21.2534 16.091 20.6438 16.2605 19.9814C17.1499 20.0142 18.0553 19.7883 18.844 19.2433C20.7355 17.9366 21.2429 15.3819 20.0329 13.4541C21.0043 12.6352 21.2133 11.2029 20.4671 10.1454V10.1458ZM14.219 17.2483C13.3871 16.8407 12.882 15.9091 13.098 14.989C13.2593 14.3008 14.7972 11.4909 14.8548 11.0589C14.9135 10.6184 14.6783 10.5808 14.5313 10.5734C14.3419 10.5634 14.1924 10.6557 14.0063 10.9363C13.8372 11.1922 11.9242 15.0215 11.7584 15.3346C11.4616 15.894 11.0879 16.0288 10.7128 16.0088C10.1656 15.9804 9.91522 15.6872 9.99424 15.16C10.0408 14.8498 11.2537 12.1105 11.3165 11.6829C11.3552 11.4185 11.3028 11.1379 11.0406 11.0035C10.7781 10.8691 10.4687 11.0752 10.376 11.2313C10.2483 11.4466 8.52839 15.9376 8.34525 16.2702C8.02845 16.8462 7.69504 17.0294 7.19325 17.053C6.00692 17.1091 5.12741 16.134 5.51547 14.9381C5.68864 14.4053 6.83067 10.3662 7.40962 9.33793C7.79842 8.64673 8.87842 8.12205 9.62722 8.44587C10.0153 8.61387 10.5525 8.8823 10.7113 8.95208C11.0772 9.11418 11.4701 8.67479 11.6244 8.54039C11.7795 8.40599 11.9272 8.26458 12.1158 8.18371C12.3041 8.10322 12.6003 8.06962 12.8292 8.10322C13.0577 8.13682 13.1944 8.22322 13.28 8.29153C13.4484 8.42556 13.5533 8.5319 13.7124 8.68291C13.9517 8.91036 14.1241 8.77264 14.2441 8.70322C14.452 8.58248 14.6144 8.48427 15.2296 8.49534C15.8628 8.50642 16.5905 8.73276 16.7416 9.81239C16.9099 11.0117 14.7776 14.1014 14.9268 15.5347C15.032 16.5449 16.7397 15.8338 16.8845 16.7561C17.0717 17.9528 14.7503 17.5075 14.2193 17.2476L14.219 17.2483Z" fill="white"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip2_75_34)">
|
||||
<path d="M17.1545 20.886C16.6786 21.2146 16.5593 21.8666 16.8883 22.3422C17.2173 22.8178 17.8693 22.937 18.3457 22.6084C18.8216 22.2798 18.9405 21.6277 18.6115 21.1522C18.2825 20.6762 17.6305 20.5573 17.1545 20.886ZM11.0408 22.7148C10.7473 22.9175 10.6734 23.3199 10.8765 23.6135C11.0792 23.907 11.4817 23.9805 11.7756 23.7778C12.0691 23.5747 12.1429 23.1722 11.9399 22.8787C11.7372 22.5852 11.3347 22.512 11.0408 22.7148ZM3.61372 19.7129C3.66763 19.964 3.91538 20.1235 4.16609 20.0692C4.41716 20.0149 4.57667 19.7679 4.52239 19.5168C4.46812 19.2658 4.22073 19.1066 3.96966 19.1605C3.71895 19.2148 3.55907 19.4618 3.61335 19.7129M1.82479 12.5225C2.13716 12.0672 2.02123 11.4451 1.56559 11.1327C1.10996 10.8204 0.48781 10.9363 0.175441 11.3916C-0.136928 11.8468 -0.0209898 12.469 0.434272 12.7813C0.889903 13.0937 1.51206 12.9778 1.82443 12.5225M5.24276 6.07537C5.58763 5.83722 5.67403 5.36423 5.43587 5.01937C5.19735 4.67451 4.72436 4.58811 4.3795 4.82626C4.03464 5.06442 3.94824 5.5374 4.18639 5.88226C4.42492 6.22676 4.8979 6.31352 5.24276 6.07537ZM7.50578 1.41937C7.44375 1.13248 7.16092 0.950078 6.87403 1.01211C6.58676 1.07414 6.40436 1.3566 6.46639 1.64386C6.52843 1.93076 6.81126 2.11316 7.09815 2.05112C7.38541 1.98909 7.56781 1.70626 7.50578 1.41937ZM14.2823 2.12165C14.0002 1.65199 13.3906 1.49986 12.9213 1.78196C12.4516 2.06368 12.2995 2.67291 12.5812 3.14257C12.8633 3.61223 13.4729 3.76399 13.9422 3.48226C14.4119 3.20017 14.564 2.59094 14.2823 2.12165ZM19.1502 9.21162C19.2255 8.22762 18.9796 7.21371 18.3748 6.33863C17.1955 4.63279 15.0425 4.00694 13.1801 4.68226C11.516 3.61629 9.31464 3.57162 7.58701 4.76497C6.71267 5.36903 6.08941 6.1998 5.73827 7.12325C5.22984 7.19192 4.72843 7.36214 4.27686 7.67414C2.78516 8.70466 2.39156 10.714 3.3379 12.2371C2.05335 13.4135 1.75723 15.3719 2.7331 16.8846C3.31206 17.7815 4.22147 18.322 5.19809 18.4826C5.21618 19.2148 5.43587 19.95 5.88338 20.5972C7.10738 22.368 9.53581 22.8115 11.307 21.5882C11.3746 21.5413 11.427 21.4819 11.4909 21.4317C12.4782 22.3127 13.9599 22.4578 15.0968 21.6724C15.7034 21.2537 16.0911 20.6441 16.2606 19.9817C17.1501 20.0146 18.0554 19.7886 18.8441 19.2436C20.7357 17.9369 21.243 15.3822 20.033 13.4544C21.0045 12.6355 21.2135 11.2032 20.4673 10.1458C20.1346 9.67389 19.6638 9.36411 19.1502 9.21125M21.2877 8.60423C21.6717 8.33912 21.7681 7.81297 21.5026 7.42897C21.2371 7.04497 20.7109 6.94897 20.3269 7.21408C19.9429 7.47919 19.8466 8.00534 20.1121 8.38934C20.3775 8.77334 20.9037 8.86934 21.2877 8.60423ZM22.9237 13.5471C22.8503 13.2074 22.5157 12.9922 22.1764 13.0653C21.8371 13.1388 21.6211 13.4729 21.6946 13.8122C21.7677 14.1519 22.1022 14.3672 22.4419 14.2941C22.7812 14.2206 22.9972 13.8864 22.9237 13.5471ZM23.9893 10.5172C23.9347 10.265 23.6862 10.1044 23.434 10.1591C23.1815 10.2137 23.0212 10.4622 23.0755 10.7148C23.1301 10.9669 23.379 11.1272 23.6312 11.0729C23.8834 11.0183 24.044 10.7694 23.9897 10.5172" fill="#ED1C40"/>
|
||||
<path d="M16.8837 16.7577C16.7394 15.8357 15.0317 16.5468 14.9261 15.5362C14.7769 14.1025 16.9088 11.0132 16.7408 9.8139C16.5898 8.73427 15.8621 8.50793 15.2288 8.49686C14.6137 8.48578 14.4512 8.58363 14.2434 8.70473C14.1234 8.77415 13.9509 8.91187 13.7117 8.68443C13.5525 8.53304 13.4477 8.42707 13.2793 8.29304C13.1936 8.22436 13.057 8.13833 12.8285 8.10473C12.5995 8.07113 12.3034 8.10473 12.1151 8.18523C11.9264 8.26609 11.7787 8.4075 11.6237 8.5419C11.469 8.6763 11.0765 9.11606 10.7106 8.95359C10.5518 8.88344 10.0146 8.61501 9.62649 8.44738C8.87769 8.12356 7.79769 8.64824 7.40889 9.33944C6.83031 10.3674 5.68791 14.4068 5.51474 14.9396C5.12668 16.1359 6.00655 17.111 7.19252 17.0545C7.69394 17.0309 8.02772 16.8477 8.34452 16.2717C8.52766 15.9391 10.2475 11.4485 10.3753 11.2329C10.468 11.0767 10.7774 10.8706 11.0399 11.005C11.3021 11.1394 11.3545 11.4201 11.3157 11.6844C11.253 12.112 10.04 14.8513 9.99351 15.1615C9.91449 15.6884 10.1648 15.9815 10.712 16.0103C11.0872 16.0303 11.4608 15.8955 11.7577 15.3361C11.9238 15.0234 13.8365 11.1937 14.0056 10.9378C14.1917 10.6572 14.3412 10.5649 14.5306 10.5749C14.6776 10.5823 14.9128 10.6199 14.8541 11.0604C14.7965 11.4924 13.2582 14.3023 13.0973 14.9905C12.8813 15.9103 13.3864 16.8418 14.2182 17.2498C14.7488 17.5098 17.0706 17.9551 16.8834 16.7584" fill="white"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_75_34">
|
||||
<rect width="24" height="24" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip1_75_34">
|
||||
<rect width="24" height="21.2795" fill="white" transform="translate(0 1)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip2_75_34">
|
||||
<rect width="24" height="22.8923" fill="white" transform="translate(0 1)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 8.7 KiB |
@ -1 +1,10 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m0 0h24v24h-24z"/></clipPath><g clip-path="url(#a)"><path clip-rule="evenodd" d="m0 11.64c0-6.68831 5.24005-11.64 12-11.64 6.76 0 12 4.95169 12 11.64 0 6.6884-5.24 11.64-12 11.64-1.2142 0-2.3791-.1603-3.47362-.4612-.21276-.0586-.43901-.042-.64093.047l-2.38183 1.0514c-.62304.2751-1.32634-.168-1.34722-.8488l-.06535-2.1346c-.00804-.263-.12636-.5088-.32237-.6842-2.33492-2.0881-3.76868-5.1111-3.76868-8.6096zm8.31906-2.1884-3.525 5.5925c-.33828.5367.32143 1.1415.8268.758l3.78644-2.8737c.25613-.1944.6101-.1954.8673-.0025l2.8037 2.1028c.8412.631 2.042.4094 2.6027-.4802l3.525-5.59255c.3382-.53671-.3214-1.14151-.8268-.75799l-3.7865 2.87364c-.2561.1944-.61.1954-.8673.0025l-2.8036-2.10274c-.8413-.63096-2.04202-.40944-2.60274.48024z" fill="#fff" fill-rule="evenodd"/></g></svg>
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_4_39)">
|
||||
<path d="M11.9991 0.0478516C5.26616 0.0478516 0.046875 4.9798 0.046875 11.6415C0.046875 15.1263 1.47492 18.1368 3.80034 20.2169C3.99588 20.3914 4.11349 20.6367 4.12162 20.8982L4.18664 23.0247C4.20719 23.7027 4.90807 24.1439 5.52815 23.87L7.90042 22.8225C8.1017 22.7341 8.32688 22.7173 8.53867 22.7761C9.62919 23.0759 10.789 23.2356 11.9986 23.2356C18.7315 23.2356 23.9508 18.3036 23.9508 11.642C23.9508 4.98028 18.732 0.0478516 11.9991 0.0478516ZM19.4056 8.54777L15.2443 14.979C15.033 15.3055 14.5975 15.3988 14.2709 15.1875L10.4161 12.6933C10.267 12.5967 10.0738 12.5996 9.92751 12.7004L5.58265 15.6971C4.94871 16.1341 4.17373 15.382 4.59205 14.7357L8.75381 8.30442C8.96512 7.97789 9.40066 7.88466 9.72672 8.09598L13.5825 10.5906C13.7317 10.6872 13.9248 10.6843 14.0711 10.5835L18.415 7.58729C19.0489 7.14984 19.8239 7.90235 19.4056 8.54873V8.54777Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_4_39">
|
||||
<rect width="24" height="24" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 1.1 KiB |
@ -1 +0,0 @@
|
||||
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m0 0h24v24h-24z"/></clipPath><g clip-path="url(#a)"><path clip-rule="evenodd" d="m7.81661.0783257 13.47389 3.3594043c1.4019.34953 2.255 1.76934 1.9054 3.17123l-3.8414 15.40724c-.3496 1.4019-1.7694 2.255-3.1713 1.9055l-13.47382-3.3594c-1.40189-.3496-2.255-1.7694-1.905468-3.1713l3.841458-15.4072c.34953-1.401898 1.76934-2.255005 3.17124-1.9054743zm-.54126 4.3583943 12.51095 3.11932c.2835.0707.4561.35791.3854.6415l-.1659.66528c-.0707.28358-.3579.45616-.6415.38545l-12.51088-3.11932c-.28358-.0707-.45616-.35791-.38545-.6415l.16587-.66528c.07071-.28358.35792-.45616.64151-.38545zm11.55995 7.07398-12.51095-3.1193c-.28359-.0707-.5708.10187-.64151.38546l-.16587.66528c-.07071.28358.10187.57076.38546.64146l12.51087 3.1194c.2836.0707.5708-.1019.6415-.3855l.1659-.6653c.0707-.2836-.1019-.5708-.3854-.6415zm-13.49406.5851 5.74196 1.4317c.2836.0707.4562.3579.3855.6415l-.1659.6653c-.0707.2835-.3579.4561-.6415.3854l-5.74198-1.4316c-.28359-.0707-.45616-.3579-.38546-.6415l.16587-.6653c.07071-.2836.35792-.4562.64151-.3855z" fill="#fff" fill-rule="evenodd"/></g></svg>
|
Before Width: | Height: | Size: 1.2 KiB |
26
images/icons/signal-alt.svg
Normal file
@ -0,0 +1,26 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_25_65)">
|
||||
<path d="M12 0C12.6226 0 13.2341 0.0474105 13.8311 0.138818L13.6594 1.2508C13.1184 1.16797 12.5642 1.125 12 1.125C11.4358 1.125 10.8817 1.16796 10.3407 1.25079L10.169 0.138806C10.766 0.0474064 11.3775 0 12 0Z" fill="#3B45FD"/>
|
||||
<path d="M14.8477 0.339844L14.5808 1.43298C15.6772 1.69982 16.7085 2.13289 17.6466 2.70394L18.2308 1.74229C17.1957 1.11215 16.0576 0.634298 14.8477 0.339844Z" fill="#3B45FD"/>
|
||||
<path d="M19.0918 2.31885L18.427 3.22645C19.3236 3.88437 20.1156 4.67641 20.7735 5.57301L21.6811 4.90815C20.9551 3.91879 20.0812 3.04482 19.0918 2.31885Z" fill="#3B45FD"/>
|
||||
<path d="M22.2576 5.76953L21.296 6.35366C21.867 7.29178 22.3001 8.32315 22.5669 9.41959L23.6601 9.15262C23.3656 7.94276 22.8878 6.8047 22.2576 5.76953Z" fill="#3B45FD"/>
|
||||
<path d="M23.8612 10.1689L22.7491 10.3406C22.8321 10.8816 22.875 11.4358 22.875 11.9999C22.875 12.5641 22.8321 13.1183 22.7491 13.6594L23.8612 13.831C23.9526 13.234 24 12.6225 24 11.9999C24 11.3774 23.9526 10.7659 23.8612 10.1689Z" fill="#3B45FD"/>
|
||||
<path d="M21.296 17.6466C21.867 16.7083 22.3001 15.6771 22.5669 14.5806L23.6601 14.8475C23.3656 16.0575 22.8878 17.1955 22.2576 18.2307L21.296 17.6466Z" fill="#3B45FD"/>
|
||||
<path d="M20.7735 18.4272L21.6812 19.092C20.9552 20.0814 20.0813 20.9553 19.0919 21.6813L18.4269 20.7737C19.3236 20.1158 20.1156 19.3238 20.7735 18.4272Z" fill="#3B45FD"/>
|
||||
<path d="M17.6466 21.2959L18.2307 22.2575C17.1956 22.8877 16.0575 23.3656 14.8476 23.66L14.5807 22.5668C15.6771 22.3 16.7085 21.8669 17.6466 21.2959Z" fill="#3B45FD"/>
|
||||
<path d="M13.6593 22.749L13.831 23.8611C13.234 23.9525 12.6225 23.9999 12 23.9999C11.3774 23.9999 10.7659 23.9525 10.1689 23.8611L10.3405 22.7492C10.8813 22.832 11.4355 22.8749 12 22.8749C12.5642 22.8749 13.1183 22.832 13.6593 22.749Z" fill="#3B45FD"/>
|
||||
<path d="M9.41917 22.5672L9.15226 23.6601C8.24343 23.4388 7.37511 23.1142 6.56049 22.6992L5.42159 22.965L5.16596 21.8694L6.70501 21.5103L7.07113 21.6967C7.80894 22.0726 8.59548 22.3668 9.41917 22.5672Z" fill="#3B45FD"/>
|
||||
<path d="M4.21646 22.0909L4.47209 23.1865L2.51991 23.6419C1.22079 23.945 0.0548528 22.7791 0.357982 21.4801L0.813491 19.5278L1.90907 19.7834L1.45355 21.7357C1.33988 22.2229 1.77711 22.66 2.26428 22.5464L4.21646 22.0909Z" fill="#3B45FD"/>
|
||||
<path d="M2.13062 18.8338L1.03504 18.5782L1.30079 17.4393C0.885789 16.6246 0.561101 15.7563 0.339908 14.8475L1.43279 14.5806C1.63319 15.4042 1.92735 16.1908 2.30321 16.9287L2.48973 17.2948L2.13062 18.8338Z" fill="#3B45FD"/>
|
||||
<path d="M1.25064 13.6594L0.138804 13.831C0.0474057 13.234 0 12.6226 0 12C0 11.3775 0.04741 10.766 0.138817 10.1689L1.2508 10.3406C1.16797 10.8817 1.125 11.4358 1.125 12C1.125 12.5645 1.16792 13.1186 1.25064 13.6594Z" fill="#3B45FD"/>
|
||||
<path d="M1.43306 9.4191L0.339927 9.15213C0.63438 7.94227 1.11223 6.80421 1.74237 5.76904L2.70402 6.35317C2.13297 7.29129 1.69991 8.32266 1.43306 9.4191Z" fill="#3B45FD"/>
|
||||
<path d="M3.22647 5.57299L2.31886 4.90813C3.04483 3.91878 3.91881 3.04482 4.90817 2.31885L5.57303 3.22645C4.67643 3.88437 3.88438 4.6764 3.22647 5.57299Z" fill="#3B45FD"/>
|
||||
<path d="M6.3534 2.70392L5.76926 1.74226C6.80442 1.11214 7.94249 0.634292 9.15236 0.339844L9.41933 1.43298C8.32289 1.69982 7.29151 2.13286 6.3534 2.70392Z" fill="#3B45FD"/>
|
||||
<path d="M21.75 12C21.75 17.3849 17.3849 21.75 12 21.75C10.292 21.75 8.68661 21.3108 7.29053 20.5392C7.15611 20.4649 6.99927 20.4405 6.84969 20.4753L2.51268 21.4873L3.52466 17.1503C3.55955 17.0007 3.53503 16.8438 3.46075 16.7094C2.68917 15.3134 2.25 13.708 2.25 12C2.25 6.61523 6.61523 2.25 12 2.25C17.3849 2.25 21.75 6.61523 21.75 12Z" fill="#3B45FD"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_25_65">
|
||||
<rect width="24" height="24" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
30
index.html
@ -33,6 +33,11 @@
|
||||
<link rel="stylesheet" href="css/reset.css">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
<link rel="stylesheet" href="css/brands.css">
|
||||
|
||||
<!-- LittleLink Extended Stylesheet (Optional) -->
|
||||
<!-- <link rel="stylesheet" href="css/brands-extended.css"> -->
|
||||
<!-- Learn more at https://github.com/sethcottle/littlelink-extended.
|
||||
Remove comments if you've added LittleLink Extended dependencies -->
|
||||
|
||||
</head>
|
||||
|
||||
@ -63,7 +68,7 @@
|
||||
<div class="button-stack" role="navigation">
|
||||
|
||||
<!-- Default LittleLink -->
|
||||
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/littlelink.svg" alt="Little Link Logo">LittleLink</a>
|
||||
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/littlelink.svg" alt="LittleLink Logo">LittleLink</a>
|
||||
|
||||
<!-- Amazon -->
|
||||
<a class="button button-amazon" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/amazon.svg" alt="Amazon Wishlist Logo">Amazon Wishlist</a>
|
||||
@ -73,6 +78,9 @@
|
||||
|
||||
<!-- Apple App Store -->
|
||||
<a class="button button-appstore" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple.svg" alt="Apple Logo">Apple App Store</a>
|
||||
|
||||
<!-- Apple Invites -->
|
||||
<a class="button button-invites" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple-invites.svg" alt="Apple Invites Logo">Apple Invites</a>
|
||||
|
||||
<!-- Apple Music -->
|
||||
<a class="button button-apple-music" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple-music.svg" alt="Apple Music Logo">Listen on Apple Music</a>
|
||||
@ -203,9 +211,18 @@
|
||||
<!-- Mastodon -->
|
||||
<a class="button button-mastodon" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/mastodon.svg" alt="Mastodon Logo">Mastodon</a>
|
||||
|
||||
<!-- Matrix -->
|
||||
<a class="button button-matrix" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/matrix.svg" alt="Matrix Logo">Matrix</a>
|
||||
|
||||
<!-- Medium -->
|
||||
<a class="button button-medium" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/medium.svg" alt="Medium Logo">Medium</a>
|
||||
|
||||
<!-- Meetup -->
|
||||
<a class="button button-meetup" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/meetup.svg" alt="Meetup Logo">Meetup</a>
|
||||
|
||||
<!-- Meetup Alt -->
|
||||
<a class="button button-meetup-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/meetup-alt.svg" alt="Meetup Logo">Meetup</a>
|
||||
|
||||
<!-- Microsoft Store -->
|
||||
<a class="button button-microsoft" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/microsoft.svg" alt="Microsoft Logo">Get it from Microsoft</a>
|
||||
|
||||
@ -213,7 +230,7 @@
|
||||
<a class="button button-notion" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/notion.svg" alt="Notion Logo">Notion</a>
|
||||
|
||||
<!-- Obsidian -->
|
||||
<a class="button button-obsidian" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/obsidian.svg" alt="OnlyFans Logo">Obsidian</a>
|
||||
<a class="button button-obsidian" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/obsidian.svg" alt="Obsidian Logo">Obsidian</a>
|
||||
|
||||
<!-- OnlyFans -->
|
||||
<a class="button button-onlyfans" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/onlyfans.svg" alt="OnlyFans Logo">OnlyFans (18+)</a>
|
||||
@ -230,9 +247,6 @@
|
||||
<!-- Product Hunt -->
|
||||
<a class="button button-product-hunt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/product-hunt.svg" alt="Product Hunt Logo">Product Hunt</a>
|
||||
|
||||
<!-- Read.cv -->
|
||||
<a class="button button-read-cv" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/read-cv.svg" alt="Read.cv logo">Read.cv</a>
|
||||
|
||||
<!-- Reddit -->
|
||||
<a class="button button-reddit" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/reddit.svg" alt="Reddit Logo">Reddit</a>
|
||||
|
||||
@ -242,6 +256,9 @@
|
||||
<!-- Signal -->
|
||||
<a class="button button-signal" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/signal.svg" alt="Signal Logo">Signal</a>
|
||||
|
||||
<!-- Signal Alt -->
|
||||
<a class="button button-signal-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/signal-alt.svg" alt="Signal Logo">Signal</a>
|
||||
|
||||
<!-- Slack -->
|
||||
<a class="button button-slack" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/slack.svg" alt="Slack Logo">Join Slack</a>
|
||||
|
||||
@ -377,6 +394,9 @@
|
||||
<!-- Generic Website -->
|
||||
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-website.svg" alt="Website Icon">Visit Website</a>
|
||||
|
||||
<!-- LittleLink Extended -->
|
||||
<a class="button button-default" href="https://github.com/sethcottle/littlelink-extended" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/littlelink.svg" alt="LittleLink Logo">LittleLink Extended</a>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Feel free to add your own footer information, including updating `privacy.html` to reflect how your LittleLink fork is set up -->
|
||||
|