commit ccead501167215e516b4474cbf4e76a235aa42fa Author: Krystie Date: Mon May 18 02:22:57 2026 -0700 Initial commit: Beep WordPress plugin - Custom post type with likes, replies, moderation, shortcodes - Beep icon and logo assets - CSS and JS for frontend diff --git a/README.md b/README.md new file mode 100755 index 0000000..11044f4 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# Beep + +A Twitter-style microblog for WordPress. Logged-in users post short updates, like, and reply (with reply threads, multiple levels deep). Likes can drive a "Top" feed for ranking the best beeps. Designed to look like a Twitter timeline, hosted entirely on your own site. + +## What's in v1.4 + +- **Like beeps and replies.** Hearts on every post and every reply, with a pop animation when you tap. +- **Nested replies.** Reply to a reply, to a reply, to a reply. Visual indent caps at two levels (deeper threads still nest structurally). +- **Latest / Top tabs.** "Top" sorts your feed by like count — a built-in way for readers to surface the best stuff. +- **Per-post Beep badge.** Every beep and reply carries a small bird icon in the corner, branding it as a Beep. +- **Friendlier visitor experience.** Logged-out visitors see clean read-only beeps; logged-in users get the full interactive feed. + +## Install Beep + +1. In wp-admin, go to **Plugins → Add New → Upload Plugin**. +2. Upload `beep.zip` and click **Install Now**, then **Activate**. +3. On the page you want the feed (your one-page site, a dedicated "Feed" page, etc.), add the shortcode: + + ``` + [beep_feed] + ``` + + Save and visit the page. As an admin, you'll see a composer at the top — type a message and click "Beep" to post. + +## Invite friends (with magic links — no passwords) + +This is the easiest way to let a small circle into your Beep feed without setting up Google/Facebook developer apps. The flow: + +1. **Open registration.** Go to **Settings → General**, check **Anyone can register**, and set **New User Default Role** to **Subscriber**. Save. +2. **Install passwordless login.** Plugins → Add New → search for **Passwordless Login** (any well-reviewed one — Cozmoslabs or Magic Login both work). Install and activate. +3. **Share the sign-up link.** Send your friends a direct link to: + + ``` + https://your-site.com/wp-login.php?action=register + ``` + + They type their email, get a one-time sign-in link, and they're in. No password to remember. +4. **They can now like and reply.** Liking and replying require being logged in; your feed remains read-only for the public. +5. **Need to remove someone?** Users → click their name → scroll to **Chirp moderation** → check **Suspend from beeping**. They stay registered but can't post or interact. + +## Shortcode options + +``` +[beep_feed limit="50" header="Messages from" sort="latest"] +``` + +- `limit` — how many beeps to load on first render (default 50) +- `header` — text shown next to the wordmark (default "Messages from") +- `sort` — initial sort: `latest` (default) or `top` + +## Moderation + +- **Delete any beep or reply.** Logged-in admins see a small × in the top-right of each item. +- **Approve replies before they appear.** Settings → Discussion → "Comment must be manually approved" puts replies in a queue at **Comments** in the sidebar. + +## Branding + +Swap the bird/wordmark in `assets/`. The accent color is `#1D9BF0`; find/replace in `assets/beep.css` for a different palette. + +## What's not in this version + +Deliberate omissions to keep the plugin understandable: + +- Image uploads (text only, 280 char limit) +- Retweets / quote-beeps +- Direct messages +- Custom feeds (no "Following" filter — one global feed) + +## License + +GPLv2 or later, same as WordPress. diff --git a/assets/beep-icon-small.png b/assets/beep-icon-small.png new file mode 100755 index 0000000..56a4c45 Binary files /dev/null and b/assets/beep-icon-small.png differ diff --git a/assets/beep-icon.png b/assets/beep-icon.png new file mode 100755 index 0000000..269c34b Binary files /dev/null and b/assets/beep-icon.png differ diff --git a/assets/beep-icon.svg b/assets/beep-icon.svg new file mode 100755 index 0000000..28b2eb2 --- /dev/null +++ b/assets/beep-icon.svg @@ -0,0 +1 @@ +AABCHWp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAAEH3anVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo4MGE1OWIzZC01OGVjLTRjMGQtOGZlOS0wOGE5MDU2OGM0MDQAAAAB5Gp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAAO5qdW1iAAAAQWp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuYWN0aW9ucy52MgAAAAAYYzJzaK8iyp4YHAycjjlIX9Ee9rYAAAClY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmxjMnBhLmNyZWF0ZWRtc29mdHdhcmVBZ2VudGhDYW52YSBBSXFkaWdpdGFsU291cmNlVHlwZXhTaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS9jb21wb3NpdGVXaXRoVHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAADFanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaAhdhKaZhalgTl+LaOUx7zkAAAB9Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GQEPZmxlbmd0aBlYKGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggIFCd6gk7Z17bAjGodcXn7W9opkvaQsuCAjqOTmGwESdjcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAAB3GNib3Knamluc3RhbmNlSUR4LHhtcDppaWQ6MjdmNWQyNDYtMWY5NS00MmNlLTgzZjQtZGE3NGUwYTYwYWFhdGNsYWltX2dlbmVyYXRvcl9pbmZvo2RuYW1lZ2MycGEtcnNndmVyc2lvbmUwLjAuMHdvcmcuY29udGVudGF1dGguYzJwYV9yc2UwLjAuMGlzaWduYXR1cmV4TXNlbGYjanVtYmY9L2MycGEvdXJuOmMycGE6ODBhNTliM2QtNThlYy00YzBkLThmZTktMDhhOTA1NjhjNDA0L2MycGEuc2lnbmF0dXJlcmNyZWF0ZWRfYXNzZXJ0aW9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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2WQIAW89+2EaFY4NtWFf49xafNL2ZjVjdVmrgY2jGQaEYoc6NnOLSV/fr+onREooWoo2PCTAmGH/Uk0J2Eu1oTdfruN66h90qN0zfETgNLKOLh7M7GpSiN9GoP8VY5J9nw9OT2TC0vE/Yu5Oun8cSsIe11e8/CUGkPEuZc+AqBFyCPdzO2hOyXVfbEN3vv8E61InLGnKW8kdS2bZHYlg0lVZi0RGzWOt4EOwbLGYo7GbhEGQDaTAfoRaQtw4vx4oLr6YLzEOIy5tZedpZdhKfXLWOa7unpxQPMlL3L+i+RezjuwHCbdSlMVkVAHH2ORphpT9BaCJayZJapm+GoFnLEkG/rgYrEE0Tdh0tnl8SYURbpbZkHu3BBi7dPaxgeFDHeUjpUTXRyhCwWHxbDdg+K8KeEmanV+h9jNrruEuH+Kdbh349enxpmRZ/dHHVAe2Czk775hN9RPJDhND0Wuz+sCpreEXt4VsR/loZWG8LZg556vOGOQetydI55fvLuY1iynRXIa1lslBEzEluQisqmS0nU686zpsyHbrcMpOkUbuVklosyRBGYIrmy8CirZ5TPbZ/yrjjRX2hU7T34Ia1kbbqJB58gF2ylxmOOeWTgvuVjs0mzcXgUUX3mFAKdOyyFw0pNuvjK4WIXtO7XSxVzy4rtqHUUcTQiHfULisFUGc4YEY=Yes \ No newline at end of file diff --git a/assets/beep-logo.png b/assets/beep-logo.png new file mode 100755 index 0000000..f598804 Binary files /dev/null and b/assets/beep-logo.png differ diff --git a/assets/beep-logo.svg b/assets/beep-logo.svg new file mode 100755 index 0000000..6f3a098 --- /dev/null +++ b/assets/beep-logo.svg @@ -0,0 +1 @@ +AABCHWp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAAEH3anVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo2MWNjMjE1ZC04ZTZjLTRjMGQtYWEyNS1kNmY0ZTY0OWIxMGQAAAAB5Gp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAAO5qdW1iAAAAQWp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuYWN0aW9ucy52MgAAAAAYYzJzaDuUJpf8gX3AOI+dKFeIe9cAAAClY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmxjMnBhLmNyZWF0ZWRtc29mdHdhcmVBZ2VudGhDYW52YSBBSXFkaWdpdGFsU291cmNlVHlwZXhTaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS9jb21wb3NpdGVXaXRoVHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAADFanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaHsl4ugwsbssLQOELklP0JkAAAB9Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GQEPZmxlbmd0aBlYKGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggbSbE/DmoDKtYqNhKADyJkeRdj3A+ABERW5NpKh5mFl5jcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAAB3GNib3Knamluc3RhbmNlSUR4LHhtcDppaWQ6ZjdjNDhiNWUtNTM3NC00NjQ0LWI0ODctN2EwNzcxNjIzYTIzdGNsYWltX2dlbmVyYXRvcl9pbmZvo2RuYW1lZ2MycGEtcnNndmVyc2lvbmUwLjAuMHdvcmcuY29udGVudGF1dGguYzJwYV9yc2UwLjAuMGlzaWduYXR1cmV4TXNlbGYjanVtYmY9L2MycGEvdXJuOmMycGE6NjFjYzIxNWQtOGU2Yy00YzBkLWFhMjUtZDZmNGU2NDliMTBkL2MycGEuc2lnbmF0dXJlcmNyZWF0ZWRfYXNzZXJ0aW9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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2WQIAtuRdGCUbntEbvZIapFlfdXJsXaUCKfgP5iFKizSBmOUEAt/XHChlgMAmHDLHUS9salP8PLTK1+fnpFxBYiWsu8H23yKlqdz+64qzO8CHI2jMY+cdUMFxyolvc53tdV+jwdt4yaktidEj+IEAP31vpykomfe30fSHv9Qi2Eg4a7BQwpW/58q7R0wW/mHE4iQ3pvODT4LiKBzjW6WZHGqBj4Dl8aPtptYa4YpaKQOIAxFSeXF8erNKTorFXH8Z9jGOWjeSO1GqLYz6chI1E+3E38grLN6plqYnlbh/EckgxtZOvUgrdwT8xbpr5i/XHqRJ1o9IbDsRbCNpZZtki6w/7I8t/gVqjGeJbwW0aYxfJSgeuo4gxasOcoBaW6v2NFmOcXFTOwv9UpmUXGudL2IRIKZoHJlpclKn8gkWou89ssoxZFN9v1SuFWbaGfhIt45nBKBqB69i+wSvMBNVbJy8pp8FDwDMdPhsXK4Eujfv5t4Xk/6fFblnqyaNVexVF83/g6594u1LPDt+BzjkwoOsKiFk+N7Tf9KbeU+hK6dDWslGfcr3sI/RHDD/wTwc5fZv6xkksXjb0fAflm5ezuc1q5bhiMjaKHx1EZpIPg3/bPGJxrbRd4FOzib5Bse9t0c3kXCXcPRkHJE8d1tUIrN3/IMJZxgxvHw/SJsZA1ETiCg=Yes \ No newline at end of file diff --git a/assets/beep.css b/assets/beep.css new file mode 100755 index 0000000..01b530a --- /dev/null +++ b/assets/beep.css @@ -0,0 +1,760 @@ +/* ============================================================ + Beep — Twitter-style microblog for WordPress + All rules are scoped under .beep-feed so they don't leak + into the host theme. + ============================================================ */ + +.beep-feed, +.beep-feed * { + box-sizing: border-box; +} + +.beep-feed { + --beep-bg: #ffffff; + --beep-text: #0F1419; + --beep-text-secondary: #536471; + --beep-border: #EFF3F4; + --beep-hover: #F7F9F9; + --beep-accent: #1D9BF0; + --beep-accent-hover: #1A8CD8; + --beep-like: #F91880; + --beep-repost: #00BA7C; + --beep-page-bg: #E6ECF0; + + max-width: 600px; + margin: 24px auto; + background: var(--beep-bg); + border: 1px solid var(--beep-border); + border-radius: 16px; + overflow: hidden; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + "Helvetica Neue", Arial, sans-serif; + color: var(--beep-text); + font-size: 15px; + line-height: 1.4; + -webkit-font-smoothing: antialiased; +} + +/* ---------- Header ---------- */ +.beep-feed-header { + padding: 14px 20px; + border-bottom: 1px solid var(--beep-border); + font-size: 20px; + font-weight: 800; + background: rgba(255, 255, 255, 0.85); + backdrop-filter: blur(12px); + display: flex; + align-items: center; + gap: 10px; + position: sticky; + top: 0; + z-index: 10; +} + +.beep-feed-header-text { + font-size: 20px; + font-weight: 800; + color: var(--beep-text); + white-space: nowrap; +} + +.beep-feed-header .beep-logo { + height: 36px; + width: auto; + max-width: 100%; + flex-shrink: 0; + object-fit: contain; + display: block; +} + +/* ---------- Notices ---------- */ +.beep-notice { + padding: 24px 20px; + border-bottom: 1px solid var(--beep-border); + text-align: center; +} + +.beep-notice p { + margin: 0 0 12px; + font-size: 16px; +} + +.beep-notice-banned { + color: var(--beep-text-secondary); + font-style: italic; +} + +/* ---------- Avatars ---------- */ +.beep-feed .beep-avatar { + width: 48px !important; + height: 48px !important; + min-width: 48px !important; + max-width: 48px !important; + border-radius: 50% !important; + flex-shrink: 0; + background: #ccd6dd; + object-fit: cover !important; + aspect-ratio: 1 / 1 !important; + display: block !important; +} + +.beep-feed .beep-avatar-sm { + width: 36px !important; + height: 36px !important; + min-width: 36px !important; + max-width: 36px !important; +} + +/* ---------- Compose ---------- */ +.beep-compose { + display: flex; + gap: 12px; + padding: 16px; + border-bottom: 1px solid var(--beep-border); +} + +.beep-compose-body { + flex: 1; + min-width: 0; +} + +.beep-feed .beep-input { + width: 100% !important; + border: 0 !important; + outline: 0 !important; + resize: none !important; + background: #ffffff !important; + font-family: inherit !important; + font-size: 18px !important; + line-height: 1.4 !important; + color: var(--beep-text) !important; + padding: 8px 0 !important; + min-height: 32px; + overflow: hidden; + box-shadow: none !important; +} + +.beep-feed .beep-input::placeholder { + color: var(--beep-text-secondary) !important; + opacity: 1 !important; +} + +.beep-compose-footer, +.beep-reply-footer { + display: flex; + justify-content: flex-end; + align-items: center; + gap: 12px; + border-top: 1px solid var(--beep-border); + padding-top: 10px; + margin-top: 4px; +} + +/* ---------- Char counter ---------- */ +.beep-char-counter { + font-size: 13px; + color: var(--beep-text-secondary); + font-variant-numeric: tabular-nums; +} + +.beep-counter-warn { color: #FFD400; } +.beep-counter-bad { color: #F4212E; font-weight: 700; } + +/* ---------- Buttons ---------- */ +.beep-button { + display: inline-block; + background: var(--beep-accent); + color: #fff; + border: 0; + border-radius: 9999px; + padding: 8px 18px; + font-weight: 700; + font-size: 15px; + cursor: pointer; + text-decoration: none; + font-family: inherit; + transition: background-color 0.15s ease, opacity 0.15s ease; +} + +.beep-button:hover { background: var(--beep-accent-hover); color: #fff; } +.beep-button:disabled { opacity: 0.5; cursor: default; } +.beep-button:disabled:hover { background: var(--beep-accent); } + +.beep-button-secondary { + background: transparent; + color: var(--beep-accent); + border: 1px solid var(--beep-accent); + margin-left: 8px; +} +.beep-button-secondary:hover { + background: rgba(29, 155, 240, 0.1); + color: var(--beep-accent); +} + +/* ---------- Post ---------- */ +.beep-list { + background: var(--beep-bg); +} + +.beep-empty { + padding: 40px 20px; + text-align: center; + color: var(--beep-text-secondary); +} + +.beep-post { + display: flex; + gap: 12px; + padding: 12px 16px; + border-bottom: 1px solid var(--beep-border); + transition: background-color 0.15s ease; +} + +.beep-post:hover { background: var(--beep-hover); } +.beep-post:last-child { border-bottom: 0; } + +.beep-post-body { + flex: 1; + min-width: 0; +} + +/* ---------- Meta line ---------- */ +.beep-meta { + display: flex; + align-items: center; + gap: 4px; + font-size: 15px; + line-height: 1.2; + margin-bottom: 2px; + flex-wrap: wrap; +} + +.beep-name { + font-weight: 700; + color: var(--beep-text); +} + +.beep-handle, +.beep-dot, +.beep-time { + color: var(--beep-text-secondary); + font-weight: 400; +} + +.beep-time { text-decoration: none; } + +.beep-spacer { flex: 1; } + +.beep-menu-trigger { + background: transparent; + border: 0; + color: var(--beep-text-secondary); + cursor: pointer; + font-size: 18px; + line-height: 1; + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + transition: background-color 0.15s ease, color 0.15s ease; +} + +.beep-menu-trigger:hover { + background: rgba(244, 33, 46, 0.1); + color: #F4212E; +} + +/* ---------- Text ---------- */ +.beep-text { + font-size: 15px; + line-height: 1.4; + color: var(--beep-text); + word-wrap: break-word; + overflow-wrap: anywhere; + margin: 2px 0 12px; +} + +.beep-tag, +.beep-mention, +.beep-link { + color: var(--beep-accent); + text-decoration: none; +} + +.beep-tag:hover, +.beep-mention:hover, +.beep-link:hover { + text-decoration: underline; +} + +.beep-mention-stale { + color: var(--beep-accent); + opacity: 0.85; +} + +/* ---------- Action row ---------- */ +.beep-actions { + display: flex; + justify-content: space-between; + max-width: 425px; + margin-top: 4px; +} + +.beep-action { + display: flex; + align-items: center; + gap: 6px; + background: transparent; + border: 0; + color: var(--beep-text-secondary); + font-size: 13px; + font-family: inherit; + cursor: pointer; + padding: 6px 8px; + margin: -6px -8px; + border-radius: 9999px; + transition: color 0.15s ease, background-color 0.15s ease; +} + +.beep-action svg { + width: 18px; + height: 18px; + fill: currentColor; + display: block; +} + +.beep-action .beep-count { + font-variant-numeric: tabular-nums; +} + +.beep-action-reply:hover { color: var(--beep-accent); background: rgba(29,155,240,0.10); } +.beep-action-like:hover { color: var(--beep-like); background: rgba(249, 24,128,0.10); } +.beep-action-share:hover { color: var(--beep-accent); background: rgba(29,155,240,0.10); } + +/* Like state */ +.beep-action-like .beep-icon-filled { display: none; } +.beep-action-like .beep-icon-outline { display: inline-flex; } + +.beep-action-like.is-liked { + color: var(--beep-like); +} +.beep-action-like.is-liked .beep-icon-outline { display: none; } +.beep-action-like.is-liked .beep-icon-filled { display: inline-flex; } + +/* Heart "pop" animation when newly liked */ +.beep-action-like.beep-just-liked .beep-icon-filled { + animation: beep-heart-pop 0.55s ease; +} + +@keyframes beep-heart-pop { + 0% { transform: scale(0.5); } + 35% { transform: scale(1.35); } + 60% { transform: scale(0.85); } + 100% { transform: scale(1); } +} + +/* ---------- Reply form ---------- */ +.beep-reply-form { + margin-top: 8px; + padding: 10px 0 4px; + border-top: 1px solid var(--beep-border); +} + +.beep-reply-form .beep-input { + font-size: 16px; +} + +.beep-reply-form[hidden] { display: none; } + +.beep-pending { + padding: 12px; + background: var(--beep-hover); + color: var(--beep-text-secondary); + border-radius: 8px; + font-size: 14px; + text-align: center; +} + +/* ---------- Replies ---------- */ +.beep-replies { + margin-top: 8px; + padding-left: 24px; + border-left: 2px solid var(--beep-border); +} + +.beep-reply { + display: flex; + gap: 10px; + padding: 10px 0; + border-bottom: 1px solid var(--beep-border); +} + +.beep-reply:last-child { border-bottom: 0; } + +.beep-reply-body { + flex: 1; + min-width: 0; +} + +.beep-reply .beep-text { + font-size: 14px; + margin-bottom: 0; +} + +/* ---------- New-post entry animation ---------- */ +.beep-new { + animation: beep-slide-in 0.4s ease; +} + +@keyframes beep-slide-in { + from { opacity: 0; transform: translateY(-6px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ---------- Mobile ---------- */ +@media (max-width: 640px) { + .beep-feed { + margin: 0 auto; + border-radius: 0; + border-left: 0; + border-right: 0; + } + .beep-actions { max-width: none; } +} + +/* ---------- Tip popover (for "Copied" etc) ---------- */ +.beep-tip { + position: absolute; + margin-left: 8px; + padding: 2px 8px; + background: var(--beep-text); + color: #fff; + border-radius: 4px; + font-size: 12px; + white-space: nowrap; + animation: beep-tip-fade 1.5s ease forwards; +} + +@keyframes beep-tip-fade { + 0% { opacity: 0; } + 20% { opacity: 1; } + 80% { opacity: 1; } + 100% { opacity: 0; } +} + +/* ============================================================ + v1.4 — sort tabs, nested replies, Twitter polish + ============================================================ */ + +/* ---------- Sort tabs (Latest / Top) ---------- */ +.beep-feed .beep-tabs { + display: flex; + border-bottom: 1px solid var(--beep-border); + background: var(--beep-bg); +} + +.beep-feed .beep-tab { + flex: 1; + background: transparent; + border: 0; + padding: 14px 0; + font-family: inherit; + font-size: 15px; + font-weight: 700; + color: var(--beep-text-secondary); + cursor: pointer; + position: relative; + transition: background-color 0.15s ease, color 0.15s ease; +} + +.beep-feed .beep-tab:hover { + background: var(--beep-hover); + color: var(--beep-text); +} + +.beep-feed .beep-tab.is-active { + color: var(--beep-text); +} + +.beep-feed .beep-tab.is-active::after { + content: ''; + position: absolute; + left: 50%; + bottom: 0; + transform: translateX(-50%); + width: 56px; + height: 4px; + border-radius: 9999px; + background: var(--beep-accent); +} + +/* ---------- Loading state on feed list ---------- */ +.beep-feed .beep-list.beep-loading { + opacity: 0.5; + pointer-events: none; + transition: opacity 0.15s ease; +} + +/* ---------- Action row variant for replies (smaller, no share) ---------- */ +.beep-feed .beep-actions-reply { + max-width: 240px; + gap: 24px; + margin-top: 2px; +} + +/* ---------- Nested replies: visual indent, capped at depth 2 ---------- */ +.beep-feed .beep-replies-nested { + margin-top: 8px; + margin-left: 12px; + padding-left: 14px; + border-left: 2px solid var(--beep-border); +} + +/* Anything deeper than depth 2 stops indenting more */ +.beep-feed .beep-depth-2 .beep-replies-nested, +.beep-feed .beep-depth-3 .beep-replies-nested, +.beep-feed .beep-depth-4 .beep-replies-nested { + margin-left: 0; + padding-left: 8px; +} + +/* ---------- Focus rings on text inputs ---------- */ +.beep-feed .beep-input:focus, +.beep-feed .beep-input:focus-visible { + outline: 0 !important; + box-shadow: none !important; +} + +.beep-feed .beep-compose:focus-within, +.beep-feed .beep-reply-form:focus-within { + background: linear-gradient(to bottom, transparent, rgba(29, 155, 240, 0.04)); + transition: background-color 0.15s ease; +} + +/* ---------- Buttons: refine to match Twitter's "Post" button ---------- */ +.beep-feed .beep-post-button, +.beep-feed .beep-reply-submit { + font-size: 14px; + padding: 7px 18px; + font-weight: 700; + letter-spacing: -0.1px; +} + +/* ---------- Tighter post hover ---------- */ +.beep-feed .beep-post { + transition: background-color 0.15s ease; +} + +/* ---------- Refine action icons size ---------- */ +.beep-feed .beep-action { + padding: 4px 6px; + font-size: 13px; +} +.beep-feed .beep-action svg { + width: 17px; + height: 17px; +} + +/* ---------- Reply rows: tighten spacing ---------- */ +.beep-feed .beep-reply { + padding: 10px 0 8px; +} + +/* Make sure reply meta + actions feel cohesive */ +.beep-feed .beep-reply .beep-text { + margin-bottom: 4px; +} + +/* ---------- Per-post Beep badge (top-right of each post/reply) ---------- */ +.beep-feed .beep-post-badge { + width: 20px; + height: 20px; + flex-shrink: 0; + display: block; + opacity: 0.75; + margin-left: 4px; + transition: opacity 0.15s ease; +} +.beep-feed .beep-post-badge:hover { + opacity: 1; +} +.beep-feed .beep-post-badge-sm { + width: 16px; + height: 16px; +} + +/* ---------- Delete row (bottom of post/reply, admin only) ---------- */ +.beep-feed .beep-delete-row { + display: flex; + justify-content: flex-end; + margin-top: 6px; +} + +.beep-feed .beep-delete-link { + background: transparent; + border: 0; + color: var(--beep-text-secondary); + font-family: inherit; + font-size: 22px; + line-height: 1; + font-weight: 400; + cursor: pointer; + width: 28px; + height: 28px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + transition: color 0.15s ease, background-color 0.15s ease, transform 0.1s ease; +} + +.beep-feed .beep-delete-link:hover { + color: #F4212E; + background: rgba(244, 33, 46, 0.10); +} + +.beep-feed .beep-delete-link:active { + color: #F4212E; + background: rgba(244, 33, 46, 0.25); + transform: scale(0.92); +} + +/* Override earlier 20/16 badge sizes with bigger 32/24 */ +.beep-feed .beep-post-badge { + width: 32px; + height: 32px; +} +.beep-feed .beep-post-badge-sm { + width: 24px; + height: 24px; +} + +/* ============================================================ + v1.4.1 — theme-busting overrides + Many WordPress themes style ALL + + + + + + + +
+ Your account has been suspended from beeping. +
+ +
+

