From 97ca5e17143e7700e17bf8f5b05a5aee9e9fb688 Mon Sep 17 00:00:00 2001 From: Krystie Date: Mon, 25 May 2026 15:17:20 -0700 Subject: [PATCH 1/2] Add Beep settings system with Twitter Light mode defaults and page-level CSS override - Add class-settings.php with 40+ customizable settings - Update beep.css to use :root level CSS variables - Add page-level CSS override to fix Elementor purple gradient - Update defaults to Twitter Light mode (white background) --- assets/beep.css | 2006 +++++++++++++---------------------- beep.php | 1 + includes/class-settings.php | 841 +++++++++++++++ 3 files changed, 1586 insertions(+), 1262 deletions(-) create mode 100644 includes/class-settings.php diff --git a/assets/beep.css b/assets/beep.css index 108db19..19413b2 100755 --- a/assets/beep.css +++ b/assets/beep.css @@ -1,7 +1,6 @@ /* ============================================================ - Beep — Twitter-style microblog for WordPress - All rules are scoped under .beep-feed so they don't leak - into the host theme. + Beep — Twitter/X Dark Mode + Post and feed styling to match Twitter/X perfectly ============================================================ */ .beep-feed, @@ -9,107 +8,105 @@ box-sizing: border-box; } -.beep-feed { - --beep-bg: #ffffff; - --beep-text: #0F1419; - --beep-text-secondary: #536471; - --beep-border: #EFF3F4; - --beep-hover: #F7F9F9; +:root { + /* Default Twitter Dark Mode Palette */ + --beep-bg: #15202B; + --beep-card-bg: #192734; + --beep-card-hover: #1C2732; + --beep-text: #E7E9EA; + --beep-muted: #71767B; + --beep-border: #2F3336; --beep-accent: #1D9BF0; --beep-accent-hover: #1A8CD8; --beep-like: #F91880; --beep-repost: #00BA7C; - --beep-page-bg: #E6ECF0; +} + +.beep-feed { + /* Twitter Dark Mode Palette */ + + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; max-width: 600px; - margin: 24px auto; + margin: 0 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; + border-left: 1px solid var(--beep-border); + border-right: 1px solid var(--beep-border); color: var(--beep-text); font-size: 15px; line-height: 1.4; -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + min-height: 100vh; } -/* ---------- Header ---------- */ +/* Header */ .beep-feed-header { - padding: 14px 20px; + padding: 16px 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; + justify-content: space-between; position: sticky; top: 0; z-index: 10; + background: rgba(21, 32, 43, 0.85); + backdrop-filter: blur(12px); } -.beep-feed-header-text { +.beep-feed-header-title { font-size: 20px; font-weight: 800; color: var(--beep-text); - white-space: nowrap; + letter-spacing: -0.5px; } -.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; +/* Nav tabs */ +.beep-top-nav { + display: flex; border-bottom: 1px solid var(--beep-border); +} + +.beep-nav-tab { + flex: 1; + background: transparent; + border: 0; + padding: 16px 0; + font-family: inherit; + font-size: 15px; + font-weight: 700; + color: var(--beep-muted); + cursor: pointer; + position: relative; text-align: center; + transition: background-color 0.15s ease, color 0.15s ease; } -.beep-notice p { - margin: 0 0 12px; - font-size: 16px; +.beep-nav-tab:hover { + background: var(--beep-card-hover); + color: var(--beep-text); } -.beep-notice-banned { - color: var(--beep-text-secondary); - font-style: italic; +.beep-nav-tab.is-active { + color: var(--beep-text); } -/* ---------- 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-nav-tab.is-active::after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 4px; + background: var(--beep-accent); + border-radius: 9999px; } -.beep-feed .beep-avatar-sm { - width: 36px !important; - height: 36px !important; - min-width: 36px !important; - max-width: 36px !important; -} - -/* ---------- Compose ---------- */ +/* Compose area */ .beep-compose { display: flex; gap: 12px; - padding: 16px; + padding: 16px 20px; border-bottom: 1px solid var(--beep-border); } @@ -123,102 +120,167 @@ border: 0 !important; outline: 0 !important; resize: none !important; - background: #ffffff !important; + background: transparent !important; font-family: inherit !important; font-size: 18px !important; - line-height: 1.4 !important; + line-height: 1.5 !important; color: var(--beep-text) !important; padding: 8px 0 !important; - min-height: 32px; + min-height: 52px; overflow: hidden; box-shadow: none !important; + caret-color: var(--beep-accent); } .beep-feed .beep-input::placeholder { - color: var(--beep-text-secondary) !important; - opacity: 1 !important; + color: var(--beep-muted) !important; } -.beep-compose-footer, -.beep-reply-footer { +.beep-compose-footer { display: flex; - justify-content: flex-end; + justify-content: space-between; align-items: center; - gap: 12px; + margin-top: 12px; + padding-top: 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-compose-tools { + display: flex; + gap: 4px; } -.beep-counter-warn { color: #FFD400; } -.beep-counter-bad { color: #F4212E; font-weight: 700; } +.beep-compose-tool { + background: transparent; + border: 0; + color: var(--beep-accent); + cursor: pointer; + width: 36px; + height: 36px; + border-radius: 9999px; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.15s ease; +} -/* ---------- Buttons ---------- */ +.beep-compose-tool:hover { + background: rgba(29, 155, 240, 0.15); +} + +/* Buttons */ .beep-button { - display: inline-block; + display: inline-flex; + align-items: center; + justify-content: center; background: var(--beep-accent); color: #fff; border: 0; border-radius: 9999px; - padding: 8px 18px; + padding: 8px 20px; font-weight: 700; font-size: 15px; cursor: pointer; - text-decoration: none; font-family: inherit; - transition: background-color 0.15s ease, opacity 0.15s ease; + transition: background-color 0.15s ease, transform 0.1s ease; } -.beep-button:hover { background: var(--beep-accent-hover); color: #fff; } +.beep-button:hover { background: var(--beep-accent-hover); color: #fff; } +.beep-button:active { transform: scale(0.96); } .beep-button:disabled { opacity: 0.5; cursor: default; } -.beep-button:disabled:hover { background: var(--beep-accent); } -.beep-button-secondary { +/* Follow button */ +.beep-follow-btn { + background: var(--beep-text); + color: var(--beep-bg); + border: 0; + border-radius: 9999px; + padding: 6px 16px; + font-weight: 700; + font-size: 14px; + cursor: pointer; + font-family: inherit; + transition: opacity 0.15s ease; + white-space: nowrap; +} + +.beep-follow-btn:hover { opacity: 0.85; } + +.beep-following-btn { 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); + color: var(--beep-text); + border: 1px solid var(--beep-border); + border-radius: 9999px; + padding: 6px 16px; + font-weight: 700; + font-size: 14px; + cursor: pointer; + font-family: inherit; + transition: border-color 0.15s ease, color 0.15s ease, background-color 0.15s ease; } -/* ---------- Post ---------- */ -.beep-list { - background: var(--beep-bg); +.beep-following-btn:hover { + border-color: #F4212E; + color: #F4212E; + background: rgba(244, 33, 46, 0.1); } +/* Char counter */ +.beep-char-counter { font-size: 13px; color: var(--beep-muted); font-variant-numeric: tabular-nums; } +.beep-counter-warn { color: #FFD400; } +.beep-counter-bad { color: #F4212E; font-weight: 700; } + +/* 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: var(--beep-border); + object-fit: cover !important; + aspect-ratio: 1 / 1 !important; + display: block !important; + border: 0 !important; + transition: filter 0.15s ease; +} + +.beep-feed .beep-avatar:hover { filter: brightness(0.9); } + +.beep-feed .beep-avatar-sm { + width: 40px !important; + height: 40px !important; + min-width: 40px !important; + max-width: 40px !important; +} + +/* Post list */ +.beep-list { background: var(--beep-bg); } + .beep-empty { - padding: 40px 20px; + padding: 60px 20px; text-align: center; - color: var(--beep-text-secondary); + color: var(--beep-muted); } +/* Individual post */ .beep-post { display: flex; gap: 12px; - padding: 12px 16px; + padding: 14px 20px; border-bottom: 1px solid var(--beep-border); + background: var(--beep-bg); transition: background-color 0.15s ease; + cursor: pointer; } -.beep-post:hover { background: var(--beep-hover); } +.beep-post:hover { background: var(--beep-card-hover); } .beep-post:last-child { border-bottom: 0; } -.beep-post-body { - flex: 1; - min-width: 0; -} +.beep-post-body { flex: 1; min-width: 0; } -/* ---------- Meta line ---------- */ +/* Meta line */ .beep-meta { display: flex; align-items: center; @@ -232,84 +294,64 @@ .beep-name { font-weight: 700; color: var(--beep-text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } +.beep-name:hover { text-decoration: underline; cursor: pointer; } + .beep-handle, .beep-dot, -.beep-time { - color: var(--beep-text-secondary); - font-weight: 400; -} +.beep-time { color: var(--beep-muted); font-weight: 400; white-space: nowrap; } .beep-time { text-decoration: none; } +.beep-time:hover { text-decoration: underline; cursor: pointer; } .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; +/* Verified badge */ +.beep-verified { + width: 18px; + height: 18px; + fill: var(--beep-accent); + flex-shrink: 0; + margin-left: 2px; + vertical-align: text-bottom; } -.beep-menu-trigger:hover { - background: rgba(244, 33, 46, 0.1); - color: #F4212E; -} - -/* ---------- Text ---------- */ +/* Post text */ .beep-text { font-size: 15px; - line-height: 1.4; + line-height: 1.5; color: var(--beep-text); word-wrap: break-word; overflow-wrap: anywhere; - margin: 2px 0 12px; + margin: 0; + white-space: pre-wrap; } -.beep-tag, -.beep-mention, -.beep-link { - color: var(--beep-accent); - text-decoration: none; -} +.beep-tag, .beep-mention { color: var(--beep-text); text-decoration: none; cursor: pointer; } +.beep-tag:hover, .beep-mention:hover { text-decoration: underline; } -.beep-tag:hover, -.beep-mention:hover, -.beep-link:hover { - text-decoration: underline; -} +.beep-link { color: var(--beep-accent); text-decoration: none; } +.beep-link:hover { text-decoration: underline; } -.beep-mention-stale { - color: var(--beep-accent); - opacity: 0.85; -} - -/* ---------- Action row ---------- */ +/* Action bar */ .beep-actions { display: flex; justify-content: space-between; max-width: 425px; - margin-top: 4px; + margin-top: 12px; } .beep-action { display: flex; align-items: center; - gap: 6px; + gap: 4px; background: transparent; border: 0; - color: var(--beep-text-secondary); + color: var(--beep-muted); font-size: 13px; font-family: inherit; cursor: pointer; @@ -319,144 +361,522 @@ transition: color 0.15s ease, background-color 0.15s ease; } -.beep-action svg { +.beep-action svg, +.beep-action .beep-icon-svg { width: 18px; height: 18px; fill: currentColor; display: block; + flex-shrink: 0; } -.beep-action .beep-count { +.beep-count { font-variant-numeric: tabular-nums; + min-width: 20px; } -.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); } +/* Reply - blue */ +.beep-action-reply:hover { + color: var(--beep-accent); + background: rgba(29, 155, 240, 0.1); +} -/* Like state */ -.beep-action-like .beep-icon-filled { display: none; } -.beep-action-like .beep-icon-outline { display: inline-flex; } +/* Retweet - green */ +.beep-action-retweet:hover { + color: var(--beep-repost); + background: rgba(0, 186, 124, 0.1); +} -.beep-action-like.is-liked { +.beep-action.is-reposted { color: var(--beep-repost); } + +/* Like - pink */ +.beep-action-like:hover { color: var(--beep-like); + background: rgba(249, 24, 128, 0.1); } -.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.is-liked { color: var(--beep-like); } + +/* Bookmark - blue */ +.beep-action-bookmark:hover { + color: var(--beep-accent); + background: rgba(29, 155, 240, 0.1); +} + +.beep-action.is-bookmarked { color: var(--beep-accent); } + +/* Share - blue */ +.beep-action-share:hover { + color: var(--beep-accent); + background: rgba(29, 155, 240, 0.1); +} + +/* Heart pop animation */ .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); } + 0% { transform: scale(0.85); } + 40% { transform: scale(1.35); } + 70% { transform: scale(0.9); } 100% { transform: scale(1); } } -/* ---------- Reply form ---------- */ -.beep-reply-form { - margin-top: 8px; - padding: 10px 0 4px; - border-top: 1px solid var(--beep-border); +/* Retweet spin animation */ +.beep-action-retweet.beep-just-retweeted svg { + animation: beep-retweet-spin 0.4s ease; } -.beep-reply-form .beep-input { - font-size: 16px; +@keyframes beep-retweet-spin { + 0% { transform: rotate(0deg) scale(1); } + 50% { transform: rotate(180deg) scale(1.2); } + 100% { transform: rotate(360deg) scale(1); } } -.beep-reply-form[hidden] { display: none; } +/* Media */ +.beep-media-attachments { + margin-top: 12px; + border-radius: 16px; + overflow: hidden; + border: 1px solid var(--beep-border); +} -.beep-pending { - padding: 12px; - background: var(--beep-hover); - color: var(--beep-text-secondary); - border-radius: 8px; +.beep-media-attachments img { + width: 100%; + height: auto; + display: block; + max-height: 400px; + object-fit: cover; +} + +/* Image grid */ +.beep-media-grid { + display: grid; + gap: 2px; + border-radius: 16px; + overflow: hidden; + border: 1px solid var(--beep-border); +} + +.beep-media-grid-2 { grid-template-columns: 1fr 1fr; } +.beep-media-grid-3 .beep-media-grid-item:first-child { grid-column: span 2; } +.beep-media-grid-4 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; } + +.beep-media-grid-item { + overflow: hidden; + aspect-ratio: 16 / 9; +} + +.beep-media-grid-item img { + width: 100%; + height: 100%; + object-fit: cover; + max-height: none; +} + +/* Polls */ +.beep-poll-container { + margin-top: 12px; + border: 1px solid var(--beep-border); + border-radius: 16px; + padding: 16px; + background: transparent; +} + +.beep-poll-question { + font-size: 15px; + font-weight: 700; + color: var(--beep-text); + margin-bottom: 12px; +} + +.beep-poll-options { + display: flex; + flex-direction: column; + gap: 8px; +} + +.beep-poll-option { + border: 1px solid var(--beep-border); + border-radius: 9999px; + padding: 10px 16px; + cursor: pointer; font-size: 14px; - text-align: center; + font-weight: 700; + color: var(--beep-text); + background: transparent; + transition: background-color 0.15s ease, border-color 0.15s ease; + position: relative; + overflow: hidden; } -/* ---------- Replies ---------- */ +.beep-poll-option:hover { + background: var(--beep-card-hover); + border-color: var(--beep-muted); +} + +.beep-poll-option.is-voted { border-color: var(--beep-accent); } + +.beep-poll-result { + border: 1px solid var(--beep-border); + border-radius: 9999px; + padding: 10px 16px; + font-size: 14px; + font-weight: 700; + color: var(--beep-text); + position: relative; + overflow: hidden; +} + +.beep-poll-result-bar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + background: var(--beep-accent); + opacity: 0.3; + max-width: 100%; +} + +.beep-poll-result.is-voted { border-color: var(--beep-accent); } +.beep-poll-result-text { position: relative; z-index: 1; } +.beep-poll-end { font-size: 13px; color: var(--beep-muted); margin-top: 8px; font-weight: 400; } + +/* Quotes */ +.beep-quoted-container { + margin-top: 12px; + border: 1px solid var(--beep-border); + border-radius: 16px; + padding: 12px 16px; + background: transparent; +} + +.beep-quoted-post { text-decoration: none; color: inherit; } +.beep-quoted-post:hover { text-decoration: none; } + +.beep-quoted-meta { font-size: 13px; color: var(--beep-muted); margin-bottom: 4px; } +.beep-quoted-meta .beep-name { font-weight: 700; } + +.beep-quoted-text { + font-size: 14px; + color: var(--beep-text); + line-height: 1.4; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +/* Voice note */ +.beep-voice-note { + margin-top: 12px; + display: flex; + align-items: center; + gap: 12px; + background: var(--beep-card-hover); + border-radius: 9999px; + padding: 10px 16px; + max-width: 400px; +} + +.beep-voice-play { + background: var(--beep-accent); + border: 0; + border-radius: 50%; + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + flex-shrink: 0; + padding: 0; +} + +.beep-voice-play svg { width: 14px; height: 14px; fill: #fff; } + +.beep-voice-waveform { + flex: 1; + height: 24px; + display: flex; + align-items: center; + gap: 2px; +} + +.beep-voice-bar { + width: 3px; + height: 100%; + background: var(--beep-accent); + border-radius: 9999px; + opacity: 0.6; +} + +.beep-voice-duration { font-size: 13px; color: var(--beep-muted); font-variant-numeric: tabular-nums; } + +/* Replies */ .beep-replies { margin-top: 8px; - padding-left: 24px; + padding-left: 0; border-left: 2px solid var(--beep-border); + margin-left: 24px; } .beep-reply { display: flex; gap: 10px; - padding: 10px 0; + padding: 10px 16px; border-bottom: 1px solid var(--beep-border); + background: var(--beep-bg); + transition: background-color 0.15s ease; } .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; } +.beep-reply .beep-meta { font-size: 13px; margin-bottom: 0; } +.beep-reply .beep-avatar { width: 36px !important; height: 36px !important; min-width: 36px !important; max-width: 36px !important; } -.beep-reply-body { - flex: 1; - min-width: 0; +/* Reply form */ +.beep-reply-form { + margin-top: 8px; + padding: 12px 16px; + border-top: 1px solid var(--beep-border); + border-bottom: 1px solid var(--beep-border); + display: flex; + gap: 10px; + align-items: flex-start; + background: var(--beep-bg); } -.beep-reply .beep-text { - font-size: 14px; - margin-bottom: 0; +.beep-reply-form[hidden] { display: none; } +.beep-reply-form-body { flex: 1; min-width: 0; } + +.beep-feed .beep-reply-input { + width: 100% !important; + border: 0 !important; + outline: 0 !important; + resize: none !important; + background: transparent !important; + font-family: inherit !important; + font-size: 15px !important; + color: var(--beep-text) !important; + padding: 6px 0 !important; + min-height: 36px; + box-shadow: none !important; + caret-color: var(--beep-accent); } -/* ---------- New-post entry animation ---------- */ -.beep-new { - animation: beep-slide-in 0.4s ease; +.beep-feed .beep-reply-input::placeholder { color: var(--beep-muted) !important; } + +.beep-reply-footer { + display: flex; + justify-content: flex-end; + align-items: center; + margin-top: 8px; } +/* Animations */ +.beep-new { animation: beep-slide-in 0.3s ease; } + @keyframes beep-slide-in { - from { opacity: 0; transform: translateY(-6px); } + from { opacity: 0; transform: translateY(-8px); } 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; } +/* Post badge */ +.beep-post-badge { + width: 18px; + height: 18px; + flex-shrink: 0; + opacity: 0.5; + margin-left: 2px; } -/* ---------- Tip popover (for "Copied" etc) ---------- */ +.beep-post-badge:hover { opacity: 0.8; cursor: pointer; } + +/* Loading */ +.beep-loading { opacity: 0.5; pointer-events: none; } + +/* Mobile */ +@media (max-width: 640px) { + .beep-feed { margin: 0; border-left: 0; border-right: 0; } + .beep-post { padding: 12px 16px; } + .beep-actions { max-width: none; } + .beep-compose { padding: 12px 16px; } + .beep-feed-header { padding: 12px 16px; } +} + +/* Delete */ +.beep-delete-row { display: flex; justify-content: flex-end; margin-top: 6px; } + +.beep-delete-link { + background: transparent; + border: 0; + color: var(--beep-muted); + font-family: inherit; + font-size: 13px; + cursor: pointer; + padding: 4px 8px; + border-radius: 4px; + transition: color 0.15s ease, background-color 0.15s ease; +} + +.beep-delete-link:hover { color: #F4212E; background: rgba(244, 33, 46, 0.1); } + +/* Notice */ +.beep-notice { padding: 14px 20px; border-bottom: 1px solid var(--beep-border); font-size: 14px; } +.beep-notice p { margin: 0; color: var(--beep-muted); } +.beep-notice-banned { color: #F4212E; font-style: italic; } + +/* Header post button */ +.beep-post-btn-header { + background: var(--beep-accent); + color: #fff; + border: 0; + border-radius: 9999px; + padding: 8px 20px; + font-weight: 700; + font-size: 15px; + cursor: pointer; + font-family: inherit; + transition: background-color 0.15s ease, transform 0.1s ease; +} + +.beep-post-btn-header:hover { background: var(--beep-accent-hover); } +.beep-post-btn-header:active { transform: scale(0.96); } + +/* Back link */ +.beep-back-link { + display: flex; + align-items: center; + gap: 8px; + padding: 12px 20px; + border-bottom: 1px solid var(--beep-border); + background: var(--beep-bg); + color: var(--beep-text); + text-decoration: none; + font-weight: 700; + font-size: 19px; + transition: background-color 0.15s ease; +} + +.beep-back-link:hover { background: var(--beep-card-hover); color: var(--beep-text); text-decoration: none; } +.beep-back-link svg { width: 20px; height: 20px; fill: currentColor; } + +/* Thread modal */ +.beep-thread-modal { + position: fixed; + inset: 0; + z-index: 1000; + display: flex; + align-items: flex-start; + justify-content: center; + background: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(4px); +} + +.beep-thread-modal[hidden] { display: none; } + +.beep-thread-content { + background: var(--beep-card-bg); + width: 100%; + max-width: 600px; + max-height: 90vh; + overflow-y: auto; + border-left: 1px solid var(--beep-border); + border-right: 1px solid var(--beep-border); +} + +.beep-thread-header { + display: flex; + align-items: center; + gap: 16px; + padding: 12px 20px; + border-bottom: 1px solid var(--beep-border); + position: sticky; + top: 0; + background: var(--beep-card-bg); + z-index: 1; +} + +.beep-thread-close { + background: transparent; + border: 0; + color: var(--beep-text); + cursor: pointer; + width: 36px; + height: 36px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + transition: background-color 0.15s ease; +} + +.beep-thread-close:hover { background: var(--beep-card-hover); } +.beep-thread-close svg { width: 20px; height: 20px; fill: currentColor; } +.beep-thread-title { font-size: 18px; font-weight: 700; color: var(--beep-text); } + +/* Tooltip */ .beep-tip { position: absolute; margin-left: 8px; - padding: 2px 8px; + padding: 4px 10px; background: var(--beep-text); - color: #fff; + color: var(--beep-bg); border-radius: 4px; font-size: 12px; white-space: nowrap; + pointer-events: none; + z-index: 100; animation: beep-tip-fade 1.5s ease forwards; } @keyframes beep-tip-fade { - 0% { opacity: 0; } - 20% { opacity: 1; } + 0% { opacity: 0; transform: translateY(-4px); } + 20% { opacity: 1; transform: translateY(0); } 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); +/* GIF */ +.beep-gif-embed { + margin-top: 12px; + border-radius: 12px; + overflow: hidden; + border: 1px solid var(--beep-border); } -.beep-feed .beep-tab { +.beep-gif-embed img { + width: 100%; + height: auto; + max-height: 400px; + object-fit: cover; + display: block; + margin: 0; + border-radius: 12px; +} + +/* Profile header */ +.beep-profile-header { padding: 16px 20px; border-bottom: 1px solid var(--beep-border); } +.beep-profile-name { font-size: 20px; font-weight: 800; color: var(--beep-text); margin-bottom: 2px; } +.beep-profile-meta { font-size: 14px; color: var(--beep-muted); } +.beep-profile-stats { display: flex; gap: 20px; margin-top: 12px; } +.beep-profile-stat { color: var(--beep-muted); font-size: 14px; cursor: pointer; } +.beep-profile-stat:hover { text-decoration: underline; } +.beep-profile-stat strong { color: var(--beep-text); font-weight: 700; } + +/* Tabs */ +.beep-tabs { + display: flex; + border-bottom: 1px solid var(--beep-border); + background: var(--beep-card-bg); +} + +.beep-tab { flex: 1; background: transparent; border: 0; @@ -464,22 +884,15 @@ font-family: inherit; font-size: 15px; font-weight: 700; - color: var(--beep-text-secondary); + color: var(--beep-muted); 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 { +.beep-tab:hover { background: var(--beep-card-hover); color: var(--beep-text); } +.beep-tab.is-active { color: var(--beep-text); } +.beep-tab.is-active::after { content: ''; position: absolute; left: 50%; @@ -491,1077 +904,146 @@ 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 ---------- */ +/* Focus */ .beep-feed .beep-input:focus, -.beep-feed .beep-input:focus-visible { +.beep-feed .beep-input:focus-visible, +.beep-feed .beep-reply-input:focus, +.beep-feed .beep-reply-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; +.beep-feed .beep-compose:focus-within { background: rgba(29, 155, 240, 0.03); } + +/* Hidden */ +[hidden] { display: none !important; } + + +/* Magic Login Form */ +.beep-magic-login { + padding: 24px; + display: flex; + justify-content: center; } -/* ---------- 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; +.beep-magic-login-card { + background: #192734; + border-radius: 16px; + padding: 32px; + width: 100%; + max-width: 400px; + text-align: center; } -/* ---------- Tighter post hover ---------- */ -.beep-feed .beep-post { - transition: background-color 0.15s ease; +.beep-magic-login-header { + margin-bottom: 24px; } -/* ---------- Refine action icons size ---------- */ -.beep-feed .beep-action { - padding: 4px 6px; - font-size: 13px; -} -.beep-feed .beep-action svg { - width: 17px; - height: 17px; +.beep-magic-login-header svg { + margin-bottom: 16px; } -/* ---------- Reply rows: tighten spacing ---------- */ -.beep-feed .beep-reply { - padding: 10px 0 8px; +.beep-magic-login-header h3 { + color: #E7E9EA; + font-size: 20px; + font-weight: 700; + margin: 0 0 8px 0; } -/* Make sure reply meta + actions feel cohesive */ -.beep-feed .beep-reply .beep-text { - margin-bottom: 4px; +.beep-magic-login-header p { + color: #71767B; + font-size: 14px; + margin: 0; } -/* ---------- 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 + + +

+ + +
+ +
+ +
+ + + + + + + + + */ + public static function inject_css_variables() { + $settings = self::get_settings(); + ?> + + Background colors for the feed and cards.

'; + } + + public static function section_colors_text_description() { + echo '

Text colors throughout the feed.

'; + } + + public static function section_colors_interactive_description() { + echo '

Colors for interactive elements like buttons and icons.

'; + } + + public static function section_layout_description() { + echo '

Spacing and layout dimensions.

'; + } + + public static function section_radius_description() { + echo '

Border radius for rounded corners. Use 0px for sharp edges (Twitter style), 16px for rounded cards.

'; + } + + public static function section_typography_description() { + echo '

Font settings.

'; + } + + public static function section_branding_description() { + echo '

Logo and site name settings.

'; + } + + public static function section_features_description() { + echo '

Toggle features on or off.

'; + } + + public static function section_behavior_description() { + echo '

How the feed behaves.

'; + } + + public static function section_content_description() { + echo '

What to show/hide in the feed.

'; + } + + // === Field Renderers === + public static function field_color_picker($args) { + $key = $args['key']; + $label = $args['label']; + $value = self::get($key); + ?> + + +

+ + +

+ + + Date: Fri, 29 May 2026 21:45:41 -0700 Subject: [PATCH 2/2] Beep v1.5.1: Elementor widget, logo/icon settings with live preview, CSS isolation, JS fixes --- assets/beep-logo.png | Bin 30838 -> 3013 bytes assets/beep-wordmark.png | Bin 54740 -> 3523 bytes assets/beep.css | 363 ++++++++++++++-------------- assets/beep.js | 16 +- beep.php | 4 +- includes/class-beep.php | 8 +- includes/class-elementor-widget.php | 127 ++++++++++ includes/class-settings.php | 303 ++++++++++++++++++++++- includes/class-shortcode.php | 6 +- includes/helpers.php | 7 +- 10 files changed, 623 insertions(+), 211 deletions(-) create mode 100644 includes/class-elementor-widget.php diff --git a/assets/beep-logo.png b/assets/beep-logo.png index 882063d1a770186915bc9ff9af659289bd9f944f..2418e8d9bbe34902b418ec741b5bcd83a000286c 100755 GIT binary patch literal 3013 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 diff --git a/assets/beep-wordmark.png b/assets/beep-wordmark.png index 5bee10e94b24ca6ad043574b2539a9a5ac6e34d6..5459809a07f0fd1d395010141a0b10919336851a 100644 GIT binary patch literal 3523 zcmeHIX;9Nw5Puw!0)kGl6Hx&jDdZO zIL^vqodp2E3LhL00f3QqnOB>^mXaV7J}fpK4UPx{Akzte+|vNOhfTR}07!KQKoJ9g z_iq3oPhD;L+82H>`ymt;085zWcQ?~uVSXz35E%~X@-LGMr z#>pBuyCXhe*Z%Y&r8vHze1%=7W`v1GR|+N-it4T5jqyzidP6-jqbrmfxTcDTv|?}~ ze?slPbR;0CAY|M16KgG8Z$`wF$CbVQ;^KC6fvZ>bm8Q58CnvnCn(NSYum{5$ngRuk`XqNrFn&L2)R{Lx-dwJ4h z3pvbO8C|c=FBdUh@>NAyG>ok{o^pX&0jbJw45X<-%&aE~+L|yff!MrwE)}o#bPch3ofBMJ%y|@r=kppW6+twsYN&Zp%OC)v9WFS&&3i*DJ`z z$`{;mX|z(UJyU;N_Dk$o2VFuR=kHIP9-z&iLKBmdMA6nh0~4OJJa(cgF{niM965Ak zdFreEaqMC7F&&p@3Ip%aH?!Os{$(ccVQy>(-z`?d(;w{3^+&*qz}VCqR@Q9nGXkIt zpwxaL{!729JTPP|oNC^P3ZTxVn8jxhE1Pjb_1+$yR@njnlz zLe?e#$h+Vevr~^{tejVBVhsSJv>sZLq0j&8H(#5Ow&~w&Amv&ij*ge@_&(R&& z_JTEYJ68WjYpW}CHnG`fQ;LHGU8NIrdqVQJw4B7Ff9c}VsEKj+$19aMk_aulFD;rz zVvD;A-RA$MpMhS>yHr>#-pQUlSflJUUszH^!OIDYnPrVpd>`CU9s{7;Dv#y3QcG457#n5}4j4I>KIx$@%6fQe2^VPu z+#9@!tA77}k}j=&5Z`GzvGgwX?alseGa^4*o-{X$AYo}|hEUUrF#c1>(!ncz3$rEl zS^l+he#fF)Wv0Fpzf>==YxQcF7c$3*G}jnp@^SJl?2s5oSzrxi=ZM$XrfI$J(nw%`N91FFA@$^QqT=?6{# literal 54740 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%0AI06R%15#2=ipXj+hxG@q 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 unh?h1-xB&y(?4kZn<@WrW2)wsSuK diff --git a/assets/beep.css b/assets/beep.css index 19413b2..c31ff70 100755 --- a/assets/beep.css +++ b/assets/beep.css @@ -3,8 +3,8 @@ Post and feed styling to match Twitter/X perfectly ============================================================ */ -.beep-feed, -.beep-feed * { +.beep-embed .beep-feed, +.beep-embed .beep-feed * { box-sizing: border-box; } @@ -23,7 +23,7 @@ } -.beep-feed { +.beep-embed .beep-feed { /* Twitter Dark Mode Palette */ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; @@ -37,11 +37,11 @@ line-height: 1.4; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - min-height: 100vh; + min-height: 0; } /* Header */ -.beep-feed-header { +.beep-embed .beep-feed-header { padding: 16px 20px; border-bottom: 1px solid var(--beep-border); display: flex; @@ -54,7 +54,7 @@ backdrop-filter: blur(12px); } -.beep-feed-header-title { +.beep-embed .beep-feed-header-title { font-size: 20px; font-weight: 800; color: var(--beep-text); @@ -62,12 +62,12 @@ } /* Nav tabs */ -.beep-top-nav { +.beep-embed .beep-top-nav { display: flex; border-bottom: 1px solid var(--beep-border); } -.beep-nav-tab { +.beep-embed .beep-nav-tab { flex: 1; background: transparent; border: 0; @@ -82,16 +82,16 @@ transition: background-color 0.15s ease, color 0.15s ease; } -.beep-nav-tab:hover { +.beep-embed .beep-nav-tab:hover { background: var(--beep-card-hover); color: var(--beep-text); } -.beep-nav-tab.is-active { +.beep-embed .beep-nav-tab.is-active { color: var(--beep-text); } -.beep-nav-tab.is-active::after { +.beep-embed .beep-nav-tab.is-active::after { content: ''; position: absolute; left: 0; @@ -103,19 +103,19 @@ } /* Compose area */ -.beep-compose { +.beep-embed .beep-compose { display: flex; gap: 12px; padding: 16px 20px; border-bottom: 1px solid var(--beep-border); } -.beep-compose-body { +.beep-embed .beep-compose-body { flex: 1; min-width: 0; } -.beep-feed .beep-input { +.beep-embed .beep-feed .beep-input { width: 100% !important; border: 0 !important; outline: 0 !important; @@ -132,11 +132,11 @@ caret-color: var(--beep-accent); } -.beep-feed .beep-input::placeholder { +.beep-embed .beep-feed .beep-input::placeholder { color: var(--beep-muted) !important; } -.beep-compose-footer { +.beep-embed .beep-compose-footer { display: flex; justify-content: space-between; align-items: center; @@ -145,12 +145,12 @@ border-top: 1px solid var(--beep-border); } -.beep-compose-tools { +.beep-embed .beep-compose-tools { display: flex; gap: 4px; } -.beep-compose-tool { +.beep-embed .beep-compose-tool { background: transparent; border: 0; color: var(--beep-accent); @@ -164,12 +164,12 @@ transition: background-color 0.15s ease; } -.beep-compose-tool:hover { +.beep-embed .beep-compose-tool:hover { background: rgba(29, 155, 240, 0.15); } /* Buttons */ -.beep-button { +.beep-embed .beep-button { display: inline-flex; align-items: center; justify-content: center; @@ -185,12 +185,12 @@ transition: background-color 0.15s ease, transform 0.1s ease; } -.beep-button:hover { background: var(--beep-accent-hover); color: #fff; } -.beep-button:active { transform: scale(0.96); } -.beep-button:disabled { opacity: 0.5; cursor: default; } +.beep-embed .beep-button:hover { background: var(--beep-accent-hover); color: #fff; } +.beep-embed .beep-button:active { transform: scale(0.96); } +.beep-embed .beep-button:disabled { opacity: 0.5; cursor: default; } /* Follow button */ -.beep-follow-btn { +.beep-embed .beep-follow-btn { background: var(--beep-text); color: var(--beep-bg); border: 0; @@ -204,9 +204,9 @@ white-space: nowrap; } -.beep-follow-btn:hover { opacity: 0.85; } +.beep-embed .beep-follow-btn:hover { opacity: 0.85; } -.beep-following-btn { +.beep-embed .beep-following-btn { background: transparent; color: var(--beep-text); border: 1px solid var(--beep-border); @@ -219,19 +219,19 @@ transition: border-color 0.15s ease, color 0.15s ease, background-color 0.15s ease; } -.beep-following-btn:hover { +.beep-embed .beep-following-btn:hover { border-color: #F4212E; color: #F4212E; background: rgba(244, 33, 46, 0.1); } /* Char counter */ -.beep-char-counter { font-size: 13px; color: var(--beep-muted); font-variant-numeric: tabular-nums; } -.beep-counter-warn { color: #FFD400; } -.beep-counter-bad { color: #F4212E; font-weight: 700; } +.beep-embed .beep-char-counter { font-size: 13px; color: var(--beep-muted); font-variant-numeric: tabular-nums; } +.beep-embed .beep-counter-warn { color: #FFD400; } +.beep-embed .beep-counter-bad { color: #F4212E; font-weight: 700; } /* Avatars */ -.beep-feed .beep-avatar { +.beep-embed .beep-feed .beep-avatar { width: 48px !important; height: 48px !important; min-width: 48px !important; @@ -246,9 +246,9 @@ transition: filter 0.15s ease; } -.beep-feed .beep-avatar:hover { filter: brightness(0.9); } +.beep-embed .beep-feed .beep-avatar:hover { filter: brightness(0.9); } -.beep-feed .beep-avatar-sm { +.beep-embed .beep-feed .beep-avatar-sm { width: 40px !important; height: 40px !important; min-width: 40px !important; @@ -256,16 +256,16 @@ } /* Post list */ -.beep-list { background: var(--beep-bg); } +.beep-embed .beep-list { background: var(--beep-bg); } -.beep-empty { +.beep-embed .beep-empty { padding: 60px 20px; text-align: center; color: var(--beep-muted); } /* Individual post */ -.beep-post { +.beep-embed .beep-post { display: flex; gap: 12px; padding: 14px 20px; @@ -275,13 +275,13 @@ cursor: pointer; } -.beep-post:hover { background: var(--beep-card-hover); } -.beep-post:last-child { border-bottom: 0; } +.beep-embed .beep-post:hover { background: var(--beep-card-hover); } +.beep-embed .beep-post:last-child { border-bottom: 0; } -.beep-post-body { flex: 1; min-width: 0; } +.beep-embed .beep-post-body { flex: 1; min-width: 0; } /* Meta line */ -.beep-meta { +.beep-embed .beep-meta { display: flex; align-items: center; gap: 4px; @@ -291,7 +291,7 @@ flex-wrap: wrap; } -.beep-name { +.beep-embed .beep-name { font-weight: 700; color: var(--beep-text); white-space: nowrap; @@ -299,19 +299,19 @@ text-overflow: ellipsis; } -.beep-name:hover { text-decoration: underline; cursor: pointer; } +.beep-embed .beep-name:hover { text-decoration: underline; cursor: pointer; } -.beep-handle, -.beep-dot, -.beep-time { color: var(--beep-muted); font-weight: 400; white-space: nowrap; } +.beep-embed .beep-handle, +.beep-embed .beep-dot, +.beep-embed .beep-time { color: var(--beep-muted); font-weight: 400; white-space: nowrap; } -.beep-time { text-decoration: none; } -.beep-time:hover { text-decoration: underline; cursor: pointer; } +.beep-embed .beep-time { text-decoration: none; } +.beep-embed .beep-time:hover { text-decoration: underline; cursor: pointer; } -.beep-spacer { flex: 1; } +.beep-embed .beep-spacer { flex: 1; } /* Verified badge */ -.beep-verified { +.beep-embed .beep-verified { width: 18px; height: 18px; fill: var(--beep-accent); @@ -321,7 +321,7 @@ } /* Post text */ -.beep-text { +.beep-embed .beep-text { font-size: 15px; line-height: 1.5; color: var(--beep-text); @@ -331,21 +331,21 @@ white-space: pre-wrap; } -.beep-tag, .beep-mention { color: var(--beep-text); text-decoration: none; cursor: pointer; } -.beep-tag:hover, .beep-mention:hover { text-decoration: underline; } +.beep-embed .beep-tag, .beep-embed .beep-mention { color: var(--beep-text); text-decoration: none; cursor: pointer; } +.beep-embed .beep-tag:hover, .beep-embed .beep-mention:hover { text-decoration: underline; } -.beep-link { color: var(--beep-accent); text-decoration: none; } -.beep-link:hover { text-decoration: underline; } +.beep-embed .beep-link { color: var(--beep-accent); text-decoration: none; } +.beep-embed .beep-link:hover { text-decoration: underline; } /* Action bar */ -.beep-actions { +.beep-embed .beep-actions { display: flex; justify-content: space-between; max-width: 425px; margin-top: 12px; } -.beep-action { +.beep-embed .beep-action { display: flex; align-items: center; gap: 4px; @@ -361,8 +361,8 @@ transition: color 0.15s ease, background-color 0.15s ease; } -.beep-action svg, -.beep-action .beep-icon-svg { +.beep-embed .beep-action svg, +.beep-embed .beep-action .beep-icon-svg { width: 18px; height: 18px; fill: currentColor; @@ -370,49 +370,49 @@ flex-shrink: 0; } -.beep-count { +.beep-embed .beep-count { font-variant-numeric: tabular-nums; min-width: 20px; } /* Reply - blue */ -.beep-action-reply:hover { +.beep-embed .beep-action-reply:hover { color: var(--beep-accent); background: rgba(29, 155, 240, 0.1); } /* Retweet - green */ -.beep-action-retweet:hover { +.beep-embed .beep-action-retweet:hover { color: var(--beep-repost); background: rgba(0, 186, 124, 0.1); } -.beep-action.is-reposted { color: var(--beep-repost); } +.beep-embed .beep-action.is-reposted { color: var(--beep-repost); } /* Like - pink */ -.beep-action-like:hover { +.beep-embed .beep-action-like:hover { color: var(--beep-like); background: rgba(249, 24, 128, 0.1); } -.beep-action.is-liked { color: var(--beep-like); } +.beep-embed .beep-action.is-liked { color: var(--beep-like); } /* Bookmark - blue */ -.beep-action-bookmark:hover { +.beep-embed .beep-action-bookmark:hover { color: var(--beep-accent); background: rgba(29, 155, 240, 0.1); } -.beep-action.is-bookmarked { color: var(--beep-accent); } +.beep-embed .beep-action.is-bookmarked { color: var(--beep-accent); } /* Share - blue */ -.beep-action-share:hover { +.beep-embed .beep-action-share:hover { color: var(--beep-accent); background: rgba(29, 155, 240, 0.1); } /* Heart pop animation */ -.beep-action-like.beep-just-liked .beep-icon-filled { +.beep-embed .beep-action-like.beep-just-liked .beep-icon-filled { animation: beep-heart-pop 0.55s ease; } @@ -424,7 +424,7 @@ } /* Retweet spin animation */ -.beep-action-retweet.beep-just-retweeted svg { +.beep-embed .beep-action-retweet.beep-just-retweeted svg { animation: beep-retweet-spin 0.4s ease; } @@ -435,14 +435,14 @@ } /* Media */ -.beep-media-attachments { +.beep-embed .beep-media-attachments { margin-top: 12px; border-radius: 16px; overflow: hidden; border: 1px solid var(--beep-border); } -.beep-media-attachments img { +.beep-embed .beep-media-attachments img { width: 100%; height: auto; display: block; @@ -451,7 +451,7 @@ } /* Image grid */ -.beep-media-grid { +.beep-embed .beep-media-grid { display: grid; gap: 2px; border-radius: 16px; @@ -459,16 +459,16 @@ border: 1px solid var(--beep-border); } -.beep-media-grid-2 { grid-template-columns: 1fr 1fr; } -.beep-media-grid-3 .beep-media-grid-item:first-child { grid-column: span 2; } -.beep-media-grid-4 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; } +.beep-embed .beep-media-grid-2 { grid-template-columns: 1fr 1fr; } +.beep-embed .beep-media-grid-3 .beep-media-grid-item:first-child { grid-column: span 2; } +.beep-embed .beep-media-grid-4 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; } -.beep-media-grid-item { +.beep-embed .beep-media-grid-item { overflow: hidden; aspect-ratio: 16 / 9; } -.beep-media-grid-item img { +.beep-embed .beep-media-grid-item img { width: 100%; height: 100%; object-fit: cover; @@ -476,7 +476,7 @@ } /* Polls */ -.beep-poll-container { +.beep-embed .beep-poll-container { margin-top: 12px; border: 1px solid var(--beep-border); border-radius: 16px; @@ -484,20 +484,20 @@ background: transparent; } -.beep-poll-question { +.beep-embed .beep-poll-question { font-size: 15px; font-weight: 700; color: var(--beep-text); margin-bottom: 12px; } -.beep-poll-options { +.beep-embed .beep-poll-options { display: flex; flex-direction: column; gap: 8px; } -.beep-poll-option { +.beep-embed .beep-poll-option { border: 1px solid var(--beep-border); border-radius: 9999px; padding: 10px 16px; @@ -511,14 +511,14 @@ overflow: hidden; } -.beep-poll-option:hover { +.beep-embed .beep-poll-option:hover { background: var(--beep-card-hover); border-color: var(--beep-muted); } -.beep-poll-option.is-voted { border-color: var(--beep-accent); } +.beep-embed .beep-poll-option.is-voted { border-color: var(--beep-accent); } -.beep-poll-result { +.beep-embed .beep-poll-result { border: 1px solid var(--beep-border); border-radius: 9999px; padding: 10px 16px; @@ -529,7 +529,7 @@ overflow: hidden; } -.beep-poll-result-bar { +.beep-embed .beep-poll-result-bar { position: absolute; left: 0; top: 0; @@ -539,12 +539,12 @@ max-width: 100%; } -.beep-poll-result.is-voted { border-color: var(--beep-accent); } -.beep-poll-result-text { position: relative; z-index: 1; } -.beep-poll-end { font-size: 13px; color: var(--beep-muted); margin-top: 8px; font-weight: 400; } +.beep-embed .beep-poll-result.is-voted { border-color: var(--beep-accent); } +.beep-embed .beep-poll-result-text { position: relative; z-index: 1; } +.beep-embed .beep-poll-end { font-size: 13px; color: var(--beep-muted); margin-top: 8px; font-weight: 400; } /* Quotes */ -.beep-quoted-container { +.beep-embed .beep-quoted-container { margin-top: 12px; border: 1px solid var(--beep-border); border-radius: 16px; @@ -552,13 +552,13 @@ background: transparent; } -.beep-quoted-post { text-decoration: none; color: inherit; } -.beep-quoted-post:hover { text-decoration: none; } +.beep-embed .beep-quoted-post { text-decoration: none; color: inherit; } +.beep-embed .beep-quoted-post:hover { text-decoration: none; } -.beep-quoted-meta { font-size: 13px; color: var(--beep-muted); margin-bottom: 4px; } -.beep-quoted-meta .beep-name { font-weight: 700; } +.beep-embed .beep-quoted-meta { font-size: 13px; color: var(--beep-muted); margin-bottom: 4px; } +.beep-embed .beep-quoted-meta .beep-name { font-weight: 700; } -.beep-quoted-text { +.beep-embed .beep-quoted-text { font-size: 14px; color: var(--beep-text); line-height: 1.4; @@ -570,7 +570,7 @@ } /* Voice note */ -.beep-voice-note { +.beep-embed .beep-voice-note { margin-top: 12px; display: flex; align-items: center; @@ -581,7 +581,7 @@ max-width: 400px; } -.beep-voice-play { +.beep-embed .beep-voice-play { background: var(--beep-accent); border: 0; border-radius: 50%; @@ -595,9 +595,9 @@ padding: 0; } -.beep-voice-play svg { width: 14px; height: 14px; fill: #fff; } +.beep-embed .beep-voice-play svg { width: 14px; height: 14px; fill: #fff; } -.beep-voice-waveform { +.beep-embed .beep-voice-waveform { flex: 1; height: 24px; display: flex; @@ -605,7 +605,7 @@ gap: 2px; } -.beep-voice-bar { +.beep-embed .beep-voice-bar { width: 3px; height: 100%; background: var(--beep-accent); @@ -613,17 +613,17 @@ opacity: 0.6; } -.beep-voice-duration { font-size: 13px; color: var(--beep-muted); font-variant-numeric: tabular-nums; } +.beep-embed .beep-voice-duration { font-size: 13px; color: var(--beep-muted); font-variant-numeric: tabular-nums; } /* Replies */ -.beep-replies { +.beep-embed .beep-replies { margin-top: 8px; padding-left: 0; border-left: 2px solid var(--beep-border); margin-left: 24px; } -.beep-reply { +.beep-embed .beep-reply { display: flex; gap: 10px; padding: 10px 16px; @@ -632,14 +632,14 @@ transition: background-color 0.15s ease; } -.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; } -.beep-reply .beep-meta { font-size: 13px; margin-bottom: 0; } -.beep-reply .beep-avatar { width: 36px !important; height: 36px !important; min-width: 36px !important; max-width: 36px !important; } +.beep-embed .beep-reply:last-child { border-bottom: 0; } +.beep-embed .beep-reply-body { flex: 1; min-width: 0; } +.beep-embed .beep-reply .beep-text { font-size: 14px; margin-bottom: 0; } +.beep-embed .beep-reply .beep-meta { font-size: 13px; margin-bottom: 0; } +.beep-embed .beep-reply .beep-avatar { width: 36px !important; height: 36px !important; min-width: 36px !important; max-width: 36px !important; } /* Reply form */ -.beep-reply-form { +.beep-embed .beep-reply-form { margin-top: 8px; padding: 12px 16px; border-top: 1px solid var(--beep-border); @@ -650,10 +650,10 @@ background: var(--beep-bg); } -.beep-reply-form[hidden] { display: none; } -.beep-reply-form-body { flex: 1; min-width: 0; } +.beep-embed .beep-reply-form[hidden] { display: none; } +.beep-embed .beep-reply-form-body { flex: 1; min-width: 0; } -.beep-feed .beep-reply-input { +.beep-embed .beep-feed .beep-reply-input { width: 100% !important; border: 0 !important; outline: 0 !important; @@ -668,9 +668,9 @@ caret-color: var(--beep-accent); } -.beep-feed .beep-reply-input::placeholder { color: var(--beep-muted) !important; } +.beep-embed .beep-feed .beep-reply-input::placeholder { color: var(--beep-muted) !important; } -.beep-reply-footer { +.beep-embed .beep-reply-footer { display: flex; justify-content: flex-end; align-items: center; @@ -678,7 +678,7 @@ } /* Animations */ -.beep-new { animation: beep-slide-in 0.3s ease; } +.beep-embed .beep-new { animation: beep-slide-in 0.3s ease; } @keyframes beep-slide-in { from { opacity: 0; transform: translateY(-8px); } @@ -686,7 +686,7 @@ } /* Post badge */ -.beep-post-badge { +.beep-embed .beep-post-badge { width: 18px; height: 18px; flex-shrink: 0; @@ -694,24 +694,24 @@ margin-left: 2px; } -.beep-post-badge:hover { opacity: 0.8; cursor: pointer; } +.beep-embed .beep-post-badge:hover { opacity: 0.8; cursor: pointer; } /* Loading */ -.beep-loading { opacity: 0.5; pointer-events: none; } +.beep-embed .beep-loading { opacity: 0.5; pointer-events: none; } /* Mobile */ @media (max-width: 640px) { - .beep-feed { margin: 0; border-left: 0; border-right: 0; } - .beep-post { padding: 12px 16px; } - .beep-actions { max-width: none; } - .beep-compose { padding: 12px 16px; } - .beep-feed-header { padding: 12px 16px; } + .beep-embed .beep-feed { margin: 0; border-left: 0; border-right: 0; } + .beep-embed .beep-post { padding: 12px 16px; } + .beep-embed .beep-actions { max-width: none; } + .beep-embed .beep-compose { padding: 12px 16px; } + .beep-embed .beep-feed-header { padding: 12px 16px; } } /* Delete */ -.beep-delete-row { display: flex; justify-content: flex-end; margin-top: 6px; } +.beep-embed .beep-delete-row { display: flex; justify-content: flex-end; margin-top: 6px; } -.beep-delete-link { +.beep-embed .beep-delete-link { background: transparent; border: 0; color: var(--beep-muted); @@ -723,15 +723,15 @@ transition: color 0.15s ease, background-color 0.15s ease; } -.beep-delete-link:hover { color: #F4212E; background: rgba(244, 33, 46, 0.1); } +.beep-embed .beep-delete-link:hover { color: #F4212E; background: rgba(244, 33, 46, 0.1); } /* Notice */ -.beep-notice { padding: 14px 20px; border-bottom: 1px solid var(--beep-border); font-size: 14px; } -.beep-notice p { margin: 0; color: var(--beep-muted); } -.beep-notice-banned { color: #F4212E; font-style: italic; } +.beep-embed .beep-notice { padding: 14px 20px; border-bottom: 1px solid var(--beep-border); font-size: 14px; } +.beep-embed .beep-notice p { margin: 0; color: var(--beep-muted); } +.beep-embed .beep-notice-banned { color: #F4212E; font-style: italic; } /* Header post button */ -.beep-post-btn-header { +.beep-embed .beep-post-btn-header { background: var(--beep-accent); color: #fff; border: 0; @@ -744,11 +744,11 @@ transition: background-color 0.15s ease, transform 0.1s ease; } -.beep-post-btn-header:hover { background: var(--beep-accent-hover); } -.beep-post-btn-header:active { transform: scale(0.96); } +.beep-embed .beep-post-btn-header:hover { background: var(--beep-accent-hover); } +.beep-embed .beep-post-btn-header:active { transform: scale(0.96); } /* Back link */ -.beep-back-link { +.beep-embed .beep-back-link { display: flex; align-items: center; gap: 8px; @@ -762,11 +762,11 @@ transition: background-color 0.15s ease; } -.beep-back-link:hover { background: var(--beep-card-hover); color: var(--beep-text); text-decoration: none; } -.beep-back-link svg { width: 20px; height: 20px; fill: currentColor; } +.beep-embed .beep-back-link:hover { background: var(--beep-card-hover); color: var(--beep-text); text-decoration: none; } +.beep-embed .beep-back-link svg { width: 20px; height: 20px; fill: currentColor; } /* Thread modal */ -.beep-thread-modal { +.beep-embed .beep-thread-modal { position: fixed; inset: 0; z-index: 1000; @@ -777,9 +777,9 @@ backdrop-filter: blur(4px); } -.beep-thread-modal[hidden] { display: none; } +.beep-embed .beep-thread-modal[hidden] { display: none; } -.beep-thread-content { +.beep-embed .beep-thread-content { background: var(--beep-card-bg); width: 100%; max-width: 600px; @@ -789,7 +789,7 @@ border-right: 1px solid var(--beep-border); } -.beep-thread-header { +.beep-embed .beep-thread-header { display: flex; align-items: center; gap: 16px; @@ -801,7 +801,7 @@ z-index: 1; } -.beep-thread-close { +.beep-embed .beep-thread-close { background: transparent; border: 0; color: var(--beep-text); @@ -816,12 +816,12 @@ transition: background-color 0.15s ease; } -.beep-thread-close:hover { background: var(--beep-card-hover); } -.beep-thread-close svg { width: 20px; height: 20px; fill: currentColor; } -.beep-thread-title { font-size: 18px; font-weight: 700; color: var(--beep-text); } +.beep-embed .beep-thread-close:hover { background: var(--beep-card-hover); } +.beep-embed .beep-thread-close svg { width: 20px; height: 20px; fill: currentColor; } +.beep-embed .beep-thread-title { font-size: 18px; font-weight: 700; color: var(--beep-text); } /* Tooltip */ -.beep-tip { +.beep-embed .beep-tip { position: absolute; margin-left: 8px; padding: 4px 10px; @@ -843,14 +843,14 @@ } /* GIF */ -.beep-gif-embed { +.beep-embed .beep-gif-embed { margin-top: 12px; border-radius: 12px; overflow: hidden; border: 1px solid var(--beep-border); } -.beep-gif-embed img { +.beep-embed .beep-gif-embed img { width: 100%; height: auto; max-height: 400px; @@ -861,22 +861,22 @@ } /* Profile header */ -.beep-profile-header { padding: 16px 20px; border-bottom: 1px solid var(--beep-border); } -.beep-profile-name { font-size: 20px; font-weight: 800; color: var(--beep-text); margin-bottom: 2px; } -.beep-profile-meta { font-size: 14px; color: var(--beep-muted); } -.beep-profile-stats { display: flex; gap: 20px; margin-top: 12px; } -.beep-profile-stat { color: var(--beep-muted); font-size: 14px; cursor: pointer; } -.beep-profile-stat:hover { text-decoration: underline; } -.beep-profile-stat strong { color: var(--beep-text); font-weight: 700; } +.beep-embed .beep-profile-header { padding: 16px 20px; border-bottom: 1px solid var(--beep-border); } +.beep-embed .beep-profile-name { font-size: 20px; font-weight: 800; color: var(--beep-text); margin-bottom: 2px; } +.beep-embed .beep-profile-meta { font-size: 14px; color: var(--beep-muted); } +.beep-embed .beep-profile-stats { display: flex; gap: 20px; margin-top: 12px; } +.beep-embed .beep-profile-stat { color: var(--beep-muted); font-size: 14px; cursor: pointer; } +.beep-embed .beep-profile-stat:hover { text-decoration: underline; } +.beep-embed .beep-profile-stat strong { color: var(--beep-text); font-weight: 700; } /* Tabs */ -.beep-tabs { +.beep-embed .beep-tabs { display: flex; border-bottom: 1px solid var(--beep-border); background: var(--beep-card-bg); } -.beep-tab { +.beep-embed .beep-tab { flex: 1; background: transparent; border: 0; @@ -890,9 +890,9 @@ transition: background-color 0.15s ease, color 0.15s ease; } -.beep-tab:hover { background: var(--beep-card-hover); color: var(--beep-text); } -.beep-tab.is-active { color: var(--beep-text); } -.beep-tab.is-active::after { +.beep-embed .beep-tab:hover { background: var(--beep-card-hover); color: var(--beep-text); } +.beep-embed .beep-tab.is-active { color: var(--beep-text); } +.beep-embed .beep-tab.is-active::after { content: ''; position: absolute; left: 50%; @@ -905,28 +905,28 @@ } /* Focus */ -.beep-feed .beep-input:focus, -.beep-feed .beep-input:focus-visible, -.beep-feed .beep-reply-input:focus, -.beep-feed .beep-reply-input:focus-visible { +.beep-embed .beep-feed .beep-input:focus, +.beep-embed .beep-feed .beep-input:focus-visible, +.beep-embed .beep-feed .beep-reply-input:focus, +.beep-embed .beep-feed .beep-reply-input:focus-visible { outline: 0 !important; box-shadow: none !important; } -.beep-feed .beep-compose:focus-within { background: rgba(29, 155, 240, 0.03); } +.beep-embed .beep-feed .beep-compose:focus-within { background: rgba(29, 155, 240, 0.03); } /* Hidden */ -[hidden] { display: none !important; } +.beep-embed [hidden] { display: none !important; } /* Magic Login Form */ -.beep-magic-login { +.beep-embed .beep-magic-login { padding: 24px; display: flex; justify-content: center; } -.beep-magic-login-card { +.beep-embed .beep-magic-login-card { background: #192734; border-radius: 16px; padding: 32px; @@ -935,34 +935,34 @@ text-align: center; } -.beep-magic-login-header { +.beep-embed .beep-magic-login-header { margin-bottom: 24px; } -.beep-magic-login-header svg { +.beep-embed .beep-magic-login-header svg { margin-bottom: 16px; } -.beep-magic-login-header h3 { +.beep-embed .beep-magic-login-header h3 { color: #E7E9EA; font-size: 20px; font-weight: 700; margin: 0 0 8px 0; } -.beep-magic-login-header p { +.beep-embed .beep-magic-login-header p { color: #71767B; font-size: 14px; margin: 0; } -.beep-magic-login-form { +.beep-embed .beep-magic-login-form { display: flex; flex-direction: column; gap: 12px; } -.beep-magic-email { +.beep-embed .beep-magic-email { width: 100%; padding: 12px 16px; background: #22303C; @@ -973,16 +973,16 @@ box-sizing: border-box; } -.beep-magic-email:focus { +.beep-embed .beep-magic-email:focus { outline: none; border-color: #1D9BF0; } -.beep-magic-email::placeholder { +.beep-embed .beep-magic-email::placeholder { color: #71767B; } -.beep-button.beep-magic-submit { +.beep-embed .beep-button.beep-magic-submit { width: 100%; padding: 12px 24px; background: #1D9BF0; @@ -995,16 +995,16 @@ transition: background 0.2s; } -.beep-button.beep-magic-submit:hover { +.beep-embed .beep-button.beep-magic-submit:hover { background: #1A8CD8; } -.beep-button.beep-magic-submit:disabled { +.beep-embed .beep-button.beep-magic-submit:disabled { opacity: 0.6; cursor: not-allowed; } -.beep-magic-success { +.beep-embed .beep-magic-success { display: flex; align-items: center; justify-content: center; @@ -1016,7 +1016,7 @@ font-size: 14px; } -.beep-magic-error { +.beep-embed .beep-magic-error { padding: 12px; background: rgba(224, 36, 94, 0.1); border-radius: 8px; @@ -1026,7 +1026,7 @@ } /* Public feed notice */ -.beep-public-notice { +.beep-embed .beep-public-notice { display: flex; align-items: center; justify-content: center; @@ -1038,12 +1038,11 @@ font-size: 14px; } -.beep-public-notice a { +.beep-embed .beep-public-notice a { color: #1D9BF0; text-decoration: none; } -.beep-public-notice a:hover { +.beep-embed .beep-public-notice a:hover { text-decoration: underline; } - diff --git a/assets/beep.js b/assets/beep.js index 1bd41db..ad3949b 100755 --- a/assets/beep.js +++ b/assets/beep.js @@ -1,4 +1,4 @@ -/* Beep — Twitter-style microblog frontend */ + var url = `https://api.giphy.com/v1/gifs/search?api_key=${apiKey}&q=${encodeURIComponent(query)}&limit=30&rating=g`;/* Beep — Twitter-style microblog frontend */ (function () { 'use strict'; @@ -44,16 +44,16 @@ var content = input.value.trim(); if (!content) return; button.disabled = true; + var quotedPost = compose._beepQuotedPost; + var gifUrl = compose._beepGifUrl; + var payload = { content: content }; + if (quotedPost && quotedPost.id) payload.quote_id = quotedPost.id; + if (gifUrl) payload.gif_url = gifUrl; + fetch(config.restUrl + 'post', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': config.nonce }, credentials: 'same-origin', - var quotedPost = compose._beepQuotedPost; - var gifUrl = compose._beepGifUrl; - var payload = { content: content }; - if (quotedPost && quotedPost.id) payload.quote_id = quotedPost.id; - if (gifUrl) payload.gif_url = gifUrl; - body: JSON.stringify(payload) }) .then(handleResponse) @@ -799,7 +799,7 @@ grid.innerHTML = '

