{"componentChunkName":"component---src-templates-doc-tsx","path":"/contributing/platforms/","result":{"data":{"file":{"id":"b60c5ed3-bc91-5b3f-a664-b2e095acc4cc","relativePath":"contributing/platforms/index.mdx","sourceInstanceName":"docs","childMarkdownRemark":null,"childMdx":{"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Platform Portals\",\n  \"noindex\": true,\n  \"sidebar_order\": 3\n};\n\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\n\nvar CodeTabs = makeShortcode(\"CodeTabs\");\nvar CodeBlock = makeShortcode(\"CodeBlock\");\nvar Note = makeShortcode(\"Note\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Platform content lives in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"src/platforms\"), \" and follows some specific rules to generate content. The content is rendered using the same features as all other \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"../\"\n  }), \"pages\"), \", but has some additional functionality exposed to clone content and encapsulate platforms as portals.\"), mdx(\"p\", null, \"Directory structure has meaning within the platforms directory, and looks something akin to:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"text\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-text\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"[platformName]/\\n  child.mdx\\n  childTwo/\\n    index.mdx\\n  common/\\n    aSharedPage.mdx\\n  guides/\\n    [guideName]/\\n      uniqueChild.mdx\\n      childTwo/\\n        index.mdx\")))))), mdx(\"p\", null, \"Platforms will generate a list of \\\"guides\\\", and inherit all content within common. Given the above example, we end up with a variety of semi-duplicated URLs:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"text\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-text\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"/platforms/platformName/\\n/platforms/platformName/config.yml\\n/platforms/platformName/child/\\n/platforms/platformName/childTwo/\\n/platforms/platformName/aSharedPage/\\n/platforms/platformName/guides/guideName/\\n/platforms/platformName/guides/guideName/config.yml\\n/platforms/platformName/guides/guideName/child/\\n/platforms/platformName/guides/guideName/uniqueChild/\\n/platforms/platformName/guides/guideName/childTwo/\\n/platforms/platformName/guides/guideName/aSharedPage/\")))))), mdx(\"p\", null, \"This is generated by inheriting all content with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"common/\"), \" directory, then adding (or overriding with) content from the siblings (or children as we'd call them). In the above example, you'll see \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"aSharedPage\"), \" is loaded at two different URLs, and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"childTwo\"), \" is overwritten by \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"guideName\"), \".\"), mdx(\"p\", null, \"The sidebar on platform pages (handled by \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"<PlatformSidebar>\"), \") will generate with the Guide, or the Base Platform being the primary section, in addition to a list of other guides available in a section below it. This means that all content is focused on the current guide (usually a framework) they're in, ensuring ease of navigation.\"), mdx(\"h2\", {\n    \"id\": \"configuration\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#configuration\",\n    \"aria-label\": \"configuration permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Configuration\"), mdx(\"p\", null, \"Configuration is read (in order) from \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"[namespace]/index.mdx\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"[namespace]/config.yml\"), \". This means that a platform's index can be fully rendered via a common page.\"), mdx(\"p\", null, \"Valid configuration attributes are:\"), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"dt\"\n  }, \"title\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"The display name for a platform.\"))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"dt\"\n  }, \"supportLevel\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"The level of support. \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"production\"), \" (default) or \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"community\")))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"dt\"\n  }, \"caseStyle\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"The casing style for code samples. \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"canonical\"), \" (default), \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"camelCase\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"snake_case\"), \", or \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"PascalCase\")))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"dt\"\n  }, \"categories\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"A list of categories for future support. Known values are \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"browser\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"mobile\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"desktop\"), \", and \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"server\"), \".\"))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"dt\"\n  }, \"fallbackPlatform\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"The key to use for defaults. Can use full key syntax of \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"platformName\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"platformName.guideName\"), \".\"))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"dt\"\n  }, \"sdk\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"The name of the SDK, if available. Used to embed SDK information on pages.\"))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"dt\"\n  }, \"aliases\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"A list of aliases for this platform. For example, \\\"Cocoa\\\" might apply to Apple, or \\\"C#\\\" might apply to .NET.\"))), mdx(\"h2\", {\n    \"id\": \"shared-content\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#shared-content\",\n    \"aria-label\": \"shared content permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Shared Content\"), mdx(\"p\", null, \"There are two forms of shared (duplicated) content available:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"platform-specific content\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"globally shared content\")), mdx(\"p\", null, \"Both of these are contained using the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"common/\"), \" folder paradigm. The global content is within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"src/platforms/common/\"), \" and for platform specific content it should be created within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"src/platforms/[platformName]/common/\"), \".\"), mdx(\"p\", null, \"All of this content will be automatically duplicated within every guide, as well as every platform (when it's at the global level). This leverages components like \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"PlatformContent\"), \" which can automatically substitute content out.\"), mdx(\"h3\", {\n    \"id\": \"page-visibility\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#page-visibility\",\n    \"aria-label\": \"page visibility permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Page Visibility\"), mdx(\"p\", null, \"Sometimes a page may not make sense within the context of a given platform. To control this, you can use the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"supported\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"notSupported\"), \" frontmatter on all common pages in platforms.\"), mdx(Note, {\n    mdxType: \"Note\"\n  }, mdx(\"markdown\", null, mdx(\"p\", null, \"Page visiblity works similar to the supported/notSupported attributes in other platform components (such as \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"PlatformSection\"), \").\"))), mdx(\"p\", null, \"For example, to make attachments only available on native platforms, you'd open up the document file (e.g. \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"attachments/index.mdx\"), \") and add the following to frontmatter:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"markdown\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"markdown\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-markdown\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-markdown\"\n  }), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token hr punctuation\"\n  }), \"---\"), \"\\nsupported:\\n  \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token title important\"\n  }), \"- native\\n\", mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"---\")))))))), mdx(\"p\", null, \"If you wanted to make hide the content for a platform by default, but enable it for a guide, you can do that as well:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"markdown\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"markdown\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-markdown\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-markdown\"\n  }), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token hr punctuation\"\n  }), \"---\"), \"\\nsupported:\\n  \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token list punctuation\"\n  }), \"-\"), \" native.ue4\\nnotSupported:\\n  \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token title important\"\n  }), \"- native\\n\", mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"---\")))))))), mdx(\"h2\", {\n    \"id\": \"platform-specific-components\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#platform-specific-components\",\n    \"aria-label\": \"platform specific components permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Platform-Specific Components\"), mdx(\"p\", null, \"There are a number of components that aid the development of platform specific pages, as well as behave differently when a platform is active. For more information, see \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"../pages/components/\"\n  }), \"components\"), \".\"), mdx(\"h2\", {\n    \"id\": \"delineation\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#delineation\",\n    \"aria-label\": \"delineation permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Delineation\"), mdx(\"p\", null, \"We separate platform portals by the main way or mechanism that developers interact with the platform and with Sentry.\"), mdx(\"p\", null, \"In general, use this decision tree:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Is it a new programming language? -> new platform\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Does it require a separate SDK or way of sending data to Sentry? -> new platform\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Does it count as a \\\"platform\\\" -> new platform\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Otherwise -> add it as a Guide to an existing platform\")), mdx(\"h3\", {\n    \"id\": \"example\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#example\",\n    \"aria-label\": \"example permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Example\"), mdx(\"p\", null, \"JavaScript is a top-level SDK because the frameworks that it supports share much of the same content.\"), mdx(\"p\", null, \"On the other hand, Android and Java have very little overlap. As a result, they are both top level platforms.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#configuration","title":"Configuration"},{"url":"#shared-content","title":"Shared Content","items":[{"url":"#page-visibility","title":"Page Visibility"}]},{"url":"#platform-specific-components","title":"Platform-Specific Components"},{"url":"#delineation","title":"Delineation","items":[{"url":"#example","title":"Example"}]}]},"internal":{"type":"Mdx"}}}},"pageContext":{"excerpt":"Platform content lives in  src/platforms  and follows some specific rules to generate content. The content is rendered using the same features as all other  pages , but has some additional functionality exposed to clone content and encapsulate platforms as portals. Directory structure has meaning within the platforms directory, and looks something akin to: Platforms will generate a list of \"guides\", and inherit all content within common. Given the above example, we end up with a variety of semi-duplicated URLs: This is generated by inheriting all content with the  common/  directory, then adding (or overriding with) content from the siblings (or children as we'd call them). In the above example, you'll see  aSharedPage  is loaded at two different URLs, and  childTwo  is overwritten by  guideName . The sidebar on platform pages (handled by  <PlatformSidebar> ) will generate with the Guide, or the Base Platform being the primary section, in addition to a list of other guides available in a section below it. This means that all content is focused on the current guide (usually a framework) they're in, ensuring ease of navigation. Configuration Configuration is read (in order) from  [namespace]/index.mdx  and  [namespace]/config.yml . This means that a platform's index can be fully rendered via a common page. Valid configuration attributes are: title : The display name for a platform. supportLevel : The level of support.  production  (default) or  community caseStyle : The casing style for code samples.  canonical  (default),  camelCase ,  snake_case , or  PascalCase categories : A list of categories for future support. Known values are  browser ,  mobile ,  desktop , and  server . fallbackPlatform : The key to use for defaults. Can use full key syntax of  platformName  or  platformName.guideName . sdk : The name of the SDK, if available. Used to embed SDK information on pages. aliases : A list of aliases for this platform. For example, \"Cocoa\" might apply to Apple, or \"C#\" might apply to .NET. Shared Content There are two forms of shared (duplicated) content available: platform-specific content globally shared content Both of these are contained using the  common/  folder paradigm. The global content is within  src/platforms/common/  and for platform specific content it should be created within  src/platforms/[platformName]/common/ . All of this content will be automatically duplicated within every guide, as well as every platform (when it's at the global level). This leverages components like  PlatformContent  which can automatically substitute content out. Page Visibility Sometimes a page may not make sense within the context of a given platform. To control this, you can use the  supported  and  notSupported  frontmatter on all common pages in platforms. Page visiblity works similar to the supported/notSupported attributes in other platform components (such as  PlatformSection ). For example, to make attachments only available on native platforms, you'd open up the document file (e.g.  attachments/index.mdx ) and add the following to frontmatter: If you wanted to make hide the content for a platform by default, but enable it for a guide, you can do that as well: Platform-Specific Components There are a number of components that aid the development of platform specific pages, as well as behave differently when a platform is active. For more information, see  components . Delineation We separate platform portals by the main way or mechanism that developers interact with the platform and with Sentry. In general, use this decision tree: Is it a new programming language? -> new platform Does it require a separate SDK or way of sending data to Sentry? -> new platform Does it count as a \"platform\" -> new platform Otherwise -> add it as a Guide to an existing platform Example JavaScript is a top-level SDK because the frameworks that it supports share much of the same content. On the other hand, Android and Java have very little overlap. As a result, they are both top level platforms.","title":"Platform Portals","description":null,"draft":null,"noindex":true,"notoc":null,"sidebar_order":3,"redirect_from":null,"keywords":null,"id":"b60c5ed3-bc91-5b3f-a664-b2e095acc4cc","legacy":false}},"staticQueryHashes":["1218203755","1222113826","1222113826","1766336459","2158593473","2764967025","3345802723","3818502851","3990806462","4015007367","4192517163","4264099332","518019976"]}