Join in. Sign in to like and reply.

+ Log in + + Sign up + +
+ + +
+ No beeps yet.
'; + } + ?> + + + '; +} + +/** + * Is this user banned from posting/liking/replying? + */ +function beep_user_is_banned($user_id) { + if (!$user_id) { + return false; + } + return get_user_meta($user_id, 'beep_banned', true) === '1'; +} + +/** + * Render the composer textarea (for logged-in, non-banned users). + */ +function beep_render_composer() { + $user = wp_get_current_user(); + $avatar = get_avatar($user->ID, 48, '', $user->display_name, ['class' => 'beep-avatar']); + + ob_start(); + ?> +
+ +
+ + +
+
+ post_author); + $avatar = get_avatar($author ? $author->ID : 0, 48, '', '', ['class' => 'beep-avatar']); + $name = $author ? esc_html($author->display_name) : 'Unknown'; + $handle = $author ? '@' . esc_html($author->user_login) : ''; + $ts = strtotime($post->post_date_gmt . ' UTC'); + $time = beep_relative_time($ts); + $time_iso = gmdate('c', $ts); + $time_full = mysql2date('F j, Y g:i a', $post->post_date); + + $content = beep_format_content($post->post_content); + $like_count = Beep_Likes::get_count($post->ID, 'post'); + $reply_count = Beep_Replies::reply_count($post->ID); + $user_liked = Beep_Likes::user_has_liked($post->ID, 'post'); + $can_delete = current_user_can('delete_post', $post->ID); + $can_interact = is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + + ob_start(); + ?> +
+ +
+
+ + + + + · + + + +
+
+
+ + + +
+ +
+ +
+ + + + ID, 0); ?> + + +
+ ID); + echo beep_render_replies_tree($all, 0, 0, $post->ID, $can_interact); + ?> +
+
+
+ + + comment_parent !== (int) $parent_id) { + continue; + } + $out .= beep_render_reply($c, $comments, $depth, $post_id, $can_interact); + } + return $out; +} + +/** + * Render a single reply, plus its nested children. + */ +function beep_render_reply($comment, $all_comments = [], $depth = 0, $post_id = 0, $can_interact = false) { + if (!$comment) { + return ''; + } + + $author_id = (int) $comment->user_id; + $avatar = $author_id + ? get_avatar($author_id, 36, '', '', ['class' => 'beep-avatar beep-avatar-sm']) + : get_avatar($comment->comment_author_email, 36, '', '', ['class' => 'beep-avatar beep-avatar-sm']); + + $author = $author_id ? get_userdata($author_id) : null; + $name = $author ? esc_html($author->display_name) : esc_html($comment->comment_author); + $handle = $author ? '@' . esc_html($author->user_login) : ''; + + $ts = strtotime($comment->comment_date_gmt . ' UTC'); + $time = beep_relative_time($ts); + $time_iso = gmdate('c', $ts); + + $content = beep_format_content($comment->comment_content); + $can_delete = current_user_can('moderate_comments'); + $like_count = Beep_Likes::get_count($comment->comment_ID, 'reply'); + $user_liked = Beep_Likes::user_has_liked($comment->comment_ID, 'reply'); + + $depth_class = 'beep-depth-' . min((int) $depth, 2); + + ob_start(); + ?> +
+ +
+
+ + + + + · + + + +
+
+ + +
+ + +
+ comment_ID); ?> + + +
+ +
+ + + comment_ID, $depth + 1, $post_id, $can_interact); + if ($children) { + echo '
' . $children . '
'; + } + ?> +
+
+ #' . esc_html($m[2]) . ''; + }, $text); + // @mentions + $text = preg_replace_callback('/(^|\s)@([a-zA-Z0-9_]+)/', function ($m) { + $user = get_user_by('login', $m[2]); + if ($user) { + return $m[1] . '@' . esc_html($m[2]) . ''; + } + return $m[1] . '@' . esc_html($m[2]) . ''; + }, $text); + // URLs + $text = preg_replace_callback('#(https?://[^\s<]+)#i', function ($m) { + $url = esc_url($m[1]); + $display = parse_url($url, PHP_URL_HOST); + if (!$display) { + $display = $url; + } + return '' . esc_html($display) . ''; + }, $text); + // Line breaks + $text = nl2br($text); + return $text; +} + +function beep_relative_time($timestamp) { + $now = time(); + $diff = $now - $timestamp; + if ($diff < 0) { + $diff = 0; + } + if ($diff < 60) { + return $diff . 's'; + } + if ($diff < 3600) { + return floor($diff / 60) . 'm'; + } + if ($diff < 86400) { + return floor($diff / 3600) . 'h'; + } + if ($diff < 604800) { + return floor($diff / 86400) . 'd'; + } + return gmdate('M j', $timestamp); +} + +function beep_icon($name) { + $icons = [ + 'reply' => '', + 'heart' => '', + 'heart_filled' => '', + 'share' => '', + ]; + return isset($icons[$name]) ? $icons[$name] : ''; +} diff --git a/readme.txt b/readme.txt new file mode 100755 index 0000000..0b36a2d --- /dev/null +++ b/readme.txt @@ -0,0 +1,50 @@ +=== Beep === +Contributors: sami +Tags: microblog, twitter, tweets, social, comments +Requires at least: 6.0 +Tested up to: 6.7 +Requires PHP: 7.4 +Stable tag: 1.4.0 +License: GPLv2 or later + +A Twitter-style microblog for WordPress. Logged-in users post short updates, +like, and reply (with nested threads). Top feed sorts by likes. + +== Description == + +Beep adds a Twitter-style microblog to your WordPress site. Drop the +[beep_feed] shortcode on any page. Likes, threaded replies, and Latest/Top +sort tabs are all built in. + +== Installation == + +1. Upload beep.zip via Plugins -> Add New -> Upload Plugin. Activate. +2. Add [beep_feed] to a page. Visit it. +3. For multi-user signup, enable "Anyone can register" in Settings -> General + and install the free "Passwordless Login" plugin for magic-link sign-in. + +== Shortcode == + +[beep_feed limit="50" header="Messages from" sort="latest"] + +== Changelog == + += 1.4.0 = +* Like replies, not just beeps. +* Nested replies (reply to replies, indented up to two levels). +* Latest / Top sort tabs at the top of the feed. +* Bird badge in the top-right of every beep and reply. +* Polished tabs, focus states, action button styling. + += 1.3.0 = +* Feed header reads "Messages from" + Beep wordmark. +* Avatar/textarea fixes baked in (no Additional CSS needed). + += 1.2.0 = +* Feed header shows Beep wordmark instead of small icon + Home text. + += 1.1.0 = +* New hand-drawn bird logo. + += 1.0.0 = +* Initial release.