HTML
CSS
JS
Result
Skip Results Iframe
EDIT ON
Live
Live
Live
This Pen is owned by
web.dev
on
CodePen
.
See more by @web-dot-dev on CodePen
External CSS
https://codepen.io/web-dot-dev/pen/XWqWYgB.css
https://codepen.io/web-dot-dev/pen/ZExZWBQ.css
External JavaScript
https://codepen.io/web-dot-dev/pen/XWqWYgB.js
https://codepen.io/web-dot-dev/pen/ZExZWBQ.js
{"__browser":{"country":"US","device":"unknown_device","mobile":false,"name":"unknown browser","platform":"unknown_platform","version":"0"},"__constants":{},"__CPDATA":{"domain_iframe":"https://cdpn.io","environment":"production","host":"codepen.io","iframe_allow":"accelerometer; ambient-light-sensor; camera; display-capture; encrypted-media; geolocation; gyroscope; microphone; midi; payment; vr; web-share","iframe_sandbox":"allow-forms allow-modals allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-top-navigation-by-user-activation allow-downloads allow-presentation"},"__graphql":{"data":{"data":null,"errors":[{"message":"Cannot return null for non-nullable field Query.sessionUser"}]},"url":"https://codepen.io/graphql","api":"cprails"},"__pay_stripe_public_key":"pk_live_2GndomDfiklqpSNQn8FrGuwZSMIMzha7DkLJqlYe7IR0ihKAlKdiHg68JJc5eVPt68rzAjzAAVXcUwjySHRCsgjQQ00gtRBUFNH","__pay_braintree_env":"production","__boomboom":{"serve_url":"https://cdpn.io/cpe/boomboom","store_url":"https://codepen.io/cpe/boomboom/store"},"__pageType":"embed","__item":"{\"editor_settings\":{\"auto_run\":true,\"autocomplete\":false,\"code_folding\":true,\"css_pre_processor\":\"none\",\"css_prefix\":\"neither\",\"css_starter\":\"neither\",\"emmet_active\":true,\"font_size\":14,\"font_type\":\"system\",\"format_on_save\":true,\"html_pre_processor\":\"none\",\"indent_with\":\"spaces\",\"js_pre_processor\":\"none\",\"key_bindings\":\"normal\",\"line_numbers\":true,\"line_wrapping\":true,\"match_brackets\":true,\"snippets\":{\"markupSnippets\":{},\"stylesheetSnippets\":{}},\"tab_size\":2,\"theme\":\"twilight\",\"id\":\"yLjyBbz\",\"auto_save\":true},\"hashid\":\"yLjyBbz\",\"itemType\":\"pen\",\"resources\":[{\"url\":\"https://codepen.io/web-dot-dev/pen/XWqWYgB.css\",\"order\":0,\"resource_type\":\"css\",\"par_content\":\"\"},{\"url\":\"https://codepen.io/web-dot-dev/pen/XWqWYgB.js\",\"order\":0,\"resource_type\":\"js\",\"par_content\":\"\"},{\"url\":\"https://codepen.io/web-dot-dev/pen/ZExZWBQ.css\",\"order\":1,\"resource_type\":\"css\",\"par_content\":\"\"},{\"url\":\"https://codepen.io/web-dot-dev/pen/ZExZWBQ.js\",\"order\":1,\"resource_type\":\"js\",\"par_content\":\"\"}],\"tags\":[],\"id\":62926098,\"user_id\":5928893,\"html\":\"<main>\\n <header>\\n <h1>Action Sheet Pop-up</h1>\\n </header>\\n <article>\\n <p>Lorem ipsum, dolor, sit amet consectetur adipisicing elit. Repellat illo eum hic possimus, libero voluptates, facere nihil deserunt similique error sunt vero minima enim cupiditate quis velit rem ab repellendus.</p>\\n <p>Neque hic veniam cum voluptates quae magnam quisquam saepe. Dolorum quasi amet officiis vero aliquid pariatur commodi repellendus. Quos iure nobis doloremque ipsum facere nostrum neque adipisci hic labore voluptates?</p>\\n <p>Mollitia beatae, repellat est laboriosam officiis? Earum veritatis incidunt explicabo id tempora perspiciatis non doloribus natus nisi asperiores quia error autem laudantium, amet doloremque, vitae quos. Soluta unde numquam id.</p>\\n <p>Recusandae facere esse quod dolorum maxime corrupti ex quam iure id quis eius cumque fugiat, consequatur autem, excepturi molestias libero velit illo a quo. Sed quae aut inventore quia, ipsa.</p>\\n <p>Eius id laboriosam, quas iure laborum corrupti optio corporis tempore odit laudantium similique, accusamus, vel! Perspiciatis sed saepe rem. Nihil explicabo ea at vitae rerum eum, corrupti ipsam suscipit, id!</p>\\n <p>Voluptate pariatur, cum praesentium, veniam tenetur distinctio totam voluptates ea beatae, dicta voluptatum illum sit! Earum harum odio natus perspiciatis. Magni eos temporibus harum quas laborum aspernatur, minus, sunt illum.</p>\\n <p>Ducimus nobis, libero illum commodi aliquid. Molestias beatae ducimus ratione quod, quis itaque ipsum, illum amet labore, nostrum quisquam enim. Sint aperiam qui nihil eaque id quam odio? Repudiandae, sint!</p>\\n <p>In rem tenetur accusamus accusantium id, officia quaerat atque, placeat architecto nihil unde, sit cupiditate minima tempore! Magni, atque labore. Dolor voluptatum eius incidunt, enim? Asperiores similique, ut amet atque?</p>\\n <p>Illum, quam fugiat, veniam officia totam nihil aut dolore quo! Officiis ipsa harum vero voluptatibus eaque repudiandae amet eligendi ducimus laboriosam ab maiores labore, odit, voluptas quos illo sint nulla.</p>\\n <p>Eius earum nihil officiis, inventore accusantium consequuntur dolor reprehenderit in esse quos eos iste nemo amet facere, mollitia, assumenda cum provident quam. Ipsam, vitae! Excepturi quos possimus enim, quia distinctio.</p>\\n </article>\\n</main>\\n<div id=\\\"sheet-pop-up\\\" class=\\\"actionsheet\\\" popover>\\n <div class=\\\"actionsheet__header\\\">\\n <button popovertoggletarget=\\\"sheet-pop-up\\\">Actions</button>\\n </div>\\n <div class=\\\"actionsheet__content\\\">\\n <ul class=\\\"actionsheet__actions\\\">\\n <li>\\n <button autofocus class=\\\"ripple\\\">Make</button>\\n </li>\\n <li>\\n <button class=\\\"ripple\\\">Things</button>\\n </li>\\n <li>\\n <button class=\\\"ripple\\\">Pop</button>\\n </li>\\n </ul>\\n <div class=\\\"actionsheet__divider\\\"></div>\\n <div class=\\\"actionsheet__footer\\\">\\n <button popoverhidetarget=\\\"sheet-pop-up\\\" class=\\\"ripple\\\">Cancel</button>\\n </div>\\n </div>\\n</div>\",\"css\":\"@layer demo {\\n .actionsheet {\\n --bg: var(--surface-2);\\n --blur: 6px;\\n border: 0;\\n padding: 0;\\n display: block;\\n top: 100%;\\n margin: 0;\\n overflow: visible;\\n left: 50%;\\n width: var(--size-content-3);\\n max-width: 100%;\\n transition: transform 0.2s;\\n transform: translate(-50%, calc((0 - var(--open, 0)) * 100%))\\n translateY(calc(var(--translate, 0) * 1px));\\n color: var(--text-2);\\n filter: drop-shadow(0 0 var(--size-1) hsl(var(--gray-8-hsl) / 0.75));\\n }\\n\\n .actionsheet:after {\\n content: \\\"\\\";\\n position: absolute;\\n height: 100%;\\n width: 100%;\\n background: var(--bg);\\n top: 100%;\\n left: 0;\\n }\\n\\n .actionsheet::backdrop {\\n opacity: var(--open, 0);\\n transition: opacity 0.2s;\\n background: hsl(0 0% 10% / 0.5);\\n }\\n\\n @media (prefers-color-scheme: dark) {\\n .actionsheet {\\n filter: drop-shadow(0 0 var(--size-1) hsl(var(--gray-1-hsl) / 0.75));\\n }\\n .actionsheet::backdrop {\\n background: hsl(0 0% 90% / 0.5);\\n }\\n }\\n\\n .actionsheet:open {\\n --open: 1;\\n }\\n\\n .actionsheet:open::backdrop {\\n --open: 1;\\n }\\n\\n .actionsheet__header {\\n font-weight: var(--font-weight-6);\\n background: var(--bg);\\n position: absolute;\\n bottom: 99%;\\n left: 0;\\n padding: var(--size-2) var(--size-4) 0 var(--size-4);\\n width: 100%;\\n border-top-right-radius: var(--radius-3);\\n border-top-left-radius: var(--radius-3);\\n display: flex;\\n justify-content: center;\\n }\\n\\n .actionsheet__actions li {\\n padding: 0;\\n margin: 0;\\n max-inline-size: 100%;\\n }\\n\\n .actionsheet__content {\\n padding: var(--size-4);\\n background: var(--bg);\\n }\\n\\n .actionsheet button {\\n width: 100%;\\n padding: var(--size-4);\\n background: var(--surface-1);\\n box-shadow: none;\\n color: var(--text-1);\\n border-radius: 0;\\n }\\n\\n .actionsheet button {\\n outline-color: transparent;\\n }\\n\\n .actionsheet__header:after {\\n content: \\\"\\\";\\n height: 6px;\\n width: 40px;\\n border-radius: 2px;\\n background: var(--text-2);\\n position: absolute;\\n top: calc(var(--size-4) * 0.5);\\n left: 50%;\\n transform: translateX(-50%);\\n pointer-events: none;\\n }\\n\\n .actionsheet__header [popuptoggletarget] {\\n width: 100%;\\n padding: var(--size-4);\\n background: transparent;\\n }\\n\\n .actionsheet__actions {\\n background: var(--bg);\\n padding: 0;\\n display: grid;\\n gap: 2px;\\n padding-top: 0;\\n border: 0;\\n list-style-type: none;\\n }\\n\\n .actionsheet__footer {\\n width: 100%;\\n background: var(--bg);\\n padding-top: var(--size-4);\\n }\\n}\\n\\n@layer base {\\n *,\\n *:after,\\n *:before {\\n box-sizing: border-box;\\n /*cursor: none;*/\\n touch-action: none;\\n }\\n\\n body {\\n display: block;\\n min-height: 100vh;\\n font-family: \\\"Google Sans\\\", sans-serif, system-ui;\\n overflow: auto;\\n }\\n\\n :where([popover]) {\\n margin: auto;\\n border-width: 0;\\n border-style: none;\\n background: transparent;\\n }\\n\\n h1 {\\n margin: 0;\\n color: var(--gray-0);\\n }\\n\\n header {\\n height: 25vmin;\\n min-height: 200px;\\n background: var(--gradient-27);\\n display: grid;\\n place-items: center;\\n color: var(--gray-0);\\n padding: var(--size-4);\\n grid-template-columns: 1fr;\\n }\\n\\n main {\\n margin: 0 auto;\\n }\\n\\n article {\\n padding: var(--size-4);\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n }\\n\\n article > * + * {\\n margin-top: var(--size-4);\\n }\\n}\\n\",\"js\":\"const clamp = (min, max, value) => Math.min(Math.max(value, min), max);\\n\\nconst HEADER = document.querySelector(\\\".actionsheet__header\\\");\\nconst ACTIONSHEET = document.querySelector(\\\".actionsheet\\\");\\n\\nconst STATE = {\\n active: false,\\n origin: 0\\n};\\n\\nconst dragSheet = ({ y }) => {\\n if (STATE.active) {\\n let translation;\\n const { height } = ACTIONSHEET.getBoundingClientRect();\\n if (ACTIONSHEET.matches(\\\":open\\\")) {\\n translation = clamp(-height, height, (STATE.origin - y) * -1);\\n } else {\\n translation = clamp(-height, 0, (STATE.origin - y) * -1);\\n }\\n ACTIONSHEET.style.setProperty(\\\"--translate\\\", translation);\\n }\\n};\\n\\nconst endDrag = (e) => {\\n const { y, movementY, pointerType } = e;\\n STATE.active = false;\\n STATE.origin = 0;\\n ACTIONSHEET.removeAttribute(\\\"style\\\");\\n document.body.removeEventListener(\\\"pointermove\\\", dragSheet);\\n document.body.removeEventListener(\\\"pointerup\\\", endDrag);\\n requestAnimationFrame(() => {\\n if (pointerType === \\\"touch\\\") {\\n ACTIONSHEET[\\n ACTIONSHEET.matches(\\\":open\\\") ? \\\"hidePopover\\\" : \\\"showPopover\\\"\\n ]();\\n }\\n });\\n};\\n\\nconst activateDrag = ({ y }) => {\\n STATE.active = true;\\n STATE.origin = y;\\n ACTIONSHEET.style.transition = \\\"none\\\";\\n document.body.addEventListener(\\\"pointermove\\\", dragSheet);\\n document.body.addEventListener(\\\"pointerup\\\", endDrag);\\n};\\n\\nHEADER.addEventListener(\\\"pointerdown\\\", activateDrag);\\n\",\"html_pre_processor\":\"none\",\"css_pre_processor\":\"none\",\"js_pre_processor\":\"none\",\"html_classes\":\"popup-support\",\"css_starter\":\"neither\",\"js_library\":null,\"created_at\":\"2022-09-03T20:15:12.347Z\",\"updated_at\":\"2022-11-04T12:06:03.825Z\",\"title\":\"21. Actionsheet pop-up\",\"description\":\"\",\"slug_hash\":\"yLjyBbz\",\"head\":\"\",\"private\":false,\"has_animation\":true,\"team_id\":0,\"css_prefix\":\"neither\",\"template\":false,\"parent_id\":0,\"comments_count\":0,\"custom_screenshot_filename\":null,\"loves_count\":0,\"pick\":false,\"popularity_score\":0,\"views_count\":0,\"pick_visible_at\":null,\"cpid\":\"018304fe-35db-7503-bda4-add823f9c90b\",\"is_new_editor_pen\":false,\"pen_hash\":null}","__processorsMap":{"autoprefixer":"autoprefixer-10","babel":"babel-7","coffeescript":"coffeescript-2","format-1":"format-1","flutter":"flutter-1","haml":"haml-4","less":"less-3","lint-1":"lint-1","livescript":"livescript-1","markdown":"markdown-11","postcss":"postcss-7","pug":"pug-2","sass":"sass-1","scss":"sass-1","sass-ruby-3":"sass-ruby-3","sass-ruby-compass-3":"sass-ruby-compass-3","slim":"slim-3","stylus":"stylus-0","typescript":"typescript-4","vue":"vue-2","vue3":"vue-3"},"__favicon_mask_icon":"https://cpwebassets.codepen.io/assets/favicon/logo-pin-b4b4269c16397ad2f0f7a01bcdf513a1994f4c94b8af2f191c09eb0d601762b1.svg","__favicon_shortcut_icon":"https://cpwebassets.codepen.io/assets/favicon/favicon-aec34940fbc1a6e787974dcd360f2c6b63348d4b1f4e06c77743096d55480f33.ico","__path_to_iframe_console_runner":"https://cpwebassets.codepen.io/assets/editor/iframe/iframeConsoleRunner-6d8bf8b4b479137260842506acbb12717dace0823c023e08b96360e60b0840d9.js","__path_to_iframe_refresh_css":"https://cpwebassets.codepen.io/assets/editor/iframe/iframeRefreshCSS-44fe83e49b63affec96918c9af88c0d80b209a862cf87ac46bc933074b8c557d.js","__path_to_iframe_runtime_errors":"https://cpwebassets.codepen.io/assets/editor/iframe/iframeRuntimeErrors-4f205f2c14e769b448bcf477de2938c681660d5038bc464e3700256713ebe261.js","__path_to_processor_worker":"https://cpwebassets.codepen.io/assets/packs/router.js","__path_to_stop_execution_on_timeout":"https://cpwebassets.codepen.io/assets/common/stopExecutionOnTimeout-2c7831bb44f98c1391d6a4ffda0e1fd302503391ca806e7fcc7b9b87197aec26.js","__pen_normalize_css_url":"https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css","__pen_prefix_free_url":"https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js","__pen_reset_css_url":"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css","__path_to_infinite_loop_detection":"https://cpwebassets.codepen.io/assets/packs/js/infiniteLoopDetection-f0d5935eb4c2121dfc41.js"}