@flamingo-stack/openframe-frontend-core 0.0.404 → 0.0.405-snapshot.20260711081601

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/{chunk-HBO2DMX4.js → chunk-3KZXOLFK.js} +3 -3
  2. package/dist/{chunk-RNKXG55J.js → chunk-6WMVBCNA.js} +4 -4
  3. package/dist/{chunk-A636Y7GU.js → chunk-7RVSGGO6.js} +5 -5
  4. package/dist/{chunk-YXOWUHGQ.js → chunk-AYFWYOL6.js} +6 -6
  5. package/dist/{chunk-GA5AN24T.cjs → chunk-BX3R44MR.cjs} +2 -2
  6. package/dist/chunk-BX3R44MR.cjs.map +1 -0
  7. package/dist/{chunk-GYFUGMNM.js → chunk-C3NPMZBI.js} +2 -2
  8. package/dist/{chunk-J4XR6YYZ.cjs → chunk-CCIBZ7TO.cjs} +10 -6
  9. package/dist/chunk-CCIBZ7TO.cjs.map +1 -0
  10. package/dist/{chunk-6MO5HF6P.cjs → chunk-CF3LBCNI.cjs} +32 -32
  11. package/dist/{chunk-6MO5HF6P.cjs.map → chunk-CF3LBCNI.cjs.map} +1 -1
  12. package/dist/{chunk-S4ZHBKGS.cjs → chunk-COERBDG4.cjs} +73 -73
  13. package/dist/{chunk-S4ZHBKGS.cjs.map → chunk-COERBDG4.cjs.map} +1 -1
  14. package/dist/{chunk-DH6HTYOV.js → chunk-E6YHDT3D.js} +6 -2
  15. package/dist/chunk-E6YHDT3D.js.map +1 -0
  16. package/dist/{chunk-OJ4HFM3I.cjs → chunk-GNS65HNC.cjs} +18 -18
  17. package/dist/{chunk-OJ4HFM3I.cjs.map → chunk-GNS65HNC.cjs.map} +1 -1
  18. package/dist/{chunk-G4YLKA7O.cjs → chunk-HJJXNMM7.cjs} +5 -5
  19. package/dist/{chunk-G4YLKA7O.cjs.map → chunk-HJJXNMM7.cjs.map} +1 -1
  20. package/dist/{chunk-TBXE5S6P.cjs → chunk-ISYVNPRT.cjs} +40 -40
  21. package/dist/{chunk-TBXE5S6P.cjs.map → chunk-ISYVNPRT.cjs.map} +1 -1
  22. package/dist/{chunk-CRUPO3MR.cjs → chunk-JAPP2F4M.cjs} +93 -93
  23. package/dist/{chunk-CRUPO3MR.cjs.map → chunk-JAPP2F4M.cjs.map} +1 -1
  24. package/dist/{chunk-G3QYCV63.cjs → chunk-LL4QQSAD.cjs} +500 -441
  25. package/dist/chunk-LL4QQSAD.cjs.map +1 -0
  26. package/dist/{chunk-YORONSXG.js → chunk-LSPBPUQM.js} +3 -3
  27. package/dist/{chunk-AMPQKNAX.js → chunk-OATWTTCI.js} +6 -6
  28. package/dist/{chunk-FFWIUNOT.cjs → chunk-P43ZHPM6.cjs} +40 -40
  29. package/dist/{chunk-FFWIUNOT.cjs.map → chunk-P43ZHPM6.cjs.map} +1 -1
  30. package/dist/{chunk-MTBFE3JF.js → chunk-PNJ5LMVK.js} +16 -2
  31. package/dist/chunk-PNJ5LMVK.js.map +1 -0
  32. package/dist/{chunk-R6SMQ2CO.js → chunk-PQN5R5II.js} +6 -6
  33. package/dist/{chunk-Q3AO2QWK.cjs → chunk-QAFRLO5N.cjs} +18 -4
  34. package/dist/chunk-QAFRLO5N.cjs.map +1 -0
  35. package/dist/{chunk-PFQQ5H6G.cjs → chunk-SF4G7M6U.cjs} +19 -19
  36. package/dist/{chunk-PFQQ5H6G.cjs.map → chunk-SF4G7M6U.cjs.map} +1 -1
  37. package/dist/{chunk-TTUQSOBL.js → chunk-SOK32D6C.js} +62 -3
  38. package/dist/chunk-SOK32D6C.js.map +1 -0
  39. package/dist/{chunk-5Z5GXXRU.js → chunk-TFDNJTBX.js} +4 -4
  40. package/dist/{chunk-QXAHXMPD.cjs → chunk-VANFD4FX.cjs} +12 -12
  41. package/dist/{chunk-QXAHXMPD.cjs.map → chunk-VANFD4FX.cjs.map} +1 -1
  42. package/dist/{chunk-KVB7SHXY.cjs → chunk-VIB4SGCD.cjs} +12 -12
  43. package/dist/{chunk-KVB7SHXY.cjs.map → chunk-VIB4SGCD.cjs.map} +1 -1
  44. package/dist/{chunk-M7LIGEAX.cjs → chunk-VZGU4BV6.cjs} +33 -33
  45. package/dist/{chunk-M7LIGEAX.cjs.map → chunk-VZGU4BV6.cjs.map} +1 -1
  46. package/dist/{chunk-HGKWTKW7.js → chunk-WJRPMULP.js} +2 -2
  47. package/dist/chunk-WJRPMULP.js.map +1 -0
  48. package/dist/{chunk-NOWXUQWF.js → chunk-XXG2Z2JT.js} +3 -3
  49. package/dist/{chunk-3I4IZYHM.js → chunk-ZVUR3A33.js} +3 -3
  50. package/dist/components/announcement-bar.d.ts +27 -1
  51. package/dist/components/announcement-bar.d.ts.map +1 -1
  52. package/dist/components/case-studies/index.cjs +10 -10
  53. package/dist/components/case-studies/index.js +4 -4
  54. package/dist/components/chat/index.cjs +4 -4
  55. package/dist/components/chat/index.js +3 -3
  56. package/dist/components/contact/index.cjs +5 -5
  57. package/dist/components/contact/index.js +4 -4
  58. package/dist/components/docs/index.cjs +7 -7
  59. package/dist/components/docs/index.js +6 -6
  60. package/dist/components/embeds/index.cjs +5 -5
  61. package/dist/components/embeds/index.js +4 -4
  62. package/dist/components/faq/index.cjs +6 -6
  63. package/dist/components/faq/index.js +5 -5
  64. package/dist/components/features/index.cjs +4 -4
  65. package/dist/components/features/index.js +3 -3
  66. package/dist/components/help-center-pages/index.cjs +23 -23
  67. package/dist/components/help-center-pages/index.js +14 -14
  68. package/dist/components/index.cjs +274 -299
  69. package/dist/components/index.cjs.map +1 -1
  70. package/dist/components/index.js +110 -135
  71. package/dist/components/index.js.map +1 -1
  72. package/dist/components/navigation/index.cjs +4 -4
  73. package/dist/components/navigation/index.js +3 -3
  74. package/dist/components/onboarding-guides/index.cjs +8 -8
  75. package/dist/components/onboarding-guides/index.js +7 -7
  76. package/dist/components/related-content/index.cjs +6 -6
  77. package/dist/components/related-content/index.js +5 -5
  78. package/dist/components/tickets/index.cjs +7 -7
  79. package/dist/components/tickets/index.js +6 -6
  80. package/dist/components/ui/file-manager/index.cjs +50 -50
  81. package/dist/components/ui/file-manager/index.js +1 -1
  82. package/dist/components/ui/index.cjs +4 -4
  83. package/dist/components/ui/index.js +3 -3
  84. package/dist/hooks/api-hooks.d.ts +0 -4
  85. package/dist/hooks/api-hooks.d.ts.map +1 -1
  86. package/dist/hooks/index.cjs +2 -2
  87. package/dist/hooks/index.js +1 -1
  88. package/dist/hooks/use-self-fetch.d.ts +7 -0
  89. package/dist/hooks/use-self-fetch.d.ts.map +1 -1
  90. package/dist/index.cjs +20 -4
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.js +19 -3
  93. package/dist/types/announcement.cjs +5 -0
  94. package/dist/types/announcement.cjs.map +1 -1
  95. package/dist/types/announcement.d.ts +37 -7
  96. package/dist/types/announcement.d.ts.map +1 -1
  97. package/dist/types/announcement.js +5 -1
  98. package/dist/types/announcement.js.map +1 -1
  99. package/dist/types/index.cjs +5 -0
  100. package/dist/types/index.cjs.map +1 -1
  101. package/dist/types/index.js +5 -1
  102. package/dist/types/index.js.map +1 -1
  103. package/dist/utils/announcement-storage.d.ts +39 -7
  104. package/dist/utils/announcement-storage.d.ts.map +1 -1
  105. package/dist/utils/app-config.d.ts.map +1 -1
  106. package/dist/utils/color-analysis.d.ts +13 -0
  107. package/dist/utils/color-analysis.d.ts.map +1 -1
  108. package/dist/utils/index.cjs +58 -1
  109. package/dist/utils/index.cjs.map +1 -1
  110. package/dist/utils/index.d.ts +1 -0
  111. package/dist/utils/index.d.ts.map +1 -1
  112. package/dist/utils/index.js +52 -2
  113. package/dist/utils/index.js.map +1 -1
  114. package/package.json +1 -1
  115. package/src/components/.announcement-bar.md +32 -30
  116. package/src/components/announcement-bar.tsx +227 -182
  117. package/src/components/features/video.tsx +8 -0
  118. package/src/components/ui/button/button.tsx +1 -1
  119. package/src/hooks/.api-hooks.md +1 -4
  120. package/src/hooks/api-hooks.ts +0 -7
  121. package/src/hooks/use-self-fetch.ts +29 -1
  122. package/src/stories/AnnouncementBar.stories.tsx +188 -152
  123. package/src/types/.announcement.md +2 -2
  124. package/src/types/announcement.ts +37 -7
  125. package/src/utils/.announcement-storage.md +19 -24
  126. package/src/utils/announcement-storage.ts +74 -28
  127. package/src/utils/app-config.ts +10 -1
  128. package/src/utils/color-analysis.ts +16 -1
  129. package/src/utils/index.ts +3 -0
  130. package/dist/chunk-DH6HTYOV.js.map +0 -1
  131. package/dist/chunk-G3QYCV63.cjs.map +0 -1
  132. package/dist/chunk-GA5AN24T.cjs.map +0 -1
  133. package/dist/chunk-HGKWTKW7.js.map +0 -1
  134. package/dist/chunk-J4XR6YYZ.cjs.map +0 -1
  135. package/dist/chunk-MTBFE3JF.js.map +0 -1
  136. package/dist/chunk-Q3AO2QWK.cjs.map +0 -1
  137. package/dist/chunk-TTUQSOBL.js.map +0 -1
  138. /package/dist/{chunk-HBO2DMX4.js.map → chunk-3KZXOLFK.js.map} +0 -0
  139. /package/dist/{chunk-RNKXG55J.js.map → chunk-6WMVBCNA.js.map} +0 -0
  140. /package/dist/{chunk-A636Y7GU.js.map → chunk-7RVSGGO6.js.map} +0 -0
  141. /package/dist/{chunk-YXOWUHGQ.js.map → chunk-AYFWYOL6.js.map} +0 -0
  142. /package/dist/{chunk-GYFUGMNM.js.map → chunk-C3NPMZBI.js.map} +0 -0
  143. /package/dist/{chunk-YORONSXG.js.map → chunk-LSPBPUQM.js.map} +0 -0
  144. /package/dist/{chunk-AMPQKNAX.js.map → chunk-OATWTTCI.js.map} +0 -0
  145. /package/dist/{chunk-R6SMQ2CO.js.map → chunk-PQN5R5II.js.map} +0 -0
  146. /package/dist/{chunk-5Z5GXXRU.js.map → chunk-TFDNJTBX.js.map} +0 -0
  147. /package/dist/{chunk-NOWXUQWF.js.map → chunk-XXG2Z2JT.js.map} +0 -0
  148. /package/dist/{chunk-3I4IZYHM.js.map → chunk-ZVUR3A33.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/announcement.ts"],"names":[],"mappings":";;;AAqQO,IAAM,mBAAA,GAAiC;AAAA;AAAA,EAE5C,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,gBAAA,EAAkB,WAAW,IAAA,EAAY;AAAA;AAAA,EAG1E,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,WAAW,IAAA,EAAY;AAAA,EACtE,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAiB,WAAW,IAAA,EAAY;AAAA;AAAA,EAGxE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,WAAW,IAAA,EAAY;AAAA,EAChE,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,WAAW,IAAA,EAAY;AAAA,EAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAW,IAAA,EAAY;AAAA,EAC1D,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,WAAW,IAAA;AAClD","file":"announcement.cjs","sourcesContent":["// Announcement system TypeScript types\nimport type { LegacyPlatform, PlatformFilter, PlatformRecord } from './platform';\n\n// For backward compatibility, maintain the old Platform type temporarily\n// Database Models\nexport interface Announcement {\n id: string;\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platform_id: string; // Foreign key to platforms table\n platform?: PlatformRecord; // Joined platform data\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n // Custom CTA button colors (hex codes like #FFFFFF). Optional.\n cta_button_background_color?: string | null;\n cta_button_text_color?: string | null;\n /** Additional props to spread onto the CTA icon component */\n cta_icon_props?: Record<string, any>;\n created_at: string;\n updated_at: string;\n created_by?: string;\n created_by_user?: {\n id: string;\n email: string;\n full_name?: string;\n };\n announcement_assets?: AnnouncementAsset[];\n}\n\nexport interface AnnouncementAsset {\n id: string;\n announcement_id: string;\n file_name: string;\n file_url: string;\n file_size: number;\n mime_type: string;\n upload_path: string;\n created_at: string;\n}\n\n// API Request/Response Types\nexport interface CreateAnnouncementData {\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n created_by: string;\n}\n\nexport interface UpdateAnnouncementData {\n title?: string;\n description?: string;\n background_color?: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n}\n\nexport interface AnnouncementListResponse {\n announcements: Announcement[];\n pagination: {\n page: number;\n page_size: number;\n total_count: number;\n total_pages: number;\n };\n filters?: {\n platform?: LegacyPlatform;\n is_active?: boolean;\n };\n}\n\nexport interface AnnouncementResponse {\n announcement: Announcement;\n}\n\n// Form Data Types\nexport interface AnnouncementFormData {\n title: string;\n description: string;\n background_color: string;\n icon_name: string;\n icon_url?: string;\n platforms: string[]; // entity_platforms set (multi-select; no single platform_id)\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled: boolean;\n cta_text: string;\n cta_icon_name: string;\n cta_show_icon: boolean;\n cta_url: string;\n cta_target: '_self' | '_blank';\n // New CTA button custom colors\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: string; // JSON string in form\n /** Extra props for the main bar/icon */\n icon_props?: string;\n}\n\n// API Query Parameters\nexport interface GetAnnouncementsOptions {\n platform?: PlatformFilter; // Changed from Platform to PlatformFilter to include 'all'\n is_active?: boolean;\n page?: number;\n pageSize?: number;\n sortBy?: 'created_at' | 'updated_at' | 'title';\n sortOrder?: 'asc' | 'desc';\n}\n\n// File Upload Types\nexport interface IconUploadResponse {\n success: boolean;\n file_url?: string;\n file_name?: string;\n file_size?: number;\n error?: string;\n}\n\nexport interface IconUploadData {\n file: File;\n announcement_id?: string;\n}\n\n// Available SVG Icons (extend as needed)\nexport interface AvailableSvgIcon {\n name: string;\n display_name: string;\n component_name: string;\n}\n\n// Error Types\nexport interface AnnouncementError {\n code: string;\n message: string;\n details?: string;\n}\n\n// Validation Types\nexport interface AnnouncementValidation {\n title: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n description: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n background_color: {\n required: boolean;\n pattern: RegExp;\n };\n icon_name: {\n required: boolean;\n validOptions: string[];\n };\n platform: {\n required: boolean;\n validOptions: LegacyPlatform[];\n };\n}\n\n// Import unified platform configuration (removed duplicate definition)\nexport type { PlatformConfig } from './platform';\n\n// Admin Dashboard Types\nexport interface AnnouncementStats {\n total_announcements: number;\n active_announcements: number;\n announcements_by_platform: Record<LegacyPlatform, number>;\n recent_announcements: Announcement[];\n}\n\n// Component Props Types\nexport interface AnnouncementBarProps {\n announcement?: Announcement;\n onDismiss?: (announcementId: string) => void;\n className?: string;\n}\n\nexport interface AnnouncementFormProps {\n announcement?: Announcement;\n onSubmit: (data: AnnouncementFormData) => Promise<void>;\n onCancel: () => void;\n isLoading?: boolean;\n availableIcons: AvailableSvgIcon[];\n}\n\nexport interface AnnouncementListProps {\n announcements: Announcement[];\n onEdit: (announcement: Announcement) => void;\n onDelete: (announcementId: string) => void;\n onToggleActive: (announcementId: string, isActive: boolean) => void;\n isLoading?: boolean;\n}\n\n// Database Utility Types\nexport interface AnnouncementFilters {\n platform?: LegacyPlatform;\n is_active?: boolean;\n created_by?: string;\n search?: string;\n}\n\nexport interface AnnouncementSortOptions {\n field: 'created_at' | 'updated_at' | 'title' | 'platform';\n direction: 'asc' | 'desc';\n}\n\n// SVG Icon Type\nexport interface SvgIcon {\n name: string;\n label: string;\n component: any;\n}\n\n// Platform display configuration\n// PLATFORM_CONFIGS removed - all platform data now comes from database via getPlatformsConfig()\n\n// Available SVG icons configuration\nexport const AVAILABLE_SVG_ICONS: SvgIcon[] = [\n // OpenFrame Logo Options\n { name: 'openframe-logo', label: 'OpenFrame Logo', component: null as any },\n \n // Platform Logos\n { name: 'openmsp-logo', label: 'OpenMSP Logo', component: null as any },\n { name: 'flamingo-logo', label: 'Flamingo Logo', component: null as any },\n \n // Lucide Icons\n { name: 'megaphone', label: 'Megaphone', component: null as any },\n { name: 'bell', label: 'Bell', component: null as any },\n { name: 'info', label: 'Information', component: null as any },\n { name: 'star', label: 'Star', component: null as any },\n { name: 'rocket', label: 'Rocket', component: null as any },\n { name: 'package', label: 'Package', component: null as any }\n]; "]}
1
+ {"version":3,"sources":["../../src/types/announcement.ts"],"names":[],"mappings":";;;AA8HO,IAAM,yBAAA,GAA4B;AAAA,EACvC,UAAA,EAAY,SAAA;AAAA,EACZ,IAAA,EAAM;AACR;AAkKO,IAAM,mBAAA,GAAiC;AAAA;AAAA,EAE5C,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,gBAAA,EAAkB,WAAW,IAAA,EAAY;AAAA;AAAA,EAG1E,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,WAAW,IAAA,EAAY;AAAA,EACtE,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAiB,WAAW,IAAA,EAAY;AAAA;AAAA,EAGxE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,WAAW,IAAA,EAAY;AAAA,EAChE,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,WAAW,IAAA,EAAY;AAAA,EAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAW,IAAA,EAAY;AAAA,EAC1D,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,WAAW,IAAA;AAClD","file":"announcement.cjs","sourcesContent":["// Announcement system TypeScript types\nimport type { LegacyPlatform, PlatformFilter } from './platform';\nimport type { EntityPlatformAssoc } from './entity-platform';\n\n// Database Models\nexport interface Announcement {\n id: string;\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n /** Hydrated entity_platforms associations (featured-first) what the hub\n * DAL's attachPlatformsToRow(s) emits. No singular platform/platform_id. */\n announcement_platforms?: EntityPlatformAssoc[];\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n // Custom CTA button colors (hex codes like #FFFFFF). Optional.\n cta_button_background_color?: string | null;\n cta_button_text_color?: string | null;\n /** Additional props to spread onto the CTA icon component */\n cta_icon_props?: Record<string, any>;\n created_at: string;\n updated_at: string;\n created_by?: string;\n created_by_user?: {\n id: string;\n email: string;\n full_name?: string;\n };\n announcement_assets?: AnnouncementAsset[];\n}\n\nexport interface AnnouncementAsset {\n id: string;\n announcement_id: string;\n file_name: string;\n file_url: string;\n file_size: number;\n mime_type: string;\n upload_path: string;\n created_at: string;\n}\n\n// API Request/Response Types\nexport interface CreateAnnouncementData {\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n created_by: string;\n}\n\nexport interface UpdateAnnouncementData {\n title?: string;\n description?: string;\n background_color?: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n}\n\nexport interface AnnouncementListResponse {\n announcements: Announcement[];\n pagination: {\n page: number;\n page_size: number;\n total_count: number;\n total_pages: number;\n };\n filters?: {\n platform?: LegacyPlatform;\n is_active?: boolean;\n };\n}\n\n/**\n * Wire shape of GET /api/announcements/active — the single typed home for the\n * `{ announcement }` envelope (hub route return + AnnouncementBar's\n * useSelfFetch generic). `null` when no active announcement exists.\n */\nexport interface AnnouncementResponse {\n announcement: Announcement | null;\n}\n\n/**\n * Default CTA button colors — one home for the pair the DAL create/update\n * defaults and the admin form both reference. Announcement colors are\n * admin-chosen data (not ODS-token surfaces) by design.\n */\nexport const ANNOUNCEMENT_CTA_DEFAULTS = {\n background: '#1A1A1A',\n text: '#FAFAFA',\n} as const;\n\n// Form Data Types\nexport interface AnnouncementFormData {\n title: string;\n description: string;\n background_color: string;\n icon_name: string;\n icon_url?: string;\n platforms: string[]; // entity_platforms set (multi-select; no single platform_id)\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled: boolean;\n cta_text: string;\n cta_icon_name: string;\n cta_show_icon: boolean;\n cta_url: string;\n cta_target: '_self' | '_blank';\n // New CTA button custom colors\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: string; // JSON string in form\n /** Extra props for the main bar/icon */\n icon_props?: string;\n}\n\n// API Query Parameters\nexport interface GetAnnouncementsOptions {\n platform?: PlatformFilter; // Changed from Platform to PlatformFilter to include 'all'\n is_active?: boolean;\n page?: number;\n pageSize?: number;\n sortBy?: 'created_at' | 'updated_at' | 'title';\n sortOrder?: 'asc' | 'desc';\n}\n\n// File Upload Types\nexport interface IconUploadResponse {\n success: boolean;\n file_url?: string;\n file_name?: string;\n file_size?: number;\n error?: string;\n}\n\nexport interface IconUploadData {\n file: File;\n announcement_id?: string;\n}\n\n// Available SVG Icons (extend as needed)\nexport interface AvailableSvgIcon {\n name: string;\n display_name: string;\n component_name: string;\n}\n\n// Error Types\nexport interface AnnouncementError {\n code: string;\n message: string;\n details?: string;\n}\n\n// Validation Types\nexport interface AnnouncementValidation {\n title: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n description: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n background_color: {\n required: boolean;\n pattern: RegExp;\n };\n icon_name: {\n required: boolean;\n validOptions: string[];\n };\n platform: {\n required: boolean;\n validOptions: LegacyPlatform[];\n };\n}\n\n// Import unified platform configuration (removed duplicate definition)\nexport type { PlatformConfig } from './platform';\n\n// Admin Dashboard Types\nexport interface AnnouncementStats {\n total_announcements: number;\n active_announcements: number;\n announcements_by_platform: Record<LegacyPlatform, number>;\n recent_announcements: Announcement[];\n}\n\n// Component Props Types\nexport interface AnnouncementBarProps {\n /**\n * SSR mode seed. `null` = the server resolved \"nothing to show\" (no active\n * announcement, or dismissed via cookie) — seeds the fetch hook and skips\n * the mount fetch. Absent (`undefined`) = client-only mode: the bar\n * self-fetches on mount from the EndpointsRuntime provider's\n * `announcementsUrl` (see react-embedding-example — no per-component URL\n * or platform knobs; the server resolves its own platform via\n * currentPlatform()).\n */\n initialAnnouncement?: Announcement | null;\n /**\n * Render-only mode for the admin live preview: no fetch/revalidation, inert\n * dismiss button, and no storage side effects (never writes dismissal\n * cookies or touches localStorage).\n */\n previewMode?: boolean;\n className?: string;\n}\n\nexport interface AnnouncementFormProps {\n announcement?: Announcement;\n onSubmit: (data: AnnouncementFormData) => Promise<void>;\n onCancel: () => void;\n isLoading?: boolean;\n availableIcons: AvailableSvgIcon[];\n}\n\nexport interface AnnouncementListProps {\n announcements: Announcement[];\n onEdit: (announcement: Announcement) => void;\n onDelete: (announcementId: string) => void;\n onToggleActive: (announcementId: string, isActive: boolean) => void;\n isLoading?: boolean;\n}\n\n// Database Utility Types\nexport interface AnnouncementFilters {\n platform?: LegacyPlatform;\n is_active?: boolean;\n created_by?: string;\n search?: string;\n}\n\nexport interface AnnouncementSortOptions {\n field: 'created_at' | 'updated_at' | 'title' | 'platform';\n direction: 'asc' | 'desc';\n}\n\n// SVG Icon Type\nexport interface SvgIcon {\n name: string;\n label: string;\n component: any;\n}\n\n// Platform display configuration\n// PLATFORM_CONFIGS removed - all platform data now comes from database via getPlatformsConfig()\n\n// Available SVG icons configuration\nexport const AVAILABLE_SVG_ICONS: SvgIcon[] = [\n // OpenFrame Logo Options\n { name: 'openframe-logo', label: 'OpenFrame Logo', component: null as any },\n \n // Platform Logos\n { name: 'openmsp-logo', label: 'OpenMSP Logo', component: null as any },\n { name: 'flamingo-logo', label: 'Flamingo Logo', component: null as any },\n \n // Lucide Icons\n { name: 'megaphone', label: 'Megaphone', component: null as any },\n { name: 'bell', label: 'Bell', component: null as any },\n { name: 'info', label: 'Information', component: null as any },\n { name: 'star', label: 'Star', component: null as any },\n { name: 'rocket', label: 'Rocket', component: null as any },\n { name: 'package', label: 'Package', component: null as any }\n]; "]}
@@ -1,4 +1,5 @@
1
- import type { LegacyPlatform, PlatformFilter, PlatformRecord } from './platform';
1
+ import type { LegacyPlatform, PlatformFilter } from './platform';
2
+ import type { EntityPlatformAssoc } from './entity-platform';
2
3
  export interface Announcement {
3
4
  id: string;
4
5
  title: string;
@@ -8,8 +9,9 @@ export interface Announcement {
8
9
  icon_url?: string;
9
10
  /** Extra props for the main bar/icon */
10
11
  icon_props?: Record<string, any>;
11
- platform_id: string;
12
- platform?: PlatformRecord;
12
+ /** Hydrated entity_platforms associations (featured-first) — what the hub
13
+ * DAL's attachPlatformsToRow(s) emits. No singular platform/platform_id. */
14
+ announcement_platforms?: EntityPlatformAssoc[];
13
15
  is_active: boolean;
14
16
  cta_enabled?: boolean;
15
17
  cta_text?: string;
@@ -95,9 +97,23 @@ export interface AnnouncementListResponse {
95
97
  is_active?: boolean;
96
98
  };
97
99
  }
100
+ /**
101
+ * Wire shape of GET /api/announcements/active — the single typed home for the
102
+ * `{ announcement }` envelope (hub route return + AnnouncementBar's
103
+ * useSelfFetch generic). `null` when no active announcement exists.
104
+ */
98
105
  export interface AnnouncementResponse {
99
- announcement: Announcement;
100
- }
106
+ announcement: Announcement | null;
107
+ }
108
+ /**
109
+ * Default CTA button colors — one home for the pair the DAL create/update
110
+ * defaults and the admin form both reference. Announcement colors are
111
+ * admin-chosen data (not ODS-token surfaces) by design.
112
+ */
113
+ export declare const ANNOUNCEMENT_CTA_DEFAULTS: {
114
+ readonly background: "#1A1A1A";
115
+ readonly text: "#FAFAFA";
116
+ };
101
117
  export interface AnnouncementFormData {
102
118
  title: string;
103
119
  description: string;
@@ -179,8 +195,22 @@ export interface AnnouncementStats {
179
195
  recent_announcements: Announcement[];
180
196
  }
181
197
  export interface AnnouncementBarProps {
182
- announcement?: Announcement;
183
- onDismiss?: (announcementId: string) => void;
198
+ /**
199
+ * SSR mode seed. `null` = the server resolved "nothing to show" (no active
200
+ * announcement, or dismissed via cookie) — seeds the fetch hook and skips
201
+ * the mount fetch. Absent (`undefined`) = client-only mode: the bar
202
+ * self-fetches on mount from the EndpointsRuntime provider's
203
+ * `announcementsUrl` (see react-embedding-example — no per-component URL
204
+ * or platform knobs; the server resolves its own platform via
205
+ * currentPlatform()).
206
+ */
207
+ initialAnnouncement?: Announcement | null;
208
+ /**
209
+ * Render-only mode for the admin live preview: no fetch/revalidation, inert
210
+ * dismiss button, and no storage side effects (never writes dismissal
211
+ * cookies or touches localStorage).
212
+ */
213
+ previewMode?: boolean;
184
214
  className?: string;
185
215
  }
186
216
  export interface AnnouncementFormProps {
@@ -1 +1 @@
1
- {"version":3,"file":"announcement.d.ts","sourceRoot":"","sources":["../../src/types/announcement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"announcement.d.ts","sourceRoot":"","sources":["../../src/types/announcement.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
1
  // src/types/announcement.ts
2
+ var ANNOUNCEMENT_CTA_DEFAULTS = {
3
+ background: "#1A1A1A",
4
+ text: "#FAFAFA"
5
+ };
2
6
  var AVAILABLE_SVG_ICONS = [
3
7
  // OpenFrame Logo Options
4
8
  { name: "openframe-logo", label: "OpenFrame Logo", component: null },
@@ -14,6 +18,6 @@ var AVAILABLE_SVG_ICONS = [
14
18
  { name: "package", label: "Package", component: null }
15
19
  ];
16
20
 
17
- export { AVAILABLE_SVG_ICONS };
21
+ export { ANNOUNCEMENT_CTA_DEFAULTS, AVAILABLE_SVG_ICONS };
18
22
  //# sourceMappingURL=announcement.js.map
19
23
  //# sourceMappingURL=announcement.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/announcement.ts"],"names":[],"mappings":";AAqQO,IAAM,mBAAA,GAAiC;AAAA;AAAA,EAE5C,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,gBAAA,EAAkB,WAAW,IAAA,EAAY;AAAA;AAAA,EAG1E,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,WAAW,IAAA,EAAY;AAAA,EACtE,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAiB,WAAW,IAAA,EAAY;AAAA;AAAA,EAGxE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,WAAW,IAAA,EAAY;AAAA,EAChE,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,WAAW,IAAA,EAAY;AAAA,EAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAW,IAAA,EAAY;AAAA,EAC1D,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,WAAW,IAAA;AAClD","file":"announcement.js","sourcesContent":["// Announcement system TypeScript types\nimport type { LegacyPlatform, PlatformFilter, PlatformRecord } from './platform';\n\n// For backward compatibility, maintain the old Platform type temporarily\n// Database Models\nexport interface Announcement {\n id: string;\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platform_id: string; // Foreign key to platforms table\n platform?: PlatformRecord; // Joined platform data\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n // Custom CTA button colors (hex codes like #FFFFFF). Optional.\n cta_button_background_color?: string | null;\n cta_button_text_color?: string | null;\n /** Additional props to spread onto the CTA icon component */\n cta_icon_props?: Record<string, any>;\n created_at: string;\n updated_at: string;\n created_by?: string;\n created_by_user?: {\n id: string;\n email: string;\n full_name?: string;\n };\n announcement_assets?: AnnouncementAsset[];\n}\n\nexport interface AnnouncementAsset {\n id: string;\n announcement_id: string;\n file_name: string;\n file_url: string;\n file_size: number;\n mime_type: string;\n upload_path: string;\n created_at: string;\n}\n\n// API Request/Response Types\nexport interface CreateAnnouncementData {\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n created_by: string;\n}\n\nexport interface UpdateAnnouncementData {\n title?: string;\n description?: string;\n background_color?: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n}\n\nexport interface AnnouncementListResponse {\n announcements: Announcement[];\n pagination: {\n page: number;\n page_size: number;\n total_count: number;\n total_pages: number;\n };\n filters?: {\n platform?: LegacyPlatform;\n is_active?: boolean;\n };\n}\n\nexport interface AnnouncementResponse {\n announcement: Announcement;\n}\n\n// Form Data Types\nexport interface AnnouncementFormData {\n title: string;\n description: string;\n background_color: string;\n icon_name: string;\n icon_url?: string;\n platforms: string[]; // entity_platforms set (multi-select; no single platform_id)\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled: boolean;\n cta_text: string;\n cta_icon_name: string;\n cta_show_icon: boolean;\n cta_url: string;\n cta_target: '_self' | '_blank';\n // New CTA button custom colors\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: string; // JSON string in form\n /** Extra props for the main bar/icon */\n icon_props?: string;\n}\n\n// API Query Parameters\nexport interface GetAnnouncementsOptions {\n platform?: PlatformFilter; // Changed from Platform to PlatformFilter to include 'all'\n is_active?: boolean;\n page?: number;\n pageSize?: number;\n sortBy?: 'created_at' | 'updated_at' | 'title';\n sortOrder?: 'asc' | 'desc';\n}\n\n// File Upload Types\nexport interface IconUploadResponse {\n success: boolean;\n file_url?: string;\n file_name?: string;\n file_size?: number;\n error?: string;\n}\n\nexport interface IconUploadData {\n file: File;\n announcement_id?: string;\n}\n\n// Available SVG Icons (extend as needed)\nexport interface AvailableSvgIcon {\n name: string;\n display_name: string;\n component_name: string;\n}\n\n// Error Types\nexport interface AnnouncementError {\n code: string;\n message: string;\n details?: string;\n}\n\n// Validation Types\nexport interface AnnouncementValidation {\n title: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n description: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n background_color: {\n required: boolean;\n pattern: RegExp;\n };\n icon_name: {\n required: boolean;\n validOptions: string[];\n };\n platform: {\n required: boolean;\n validOptions: LegacyPlatform[];\n };\n}\n\n// Import unified platform configuration (removed duplicate definition)\nexport type { PlatformConfig } from './platform';\n\n// Admin Dashboard Types\nexport interface AnnouncementStats {\n total_announcements: number;\n active_announcements: number;\n announcements_by_platform: Record<LegacyPlatform, number>;\n recent_announcements: Announcement[];\n}\n\n// Component Props Types\nexport interface AnnouncementBarProps {\n announcement?: Announcement;\n onDismiss?: (announcementId: string) => void;\n className?: string;\n}\n\nexport interface AnnouncementFormProps {\n announcement?: Announcement;\n onSubmit: (data: AnnouncementFormData) => Promise<void>;\n onCancel: () => void;\n isLoading?: boolean;\n availableIcons: AvailableSvgIcon[];\n}\n\nexport interface AnnouncementListProps {\n announcements: Announcement[];\n onEdit: (announcement: Announcement) => void;\n onDelete: (announcementId: string) => void;\n onToggleActive: (announcementId: string, isActive: boolean) => void;\n isLoading?: boolean;\n}\n\n// Database Utility Types\nexport interface AnnouncementFilters {\n platform?: LegacyPlatform;\n is_active?: boolean;\n created_by?: string;\n search?: string;\n}\n\nexport interface AnnouncementSortOptions {\n field: 'created_at' | 'updated_at' | 'title' | 'platform';\n direction: 'asc' | 'desc';\n}\n\n// SVG Icon Type\nexport interface SvgIcon {\n name: string;\n label: string;\n component: any;\n}\n\n// Platform display configuration\n// PLATFORM_CONFIGS removed - all platform data now comes from database via getPlatformsConfig()\n\n// Available SVG icons configuration\nexport const AVAILABLE_SVG_ICONS: SvgIcon[] = [\n // OpenFrame Logo Options\n { name: 'openframe-logo', label: 'OpenFrame Logo', component: null as any },\n \n // Platform Logos\n { name: 'openmsp-logo', label: 'OpenMSP Logo', component: null as any },\n { name: 'flamingo-logo', label: 'Flamingo Logo', component: null as any },\n \n // Lucide Icons\n { name: 'megaphone', label: 'Megaphone', component: null as any },\n { name: 'bell', label: 'Bell', component: null as any },\n { name: 'info', label: 'Information', component: null as any },\n { name: 'star', label: 'Star', component: null as any },\n { name: 'rocket', label: 'Rocket', component: null as any },\n { name: 'package', label: 'Package', component: null as any }\n]; "]}
1
+ {"version":3,"sources":["../../src/types/announcement.ts"],"names":[],"mappings":";AA8HO,IAAM,yBAAA,GAA4B;AAAA,EACvC,UAAA,EAAY,SAAA;AAAA,EACZ,IAAA,EAAM;AACR;AAkKO,IAAM,mBAAA,GAAiC;AAAA;AAAA,EAE5C,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,gBAAA,EAAkB,WAAW,IAAA,EAAY;AAAA;AAAA,EAG1E,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,WAAW,IAAA,EAAY;AAAA,EACtE,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAiB,WAAW,IAAA,EAAY;AAAA;AAAA,EAGxE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,WAAW,IAAA,EAAY;AAAA,EAChE,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,WAAW,IAAA,EAAY;AAAA,EAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAW,IAAA,EAAY;AAAA,EAC1D,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,WAAW,IAAA;AAClD","file":"announcement.js","sourcesContent":["// Announcement system TypeScript types\nimport type { LegacyPlatform, PlatformFilter } from './platform';\nimport type { EntityPlatformAssoc } from './entity-platform';\n\n// Database Models\nexport interface Announcement {\n id: string;\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n /** Hydrated entity_platforms associations (featured-first) what the hub\n * DAL's attachPlatformsToRow(s) emits. No singular platform/platform_id. */\n announcement_platforms?: EntityPlatformAssoc[];\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n // Custom CTA button colors (hex codes like #FFFFFF). Optional.\n cta_button_background_color?: string | null;\n cta_button_text_color?: string | null;\n /** Additional props to spread onto the CTA icon component */\n cta_icon_props?: Record<string, any>;\n created_at: string;\n updated_at: string;\n created_by?: string;\n created_by_user?: {\n id: string;\n email: string;\n full_name?: string;\n };\n announcement_assets?: AnnouncementAsset[];\n}\n\nexport interface AnnouncementAsset {\n id: string;\n announcement_id: string;\n file_name: string;\n file_url: string;\n file_size: number;\n mime_type: string;\n upload_path: string;\n created_at: string;\n}\n\n// API Request/Response Types\nexport interface CreateAnnouncementData {\n title: string;\n description: string;\n background_color: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n created_by: string;\n}\n\nexport interface UpdateAnnouncementData {\n title?: string;\n description?: string;\n background_color?: string;\n icon_name?: string;\n icon_url?: string;\n /** Extra props for the main bar/icon */\n icon_props?: Record<string, any>;\n platforms?: string[]; // entity_platforms set (multi-select)\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon_name?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n}\n\nexport interface AnnouncementListResponse {\n announcements: Announcement[];\n pagination: {\n page: number;\n page_size: number;\n total_count: number;\n total_pages: number;\n };\n filters?: {\n platform?: LegacyPlatform;\n is_active?: boolean;\n };\n}\n\n/**\n * Wire shape of GET /api/announcements/active — the single typed home for the\n * `{ announcement }` envelope (hub route return + AnnouncementBar's\n * useSelfFetch generic). `null` when no active announcement exists.\n */\nexport interface AnnouncementResponse {\n announcement: Announcement | null;\n}\n\n/**\n * Default CTA button colors — one home for the pair the DAL create/update\n * defaults and the admin form both reference. Announcement colors are\n * admin-chosen data (not ODS-token surfaces) by design.\n */\nexport const ANNOUNCEMENT_CTA_DEFAULTS = {\n background: '#1A1A1A',\n text: '#FAFAFA',\n} as const;\n\n// Form Data Types\nexport interface AnnouncementFormData {\n title: string;\n description: string;\n background_color: string;\n icon_name: string;\n icon_url?: string;\n platforms: string[]; // entity_platforms set (multi-select; no single platform_id)\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled: boolean;\n cta_text: string;\n cta_icon_name: string;\n cta_show_icon: boolean;\n cta_url: string;\n cta_target: '_self' | '_blank';\n // New CTA button custom colors\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: string; // JSON string in form\n /** Extra props for the main bar/icon */\n icon_props?: string;\n}\n\n// API Query Parameters\nexport interface GetAnnouncementsOptions {\n platform?: PlatformFilter; // Changed from Platform to PlatformFilter to include 'all'\n is_active?: boolean;\n page?: number;\n pageSize?: number;\n sortBy?: 'created_at' | 'updated_at' | 'title';\n sortOrder?: 'asc' | 'desc';\n}\n\n// File Upload Types\nexport interface IconUploadResponse {\n success: boolean;\n file_url?: string;\n file_name?: string;\n file_size?: number;\n error?: string;\n}\n\nexport interface IconUploadData {\n file: File;\n announcement_id?: string;\n}\n\n// Available SVG Icons (extend as needed)\nexport interface AvailableSvgIcon {\n name: string;\n display_name: string;\n component_name: string;\n}\n\n// Error Types\nexport interface AnnouncementError {\n code: string;\n message: string;\n details?: string;\n}\n\n// Validation Types\nexport interface AnnouncementValidation {\n title: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n description: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n background_color: {\n required: boolean;\n pattern: RegExp;\n };\n icon_name: {\n required: boolean;\n validOptions: string[];\n };\n platform: {\n required: boolean;\n validOptions: LegacyPlatform[];\n };\n}\n\n// Import unified platform configuration (removed duplicate definition)\nexport type { PlatformConfig } from './platform';\n\n// Admin Dashboard Types\nexport interface AnnouncementStats {\n total_announcements: number;\n active_announcements: number;\n announcements_by_platform: Record<LegacyPlatform, number>;\n recent_announcements: Announcement[];\n}\n\n// Component Props Types\nexport interface AnnouncementBarProps {\n /**\n * SSR mode seed. `null` = the server resolved \"nothing to show\" (no active\n * announcement, or dismissed via cookie) — seeds the fetch hook and skips\n * the mount fetch. Absent (`undefined`) = client-only mode: the bar\n * self-fetches on mount from the EndpointsRuntime provider's\n * `announcementsUrl` (see react-embedding-example — no per-component URL\n * or platform knobs; the server resolves its own platform via\n * currentPlatform()).\n */\n initialAnnouncement?: Announcement | null;\n /**\n * Render-only mode for the admin live preview: no fetch/revalidation, inert\n * dismiss button, and no storage side effects (never writes dismissal\n * cookies or touches localStorage).\n */\n previewMode?: boolean;\n className?: string;\n}\n\nexport interface AnnouncementFormProps {\n announcement?: Announcement;\n onSubmit: (data: AnnouncementFormData) => Promise<void>;\n onCancel: () => void;\n isLoading?: boolean;\n availableIcons: AvailableSvgIcon[];\n}\n\nexport interface AnnouncementListProps {\n announcements: Announcement[];\n onEdit: (announcement: Announcement) => void;\n onDelete: (announcementId: string) => void;\n onToggleActive: (announcementId: string, isActive: boolean) => void;\n isLoading?: boolean;\n}\n\n// Database Utility Types\nexport interface AnnouncementFilters {\n platform?: LegacyPlatform;\n is_active?: boolean;\n created_by?: string;\n search?: string;\n}\n\nexport interface AnnouncementSortOptions {\n field: 'created_at' | 'updated_at' | 'title' | 'platform';\n direction: 'asc' | 'desc';\n}\n\n// SVG Icon Type\nexport interface SvgIcon {\n name: string;\n label: string;\n component: any;\n}\n\n// Platform display configuration\n// PLATFORM_CONFIGS removed - all platform data now comes from database via getPlatformsConfig()\n\n// Available SVG icons configuration\nexport const AVAILABLE_SVG_ICONS: SvgIcon[] = [\n // OpenFrame Logo Options\n { name: 'openframe-logo', label: 'OpenFrame Logo', component: null as any },\n \n // Platform Logos\n { name: 'openmsp-logo', label: 'OpenMSP Logo', component: null as any },\n { name: 'flamingo-logo', label: 'Flamingo Logo', component: null as any },\n \n // Lucide Icons\n { name: 'megaphone', label: 'Megaphone', component: null as any },\n { name: 'bell', label: 'Bell', component: null as any },\n { name: 'info', label: 'Information', component: null as any },\n { name: 'star', label: 'Star', component: null as any },\n { name: 'rocket', label: 'Rocket', component: null as any },\n { name: 'package', label: 'Package', component: null as any }\n]; "]}
@@ -7,6 +7,10 @@ require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
8
8
 
9
9
  // src/types/announcement.ts
10
+ var ANNOUNCEMENT_CTA_DEFAULTS = {
11
+ background: "#1A1A1A",
12
+ text: "#FAFAFA"
13
+ };
10
14
  var AVAILABLE_SVG_ICONS = [
11
15
  // OpenFrame Logo Options
12
16
  { name: "openframe-logo", label: "OpenFrame Logo", component: null },
@@ -558,6 +562,7 @@ var TMCG_SOCIAL_PLATFORMS = {
558
562
  slack: "Slack"
559
563
  };
560
564
 
565
+ exports.ANNOUNCEMENT_CTA_DEFAULTS = ANNOUNCEMENT_CTA_DEFAULTS;
561
566
  exports.AVAILABLE_SVG_ICONS = AVAILABLE_SVG_ICONS;
562
567
  exports.OSTypeValues = OSTypeValues;
563
568
  exports.OS_TYPES = OS_TYPES;