@ably/ui 17.4.0-dev.f194e2c8 → 17.4.0-dev.f9483982

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.
@@ -1,2 +1,2 @@
1
- import React,{memo,useMemo}from"react";import*as Select from"@radix-ui/react-select";import Icon from"../Icon";import TooltipButton from"./TooltipButton";const LanguageSelector=memo(({languages,activeLanguage,onLanguageChange,getLanguageDisplayName,getLanguageIcon,activeLanguageInfo})=>{const desktopLanguageElements=useMemo(()=>languages.map(lang=>{const active=activeLanguage===lang;const displayName=getLanguageDisplayName(lang);return React.createElement(TooltipButton,{key:lang,tooltip:displayName,active:active,onClick:()=>onLanguageChange(lang),icon:getLanguageIcon(lang),variant:"segmented",size:"sm"},displayName)}),[languages,activeLanguage,onLanguageChange,getLanguageDisplayName,getLanguageIcon]);const mobileLanguageElements=useMemo(()=>languages.map(lang=>React.createElement(Select.Item,{key:lang,value:lang,className:"relative flex items-center rounded px-2 py-1.5 text-14 text-neutral-1300 dark:text-neutral-000 select-none hover:bg-neutral-100 dark:hover:bg-neutral-1200 data-[highlighted]:outline-none data-[highlighted]:bg-neutral-100 dark:data-[highlighted]:bg-neutral-1200 focus-base"},React.createElement(Select.ItemText,{asChild:true},React.createElement("div",{className:"flex items-center gap-2"},React.createElement(Icon,{name:getLanguageIcon(lang),size:"20px"}),React.createElement("span",null,getLanguageDisplayName(lang)))),React.createElement(Select.ItemIndicator,{className:"absolute right-2"},React.createElement(Icon,{name:"icon-gui-check-outline",size:"16px"})))),[languages,getLanguageDisplayName,getLanguageIcon]);const mobileSelectValue=useMemo(()=>activeLanguage&&activeLanguageInfo?React.createElement("div",{className:"flex items-center gap-2"},React.createElement(Icon,{name:activeLanguageInfo.icon,size:"20px"}),React.createElement("span",null,activeLanguageInfo.label)):null,[activeLanguage,activeLanguageInfo]);return React.createElement("div",{className:"p-2 border-b border-neutral-200 dark:border-neutral-1100 overflow-x-auto h-[3.625rem]"},React.createElement("div",{className:"hidden sm:flex gap-2"},desktopLanguageElements),React.createElement("div",{className:"sm:hidden w-full"},React.createElement(Select.Root,{value:activeLanguage||undefined,onValueChange:onLanguageChange},React.createElement(Select.Trigger,{className:"w-full inline-flex items-center justify-between rounded-lg px-3 py-2 text-14 text-neutral-1300 dark:text-neutral-000 bg-neutral-200 dark:bg-neutral-1100 hover:bg-neutral-300 dark:hover:bg-neutral-1000 gap-1 border border-neutral-300 dark:border-neutral-900 focus-base","aria-label":"Select language"},React.createElement(Select.Value,{asChild:true},mobileSelectValue),React.createElement(Select.Icon,null,React.createElement(Icon,{name:"icon-gui-chevron-down-outline",size:"16px"}))),React.createElement(Select.Portal,null,React.createElement(Select.Content,{className:"overflow-hidden rounded-md bg-neutral-000 dark:bg-neutral-1300 border border-neutral-200 dark:border-neutral-1000 shadow-md z-50 w-[var(--radix-select-trigger-width)]",position:"popper"},React.createElement(Select.ScrollUpButton,{className:"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base"},React.createElement(Icon,{name:"icon-gui-chevron-down-outline",size:"16px",additionalCSS:"rotate-180"})),React.createElement(Select.Viewport,{className:"p-1"},mobileLanguageElements),React.createElement(Select.ScrollDownButton,{className:"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base"},React.createElement(Icon,{name:"icon-gui-chevron-down-outline",size:"16px"})))))))});LanguageSelector.displayName="LanguageSelector";export default LanguageSelector;
1
+ import React,{memo,useMemo}from"react";import*as Select from"@radix-ui/react-select";import Icon from"../Icon";import TooltipButton from"./TooltipButton";import{getLanguageInfo}from"./languages";const LanguageSelector=memo(({languages,activeLanguage,onLanguageChange})=>{const desktopLanguageElements=useMemo(()=>languages.map(lang=>{const active=activeLanguage===lang;const displayName=getLanguageInfo(lang).label;return React.createElement(TooltipButton,{key:lang,tooltip:displayName,active:active,onClick:()=>onLanguageChange(lang),icon:getLanguageInfo(lang).icon,variant:"segmented",size:"sm"},displayName)}),[languages,activeLanguage,onLanguageChange]);const mobileLanguageElements=useMemo(()=>languages.map(lang=>React.createElement(Select.Item,{key:lang,value:lang,className:"relative flex items-center rounded px-2 py-1.5 text-14 text-neutral-1300 dark:text-neutral-000 select-none hover:bg-neutral-100 dark:hover:bg-neutral-1200 data-[highlighted]:outline-none data-[highlighted]:bg-neutral-100 dark:data-[highlighted]:bg-neutral-1200 focus-base"},React.createElement(Select.ItemText,{asChild:true},React.createElement("div",{className:"flex items-center gap-2"},React.createElement(Icon,{name:getLanguageInfo(lang).icon,size:"20px"}),React.createElement("span",null,getLanguageInfo(lang).label))),React.createElement(Select.ItemIndicator,{className:"absolute right-2"},React.createElement(Icon,{name:"icon-gui-check-outline",size:"16px"})))),[languages]);const mobileSelectValue=useMemo(()=>activeLanguage?React.createElement("div",{className:"flex items-center gap-2"},React.createElement(Icon,{name:getLanguageInfo(activeLanguage).icon,size:"20px"}),React.createElement("span",null,getLanguageInfo(activeLanguage).label)):null,[activeLanguage]);return React.createElement("div",{className:"p-2 border-b border-neutral-200 dark:border-neutral-1100 overflow-x-auto h-[3.625rem]"},React.createElement("div",{className:"hidden sm:flex gap-2"},desktopLanguageElements),React.createElement("div",{className:"sm:hidden w-full"},React.createElement(Select.Root,{value:activeLanguage||undefined,onValueChange:onLanguageChange},React.createElement(Select.Trigger,{className:"w-full inline-flex items-center justify-between rounded-lg px-3 py-2 text-14 text-neutral-1300 dark:text-neutral-000 bg-neutral-200 dark:bg-neutral-1100 hover:bg-neutral-300 dark:hover:bg-neutral-1000 gap-1 border border-neutral-300 dark:border-neutral-900 focus-base","aria-label":"Select language"},React.createElement(Select.Value,{asChild:true},mobileSelectValue),React.createElement(Select.Icon,null,React.createElement(Icon,{name:"icon-gui-chevron-down-outline",size:"16px"}))),React.createElement(Select.Portal,null,React.createElement(Select.Content,{className:"overflow-hidden rounded-md bg-neutral-000 dark:bg-neutral-1300 border border-neutral-200 dark:border-neutral-1000 shadow-md z-50 w-[var(--radix-select-trigger-width)]",position:"popper"},React.createElement(Select.ScrollUpButton,{className:"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base"},React.createElement(Icon,{name:"icon-gui-chevron-down-outline",size:"16px",additionalCSS:"rotate-180"})),React.createElement(Select.Viewport,{className:"p-1"},mobileLanguageElements),React.createElement(Select.ScrollDownButton,{className:"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base"},React.createElement(Icon,{name:"icon-gui-chevron-down-outline",size:"16px"})))))))});LanguageSelector.displayName="LanguageSelector";export default LanguageSelector;
2
2
  //# sourceMappingURL=LanguageSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/CodeSnippet/LanguageSelector.tsx"],"sourcesContent":["import React, { memo, useMemo } from \"react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport Icon from \"../Icon\";\nimport { IconName } from \"../Icon/types\";\nimport TooltipButton from \"./TooltipButton\";\nimport { LanguageInfo } from \"./languages\";\n\ntype LanguageSelectorProps = {\n languages: string[];\n activeLanguage: string | null;\n onLanguageChange: (language: string) => void;\n getLanguageDisplayName: (lang: string) => string;\n getLanguageIcon: (lang: string) => IconName;\n activeLanguageInfo: LanguageInfo | null;\n};\n\nconst LanguageSelector = memo(\n ({\n languages,\n activeLanguage,\n onLanguageChange,\n getLanguageDisplayName,\n getLanguageIcon,\n activeLanguageInfo,\n }: LanguageSelectorProps) => {\n // Memoize the desktop language elements to avoid recreating on each render\n const desktopLanguageElements = useMemo(\n () =>\n languages.map((lang) => {\n const active = activeLanguage === lang;\n const displayName = getLanguageDisplayName(lang);\n\n return (\n <TooltipButton\n key={lang}\n tooltip={displayName}\n active={active}\n onClick={() => onLanguageChange(lang)}\n icon={getLanguageIcon(lang)}\n variant=\"segmented\"\n size=\"sm\"\n >\n {displayName}\n </TooltipButton>\n );\n }),\n [\n languages,\n activeLanguage,\n onLanguageChange,\n getLanguageDisplayName,\n getLanguageIcon,\n ],\n );\n\n // Memoize the mobile language elements\n const mobileLanguageElements = useMemo(\n () =>\n languages.map((lang) => (\n <Select.Item\n key={lang}\n value={lang}\n className=\"relative flex items-center rounded px-2 py-1.5 text-14 text-neutral-1300 dark:text-neutral-000 select-none hover:bg-neutral-100 dark:hover:bg-neutral-1200 data-[highlighted]:outline-none data-[highlighted]:bg-neutral-100 dark:data-[highlighted]:bg-neutral-1200 focus-base\"\n >\n <Select.ItemText asChild>\n <div className=\"flex items-center gap-2\">\n <Icon name={getLanguageIcon(lang)} size=\"20px\" />\n <span>{getLanguageDisplayName(lang)}</span>\n </div>\n </Select.ItemText>\n <Select.ItemIndicator className=\"absolute right-2\">\n <Icon name=\"icon-gui-check-outline\" size=\"16px\" />\n </Select.ItemIndicator>\n </Select.Item>\n )),\n [languages, getLanguageDisplayName, getLanguageIcon],\n );\n\n // Memoize the mobile Select.Value content as it's recreated on every render\n const mobileSelectValue = useMemo(\n () =>\n activeLanguage && activeLanguageInfo ? (\n <div className=\"flex items-center gap-2\">\n <Icon name={activeLanguageInfo.icon} size=\"20px\" />\n <span>{activeLanguageInfo.label}</span>\n </div>\n ) : null,\n [activeLanguage, activeLanguageInfo],\n );\n\n return (\n <div className=\"p-2 border-b border-neutral-200 dark:border-neutral-1100 overflow-x-auto h-[3.625rem]\">\n {/* Desktop language selector - SegmentedControls */}\n <div className=\"hidden sm:flex gap-2\">{desktopLanguageElements}</div>\n\n {/* Mobile language selector - Select dropdown */}\n <div className=\"sm:hidden w-full\">\n <Select.Root\n value={activeLanguage || undefined}\n onValueChange={onLanguageChange}\n >\n <Select.Trigger\n className=\"w-full inline-flex items-center justify-between rounded-lg px-3 py-2 text-14 text-neutral-1300 dark:text-neutral-000 bg-neutral-200 dark:bg-neutral-1100 hover:bg-neutral-300 dark:hover:bg-neutral-1000 gap-1 border border-neutral-300 dark:border-neutral-900 focus-base\"\n aria-label=\"Select language\"\n >\n <Select.Value asChild>{mobileSelectValue}</Select.Value>\n <Select.Icon>\n <Icon name=\"icon-gui-chevron-down-outline\" size=\"16px\" />\n </Select.Icon>\n </Select.Trigger>\n\n <Select.Portal>\n <Select.Content\n className=\"overflow-hidden rounded-md bg-neutral-000 dark:bg-neutral-1300 border border-neutral-200 dark:border-neutral-1000 shadow-md z-50 w-[var(--radix-select-trigger-width)]\"\n position=\"popper\"\n >\n <Select.ScrollUpButton className=\"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base\">\n <Icon\n name=\"icon-gui-chevron-down-outline\"\n size=\"16px\"\n additionalCSS=\"rotate-180\"\n />\n </Select.ScrollUpButton>\n\n <Select.Viewport className=\"p-1\">\n {mobileLanguageElements}\n </Select.Viewport>\n\n <Select.ScrollDownButton className=\"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base\">\n <Icon name=\"icon-gui-chevron-down-outline\" size=\"16px\" />\n </Select.ScrollDownButton>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </div>\n </div>\n );\n },\n);\n\n// Define a display name to improve debugging\nLanguageSelector.displayName = \"LanguageSelector\";\n\nexport default LanguageSelector;\n"],"names":["React","memo","useMemo","Select","Icon","TooltipButton","LanguageSelector","languages","activeLanguage","onLanguageChange","getLanguageDisplayName","getLanguageIcon","activeLanguageInfo","desktopLanguageElements","map","lang","active","displayName","key","tooltip","onClick","icon","variant","size","mobileLanguageElements","Item","value","className","ItemText","asChild","div","name","span","ItemIndicator","mobileSelectValue","label","Root","undefined","onValueChange","Trigger","aria-label","Value","Portal","Content","position","ScrollUpButton","additionalCSS","Viewport","ScrollDownButton"],"mappings":"AAAA,OAAOA,OAASC,IAAI,CAAEC,OAAO,KAAQ,OAAQ,AAC7C,WAAYC,WAAY,wBAAyB,AACjD,QAAOC,SAAU,SAAU,AAE3B,QAAOC,kBAAmB,iBAAkB,CAY5C,MAAMC,iBAAmBL,KACvB,CAAC,CACCM,SAAS,CACTC,cAAc,CACdC,gBAAgB,CAChBC,sBAAsB,CACtBC,eAAe,CACfC,kBAAkB,CACI,IAEtB,MAAMC,wBAA0BX,QAC9B,IACEK,UAAUO,GAAG,CAAC,AAACC,OACb,MAAMC,OAASR,iBAAmBO,KAClC,MAAME,YAAcP,uBAAuBK,MAE3C,OACE,oBAACV,eACCa,IAAKH,KACLI,QAASF,YACTD,OAAQA,OACRI,QAAS,IAAMX,iBAAiBM,MAChCM,KAAMV,gBAAgBI,MACtBO,QAAQ,YACRC,KAAK,MAEJN,YAGP,GACF,CACEV,UACAC,eACAC,iBACAC,uBACAC,gBACD,EAIH,MAAMa,uBAAyBtB,QAC7B,IACEK,UAAUO,GAAG,CAAC,AAACC,MACb,oBAACZ,OAAOsB,IAAI,EACVP,IAAKH,KACLW,MAAOX,KACPY,UAAU,mRAEV,oBAACxB,OAAOyB,QAAQ,EAACC,QAAAA,MACf,oBAACC,OAAIH,UAAU,2BACb,oBAACvB,MAAK2B,KAAMpB,gBAAgBI,MAAOQ,KAAK,SACxC,oBAACS,YAAMtB,uBAAuBK,SAGlC,oBAACZ,OAAO8B,aAAa,EAACN,UAAU,oBAC9B,oBAACvB,MAAK2B,KAAK,yBAAyBR,KAAK,YAIjD,CAAChB,UAAWG,uBAAwBC,gBAAgB,EAItD,MAAMuB,kBAAoBhC,QACxB,IACEM,gBAAkBI,mBAChB,oBAACkB,OAAIH,UAAU,2BACb,oBAACvB,MAAK2B,KAAMnB,mBAAmBS,IAAI,CAAEE,KAAK,SAC1C,oBAACS,YAAMpB,mBAAmBuB,KAAK,GAE/B,KACN,CAAC3B,eAAgBI,mBAAmB,EAGtC,OACE,oBAACkB,OAAIH,UAAU,yFAEb,oBAACG,OAAIH,UAAU,wBAAwBd,yBAGvC,oBAACiB,OAAIH,UAAU,oBACb,oBAACxB,OAAOiC,IAAI,EACVV,MAAOlB,gBAAkB6B,UACzBC,cAAe7B,kBAEf,oBAACN,OAAOoC,OAAO,EACbZ,UAAU,8QACVa,aAAW,mBAEX,oBAACrC,OAAOsC,KAAK,EAACZ,QAAAA,MAASK,mBACvB,oBAAC/B,OAAOC,IAAI,MACV,oBAACA,MAAK2B,KAAK,gCAAgCR,KAAK,WAIpD,oBAACpB,OAAOuC,MAAM,MACZ,oBAACvC,OAAOwC,OAAO,EACbhB,UAAU,yKACViB,SAAS,UAET,oBAACzC,OAAO0C,cAAc,EAAClB,UAAU,8IAC/B,oBAACvB,MACC2B,KAAK,gCACLR,KAAK,OACLuB,cAAc,gBAIlB,oBAAC3C,OAAO4C,QAAQ,EAACpB,UAAU,OACxBH,wBAGH,oBAACrB,OAAO6C,gBAAgB,EAACrB,UAAU,8IACjC,oBAACvB,MAAK2B,KAAK,gCAAgCR,KAAK,cAQhE,EAIFjB,CAAAA,iBAAiBW,WAAW,CAAG,kBAE/B,gBAAeX,gBAAiB"}
