{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "social-media-post-scheduler",
  "title": "Social Media Post Scheduler",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-angular/blocks/social-media-post-scheduler/social-media-post-scheduler.component.ts",
      "content": "// Multi-platform social media composer and post scheduler. Features channel toggles,\n// rich text composer with emoji & hashtag insertion, character counter, media upload\n// preview, scheduled time picker with best-time recommendations, auto-repost toggle,\n// and high-fidelity live social feed previews for X (Twitter), LinkedIn, Instagram,\n// and Threads. Port of the Vue/React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport {\n  Bookmark,\n  Calendar,\n  Check,\n  CheckCircle2,\n  Clock,\n  Eye,\n  Globe,\n  Heart,\n  Image as ImageIcon,\n  LucideAngularModule,\n  MessageCircle,\n  MessageSquare,\n  MoreHorizontal,\n  Repeat2,\n  Send,\n  Share2,\n  Sparkles,\n  ThumbsUp,\n  Trash2,\n  UploadCloud,\n  X,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiAvatarComponent, UiAvatarFallbackComponent, UiAvatarImageComponent } from '@/ui/avatar/avatar.component'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardFooterComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiInputComponent } from '@/ui/input/input.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport { UiSwitchComponent } from '@/ui/switch/switch.component'\nimport {\n  UiTabsComponent,\n  UiTabsContentComponent,\n  UiTabsListComponent,\n  UiTabsTriggerComponent,\n} from '@/ui/tabs/tabs.component'\nimport { UiTextareaComponent } from '@/ui/textarea/textarea.component'\n\nconst defaultContent =\n  'Excited to announce the new component release for our open source design system! 🚀 Built with accessible keyboard ergonomics, fluid motion, and crisp token hierarchy out of the box.\\n\\n#UI #Developer #OpenSource'\n\nconst author = {\n  name: 'Alex Morgan',\n  role: 'Staff Product Engineer',\n  headline: 'Staff Product Engineer · Building open-source UI design systems & web tools',\n  twitterHandle: '@alexmorgan_dev',\n  instagramHandle: 'alexmorgan.dev',\n  threadsHandle: 'alexmorgan',\n  avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?q=80&w=256&auto=format&fit=crop',\n  initials: 'AM',\n}\n\nconst sampleImages = [\n  {\n    id: 'dashboard',\n    label: 'Dashboard Preview',\n    url: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?q=80&w=1200&auto=format&fit=crop',\n    dimensions: '1200 × 675 px · 284 KB',\n    aspect: '16:9 Landscape',\n  },\n  {\n    id: 'workspace',\n    label: 'Dev Workspace',\n    url: 'https://images.unsplash.com/photo-1498050108023-c5249f4df085?q=80&w=1200&auto=format&fit=crop',\n    dimensions: '1200 × 800 px · 340 KB',\n    aspect: '3:2 Photo',\n  },\n  {\n    id: 'design',\n    label: 'Design Canvas',\n    url: 'https://images.unsplash.com/photo-1507238691740-187a5b1d37b8?q=80&w=1200&auto=format&fit=crop',\n    dimensions: '1080 × 1080 px · 410 KB',\n    aspect: '1:1 Square',\n  },\n]\n\nconst suggestedHashtags = [\n  '#UI',\n  '#Developer',\n  '#OpenSource',\n  '#DesignSystem',\n  '#WebDev',\n  '#Frontend',\n  '#Tech',\n  '#SaaS',\n]\nconst quickEmojis = ['🚀', '✨', '💡', '🔥', '📊', '🧵', '🎉', '⚡', '👇', '🎯']\nconst timeSlots = ['09:00 AM EST', '10:00 AM EST', '01:30 PM EST', '05:00 PM EST']\n\nconst platformLimits: Record<string, { name: string; limit: number }> = {\n  twitter: { name: 'X (Twitter)', limit: 280 },\n  threads: { name: 'Threads', limit: 500 },\n  instagram: { name: 'Instagram', limit: 2200 },\n  linkedin: { name: 'LinkedIn', limit: 3000 },\n}\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-social-media-post-scheduler, [ui-social-media-post-scheduler]',\n  standalone: true,\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiAvatarComponent,\n    UiAvatarFallbackComponent,\n    UiAvatarImageComponent,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardFooterComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiInputComponent,\n    UiSeparatorComponent,\n    UiSwitchComponent,\n    UiTabsComponent,\n    UiTabsContentComponent,\n    UiTabsListComponent,\n    UiTabsTriggerComponent,\n    UiTextareaComponent,\n  ],\n  template: `\n    <div data-slot=\"social-media-post-scheduler\" class=\"bg-background text-foreground flex w-full flex-col gap-6\">\n      <!-- Top Global Header -->\n      <header\n        class=\"bg-card border-border flex flex-col gap-4 rounded-xl border p-5 shadow-xs sm:flex-row sm:items-center sm:justify-between\"\n      >\n        <div class=\"space-y-1\">\n          <div class=\"flex flex-wrap items-center gap-2.5\">\n            <div class=\"bg-primary/10 text-primary flex size-8 items-center justify-center rounded-lg\">\n              <lucide-icon [img]=\"Calendar\" class=\"size-4\" />\n            </div>\n            <h1 class=\"text-foreground text-lg font-semibold tracking-tight\">Social Post Composer & Scheduler</h1>\n            <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">\n              {{ selectedChannels().length }} / 4 Networks\n            </span>\n          </div>\n          <p class=\"text-muted-foreground text-sm\">\n            Compose, calibrate, and orchestrate cross-platform social broadcasts with live authentic previews.\n          </p>\n        </div>\n\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <button ui-button variant=\"outline\" size=\"sm\" (click)=\"saveDraft()\">\n            <lucide-icon [img]=\"Bookmark\" class=\"mr-1.5 size-3.5\" />\n            Save Draft\n          </button>\n          <button ui-button size=\"sm\" (click)=\"schedulePost()\">\n            <lucide-icon [img]=\"Calendar\" class=\"mr-1.5 size-3.5\" />\n            Schedule Post\n          </button>\n        </div>\n      </header>\n\n      <!-- Feedback Notification Toast Banner -->\n      @if (notificationMessage(); as msg) {\n        <div [class]=\"notificationClass\">\n          <div class=\"flex flex-wrap items-center gap-2.5\">\n            @if (notificationType() === 'success') {\n              <lucide-icon [img]=\"CheckCircle2\" class=\"size-4 shrink-0\" />\n            } @else {\n              <lucide-icon [img]=\"Bookmark\" class=\"size-4 shrink-0\" />\n            }\n            <span>{{ msg }}</span>\n          </div>\n          <button\n            type=\"button\"\n            aria-label=\"Dismiss notification\"\n            class=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring rounded p-1 focus-visible:ring-2 focus-visible:outline-none\"\n            (click)=\"dismissNotification()\"\n          >\n            <lucide-icon [img]=\"X\" class=\"size-4\" />\n          </button>\n        </div>\n      }\n\n      <!-- 2-Column Composer & Live Preview Grid -->\n      <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n        <!-- Left Column: Composer, Channels, Media, Schedule Settings -->\n        <section class=\"space-y-6 lg:col-span-6\">\n          <!-- Target Channels Selection Card -->\n          <div ui-card>\n            <div ui-card-header class=\"pb-3\">\n              <div class=\"flex items-center justify-between\">\n                <h3 ui-card-title class=\"text-base font-semibold\">Publishing Channels</h3>\n                <span class=\"text-muted-foreground text-xs font-medium\">Select all target feeds</span>\n              </div>\n              <p ui-card-description class=\"text-xs\">Toggle the target social accounts for this scheduled broadcast.</p>\n            </div>\n            <div ui-card-content>\n              <div class=\"grid grid-cols-2 gap-2.5 sm:grid-cols-4\">\n                <button\n                  type=\"button\"\n                  [class]=\"channelClass('twitter', 'border-primary bg-primary/5 ring-primary ring-1')\"\n                  (click)=\"toggleChannel('twitter')\"\n                >\n                  <div class=\"flex w-full items-center justify-between\">\n                    <div class=\"bg-foreground text-background flex size-6 items-center justify-center rounded-md\">\n                      <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                        <path\n                          d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 24.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"\n                        />\n                      </svg>\n                    </div>\n                    <div [class]=\"checkClass('twitter', 'bg-primary text-primary-foreground')\">\n                      @if (isChannelSelected('twitter')) {\n                        <lucide-icon [img]=\"Check\" class=\"size-2.5 stroke-[3]\" />\n                      }\n                    </div>\n                  </div>\n                  <div>\n                    <div class=\"text-xs font-semibold\">X / Twitter</div>\n                    <div class=\"text-muted-foreground text-xs\">280 chars</div>\n                  </div>\n                </button>\n\n                <button\n                  type=\"button\"\n                  [class]=\"channelClass('linkedin', 'border-info bg-info/5 ring-1 ring-blue-600')\"\n                  (click)=\"toggleChannel('linkedin')\"\n                >\n                  <div class=\"flex w-full items-center justify-between\">\n                    <div class=\"flex size-6 items-center justify-center rounded-md bg-[#0077B5] text-white\">\n                      <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                        <path\n                          d=\"M19 3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14m-.5 15.5v-5.3a3.26 3.26 0 0 0-3.26-3.26c-.85 0-1.84.52-2.28 1.3v-1.11h-2.79v8.37h2.79v-4.93c0-.77.62-1.4 1.39-1.4a1.4 1.4 0 0 1 1.4 1.4v4.93h2.75M6.46 8.76a1.45 1.45 0 1 0 0-2.9 1.45 1.45 0 0 0 0 2.9m1.4 9.74v-8.37H5.06v8.37z\"\n                        />\n                      </svg>\n                    </div>\n                    <div [class]=\"checkClass('linkedin', 'bg-info text-white')\">\n                      @if (isChannelSelected('linkedin')) {\n                        <lucide-icon [img]=\"Check\" class=\"size-2.5 stroke-[3]\" />\n                      }\n                    </div>\n                  </div>\n                  <div>\n                    <div class=\"text-xs font-semibold\">LinkedIn</div>\n                    <div class=\"text-muted-foreground text-xs\">3,000 chars</div>\n                  </div>\n                </button>\n\n                <button\n                  type=\"button\"\n                  [class]=\"channelClass('instagram', 'border-pink-500 bg-pink-500/5 ring-1 ring-pink-500')\"\n                  (click)=\"toggleChannel('instagram')\"\n                >\n                  <div class=\"flex w-full items-center justify-between\">\n                    <div\n                      class=\"flex size-6 items-center justify-center rounded-md bg-gradient-to-tr from-[#f09433] via-[#dc2743] to-[#bc1888] text-white\"\n                    >\n                      <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                        <path\n                          d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z\"\n                        />\n                      </svg>\n                    </div>\n                    <div [class]=\"checkClass('instagram', 'bg-pink-500 text-white')\">\n                      @if (isChannelSelected('instagram')) {\n                        <lucide-icon [img]=\"Check\" class=\"size-2.5 stroke-[3]\" />\n                      }\n                    </div>\n                  </div>\n                  <div>\n                    <div class=\"text-xs font-semibold\">Instagram</div>\n                    <div class=\"text-muted-foreground text-xs\">2,200 chars</div>\n                  </div>\n                </button>\n\n                <button\n                  type=\"button\"\n                  [class]=\"channelClass('threads', 'border-foreground bg-foreground/5 ring-foreground ring-1')\"\n                  (click)=\"toggleChannel('threads')\"\n                >\n                  <div class=\"flex w-full items-center justify-between\">\n                    <div class=\"bg-foreground text-background flex size-6 items-center justify-center rounded-md\">\n                      <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                        <path\n                          d=\"M12.186 24C5.454 24 0 18.618 0 12.016 0 5.414 5.454.032 12.186.032c6.64 0 11.966 5.228 12.004 11.758a12.08 12.08 0 0 1-3.69 8.643 11.85 11.85 0 0 1-8.314 3.567zm0-2.352a9.66 9.66 0 0 0 6.84-2.88 9.77 9.77 0 0 0 2.83-6.978c-.03-5.263-4.3-9.458-9.67-9.458-5.438 0-9.845 4.343-9.845 9.684 0 5.342 4.407 9.632 9.845 9.632z\"\n                        />\n                      </svg>\n                    </div>\n                    <div [class]=\"checkClass('threads', 'bg-foreground text-background')\">\n                      @if (isChannelSelected('threads')) {\n                        <lucide-icon [img]=\"Check\" class=\"size-2.5 stroke-[3]\" />\n                      }\n                    </div>\n                  </div>\n                  <div>\n                    <div class=\"text-xs font-semibold\">Threads</div>\n                    <div class=\"text-muted-foreground text-xs\">500 chars</div>\n                  </div>\n                </button>\n              </div>\n            </div>\n          </div>\n\n          <!-- Post Content Composer Card -->\n          <div ui-card>\n            <div ui-card-header class=\"pb-3\">\n              <div class=\"flex items-center justify-between\">\n                <h3 ui-card-title class=\"text-base font-semibold\">Post Content</h3>\n                <button\n                  ui-button\n                  variant=\"ghost\"\n                  size=\"xs\"\n                  class=\"text-primary hover:text-primary gap-1\"\n                  (click)=\"polishWithAi()\"\n                >\n                  <lucide-icon [img]=\"Sparkles\" class=\"size-3.5\" />\n                  <span>AI Polish</span>\n                </button>\n              </div>\n            </div>\n            <div ui-card-content class=\"space-y-4\">\n              <div class=\"space-y-2\">\n                <ui-textarea\n                  [value]=\"content()\"\n                  (valueChange)=\"content.set($event)\"\n                  [rows]=\"6\"\n                  placeholder=\"What would you like to share? Write once, preview across all social platforms...\"\n                  class=\"min-h-[140px] text-sm\"\n                />\n                <div class=\"flex flex-wrap items-center justify-between gap-2 pt-1\">\n                  <div class=\"flex flex-wrap items-center gap-1\">\n                    @for (emoji of emojis; track emoji) {\n                      <button\n                        type=\"button\"\n                        class=\"hover:bg-muted text-muted-foreground hover:text-foreground focus-visible:ring-ring flex size-7 items-center justify-center rounded text-sm transition-colors focus-visible:ring-1 focus-visible:outline-none\"\n                        (click)=\"insertEmoji(emoji)\"\n                      >\n                        {{ emoji }}\n                      </button>\n                    }\n                  </div>\n                  <div class=\"flex items-center gap-2\">\n                    <span ui-badge [variant]=\"counterVariant()\" class=\"font-mono text-xs\">\n                      {{ currentLength() }} / {{ currentPlatformLimit() }}\n                    </span>\n                  </div>\n                </div>\n              </div>\n              <div class=\"space-y-1.5 pt-1\">\n                <span class=\"text-muted-foreground text-xs font-medium\">Recommended Hashtags</span>\n                <div class=\"flex flex-wrap gap-1.5\">\n                  @for (tag of hashtags; track tag) {\n                    <button type=\"button\" [class]=\"hashtagClass(tag)\" (click)=\"insertHashtag(tag)\">\n                      {{ tag }}\n                    </button>\n                  }\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <!-- Media Attachment Dropzone Card -->\n          <div ui-card>\n            <div ui-card-header class=\"pb-3\">\n              <div class=\"flex items-center justify-between\">\n                <h3 ui-card-title class=\"text-base font-semibold\">Media Attachment</h3>\n                @if (mediaUrl()) {\n                  <span ui-badge variant=\"success\" class=\"text-xs\">Attached</span>\n                } @else {\n                  <span ui-badge variant=\"outline\" class=\"text-xs\">Optional</span>\n                }\n              </div>\n            </div>\n            <div ui-card-content class=\"space-y-3\">\n              @if (mediaUrl(); as url) {\n                <div\n                  class=\"border-border bg-muted/20 relative flex flex-col gap-3 rounded-lg border p-3 sm:flex-row sm:items-center sm:justify-between\"\n                >\n                  <div class=\"flex items-center gap-3\">\n                    <div class=\"border-border relative size-16 shrink-0 overflow-hidden rounded-md border\">\n                      <img [src]=\"url\" alt=\"Post attachment preview\" class=\"size-full object-cover\" />\n                    </div>\n                    <div class=\"space-y-1\">\n                      <div class=\"text-foreground text-xs font-semibold\">product-launch-graphic.png</div>\n                      <div class=\"text-muted-foreground text-xs\">1200 × 675 px · 284 KB</div>\n                      <span ui-badge variant=\"secondary\" class=\"text-xs\">16:9 Aspect</span>\n                    </div>\n                  </div>\n                  <div class=\"flex items-center gap-2\">\n                    <button\n                      ui-button\n                      variant=\"ghost\"\n                      size=\"sm\"\n                      class=\"text-destructive hover:text-destructive hover:bg-destructive/10\"\n                      (click)=\"removeMedia()\"\n                    >\n                      <lucide-icon [img]=\"Trash2\" class=\"mr-1.5 size-3.5\" />\n                      Remove\n                    </button>\n                  </div>\n                </div>\n              } @else {\n                <div\n                  class=\"border-border hover:border-primary/50 flex flex-col items-center justify-center rounded-lg border border-dashed p-6 text-center transition-colors\"\n                >\n                  <div class=\"bg-muted text-muted-foreground flex size-10 items-center justify-center rounded-full\">\n                    <lucide-icon [img]=\"UploadCloud\" class=\"size-5\" />\n                  </div>\n                  <p class=\"text-foreground mt-2 text-xs font-semibold\">Drag & drop media attachment</p>\n                  <p class=\"text-muted-foreground text-xs\">PNG, JPG, GIF or MP4 up to 25MB</p>\n                </div>\n              }\n              <div class=\"space-y-1.5 pt-1\">\n                <span class=\"text-muted-foreground text-xs font-medium\">Quick Sample Media:</span>\n                <div class=\"flex flex-wrap gap-2\">\n                  @for (sample of samples; track sample.id) {\n                    <button type=\"button\" [class]=\"sampleClass(sample.url)\" (click)=\"setPresetImage(sample.url)\">\n                      {{ sample.label }}\n                    </button>\n                  }\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <!-- Schedule Configuration Card -->\n          <div ui-card>\n            <div ui-card-header class=\"pb-3\">\n              <h3 ui-card-title class=\"text-base font-semibold\">Schedule Settings</h3>\n              <p ui-card-description class=\"text-xs\">Determine publish timing and automated amplification rules.</p>\n            </div>\n            <div ui-card-content class=\"space-y-4\">\n              <div class=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n                <div class=\"space-y-1.5\">\n                  <label class=\"text-foreground text-xs font-medium\">Publish Date</label>\n                  <ui-input\n                    [value]=\"scheduledDate()\"\n                    (valueChange)=\"scheduledDate.set($event)\"\n                    type=\"date\"\n                    class=\"text-xs\"\n                  />\n                </div>\n                <div class=\"space-y-1.5\">\n                  <label class=\"text-foreground text-xs font-medium\">Publish Time</label>\n                  <ui-input\n                    [value]=\"scheduledTime()\"\n                    (valueChange)=\"scheduledTime.set($event)\"\n                    placeholder=\"10:00 AM EST\"\n                    class=\"text-xs\"\n                  />\n                </div>\n              </div>\n              <div class=\"bg-primary/5 border-primary/20 flex items-start gap-2.5 rounded-lg border p-3 text-xs\">\n                <lucide-icon [img]=\"Clock\" class=\"text-primary mt-0.5 size-4 shrink-0\" />\n                <div class=\"space-y-1\">\n                  <span class=\"text-foreground font-semibold\">Optimal window: 10:00 AM EST</span>\n                  <p class=\"text-muted-foreground leading-relaxed\">\n                    Based on your audience timezone, posting between 09:30 AM – 10:30 AM EST generates +34% higher\n                    average CTR.\n                  </p>\n                  <div class=\"flex flex-wrap gap-1.5 pt-1\">\n                    @for (slot of slots; track slot) {\n                      <button type=\"button\" [class]=\"slotClass(slot)\" (click)=\"scheduledTime.set(slot)\">\n                        {{ slot }}\n                      </button>\n                    }\n                  </div>\n                </div>\n              </div>\n              <ui-separator />\n              <div class=\"space-y-3\">\n                <div class=\"flex items-center justify-between gap-2\">\n                  <div class=\"space-y-0.5\">\n                    <span class=\"text-foreground text-xs font-medium\">Auto-repost evergreen content</span>\n                    <p class=\"text-muted-foreground text-xs\">\n                      Reshuffle and repost to X & Threads after 24h if initial engagement crosses 100 interactions.\n                    </p>\n                  </div>\n                  <ui-switch\n                    [checked]=\"autoRepost()\"\n                    (checkedChange)=\"autoRepost.set($event)\"\n                    aria-label=\"Auto-repost evergreen content\"\n                  />\n                </div>\n                <div class=\"flex items-center justify-between gap-2\">\n                  <div class=\"space-y-0.5\">\n                    <span class=\"text-foreground text-xs font-medium\">Auto-append first comment / thread link</span>\n                    <p class=\"text-muted-foreground text-xs\">\n                      Places outbound GitHub & documentation links in the first comment to avoid algorithm penalty.\n                    </p>\n                  </div>\n                  <ui-switch\n                    [checked]=\"firstCommentThread()\"\n                    (checkedChange)=\"firstCommentThread.set($event)\"\n                    aria-label=\"Auto-append first comment\"\n                  />\n                </div>\n              </div>\n            </div>\n          </div>\n        </section>\n\n        <!-- Right Column: Live Social Feed Preview -->\n        <section class=\"space-y-4 lg:col-span-6\">\n          <div ui-card class=\"flex h-full flex-col\">\n            <div ui-card-header class=\"pb-3\">\n              <div class=\"flex items-center justify-between\">\n                <div class=\"flex items-center gap-2\">\n                  <h3 ui-card-title class=\"text-base font-semibold\">Live Social Feed Preview</h3>\n                  <span ui-badge variant=\"outline\" class=\"border-success/30 bg-success/10 text-success gap-1 text-xs\">\n                    <span class=\"bg-success size-1.5 animate-pulse rounded-full\"></span>\n                    Live Sync\n                  </span>\n                </div>\n                <span class=\"text-muted-foreground font-mono text-xs\">\n                  Scheduled: {{ scheduledDate() }} · {{ scheduledTime() }}\n                </span>\n              </div>\n              <p ui-card-description class=\"text-xs\">\n                Preview pixel-accurate mockups in authentic platform containers.\n              </p>\n            </div>\n\n            <div ui-card-content class=\"flex flex-1 flex-col space-y-4\">\n              <ui-tabs [value]=\"activeTab()\" (valueChange)=\"activeTab.set($event)\" class=\"w-full\">\n                <ui-tabs-list class=\"grid w-full grid-cols-4\">\n                  <button ui-tabs-trigger value=\"twitter\" class=\"gap-1.5 text-xs\">\n                    <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                      <path\n                        d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 24.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"\n                      />\n                    </svg>\n                    <span>X / Twitter</span>\n                  </button>\n                  <button ui-tabs-trigger value=\"linkedin\" class=\"gap-1.5 text-xs\">\n                    <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                      <path\n                        d=\"M19 3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14m-.5 15.5v-5.3a3.26 3.26 0 0 0-3.26-3.26c-.85 0-1.84.52-2.28 1.3v-1.11h-2.79v8.37h2.79v-4.93c0-.77.62-1.4 1.39-1.4a1.4 1.4 0 0 1 1.4 1.4v4.93h2.75M6.46 8.76a1.45 1.45 0 1 0 0-2.9 1.45 1.45 0 0 0 0 2.9m1.4 9.74v-8.37H5.06v8.37z\"\n                      />\n                    </svg>\n                    <span>LinkedIn</span>\n                  </button>\n                  <button ui-tabs-trigger value=\"instagram\" class=\"gap-1.5 text-xs\">\n                    <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                      <path\n                        d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z\"\n                      />\n                    </svg>\n                    <span>Instagram</span>\n                  </button>\n                  <button ui-tabs-trigger value=\"threads\" class=\"gap-1.5 text-xs\">\n                    <svg class=\"size-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n                      <path\n                        d=\"M12.186 24C5.454 24 0 18.618 0 12.016 0 5.414 5.454.032 12.186.032c6.64 0 11.966 5.228 12.004 11.758a12.08 12.08 0 0 1-3.69 8.643 11.85 11.85 0 0 1-8.314 3.567zm0-2.352a9.66 9.66 0 0 0 6.84-2.88 9.77 9.77 0 0 0 2.83-6.978c-.03-5.263-4.3-9.458-9.67-9.458-5.438 0-9.845 4.343-9.845 9.684 0 5.342 4.407 9.632 9.845 9.632z\"\n                      />\n                    </svg>\n                    <span>Threads</span>\n                  </button>\n                </ui-tabs-list>\n\n                <ui-tabs-content value=\"twitter\" class=\"mt-4\">\n                  <div class=\"border-border bg-card rounded-xl border p-4 shadow-xs\">\n                    <div class=\"flex items-start gap-3\">\n                      <ui-avatar class=\"size-10\">\n                        <ui-avatar-image [src]=\"profile.avatar\" [alt]=\"profile.name\" />\n                        <ui-avatar-fallback>{{ profile.initials }}</ui-avatar-fallback>\n                      </ui-avatar>\n                      <div class=\"flex-1 space-y-2\">\n                        <div class=\"flex items-center justify-between\">\n                          <div class=\"flex flex-wrap items-center gap-1.5\">\n                            <span class=\"text-foreground text-sm font-bold\">{{ profile.name }}</span>\n                            <svg class=\"fill-info text-info size-4 shrink-0\" viewBox=\"0 0 24 24\">\n                              <path\n                                fill-rule=\"evenodd\"\n                                clip-rule=\"evenodd\"\n                                d=\"M8.603 3.799A4.49 4.49 0 0112 2.25c1.357 0 2.573.6 3.397 1.549a4.49 4.49 0 013.498 1.307 4.491 4.491 0 011.307 3.497A4.49 4.49 0 0121.75 12a4.49 4.49 0 01-1.549 3.397 4.491 4.491 0 01-1.307 3.497 4.491 4.491 0 01-3.497 1.307A4.49 4.49 0 0112 21.75a4.49 4.49 0 01-3.397-1.549 4.49 4.49 0 01-3.498-1.306 4.491 4.491 0 01-1.307-3.498A4.49 4.49 0 012.25 12c0-1.357.6-2.573 1.549-3.397a4.49 4.49 0 011.307-3.497 4.49 4.49 0 013.497-1.307zm7.004 6.308a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\n                              />\n                            </svg>\n                            <span class=\"text-muted-foreground text-xs\">{{ profile.twitterHandle }}</span>\n                            <span class=\"text-muted-foreground text-xs\">· Scheduled</span>\n                          </div>\n                          <lucide-icon [img]=\"MoreHorizontal\" class=\"text-muted-foreground size-4\" />\n                        </div>\n                        <div class=\"text-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n                          @for (seg of segments(); track $index) {\n                            @if (seg.isHashtag) {\n                              <span class=\"text-info cursor-pointer font-normal hover:underline\">{{ seg.text }}</span>\n                            } @else {\n                              <span>{{ seg.text }}</span>\n                            }\n                          }\n                          @if (!content()) {\n                            <span class=\"text-muted-foreground italic\">Post body is empty...</span>\n                          }\n                        </div>\n                        @if (mediaUrl(); as url) {\n                          <div class=\"border-border mt-3 overflow-hidden rounded-2xl border\">\n                            <img [src]=\"url\" alt=\"Post preview image\" class=\"max-h-72 w-full object-cover\" />\n                          </div>\n                        }\n                        <div class=\"text-muted-foreground flex items-center gap-1.5 pt-1 text-xs\">\n                          <lucide-icon [img]=\"Clock\" class=\"size-3\" />\n                          <span>Will publish on {{ scheduledDate() }} at {{ scheduledTime() }}</span>\n                        </div>\n                        <ui-separator class=\"my-2\" />\n                        <div class=\"text-muted-foreground flex items-center justify-between text-xs\">\n                          <button\n                            type=\"button\"\n                            class=\"hover:text-info flex min-h-6 items-center gap-1.5 transition-colors\"\n                          >\n                            <lucide-icon [img]=\"MessageCircle\" class=\"size-4\" />\n                            <span>24</span>\n                          </button>\n                          <button\n                            type=\"button\"\n                            class=\"hover:text-success flex min-h-6 items-center gap-1.5 transition-colors\"\n                          >\n                            <lucide-icon [img]=\"Repeat2\" class=\"size-4\" />\n                            <span>12</span>\n                          </button>\n                          <button\n                            type=\"button\"\n                            class=\"hover:text-destructive flex min-h-6 items-center gap-1.5 transition-colors\"\n                            [class.text-destructive]=\"isLikedInPreview()\"\n                            (click)=\"toggleLike()\"\n                          >\n                            <lucide-icon [img]=\"Heart\" class=\"size-4\" [class.fill-destructive]=\"isLikedInPreview()\" />\n                            <span>{{ isLikedInPreview() ? 159 : 158 }}</span>\n                          </button>\n                          <button\n                            type=\"button\"\n                            class=\"hover:text-info flex min-h-6 items-center gap-1.5 transition-colors\"\n                          >\n                            <lucide-icon [img]=\"Eye\" class=\"size-4\" />\n                            <span>4.2K</span>\n                          </button>\n                          <div class=\"flex items-center gap-2\">\n                            <lucide-icon [img]=\"Bookmark\" class=\"hover:text-foreground size-4 cursor-pointer\" />\n                            <lucide-icon [img]=\"Share2\" class=\"hover:text-foreground size-4 cursor-pointer\" />\n                          </div>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </ui-tabs-content>\n\n                <ui-tabs-content value=\"linkedin\" class=\"mt-4\">\n                  <div class=\"border-border bg-card rounded-xl border p-4 shadow-xs\">\n                    <div class=\"flex items-start justify-between\">\n                      <div class=\"flex items-start gap-3\">\n                        <ui-avatar class=\"size-11\">\n                          <ui-avatar-image [src]=\"profile.avatar\" [alt]=\"profile.name\" />\n                          <ui-avatar-fallback>{{ profile.initials }}</ui-avatar-fallback>\n                        </ui-avatar>\n                        <div class=\"space-y-0.5\">\n                          <div class=\"flex items-center gap-1.5\">\n                            <span class=\"text-foreground text-sm font-semibold\">{{ profile.name }}</span>\n                            <span class=\"text-muted-foreground text-xs\">• 1st</span>\n                          </div>\n                          <p class=\"text-muted-foreground line-clamp-1 text-xs\">{{ profile.headline }}</p>\n                          <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                            <span>Scheduled ({{ scheduledDate() }})</span>\n                            <span>•</span>\n                            <lucide-icon [img]=\"Globe\" class=\"size-3\" />\n                          </div>\n                        </div>\n                      </div>\n                      <lucide-icon [img]=\"MoreHorizontal\" class=\"text-muted-foreground size-4\" />\n                    </div>\n                    <div class=\"text-foreground mt-3 text-sm leading-relaxed whitespace-pre-wrap\">\n                      @for (seg of segments(); track $index) {\n                        @if (seg.isHashtag) {\n                          <span class=\"text-info cursor-pointer font-medium hover:underline\">{{ seg.text }}</span>\n                        } @else {\n                          <span>{{ seg.text }}</span>\n                        }\n                      }\n                      @if (!content()) {\n                        <span class=\"text-muted-foreground italic\">Post body is empty...</span>\n                      }\n                    </div>\n                    @if (mediaUrl(); as url) {\n                      <div class=\"border-border mt-3 overflow-hidden rounded-lg border\">\n                        <img [src]=\"url\" alt=\"Post preview image\" class=\"max-h-72 w-full object-cover\" />\n                      </div>\n                    }\n                    <div class=\"text-muted-foreground flex items-center justify-between pt-3 text-xs\">\n                      <div class=\"flex items-center gap-1.5\">\n                        <div class=\"flex -space-x-1\">\n                          <span class=\"bg-info flex size-4 items-center justify-center rounded-full text-xs text-white\"\n                            >👍</span\n                          >\n                          <span\n                            class=\"bg-destructive flex size-4 items-center justify-center rounded-full text-xs text-white\"\n                            >❤️</span\n                          >\n                          <span\n                            class=\"bg-warning flex size-4 items-center justify-center rounded-full text-xs text-white\"\n                            >💡</span\n                          >\n                        </div>\n                        <span class=\"font-medium\">89</span>\n                      </div>\n                      <span>14 comments · 6 reposts</span>\n                    </div>\n                    <ui-separator class=\"my-2\" />\n                    <div class=\"text-muted-foreground grid grid-cols-4 gap-1 text-center text-xs font-medium\">\n                      <button\n                        type=\"button\"\n                        class=\"hover:bg-muted hover:text-foreground flex items-center justify-center gap-1.5 rounded-md py-2 transition-colors\"\n                        [class.text-info]=\"isLikedInPreview()\"\n                        [class.font-semibold]=\"isLikedInPreview()\"\n                        (click)=\"toggleLike()\"\n                      >\n                        <lucide-icon [img]=\"ThumbsUp\" class=\"size-4\" />\n                        <span>Like</span>\n                      </button>\n                      <button\n                        type=\"button\"\n                        class=\"hover:bg-muted hover:text-foreground flex items-center justify-center gap-1.5 rounded-md py-2 transition-colors\"\n                      >\n                        <lucide-icon [img]=\"MessageSquare\" class=\"size-4\" />\n                        <span>Comment</span>\n                      </button>\n                      <button\n                        type=\"button\"\n                        class=\"hover:bg-muted hover:text-foreground flex items-center justify-center gap-1.5 rounded-md py-2 transition-colors\"\n                      >\n                        <lucide-icon [img]=\"Repeat2\" class=\"size-4\" />\n                        <span>Repost</span>\n                      </button>\n                      <button\n                        type=\"button\"\n                        class=\"hover:bg-muted hover:text-foreground flex items-center justify-center gap-1.5 rounded-md py-2 transition-colors\"\n                      >\n                        <lucide-icon [img]=\"Send\" class=\"size-4\" />\n                        <span>Send</span>\n                      </button>\n                    </div>\n                  </div>\n                </ui-tabs-content>\n\n                <ui-tabs-content value=\"instagram\" class=\"mt-4\">\n                  <div class=\"border-border bg-card mx-auto max-w-md overflow-hidden rounded-xl border shadow-xs\">\n                    <div class=\"flex items-center justify-between p-3\">\n                      <div class=\"flex flex-wrap items-center gap-2.5\">\n                        <div class=\"rounded-full bg-gradient-to-tr from-amber-500 via-rose-500 to-purple-600 p-0.5\">\n                          <ui-avatar class=\"border-background size-8 border-2\">\n                            <ui-avatar-image [src]=\"profile.avatar\" [alt]=\"profile.name\" />\n                            <ui-avatar-fallback>{{ profile.initials }}</ui-avatar-fallback>\n                          </ui-avatar>\n                        </div>\n                        <div>\n                          <div class=\"text-foreground text-xs font-semibold\">{{ profile.instagramHandle }}</div>\n                          <div class=\"text-muted-foreground text-xs\">San Francisco, California</div>\n                        </div>\n                      </div>\n                      <lucide-icon [img]=\"MoreHorizontal\" class=\"text-muted-foreground size-4\" />\n                    </div>\n                    <div class=\"border-border/60 bg-muted/40 relative aspect-square w-full border-y\">\n                      @if (mediaUrl(); as url) {\n                        <img [src]=\"url\" alt=\"Instagram post preview\" class=\"size-full object-cover\" />\n                      } @else {\n                        <div\n                          class=\"text-muted-foreground flex size-full flex-col items-center justify-center gap-2 p-6 text-center\"\n                        >\n                          <lucide-icon [img]=\"ImageIcon\" class=\"size-10 stroke-[1.5]\" />\n                          <p class=\"text-xs\">Attach an image on the left to see Instagram photo preview</p>\n                        </div>\n                      }\n                    </div>\n                    <div class=\"space-y-2 p-3\">\n                      <div class=\"flex items-center justify-between\">\n                        <div class=\"flex items-center gap-3\">\n                          <lucide-icon\n                            [img]=\"Heart\"\n                            class=\"size-5 cursor-pointer transition-colors\"\n                            [class.fill-destructive]=\"isLikedInPreview()\"\n                            [class.text-destructive]=\"isLikedInPreview()\"\n                            [class.text-foreground]=\"!isLikedInPreview()\"\n                            (click)=\"toggleLike()\"\n                          />\n                          <lucide-icon\n                            [img]=\"MessageCircle\"\n                            class=\"text-foreground hover:text-muted-foreground size-5 cursor-pointer\"\n                          />\n                          <lucide-icon\n                            [img]=\"Send\"\n                            class=\"text-foreground hover:text-muted-foreground size-5 cursor-pointer\"\n                          />\n                        </div>\n                        <lucide-icon\n                          [img]=\"Bookmark\"\n                          class=\"text-foreground hover:text-muted-foreground size-5 cursor-pointer\"\n                        />\n                      </div>\n                      <div class=\"text-foreground text-xs font-semibold\">\n                        {{ isLikedInPreview() ? '343 likes' : '342 likes' }}\n                      </div>\n                      <div class=\"text-foreground text-xs leading-relaxed\">\n                        <span class=\"mr-1.5 font-semibold\">{{ profile.instagramHandle }}</span>\n                        @for (seg of segments(); track $index) {\n                          @if (seg.isHashtag) {\n                            <span class=\"text-info cursor-pointer font-medium hover:underline\">{{ seg.text }}</span>\n                          } @else {\n                            <span>{{ seg.text }}</span>\n                          }\n                        }\n                      </div>\n                      <div class=\"text-muted-foreground cursor-pointer text-xs\">View all 28 comments</div>\n                      <div class=\"text-muted-foreground text-xs tracking-wider uppercase\">\n                        SCHEDULED FOR {{ scheduledDate() }} · {{ scheduledTime() }}\n                      </div>\n                    </div>\n                  </div>\n                </ui-tabs-content>\n\n                <ui-tabs-content value=\"threads\" class=\"mt-4\">\n                  <div class=\"border-border bg-card rounded-xl border p-4 shadow-xs\">\n                    <div class=\"flex items-start gap-3\">\n                      <div class=\"flex flex-col items-center\">\n                        <ui-avatar class=\"size-10\">\n                          <ui-avatar-image [src]=\"profile.avatar\" [alt]=\"profile.name\" />\n                          <ui-avatar-fallback>{{ profile.initials }}</ui-avatar-fallback>\n                        </ui-avatar>\n                        <div class=\"bg-border mt-2 h-20 w-0.5 rounded-full\"></div>\n                      </div>\n                      <div class=\"flex-1 space-y-2\">\n                        <div class=\"flex items-center justify-between\">\n                          <div class=\"flex items-center gap-1.5\">\n                            <span class=\"text-foreground text-sm font-semibold\">{{ profile.threadsHandle }}</span>\n                            <svg class=\"fill-info text-info size-3.5 shrink-0\" viewBox=\"0 0 24 24\">\n                              <path\n                                fill-rule=\"evenodd\"\n                                clip-rule=\"evenodd\"\n                                d=\"M8.603 3.799A4.49 4.49 0 0112 2.25c1.357 0 2.573.6 3.397 1.549a4.49 4.49 0 013.498 1.307 4.491 4.491 0 011.307 3.497A4.49 4.49 0 0121.75 12a4.49 4.49 0 01-1.549 3.397 4.491 4.491 0 01-1.307 3.497 4.491 4.491 0 01-3.497 1.307A4.49 4.49 0 0112 21.75a4.49 4.49 0 01-3.397-1.549 4.49 4.49 0 01-3.498-1.306 4.491 4.491 0 01-1.307-3.498A4.49 4.49 0 012.25 12c0-1.357.6-2.573 1.549-3.397a4.49 4.49 0 011.307-3.497 4.49 4.49 0 013.497-1.307zm7.004 6.308a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\n                              />\n                            </svg>\n                            <span class=\"text-muted-foreground text-xs\">· Scheduled</span>\n                          </div>\n                          <lucide-icon [img]=\"MoreHorizontal\" class=\"text-muted-foreground size-4\" />\n                        </div>\n                        <div class=\"text-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n                          @for (seg of segments(); track $index) {\n                            @if (seg.isHashtag) {\n                              <span class=\"text-foreground cursor-pointer font-semibold hover:underline\">{{\n                                seg.text\n                              }}</span>\n                            } @else {\n                              <span>{{ seg.text }}</span>\n                            }\n                          }\n                          @if (!content()) {\n                            <span class=\"text-muted-foreground italic\">Post body is empty...</span>\n                          }\n                        </div>\n                        @if (mediaUrl(); as url) {\n                          <div class=\"border-border mt-3 overflow-hidden rounded-xl border\">\n                            <img [src]=\"url\" alt=\"Post preview image\" class=\"max-h-72 w-full object-cover\" />\n                          </div>\n                        }\n                        <div class=\"flex items-center gap-4 pt-2\">\n                          <lucide-icon\n                            [img]=\"Heart\"\n                            class=\"size-4 cursor-pointer transition-colors\"\n                            [class.fill-destructive]=\"isLikedInPreview()\"\n                            [class.text-destructive]=\"isLikedInPreview()\"\n                            [class.text-muted-foreground]=\"!isLikedInPreview()\"\n                            (click)=\"toggleLike()\"\n                          />\n                          <lucide-icon\n                            [img]=\"MessageCircle\"\n                            class=\"text-muted-foreground hover:text-foreground size-4 cursor-pointer\"\n                          />\n                          <lucide-icon\n                            [img]=\"Repeat2\"\n                            class=\"text-muted-foreground hover:text-foreground size-4 cursor-pointer\"\n                          />\n                          <lucide-icon\n                            [img]=\"Send\"\n                            class=\"text-muted-foreground hover:text-foreground size-4 cursor-pointer\"\n                          />\n                        </div>\n                        <div class=\"text-muted-foreground pt-1 text-xs\">48 replies · 312 likes</div>\n                      </div>\n                    </div>\n                  </div>\n                </ui-tabs-content>\n              </ui-tabs>\n            </div>\n\n            <div\n              ui-card-footer\n              class=\"border-border/60 text-muted-foreground flex items-center justify-between border-t pt-4 text-xs\"\n            >\n              <span>Synchronized with Buffer & Hootsuite OAuth queues</span>\n              <div class=\"flex items-center gap-1.5\">\n                <span class=\"bg-success size-2 rounded-full\"></span>\n                <span>4 channels ready</span>\n              </div>\n            </div>\n          </div>\n        </section>\n      </div>\n    </div>\n  `,\n})\nexport class UiSocialMediaPostSchedulerComponent {\n  protected readonly Bookmark = Bookmark\n  protected readonly Calendar = Calendar\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly Eye = Eye\n  protected readonly Globe = Globe\n  protected readonly Heart = Heart\n  protected readonly ImageIcon = ImageIcon\n  protected readonly MessageCircle = MessageCircle\n  protected readonly MessageSquare = MessageSquare\n  protected readonly MoreHorizontal = MoreHorizontal\n  protected readonly Repeat2 = Repeat2\n  protected readonly Send = Send\n  protected readonly Share2 = Share2\n  protected readonly Sparkles = Sparkles\n  protected readonly ThumbsUp = ThumbsUp\n  protected readonly Trash2 = Trash2\n  protected readonly UploadCloud = UploadCloud\n  protected readonly X = X\n\n  @Input() set initialContent(v: string | undefined) {\n    if (v !== undefined) this.content.set(v)\n  }\n  @Input() set initialChannels(v: string[] | undefined) {\n    if (v !== undefined) this.selectedChannels.set([...v])\n  }\n  @Input() set initialMediaUrl(v: string | undefined) {\n    if (v !== undefined) this.mediaUrl.set(v ?? null)\n  }\n  @Input() set initialDate(v: string | undefined) {\n    if (v !== undefined) this.scheduledDate.set(v)\n  }\n  @Input() set initialTime(v: string | undefined) {\n    if (v !== undefined) this.scheduledTime.set(v)\n  }\n  @Input() set initialAutoRepost(v: boolean | undefined) {\n    if (v !== undefined) this.autoRepost.set(!!v)\n  }\n\n  readonly content = signal(defaultContent)\n  readonly selectedChannels = signal<string[]>(['twitter', 'linkedin', 'instagram', 'threads'])\n  readonly activeTab = signal('twitter')\n  readonly mediaUrl = signal<string | null>(\n    'https://images.unsplash.com/photo-1551288049-bebda4e38f71?q=80&w=1200&auto=format&fit=crop',\n  )\n  readonly scheduledDate = signal('2026-08-25')\n  readonly scheduledTime = signal('10:00 AM EST')\n  readonly autoRepost = signal(true)\n  readonly firstCommentThread = signal(true)\n  readonly isLikedInPreview = signal(false)\n  readonly notificationMessage = signal<string | null>(null)\n  readonly notificationType = signal<'success' | 'draft'>('success')\n\n  readonly profile = author\n  readonly samples = sampleImages\n  readonly hashtags = suggestedHashtags\n  readonly emojis = quickEmojis\n  readonly slots = timeSlots\n\n  readonly currentLength = computed(() => this.content().length)\n  readonly currentPlatformLimit = computed(() => platformLimits[this.activeTab()]?.limit ?? 280)\n  readonly isOverLimit = computed(() => this.currentLength() > this.currentPlatformLimit())\n  readonly isWarningLimit = computed(\n    () => this.currentLength() > this.currentPlatformLimit() - 40 && !this.isOverLimit(),\n  )\n\n  readonly segments = computed(() => {\n    const text = this.content()\n    if (!text) return []\n    return text.split(/(\\s+)/).map((word) => ({\n      text: word,\n      isHashtag: word.startsWith('#') && word.length > 1,\n    }))\n  })\n\n  counterVariant(): 'destructive' | 'warning' | 'secondary' {\n    if (this.isOverLimit()) return 'destructive'\n    if (this.isWarningLimit()) return 'warning'\n    return 'secondary'\n  }\n\n  get notificationClass(): string {\n    return cn(\n      'flex items-center justify-between rounded-lg border p-3.5 text-sm shadow-xs transition-colors',\n      this.notificationType() === 'success'\n        ? 'border-success/30 bg-success/10 text-success'\n        : 'bg-primary/10 border-primary/20 text-primary',\n    )\n  }\n\n  channelClass(channelId: string, activeClasses: string): string {\n    return cn(\n      'group focus-visible:ring-ring relative flex flex-col items-start gap-1.5 rounded-lg border p-3 text-left transition-colors focus-visible:ring-2 focus-visible:outline-none',\n      this.isChannelSelected(channelId) ? activeClasses : 'border-border bg-card hover:bg-accent/50 opacity-65',\n    )\n  }\n\n  checkClass(channelId: string, activeClasses: string): string {\n    return cn(\n      'flex size-4 items-center justify-center rounded-full text-xs',\n      this.isChannelSelected(channelId) ? activeClasses : 'border-border border',\n    )\n  }\n\n  hashtagClass(tag: string): string {\n    return cn(\n      'focus-visible:ring-ring min-h-6 rounded-md border px-2 py-0.5 text-xs font-medium transition-colors focus-visible:ring-1 focus-visible:outline-none',\n      this.content().includes(tag)\n        ? 'border-primary/40 bg-primary/10 text-primary'\n        : 'border-border bg-card text-muted-foreground hover:border-foreground/30 hover:text-foreground',\n    )\n  }\n\n  sampleClass(url: string): string {\n    return cn(\n      'focus-visible:ring-ring min-h-6 rounded-md border px-2.5 py-1 text-xs font-medium transition-colors focus-visible:ring-1 focus-visible:outline-none',\n      this.mediaUrl() === url\n        ? 'border-primary bg-primary/10 text-primary'\n        : 'border-border bg-card text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  slotClass(slot: string): string {\n    return cn(\n      'focus-visible:ring-ring min-h-6 rounded border px-2 py-0.5 text-xs transition-colors focus-visible:ring-1 focus-visible:outline-none',\n      this.scheduledTime() === slot\n        ? 'border-primary bg-primary text-primary-foreground font-medium'\n        : 'border-border bg-card text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  toggleChannel(channelId: string): void {\n    this.selectedChannels.update((prev) => {\n      if (prev.includes(channelId)) {\n        if (prev.length > 1) return prev.filter((c) => c !== channelId)\n        return prev\n      }\n      return [...prev, channelId]\n    })\n  }\n\n  isChannelSelected(channelId: string): boolean {\n    return this.selectedChannels().includes(channelId)\n  }\n\n  insertHashtag(tag: string): void {\n    const current = this.content()\n    if (current.includes(tag)) return\n    this.content.set(!current.trim() ? tag : `${current.trim()} ${tag}`)\n  }\n\n  insertEmoji(emoji: string): void {\n    this.content.update((prev) => `${prev}${emoji}`)\n  }\n\n  polishWithAi(): void {\n    this.content.set(\n      '🚀 Excited to announce our newest UI component release! Built with zero-dependency headless primitives, fluid spring physics, and full OKLCH dark mode tokens.\\n\\nExplore the interactive playground & let us know your thoughts below! 👇\\n\\n#UI #Developer #OpenSource #DesignSystem',\n    )\n  }\n\n  setPresetImage(url: string): void {\n    this.mediaUrl.set(url)\n  }\n\n  removeMedia(): void {\n    this.mediaUrl.set(null)\n  }\n\n  saveDraft(): void {\n    this.notificationType.set('draft')\n    this.notificationMessage.set(\n      'Post draft saved locally. All changes, media attachments, and channel targets are up to date.',\n    )\n  }\n\n  schedulePost(): void {\n    this.notificationType.set('success')\n    this.notificationMessage.set(\n      `Post scheduled for ${this.scheduledDate()} at ${this.scheduledTime()} across ${this.selectedChannels().length} connected channels!`,\n    )\n  }\n\n  dismissNotification(): void {\n    this.notificationMessage.set(null)\n  }\n\n  toggleLike(): void {\n    this.isLikedInPreview.update((v) => !v)\n  }\n}\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/social-media-post-scheduler/social-media-post-scheduler.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/social-media-post-scheduler/index.ts",
      "content": "export { UiSocialMediaPostSchedulerComponent } from './social-media-post-scheduler.component'\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/social-media-post-scheduler/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/avatar.json",
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/input.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/switch.json",
    "https://uipkge.dev/r/angular/tabs.json",
    "https://uipkge.dev/r/angular/textarea.json"
  ],
  "description": "Multi-platform social media composer and post scheduler. Features channel toggles, rich text composer with emoji & hashtag insertion, character counter, media upload preview, scheduled time picker with best-time recommendations, auto-repost toggle, and high-fidelity live social feed previews for X (Twitter), LinkedIn, Instagram, and Threads.",
  "categories": [
    "marketing",
    "app"
  ]
}