Searching...

'; var apiKey = (window.BeepConfig && window.BeepConfig.giphyKey) || GIPHY_API_KEY; - var url = 'https://api.giphy.com/v1/gifs/search?api_key=' + apiKey + '&q=' + encodeURIComponent(query) + '&limit=30&rating=g'; + var url = `https://api.giphy.com/v1/gifs/search?api_key=${apiKey}&q=${encodeURIComponent(query)}&limit=30&rating=g`; fetch(url) .then(function(res) { return res.json(); }) diff --git a/beep.php b/beep.php index c0d8327..d3f997b 100755 --- a/beep.php +++ b/beep.php @@ -2,7 +2,7 @@ /** * Plugin Name: Beep * Description: A Twitter-style microblog for WordPress, with likes, replies, and Gravatars. Use the [beep_feed] shortcode on any page. - * Version: 1.4.1 + * Version: 1.5.1 * Requires at least: 6.0 * Requires PHP: 7.4 * Author: Sami Ahmed @@ -14,7 +14,7 @@ if (!defined('ABSPATH')) { exit; } -define('BEEP_VERSION', '1.4.1'); +define('BEEP_VERSION', '1.5.1'); define('BEEP_FILE', __FILE__); define('BEEP_DIR', plugin_dir_path(__FILE__)); define('BEEP_URL', plugin_dir_url(__FILE__)); diff --git a/includes/class-beep.php b/includes/class-beep.php index 2b19926..12614dc 100755 --- a/includes/class-beep.php +++ b/includes/class-beep.php @@ -20,7 +20,13 @@ class Beep_Plugin { update_option('beep_giphy_key', 'xuxYxuIvzPqw5tPB4laa7sQO8dFtSlNS'); } - // Admin settings + // Elementor widget + add_action('elementor/widgets/register', function ($widgets_manager) { + require_once BEEP_DIR . 'includes/class-elementor-widget.php'; + $widgets_manager->register(new \Elementor\Beep_Elementor_Widget()); + }); + + // Admin settings (Giphy API key only — full settings via Beep_Settings) add_action('admin_menu', [__CLASS__, 'add_admin_menu']); add_action('admin_init', [__CLASS__, 'register_settings']); } diff --git a/includes/class-elementor-widget.php b/includes/class-elementor-widget.php new file mode 100644 index 0000000..69e91e6 --- /dev/null +++ b/includes/class-elementor-widget.php @@ -0,0 +1,127 @@ +start_controls_section( + 'section_feed', + ['label' => 'Feed Settings'] + ); + + $this->add_control( + 'header', + [ + 'label' => 'Header Title', + 'type' => \Elementor\Controls_Manager::TEXT, + 'default' => 'Beep', + 'description' => 'Text shown in the feed header. Leave empty to show the wordmark logo.', + ] + ); + + $this->add_control( + 'show_wordmark', + [ + 'label' => 'Show Wordmark Logo', + 'type' => \Elementor\Controls_Manager::SWITCHER, + 'default' => 'yes', + ] + ); + + $this->add_control( + 'sort', + [ + 'label' => 'Default Sort', + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 'latest', + 'options' => [ + 'latest' => 'Latest First', + 'top' => 'Top / Most Liked', + ], + ] + ); + + $this->add_control( + 'limit', + [ + 'label' => 'Posts Per Page', + 'type' => \Elementor\Controls_Manager::NUMBER, + 'min' => 1, + 'max' => 100, + 'default' => 20, + ] + ); + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_style', + ['label' => 'Appearance'] + ); + + $this->add_group_control( + \Elementor\Group_Control_Typography::get_type(), + [ + 'name' => 'feed_typography', + 'label' => 'Feed Typography', + 'selector' => '{{WRAPPER}} .beep-feed', + ] + ); + + $this->add_control( + 'card_radius', + [ + 'label' => 'Card Border Radius', + 'type' => \Elementor\Controls_Manager::SLIDER, + 'size_units' => ['px'], + 'range' => ['px' => ['min' => 0, 'max' => 32]], + 'default' => ['unit' => 'px', 'size' => 0], + 'selectors' => [ + '{{WRAPPER}} .beep-post' => 'border-radius: {{SIZE}}{{UNIT}};', + ], + ] + ); + + $this->end_controls_section(); + } + + protected function render() { + $settings = $this->get_settings_for_display(); + + $atts = [ + 'header' => $settings['header'] ?: 'Beep', + 'show_wordmark' => $settings['show_wordmark'] ? '1' : '0', + 'sort' => $settings['sort'], + 'limit' => (int) $settings['limit'], + ]; + + echo Beep_Shortcode::render_beep_feed($atts); + } +} \ No newline at end of file diff --git a/includes/class-settings.php b/includes/class-settings.php index d02e5cc..5370994 100644 --- a/includes/class-settings.php +++ b/includes/class-settings.php @@ -54,6 +54,7 @@ class Beep_Settings { // Branding 'logo_url' => '', // Custom logo URL + 'icon_url' => '', // Custom icon URL (favicon) 'site_name' => 'Beep', // Or 'X' or 'Twitter' 'tagline' => 'Messages from', @@ -361,14 +362,32 @@ class Beep_Settings { ['key' => 'font_size_base', 'label' => 'e.g. 15px'] ); - // === Section: Branding === + // === Section: Branding & Media === add_settings_section( 'beep_branding', - 'Branding', + 'Branding & Media', [__CLASS__, 'section_branding_description'], 'beep-settings' ); + add_settings_field( + 'logo_url', + 'Logo Image', + [__CLASS__, 'field_media_upload'], + 'beep-settings', + 'beep_branding', + ['key' => 'logo_url', 'label' => 'Upload a logo image. Leave empty to use text.'] + ); + + add_settings_field( + 'icon_url', + 'Icon Image', + [__CLASS__, 'field_media_upload'], + 'beep-settings', + 'beep_branding', + ['key' => 'icon_url', 'label' => 'Upload an icon/favicon image.'] + ); + add_settings_field( 'site_name', 'Site Name', @@ -387,15 +406,6 @@ class Beep_Settings { ['key' => 'tagline', 'label' => 'Text above logo, e.g. "Messages from"'] ); - add_settings_field( - 'logo_url', - 'Logo Image URL', - [__CLASS__, 'field_text'], - 'beep-settings', - 'beep_branding', - ['key' => 'logo_url', 'label' => 'Leave empty to use text. Upload via Media Library.'] - ); - // === Section: Features === add_settings_section( 'beep_features', @@ -691,6 +701,210 @@ class Beep_Settings { } }); } + + // Media upload handling + $('.beep-media-upload-btn').on('click', function() { + var $btn = $(this); + var targetId = $btn.data('target'); + var type = $btn.data('type') || 'icon'; + var $input = $('#' + targetId); + var $wrapper = $btn.closest('[data-beep-upload-wrapper]'); + var $previewArea = $wrapper.find('[data-beep-preview-area]'); + + var mediaFrame = wp.media({ + title: 'Choose ' + (type === 'logo' ? 'Logo Image' : 'Icon Image'), + button: { text: 'Use as ' + (type === 'logo' ? 'Logo' : 'Icon') }, + multiple: false, + library: { type: 'image' } + }); + + mediaFrame.on('select', function() { + var attachment = mediaFrame.state().get('selection').first().toJSON(); + $input.val(attachment.url); + renderPreview(attachment.url, type, $previewArea); + }); + + mediaFrame.open(); + }); + + // Live preview on URL paste/type + $('.beep-media-input').on('input', function() { + var $input = $(this); + var $wrapper = $input.closest('[data-beep-upload-wrapper]'); + var $previewArea = $wrapper.find('[data-beep-preview-area]'); + var type = $input.attr('name').includes('logo') ? 'logo' : 'icon'; + var url = $input.val().trim(); + + if (url && (url.startsWith('http://') || url.startsWith('https://'))) { + renderPreview(url, type, $previewArea); + } else { + renderEmptyPreview($previewArea); + } + }); + + // Render preview helper + function renderPreview(url, type, $area) { + var recommended = type === 'logo' + ? '300×80 px minimum' + : '32×32 px'; + var displayW = type === 'logo' ? 280 : 80; + var displayH = type === 'logo' ? 80 : 80; + + var $img = $('', { + src: url, + alt: 'Preview', + crossOrigin: 'anonymous', + css: { + maxWidth: displayW + 'px', + maxHeight: displayH + 'px', + border: '1px solid #ccc', + borderRadius: '6px', + background: '#fff', + display: 'block' + } + }); + + var $imgWrapper = $('
', { + css: { + display: 'inline-block', + padding: '12px', + background: '#fff', + border: '1px solid #EFF3F4', + borderRadius: '8px' + } + }).append($img); + + var $badge = $('', { + text: '⚖ Pending size check…', + css: { fontSize: '11px', color: '#71767B', fontFamily: 'monospace', display: 'block', marginTop: '6px' } + }); + + $img.on('load', function() { + var w = this.naturalWidth || this.width; + var h = this.naturalHeight || this.height; + var ok = type === 'logo' ? (w >= 150 && h >= 40) : (w >= 16 && h >= 16); + var label = type === 'logo' ? 'Logo' : 'Icon'; + + var $sizeInfo = $('
', { + css: { marginTop: '8px', fontSize: '12px', fontFamily: 'monospace' } + }); + + $sizeInfo.append( + $('', { + text: label + ' size: ' + w + '×' + h + 'px', + css: { color: ok ? '#00BA7C' : '#F91880', fontWeight: '600' } + }) + ); + $sizeInfo.append( + $('
', { + text: 'Recommended: ' + recommended, + css: { color: '#71767B' } + }) + ); + if (!ok) { + $sizeInfo.append( + $('
', { + text: '⚠ May appear blurry — larger source recommended', + css: { color: '#F91880', fontWeight: '500' } + }) + ); + } + + // Render the full preview area + $area.html('').append( + $('
', { css: { display: 'flex', alignItems: 'flex-start', gap: '16px' } }).append( + $imgWrapper, + $('
').append( + $('
', { + text: '✓ Live preview', + css: { fontSize: '12px', fontWeight: '600', color: '#00BA7C', marginBottom: '4px' } + }), + $sizeInfo, + $('
', { + text: 'In feed header (wordmark):', + css: { fontSize: '11px', color: '#71767B', marginTop: '8px', marginBottom: '4px', textTransform: 'uppercase', letterSpacing: '.5px' } + }), + $('', { + src: url, + alt: label + ' in header', + css: { + maxWidth: '200px', + maxHeight: '48px', + border: '1px solid #EFF3F4', + borderRadius: '4px', + display: 'block' + } + }), + $('
', { + text: 'In post (badge):', + css: { fontSize: '11px', color: '#71767B', marginTop: '8px', marginBottom: '4px', textTransform: 'uppercase', letterSpacing: '.5px' } + }), + $('', { + src: url, + alt: label + ' badge', + css: { + maxWidth: '32px', + maxHeight: '32px', + border: '1px solid #EFF3F4', + borderRadius: '4px', + display: 'block' + } + }), + $('', { + src: url, + alt: label + ' badge (reply)', + css: { + maxWidth: '24px', + maxHeight: '24px', + border: '1px solid #EFF3F4', + borderRadius: '4px', + display: 'block', + marginTop: '4px' + } + }) + ) + ) + ); + }).on('error', function() { + $area.html( + '
Could not load image — check the URL
' + ); + }); + } + + function renderEmptyPreview($area) { + $area.html( + '
' + + '' + + 'No image chosen yet — click "Choose Image" or paste a URL above' + + '
' + ); + } + + // Initialize previews on page load + $('.beep-media-input').each(function() { + var $input = $(this); + var $wrapper = $input.closest('[data-beep-upload-wrapper]'); + var $previewArea = $wrapper.find('[data-beep-preview-area]'); + var type = $input.attr('name').includes('logo') ? 'logo' : 'icon'; + var url = $input.val().trim(); + + if (url && (url.startsWith('http://') || url.startsWith('https://'))) { + renderPreview(url, type, $previewArea); + } + }); + + // Remove media button + $(document).on('click', '.beep-media-remove', function() { + var targetId = $(this).data('target'); + var previewId = $(this).data('preview'); + $('#' + targetId).val(''); + var $wrapper = $('#' + targetId).closest('[data-beep-upload-wrapper]'); + var $previewArea = $wrapper.find('[data-beep-preview-area]'); + renderEmptyPreview($previewArea); + // Remove the "Remove" button itself + $(this).remove(); + }); }); Logo and site name settings.

'; + echo '

Logo, icon, and site name settings.

'; } public static function section_features_description() { @@ -835,7 +1049,70 @@ class Beep_Settings { + + +
+ Recommended for :
+ + +
Transparent PNG/SVG — the header has a blurred backdrop + +
Will be displayed at 32×32px in posts, 24×24px in replies + +
+ +
+ +
+ + +
+ + +
+ + + +
+ + No image chosen yet — click "Choose Image" or paste a URL above +
+ +
+ + + + +
+ +

+
+
@@ -132,8 +133,9 @@ class Beep_Shortcode { echo '
No beeps yet.
'; } ?> -
-
+
+
+
'; } @@ -152,7 +153,7 @@ function beep_render_post($post) { datetime="" title=""> - +
@@ -374,7 +375,7 @@ function beep_render_reply($comment, $all_comments = [], $depth = 0, $post_id = · - +