1
+ {"version":3,"sources":["../../../src/core/CodeSnippet/LanguageSelector.tsx"],"sourcesContent":["import React, { memo, useMemo } from \"react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport Icon from \"../Icon\";\nimport TooltipButton from \"./TooltipButton\";\nimport { getLanguageInfo } from \"./languages\";\n\ntype LanguageSelectorProps = {\n languages: string[];\n activeLanguage: string | null;\n onLanguageChange: (language: string) => void;\n};\n\nconst LanguageSelector = memo(\n ({ languages, activeLanguage, onLanguageChange }: LanguageSelectorProps) => {\n // Memoize the desktop language elements to avoid recreating on each render\n const desktopLanguageElements = useMemo(\n () =>\n languages.map((lang) => {\n const active = activeLanguage === lang;\n const displayName = getLanguageInfo(lang).label;\n\n return (\n <TooltipButton\n key={lang}\n tooltip={displayName}\n active={active}\n onClick={() => onLanguageChange(lang)}\n icon={getLanguageInfo(lang).icon}\n variant=\"segmented\"\n size=\"sm\"\n >\n {displayName}\n </TooltipButton>\n );\n }),\n [languages, activeLanguage, onLanguageChange],\n );\n\n // Memoize the mobile language elements\n const mobileLanguageElements = useMemo(\n () =>\n languages.map((lang) => (\n <Select.Item\n key={lang}\n value={lang}\n className=\"relative flex items-center rounded px-2 py-1.5 text-14 text-neutral-1300 dark:text-neutral-000 select-none hover:bg-neutral-100 dark:hover:bg-neutral-1200 data-[highlighted]:outline-none data-[highlighted]:bg-neutral-100 dark:data-[highlighted]:bg-neutral-1200 focus-base\"\n >\n <Select.ItemText asChild>\n <div className=\"flex items-center gap-2\">\n <Icon name={getLanguageInfo(lang).icon} size=\"20px\" />\n <span>{getLanguageInfo(lang).label}</span>\n </div>\n </Select.ItemText>\n <Select.ItemIndicator className=\"absolute right-2\">\n <Icon name=\"icon-gui-check-outline\" size=\"16px\" />\n </Select.ItemIndicator>\n </Select.Item>\n )),\n [languages],\n );\n\n // Memoize the mobile Select.Value content as it's recreated on every render\n const mobileSelectValue = useMemo(\n () =>\n activeLanguage ? (\n <div className=\"flex items-center gap-2\">\n <Icon name={getLanguageInfo(activeLanguage).icon} size=\"20px\" />\n <span>{getLanguageInfo(activeLanguage).label}</span>\n </div>\n ) : null,\n [activeLanguage],\n );\n\n return (\n <div className=\"p-2 border-b border-neutral-200 dark:border-neutral-1100 overflow-x-auto h-[3.625rem]\">\n {/* Desktop language selector - SegmentedControls */}\n <div className=\"hidden sm:flex gap-2\">{desktopLanguageElements}</div>\n\n {/* Mobile language selector - Select dropdown */}\n <div className=\"sm:hidden w-full\">\n <Select.Root\n value={activeLanguage || undefined}\n onValueChange={onLanguageChange}\n >\n <Select.Trigger\n className=\"w-full inline-flex items-center justify-between rounded-lg px-3 py-2 text-14 text-neutral-1300 dark:text-neutral-000 bg-neutral-200 dark:bg-neutral-1100 hover:bg-neutral-300 dark:hover:bg-neutral-1000 gap-1 border border-neutral-300 dark:border-neutral-900 focus-base\"\n aria-label=\"Select language\"\n >\n <Select.Value asChild>{mobileSelectValue}</Select.Value>\n <Select.Icon>\n <Icon name=\"icon-gui-chevron-down-outline\" size=\"16px\" />\n </Select.Icon>\n </Select.Trigger>\n\n <Select.Portal>\n <Select.Content\n className=\"overflow-hidden rounded-md bg-neutral-000 dark:bg-neutral-1300 border border-neutral-200 dark:border-neutral-1000 shadow-md z-50 w-[var(--radix-select-trigger-width)]\"\n position=\"popper\"\n >\n <Select.ScrollUpButton className=\"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base\">\n <Icon\n name=\"icon-gui-chevron-down-outline\"\n size=\"16px\"\n additionalCSS=\"rotate-180\"\n />\n </Select.ScrollUpButton>\n\n <Select.Viewport className=\"p-1\">\n {mobileLanguageElements}\n </Select.Viewport>\n\n <Select.ScrollDownButton className=\"flex items-center justify-center h-6 bg-neutral-000 dark:bg-neutral-1300 text-neutral-1300 dark:text-neutral-000 cursor-default focus-base\">\n <Icon name=\"icon-gui-chevron-down-outline\" size=\"16px\" />\n </Select.ScrollDownButton>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </div>\n </div>\n );\n },\n);\n\n// Define a display name to improve debugging\nLanguageSelector.displayName = \"LanguageSelector\";\n\nexport default LanguageSelector;\n"],"names":["React","memo","useMemo","Select","Icon","TooltipButton","getLanguageInfo","LanguageSelector","languages","activeLanguage","onLanguageChange","desktopLanguageElements","map","lang","active","displayName","label","key","tooltip","onClick","icon","variant","size","mobileLanguageElements","Item","value","className","ItemText","asChild","div","name","span","ItemIndicator","mobileSelectValue","Root","undefined","onValueChange","Trigger","aria-label","Value","Portal","Content","position","ScrollUpButton","additionalCSS","Viewport","ScrollDownButton"],"mappings":"AAAA,OAAOA,OAASC,IAAI,CAAEC,OAAO,KAAQ,OAAQ,AAC7C,WAAYC,WAAY,wBAAyB,AACjD,QAAOC,SAAU,SAAU,AAC3B,QAAOC,kBAAmB,iBAAkB,AAC5C,QAASC,eAAe,KAAQ,aAAc,CAQ9C,MAAMC,iBAAmBN,KACvB,CAAC,CAAEO,SAAS,CAAEC,cAAc,CAAEC,gBAAgB,CAAyB,IAErE,MAAMC,wBAA0BT,QAC9B,IACEM,UAAUI,GAAG,CAAC,AAACC,OACb,MAAMC,OAASL,iBAAmBI,KAClC,MAAME,YAAcT,gBAAgBO,MAAMG,KAAK,CAE/C,OACE,oBAACX,eACCY,IAAKJ,KACLK,QAASH,YACTD,OAAQA,OACRK,QAAS,IAAMT,iBAAiBG,MAChCO,KAAMd,gBAAgBO,MAAMO,IAAI,CAChCC,QAAQ,YACRC,KAAK,MAEJP,YAGP,GACF,CAACP,UAAWC,eAAgBC,iBAAiB,EAI/C,MAAMa,uBAAyBrB,QAC7B,IACEM,UAAUI,GAAG,CAAC,AAACC,MACb,oBAACV,OAAOqB,IAAI,EACVP,IAAKJ,KACLY,MAAOZ,KACPa,UAAU,mRAEV,oBAACvB,OAAOwB,QAAQ,EAACC,QAAAA,MACf,oBAACC,OAAIH,UAAU,2BACb,oBAACtB,MAAK0B,KAAMxB,gBAAgBO,MAAMO,IAAI,CAAEE,KAAK,SAC7C,oBAACS,YAAMzB,gBAAgBO,MAAMG,KAAK,IAGtC,oBAACb,OAAO6B,aAAa,EAACN,UAAU,oBAC9B,oBAACtB,MAAK0B,KAAK,yBAAyBR,KAAK,YAIjD,CAACd,UAAU,EAIb,MAAMyB,kBAAoB/B,QACxB,IACEO,eACE,oBAACoB,OAAIH,UAAU,2BACb,oBAACtB,MAAK0B,KAAMxB,gBAAgBG,gBAAgBW,IAAI,CAAEE,KAAK,SACvD,oBAACS,YAAMzB,gBAAgBG,gBAAgBO,KAAK,GAE5C,KACN,CAACP,eAAe,EAGlB,OACE,oBAACoB,OAAIH,UAAU,yFAEb,oBAACG,OAAIH,UAAU,wBAAwBf,yBAGvC,oBAACkB,OAAIH,UAAU,oBACb,oBAACvB,OAAO+B,IAAI,EACVT,MAAOhB,gBAAkB0B,UACzBC,cAAe1B,kBAEf,oBAACP,OAAOkC,OAAO,EACbX,UAAU,8QACVY,aAAW,mBAEX,oBAACnC,OAAOoC,KAAK,EAACX,QAAAA,MAASK,mBACvB,oBAAC9B,OAAOC,IAAI,MACV,oBAACA,MAAK0B,KAAK,gCAAgCR,KAAK,WAIpD,oBAACnB,OAAOqC,MAAM,MACZ,oBAACrC,OAAOsC,OAAO,EACbf,UAAU,yKACVgB,SAAS,UAET,oBAACvC,OAAOwC,cAAc,EAACjB,UAAU,8IAC/B,oBAACtB,MACC0B,KAAK,gCACLR,KAAK,OACLsB,cAAc,gBAIlB,oBAACzC,OAAO0C,QAAQ,EAACnB,UAAU,OACxBH,wBAGH,oBAACpB,OAAO2C,gBAAgB,EAACpB,UAAU,8IACjC,oBAACtB,MAAK0B,KAAK,gCAAgCR,KAAK,cAQhE,EAIFf,CAAAA,iBAAiBQ,WAAW,CAAG,kBAE/B,gBAAeR,gBAAiB"}
@@ -1,2 +1,2 @@
1
- import React,{useState,useEffect,Children,isValidElement,useRef,useCallback,useMemo}from"react";import Code from"./Code";import cn from"./utils/cn";import{getLanguageInfo}from"./CodeSnippet/languages";import Icon from"./Icon";import LanguageSelector from"./CodeSnippet/LanguageSelector";import ApiKeySelector from"./CodeSnippet/ApiKeySelector";import useCopyToClipboard from"./utils/useCopyToClipboard";import PlainCodeView from"./CodeSnippet/PlainCodeView";import CopyButton from"./CodeSnippet/CopyButton";import TooltipButton from"./CodeSnippet/TooltipButton";const substituteApiKey=(content,apiKey)=>{return content.replace(/\{\{API_KEY\}\}/g,apiKey)};const CodeSnippet=({fixed=false,headerRow=false,title="Code",children,className,lang,onChange,apiKeys,sdk,showCodeLines=true,languageOrdering})=>{const codeRef=useRef(null);const{isCopied,copy}=useCopyToClipboard();const extractLanguageFromCode=useCallback(codeElement=>{if(!codeElement||!codeElement.props.className)return null;const classNames=codeElement.props.className.split(" ");const langClass=classNames.find(cls=>cls.startsWith("language-"));if(!langClass)return null;return langClass.substring(9)},[]);const{childrenArray,languages,sdkTypes,originalLangMap,isSinglePlainCommand}=useMemo(()=>{const childrenArray=Children.toArray(children);const languages=[];const sdkTypes=new Set;const originalLangMap=new Map;const isSinglePlainCommand=childrenArray.length===1&&["language-shell","language-text"].some(lang=>isValidElement(childrenArray[0])&&isValidElement(childrenArray[0].props.children)&&childrenArray[0].props.children.props.className?.includes(lang));childrenArray.forEach(child=>{if(!isValidElement(child))return;const preElement=child;const codeElement=isValidElement(preElement.props.children)?preElement.props.children:null;const langName=extractLanguageFromCode(codeElement);if(!langName)return;if(langName.startsWith("realtime_")){const baseLanguage=langName.substring(9);sdkTypes.add("realtime");originalLangMap.set(langName,baseLanguage)}else if(langName.startsWith("rest_")){const baseLanguage=langName.substring(5);sdkTypes.add("rest");originalLangMap.set(langName,baseLanguage)}else{originalLangMap.set(langName,langName)}if(!languages.includes(langName)){languages.push(langName)}});return{childrenArray,languages,sdkTypes,originalLangMap,isSinglePlainCommand}},[children,extractLanguageFromCode]);const[activeSDKType,setActiveSDKType]=useState(()=>{if(sdkTypes.size===0)return null;if(sdk&&sdkTypes.has(sdk))return sdk;if(sdkTypes.has("realtime"))return"realtime";if(sdkTypes.has("rest"))return"rest";return null});const[activeLanguage,setActiveLanguage]=useState(null);const[selectedApiKey,setSelectedApiKey]=useState(()=>apiKeys?.[0]?.keys?.[0]??"");const[isHovering,setIsHovering]=useState(false);const showSDKSelector=sdkTypes.size>0;const hasOnlyJsonSnippet=useMemo(()=>languages.length===1&&languages[0]==="json",[languages]);const filteredLanguages=useMemo(()=>{const filtered=!activeSDKType||!showSDKSelector?[...languages]:languages.filter(lang=>lang.startsWith(`${activeSDKType}_`));if(languageOrdering&&languageOrdering.length>0){filtered.sort((a,b)=>{const aBase=originalLangMap.get(a)||a;const bBase=originalLangMap.get(b)||b;const aIndex=languageOrdering.indexOf(aBase);const bIndex=languageOrdering.indexOf(bBase);if(aIndex!==-1&&bIndex!==-1)return aIndex-bIndex;if(aIndex!==-1)return-1;if(bIndex!==-1)return 1;return 0})}return filtered},[activeSDKType,showSDKSelector,languages,languageOrdering,originalLangMap]);const initialActiveLanguage=useMemo(()=>{if(!lang){return filteredLanguages.length>0?filteredLanguages[0]:null}if(activeSDKType){const prefixedLang=`${activeSDKType}_${lang}`;if(languages.includes(prefixedLang)){return prefixedLang}}if(languages.includes(lang)){return lang}if(getLanguageInfo(lang).label!==lang){return lang}return filteredLanguages.length>0?filteredLanguages[0]:null},[lang,activeSDKType,languages,filteredLanguages]);useEffect(()=>{setActiveLanguage(initialActiveLanguage)},[initialActiveLanguage]);useEffect(()=>{if(apiKeys&&apiKeys.length>0&&apiKeys[0].keys.length>0){setSelectedApiKey(apiKeys[0].keys[0])}},[apiKeys]);const getCleanLanguage=useCallback(lang=>lang?originalLangMap.get(lang)||lang:null,[originalLangMap]);const getLanguageInfoForDisplay=useCallback(lang=>{if(!lang)return null;const cleanLang=getCleanLanguage(lang);return cleanLang?getLanguageInfo(cleanLang):null},[getCleanLanguage]);const getLanguageDisplayName=useCallback(lang=>{const cleanLang=getCleanLanguage(lang);return cleanLang?getLanguageInfo(cleanLang).label:lang},[getCleanLanguage]);const getLanguageIcon=useCallback(lang=>{const cleanLang=getCleanLanguage(lang);return cleanLang?getLanguageInfo(cleanLang).icon:"icon-gui-document-mini"},[getCleanLanguage]);const activeLanguageInfo=useMemo(()=>getLanguageInfoForDisplay(activeLanguage),[getLanguageInfoForDisplay,activeLanguage]);const processedChildren=useMemo(()=>{if(!activeLanguage)return[];const targetLanguage=hasOnlyJsonSnippet?"json":activeLanguage;return childrenArray.filter(child=>{if(!isValidElement(child))return false;const codeElement=isValidElement(child.props.children)?child.props.children:null;const langName=extractLanguageFromCode(codeElement);return langName===targetLanguage}).map(child=>{if(!isValidElement(child))return child;const preElement=child;const codeElement=isValidElement(preElement.props.children)?preElement.props.children:null;if(!codeElement)return child;const codeContent=codeElement.props.children;const langName=extractLanguageFromCode(codeElement);if(!langName)return child;const cleanLang=hasOnlyJsonSnippet?"json":getCleanLanguage(langName)||langName;const langInfo=getLanguageInfo(cleanLang);if(typeof codeContent==="string"||typeof codeContent==="number"||typeof codeContent==="boolean"){let processedContent=String(codeContent);if(apiKeys&&apiKeys.length>0&&selectedApiKey){processedContent=substituteApiKey(processedContent,selectedApiKey)}return React.createElement(Code,{key:langName,language:langInfo.syntaxHighlighterKey||cleanLang,snippet:processedContent,additionalCSS:"bg-neutral-100 text-neutral-1300 dark:bg-neutral-1200 dark:text-neutral-200 px-6 py-4",showLines:showCodeLines})}return child})},[activeLanguage,childrenArray,extractLanguageFromCode,getCleanLanguage,hasOnlyJsonSnippet,showCodeLines,apiKeys,selectedApiKey]);const hasSnippetForActiveLanguage=useMemo(()=>{if(!activeLanguage)return false;if(hasOnlyJsonSnippet)return true;return childrenArray.some(child=>{if(!isValidElement(child))return false;const codeElement=isValidElement(child.props.children)?child.props.children:null;const langName=extractLanguageFromCode(codeElement);return langName===activeLanguage})},[activeLanguage,childrenArray,extractLanguageFromCode,hasOnlyJsonSnippet]);const getCodeText=useCallback(()=>{if(!activeLanguage||!hasSnippetForActiveLanguage||!codeRef.current)return null;const allPreElements=codeRef.current.querySelectorAll("pre");for(const preElement of Array.from(allPreElements)){const codeElement=preElement.querySelector("code");if(!codeElement||!codeElement.className)continue;const classNames=codeElement.className.split(" ");const langClass=classNames.find(cls=>cls.startsWith("language-"));if(!langClass)continue;const langName=langClass.substring(9);if(hasOnlyJsonSnippet&&langName==="json"||!hasOnlyJsonSnippet&&langName===activeLanguage){return codeElement.textContent||""}}return null},[activeLanguage,hasSnippetForActiveLanguage,hasOnlyJsonSnippet]);const handleSDKTypeChange=useCallback(type=>{const nextLang=languages.find(l=>l.startsWith(`${type}_`))??null;setActiveSDKType(type);setActiveLanguage(nextLang)},[languages]);const handleLanguageChange=useCallback(language=>{setActiveLanguage(language);if(onChange){const cleanLang=getCleanLanguage(language)||language;onChange(cleanLang,activeSDKType)}},[onChange,getCleanLanguage,activeSDKType]);const handleApiKeyChange=useCallback(apiKey=>{setSelectedApiKey(apiKey)},[]);const NoSnippetMessage=useMemo(()=>{if(!activeLanguageInfo)return()=>null;return()=>React.createElement("div",{className:"px-16 py-6 ui-text-body2 text-neutral-800 dark:text-neutral-400 text-center flex flex-col gap-3 items-center"},React.createElement(Icon,{name:"icon-gui-exclamation-triangle-outline",color:"text-yellow-600 dark:text-yellow-400",size:"24px"}),React.createElement("p",{className:"ui-text-p3 text-neutral-700 dark:text-neutral-600"},"You're currently viewing the ",activeLanguageInfo.label," docs. There either isn't a ",activeLanguageInfo.label," code sample for this example, or this feature isn't supported in"," ",activeLanguageInfo.label,". Switch language to view this example in a different language, or check which SDKs support this feature."))},[activeLanguageInfo]);const showLanguageSelector=!fixed&&filteredLanguages.length>0;const showFullSelector=filteredLanguages.length>1;console.log("testo",activeLanguage,filteredLanguages);const renderContent=useMemo(()=>{if(!activeLanguage)return null;if(hasSnippetForActiveLanguage){return processedChildren}if(activeLanguageInfo){return React.createElement(NoSnippetMessage,null)}return null},[activeLanguage,hasSnippetForActiveLanguage,processedChildren,activeLanguageInfo,NoSnippetMessage]);if(isSinglePlainCommand){const plainChild=childrenArray[0];if(isValidElement(plainChild)&&isValidElement(plainChild.props.children)){const codeElement=plainChild.props.children;const codeContent=codeElement.props.children;const language=extractLanguageFromCode(codeElement);if(!language||!codeContent)return null;let processedContent=String(codeContent);if(apiKeys&&apiKeys.length>0&&selectedApiKey){processedContent=substituteApiKey(processedContent,selectedApiKey)}return React.createElement(PlainCodeView,{content:processedContent,className:className,language:language,icon:language==="shell"?"icon-gui-command-line-outline":null})}}return React.createElement("div",{className:cn("rounded-lg overflow-hidden bg-neutral-100 dark:bg-neutral-1200 border border-neutral-300 dark:border-neutral-1000 min-h-[3.375rem]",className)},headerRow&&React.createElement("div",{className:"h-[2.375rem] bg-neutral-200 dark:bg-neutral-1100 border-b border-neutral-300 dark:border-neutral-1000 flex items-center py-1 px-3 rounded-t-lg"},React.createElement("div",{className:"flex space-x-1.5"},React.createElement("div",{className:"w-3 h-3 rounded-full bg-orange-500"}),React.createElement("div",{className:"w-3 h-3 rounded-full bg-yellow-500"}),React.createElement("div",{className:"w-3 h-3 rounded-full bg-green-500"})),React.createElement("div",{className:"flex-1 text-center ui-text-p3 font-bold text-neutral-1300 dark:text-neutral-000"},title),React.createElement("div",{className:"w-12"})),showSDKSelector&&React.createElement("div",{className:cn("p-2 border-b border-neutral-200 dark:border-neutral-1100 h-14",headerRow?"":"rounded-t-lg")},React.createElement("div",{className:"flex gap-3 justify-start"},sdkTypes.has("realtime")&&React.createElement(TooltipButton,{tooltip:"Realtime SDK",active:activeSDKType==="realtime",onClick:()=>handleSDKTypeChange("realtime"),variant:"segmented",size:"sm",alwaysShowLabel:true},"Realtime"),sdkTypes.has("rest")&&React.createElement(TooltipButton,{tooltip:"REST SDK",active:activeSDKType==="rest",onClick:()=>handleSDKTypeChange("rest"),variant:"segmented",size:"sm",alwaysShowLabel:true},"REST"))),showLanguageSelector&&(showFullSelector?React.createElement(LanguageSelector,{languages:filteredLanguages,activeLanguage:activeLanguage,onLanguageChange:handleLanguageChange,getLanguageDisplayName:getLanguageDisplayName,getLanguageIcon:getLanguageIcon,activeLanguageInfo:activeLanguageInfo}):React.createElement("div",{className:cn("border-b border-neutral-200 dark:border-neutral-1100 h-[2.125rem] inline-flex items-center px-3",{"rounded-t-lg":!headerRow},{"cursor-pointer":filteredLanguages.length>0}),...filteredLanguages.length>0&&{onClick:()=>handleLanguageChange(filteredLanguages[0])}},filteredLanguages.length>0&&React.createElement(React.Fragment,null,React.createElement(Icon,{name:getLanguageIcon(filteredLanguages[0]),size:"16px",additionalCSS:"mr-2"}),React.createElement("span",{className:"ui-text-label4 font-semibold text-neutral-800 dark:text-neutral-500 select-none"},getLanguageDisplayName(filteredLanguages[0]))))),React.createElement("div",{ref:codeRef,className:"relative",onMouseEnter:()=>setIsHovering(true),onMouseLeave:()=>setIsHovering(false),onFocus:()=>setIsHovering(true),onBlur:()=>setIsHovering(false),tabIndex:0},renderContent,isHovering&&activeLanguage&&hasSnippetForActiveLanguage&&React.createElement(CopyButton,{onCopy:()=>{const text=getCodeText();if(text)copy(text)},isCopied:isCopied})),apiKeys&&React.createElement(ApiKeySelector,{apiKeys:apiKeys,selectedApiKey:selectedApiKey,onApiKeyChange:handleApiKeyChange}))};export default CodeSnippet;
1
+ import React,{useState,Children,isValidElement,useRef,useCallback,useMemo}from"react";import Code from"./Code";import cn from"./utils/cn";import Icon from"./Icon";import{getLanguageInfo}from"./CodeSnippet/languages";import LanguageSelector from"./CodeSnippet/LanguageSelector";import ApiKeySelector from"./CodeSnippet/ApiKeySelector";import useCopyToClipboard from"./utils/useCopyToClipboard";import PlainCodeView from"./CodeSnippet/PlainCodeView";import CopyButton from"./CodeSnippet/CopyButton";import TooltipButton from"./CodeSnippet/TooltipButton";const substituteApiKey=(content,apiKey)=>{return content.replace(/\{\{API_KEY\}\}/g,apiKey)};const CodeSnippet=({fixed=false,headerRow=false,title="Code",children,className,lang,onChange,apiKeys,sdk,showCodeLines=true,languageOrdering})=>{const codeRef=useRef(null);const{isCopied,copy}=useCopyToClipboard();const extractLanguageFromCode=useCallback(codeElement=>{if(!codeElement||!codeElement.props.className)return null;const classNames=codeElement.props.className.split(" ");const langClass=classNames.find(cls=>cls.startsWith("language-"));if(!langClass)return null;return langClass.substring(9)},[]);const{childrenArray,languages,sdkTypes,originalLangMap,isSinglePlainCommand}=useMemo(()=>{const childrenArray=Children.toArray(children);const languages=[];const sdkTypes=new Set;const originalLangMap=new Map;const isSinglePlainCommand=childrenArray.length===1&&["language-shell","language-text"].some(lang=>isValidElement(childrenArray[0])&&isValidElement(childrenArray[0].props.children)&&childrenArray[0].props.children.props.className?.includes(lang));childrenArray.forEach(child=>{if(!isValidElement(child))return;const preElement=child;const codeElement=isValidElement(preElement.props.children)?preElement.props.children:null;const langName=extractLanguageFromCode(codeElement);if(!langName)return;if(langName.startsWith("realtime_")){const baseLanguage=langName.substring(9);sdkTypes.add("realtime");originalLangMap.set(langName,baseLanguage)}else if(langName.startsWith("rest_")){const baseLanguage=langName.substring(5);sdkTypes.add("rest");originalLangMap.set(langName,baseLanguage)}else{originalLangMap.set(langName,langName)}if(!languages.includes(langName)){languages.push(langName)}});return{childrenArray,languages,sdkTypes,originalLangMap,isSinglePlainCommand}},[children,extractLanguageFromCode]);const[activeSDKType,setActiveSDKType]=useState(()=>{if(sdkTypes.size===0)return null;if(sdk&&sdkTypes.has(sdk))return sdk;if(sdkTypes.has("realtime"))return"realtime";if(sdkTypes.has("rest"))return"rest";return null});const showSDKSelector=sdkTypes.size>0;const filteredLanguages=useMemo(()=>{const filtered=!activeSDKType||!showSDKSelector?[...languages]:languages.filter(lang=>lang.startsWith(`${activeSDKType}_`));if(languageOrdering&&languageOrdering.length>0){filtered.sort((a,b)=>{const aBase=originalLangMap.get(a)||a;const bBase=originalLangMap.get(b)||b;const aIndex=languageOrdering.indexOf(aBase);const bIndex=languageOrdering.indexOf(bBase);if(aIndex!==-1&&bIndex!==-1)return aIndex-bIndex;if(aIndex!==-1)return-1;if(bIndex!==-1)return 1;return 0})}return filtered},[activeSDKType,showSDKSelector,languages,languageOrdering,originalLangMap]);const[activeLanguage,setActiveLanguage]=useState(()=>{if(lang)return lang;if(filteredLanguages.length>0)return filteredLanguages[0];return null});const[selectedApiKey,setSelectedApiKey]=useState(()=>apiKeys?.[0]?.keys?.[0]??"");const[isHovering,setIsHovering]=useState(false);const hasOnlyJsonSnippet=useMemo(()=>languages.length===1&&languages[0]==="json",[languages]);const getCleanLanguage=useCallback(lang=>lang?originalLangMap.get(lang)||lang:null,[originalLangMap]);const processedChildren=useMemo(()=>{if(!activeLanguage)return[];const targetLanguage=hasOnlyJsonSnippet?"json":activeLanguage;return childrenArray.filter(child=>{if(!isValidElement(child))return false;const codeElement=isValidElement(child.props.children)?child.props.children:null;const langName=extractLanguageFromCode(codeElement);return langName===targetLanguage}).map(child=>{if(!isValidElement(child))return child;const preElement=child;const codeElement=isValidElement(preElement.props.children)?preElement.props.children:null;if(!codeElement)return child;const codeContent=codeElement.props.children;const langName=extractLanguageFromCode(codeElement);if(!langName)return child;const cleanLang=hasOnlyJsonSnippet?"json":getCleanLanguage(langName)||langName;const langInfo=getLanguageInfo(cleanLang);if(typeof codeContent==="string"||typeof codeContent==="number"||typeof codeContent==="boolean"){let processedContent=String(codeContent);if(apiKeys&&apiKeys.length>0&&selectedApiKey){processedContent=substituteApiKey(processedContent,selectedApiKey)}return React.createElement(Code,{key:langName,language:langInfo.syntaxHighlighterKey||cleanLang,snippet:processedContent,additionalCSS:"bg-neutral-100 text-neutral-1300 dark:bg-neutral-1200 dark:text-neutral-200 px-6 py-4",showLines:showCodeLines})}return child})},[activeLanguage,childrenArray,extractLanguageFromCode,getCleanLanguage,hasOnlyJsonSnippet,showCodeLines,apiKeys,selectedApiKey]);const hasSnippetForActiveLanguage=useMemo(()=>{if(!activeLanguage)return false;if(hasOnlyJsonSnippet)return true;return childrenArray.some(child=>{if(!isValidElement(child))return false;const codeElement=isValidElement(child.props.children)?child.props.children:null;const langName=extractLanguageFromCode(codeElement);return langName===activeLanguage})},[activeLanguage,childrenArray,extractLanguageFromCode,hasOnlyJsonSnippet]);const getCodeText=useCallback(()=>{if(!activeLanguage||!hasSnippetForActiveLanguage||!codeRef.current)return null;const allPreElements=codeRef.current.querySelectorAll("pre");for(const preElement of Array.from(allPreElements)){const codeElement=preElement.querySelector("code");if(!codeElement||!codeElement.className)continue;const classNames=codeElement.className.split(" ");const langClass=classNames.find(cls=>cls.startsWith("language-"));if(!langClass)continue;const langName=langClass.substring(9);if(hasOnlyJsonSnippet&&langName==="json"||!hasOnlyJsonSnippet&&langName===activeLanguage){return codeElement.textContent||""}}return null},[activeLanguage,hasSnippetForActiveLanguage,hasOnlyJsonSnippet]);const handleSDKTypeChange=useCallback(type=>{const nextLang=languages.find(l=>l.startsWith(`${type}_`))??null;setActiveSDKType(type);setActiveLanguage(nextLang)},[languages]);const handleLanguageChange=useCallback(language=>{setActiveLanguage(language);if(onChange){const cleanLang=getCleanLanguage(language)||language;onChange(cleanLang,activeSDKType)}},[onChange,getCleanLanguage,activeSDKType]);const handleApiKeyChange=useCallback(apiKey=>{setSelectedApiKey(apiKey)},[]);const NoSnippetMessage=useMemo(()=>{if(!activeLanguage)return()=>null;const activeLanguageInfo=getLanguageInfo(activeLanguage);return()=>React.createElement("div",{className:"px-16 py-6 ui-text-body2 text-neutral-800 dark:text-neutral-400 text-center flex flex-col gap-3 items-center"},React.createElement(Icon,{name:"icon-gui-exclamation-triangle-outline",color:"text-yellow-600 dark:text-yellow-400",size:"24px"}),React.createElement("p",{className:"ui-text-p3 text-neutral-700 dark:text-neutral-600"},"You're currently viewing the ",activeLanguageInfo.label," docs. There either isn't a ",activeLanguageInfo.label," code sample for this example, or this feature isn't supported in"," ",activeLanguageInfo.label,". Switch language to view this example in a different language, or check which SDKs support this feature."))},[activeLanguage]);const showLanguageSelector=!fixed&&filteredLanguages.length>0;const showFullSelector=filteredLanguages.length>1;console.log("testo",activeLanguage,filteredLanguages);const renderContent=useMemo(()=>{if(!activeLanguage)return null;if(hasSnippetForActiveLanguage){return processedChildren}if(activeLanguage){return React.createElement(NoSnippetMessage,null)}return null},[activeLanguage,hasSnippetForActiveLanguage,processedChildren,NoSnippetMessage]);if(isSinglePlainCommand){const plainChild=childrenArray[0];if(isValidElement(plainChild)&&isValidElement(plainChild.props.children)){const codeElement=plainChild.props.children;const codeContent=codeElement.props.children;const language=extractLanguageFromCode(codeElement);if(!language||!codeContent)return null;let processedContent=String(codeContent);if(apiKeys&&apiKeys.length>0&&selectedApiKey){processedContent=substituteApiKey(processedContent,selectedApiKey)}return React.createElement(PlainCodeView,{content:processedContent,className:className,language:language,icon:language==="shell"?"icon-gui-command-line-outline":null})}}return React.createElement("div",{className:cn("rounded-lg overflow-hidden bg-neutral-100 dark:bg-neutral-1200 border border-neutral-300 dark:border-neutral-1000 min-h-[3.375rem]",className)},headerRow&&React.createElement("div",{className:"h-[2.375rem] bg-neutral-200 dark:bg-neutral-1100 border-b border-neutral-300 dark:border-neutral-1000 flex items-center py-1 px-3 rounded-t-lg"},React.createElement("div",{className:"flex space-x-1.5"},React.createElement("div",{className:"w-3 h-3 rounded-full bg-orange-500"}),React.createElement("div",{className:"w-3 h-3 rounded-full bg-yellow-500"}),React.createElement("div",{className:"w-3 h-3 rounded-full bg-green-500"})),React.createElement("div",{className:"flex-1 text-center ui-text-p3 font-bold text-neutral-1300 dark:text-neutral-000"},title),React.createElement("div",{className:"w-12"})),showSDKSelector&&React.createElement("div",{className:cn("p-2 border-b border-neutral-200 dark:border-neutral-1100 h-14",headerRow?"":"rounded-t-lg")},React.createElement("div",{className:"flex gap-3 justify-start"},sdkTypes.has("realtime")&&React.createElement(TooltipButton,{tooltip:"Realtime SDK",active:activeSDKType==="realtime",onClick:()=>handleSDKTypeChange("realtime"),variant:"segmented",size:"sm",alwaysShowLabel:true},"Realtime"),sdkTypes.has("rest")&&React.createElement(TooltipButton,{tooltip:"REST SDK",active:activeSDKType==="rest",onClick:()=>handleSDKTypeChange("rest"),variant:"segmented",size:"sm",alwaysShowLabel:true},"REST"))),showLanguageSelector&&(showFullSelector?React.createElement(LanguageSelector,{languages:filteredLanguages,activeLanguage:activeLanguage,onLanguageChange:handleLanguageChange}):React.createElement("div",{className:cn("border-b border-neutral-200 dark:border-neutral-1100 h-[2.125rem] inline-flex items-center px-3",{"rounded-t-lg":!headerRow},{"cursor-pointer":filteredLanguages.length>0}),...filteredLanguages.length>0&&{onClick:()=>handleLanguageChange(filteredLanguages[0])}},filteredLanguages.length>0&&React.createElement(React.Fragment,null,React.createElement(Icon,{name:getLanguageInfo(filteredLanguages[0]).icon,size:"16px",additionalCSS:"mr-2"}),React.createElement("span",{className:"ui-text-label4 font-semibold text-neutral-800 dark:text-neutral-500 select-none"},getLanguageInfo(filteredLanguages[0]).label)))),React.createElement("div",{ref:codeRef,className:"relative",onMouseEnter:()=>setIsHovering(true),onMouseLeave:()=>setIsHovering(false),onFocus:()=>setIsHovering(true),onBlur:()=>setIsHovering(false),tabIndex:0},renderContent,isHovering&&activeLanguage&&hasSnippetForActiveLanguage&&React.createElement(CopyButton,{onCopy:()=>{const text=getCodeText();if(text)copy(text)},isCopied:isCopied})),apiKeys&&React.createElement(ApiKeySelector,{apiKeys:apiKeys,selectedApiKey:selectedApiKey,onApiKeyChange:handleApiKeyChange}))};export default CodeSnippet;
2
2
  //# sourceMappingURL=CodeSnippet.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/CodeSnippet.tsx"],"sourcesContent":["import React, {\n useState,\n useEffect,\n Children,\n isValidElement,\n useRef,\n useCallback,\n useMemo,\n} from \"react\";\nimport Code from \"./Code\";\nimport cn from \"./utils/cn\";\nimport { getLanguageInfo } from \"./CodeSnippet/languages\";\nimport Icon from \"./Icon\";\nimport LanguageSelector from \"./CodeSnippet/LanguageSelector\";\nimport ApiKeySelector from \"./CodeSnippet/ApiKeySelector\";\nimport { IconName } from \"./Icon/types\";\nimport useCopyToClipboard from \"./utils/useCopyToClipboard\";\nimport PlainCodeView from \"./CodeSnippet/PlainCodeView\";\nimport CopyButton from \"./CodeSnippet/CopyButton\";\nimport TooltipButton from \"./CodeSnippet/TooltipButton\";\nimport { type CodeSnippetProps, type SDKType } from \"./CodeSnippet/types\";\n\n// Substitution function for API key placeholders\nconst substituteApiKey = (content: string, apiKey: string): string => {\n return content.replace(/\\{\\{API_KEY\\}\\}/g, apiKey);\n};\n\n/**\n * CodeSnippet component that displays code with language switching capability\n */\nconst CodeSnippet: React.FC<CodeSnippetProps> = ({\n fixed = false,\n headerRow = false,\n title = \"Code\",\n children,\n className,\n lang,\n onChange,\n apiKeys,\n sdk,\n showCodeLines = true,\n languageOrdering,\n}) => {\n const codeRef = useRef<HTMLDivElement>(null);\n const { isCopied, copy } = useCopyToClipboard();\n\n // Helper function to extract language from code element\n const extractLanguageFromCode = useCallback(\n (codeElement: React.ReactElement | null): string | null => {\n if (!codeElement || !codeElement.props.className) return null;\n\n const classNames = codeElement.props.className.split(\" \");\n const langClass = classNames.find((cls: string) =>\n cls.startsWith(\"language-\"),\n );\n if (!langClass) return null;\n\n return langClass.substring(9); // Remove \"language-\" prefix\n },\n [],\n );\n\n // Parse children to extract languages and SDK types - only needs to run once\n const {\n childrenArray,\n languages,\n sdkTypes,\n originalLangMap,\n isSinglePlainCommand,\n } = useMemo(() => {\n const childrenArray = Children.toArray(children);\n const languages: string[] = [];\n const sdkTypes = new Set<SDKType>();\n const originalLangMap = new Map<string, string>();\n\n // Check if we have a single plain code command (shell or text)\n const isSinglePlainCommand =\n childrenArray.length === 1 &&\n [\"language-shell\", \"language-text\"].some(\n (lang) =>\n isValidElement(childrenArray[0]) &&\n isValidElement(childrenArray[0].props.children) &&\n childrenArray[0].props.children.props.className?.includes(lang),\n );\n\n // Extract all available languages from children and identify SDK types\n childrenArray.forEach((child) => {\n if (!isValidElement(child)) return;\n\n const preElement = child;\n const codeElement = isValidElement(preElement.props.children)\n ? preElement.props.children\n : null;\n\n const langName = extractLanguageFromCode(codeElement);\n if (!langName) return;\n\n // Look for SDK prefixes in the language name itself\n if (langName.startsWith(\"realtime_\")) {\n const baseLanguage = langName.substring(9);\n sdkTypes.add(\"realtime\");\n originalLangMap.set(langName, baseLanguage);\n } else if (langName.startsWith(\"rest_\")) {\n const baseLanguage = langName.substring(5);\n sdkTypes.add(\"rest\");\n originalLangMap.set(langName, baseLanguage);\n } else {\n originalLangMap.set(langName, langName);\n }\n\n // Add to languages list if not already included\n if (!languages.includes(langName)) {\n languages.push(langName);\n }\n });\n\n return {\n childrenArray,\n languages,\n sdkTypes,\n originalLangMap,\n isSinglePlainCommand,\n };\n }, [children, extractLanguageFromCode]);\n\n // Simplified state management with separate hooks\n const [activeSDKType, setActiveSDKType] = useState<SDKType>(() => {\n if (sdkTypes.size === 0) return null;\n if (sdk && sdkTypes.has(sdk)) return sdk;\n if (sdkTypes.has(\"realtime\")) return \"realtime\";\n if (sdkTypes.has(\"rest\")) return \"rest\";\n return null;\n });\n const [activeLanguage, setActiveLanguage] = useState<string | null>(null);\n const [selectedApiKey, setSelectedApiKey] = useState<string>(\n () => apiKeys?.[0]?.keys?.[0] ?? \"\",\n );\n\n const [isHovering, setIsHovering] = useState(false);\n\n // Check if we need to show SDK type selector\n const showSDKSelector = sdkTypes.size > 0;\n\n // Check if there is only a JSON snippet\n const hasOnlyJsonSnippet = useMemo(\n () => languages.length === 1 && languages[0] === \"json\",\n [languages],\n );\n\n // Get languages filtered by active SDK type & apply ordering\n const filteredLanguages = useMemo(() => {\n // Filter by SDK type if needed\n const filtered =\n !activeSDKType || !showSDKSelector\n ? [...languages]\n : languages.filter((lang) => lang.startsWith(`${activeSDKType}_`));\n\n // Apply custom ordering if provided\n if (languageOrdering && languageOrdering.length > 0) {\n filtered.sort((a, b) => {\n const aBase = originalLangMap.get(a) || a;\n const bBase = originalLangMap.get(b) || b;\n\n const aIndex = languageOrdering.indexOf(aBase);\n const bIndex = languageOrdering.indexOf(bBase);\n\n if (aIndex !== -1 && bIndex !== -1) return aIndex - bIndex;\n if (aIndex !== -1) return -1;\n if (bIndex !== -1) return 1;\n return 0;\n });\n }\n\n return filtered;\n }, [\n activeSDKType,\n showSDKSelector,\n languages,\n languageOrdering,\n originalLangMap,\n ]);\n\n // Determine the initial active language\n const initialActiveLanguage = useMemo((): string | null => {\n if (!lang) {\n return filteredLanguages.length > 0 ? filteredLanguages[0] : null;\n }\n\n // Try with SDK prefix if applicable\n if (activeSDKType) {\n const prefixedLang = `${activeSDKType}_${lang}`;\n if (languages.includes(prefixedLang)) {\n return prefixedLang;\n }\n }\n\n // Try direct match\n if (languages.includes(lang)) {\n return lang;\n }\n\n // Check if it's a known language but not available\n if (getLanguageInfo(lang).label !== lang) {\n return lang;\n }\n\n // Fallback to first available\n return filteredLanguages.length > 0 ? filteredLanguages[0] : null;\n }, [lang, activeSDKType, languages, filteredLanguages]);\n\n // Initialize activeLanguage after filteredLanguages are calculated\n useEffect(() => {\n setActiveLanguage(initialActiveLanguage);\n }, [initialActiveLanguage]);\n\n // Update selected API key if apiKeys changes\n useEffect(() => {\n if (apiKeys && apiKeys.length > 0 && apiKeys[0].keys.length > 0) {\n setSelectedApiKey(apiKeys[0].keys[0]);\n }\n }, [apiKeys]);\n\n // Clean language utilities\n const getCleanLanguage = useCallback(\n (lang: string | null) => (lang ? originalLangMap.get(lang) || lang : null),\n [originalLangMap],\n );\n\n // Get language info for display\n const getLanguageInfoForDisplay = useCallback(\n (lang: string | null) => {\n if (!lang) return null;\n const cleanLang = getCleanLanguage(lang);\n return cleanLang ? getLanguageInfo(cleanLang) : null;\n },\n [getCleanLanguage],\n );\n\n // For language display name and icon (only depends on originalLangMap)\n const getLanguageDisplayName = useCallback(\n (lang: string) => {\n const cleanLang = getCleanLanguage(lang);\n return cleanLang ? getLanguageInfo(cleanLang).label : lang;\n },\n [getCleanLanguage],\n );\n\n const getLanguageIcon = useCallback(\n (lang: string): IconName => {\n const cleanLang = getCleanLanguage(lang);\n return cleanLang\n ? getLanguageInfo(cleanLang).icon\n : \"icon-gui-document-mini\";\n },\n [getCleanLanguage],\n );\n\n // Memoize the active language info\n const activeLanguageInfo = useMemo(\n () => getLanguageInfoForDisplay(activeLanguage),\n [getLanguageInfoForDisplay, activeLanguage],\n );\n\n // Filter and process children for the active language\n const processedChildren = useMemo(() => {\n if (!activeLanguage) return [];\n\n // Target language is either the active one or json in json-only mode\n const targetLanguage = hasOnlyJsonSnippet ? \"json\" : activeLanguage;\n\n return childrenArray\n .filter((child) => {\n if (!isValidElement(child)) return false;\n const codeElement = isValidElement(child.props.children)\n ? child.props.children\n : null;\n const langName = extractLanguageFromCode(codeElement);\n return langName === targetLanguage;\n })\n .map((child) => {\n if (!isValidElement(child)) return child;\n\n const preElement = child;\n const codeElement = isValidElement(preElement.props.children)\n ? preElement.props.children\n : null;\n if (!codeElement) return child;\n\n const codeContent = codeElement.props.children;\n const langName = extractLanguageFromCode(codeElement);\n if (!langName) return child;\n\n const cleanLang = hasOnlyJsonSnippet\n ? \"json\"\n : getCleanLanguage(langName) || langName;\n const langInfo = getLanguageInfo(cleanLang);\n\n // Handle primitive content types\n if (\n typeof codeContent === \"string\" ||\n typeof codeContent === \"number\" ||\n typeof codeContent === \"boolean\"\n ) {\n // Apply API key substitution if apiKeys are provided\n let processedContent = String(codeContent);\n if (apiKeys && apiKeys.length > 0 && selectedApiKey) {\n processedContent = substituteApiKey(\n processedContent,\n selectedApiKey,\n );\n }\n\n return (\n <Code\n key={langName}\n language={langInfo.syntaxHighlighterKey || cleanLang}\n snippet={processedContent}\n additionalCSS=\"bg-neutral-100 text-neutral-1300 dark:bg-neutral-1200 dark:text-neutral-200 px-6 py-4\"\n showLines={showCodeLines}\n />\n );\n }\n\n return child;\n });\n }, [\n activeLanguage,\n childrenArray,\n extractLanguageFromCode,\n getCleanLanguage,\n hasOnlyJsonSnippet,\n showCodeLines,\n apiKeys,\n selectedApiKey,\n ]);\n\n // Check if there's a snippet available for the active language\n const hasSnippetForActiveLanguage = useMemo(() => {\n if (!activeLanguage) return false;\n if (hasOnlyJsonSnippet) return true;\n\n return childrenArray.some((child) => {\n if (!isValidElement(child)) return false;\n const codeElement = isValidElement(child.props.children)\n ? child.props.children\n : null;\n const langName = extractLanguageFromCode(codeElement);\n return langName === activeLanguage;\n });\n }, [\n activeLanguage,\n childrenArray,\n extractLanguageFromCode,\n hasOnlyJsonSnippet,\n ]);\n\n // Function to get the current code text content\n const getCodeText = useCallback((): string | null => {\n if (!activeLanguage || !hasSnippetForActiveLanguage || !codeRef.current)\n return null;\n\n const allPreElements = codeRef.current.querySelectorAll(\"pre\");\n for (const preElement of Array.from(allPreElements)) {\n const codeElement = preElement.querySelector(\"code\");\n if (!codeElement || !codeElement.className) continue;\n\n const classNames = codeElement.className.split(\" \");\n const langClass = classNames.find((cls) => cls.startsWith(\"language-\"));\n if (!langClass) continue;\n\n const langName = langClass.substring(9);\n if (\n (hasOnlyJsonSnippet && langName === \"json\") ||\n (!hasOnlyJsonSnippet && langName === activeLanguage)\n ) {\n return codeElement.textContent || \"\";\n }\n }\n\n return null;\n }, [activeLanguage, hasSnippetForActiveLanguage, hasOnlyJsonSnippet]);\n\n // Event handlers\n const handleSDKTypeChange = useCallback(\n (type: SDKType) => {\n // pick first language matching the new SDK prefix\n const nextLang = languages.find((l) => l.startsWith(`${type}_`)) ?? null;\n setActiveSDKType(type);\n setActiveLanguage(nextLang);\n },\n [languages],\n );\n\n const handleLanguageChange = useCallback(\n (language: string) => {\n setActiveLanguage(language);\n\n // Call onChange with clean language name\n if (onChange) {\n const cleanLang = getCleanLanguage(language) || language;\n onChange(cleanLang, activeSDKType);\n }\n },\n [onChange, getCleanLanguage, activeSDKType],\n );\n\n const handleApiKeyChange = useCallback((apiKey: string) => {\n setSelectedApiKey(apiKey);\n }, []);\n\n // Optimize no-snippet message as a component\n const NoSnippetMessage = useMemo(() => {\n if (!activeLanguageInfo) return () => null;\n\n return () => (\n <div className=\"px-16 py-6 ui-text-body2 text-neutral-800 dark:text-neutral-400 text-center flex flex-col gap-3 items-center\">\n <Icon\n name=\"icon-gui-exclamation-triangle-outline\"\n color=\"text-yellow-600 dark:text-yellow-400\"\n size=\"24px\"\n />\n <p className=\"ui-text-p3 text-neutral-700 dark:text-neutral-600\">\n You&apos;re currently viewing the {activeLanguageInfo.label} docs.\n There either isn&apos;t a {activeLanguageInfo.label} code sample for\n this example, or this feature isn&apos;t supported in{\" \"}\n {activeLanguageInfo.label}. Switch language to view this example in a\n different language, or check which SDKs support this feature.\n </p>\n </div>\n );\n }, [activeLanguageInfo]);\n\n // Determine if we should show the language selector\n const showLanguageSelector = !fixed && filteredLanguages.length > 0;\n const showFullSelector = filteredLanguages.length > 1;\n\n console.log(\"testo\", activeLanguage, filteredLanguages);\n\n // Memoize renderContent\n const renderContent = useMemo(() => {\n if (!activeLanguage) return null;\n\n if (hasSnippetForActiveLanguage) {\n return processedChildren;\n }\n\n if (activeLanguageInfo) {\n return <NoSnippetMessage />;\n }\n\n return null;\n }, [\n activeLanguage,\n hasSnippetForActiveLanguage,\n processedChildren,\n activeLanguageInfo,\n NoSnippetMessage,\n ]);\n\n // Render special case for plain commands (shell or text)\n if (isSinglePlainCommand) {\n const plainChild = childrenArray[0];\n if (\n isValidElement(plainChild) &&\n isValidElement(plainChild.props.children)\n ) {\n const codeElement = plainChild.props.children;\n const codeContent = codeElement.props.children;\n const language = extractLanguageFromCode(codeElement);\n\n if (!language || !codeContent) return null;\n\n // Apply API key substitution if apiKeys are provided\n let processedContent = String(codeContent);\n if (apiKeys && apiKeys.length > 0 && selectedApiKey) {\n processedContent = substituteApiKey(processedContent, selectedApiKey);\n }\n\n return (\n <PlainCodeView\n content={processedContent}\n className={className}\n language={language}\n icon={language === \"shell\" ? \"icon-gui-command-line-outline\" : null}\n />\n );\n }\n }\n\n return (\n <div\n className={cn(\n \"rounded-lg overflow-hidden bg-neutral-100 dark:bg-neutral-1200 border border-neutral-300 dark:border-neutral-1000 min-h-[3.375rem]\",\n className,\n )}\n >\n {headerRow && (\n <div className=\"h-[2.375rem] bg-neutral-200 dark:bg-neutral-1100 border-b border-neutral-300 dark:border-neutral-1000 flex items-center py-1 px-3 rounded-t-lg\">\n <div className=\"flex space-x-1.5\">\n <div className=\"w-3 h-3 rounded-full bg-orange-500\"></div>\n <div className=\"w-3 h-3 rounded-full bg-yellow-500\"></div>\n <div className=\"w-3 h-3 rounded-full bg-green-500\"></div>\n </div>\n\n <div className=\"flex-1 text-center ui-text-p3 font-bold text-neutral-1300 dark:text-neutral-000\">\n {title}\n </div>\n\n {/* Empty div for balance */}\n <div className=\"w-12\"></div>\n </div>\n )}\n\n {showSDKSelector && (\n <div\n className={cn(\n \"p-2 border-b border-neutral-200 dark:border-neutral-1100 h-14\",\n headerRow ? \"\" : \"rounded-t-lg\",\n )}\n >\n <div className=\"flex gap-3 justify-start\">\n {sdkTypes.has(\"realtime\") && (\n <TooltipButton\n tooltip=\"Realtime SDK\"\n active={activeSDKType === \"realtime\"}\n onClick={() => handleSDKTypeChange(\"realtime\")}\n variant=\"segmented\"\n size=\"sm\"\n alwaysShowLabel={true}\n >\n Realtime\n </TooltipButton>\n )}\n\n {sdkTypes.has(\"rest\") && (\n <TooltipButton\n tooltip=\"REST SDK\"\n active={activeSDKType === \"rest\"}\n onClick={() => handleSDKTypeChange(\"rest\")}\n variant=\"segmented\"\n size=\"sm\"\n alwaysShowLabel={true}\n >\n REST\n </TooltipButton>\n )}\n </div>\n </div>\n )}\n\n {showLanguageSelector &&\n (showFullSelector ? (\n <LanguageSelector\n languages={filteredLanguages}\n activeLanguage={activeLanguage}\n onLanguageChange={handleLanguageChange}\n getLanguageDisplayName={getLanguageDisplayName}\n getLanguageIcon={getLanguageIcon}\n activeLanguageInfo={activeLanguageInfo}\n />\n ) : (\n <div\n className={cn(\n \"border-b border-neutral-200 dark:border-neutral-1100 h-[2.125rem] inline-flex items-center px-3\",\n { \"rounded-t-lg\": !headerRow },\n { \"cursor-pointer\": filteredLanguages.length > 0 },\n )}\n {...(filteredLanguages.length > 0 && {\n onClick: () => handleLanguageChange(filteredLanguages[0]),\n })}\n >\n {filteredLanguages.length > 0 && (\n <>\n <Icon\n name={getLanguageIcon(filteredLanguages[0])}\n size=\"16px\"\n additionalCSS=\"mr-2\"\n />\n <span className=\"ui-text-label4 font-semibold text-neutral-800 dark:text-neutral-500 select-none\">\n {getLanguageDisplayName(filteredLanguages[0])}\n </span>\n </>\n )}\n </div>\n ))}\n\n <div\n ref={codeRef}\n className=\"relative\"\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n onFocus={() => setIsHovering(true)}\n onBlur={() => setIsHovering(false)}\n tabIndex={0}\n >\n {renderContent}\n\n {isHovering && activeLanguage && hasSnippetForActiveLanguage && (\n <CopyButton\n onCopy={() => {\n const text = getCodeText();\n if (text) copy(text);\n }}\n isCopied={isCopied}\n />\n )}\n </div>\n\n {apiKeys && (\n <ApiKeySelector\n apiKeys={apiKeys}\n selectedApiKey={selectedApiKey}\n onApiKeyChange={handleApiKeyChange}\n />\n )}\n </div>\n );\n};\n\nexport default CodeSnippet;\n"],"names":["React","useState","useEffect","Children","isValidElement","useRef","useCallback","useMemo","Code","cn","getLanguageInfo","Icon","LanguageSelector","ApiKeySelector","useCopyToClipboard","PlainCodeView","CopyButton","TooltipButton","substituteApiKey","content","apiKey","replace","CodeSnippet","fixed","headerRow","title","children","className","lang","onChange","apiKeys","sdk","showCodeLines","languageOrdering","codeRef","isCopied","copy","extractLanguageFromCode","codeElement","props","classNames","split","langClass","find","cls","startsWith","substring","childrenArray","languages","sdkTypes","originalLangMap","isSinglePlainCommand","toArray","Set","Map","length","some","includes","forEach","child","preElement","langName","baseLanguage","add","set","push","activeSDKType","setActiveSDKType","size","has","activeLanguage","setActiveLanguage","selectedApiKey","setSelectedApiKey","keys","isHovering","setIsHovering","showSDKSelector","hasOnlyJsonSnippet","filteredLanguages","filtered","filter","sort","a","b","aBase","get","bBase","aIndex","indexOf","bIndex","initialActiveLanguage","prefixedLang","label","getCleanLanguage","getLanguageInfoForDisplay","cleanLang","getLanguageDisplayName","getLanguageIcon","icon","activeLanguageInfo","processedChildren","targetLanguage","map","codeContent","langInfo","processedContent","String","key","language","syntaxHighlighterKey","snippet","additionalCSS","showLines","hasSnippetForActiveLanguage","getCodeText","current","allPreElements","querySelectorAll","Array","from","querySelector","textContent","handleSDKTypeChange","type","nextLang","l","handleLanguageChange","handleApiKeyChange","NoSnippetMessage","div","name","color","p","showLanguageSelector","showFullSelector","console","log","renderContent","plainChild","tooltip","active","onClick","variant","alwaysShowLabel","onLanguageChange","span","ref","onMouseEnter","onMouseLeave","onFocus","onBlur","tabIndex","onCopy","text","onApiKeyChange"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/core/CodeSnippet.tsx"],"sourcesContent":["import React, {\n useState,\n Children,\n isValidElement,\n useRef,\n useCallback,\n useMemo,\n} from \"react\";\nimport Code from \"./Code\";\nimport cn from \"./utils/cn\";\nimport Icon from \"./Icon\";\nimport { getLanguageInfo } from \"./CodeSnippet/languages\";\nimport LanguageSelector from \"./CodeSnippet/LanguageSelector\";\nimport ApiKeySelector from \"./CodeSnippet/ApiKeySelector\";\nimport useCopyToClipboard from \"./utils/useCopyToClipboard\";\nimport PlainCodeView from \"./CodeSnippet/PlainCodeView\";\nimport CopyButton from \"./CodeSnippet/CopyButton\";\nimport TooltipButton from \"./CodeSnippet/TooltipButton\";\nimport { type CodeSnippetProps, type SDKType } from \"./CodeSnippet/types\";\n\n// Substitution function for API key placeholders\nconst substituteApiKey = (content: string, apiKey: string): string => {\n return content.replace(/\\{\\{API_KEY\\}\\}/g, apiKey);\n};\n\n/**\n * CodeSnippet component that displays code with language switching capability\n */\nconst CodeSnippet: React.FC<CodeSnippetProps> = ({\n fixed = false,\n headerRow = false,\n title = \"Code\",\n children,\n className,\n lang,\n onChange,\n apiKeys,\n sdk,\n showCodeLines = true,\n languageOrdering,\n}) => {\n const codeRef = useRef<HTMLDivElement>(null);\n const { isCopied, copy } = useCopyToClipboard();\n\n // Helper function to extract language from code element\n const extractLanguageFromCode = useCallback(\n (codeElement: React.ReactElement | null): string | null => {\n if (!codeElement || !codeElement.props.className) return null;\n\n const classNames = codeElement.props.className.split(\" \");\n const langClass = classNames.find((cls: string) =>\n cls.startsWith(\"language-\"),\n );\n if (!langClass) return null;\n\n return langClass.substring(9); // Remove \"language-\" prefix\n },\n [],\n );\n\n // Parse children to extract languages and SDK types - only needs to run once\n const {\n childrenArray,\n languages,\n sdkTypes,\n originalLangMap,\n isSinglePlainCommand,\n } = useMemo(() => {\n const childrenArray = Children.toArray(children);\n const languages: string[] = [];\n const sdkTypes = new Set<SDKType>();\n const originalLangMap = new Map<string, string>();\n\n // Check if we have a single plain code command (shell or text)\n const isSinglePlainCommand =\n childrenArray.length === 1 &&\n [\"language-shell\", \"language-text\"].some(\n (lang) =>\n isValidElement(childrenArray[0]) &&\n isValidElement(childrenArray[0].props.children) &&\n childrenArray[0].props.children.props.className?.includes(lang),\n );\n\n // Extract all available languages from children and identify SDK types\n childrenArray.forEach((child) => {\n if (!isValidElement(child)) return;\n\n const preElement = child;\n const codeElement = isValidElement(preElement.props.children)\n ? preElement.props.children\n : null;\n\n const langName = extractLanguageFromCode(codeElement);\n if (!langName) return;\n\n // Look for SDK prefixes in the language name itself\n if (langName.startsWith(\"realtime_\")) {\n const baseLanguage = langName.substring(9);\n sdkTypes.add(\"realtime\");\n originalLangMap.set(langName, baseLanguage);\n } else if (langName.startsWith(\"rest_\")) {\n const baseLanguage = langName.substring(5);\n sdkTypes.add(\"rest\");\n originalLangMap.set(langName, baseLanguage);\n } else {\n originalLangMap.set(langName, langName);\n }\n\n // Add to languages list if not already included\n if (!languages.includes(langName)) {\n languages.push(langName);\n }\n });\n\n return {\n childrenArray,\n languages,\n sdkTypes,\n originalLangMap,\n isSinglePlainCommand,\n };\n }, [children, extractLanguageFromCode]);\n\n // Simplified state management with separate hooks\n const [activeSDKType, setActiveSDKType] = useState<SDKType>(() => {\n if (sdkTypes.size === 0) return null;\n if (sdk && sdkTypes.has(sdk)) return sdk;\n if (sdkTypes.has(\"realtime\")) return \"realtime\";\n if (sdkTypes.has(\"rest\")) return \"rest\";\n return null;\n });\n\n // Check if we need to show SDK type selector\n const showSDKSelector = sdkTypes.size > 0;\n\n // Get languages filtered by active SDK type & apply ordering\n const filteredLanguages = useMemo(() => {\n // Filter by SDK type if needed\n const filtered =\n !activeSDKType || !showSDKSelector\n ? [...languages]\n : languages.filter((lang) => lang.startsWith(`${activeSDKType}_`));\n\n // Apply custom ordering if provided\n if (languageOrdering && languageOrdering.length > 0) {\n filtered.sort((a, b) => {\n const aBase = originalLangMap.get(a) || a;\n const bBase = originalLangMap.get(b) || b;\n\n const aIndex = languageOrdering.indexOf(aBase);\n const bIndex = languageOrdering.indexOf(bBase);\n\n if (aIndex !== -1 && bIndex !== -1) return aIndex - bIndex;\n if (aIndex !== -1) return -1;\n if (bIndex !== -1) return 1;\n return 0;\n });\n }\n\n return filtered;\n }, [\n activeSDKType,\n showSDKSelector,\n languages,\n languageOrdering,\n originalLangMap,\n ]);\n\n const [activeLanguage, setActiveLanguage] = useState<string | null>(() => {\n if (lang) return lang;\n if (filteredLanguages.length > 0) return filteredLanguages[0];\n return null;\n });\n\n const [selectedApiKey, setSelectedApiKey] = useState<string>(\n () => apiKeys?.[0]?.keys?.[0] ?? \"\",\n );\n\n const [isHovering, setIsHovering] = useState(false);\n\n // Check if there is only a JSON snippet\n const hasOnlyJsonSnippet = useMemo(\n () => languages.length === 1 && languages[0] === \"json\",\n [languages],\n );\n\n // Clean language utilities\n const getCleanLanguage = useCallback(\n (lang: string | null) => (lang ? originalLangMap.get(lang) || lang : null),\n [originalLangMap],\n );\n\n // Filter and process children for the active language\n const processedChildren = useMemo(() => {\n if (!activeLanguage) return [];\n\n // Target language is either the active one or json in json-only mode\n const targetLanguage = hasOnlyJsonSnippet ? \"json\" : activeLanguage;\n\n return childrenArray\n .filter((child) => {\n if (!isValidElement(child)) return false;\n const codeElement = isValidElement(child.props.children)\n ? child.props.children\n : null;\n const langName = extractLanguageFromCode(codeElement);\n return langName === targetLanguage;\n })\n .map((child) => {\n if (!isValidElement(child)) return child;\n\n const preElement = child;\n const codeElement = isValidElement(preElement.props.children)\n ? preElement.props.children\n : null;\n if (!codeElement) return child;\n\n const codeContent = codeElement.props.children;\n const langName = extractLanguageFromCode(codeElement);\n if (!langName) return child;\n\n const cleanLang = hasOnlyJsonSnippet\n ? \"json\"\n : getCleanLanguage(langName) || langName;\n const langInfo = getLanguageInfo(cleanLang);\n\n // Handle primitive content types\n if (\n typeof codeContent === \"string\" ||\n typeof codeContent === \"number\" ||\n typeof codeContent === \"boolean\"\n ) {\n // Apply API key substitution if apiKeys are provided\n let processedContent = String(codeContent);\n if (apiKeys && apiKeys.length > 0 && selectedApiKey) {\n processedContent = substituteApiKey(\n processedContent,\n selectedApiKey,\n );\n }\n\n return (\n <Code\n key={langName}\n language={langInfo.syntaxHighlighterKey || cleanLang}\n snippet={processedContent}\n additionalCSS=\"bg-neutral-100 text-neutral-1300 dark:bg-neutral-1200 dark:text-neutral-200 px-6 py-4\"\n showLines={showCodeLines}\n />\n );\n }\n\n return child;\n });\n }, [\n activeLanguage,\n childrenArray,\n extractLanguageFromCode,\n getCleanLanguage,\n hasOnlyJsonSnippet,\n showCodeLines,\n apiKeys,\n selectedApiKey,\n ]);\n\n // Check if there's a snippet available for the active language\n const hasSnippetForActiveLanguage = useMemo(() => {\n if (!activeLanguage) return false;\n if (hasOnlyJsonSnippet) return true;\n\n return childrenArray.some((child) => {\n if (!isValidElement(child)) return false;\n const codeElement = isValidElement(child.props.children)\n ? child.props.children\n : null;\n const langName = extractLanguageFromCode(codeElement);\n return langName === activeLanguage;\n });\n }, [\n activeLanguage,\n childrenArray,\n extractLanguageFromCode,\n hasOnlyJsonSnippet,\n ]);\n\n // Function to get the current code text content\n const getCodeText = useCallback((): string | null => {\n if (!activeLanguage || !hasSnippetForActiveLanguage || !codeRef.current)\n return null;\n\n const allPreElements = codeRef.current.querySelectorAll(\"pre\");\n for (const preElement of Array.from(allPreElements)) {\n const codeElement = preElement.querySelector(\"code\");\n if (!codeElement || !codeElement.className) continue;\n\n const classNames = codeElement.className.split(\" \");\n const langClass = classNames.find((cls) => cls.startsWith(\"language-\"));\n if (!langClass) continue;\n\n const langName = langClass.substring(9);\n if (\n (hasOnlyJsonSnippet && langName === \"json\") ||\n (!hasOnlyJsonSnippet && langName === activeLanguage)\n ) {\n return codeElement.textContent || \"\";\n }\n }\n\n return null;\n }, [activeLanguage, hasSnippetForActiveLanguage, hasOnlyJsonSnippet]);\n\n // Event handlers\n const handleSDKTypeChange = useCallback(\n (type: SDKType) => {\n // pick first language matching the new SDK prefix\n const nextLang = languages.find((l) => l.startsWith(`${type}_`)) ?? null;\n setActiveSDKType(type);\n setActiveLanguage(nextLang);\n },\n [languages],\n );\n\n const handleLanguageChange = useCallback(\n (language: string) => {\n setActiveLanguage(language);\n\n // Call onChange with clean language name\n if (onChange) {\n const cleanLang = getCleanLanguage(language) || language;\n onChange(cleanLang, activeSDKType);\n }\n },\n [onChange, getCleanLanguage, activeSDKType],\n );\n\n const handleApiKeyChange = useCallback((apiKey: string) => {\n setSelectedApiKey(apiKey);\n }, []);\n\n // Optimize no-snippet message as a component\n const NoSnippetMessage = useMemo(() => {\n if (!activeLanguage) return () => null;\n\n const activeLanguageInfo = getLanguageInfo(activeLanguage);\n\n return () => (\n <div className=\"px-16 py-6 ui-text-body2 text-neutral-800 dark:text-neutral-400 text-center flex flex-col gap-3 items-center\">\n <Icon\n name=\"icon-gui-exclamation-triangle-outline\"\n color=\"text-yellow-600 dark:text-yellow-400\"\n size=\"24px\"\n />\n <p className=\"ui-text-p3 text-neutral-700 dark:text-neutral-600\">\n You&apos;re currently viewing the {activeLanguageInfo.label} docs.\n There either isn&apos;t a {activeLanguageInfo.label} code sample for\n this example, or this feature isn&apos;t supported in{\" \"}\n {activeLanguageInfo.label}. Switch language to view this example in a\n different language, or check which SDKs support this feature.\n </p>\n </div>\n );\n }, [activeLanguage]);\n\n // Determine if we should show the language selector\n const showLanguageSelector = !fixed && filteredLanguages.length > 0;\n const showFullSelector = filteredLanguages.length > 1;\n\n console.log(\"testo\", activeLanguage, filteredLanguages);\n\n // Memoize renderContent\n const renderContent = useMemo(() => {\n if (!activeLanguage) return null;\n\n if (hasSnippetForActiveLanguage) {\n return processedChildren;\n }\n\n if (activeLanguage) {\n return <NoSnippetMessage />;\n }\n\n return null;\n }, [\n activeLanguage,\n hasSnippetForActiveLanguage,\n processedChildren,\n NoSnippetMessage,\n ]);\n\n // Render special case for plain commands (shell or text)\n if (isSinglePlainCommand) {\n const plainChild = childrenArray[0];\n if (\n isValidElement(plainChild) &&\n isValidElement(plainChild.props.children)\n ) {\n const codeElement = plainChild.props.children;\n const codeContent = codeElement.props.children;\n const language = extractLanguageFromCode(codeElement);\n\n if (!language || !codeContent) return null;\n\n // Apply API key substitution if apiKeys are provided\n let processedContent = String(codeContent);\n if (apiKeys && apiKeys.length > 0 && selectedApiKey) {\n processedContent = substituteApiKey(processedContent, selectedApiKey);\n }\n\n return (\n <PlainCodeView\n content={processedContent}\n className={className}\n language={language}\n icon={language === \"shell\" ? \"icon-gui-command-line-outline\" : null}\n />\n );\n }\n }\n\n return (\n <div\n className={cn(\n \"rounded-lg overflow-hidden bg-neutral-100 dark:bg-neutral-1200 border border-neutral-300 dark:border-neutral-1000 min-h-[3.375rem]\",\n className,\n )}\n >\n {headerRow && (\n <div className=\"h-[2.375rem] bg-neutral-200 dark:bg-neutral-1100 border-b border-neutral-300 dark:border-neutral-1000 flex items-center py-1 px-3 rounded-t-lg\">\n <div className=\"flex space-x-1.5\">\n <div className=\"w-3 h-3 rounded-full bg-orange-500\"></div>\n <div className=\"w-3 h-3 rounded-full bg-yellow-500\"></div>\n <div className=\"w-3 h-3 rounded-full bg-green-500\"></div>\n </div>\n\n <div className=\"flex-1 text-center ui-text-p3 font-bold text-neutral-1300 dark:text-neutral-000\">\n {title}\n </div>\n\n {/* Empty div for balance */}\n <div className=\"w-12\"></div>\n </div>\n )}\n\n {showSDKSelector && (\n <div\n className={cn(\n \"p-2 border-b border-neutral-200 dark:border-neutral-1100 h-14\",\n headerRow ? \"\" : \"rounded-t-lg\",\n )}\n >\n <div className=\"flex gap-3 justify-start\">\n {sdkTypes.has(\"realtime\") && (\n <TooltipButton\n tooltip=\"Realtime SDK\"\n active={activeSDKType === \"realtime\"}\n onClick={() => handleSDKTypeChange(\"realtime\")}\n variant=\"segmented\"\n size=\"sm\"\n alwaysShowLabel={true}\n >\n Realtime\n </TooltipButton>\n )}\n\n {sdkTypes.has(\"rest\") && (\n <TooltipButton\n tooltip=\"REST SDK\"\n active={activeSDKType === \"rest\"}\n onClick={() => handleSDKTypeChange(\"rest\")}\n variant=\"segmented\"\n size=\"sm\"\n alwaysShowLabel={true}\n >\n REST\n </TooltipButton>\n )}\n </div>\n </div>\n )}\n\n {showLanguageSelector &&\n (showFullSelector ? (\n <LanguageSelector\n languages={filteredLanguages}\n activeLanguage={activeLanguage}\n onLanguageChange={handleLanguageChange}\n />\n ) : (\n <div\n className={cn(\n \"border-b border-neutral-200 dark:border-neutral-1100 h-[2.125rem] inline-flex items-center px-3\",\n { \"rounded-t-lg\": !headerRow },\n { \"cursor-pointer\": filteredLanguages.length > 0 },\n )}\n {...(filteredLanguages.length > 0 && {\n onClick: () => handleLanguageChange(filteredLanguages[0]),\n })}\n >\n {filteredLanguages.length > 0 && (\n <>\n <Icon\n name={getLanguageInfo(filteredLanguages[0]).icon}\n size=\"16px\"\n additionalCSS=\"mr-2\"\n />\n <span className=\"ui-text-label4 font-semibold text-neutral-800 dark:text-neutral-500 select-none\">\n {getLanguageInfo(filteredLanguages[0]).label}\n </span>\n </>\n )}\n </div>\n ))}\n\n <div\n ref={codeRef}\n className=\"relative\"\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n onFocus={() => setIsHovering(true)}\n onBlur={() => setIsHovering(false)}\n tabIndex={0}\n >\n {renderContent}\n {isHovering && activeLanguage && hasSnippetForActiveLanguage && (\n <CopyButton\n onCopy={() => {\n const text = getCodeText();\n if (text) copy(text);\n }}\n isCopied={isCopied}\n />\n )}\n </div>\n\n {apiKeys && (\n <ApiKeySelector\n apiKeys={apiKeys}\n selectedApiKey={selectedApiKey}\n onApiKeyChange={handleApiKeyChange}\n />\n )}\n </div>\n );\n};\n\nexport default CodeSnippet;\n"],"names":["React","useState","Children","isValidElement","useRef","useCallback","useMemo","Code","cn","Icon","getLanguageInfo","LanguageSelector","ApiKeySelector","useCopyToClipboard","PlainCodeView","CopyButton","TooltipButton","substituteApiKey","content","apiKey","replace","CodeSnippet","fixed","headerRow","title","children","className","lang","onChange","apiKeys","sdk","showCodeLines","languageOrdering","codeRef","isCopied","copy","extractLanguageFromCode","codeElement","props","classNames","split","langClass","find","cls","startsWith","substring","childrenArray","languages","sdkTypes","originalLangMap","isSinglePlainCommand","toArray","Set","Map","length","some","includes","forEach","child","preElement","langName","baseLanguage","add","set","push","activeSDKType","setActiveSDKType","size","has","showSDKSelector","filteredLanguages","filtered","filter","sort","a","b","aBase","get","bBase","aIndex","indexOf","bIndex","activeLanguage","setActiveLanguage","selectedApiKey","setSelectedApiKey","keys","isHovering","setIsHovering","hasOnlyJsonSnippet","getCleanLanguage","processedChildren","targetLanguage","map","codeContent","cleanLang","langInfo","processedContent","String","key","language","syntaxHighlighterKey","snippet","additionalCSS","showLines","hasSnippetForActiveLanguage","getCodeText","current","allPreElements","querySelectorAll","Array","from","querySelector","textContent","handleSDKTypeChange","type","nextLang","l","handleLanguageChange","handleApiKeyChange","NoSnippetMessage","activeLanguageInfo","div","name","color","p","label","showLanguageSelector","showFullSelector","console","log","renderContent","plainChild","icon","tooltip","active","onClick","variant","alwaysShowLabel","onLanguageChange","span","ref","onMouseEnter","onMouseLeave","onFocus","onBlur","tabIndex","onCopy","text","onApiKeyChange"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -336,17 +336,12 @@ export default CopyButton;
