{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/aEKfhXY9TfO5o0mtzUfK/wdQXJA4npxuRU3fS3YjU/eYjVamKDM.js"],
  "sourcesContent": ["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { addPropertyControls, ControlType, Link } from \"framer\";\nimport * as React from \"react\"; /**\n                                * @framerRecordIdKey id\n                                * @framerSlug aHKgBzPwX\n                                * @framerEnumToDisplayNameUtils 1\n                                * @framerData\n                                */\nconst data = [{\n  aEWimqxU5: /*#__PURE__*/_jsxs(React.Fragment, {\n    children: [/*#__PURE__*/_jsx(\"h3\", {\n      children: \"Content\"\n    }), /*#__PURE__*/_jsxs(\"ol\", {\n      children: [/*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"About Chrome Web Store badges\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"What I built that earned the Featured badge\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"How I approached developing it\"\n        })\n      })]\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"The Chrome Web Store grants 2 types of badges to extensions: one is a Established Publisher badge, and the other is the Featured badge. The publisher badge looks like this:\"\n    }), /*#__PURE__*/_jsx(\"img\", {\n      alt: \"\",\n      className: \"framer-image\",\n      \"data-framer-asset\": \"data:framer/asset-reference,p5TyNb6QLyCWDu20sGAiKVNvUs.png\",\n      \"data-framer-height\": \"382\",\n      \"data-framer-width\": \"1170\",\n      height: \"191\",\n      src: new URL(\"https://framerusercontent.com/images/p5TyNb6QLyCWDu20sGAiKVNvUs.png\").href,\n      style: {\n        aspectRatio: \"1170 / 382\"\n      },\n      width: \"585\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"It\u2019s important because it means the publisher hasn\u2019t demonstrated a history of policy violations. Violations can be anything from malicious code to dirty stuff like copyright infringement. Look for this badge when you want to use an extension from a reputable, trusted developer.\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"The second badge is the Featured badge and looks like this:\"\n    }), /*#__PURE__*/_jsx(\"img\", {\n      alt: \"\",\n      className: \"framer-image\",\n      \"data-framer-asset\": \"data:framer/asset-reference,UYBcOPvdUwun6QMRL5hu0ZvGPI.png\",\n      \"data-framer-height\": \"324\",\n      \"data-framer-width\": \"1134\",\n      height: \"162\",\n      src: new URL(\"https://framerusercontent.com/images/UYBcOPvdUwun6QMRL5hu0ZvGPI.png\").href,\n      style: {\n        aspectRatio: \"1134 / 324\"\n      },\n      width: \"567\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"Below I\u2019ll talk more about what the badge means, what I made that earned the badge, and how I built it.\"\n    }), /*#__PURE__*/_jsx(\"h2\", {\n      children: \"What I\\xa0built\"\n    }), /*#__PURE__*/_jsxs(\"p\", {\n      children: [\"Passport is a browser extension I created that replaces your browser\u2019s new tab page with beautiful images, quotes, and a daily intention for those who want a mindful inspiration as they go about their digital day. I designed it to be unobtrusive, yet something that would encourage you to pause on occasion as you go about your workday. I wanted to give you something to think about, and a space to breathe. It\u2019s available for \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://chrome.google.com/webstore/detail/passport-beautiful-browse/khlbfckhcbjmoobnlnpidfbgcnpcpjhf\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"Chrome\"\n        })\n      }), \", \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://microsoftedge.microsoft.com/addons/detail/passport-beautiful-brow/dolnjdjklfdglfgdeljdhflappmjooae\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"Edge\"\n        })\n      }), \", \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://addons.mozilla.org/en-US/firefox/addon/passport-beautiful-browser-tab/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"Firefox\"\n        })\n      }), \", and \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://apps.apple.com/us/app/passport-beautiful-new-tab/id1615350085?mt=12\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"Safari\"\n        })\n      }), \" for macOS.\"]\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"The Chrome Web Store team recently granted it the Featured badge. Here\u2019s how they describe extensions they grant the badge to:\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: /*#__PURE__*/_jsx(\"em\", {\n        children: \"\u201CThe Featured badge is assigned to extensions that follow our technical best practices and meet a high standard of user experience and design. Chrome team members manually evaluate each extension before it receives the badge, paying special attention to the following:\"\n      })\n    }), /*#__PURE__*/_jsxs(\"ol\", {\n      children: [/*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsxs(\"p\", {\n          children: [/*#__PURE__*/_jsx(\"em\", {\n            children: \"Adherence to Chrome Web Store\u2019s \"\n          }), /*#__PURE__*/_jsx(Link, {\n            href: \"https://developer.chrome.com/docs/webstore/best_practices/\",\n            openInNewTab: true,\n            smoothScroll: false,\n            children: /*#__PURE__*/_jsx(\"a\", {\n              children: /*#__PURE__*/_jsx(\"em\", {\n                children: \"best practices guidelines\"\n              })\n            })\n          }), /*#__PURE__*/_jsx(\"em\", {\n            children: \", including providing an enjoyable and intuitive experience, using the latest platform APIs and respecting the \"\n          }), /*#__PURE__*/_jsx(Link, {\n            href: \"https://developer.chrome.com/docs/extensions/mv3/user_privacy/\",\n            openInNewTab: true,\n            smoothScroll: false,\n            children: /*#__PURE__*/_jsx(\"a\", {\n              children: /*#__PURE__*/_jsx(\"em\", {\n                children: \"privacy of end-users\"\n              })\n            })\n          }), /*#__PURE__*/_jsx(\"em\", {\n            children: \".\"\n          })]\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsxs(\"p\", {\n          children: [/*#__PURE__*/_jsx(\"em\", {\n            children: \"A \"\n          }), /*#__PURE__*/_jsx(Link, {\n            href: \"https://chrome.google.com/webstore/detail/passport-beautiful-browse/khlbfckhcbjmoobnlnpidfbgcnpcpjhf\",\n            openInNewTab: true,\n            smoothScroll: false,\n            children: /*#__PURE__*/_jsx(\"a\", {\n              children: /*#__PURE__*/_jsx(\"em\", {\n                children: \"store listing page\"\n              })\n            })\n          }), /*#__PURE__*/_jsx(\"em\", {\n            children: \" that is clear and helpful for users, with quality images and a detailed description.\u201C\"\n          })]\n        })\n      })]\n    }), /*#__PURE__*/_jsxs(\"p\", {\n      children: [\"Source: \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://blog.google/products/chrome/find-great-extensions-new-chrome-web-store-badges/\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"Google blog\"\n        })\n      })]\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"This is the first thing I\u2019ve ever designed on my own, rather than collaborating with an actual designer. I\u2019ve found that it\u2019s a more intensely personal exercise than engineering. When you approach building an idea just as engineer, you outsource parts of the experience to the expertise of others: maybe it\u2019s the founder, the marketer, or the designer, but most often in our work someone else is responsible for some other element of the project. Owning the full widget really makes you responsible for all of the outcome. It\u2019s a bit of a vulnerable feeling. And it\u2019s not to say I think I\u2019ve found the end state and am \u201Cgreat\u201D at any one of these jobs, but rather that I took a small step on that journey that I feel good about.\"\n    }), /*#__PURE__*/_jsx(\"h2\", {\n      children: \"How it\u2019s\\xa0made\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"I actually designed it as if it were going to be a website originally, so the initial prototype was done in Framer. If I were doing it again I\u2019d use Figma, as I understand how to customize the primitives better than I do in Framer and I think that tool lends itself better to mocking things outside of the context of a web page. However, Framer was great for mocking up the general design quickly and seeing how typography would work to express my intent. I kept it simple because I wanted something clean; it didn\u2019t hurt that I literally didn\u2019t know how to make a complicated design at the time. When I used to try to \u201Cdesign in code\u201D by just building things, I found myself over-complicating things quickly because I was able to add features at a whim. It turns out the constraint of thinking it through, and then being able to express that in a tool I\u2019m not good at, was helpful.\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"On the engineering side, it was made with React and that\u2019s about it: everything else was intentionally kept as vanilla as possible. Some engineers love reinventing the wheel, others use so many 3rd-party scripts that you can never make the experience as performant and custom to the vision as what you\u2019d want. I made an intentional trade-off to be in the middle: I use a view library, React, to handle most of the heavy lifting of a reactive component-based architecture, and wrote the rest in vanilla JS using native browser APIs for things like modals so that it would never be an experience you\u2019re stuck waiting for. The extension is about 791KiB to install, which compares favorably with larger competitors which in some cases are up to 14MB. It\u2019s not a merely engineering-driven interest to keep that size low: you can feel it every time you open the new tab page. The slowness of other offerings was one reason I decided to make my own.\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"Last but not least, I\u2019m mindful of users privacy. While I\u2019m interested in tracking usage broadly, I\u2019ve intentionally kept a privacy-first approach. For awhile analytics were handled by Plausible, but the limitations in understanding usage were too much, so I struck a balance with an EU-hosted Mixpanel project.\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"All of this came together into an experience I think users appreciate for its simplicity and beauty. I\u2019m grateful the Chrome Web Store team agreed!\"\n    }), /*#__PURE__*/_jsx(\"h3\", {\n      children: \"Follow for more\"\n    }), /*#__PURE__*/_jsxs(\"p\", {\n      children: [\"My writing is also posted on Medium, where you can follow to receive notifications for new posts, comment, and more: \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://michael-flores.medium.com/\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"https://michael-flores.medium.com/\"\n        })\n      })]\n    })]\n  }),\n  aHKgBzPwX: \"how-to-create-a-featured-extension-for-chrome\",\n  C9XMQPpe_: \"How to create a Featured extension for\\xa0Chrome\",\n  CPf8zkTRJ: \"building in public\",\n  DX4bID_RX: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.com/images/i2XnZ68gGW3O48Kte65Ks44f0Q.jpg\").href,\n    srcSet: `${new URL(\"https://framerusercontent.com/images/i2XnZ68gGW3O48Kte65Ks44f0Q.jpg?scale-down-to=512\").href} 510w, ${new URL(\"https://framerusercontent.com/images/i2XnZ68gGW3O48Kte65Ks44f0Q.jpg?scale-down-to=1024\").href} 1020w, ${new URL(\"https://framerusercontent.com/images/i2XnZ68gGW3O48Kte65Ks44f0Q.jpg?scale-down-to=2048\").href} 2041w, ${new URL(\"https://framerusercontent.com/images/i2XnZ68gGW3O48Kte65Ks44f0Q.jpg\").href} 2678w`\n  },\n  id: \"Br37Kk543\",\n  sedcS5gHS: \"12/29/2022\"\n}, {\n  aEWimqxU5: /*#__PURE__*/_jsxs(React.Fragment, {\n    children: [/*#__PURE__*/_jsx(\"p\", {\n      children: \"A checklist for evaluating whether you\u2019re creating good, usable abstractions or not.\"\n    }), /*#__PURE__*/_jsxs(\"ol\", {\n      children: [/*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Does your API operate at a consistent level of abstraction \u2014 do you avoid having some methods that require users to pass you SQL statements and others that encapsulate this detail, for example?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do your methods generally have two or fewer parameters (more parameters making it increasingly hard on users to intuitively understand the method)?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do your methods have succinct but communicative names like \u201CCreateEntry(Entry entryToCreate)\u201D as opposed to the needlessly verbose (\u201CCreateRecordThatIsGoingToGoInTheDatabase(Entry entry)\u201D)? On the opposite end of the spectrum, are your names hard to type and remember or weirdly succinct such as (\u201CCE(Entry e)\u201D)?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do your methods lie? Does \u201CCreateEntry(Entry entryToCreate)\u201D actually delete an entry, or perhaps less egregiously, create an entry sometimes, unless the entry has a certain flag set true, in which case it quietly fails?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you avoid forcing weird details on your clients, such as asking them to store boolean flags?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you avoid multiple return values (i.e. out/ref parameters?)\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you somehow communicate what exceptions your methods might throw?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you limit the number of methods per class so that reading through the documentation or IDE assistance is not painful?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you avoid forcing your clients to violate the Law of Demeter? To get \u201CD\u201D, do you force your clients to call getA().getB().getC().getD();?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you practice command query separation in your public API?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you limit or eliminate exposing public state, and especially flags?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you limit temporal couplings that force your clients to call your methods in a specific order?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do you avoid deep inheritance hierarchies that make it unclear where the members of the public API actually come from?\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Do your publicly exposed classes have a single, obvious responsibility \u2014 do you avoid exposing swiss-army-knife classes with a mish-mash of different functionalities?\"\n        })\n      })]\n    }), /*#__PURE__*/_jsx(\"h3\", {\n      children: \"Follow for more\"\n    }), /*#__PURE__*/_jsxs(\"p\", {\n      children: [\"My writing is also posted on Medium, where you can follow to receive notifications for new posts, comment, and more: \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://michael-flores.medium.com/\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"https://michael-flores.medium.com/\"\n        })\n      })]\n    })]\n  }),\n  aHKgBzPwX: \"a-checklist-for-abstractions\",\n  C9XMQPpe_: \"A checklist for abstractions\",\n  CPf8zkTRJ: \"engineering\",\n  DX4bID_RX: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.com/images/xs3FgP8kTNfRv1h5fTFyGJQBs.jpg?scale-down-to=512\").href\n  },\n  id: \"n2yzB6pay\",\n  sedcS5gHS: \"12/27/2022\"\n}, {\n  aEWimqxU5: /*#__PURE__*/_jsxs(React.Fragment, {\n    children: [/*#__PURE__*/_jsx(\"p\", {\n      children: \"Seemingly every engineering team must eventually have the conversation around what to test and how to test it. For every team I've managed, the framework has been this:\"\n    }), /*#__PURE__*/_jsxs(\"ul\", {\n      children: [/*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"Are there parts of the app that cannot be allowed to fail? Enumerate them.\"\n        })\n      }), /*#__PURE__*/_jsx(\"li\", {\n        \"data-preset-tag\": \"p\",\n        children: /*#__PURE__*/_jsx(\"p\", {\n          children: \"For bugs we have that are not about this part of the app, what's typically been the root cause? \"\n        })\n      })]\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"All applications have a definable critical user path, which can benefit from various types of automated testing or unit testing. We're left with a wide swath of lines of code that have nothing to do with this path and then we are tasked with determining what should be done for all those features waiting to break.\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"It's important to be real about the root cause of bugs: it's extremely easy to slip into thinking that automated testing all the things would be good because it's better than not automated testing. I fundamentally disagree with this approach. Often the reason behind a bug involves changing something reused in a place you didn't expect, a misunderstanding of requirements, or non-exhaustive testing in the initial implementation. Every one of these has obvious solutions that don't involve writing code around it.\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: 'A unit test will assert various things we can think of to assert. We can merely verify that the things we can imagine will break will not have broken. Deep down we know this, but again \"better than nothing\" brain will strike and convince us to exert effort here.'\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: 'Imagine you and your team are climbing a mountain. \"Better than nothing\" brain convinces you that you should climb up tethered together, because if one of you slips the rest of the team can catch you. Did you think deeply about the fact that now, if you fail to catch the slip, you risk bringing down the entire team into your fall? Sometimes optimizing for one failure increases the chances of another, more serious kind.'\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"Adding more code to feel safe from bugs feels similar to me. It's not yet been demonstrated that overall bugs caught via unit testing have been meaningfully reduced commensurate with the effort gone into writing tests. We should measure what we aim to improve, and have clarity on whether we have seen payoff against the cost, including the opportunity cost.\"\n    }), /*#__PURE__*/_jsx(\"p\", {\n      children: \"Often after a bug makes it into even the dev environment, we are ready to course correct. Yet the dev environment is exactly the place to catch bugs before production. It's the rarer bug that actually makes it to prod, and even when we acknowledge it is rare we turn to testing guardrails as a way to correct it \u2013 all the while acknowledging these won't catch everything either. At what cost?\"\n    }), /*#__PURE__*/_jsxs(\"p\", {\n      children: [\"The solution is to rid ourselves of the shackles of preventing all mistakes; it's not going to happen. Instead we should aim to be antifragile \u2013\\xa0we want to be \", /*#__PURE__*/_jsx(\"em\", {\n        children: \"resilient \"\n      }), \"to failure. Meaning instead of spending energy protecting ourselves from a failure scenario, ensure we can bounce back quickly. In feature development, this is about ensuring rollouts are safe and rollbacks are easy. \"]\n    }), /*#__PURE__*/_jsxs(\"p\", {\n      children: [\"This is true for businesses that don't suffer from competition being a click away and especially true for startups in general. There's essentially little risk from bugs that are transient. There are edges to this of course; big launches should aim to provide clean experiences within their main user flows. But in general, it's a much bigger risk to move too \", /*#__PURE__*/_jsx(\"strong\", {\n        children: \"slow\"\n      }), \" than to move to quickly. If I were betting on two teams: one doing TDD, and one antifragile team with effective safety nets, I would bet my net worth on team 2 to win a new market. \"]\n    }), /*#__PURE__*/_jsx(\"h3\", {\n      children: \"Follow for more\"\n    }), /*#__PURE__*/_jsxs(\"p\", {\n      children: [\"My writing is also posted on Medium, where you can follow to receive notifications for new posts, comment, and more: \", /*#__PURE__*/_jsx(Link, {\n        href: \"https://michael-flores.medium.com/\",\n        openInNewTab: true,\n        smoothScroll: false,\n        children: /*#__PURE__*/_jsx(\"a\", {\n          children: \"https://michael-flores.medium.com/\"\n        })\n      })]\n    })]\n  }),\n  aHKgBzPwX: \"on-failing-safely\",\n  C9XMQPpe_: \"On failing safely\",\n  CPf8zkTRJ: \"engineering\",\n  DX4bID_RX: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.com/images/i4S6g54ZuvqkCSsNS0FU9AsEpCA.jpg?scale-down-to=512\").href\n  },\n  id: \"vhRHLSFuF\",\n  sedcS5gHS: \"11/28/2022\"\n}];\ndata.forEach(item => Object.freeze(item));\naddPropertyControls(data, {\n  C9XMQPpe_: {\n    defaultValue: \"\",\n    title: \"Title\",\n    type: ControlType.String\n  },\n  aHKgBzPwX: {\n    title: \"Slug\",\n    type: ControlType.String\n  },\n  aEWimqxU5: {\n    defaultValue: \"\",\n    title: \"Content\",\n    type: ControlType.RichText\n  },\n  sedcS5gHS: {\n    defaultValue: \"\",\n    placeholder: \"09/09/2022\",\n    title: \"Date\",\n    type: ControlType.String\n  },\n  DX4bID_RX: {\n    __defaultAssetReference: \"data:framer/asset-reference,v29H4qy8DzLQob2S6wIReWlWgCU.jpg?originalFilename=unknown.jpg&preferredSize=small\",\n    title: \"Article Image\",\n    type: ControlType.ResponsiveImage\n  },\n  CPf8zkTRJ: {\n    defaultValue: \"\",\n    placeholder: \"Category\",\n    title: \"Category\",\n    type: ControlType.String\n  }\n});\ndata[\"displayName\"] = \"Blog\";\nexport default data;\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"default\": {\n      \"type\": \"data\",\n      \"name\": \"data\",\n      \"annotations\": {\n        \"framerData\": \"\",\n        \"framerRecordIdKey\": \"id\",\n        \"framerContractVersion\": \"1\",\n        \"framerSlug\": \"aHKgBzPwX\",\n        \"framerEnumToDisplayNameUtils\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};"],
  "mappings": "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",
  "names": ["data", "u", "x", "p", "Link", "item", "addPropertyControls", "ControlType", "eYjVamKDM_default", "__FramerMetadata__"]
}
