@flamingo-stack/openframe-frontend-core 0.0.730 → 0.0.731

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 (200) hide show
  1. package/dist/aicpa-soc2-logo-icon-MLDYZA5S.cjs +7 -0
  2. package/dist/build/export-map.json +1 -1
  3. package/dist/{chunk-XA436AER.cjs → chunk-25H2SZH7.cjs} +4 -4
  4. package/dist/{chunk-5RMCAY6Y.cjs → chunk-27TMRMOM.cjs} +6 -4
  5. package/dist/{chunk-SKDQ2SLJ.cjs → chunk-2UNQJVYN.cjs} +670 -667
  6. package/dist/{chunk-73MDSN5A.cjs → chunk-2WXLQ5R5.cjs} +2 -2
  7. package/dist/{chunk-YPM3ALIW.cjs → chunk-32ENYVFA.cjs} +42 -42
  8. package/dist/{chunk-CLA3UGKT.cjs → chunk-3SWLL4IM.cjs} +12 -12
  9. package/dist/{chunk-FGA6T2XT.cjs → chunk-4YPV4OI4.cjs} +73 -73
  10. package/dist/{chunk-2T2TH5DF.cjs → chunk-52HFGZCI.cjs} +14 -12
  11. package/dist/{chunk-PGFR4CDB.cjs → chunk-53XZ6MJ5.cjs} +40 -40
  12. package/dist/{chunk-4XQXTQUK.cjs → chunk-6N5NQRQA.cjs} +8 -6
  13. package/dist/{chunk-XSPL7RXL.cjs → chunk-6V4GEE55.cjs} +10 -10
  14. package/dist/{chunk-5KLNEFZZ.cjs → chunk-7DUXR4HL.cjs} +3 -3
  15. package/dist/{chunk-AIW4KZQT.cjs → chunk-A4HNF4MP.cjs} +89 -89
  16. package/dist/{chunk-2I3XU2IB.cjs → chunk-BFHLGEJK.cjs} +45 -45
  17. package/dist/{chunk-FRET5WH3.cjs → chunk-CKR42OBK.cjs} +4 -2
  18. package/dist/{chunk-A7T3P5Q5.cjs → chunk-CLILWI6O.cjs} +32 -32
  19. package/dist/{chunk-GJPAS4RJ.cjs → chunk-CT342EJU.cjs} +6 -4
  20. package/dist/{chunk-YHFXQ5OR.cjs → chunk-E3N24573.cjs} +9 -9
  21. package/dist/{chunk-24KWUFWA.cjs → chunk-FKKUQK4C.cjs} +38 -38
  22. package/dist/{chunk-UG7Q3HQH.cjs → chunk-GID62YEN.cjs} +3 -3
  23. package/dist/{chunk-NDHQ7JLZ.cjs → chunk-GKHWXI25.cjs} +11 -15
  24. package/dist/{chunk-KMMV562E.cjs → chunk-HEOD765R.cjs} +18 -18
  25. package/dist/{chunk-66QTEDJL.cjs → chunk-HI7EFAFQ.cjs} +26 -26
  26. package/dist/{chunk-CD5YBUJK.cjs → chunk-HLIJ3U2T.cjs} +20 -20
  27. package/dist/{chunk-4NFVFTD6.cjs → chunk-HY2KTQSL.cjs} +238 -238
  28. package/dist/{chunk-YJXUJWHN.cjs → chunk-J7SZOZOS.cjs} +28 -26
  29. package/dist/{chunk-6NKLR5QN.cjs → chunk-JK75ZZP3.cjs} +59 -59
  30. package/dist/{chunk-JNDR5N3T.cjs → chunk-JPZ4Y6X3.cjs} +93 -93
  31. package/dist/{chunk-NXCV35RR.cjs → chunk-KLXHCNDC.cjs} +3 -3
  32. package/dist/{chunk-6KD2XUQZ.cjs → chunk-LRQITIEC.cjs} +28 -26
  33. package/dist/chunk-MANNIJ42.cjs +967 -0
  34. package/dist/{chunk-TW2SES5W.cjs → chunk-NCGAP3U4.cjs} +4 -2
  35. package/dist/{chunk-DINGZJ37.cjs → chunk-NYY25425.cjs} +2 -2
  36. package/dist/{chunk-HVZBIXCZ.cjs → chunk-O2RPIGSG.cjs} +6 -4
  37. package/dist/{chunk-UYKL2AXE.cjs → chunk-OKW5OAFJ.cjs} +8 -6
  38. package/dist/{chunk-YRZB4BMZ.cjs → chunk-QP6QS3YU.cjs} +44 -44
  39. package/dist/{chunk-VQMWBQUJ.cjs → chunk-R4QMR6S4.cjs} +14 -12
  40. package/dist/{chunk-2V62Y67F.cjs → chunk-RAHRDJBP.cjs} +4 -4
  41. package/dist/{chunk-3YHVQ34L.cjs → chunk-RBOIGJYF.cjs} +89 -91
  42. package/dist/{chunk-NB5BYOTM.cjs → chunk-RC32WBPL.cjs} +6 -4
  43. package/dist/{chunk-TI2IFCZG.cjs → chunk-TH4N726A.cjs} +17 -17
  44. package/dist/{chunk-WTURHKM2.cjs → chunk-XDBHGWFH.cjs} +14 -14
  45. package/dist/{chunk-P4YHBHP4.cjs → chunk-Y4QRK3CB.cjs} +7 -7
  46. package/dist/{chunk-Q5GR7LKV.cjs → chunk-YDGBRI3Y.cjs} +15 -15
  47. package/dist/{chunk-CDLDAQBA.cjs → chunk-YJFN2W7A.cjs} +7 -7
  48. package/dist/{chunk-UHJG2BDI.cjs → chunk-YUXRIR45.cjs} +3 -3
  49. package/dist/{chunk-L7Y7KDTM.cjs → chunk-ZV6473Z4.cjs} +20 -20
  50. package/dist/{chunk-GVTCHXW2.cjs → chunk-ZWUIRQNY.cjs} +28 -26
  51. package/dist/clickup-icon-3SETH2MM.cjs +7 -0
  52. package/dist/clickup-logo-icon-DJKBEFMR.cjs +7 -0
  53. package/dist/{cloud-tenants-VV6UQE7J.cjs → cloud-tenants-SC4FNAC2.cjs} +34 -34
  54. package/dist/components/case-studies/index.cjs +47 -47
  55. package/dist/components/chat/entity-cards/entity-portrait-card.js +1 -1
  56. package/dist/components/chat/index.cjs +28 -28
  57. package/dist/components/chat/types/entities/program-types.d.ts +1 -23
  58. package/dist/components/chat/types/entities/program-types.d.ts.map +1 -1
  59. package/dist/components/chat/types/entities/program-types.js +1 -9
  60. package/dist/components/chat/utils/icon-loading.d.ts +35 -2
  61. package/dist/components/chat/utils/icon-loading.d.ts.map +1 -1
  62. package/dist/components/chat/utils/icon-loading.js +31 -9
  63. package/dist/components/contact/index.cjs +35 -35
  64. package/dist/components/docs/index.cjs +38 -38
  65. package/dist/components/embeds/index.cjs +35 -35
  66. package/dist/components/faq/index.cjs +35 -35
  67. package/dist/components/features/index.cjs +36 -34
  68. package/dist/components/features/video-bites-shared.cjs +8 -0
  69. package/dist/components/features/video-bites-shared.d.ts +25 -0
  70. package/dist/components/features/video-bites-shared.d.ts.map +1 -1
  71. package/dist/components/features/video-bites-shared.js +8 -0
  72. package/dist/components/help-center-pages/index.cjs +150 -150
  73. package/dist/components/icons-v2-generated/brand-logos/clickup-icon.d.ts +1 -1
  74. package/dist/components/icons-v2-generated/brand-logos/clickup-icon.d.ts.map +1 -1
  75. package/dist/components/icons-v2-generated/brand-logos/clickup-icon.js +6 -4
  76. package/dist/components/icons-v2-generated/brand-logos/clickup-logo-icon.d.ts +1 -1
  77. package/dist/components/icons-v2-generated/brand-logos/clickup-logo-icon.d.ts.map +1 -1
  78. package/dist/components/icons-v2-generated/brand-logos/clickup-logo-icon.js +6 -4
  79. package/dist/components/icons-v2-generated/brand-logos/elestio-logo-grey-icon.d.ts +1 -1
  80. package/dist/components/icons-v2-generated/brand-logos/elestio-logo-grey-icon.d.ts.map +1 -1
  81. package/dist/components/icons-v2-generated/brand-logos/elestio-logo-grey-icon.js +4 -2
  82. package/dist/components/icons-v2-generated/brand-logos/elestio-logo-icon.d.ts +1 -1
  83. package/dist/components/icons-v2-generated/brand-logos/elestio-logo-icon.d.ts.map +1 -1
  84. package/dist/components/icons-v2-generated/brand-logos/elestio-logo-icon.js +14 -12
  85. package/dist/components/icons-v2-generated/brand-logos/gemini-logo-icon.d.ts +1 -1
  86. package/dist/components/icons-v2-generated/brand-logos/gemini-logo-icon.d.ts.map +1 -1
  87. package/dist/components/icons-v2-generated/brand-logos/gemini-logo-icon.js +28 -26
  88. package/dist/components/icons-v2-generated/brand-logos/google-gemini-icon.d.ts +1 -1
  89. package/dist/components/icons-v2-generated/brand-logos/google-gemini-icon.d.ts.map +1 -1
  90. package/dist/components/icons-v2-generated/brand-logos/google-gemini-icon.js +28 -26
  91. package/dist/components/icons-v2-generated/brand-logos/google-gemini-logo-icon.d.ts +1 -1
  92. package/dist/components/icons-v2-generated/brand-logos/google-gemini-logo-icon.d.ts.map +1 -1
  93. package/dist/components/icons-v2-generated/brand-logos/google-gemini-logo-icon.js +28 -26
  94. package/dist/components/icons-v2-generated/brand-logos/google-sheets-icon.d.ts +1 -1
  95. package/dist/components/icons-v2-generated/brand-logos/google-sheets-icon.d.ts.map +1 -1
  96. package/dist/components/icons-v2-generated/brand-logos/google-sheets-icon.js +4 -2
  97. package/dist/components/icons-v2-generated/brand-logos/meshcentral-logo-grey-icon.d.ts +1 -1
  98. package/dist/components/icons-v2-generated/brand-logos/meshcentral-logo-grey-icon.d.ts.map +1 -1
  99. package/dist/components/icons-v2-generated/brand-logos/meshcentral-logo-grey-icon.js +8 -6
  100. package/dist/components/icons-v2-generated/brand-logos/meshcentral-logo-icon.d.ts +1 -1
  101. package/dist/components/icons-v2-generated/brand-logos/meshcentral-logo-icon.d.ts.map +1 -1
  102. package/dist/components/icons-v2-generated/brand-logos/meshcentral-logo-icon.js +8 -6
  103. package/dist/components/icons-v2-generated/brand-logos/winget-logo-icon.d.ts +1 -1
  104. package/dist/components/icons-v2-generated/brand-logos/winget-logo-icon.d.ts.map +1 -1
  105. package/dist/components/icons-v2-generated/brand-logos/winget-logo-icon.js +14 -12
  106. package/dist/components/icons-v2-generated/compliance-logos/aicpa-soc2-logo-icon.d.ts +1 -1
  107. package/dist/components/icons-v2-generated/compliance-logos/aicpa-soc2-logo-icon.d.ts.map +1 -1
  108. package/dist/components/icons-v2-generated/compliance-logos/aicpa-soc2-logo-icon.js +6 -4
  109. package/dist/components/icons-v2-generated/compliance-logos/eu-logo-icon.d.ts +1 -1
  110. package/dist/components/icons-v2-generated/compliance-logos/eu-logo-icon.d.ts.map +1 -1
  111. package/dist/components/icons-v2-generated/compliance-logos/eu-logo-icon.js +11 -15
  112. package/dist/components/icons-v2-generated/icon-names.d.ts +5 -0
  113. package/dist/components/icons-v2-generated/icon-names.d.ts.map +1 -0
  114. package/dist/components/icons-v2-generated/icon-names.js +10 -0
  115. package/dist/components/icons-v2-generated/index.cjs +15 -15
  116. package/dist/components/icons-v2-generated/interface/empty-vendor-icon.d.ts +1 -1
  117. package/dist/components/icons-v2-generated/interface/empty-vendor-icon.d.ts.map +1 -1
  118. package/dist/components/icons-v2-generated/interface/empty-vendor-icon.js +6 -4
  119. package/dist/components/index.cjs +91 -91
  120. package/dist/components/meeting-scheduler/index.cjs +93 -93
  121. package/dist/components/navigation/index.cjs +37 -37
  122. package/dist/components/onboarding-guides/index.cjs +37 -37
  123. package/dist/components/product-demo/index.cjs +8 -8
  124. package/dist/components/related-content/index.cjs +8 -8
  125. package/dist/components/shared/product-release/product-release-card.js +1 -1
  126. package/dist/components/tickets/index.cjs +38 -38
  127. package/dist/components/ui/index.cjs +34 -34
  128. package/dist/components/ui/photo-wall.d.ts.map +1 -1
  129. package/dist/components/ui/photo-wall.js +4 -1
  130. package/dist/{devices-X72Z4QMT.cjs → devices-7MHSJNXS.cjs} +35 -35
  131. package/dist/elestio-logo-grey-icon-DV7P3JLT.cjs +7 -0
  132. package/dist/elestio-logo-icon-34ILAIDI.cjs +7 -0
  133. package/dist/{embeddable-chat-TETIRLQD.cjs → embeddable-chat-VPIG3F7E.cjs} +103 -103
  134. package/dist/empty-vendor-icon-XZYOZ4EP.cjs +7 -0
  135. package/dist/eu-logo-icon-EYOX3UC7.cjs +7 -0
  136. package/dist/gemini-logo-icon-DNACTHIK.cjs +7 -0
  137. package/dist/google-gemini-icon-TZHJZ4IQ.cjs +7 -0
  138. package/dist/google-gemini-logo-icon-4XQVV5NN.cjs +7 -0
  139. package/dist/google-sheets-icon-UAAEBTR7.cjs +7 -0
  140. package/dist/hooks/index.cjs +8 -8
  141. package/dist/{chunk-SI24RMI5.cjs → icon-loaders-OLGJZGRP.cjs} +16 -950
  142. package/dist/index.cjs +40 -40
  143. package/dist/{knowledge-HWBSPQ7M.cjs → knowledge-4DREGSOZ.cjs} +35 -35
  144. package/dist/{logs-IZ4QTHPI.cjs → logs-BWXNT2KP.cjs} +42 -42
  145. package/dist/meshcentral-logo-grey-icon-UCRYV3IC.cjs +7 -0
  146. package/dist/meshcentral-logo-icon-76NSLOXF.cjs +7 -0
  147. package/dist/{policies-VHQR7JR5.cjs → policies-MGFUI23M.cjs} +38 -38
  148. package/dist/{remote-session-IR3YCXSR.cjs → remote-session-O6QGXV2N.cjs} +22 -22
  149. package/dist/schemas/contact-schema.cjs +31 -11
  150. package/dist/schemas/contact-schema.d.ts +1 -1
  151. package/dist/schemas/contact-schema.d.ts.map +1 -1
  152. package/dist/schemas/contact-schema.js +1 -1
  153. package/dist/schemas/meeting-booking-schema.cjs +34 -14
  154. package/dist/schemas/meeting-booking-schema.d.ts +1 -1
  155. package/dist/schemas/meeting-booking-schema.d.ts.map +1 -1
  156. package/dist/schemas/meeting-booking-schema.js +1 -1
  157. package/dist/{software-update-QLOVC6EX.cjs → software-update-7LF7XEYC.cjs} +38 -38
  158. package/dist/{tickets-board-YONLQB6F.cjs → tickets-board-KNXK747O.cjs} +25 -25
  159. package/dist/utils/index.cjs +2004 -1959
  160. package/dist/winget-logo-icon-GBS342G4.cjs +7 -0
  161. package/package.json +1 -1
  162. package/src/components/chat/entity-cards/entity-portrait-card.tsx +1 -1
  163. package/src/components/chat/types/entities/program-types.ts +4 -30
  164. package/src/components/chat/utils/icon-loading.tsx +50 -9
  165. package/src/components/features/video-bites-shared.ts +30 -0
  166. package/src/components/icons-v2-generated/brand-logos/clickup-icon.tsx +7 -5
  167. package/src/components/icons-v2-generated/brand-logos/clickup-logo-icon.tsx +7 -5
  168. package/src/components/icons-v2-generated/brand-logos/elestio-logo-grey-icon.tsx +5 -3
  169. package/src/components/icons-v2-generated/brand-logos/elestio-logo-icon.tsx +15 -13
  170. package/src/components/icons-v2-generated/brand-logos/gemini-logo-icon.tsx +29 -27
  171. package/src/components/icons-v2-generated/brand-logos/google-gemini-icon.tsx +29 -27
  172. package/src/components/icons-v2-generated/brand-logos/google-gemini-logo-icon.tsx +29 -27
  173. package/src/components/icons-v2-generated/brand-logos/google-sheets-icon.tsx +5 -3
  174. package/src/components/icons-v2-generated/brand-logos/meshcentral-logo-grey-icon.tsx +9 -7
  175. package/src/components/icons-v2-generated/brand-logos/meshcentral-logo-icon.tsx +9 -7
  176. package/src/components/icons-v2-generated/brand-logos/winget-logo-icon.tsx +15 -13
  177. package/src/components/icons-v2-generated/compliance-logos/aicpa-soc2-logo-icon.tsx +92 -90
  178. package/src/components/icons-v2-generated/compliance-logos/eu-logo-icon.tsx +51 -52
  179. package/src/components/icons-v2-generated/icon-names.ts +11 -0
  180. package/src/components/icons-v2-generated/interface/empty-vendor-icon.tsx +7 -5
  181. package/src/components/shared/product-release/product-release-card.tsx +1 -1
  182. package/src/components/ui/photo-wall.tsx +6 -0
  183. package/src/schemas/contact-schema.ts +1 -1
  184. package/src/schemas/meeting-booking-schema.ts +1 -1
  185. package/src/styles/fonts.css +26 -0
  186. package/src/styles/ods-design-tokens.css +4 -2
  187. package/dist/aicpa-soc2-logo-icon-CJ5JRV6J.cjs +0 -7
  188. package/dist/clickup-icon-CBBUZUVQ.cjs +0 -7
  189. package/dist/clickup-logo-icon-CGDKKISS.cjs +0 -7
  190. package/dist/elestio-logo-grey-icon-Y5OFW4OO.cjs +0 -7
  191. package/dist/elestio-logo-icon-X7TTQAYP.cjs +0 -7
  192. package/dist/empty-vendor-icon-3RKCZUUR.cjs +0 -7
  193. package/dist/eu-logo-icon-N7QVPGG3.cjs +0 -7
  194. package/dist/gemini-logo-icon-QOPGATSZ.cjs +0 -7
  195. package/dist/google-gemini-icon-7GWWF6O6.cjs +0 -7
  196. package/dist/google-gemini-logo-icon-Z3GHPMVN.cjs +0 -7
  197. package/dist/google-sheets-icon-7MJ3LV4P.cjs +0 -7
  198. package/dist/meshcentral-logo-grey-icon-3VFJQMV2.cjs +0 -7
  199. package/dist/meshcentral-logo-icon-MDVBWMP5.cjs +0 -7
  200. package/dist/winget-logo-icon-XVZJ4QDM.cjs +0 -7
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkR4QMR6S4cjs = require('./chunk-R4QMR6S4.cjs');
5
+
6
+
7
+ exports.WingetLogoIcon = _chunkR4QMR6S4cjs.WingetLogoIcon;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.730",
3
+ "version": "0.0.731",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -108,7 +108,7 @@ export function EntityPortraitCard({
108
108
  const edgeColor = useImageEdgeColor(isWide === false ? src : null, 'var(--color-bg-surface)');
109
109
 
110
110
  return (
111
- <Link href={href} target={target} rel={rel} className={cn('block h-full', className)} aria-label={`Open ${title}`}>
111
+ <Link href={href} target={target} rel={rel} className={cn('block h-full', className)}>
112
112
  <Card className={cn(CONTENT_CARD_FRAME_CLASS, 'flex h-full flex-col gap-6 p-6')}>
113
113
  {/* Media zone — the real cover always wins: wide → cover-fill;
114
114
  non-wide → contained on the edge-color fill (news-card treatment). */}
@@ -18,7 +18,6 @@
18
18
  */
19
19
 
20
20
  import type { ReactNode } from 'react';
21
- import { toStripProfile, type VideoBiteStripProfile } from '../../../features/video-bites-shared';
22
21
 
23
22
  // ============================================================================
24
23
  // HOST TYPES
@@ -36,35 +35,10 @@ export interface ProgramHost {
36
35
  role?: string; // e.g., "Host", "Speaker", "Guest"
37
36
  }
38
37
 
39
- /**
40
- * Client-safe author subset hydrated onto program items from the entity's
41
- * `author_id → profiles` FK join (podcast episodes / webinars). Deliberately
42
- * excludes `email` — this shape is serialized into public payloads.
43
- */
44
- export interface ProgramAuthorRef {
45
- id?: string | null;
46
- full_name?: string | null;
47
- avatar_url?: string | null;
48
- job_title?: string | null;
49
- }
50
-
51
- /**
52
- * Video-bites overlay profile for a program item: internal author first
53
- * (`author_id → profiles`), then the provider-synced primary host (Livestorm
54
- * speakers / Podbean hosts). Host `role` is a raw provider enum (e.g.
55
- * `team_member`) — never display copy, so it is not used as the subtitle.
56
- * Routes through `toStripProfile` (the SSoT — null on missing names).
57
- */
58
- export function programItemToStripProfile(item: {
59
- author?: ProgramAuthorRef | null;
60
- hosts?: ProgramHost[] | null;
61
- }): VideoBiteStripProfile | null {
62
- const fromAuthor = toStripProfile(item.author);
63
- if (fromAuthor) return fromAuthor;
64
- const host = Array.isArray(item.hosts) ? item.hosts[0] : null;
65
- if (!host?.name) return null;
66
- return toStripProfile({ full_name: host.name, avatar_url: host.avatar_url ?? null });
67
- }
38
+ // The author ref and its strip-profile adapter live in the server-safe leaf
39
+ // (`features/video-bites-shared`): a server module that imports them from this
40
+ // chat tree makes the whole chat a client reference of its page.
41
+ export { programItemToStripProfile, type ProgramAuthorRef } from '../../../features/video-bites-shared';
68
42
 
69
43
  // ============================================================================
70
44
  // DATABASE ROW TYPES
@@ -18,9 +18,9 @@
18
18
  * `<NamedIcon>`, and never calls these functions itself.
19
19
  */
20
20
 
21
- import dynamicIconImports from 'lucide-react/dynamicIconImports';
22
21
  import { createElement, lazy, useEffect, useRef, useSyncExternalStore, type ComponentType, type SVGProps } from 'react';
23
- import { ICON_LOADERS, type LoadedIconProps } from '../../icons-v2-generated/icon-loaders';
22
+ import type { LoadedIconProps } from '../../icons-v2-generated/icon-loaders';
23
+ import { ICON_SET_NAMES, LUCIDE_ICON_NAMES } from '../../icons-v2-generated/icon-names';
24
24
 
25
25
  /** Every icon loaded here is a component of the generated set's own props (`icons-v2-generated`). */
26
26
  export type IconComponent = ComponentType<LoadedIconProps>;
@@ -157,10 +157,53 @@ function loadedOnDemand(key: string, displayName: string, loader: IconLoader): I
157
157
  return OnDemandIcon as IconComponent;
158
158
  }
159
159
 
160
+ // The two loader tables are NOT imported with this module. Bundled, they are the
161
+ // largest script a page would load (each `import()` is written out as the files it
162
+ // needs: about 340 KB for 3,300 icons), and a page whose icons the server drew
163
+ // never reads them. Whether a name exists is answered by `icon-names` (the names
164
+ // alone); a table is fetched the first time an icon is loaded by name.
165
+ type LoaderTable = Readonly<Record<string, IconLoader | undefined>>;
166
+
167
+ /** What a name draws when its table has lost it (a consumer's lucide older than the list of names): nothing. */
168
+ const NO_ICON: IconModule = { default: () => null };
169
+
170
+ function fromTable(table: () => Promise<LoaderTable>, name: string): IconLoader {
171
+ return () => table().then(loaders => loaders[name]?.() ?? NO_ICON);
172
+ }
173
+
174
+ /**
175
+ * A loader table, fetched once and shared by every icon that reads it. A fetch
176
+ * that FAILS is forgotten, so the next icon asks again: kept, one dropped
177
+ * request would fail every icon of that table until the page is reloaded (an
178
+ * icon's own retry calls its loader again, which would get the same rejection).
179
+ * Exported for its test.
180
+ */
181
+ export function sharedTable(fetchTable: () => Promise<LoaderTable>): () => Promise<LoaderTable> {
182
+ let table: Promise<LoaderTable> | undefined;
183
+ return () => {
184
+ if (!table) {
185
+ const attempt = fetchTable();
186
+ table = attempt;
187
+ attempt.catch(() => {
188
+ if (table === attempt) table = undefined;
189
+ });
190
+ }
191
+ return table;
192
+ };
193
+ }
194
+
195
+ const setLoaders = sharedTable(() =>
196
+ import('../../icons-v2-generated/icon-loaders').then(module => module.ICON_LOADERS as LoaderTable),
197
+ );
198
+
199
+ const lucideLoaders = sharedTable(() =>
200
+ import('lucide-react/dynamicIconImports').then(module => (module.default ?? module) as unknown as LoaderTable),
201
+ );
202
+
160
203
  /** An icon of the generated set by its EXPORT name (`ChartPieIcon`), or `undefined` when the set has none by that name. */
161
204
  export function iconFromSet(exportName: string): IconComponent | undefined {
162
- if (!Object.prototype.hasOwnProperty.call(ICON_LOADERS, exportName)) return undefined;
163
- return loadedOnDemand(`set:${exportName}`, exportName, ICON_LOADERS[exportName]);
205
+ if (!ICON_SET_NAMES.has(exportName)) return undefined;
206
+ return loadedOnDemand(`set:${exportName}`, exportName, fromTable(setLoaders, exportName));
164
207
  }
165
208
 
166
209
  /** An icon the generated set is known to hold, by its export name. A name the set lost fails where it is asked for. */
@@ -170,12 +213,10 @@ export function setIcon(exportName: string): IconComponent {
170
213
  return icon;
171
214
  }
172
215
 
173
- const lucideLoaders = dynamicIconImports as unknown as Readonly<Record<string, IconLoader>>;
174
-
175
216
  /** A lucide icon by its kebab-case name (`message-circle`), or `undefined` when lucide has none by that name. */
176
217
  export function lucideIcon(name: string): IconComponent | undefined {
177
- if (!Object.prototype.hasOwnProperty.call(lucideLoaders, name)) return undefined;
178
- return loadedOnDemand(`lucide:${name}`, `Lucide(${name})`, lucideLoaders[name]);
218
+ if (!LUCIDE_ICON_NAMES.has(name)) return undefined;
219
+ return loadedOnDemand(`lucide:${name}`, `Lucide(${name})`, fromTable(lucideLoaders, name));
179
220
  }
180
221
 
181
222
  /**
@@ -275,7 +316,7 @@ export function platformMarkRef(platform: string): IconRef {
275
316
  if (platform === EVERY_PLATFORM) return EVERY_PLATFORM_MARK;
276
317
  const stem = setStem(platform);
277
318
  for (const exportName of [`${stem}MarkIcon`, `${stem}LogoIcon`]) {
278
- if (Object.prototype.hasOwnProperty.call(ICON_LOADERS, exportName)) return { set: exportName };
319
+ if (ICON_SET_NAMES.has(exportName)) return { set: exportName };
279
320
  }
280
321
  return HOUSE_MARK;
281
322
  }
@@ -76,3 +76,33 @@ export function sortBitesByFeaturedAtDesc(a: VideoTeaser, b: VideoTeaser): numbe
76
76
  if (!b.featured_at) return -1;
77
77
  return new Date(b.featured_at).getTime() - new Date(a.featured_at).getTime();
78
78
  }
79
+
80
+ /**
81
+ * Client-safe author subset hydrated onto program items from the entity's
82
+ * `author_id → profiles` FK join (podcast episodes / webinars). Deliberately
83
+ * excludes `email` — this shape is serialized into public payloads.
84
+ */
85
+ export interface ProgramAuthorRef {
86
+ id?: string | null;
87
+ full_name?: string | null;
88
+ avatar_url?: string | null;
89
+ job_title?: string | null;
90
+ }
91
+
92
+ /**
93
+ * Video-bites overlay profile for a program item: internal author first
94
+ * (`author_id → profiles`), then the provider-synced primary host (Livestorm
95
+ * speakers / Podbean hosts). Host `role` is a raw provider enum (e.g.
96
+ * `team_member`) — never display copy, so it is not used as the subtitle.
97
+ * Routes through `toStripProfile` (the SSoT — null on missing names).
98
+ */
99
+ export function programItemToStripProfile(item: {
100
+ author?: ProgramAuthorRef | null;
101
+ hosts?: ReadonlyArray<{ name?: string | null; avatar_url?: string | null }> | null;
102
+ }): VideoBiteStripProfile | null {
103
+ const fromAuthor = toStripProfile(item.author);
104
+ if (fromAuthor) return fromAuthor;
105
+ const host = item.hosts?.[0] ?? null;
106
+ if (!host?.name) return null;
107
+ return toStripProfile({ full_name: host.name, avatar_url: host.avatar_url ?? null });
108
+ }
@@ -1,4 +1,4 @@
1
- import type { SVGProps } from "react";
1
+ import { useId, type SVGProps } from "react";
2
2
  export interface ClickupIconProps
3
3
  extends Omit<SVGProps<SVGSVGElement>, "width" | "height"> {
4
4
  className?: string;
@@ -11,6 +11,8 @@ export function ClickupIcon({
11
11
  color = "currentColor",
12
12
  ...props
13
13
  }: ClickupIconProps) {
14
+ // Per-instance ids: see scopeIds in scripts/generate-icons.mjs.
15
+ const uid = useId().replace(/[^a-zA-Z0-9_-]/g, '');
14
16
  return (
15
17
  <svg
16
18
  xmlns="http://www.w3.org/2000/svg"
@@ -23,7 +25,7 @@ export function ClickupIcon({
23
25
  >
24
26
  <defs>
25
27
  <linearGradient
26
- id="clickup_svg__a"
28
+ id={`${uid}clickup_svg__a`}
27
29
  x1={0}
28
30
  x2={54.845}
29
31
  y1={15.049}
@@ -35,7 +37,7 @@ export function ClickupIcon({
35
37
  <stop offset={1} stopColor="#49CCF9" />
36
38
  </linearGradient>
37
39
  <linearGradient
38
- id="clickup_svg__b"
40
+ id={`${uid}clickup_svg__b`}
39
41
  x1={1.195}
40
42
  x2={53.745}
41
43
  y1={53.166}
@@ -48,13 +50,13 @@ export function ClickupIcon({
48
50
  </linearGradient>
49
51
  </defs>
50
52
  <path
51
- fill="url(#clickup_svg__a)"
53
+ fill={`url(#${uid}clickup_svg__a)`}
52
54
  fillRule="evenodd"
53
55
  d="m0 50.6 10.1-7.8c5.4 7 11.1 10.3 17.4 10.3s11.9-3.2 17-10.2l10.3 7.6c-7.4 10-16.6 15.3-27.3 15.3-10.6 0-19.9-5.3-27.5-15.2"
54
56
  clipRule="evenodd"
55
57
  />
56
58
  <path
57
- fill="url(#clickup_svg__b)"
59
+ fill={`url(#${uid}clickup_svg__b)`}
58
60
  fillRule="evenodd"
59
61
  d="m27.5 16.9-18 15.5-8.3-9.7L27.6 0l26.2 22.7-8.4 9.6z"
60
62
  clipRule="evenodd"
@@ -1,4 +1,4 @@
1
- import type { SVGProps } from "react";
1
+ import { useId, type SVGProps } from "react";
2
2
  export interface ClickupLogoIconProps
3
3
  extends Omit<SVGProps<SVGSVGElement>, "width" | "height"> {
4
4
  className?: string;
@@ -11,6 +11,8 @@ export function ClickupLogoIcon({
11
11
  color = "currentColor",
12
12
  ...props
13
13
  }: ClickupLogoIconProps) {
14
+ // Per-instance ids: see scopeIds in scripts/generate-icons.mjs.
15
+ const uid = useId().replace(/[^a-zA-Z0-9_-]/g, '');
14
16
  return (
15
17
  <svg
16
18
  xmlns="http://www.w3.org/2000/svg"
@@ -22,20 +24,20 @@ export function ClickupLogoIcon({
22
24
  {...props}
23
25
  >
24
26
  <path
25
- fill="url(#clickup-logo_svg__a)"
27
+ fill={`url(#${uid}clickup-logo_svg__a)`}
26
28
  fillRule="evenodd"
27
29
  d="m4 17.366 3.069-2.356c1.63 2.132 3.361 3.116 5.29 3.116 1.917 0 3.6-.972 5.156-3.088l3.112 2.3C18.38 20.388 15.59 22 12.358 22 9.137 22 6.318 20.4 4 17.366"
28
30
  clipRule="evenodd"
29
31
  />
30
32
  <path
31
- fill="url(#clickup-logo_svg__b)"
33
+ fill={`url(#${uid}clickup-logo_svg__b)`}
32
34
  fillRule="evenodd"
33
35
  d="m12.185 7.126-5.46 4.717L4.2 8.908 12.197 2l7.934 6.913-2.536 2.925z"
34
36
  clipRule="evenodd"
35
37
  />
36
38
  <defs>
37
39
  <linearGradient
38
- id="clickup-logo_svg__a"
40
+ id={`${uid}clickup-logo_svg__a`}
39
41
  x1={4}
40
42
  x2={20.627}
41
43
  y1={19.764}
@@ -46,7 +48,7 @@ export function ClickupLogoIcon({
46
48
  <stop offset={1} stopColor="#49CCF9" />
47
49
  </linearGradient>
48
50
  <linearGradient
49
- id="clickup-logo_svg__b"
51
+ id={`${uid}clickup-logo_svg__b`}
50
52
  x1={4.2}
51
53
  x2={20.131}
52
54
  y1={8.694}
@@ -1,4 +1,4 @@
1
- import type { SVGProps } from "react";
1
+ import { useId, type SVGProps } from "react";
2
2
  export interface ElestioLogoGreyIconProps
3
3
  extends Omit<SVGProps<SVGSVGElement>, "width" | "height"> {
4
4
  className?: string;
@@ -11,6 +11,8 @@ export function ElestioLogoGreyIcon({
11
11
  color = "currentColor",
12
12
  ...props
13
13
  }: ElestioLogoGreyIconProps) {
14
+ // Per-instance ids: see scopeIds in scripts/generate-icons.mjs.
15
+ const uid = useId().replace(/[^a-zA-Z0-9_-]/g, '');
14
16
  return (
15
17
  <svg
16
18
  xmlns="http://www.w3.org/2000/svg"
@@ -22,7 +24,7 @@ export function ElestioLogoGreyIcon({
22
24
  {...props}
23
25
  >
24
26
  <mask
25
- id="elestio-logo-grey_svg__a"
27
+ id={`${uid}elestio-logo-grey_svg__a`}
26
28
  width={20}
27
29
  height={20}
28
30
  x={2}
@@ -37,7 +39,7 @@ export function ElestioLogoGreyIcon({
37
39
  d="M14.543 16.983a6.8 6.8 0 0 1-2.818.618c-2.268 0-4.261-1.409-4.948-3.608h14.57c.103-.722.24-1.409.24-2.13 0-5.258-4.26-9.863-9.621-9.863C6.33 2 2 6.57 2 12.138 2 17.6 6.433 22 11.897 22c2.44 0 4.845-.997 6.598-2.577zM11.93 6.433c2.303 0 4.365 1.34 5.12 3.608H6.709c.687-2.2 2.99-3.608 5.223-3.608"
38
40
  />
39
41
  </mask>
40
- <g fill={color} mask="url(#elestio-logo-grey_svg__a)">
42
+ <g fill={color} mask={`url(#${uid}elestio-logo-grey_svg__a)`}>
41
43
  <path d="M18.495 8.736H6.124v6.185h12.37z" />
42
44
  <path d="M11.921 6.444c.141 0 .282 0 .388.035L7.37 2.893a8 8 0 0 0-1.481.914c-3.175 2.32-4.657 6.083-4.128 9.74l5.394-3.78C8 7.691 9.558 6.443 11.92 6.443" />
43
45
  <path d="M6.461 12.031c0-.793.221-1.547.522-2.264-1.615 1.17-3.712 2.68-5.327 3.85.075.603.226 1.207.413 1.81 1.277 4.001 4.655 6.756 8.522 7.398a459 459 0 0 1-1.99-6.227c-1.314-1.057-2.14-2.718-2.14-4.567" />
@@ -1,4 +1,4 @@
1
- import type { SVGProps } from "react";
1
+ import { useId, type SVGProps } from "react";
2
2
  export interface ElestioLogoIconProps
3
3
  extends Omit<SVGProps<SVGSVGElement>, "width" | "height"> {
4
4
  className?: string;
@@ -11,6 +11,8 @@ export function ElestioLogoIcon({
11
11
  color = "currentColor",
12
12
  ...props
13
13
  }: ElestioLogoIconProps) {
14
+ // Per-instance ids: see scopeIds in scripts/generate-icons.mjs.
15
+ const uid = useId().replace(/[^a-zA-Z0-9_-]/g, '');
14
16
  return (
15
17
  <svg
16
18
  xmlns="http://www.w3.org/2000/svg"
@@ -22,7 +24,7 @@ export function ElestioLogoIcon({
22
24
  {...props}
23
25
  >
24
26
  <mask
25
- id="elestio-logo_svg__a"
27
+ id={`${uid}elestio-logo_svg__a`}
26
28
  width={20}
27
29
  height={20}
28
30
  x={2}
@@ -37,32 +39,32 @@ export function ElestioLogoIcon({
37
39
  d="M14.543 16.983a6.8 6.8 0 0 1-2.818.618c-2.268 0-4.261-1.409-4.948-3.608h14.57c.103-.722.24-1.409.24-2.13 0-5.258-4.26-9.863-9.621-9.863C6.33 2 2 6.57 2 12.138 2 17.6 6.433 22 11.897 22c2.44 0 4.845-.997 6.598-2.577zM11.93 6.433c2.303 0 4.365 1.34 5.12 3.608H6.709c.687-2.2 2.99-3.608 5.223-3.608"
38
40
  />
39
41
  </mask>
40
- <g mask="url(#elestio-logo_svg__a)">
42
+ <g mask={`url(#${uid}elestio-logo_svg__a)`}>
41
43
  <path fill="#A91A1F" d="M18.495 8.736H6.124v6.185h12.37z" />
42
44
  <path
43
- fill="url(#elestio-logo_svg__b)"
45
+ fill={`url(#${uid}elestio-logo_svg__b)`}
44
46
  d="M11.921 6.444c.141 0 .282 0 .388.035L7.37 2.893a8 8 0 0 0-1.481.914c-3.175 2.32-4.657 6.083-4.128 9.74l5.394-3.78C8 7.691 9.558 6.443 11.92 6.443"
45
47
  />
46
48
  <path
47
- fill="url(#elestio-logo_svg__c)"
49
+ fill={`url(#${uid}elestio-logo_svg__c)`}
48
50
  d="M6.461 12.031c0-.793.221-1.547.522-2.264-1.615 1.17-3.712 2.68-5.327 3.85.075.603.226 1.207.413 1.81 1.277 4.001 4.655 6.756 8.522 7.398a459 459 0 0 1-1.99-6.227c-1.314-1.057-2.14-2.718-2.14-4.567"
49
51
  />
50
52
  <path
51
- fill="url(#elestio-logo_svg__d)"
53
+ fill={`url(#${uid}elestio-logo_svg__d)`}
52
54
  d="M14.809 16.783a5.7 5.7 0 0 1-2.975.834 5.64 5.64 0 0 1-3.648-1.321l1.877 5.703a9.5 9.5 0 0 0 1.735.139c3.967 0 7.367-2.191 9.102-5.39H14.81z"
53
55
  />
54
56
  <path
55
- fill="url(#elestio-logo_svg__e)"
57
+ fill={`url(#${uid}elestio-logo_svg__e)`}
56
58
  d="m17.116 10.587 1.822-5.67c-.378-.412-.825-.756-1.272-1.1a9.94 9.94 0 0 0-10.275-.893l4.811 3.505c2.406.206 4.364 1.89 4.914 4.158"
57
59
  />
58
60
  <path
59
- fill="url(#elestio-logo_svg__f)"
61
+ fill={`url(#${uid}elestio-logo_svg__f)`}
60
62
  d="m19.393 3.378-2.547 6.233c.144.454.24.945.24 1.436 0 2.153-1.442 4.042-3.605 5.1h8.316c.384-.53.672-1.134.913-1.7 1.586-4.042.144-8.273-3.317-11.069"
61
63
  />
62
64
  </g>
63
65
  <defs>
64
66
  <linearGradient
65
- id="elestio-logo_svg__b"
67
+ id={`${uid}elestio-logo_svg__b`}
66
68
  x1={6.985}
67
69
  x2={6.985}
68
70
  y1={13.507}
@@ -73,7 +75,7 @@ export function ElestioLogoIcon({
73
75
  <stop offset={1} stopColor="#F5A11A" />
74
76
  </linearGradient>
75
77
  <linearGradient
76
- id="elestio-logo_svg__c"
78
+ id={`${uid}elestio-logo_svg__c`}
77
79
  x1={6.133}
78
80
  x2={6.133}
79
81
  y1={22.84}
@@ -84,7 +86,7 @@ export function ElestioLogoIcon({
84
86
  <stop offset={1} stopColor="#E81C24" />
85
87
  </linearGradient>
86
88
  <linearGradient
87
- id="elestio-logo_svg__d"
89
+ id={`${uid}elestio-logo_svg__d`}
88
90
  x1={14.586}
89
91
  x2={14.586}
90
92
  y1={22.191}
@@ -95,7 +97,7 @@ export function ElestioLogoIcon({
95
97
  <stop offset={1} stopColor="#A567A5" />
96
98
  </linearGradient>
97
99
  <linearGradient
98
- id="elestio-logo_svg__e"
100
+ id={`${uid}elestio-logo_svg__e`}
99
101
  x1={13.174}
100
102
  x2={13.174}
101
103
  y1={10.598}
@@ -106,7 +108,7 @@ export function ElestioLogoIcon({
106
108
  <stop offset={1} stopColor="#FFC605" />
107
109
  </linearGradient>
108
110
  <linearGradient
109
- id="elestio-logo_svg__f"
111
+ id={`${uid}elestio-logo_svg__f`}
110
112
  x1={18.365}
111
113
  x2={18.365}
112
114
  y1={16.125}
@@ -1,4 +1,4 @@
1
- import type { SVGProps } from "react";
1
+ import { useId, type SVGProps } from "react";
2
2
  export interface GeminiLogoIconProps
3
3
  extends Omit<SVGProps<SVGSVGElement>, "width" | "height"> {
4
4
  className?: string;
@@ -11,6 +11,8 @@ export function GeminiLogoIcon({
11
11
  color = "currentColor",
12
12
  ...props
13
13
  }: GeminiLogoIconProps) {
14
+ // Per-instance ids: see scopeIds in scripts/generate-icons.mjs.
15
+ const uid = useId().replace(/[^a-zA-Z0-9_-]/g, '');
14
16
  return (
15
17
  <svg
16
18
  xmlns="http://www.w3.org/2000/svg"
@@ -22,7 +24,7 @@ export function GeminiLogoIcon({
22
24
  {...props}
23
25
  >
24
26
  <mask
25
- id="gemini-logo_svg__b"
27
+ id={`${uid}gemini-logo_svg__b`}
26
28
  width={20}
27
29
  height={20}
28
30
  x={2}
@@ -37,72 +39,72 @@ export function GeminiLogoIcon({
37
39
  d="M11.984 2c.209 0 .391.143.443.346q.234.933.614 1.817a12.8 12.8 0 0 0 2.725 4.039 12.8 12.8 0 0 0 4.038 2.724 12 12 0 0 0 1.818.615.457.457 0 0 1 0 .886q-.934.234-1.818.614a12.8 12.8 0 0 0-4.038 2.725 12.83 12.83 0 0 0-3.34 5.856.46.46 0 0 1-.442.345.46.46 0 0 1-.443-.346 12.809 12.809 0 0 0-3.34-5.855 12.8 12.8 0 0 0-5.855-3.34.457.457 0 0 1 0-.885 12.812 12.812 0 0 0 5.855-3.34 12.8 12.8 0 0 0 3.34-5.855.46.46 0 0 1 .443-.346"
38
40
  />
39
41
  <path
40
- fill="url(#gemini-logo_svg__a)"
42
+ fill={`url(#${uid}gemini-logo_svg__a)`}
41
43
  d="M11.984 2c.209 0 .391.143.443.346q.234.933.614 1.817a12.8 12.8 0 0 0 2.725 4.039 12.8 12.8 0 0 0 4.038 2.724 12 12 0 0 0 1.818.615.457.457 0 0 1 0 .886q-.934.234-1.818.614a12.8 12.8 0 0 0-4.038 2.725 12.83 12.83 0 0 0-3.34 5.856.46.46 0 0 1-.442.345.46.46 0 0 1-.443-.346 12.809 12.809 0 0 0-3.34-5.855 12.8 12.8 0 0 0-5.855-3.34.457.457 0 0 1 0-.885 12.812 12.812 0 0 0 5.855-3.34 12.8 12.8 0 0 0 3.34-5.855.46.46 0 0 1 .443-.346"
42
44
  />
43
45
  </mask>
44
- <g mask="url(#gemini-logo_svg__b)">
45
- <g filter="url(#gemini-logo_svg__c)">
46
+ <g mask={`url(#${uid}gemini-logo_svg__b)`}>
47
+ <g filter={`url(#${uid}gemini-logo_svg__c)`}>
46
48
  <path
47
49
  fill="#FFE432"
48
50
  d="M.197 17.61c2.307.82 4.96-.716 5.923-3.43s-.125-5.58-2.432-6.4c-2.307-.818-4.959.718-5.923 3.432s.125 5.58 2.432 6.398"
49
51
  />
50
52
  </g>
51
- <g filter="url(#gemini-logo_svg__d)">
53
+ <g filter={`url(#${uid}gemini-logo_svg__d)`}>
52
54
  <path
53
55
  fill="#FC413D"
54
56
  d="M10.441 8.661c3.17 0 5.739-2.626 5.739-5.865s-2.57-5.865-5.739-5.865-5.74 2.626-5.74 5.865 2.57 5.865 5.74 5.865"
55
57
  />
56
58
  </g>
57
- <g filter="url(#gemini-logo_svg__e)">
59
+ <g filter={`url(#${uid}gemini-logo_svg__e)`}>
58
60
  <path
59
61
  fill="#00B95C"
60
62
  d="M8.21 27.418c3.31-.162 5.821-3.767 5.612-8.054-.21-4.286-3.062-7.63-6.37-7.468S1.63 15.664 1.84 19.95c.21 4.286 3.062 7.63 6.37 7.468"
61
63
  />
62
64
  </g>
63
- <g filter="url(#gemini-logo_svg__f)">
65
+ <g filter={`url(#${uid}gemini-logo_svg__f)`}>
64
66
  <path
65
67
  fill="#00B95C"
66
68
  d="M8.21 27.418c3.31-.162 5.821-3.767 5.612-8.054-.21-4.286-3.062-7.63-6.37-7.468S1.63 15.664 1.84 19.95c.21 4.286 3.062 7.63 6.37 7.468"
67
69
  />
68
70
  </g>
69
- <g filter="url(#gemini-logo_svg__g)">
71
+ <g filter={`url(#${uid}gemini-logo_svg__g)`}>
70
72
  <path
71
73
  fill="#00B95C"
72
74
  d="M11.524 24.825c2.774-1.688 3.516-5.531 1.658-8.585-1.857-3.054-5.612-4.161-8.386-2.474-2.774 1.688-3.516 5.532-1.659 8.586 1.859 3.053 5.613 4.16 8.387 2.473"
73
75
  />
74
76
  </g>
75
- <g filter="url(#gemini-logo_svg__h)">
77
+ <g filter={`url(#${uid}gemini-logo_svg__h)`}>
76
78
  <path
77
79
  fill="#3186FF"
78
80
  d="M22.736 15.229c3.117 0 5.645-2.434 5.645-5.436s-2.528-5.436-5.645-5.436c-3.118 0-5.645 2.434-5.645 5.436s2.527 5.436 5.645 5.436"
79
81
  />
80
82
  </g>
81
- <g filter="url(#gemini-logo_svg__i)">
83
+ <g filter={`url(#${uid}gemini-logo_svg__i)`}>
82
84
  <path
83
85
  fill="#FBBC04"
84
86
  d="M-2.02 14.598c2.87 2.183 7.064 1.498 9.367-1.53 2.302-3.027 1.842-7.252-1.029-9.434-2.87-2.184-7.064-1.499-9.367 1.53-2.302 3.027-1.841 7.251 1.03 9.434"
85
87
  />
86
88
  </g>
87
- <g filter="url(#gemini-logo_svg__j)">
89
+ <g filter={`url(#${uid}gemini-logo_svg__j)`}>
88
90
  <path
89
91
  fill="#3186FF"
90
92
  d="M12.69 17.825c3.425 2.355 7.967 1.7 10.143-1.466s1.163-7.64-2.263-9.997c-3.427-2.356-7.969-1.7-10.145 1.466s-1.163 7.64 2.264 9.997"
91
93
  />
92
94
  </g>
93
- <g filter="url(#gemini-logo_svg__k)">
95
+ <g filter={`url(#${uid}gemini-logo_svg__k)`}>
94
96
  <path
95
97
  fill="#749BFF"
96
98
  d="M18.918 1.281c.872 1.185-.249 3.49-2.502 5.147s-4.787 2.04-5.658.855.248-3.49 2.501-5.147 4.787-2.04 5.659-.855"
97
99
  />
98
100
  </g>
99
- <g filter="url(#gemini-logo_svg__l)">
101
+ <g filter={`url(#${uid}gemini-logo_svg__l)`}>
100
102
  <path
101
103
  fill="#FC413D"
102
104
  d="M11.762 6.955c3.485-3.233 4.681-7.61 2.672-9.775S7.97-4.122 4.486-.89-.196 6.72 1.814 8.886s6.463 1.302 9.948-1.93"
103
105
  />
104
106
  </g>
105
- <g filter="url(#gemini-logo_svg__m)">
107
+ <g filter={`url(#${uid}gemini-logo_svg__m)`}>
106
108
  <path
107
109
  fill="#FFEE48"
108
110
  d="M4.618 18.566c2.072 1.482 4.45 1.707 5.312.503s-.118-3.383-2.19-4.865c-2.07-1.483-4.449-1.708-5.31-.504-.863 1.205.117 3.383 2.188 4.866"
@@ -111,7 +113,7 @@ export function GeminiLogoIcon({
111
113
  </g>
112
114
  <defs>
113
115
  <filter
114
- id="gemini-logo_svg__c"
116
+ id={`${uid}gemini-logo_svg__c`}
115
117
  width={12.085}
116
118
  height={13.298}
117
119
  x={-4.1}
@@ -127,7 +129,7 @@ export function GeminiLogoIcon({
127
129
  />
128
130
  </filter>
129
131
  <filter
130
- id="gemini-logo_svg__d"
132
+ id={`${uid}gemini-logo_svg__d`}
131
133
  width={26.113}
132
134
  height={26.366}
133
135
  x={-2.616}
@@ -143,7 +145,7 @@ export function GeminiLogoIcon({
143
145
  />
144
146
  </filter>
145
147
  <filter
146
- id="gemini-logo_svg__e"
148
+ id={`${uid}gemini-logo_svg__e`}
147
149
  width={24.448}
148
150
  height={27.975}
149
151
  x={-4.393}
@@ -159,7 +161,7 @@ export function GeminiLogoIcon({
159
161
  />
160
162
  </filter>
161
163
  <filter
162
- id="gemini-logo_svg__f"
164
+ id={`${uid}gemini-logo_svg__f`}
163
165
  width={24.448}
164
166
  height={27.975}
165
167
  x={-4.393}
@@ -175,7 +177,7 @@ export function GeminiLogoIcon({
175
177
  />
176
178
  </filter>
177
179
  <filter
178
- id="gemini-logo_svg__g"
180
+ id={`${uid}gemini-logo_svg__g`}
179
181
  width={24.533}
180
182
  height={25.079}
181
183
  x={-4.107}
@@ -191,7 +193,7 @@ export function GeminiLogoIcon({
191
193
  />
192
194
  </filter>
193
195
  <filter
194
- id="gemini-logo_svg__h"
196
+ id={`${uid}gemini-logo_svg__h`}
195
197
  width={23.113}
196
198
  height={22.695}
197
199
  x={11.179}
@@ -207,7 +209,7 @@ export function GeminiLogoIcon({
207
209
  />
208
210
  </filter>
209
211
  <filter
210
- id="gemini-logo_svg__i"
212
+ id={`${uid}gemini-logo_svg__i`}
211
213
  width={24.042}
212
214
  height={24.233}
213
215
  x={-9.872}
@@ -223,7 +225,7 @@ export function GeminiLogoIcon({
223
225
  />
224
226
  </filter>
225
227
  <filter
226
- id="gemini-logo_svg__j"
228
+ id={`${uid}gemini-logo_svg__j`}
227
229
  width={24.27}
228
230
  height={23.859}
229
231
  x={4.494}
@@ -239,7 +241,7 @@ export function GeminiLogoIcon({
239
241
  />
240
242
  </filter>
241
243
  <filter
242
- id="gemini-logo_svg__k"
244
+ id={`${uid}gemini-logo_svg__k`}
243
245
  width={17.314}
244
246
  height={15.942}
245
247
  x={6.181}
@@ -255,7 +257,7 @@ export function GeminiLogoIcon({
255
257
  />
256
258
  </filter>
257
259
  <filter
258
- id="gemini-logo_svg__l"
260
+ id={`${uid}gemini-logo_svg__l`}
259
261
  width={21.802}
260
262
  height={21.325}
261
263
  x={-2.777}
@@ -271,7 +273,7 @@ export function GeminiLogoIcon({
271
273
  />
272
274
  </filter>
273
275
  <filter
274
- id="gemini-logo_svg__m"
276
+ id={`${uid}gemini-logo_svg__m`}
275
277
  width={17.078}
276
278
  height={15.869}
277
279
  x={-2.359}
@@ -287,7 +289,7 @@ export function GeminiLogoIcon({
287
289
  />
288
290
  </filter>
289
291
  <linearGradient
290
- id="gemini-logo_svg__a"
292
+ id={`${uid}gemini-logo_svg__a`}
291
293
  x1={7.676}
292
294
  x2={18.047}
293
295
  y1={15.36}