336
336
 
337
337
  declare module '@ably/ui/core/CodeSnippet/LanguageSelector' {
338
338
  import React from "react";
339
- import { IconName } from ".@ably/ui/core/Icon/types";
340
- import { LanguageInfo } from "@ably/ui/core/languages";
341
339
  type LanguageSelectorProps = {
342
340
  languages: string[];
343
341
  activeLanguage: string | null;
344
342
  onLanguageChange: (language: string) => void;
345
- getLanguageDisplayName: (lang: string) => string;
346
- getLanguageIcon: (lang: string) => IconName;
347
- activeLanguageInfo: LanguageInfo | null;
348
343
  };
349
- const LanguageSelector: React.MemoExoticComponent<({ languages, activeLanguage, onLanguageChange, getLanguageDisplayName, getLanguageIcon, activeLanguageInfo, }: LanguageSelectorProps) => import("react/jsx-runtime").JSX.Element>;
344
+ const LanguageSelector: React.MemoExoticComponent<({ languages, activeLanguage, onLanguageChange }: LanguageSelectorProps) => import("react/jsx-runtime").JSX.Element>;
350
345
  export default LanguageSelector;
351
346
  //# sourceMappingURL=LanguageSelector.d.ts.map
352
347
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ably/ui",
3
- "version": "17.4.0-dev.f194e2c8",
3
+ "version": "17.4.0-dev.f9483982",
4
4
  "description": "Home of the Ably design system library ([design.ably.com](https://design.ably.com)). It provides a showcase, development/test environment and a publishing pipeline for different distributables.",
5
5
  "repository": {
6
6
  "type": "git",