[{"name":"Browser.Events.Extra","comment":"\n\n@docs escape\n\n","unions":[],"aliases":[],"values":[{"name":"escape","comment":" ","type":"msg -> Platform.Sub.Sub msg"}],"binops":[]},{"name":"Nri.Test.KeyboardHelpers.V1","comment":" `KeyboardHelpers` provides a set of functions to simulate keyboard events for testing Elm programs.\n\n\n# Basic helpers\n\n@docs pressKey, releaseKey\n\n\n# Common helpers\n\n@docs pressTab, pressTabBack, pressEsc, pressSpace, pressDownArrow, pressRightArrow, pressLeftArrow, pressShiftRight, pressShiftLeft, releaseRightArrow, releaseLeftArrow, releaseShiftRight, releaseShiftLeft\n\n","unions":[],"aliases":[],"values":[{"name":"pressDownArrow","comment":" Simulate a down arrow key press on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressEsc","comment":" Simulate an escape key press on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressKey","comment":" Simulate a \"keydown\" event on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ), keyCode : Basics.Int, shiftKey : Basics.Bool } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressLeftArrow","comment":" Simulate a left arrow key press on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressRightArrow","comment":" Simulate a right arrow key press on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressShiftLeft","comment":" Simulate a left arrow key press with the shift key held down on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressShiftRight","comment":" Simulate a right arrow key press with the shift key held down on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressSpace","comment":" Simulate a spacebar key press on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressTab","comment":" Simulate a tab key press on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"pressTabBack","comment":" Simulate a shift-tab key press on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"releaseKey","comment":" Simulate a \"keyup\" event on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ), keyCode : Basics.Int, shiftKey : Basics.Bool } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"releaseLeftArrow","comment":" Simulate a left arrow key release on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"releaseRightArrow","comment":" Simulate a right arrow key release on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"releaseShiftLeft","comment":" Simulate a left arrow key release with the shift key held down on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"},{"name":"releaseShiftRight","comment":" Simulate a right arrow key release with the shift key held down on the given element.\n","type":"{ targetDetails : List.List ( String.String, Json.Encode.Value ) } -> List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest model msg effect -> ProgramTest.ProgramTest model msg effect"}],"binops":[]},{"name":"Nri.Test.MouseHelpers.V1","comment":" `MouseHelpers` provides a set of functions to simulate mouse events for testing Elm programs.\n\n\n# Basic helpers\n\n@docs click, mouseDown, mouseUp, mouseOver\n\n\n# Cancelable Events\n\n@docs cancelableMouseDown, cancelableMouseUp, cancelableMouseOver\n\n","unions":[],"aliases":[],"values":[{"name":"cancelableMouseDown","comment":" Simulate a cancelable mouse down event on elements that match the given selectors.\n","type":"List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest a b c -> ProgramTest.ProgramTest a b c"},{"name":"cancelableMouseOver","comment":" Simulate a cancelable mouse over event on elements that match the given selectors.\n","type":"List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest a b c -> ProgramTest.ProgramTest a b c"},{"name":"cancelableMouseUp","comment":" Simulate a cancelable mouse up event on elements that match the given selectors.\n","type":"List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest a b c -> ProgramTest.ProgramTest a b c"},{"name":"click","comment":" Simulate a click event on elements that match the given selectors.\n","type":"List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest a b c -> ProgramTest.ProgramTest a b c"},{"name":"mouseDown","comment":" Simulate a mouse down event on elements that match the given selectors.\n","type":"List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest a b c -> ProgramTest.ProgramTest a b c"},{"name":"mouseOver","comment":" Simulate a mouse over event on elements that match the given selectors.\n","type":"List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest a b c -> ProgramTest.ProgramTest a b c"},{"name":"mouseUp","comment":" Simulate a mouse up event on elements that match the given selectors.\n","type":"List.List Test.Html.Selector.Selector -> ProgramTest.ProgramTest a b c -> ProgramTest.ProgramTest a b c"}],"binops":[]},{"name":"Nri.Ui","comment":" A collection of helpers for working with NoRedInk projects\n\n@docs styled\n\n","unions":[],"aliases":[],"values":[{"name":"styled","comment":" Wrapper around [`Html.Styled.style`](http://package.elm-lang.org/packages/rtfeldman/elm-css/13.1.1/Html-Styled#styled) which adds a data-nri-description attribute to make it easier to tell from Inspect Element where in our code that element was defined.\n\nTakes a function that creates an element, and pre-applies styles and a `data-nri-description` attribution to it.\n\n    bigButton : List (Attribute msg) -> List (Html msg) -> Html msg\n    bigButton =\n        styled button\n            \"big button\"\n            [ padding (px 30)\n            , fontWeight bold\n            ]\n\n    view : Model -> Html msg\n    view model =\n        [ text \"These two buttons are identical:\"\n        , bigButton [] [ text \"Hi!\" ]\n        , button [ css [ padding (px 30), fontWeight bold ] ] [] [ text \"Hi!\" ]\n        ]\n\nHere, the bigButton function we've defined using styled button is identical to the normal button function, except that it has pre-applied the attribute of css [ padding (px 30), fontWeight bold ], as well as `(attribute \"data-nri-description\" \"big button\")`.\n\nYou can pass more attributes to bigButton as usual (including other css attributes). They will be applied after the pre-applied styles.\n\nNote: normally `attributeMsg` will be the same as `msg`, but we need them to be different types for special cases when `fn` needs to do tricky things. For example, some elements from the Accessibility.Styled package use the following type signature:\n\n    div : List (Attribute Never) -> List (Html msg) -> Html msg\n\n","type":"(List.List (Html.Styled.Attribute attributeMsg) -> List.List (Html.Styled.Html msg) -> Html.Styled.Html msg) -> String.String -> List.List Css.Style -> List.List (Html.Styled.Attribute attributeMsg) -> List.List (Html.Styled.Html msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Accordion.V3","comment":"\n\n\n## Changes from V2\n\n  - Do not render collapsed content\n  - Allow disclosure indicator to be top-aligned\n  - Allow fully-customizable carets\n  - Removes as many default styles as possible\n  - Change header resets to inline styles\n  - Replace custom passed-in styles with a class-based styling approach (for performance reasons -- getting elm-css class names is too slow.)\n  - Prevent default browser event on arrow keys (so that the page doesn't scroll when the focus changes)\n  - Support multiple levels of accordions\n\n\n## Example\n\n    view : Model -> Html Msg\n    view model =\n        div []\n            [ Accordion.view\n                { entries =\n                    [ AccordionEntry\n                        { caret = Accordion.defaultCaret\n                        , content = \\() -> text \"Accordion Content\"\n                        , entryClass = \"a-class-distinguishing-this-accordion-from-others-on-the-page\"\n                        , headerContent = text \"Accordion Header\"\n                        , headerId = \"a-unique-id-for-this-accordion-header-button\"\n                        , headerLevel = Accordion.H1\n                        , isExpanded = model.isAccordionOpen\n                        , toggle = Just ToggleAccordion\n                        }\n                        []\n                    ]\n                , focus = Focus\n                }\n            , Accordion.styleAccordion\n                { entryStyles = []\n                , entryExpandedStyles = []\n                , entryClosedStyles = []\n                , headerStyles = []\n                , headerExpandedStyles = []\n                , headerClosedStyles = []\n                , contentStyles = []\n                }\n            ]\n\n@docs view, HeaderLevel\n@docs AccordionEntry, Entry\n@docs StyleOptions, styleAccordion\n@docs defaultCaret\n\n","unions":[{"name":"AccordionEntry","comment":" ","args":["msg"],"cases":[["AccordionEntry",["Nri.Ui.Accordion.V3.Entry msg","List.List (Nri.Ui.Accordion.V3.AccordionEntry msg)"]]]},{"name":"HeaderLevel","comment":" Corresponds to h1, h2, h3 etc.\nChoose the correct header level given your page context.\n","args":[],"cases":[["H1",[]],["H2",[]],["H3",[]],["H4",[]],["H5",[]],["H6",[]]]}],"aliases":[{"name":"Entry","comment":" ","args":["msg"],"type":"{ caret : Basics.Bool -> Accessibility.Styled.Html msg, content : () -> Accessibility.Styled.Html msg, entryClass : String.String, headerContent : Accessibility.Styled.Html msg, headerId : String.String, headerLevel : Nri.Ui.Accordion.V3.HeaderLevel, isExpanded : Basics.Bool, toggle : Maybe.Maybe (Basics.Bool -> msg) }"},{"name":"StyleOptions","comment":" ","args":[],"type":"{ entryStyles : List.List Css.Style, entryExpandedStyles : List.List Css.Style, entryClosedStyles : List.List Css.Style, headerStyles : List.List Css.Style, headerExpandedStyles : List.List Css.Style, headerClosedStyles : List.List Css.Style, contentStyles : List.List Css.Style }"}],"values":[{"name":"defaultCaret","comment":" ","type":"Basics.Bool -> Accessibility.Styled.Html msg"},{"name":"styleAccordion","comment":" ","type":"Nri.Ui.Accordion.V3.StyleOptions -> Accessibility.Styled.Html msg"},{"name":"view","comment":" ","type":"{ entries : List.List (Nri.Ui.Accordion.V3.AccordionEntry msg), focus : String.String -> msg } -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Accordion.V4","comment":"\n\n\n## Changes from V3\n\n  - Enables accordion expansion either upwards or downwards\n  - Added animated caret for upward accordions\n\n\n## Example\n\n    view : Model -> Html Msg\n    view model =\n        div []\n            [ Accordion.view\n                { entries =\n                    [ AccordionEntry\n                        { caret = Accordion.updwardCaret\n                        , content = \\() -> text \"Accordion Content\"\n                        , entryClass = \"a-class-distinguishing-this-accordion-from-others-on-the-page\"\n                        , expansionDirection = Accordion.Upwards\n                        , headerContent = text \"Accordion Header\"\n                        , headerId = \"a-unique-id-for-this-accordion-header-button\"\n                        , headerLevel = Accordion.H1\n                        , isExpanded = model.isAccordionOpen\n                        , toggle = Just ToggleAccordion\n                        }\n                        []\n                    ]\n                , focus = Focus\n                }\n            , Accordion.styleAccordion\n                { entryStyles = []\n                , entryExpandedStyles = []\n                , entryClosedStyles = []\n                , headerStyles = []\n                , headerExpandedStyles = []\n                , headerClosedStyles = []\n                , contentStyles = []\n                }\n            ]\n\n@docs view, HeaderLevel\n@docs AccordionEntry, Entry\n@docs StyleOptions, styleAccordion\n@docs defaultCaret\n@docs ExpansionDirection, upwardCaret\n\n","unions":[{"name":"AccordionEntry","comment":" ","args":["msg"],"cases":[["AccordionEntry",["Nri.Ui.Accordion.V4.Entry msg","List.List (Nri.Ui.Accordion.V4.AccordionEntry msg)"]]]},{"name":"ExpansionDirection","comment":" Determines in which direction the accordion expands.\n","args":[],"cases":[["Upwards",[]],["Downwards",[]]]},{"name":"HeaderLevel","comment":" Corresponds to h1, h2, h3 etc.\nChoose the correct header level given your page context.\n","args":[],"cases":[["H1",[]],["H2",[]],["H3",[]],["H4",[]],["H5",[]],["H6",[]]]}],"aliases":[{"name":"Entry","comment":" ","args":["msg"],"type":"{ caret : Basics.Bool -> Accessibility.Styled.Html msg, content : () -> Accessibility.Styled.Html msg, entryClass : String.String, expansionDirection : Nri.Ui.Accordion.V4.ExpansionDirection, headerContent : Accessibility.Styled.Html msg, headerId : String.String, headerLevel : Nri.Ui.Accordion.V4.HeaderLevel, isExpanded : Basics.Bool, toggle : Maybe.Maybe (Basics.Bool -> msg) }"},{"name":"StyleOptions","comment":" ","args":[],"type":"{ entryStyles : List.List Css.Style, entryExpandedStyles : List.List Css.Style, entryClosedStyles : List.List Css.Style, headerStyles : List.List Css.Style, headerExpandedStyles : List.List Css.Style, headerClosedStyles : List.List Css.Style, contentStyles : List.List Css.Style }"}],"values":[{"name":"defaultCaret","comment":" ","type":"Basics.Bool -> Accessibility.Styled.Html msg"},{"name":"styleAccordion","comment":" ","type":"Nri.Ui.Accordion.V4.StyleOptions -> Accessibility.Styled.Html msg"},{"name":"upwardCaret","comment":" Animated caret used for accordions that expand upwards.\n","type":"Basics.Bool -> Accessibility.Styled.Html msg"},{"name":"view","comment":" ","type":"{ entries : List.List (Nri.Ui.Accordion.V4.AccordionEntry msg), focus : String.String -> msg } -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.AnimatedIcon.V1","comment":"\n\n@docs mobileOpenClose, arrowRightDown, arrowRightUp, arrowDownUp\n\n","unions":[],"aliases":[],"values":[{"name":"arrowDownUp","comment":" An arrow that animates between pointing down and pointing up. Typically used as a fly-out menu indicator.\n","type":"Basics.Bool -> Nri.Ui.Svg.V1.Svg"},{"name":"arrowRightDown","comment":" An arrow that animates between pointing right and pointing down. Typically used for disclosures and accordions.\n","type":"Basics.Bool -> Nri.Ui.Svg.V1.Svg"},{"name":"arrowRightUp","comment":" An arrow that animates between pointing right and pointing up. Typically used for disclosures and accordions.\n","type":"Basics.Bool -> Nri.Ui.Svg.V1.Svg"},{"name":"mobileOpenClose","comment":" An icon that animates between a \"hamburger\" and an \"x\".\n\nPass a bool representing whether the menu/navbar/whatever is open.\n\n","type":"Basics.Bool -> Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.AssignmentIcon.V2","comment":"\n\n\n### Patch changes\n\n  - change circular path elements to circle elements using encircle helper\n\n\n# Quiz Engine\n\n@docs diagnostic, planningDiagnosticCircled, unitDiagnosticCircled\n@docs practice, practiceCircled\n@docs quiz, quizCircled, passageQuizCircled\n\n\n# Writing\n\n@docs quickWrite, guidedDraft, peerReview, selfReview, dailyWriting, novels, texts, genres, genresCircled\n@docs quickWriteCircled, guidedDraftCircled, peerReviewCircled, selfReviewCircled, dailyWritingCircled, novelsCircled, gradingAssistantCircled, textsCircled\n\n\n# Stages\n\n@docs submitting, rating, revising\n\n\n# Start\n\n@docs startPrimary, startSecondary\n\n\n# Activities\n\n@docs assessment, standards, writing, modules\n\n\n# Example usage\n\n    import Html.Styled exposing (Html)\n    import Nri.Ui.AssignmentIcon.V2 as AssignmentIcon\n    import Nri.Ui.Colors.V1 as Colors\n    import Nri.Ui.Svg.V1 as Svg\n\n    view : Html msg\n    view =\n        AssignmentIcon.diagnostic\n            |> Svg.withColor Colors.lichen\n            |> Svg.toHtml\n\n","unions":[],"aliases":[],"values":[{"name":"assessment","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"dailyWriting","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"dailyWritingCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"diagnostic","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"genres","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"genresCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"gradingAssistantCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"guidedDraft","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"guidedDraftCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"modules","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"novels","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"novelsCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"passageQuizCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"peerReview","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"peerReviewCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"planningDiagnosticCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"practice","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"practiceCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"quickWrite","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"quickWriteCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"quiz","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"quizCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"rating","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"revising","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"selfReview","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"selfReviewCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"standards","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"startPrimary","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"startSecondary","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"submitting","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"texts","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"textsCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"unitDiagnosticCircled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"writing","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.Balloon.V2","comment":" Adding a tooltip? Use `Nri.Ui.Tooltip`, not Balloon.\nBalloon is really just a container: it is non-interactive and isn't semantically meaningful.\n\n    Balloon.view\n        [ Balloon.paragraph \"Hello, world! I'm a balloon!\"\n        , Balloon.onTop\n        , Balloon.navy\n        ]\n\n\n## Changelog\n\nPatch changes:\n\n  - adds paragraph\n\nChanges from V1:\n\n  - allow for far more customization:\n      - background color\n      - HTML attributes\n  - change the API to be more similar to other NRI components\n      - add the standard attributes, like nriDescription and css\n      - `balloon` -> `view`\n      - content -> `markdown`, `plaintext`, and `html`\n\n\n## API\n\n@docs view, Attribute\n\n\n### Content\n\n@docs paragraph, plaintext, markdown, html\n\n\n### Customizations for Balloon\n\n@docs green, purple, orange, white, navy, customTheme\n@docs highContrastModeTheme\n@docs onBottom, onLeft, onRight, onTop\n@docs alignArrowStart, alignArrowMiddle, alignArrowEnd\n@docs arrowHeight\n@docs custom, id, contentId, nriDescription, testId\n\n\n### CSS\n\n@docs containerCss\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss\n\n","unions":[{"name":"Attribute","comment":" Balloon's attributes.\n","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"alignArrowEnd","comment":" Put the arrow at the \"end\" of the ballon.\nFor onTop & onBottom ballons, this means \"right\".\nFor onLeft & onRight ballon, this means \"bottom\".\n\n     __________\n    |______  _|\n           \\/\n\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"alignArrowMiddle","comment":" Put the arrow at the \"middle\" of the ballon. This is the default behavior.\n\n     __________\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"alignArrowStart","comment":" Put the arrow at the \"start\" of the ballon.\nFor onTop & onBottom ballons, this means \"left\".\nFor onLeft & onRight ballon, this means \"top\".\n\n     __________\n    |_  ______|\n      \\/\n\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"arrowHeight","comment":" Set how tall you want the arrow to be. The default is 8px.\n","type":"Basics.Float -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"contentId","comment":" ","type":"String.String -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way you want/expect if underlying Balloon styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"customTheme","comment":" Custom theme: set the background & text color.\n","type":"{ backgroundColor : Css.Color, color : Css.Color } -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"green","comment":" Green theme (This is the default theme.)\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"highContrastModeTheme","comment":" Typically, you will want to use [system colors](https://developer.mozilla.org/en-US/docs/Web/CSS/system-color) for these colors (which is why the API uses strings):\n","type":"{ backgroundColor : String.String, color : String.String } -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"html","comment":" Provide a list of custom HTML.\n","type":"List.List (Html.Styled.Html msg) -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"markdown","comment":" Provide a string that will be rendered as markdown.\n","type":"String.String -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"mobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"navy","comment":" Navy theme\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"notMobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"onBottom","comment":" Balloon with the arrow on the top.\n\n     ___/\\_____\n    |         |\n    |_________|\n\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"onLeft","comment":" Balloon with the arrow on the right.\n\n      __________\n     |         |\n     |          >\n     |_________|\n\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"onRight","comment":" Balloon with the arrow on the left.\n\n      __________\n     |         |\n    <          |\n     |_________|\n\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"onTop","comment":" Balloon with the arrow on the bottom.\n\n     __________\n    |         |\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"orange","comment":" Orange theme\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"paragraph","comment":" Provide a plain-text string that will be put into a paragraph tag, with the default margin removed.\n","type":"String.String -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"purple","comment":" Purple theme\n","type":"Nri.Ui.Balloon.V2.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Balloon.V2.Attribute msg"},{"name":"view","comment":" Green balloon without an arrow by default.\n\n     __________\n    |         |\n    |_________|\n\n","type":"List.List (Nri.Ui.Balloon.V2.Attribute msg) -> Html.Styled.Html msg"},{"name":"white","comment":" White theme\n","type":"Nri.Ui.Balloon.V2.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Block.V6","comment":" Changes from V5:\n\n    - Remove `wordWithId` and `blankWithId` as we no longer are trying to point to words or blanks with the question box.\n    - Remove the `fullHeightBlank` attribute option - we can always infer this from the contents\n    - Set a maximum blank width of ~60 characters as blanks won't line break\n    - Remove `labelState` as we are shifting reposibility to consumers to animate labels via `labelCss`\n\n\n## Patch changes\n\n    - Add renderReadAloud\n    - Add border styles `dashed` and`underline`\n    - Correctly display a transparent background for underline blanks\n    - Add `skipLabelAnimation`, so balloon animation can be skipped\n\n@docs view, renderReadAloud, Attribute\n\n\n## Content\n\n@docs plaintext\n@docs Content, content\n@docs phrase, space, bold, italic\n@docs blank\n\n\n## Content customization\n\n@docs emphasize\n\n\n## Labels & positioning\n\n@docs label, id\n\nYou will need these helpers if you want to prevent label overlaps. (Which is to say -- anytime you have labels!)\n\n@docs labelId, labelContentId\n@docs LabelPosition, getLabelPositions, labelPosition\n@docs labelCss\n\n\n### Visual customization\n\n@docs yellow, cyan, magenta, green, blue, purple, brown\n@docs insertLineBreakOpportunities\n@docs dashed, underline, skipLabelAnimation\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]},{"name":"Content","comment":" ","args":["msg"],"cases":[]}],"aliases":[{"name":"LabelPosition","comment":" Use `getLabelPositions` to construct this value.\n","args":[],"type":"{ totalHeight : Basics.Float, arrowHeight : Basics.Float, zIndex : Basics.Int, xOffset : Basics.Float }"}],"values":[{"name":"blank","comment":" Insert a blank into block content specify a number of characters to set the width.\n\nFor simple blanks, you can call `view` with no `content` or `plaintext` specified,\nhowever if you need to control the width of the blank or put a blank inside of other emphasized content you need to use this function.\n\nThe `widthInChars` will be multipled by 0.5em, which will roughly appear to be the same size as a string with that many characters.\n\nFor example, the following two blocks should be approximately the same width.\n\n`phrase \"Hello\"`\n`blank { widthInChars = 5 }`\n\n","type":"{ widthInChars : Basics.Int } -> Nri.Ui.Block.V6.Content msg"},{"name":"blue","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"bold","comment":" Wraps a group of content in a `strong` tag\n","type":"List.List (Nri.Ui.Block.V6.Content msg) -> Nri.Ui.Block.V6.Content msg"},{"name":"brown","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"content","comment":" Use `content` for more complex block views, for instance when a blank appears within an emphasis block. Prefer to use `plaintext` when possible for better readability.\n\n    Block.view\n        [ Block.emphasize\n        , Block.content (Block.phrase \"Hello, \" ++  Block.blank { characterWidth = 8 } :: Block.phrase \"!\" ) ]\n        ]\n\n","type":"List.List (Nri.Ui.Block.V6.Content msg) -> Nri.Ui.Block.V6.Attribute msg"},{"name":"cyan","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"dashed","comment":" Sets the border style to be dashed\n","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"emphasize","comment":" Mark content as emphasized.\n","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"getLabelPositions","comment":" Determine where to position labels in order to dynamically avoid overlapping content.\n\n    - First, we add ids to block with labels with `Block.labelId`.\n    - Say we added `Block.labelId \"example-id\"`, then we will use `Browser.Dom.getElement \"example-id\"` and `Browser.Dom.getElement (Block.labelContentId \"example-id\")` to construct a record in the shape { label : Dom.Element, labelContent : Dom.Element }. We store this record in a dictionary keyed by ids (e.g., \"example-id\") with measurements for all other labels.\n\n`getLabelPositions` will return a dictionary of values (keyed by label ids) whose values can be passed directly to `labelPosition` for positioning.\n\n","type":"Dict.Dict String.String { label : Browser.Dom.Element, labelContent : Browser.Dom.Element } -> Dict.Dict String.String Nri.Ui.Block.V6.LabelPosition"},{"name":"green","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Block.V6.Attribute msg"},{"name":"insertLineBreakOpportunities","comment":" Insert the HTML <wbr> \"line break opportunity\" element if the content is a space\n(Only makes a difference on Chrome. Firefox and Safari treat this element like a <span>.)\n","type":"Basics.Bool -> Nri.Ui.Block.V6.Attribute msg"},{"name":"italic","comment":" Wraps a group of content in a `em` tag\n","type":"List.List (Nri.Ui.Block.V6.Content msg) -> Nri.Ui.Block.V6.Content msg"},{"name":"label","comment":" Add a label above content. This label supports markdown syntax for **bold** and _italics_\n","type":"String.String -> Nri.Ui.Block.V6.Attribute msg"},{"name":"labelContentId","comment":" ","type":"String.String -> String.String"},{"name":"labelCss","comment":" Use to set a block's label's CSS\n","type":"List.List Css.Style -> Nri.Ui.Block.V6.Attribute msg"},{"name":"labelId","comment":" ","type":"String.String -> Nri.Ui.Block.V6.Attribute msg"},{"name":"labelPosition","comment":" Use `getLabelPositions` to calculate what these values should be.\n","type":"Maybe.Maybe Nri.Ui.Block.V6.LabelPosition -> Nri.Ui.Block.V6.Attribute msg"},{"name":"magenta","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"phrase","comment":" Add any arbitrary string as part of block content.\n","type":"String.String -> List.List (Nri.Ui.Block.V6.Content msg)"},{"name":"plaintext","comment":" Provide the main content of the block as a plain-text string. You can also use `content` for more complex cases, including a blank appearing within an emphasis.\n","type":"String.String -> Nri.Ui.Block.V6.Attribute msg"},{"name":"purple","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"renderReadAloud","comment":" Render a block to a ReadAloud friendly string.\n","type":"List.List (Nri.Ui.Block.V6.Attribute msg) -> String.String"},{"name":"skipLabelAnimation","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"space","comment":" Convenience helper to insert a space into block content.\n\nPutting spaces in `phrase` is fine as well, but you might find this more useful around the edges of `blank`.\n\n","type":"Nri.Ui.Block.V6.Content msg"},{"name":"underline","comment":" Sets the border style to be underlined\n","type":"Nri.Ui.Block.V6.Attribute msg"},{"name":"view","comment":" Create a block element.\n\nNote that it is important that a series of Block elements be wrapped in a container with \"whitespace; pre\" set.\nThis will ensure that line breaks only happen at whitespace, and not directly before an emphasis block in\nsituations where it would look strange (like if the block started with a comma).\n\n    p\n        [ css [ Css.whitespace Css.pre ] ]\n        [ Block.view [ Block.plaintext \"Hello, world!\" ] ]\n\n","type":"List.List (Nri.Ui.Block.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"yellow","comment":" ","type":"Nri.Ui.Block.V6.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.BreadCrumbs.V2","comment":"\n\n\n### Patch changes:\n\n    - when only 1 breadcrumb is present, just render as a styled h1 or h2 directly, without nav semantics\n\n\n### Changes from V1:\n\n    - switch to list-based attributes pattern\n\nLearn more about 'breadcrumbs' to help a user orient themselves within a site here: <https://www.w3.org/WAI/WCAG21/Techniques/general/G65>.\n\nWide Viewport:\n\n    Home\n\n    🏠 Home > 🦇 Category 1\n\n    🏠 > 🦇 Category 1 > 🧛 Sub-Category 2\n\nNarrow Viewport:\n\n    Home\n\n    🏠 > 🦇 Category 1\n\n    🏠 > 🦇 > 🧛 Sub-Category 2\n\n\n## Creating breadcrumbs\n\n@docs BreadCrumbs, init, initSecondary, after\n@docs BreadCrumbAttribute, icon, iconSize\n\n\n## Viewing breadcrumbs\n\n@docs view, viewSecondary\n\n\n## Managing focus and page title\n\n@docs headerId, toPageTitle\n\n","unions":[{"name":"BreadCrumbAttribute","comment":" ","args":["route"],"cases":[]},{"name":"BreadCrumbs","comment":" ","args":["route"],"cases":[]}],"aliases":[],"values":[{"name":"after","comment":" ","type":"Nri.Ui.BreadCrumbs.V2.BreadCrumbs route -> { id : String.String, text : String.String, route : route } -> List.List (Nri.Ui.BreadCrumbs.V2.BreadCrumbAttribute route) -> Nri.Ui.BreadCrumbs.V2.BreadCrumbs route"},{"name":"headerId","comment":" ","type":"Nri.Ui.BreadCrumbs.V2.BreadCrumbs route -> String.String"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.BreadCrumbs.V2.BreadCrumbAttribute route"},{"name":"iconSize","comment":" ","type":"Css.Px -> Nri.Ui.BreadCrumbs.V2.BreadCrumbAttribute route"},{"name":"init","comment":" ","type":"{ id : String.String, text : String.String, route : route } -> List.List (Nri.Ui.BreadCrumbs.V2.BreadCrumbAttribute route) -> Nri.Ui.BreadCrumbs.V2.BreadCrumbs route"},{"name":"initSecondary","comment":" ","type":"Nri.Ui.BreadCrumbs.V2.BreadCrumbs route -> { id : String.String, text : String.String, route : route } -> List.List (Nri.Ui.BreadCrumbs.V2.BreadCrumbAttribute route) -> Nri.Ui.BreadCrumbs.V2.BreadCrumbs route"},{"name":"toPageTitle","comment":" Generate an HTML page title using the breadcrumbs, in the form \"SubCategory | Category | NoRedInk\" for breadCrumbs like:\n\n    Category > SubCategory\n\n","type":"Nri.Ui.BreadCrumbs.V2.BreadCrumbs a -> String.String"},{"name":"view","comment":" Usually, the label value will be the string \"breadcrumbs\".\n\nIt's configurable so that if more than one set of BreadCrumbs ever appear on the page, the aria-label for the nav can still be unique.\n\n","type":"{ aTagAttributes : route -> List.List (Accessibility.Styled.Attribute msg), isCurrentRoute : route -> Basics.Bool, label : String.String } -> Nri.Ui.BreadCrumbs.V2.BreadCrumbs route -> Accessibility.Styled.Html msg"},{"name":"viewSecondary","comment":" Usually, the label value will be the string \"secondary breadcrumbs\".\n\nIt's configurable so that if more than one set of BreadCrumbs ever appear on the page, the aria-label for the nav can still be unique.\n\n","type":"{ aTagAttributes : route -> List.List (Accessibility.Styled.Attribute msg), isCurrentRoute : route -> Basics.Bool, label : String.String } -> Nri.Ui.BreadCrumbs.V2.BreadCrumbs route -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Button.V10","comment":" Notes for V11:\n\nThe next version of `Button` should add a `hideTextForMobile` helper.\nThis will require adding a selector for the text. We are not making this change in V10, as\nadding a span around the text could potentially lead to regressions.\nThe next version of `Button` should also remove `delete`\n\n\n# As part of major release:\n\n  - removed toggleButton\n\n\n# Patch changes:\n\n  - adds width helpers for Mobile breakpoint, Quiz Engine breakpoint, and Narrow Mobile breakpoint\n  - uses ClickableAttributes\n  - adds `nriDescription`, `testId`, and `id` helpers\n  - adds `modal` helper, an alias for `large` size\n  - adds `notMobileCss`, `mobileCss`, `quizEngineMobileCss`\n  - adds `hideIconForMobile` and `hideIconFor`\n  - support 'disabled' links according to [Scott O'Hara's disabled links](https://www.scottohara.me/blog/2021/05/28/disabled-links.html) article\n  - adds `tertiary` style\n  - adds `submit` and `opensModal`\n  - adds `secondaryDanger` style\n  - marks toggleButton as deprecated and adds toggleButtonPressed attribute\n  - replaces the `disabled` attribute with `aria-disabled=\"true\"`\n  - removes click handler from disabled buttons\n  - prevents default behavior for disabled submit buttons by setting `type=\"button\"`\n\n\n# Changes from V9:\n\n  - Explicitly zeroes out all margin\n  - adds `css` helper\n\n\n# Create a button or link\n\n@docs button, link\n@docs Attribute\n\n\n## Behavior\n\n@docs onClick, submit, opensModal\n@docs href, linkSpa, linkExternal, linkWithMethod, linkWithTracking, linkExternalWithTracking\n@docs toggleButtonPressed\n\n\n## Sizing\n\n@docs small, medium, large, modal\n@docs exactWidth, boundedWidth, unboundedWidth, fillContainerWidth\n@docs exactWidthForMobile, boundedWidthForMobile, unboundedWidthForMobile, fillContainerWidthForMobile\n@docs exactWidthForQuizEngineMobile, boundedWidthForQuizEngineMobile, unboundedWidthForQuizEngineMobile, fillContainerWidthForQuizEngineMobile\n@docs exactWidthForNarrowMobile, boundedWidthForNarrowMobile, unboundedWidthForNarrowMobile, fillContainerWidthForNarrowMobile\n\n\n## Change the color scheme\n\n@docs primary, secondary, tertiary, danger, dangerSecondary, premium\n\n\n## Change the state (buttons only)\n\n@docs enabled, unfulfilled, disabled, error, loading, success\n\n\n## Icons\n\n@docs icon, rightIcon\n@docs hideIconForMobile, hideIconFor\n\n\n## Customization\n\n@docs custom, nriDescription, testId, id\n\n\n### CSS\n\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss\n\n\n# Commonly-used buttons\n\n@docs delete\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"boundedWidth","comment":" Make a button that is at least `min` large, and which will grow with\nits content up to `max`. Both bounds are inclusive (`min <= actual value <=\nmax`.)\n","type":"{ min : Basics.Int, max : Basics.Int } -> Nri.Ui.Button.V10.Attribute msg"},{"name":"boundedWidthForMobile","comment":" For the mobile breakpoint, make a button that is at least `min` large, and which will grow with\nits content up to `max`. Both bounds are inclusive (`min <= actual value <=\nmax`.)\n","type":"{ min : Basics.Int, max : Basics.Int } -> Nri.Ui.Button.V10.Attribute msg"},{"name":"boundedWidthForNarrowMobile","comment":" For the quiz engine mobile breakpoint, make a button that is at least `min` large, and which will grow with\nits content up to `max`. Both bounds are inclusive (`min <= actual value <=\nmax`.)\n","type":"{ min : Basics.Int, max : Basics.Int } -> Nri.Ui.Button.V10.Attribute msg"},{"name":"boundedWidthForQuizEngineMobile","comment":" For the quiz engine mobile breakpoint, make a button that is at least `min` large, and which will grow with\nits content up to `max`. Both bounds are inclusive (`min <= actual value <=\nmax`.)\n","type":"{ min : Basics.Int, max : Basics.Int } -> Nri.Ui.Button.V10.Attribute msg"},{"name":"button","comment":"\n\n    Button.button \"My great button!\"\n        [ Button.onClick ()\n        , Button.enabled\n        ]\n\nBy default, the button is enabled, Medium sized, with primary colors, and an unbounded width.\n\n","type":"String.String -> List.List (Nri.Ui.Button.V10.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Button.V10.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying Button styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Accessibility.Styled.Attribute msg) -> Nri.Ui.Button.V10.Attribute msg"},{"name":"danger","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"dangerSecondary","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"delete","comment":" DEPRECATED: this should be removed in Button.V11.\n","type":"{ label : String.String, onClick : msg } -> Accessibility.Styled.Html msg"},{"name":"disabled","comment":" Shows inactive styling.\n\nIf a button, this attribute will disable it as you'd expect.\n\nIf a link, this attribute will follow the pattern laid out in [Scott O'Hara's disabled links](https://www.scottohara.me/blog/2021/05/28/disabled-links.html) article,\nand essentially make the anchor a disabled placeholder.\n\n_Caveat!_\n\nThe Component Catalog example will NOT work correctly because of <https://github.com/elm/browser/issues/34>, which describes a problem where \"a tags without href generate a navigation event\".\n\nIn most cases, if you're not using Browser.application, disabled links should work just fine.\n\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"enabled","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"error","comment":" Shows error styling. If a button, this attribute will disable it.\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"exactWidth","comment":" Define a size in `px` for the button's total width.\n","type":"Basics.Int -> Nri.Ui.Button.V10.Attribute msg"},{"name":"exactWidthForMobile","comment":" For the mobile breakpoint, define a size in `px` for the button's total width.\n","type":"Basics.Int -> Nri.Ui.Button.V10.Attribute msg"},{"name":"exactWidthForNarrowMobile","comment":" For the quiz engine mobile breakpoint, define a size in `px` for the button's total width.\n","type":"Basics.Int -> Nri.Ui.Button.V10.Attribute msg"},{"name":"exactWidthForQuizEngineMobile","comment":" For the quiz engine mobile breakpoint, define a size in `px` for the button's total width.\n","type":"Basics.Int -> Nri.Ui.Button.V10.Attribute msg"},{"name":"fillContainerWidth","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"fillContainerWidthForMobile","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"fillContainerWidthForNarrowMobile","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"fillContainerWidthForQuizEngineMobile","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"hideIconFor","comment":" Hide the left-side icon for an arbitrary media query.\n","type":"Css.Media.MediaQuery -> Nri.Ui.Button.V10.Attribute msg"},{"name":"hideIconForMobile","comment":" Hide the left-side icon for the mobile breakpoint.\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"href","comment":" ","type":"String.String -> Nri.Ui.Button.V10.Attribute msg"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.Button.V10.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Button.V10.Attribute msg"},{"name":"large","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"link","comment":"\n\n    Button.link \"My great link!\"\n        [ Button.href \"My href\"\n        , Button.secondary\n        ]\n\nBy default, the link is Medium sized, with primary colors, and an unbounded width.\n\n","type":"String.String -> List.List (Nri.Ui.Button.V10.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"linkExternal","comment":" ","type":"String.String -> Nri.Ui.Button.V10.Attribute msg"},{"name":"linkExternalWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.Button.V10.Attribute msg"},{"name":"linkSpa","comment":" Use this link for routing within a single page app.\n\nThis will make a normal <a> tag, but change the Events.onClick behavior to avoid reloading the page.\n\nSee <https://github.com/elm-lang/html/issues/110> for details on this implementation.\n\n","type":"String.String -> Nri.Ui.Button.V10.Attribute msg"},{"name":"linkWithMethod","comment":" ","type":"{ method : String.String, url : String.String } -> Nri.Ui.Button.V10.Attribute msg"},{"name":"linkWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.Button.V10.Attribute msg"},{"name":"loading","comment":" Shows loading styling. If a button, this attribute will disable it.\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"medium","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"mobileCss","comment":" Equivalent to:\n\n    Button.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Button.V10.Attribute msg"},{"name":"modal","comment":" Alias for Button.large\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"notMobileCss","comment":" Equivalent to:\n\n    Button.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Button.V10.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Button.V10.Attribute msg"},{"name":"onClick","comment":" ","type":"msg -> Nri.Ui.Button.V10.Attribute msg"},{"name":"opensModal","comment":" Use this attribute when interacting with the button will launch a modal.\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"premium","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"primary","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Equivalent to:\n\n    Button.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Button.V10.Attribute msg"},{"name":"rightIcon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.Button.V10.Attribute msg"},{"name":"secondary","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"small","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"submit","comment":" By default, buttons have type \"button\". Use this attribute to change the button type to \"submit\".\n\nNote: this attribute is not supported by links.\n\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"success","comment":" Shows success styling. If a button, this attribute will disable it.\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"tertiary","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Button.V10.Attribute msg"},{"name":"toggleButtonPressed","comment":" Mark the button as a toggle button, and pass in its pressed state.\n","type":"Basics.Bool -> Nri.Ui.Button.V10.Attribute msg"},{"name":"unboundedWidth","comment":" Leave the maxiumum width unbounded (there is a minimum width).\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"unboundedWidthForMobile","comment":" For the mobile breakpoint, Leave the maxiumum width unbounded (there is a minimum width).\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"unboundedWidthForNarrowMobile","comment":" For the quiz engine mobile breakpoint, Leave the maxiumum width unbounded (there is a minimum width).\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"unboundedWidthForQuizEngineMobile","comment":" For the quiz engine mobile breakpoint, Leave the maxiumum width unbounded (there is a minimum width).\n","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"unfulfilled","comment":" Shows inactive styles.\n","type":"Nri.Ui.Button.V10.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Carousel.V1","comment":" Patch changes:\n\n  - remove tooltip-related code that is never used for Carousel\n\n@docs view\n@docs Item\n@docs buildItem\n\n","unions":[{"name":"Item","comment":" ","args":["id","msg"],"cases":[]}],"aliases":[],"values":[{"name":"buildItem","comment":" Builds an selectable item in the Caroursel\n\n`controlHtml` represents the element that will appear in the list of options.\n\n`slideHtml` represents the element that will be shown in your carousel when this item is selected.\n\n","type":"{ id : id, idString : String.String, slideHtml : Html.Styled.Html msg, controlHtml : Html.Styled.Html Basics.Never } -> Nri.Ui.Carousel.V1.Item id msg"},{"name":"view","comment":" ","type":"{ focusAndSelect : { select : id, focus : Maybe.Maybe String.String } -> msg, selected : id, controlStyles : Basics.Bool -> List.List Css.Style, controlListStyles : List.List Css.Style, items : List.List (Nri.Ui.Carousel.V1.Item id msg) } -> { controls : Html.Styled.Html msg, slides : Html.Styled.Html msg }"}],"binops":[]},{"name":"Nri.Ui.Carousel.V2","comment":" Changes from V1:\n\n  - added new carousel APIs (with tabbed controls/previous and next controls, and combined controls) using [W3C guidelines](https://www.w3.org/WAI/ARIA/apg/patterns/carousel/)\n\n@docs viewWithPreviousAndNextControls\n@docs viewWithTabControls\n@docs viewWithCombinedControls\n@docs Role\n\n","unions":[{"name":"Role","comment":" `Role`, which can be either [Group](https://w3c.github.io/aria/#group) or [Region](https://w3c.github.io/aria/#region)\n\n  - Use `Group` when the contents of the slides are not intended to be included in a page summary or table of contents by assistive technologies.\n  - Use `Region` when the contents the slides should be included in a page summary or table of contents.\n\n","args":[],"cases":[["Group",[]],["Region",[]]]}],"aliases":[],"values":[{"name":"viewWithCombinedControls","comment":" Builds a carousel with tab buttons\nReturns:\n\n  - `tabs`: tabs control buttons\n  - `slides` container with the carousel contents\n  - `viewPreviousButton` previous button\n  - `viewNextButton` next button\n  - `containerAttributes` attributes that should be used on the parent div of both the button and slides elements\n\n","type":"{ selected : id, slides : List.List { id : id, idString : String.String, name : String.String, visibleLabelId : Maybe.Maybe String.String, slideView : Html.Styled.Html msg, tabView : Html.Styled.Html Basics.Never, tabAttributes : List.List (Html.Styled.Attribute msg) }, tabStyles : Basics.Bool -> List.List Css.Style, tabListStyles : List.List Css.Style, previousButton : { name : String.String, icon : Nri.Ui.Svg.V1.Svg, attributes : List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) }, nextButton : { name : String.String, icon : Nri.Ui.Svg.V1.Svg, attributes : List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) }, role : Nri.Ui.Carousel.V2.Role, name : String.String, visibleLabelId : Maybe.Maybe String.String, select : { select : id, announce : Maybe.Maybe String.String, focus : Maybe.Maybe String.String } -> msg } -> { tabs : Html.Styled.Html msg, viewPreviousButton : Html.Styled.Html msg, viewNextButton : Html.Styled.Html msg, slides : Html.Styled.Html msg, containerAttributes : List.List (Html.Styled.Attribute msg) }"},{"name":"viewWithPreviousAndNextControls","comment":" Builds a carousel with previous and next controls\n\nReturns:\n\n  - `slides` the container with the carousel contents\n  - `viewPreviousButton` previous button\n  - `viewNextButton` next button\n  - `containerAttributes` attributes that should be used on the parent div of both the button and slides elements\n\n","type":"{ selected : id, slides : List.List { id : id, idString : String.String, name : String.String, visibleLabelId : Maybe.Maybe String.String, slideView : Html.Styled.Html msg }, previousButton : { name : String.String, icon : Nri.Ui.Svg.V1.Svg, attributes : List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) }, nextButton : { name : String.String, icon : Nri.Ui.Svg.V1.Svg, attributes : List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) }, name : String.String, visibleLabelId : Maybe.Maybe String.String, role : Nri.Ui.Carousel.V2.Role, announceAndSelect : { select : id, announce : String.String } -> msg } -> { viewPreviousButton : Html.Styled.Html msg, viewNextButton : Html.Styled.Html msg, slides : Html.Styled.Html msg, containerAttributes : List.List (Html.Styled.Attribute msg) }"},{"name":"viewWithTabControls","comment":" Builds a carousel with tab buttons\nReturns:\n\n  - `tabs`: tabs control buttons\n  - `slides` container with the carousel contents\n  - `containerAttributes` attributes that should be used on the parent div of both the button and slides elements\n\n","type":"{ selected : id, slides : List.List { id : id, idString : String.String, slideView : Html.Styled.Html msg, tabView : Html.Styled.Html Basics.Never, tabAttributes : List.List (Html.Styled.Attribute msg) }, tabStyles : Basics.Bool -> List.List Css.Style, tabListStyles : List.List Css.Style, role : Nri.Ui.Carousel.V2.Role, name : String.String, visibleLabelId : Maybe.Maybe String.String, focusAndSelect : { select : id, focus : Maybe.Maybe String.String } -> msg } -> { tabs : Html.Styled.Html msg, slides : Html.Styled.Html msg, containerAttributes : List.List (Html.Styled.Attribute msg) }"}],"binops":[]},{"name":"Nri.Ui.CharacterIcon.V2","comment":" Patch changes:\n\n  - added missing headshots\n  - made flipped headshots scale correctly in Safari\n\nTODO: There was a bunch of work on <https://github.com/NoRedInk/noredink-ui/pull/1403>\ntowards reusing code in the SVGs to make them smaller. We should do the same for headshots.\n\n@docs lindyInstructive, lindySupportive\n@docs redInstructive, redSupportive\n@docs salInstructive, salSupportive\n@docs lindyHeadshot, redHeadshot, salHeadshot\n@docs lindyHeadshotFacingRight, redHeadshotFacingRight, salHeadshotFacingRight\n\n","unions":[],"aliases":[],"values":[{"name":"lindyHeadshot","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"lindyHeadshotFacingRight","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"lindyInstructive","comment":" Full height Lindy to be shown when presenting a question.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"lindySupportive","comment":" Full height Lindy to be shown after getting an answer wrong.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"redHeadshot","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"redHeadshotFacingRight","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"redInstructive","comment":" Full height Red to be shown when presenting a question.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"redSupportive","comment":" Full height Red to be shown on a wrong answer.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"salHeadshot","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"salHeadshotFacingRight","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"salInstructive","comment":" Full height Sal to be shown when presenting a question.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"salSupportive","comment":" Full height Sal to be shown on a wrong answer.\n","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.Checkbox.V7","comment":"\n\n\n## Patch changes:\n\n  - reposition the guidance to be right below the label text\n  - fix the hiddenLabel checkbox behavior\n  - fix the disabled styles\n  - fix \"checkboxes can’t be clicked in the lower half when there’s guidance\" issue\n  - fix duplicative focus ring issue\n  - apply custom attributes to the element with the `\"checkbox\"` role\n  - set cursor to not-allowed when disabled\n  - update color styling\n  - update unselected enabled label color\n  - adds noMargin\n\n\n## Changes from V6:\n\n  - Reworked api similar to other components based on Attributes\n  - Add support for guidance\n  - Dropped checkboxLockOnInside functionality\n  - Dropped disabledLabelCss functionality. Use labelCss instead in case when the checkbox is disabled.\n  - (breaking-change) By default the label is visible (ie: V6.viewWithLabel), use hiddenLabel to migrate from V6.view.\n\n\n## Patch changes:\n\n  - It turns out that \"indeterminate\" has to be set from JS -- it doesn't work to add the attribute as part of the HTML. So, instead of using an input under the hood, we're using aria-attributes instead. This also allows us to simplify the styles a bit.\n\n@docs view\n\n\n### Event handlers\n\n@docs onCheck\n\n\n### Attributes\n\n@docs Attribute, IsSelected\n@docs hiddenLabel, visibleLabel\n@docs selectedFromBool\n@docs containerCss, labelCss, custom, nriDescription, id, testId\n@docs disabled, enabled, guidance, guidanceHtml\n@docs noMargin\n\n\n### Internal\n\n@docs viewIcon\n\n","unions":[{"name":"Attribute","comment":" Customizations for the Checkbox.\n","args":["msg"],"cases":[]},{"name":"IsSelected","comment":"\n\n    = Selected --  Checked (rendered with a checkmark)\n    | NotSelected -- Not Checked (rendered blank)\n    | PartiallySelected -- Indeterminate (rendered dash)\n\n","args":[],"cases":[["Selected",[]],["NotSelected",[]],["PartiallySelected",[]]]}],"aliases":[],"values":[{"name":"containerCss","comment":" Adds CSS to the element containing the input.\n","type":"List.List Css.Style -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"disabled","comment":" This disables the input\n","type":"Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"enabled","comment":" This enables the input, this is the default behavior\n","type":"Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"guidance","comment":" A guidance message shows below the input, unless an error message is showing instead.\n","type":"String.String -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"guidanceHtml","comment":" A guidance message (HTML) shows below the input, unless an error message is showing instead.\n","type":"List.List (Html.Styled.Html msg) -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"hiddenLabel","comment":" Hides the visible label. (There will still be an invisible label for screen readers.)\n","type":"Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"id","comment":" Set a custom ID for this checkbox input and label. If you don't set this,\nwe'll automatically generate one from the label you pass in, but this can\ncause problems if you have more than one checkbox input with the same label on\nthe page. You might also use this helper if you're manually managing focus.\n","type":"String.String -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"labelCss","comment":" Adds CSS to the element containing the label text.\n\nNote that these styles don't apply to the literal HTML label element, since it contains the icon SVG as well.\n\n","type":"List.List Css.Style -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"noMargin","comment":" Remove default spacing from the top and bottom of the checkbox.\n","type":"Basics.Bool -> Nri.Ui.Checkbox.V7.Attribute value"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"onCheck","comment":" Fire a message when toggling the checkbox.\n","type":"(Basics.Bool -> msg) -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"selectedFromBool","comment":" If your selectedness is always selected or not selected,\nyou will likely store that state as a `Bool` in your model.\n`selectedFromBool` lets you easily convert that into an `IsSelected` value\nfor use with `Nri.Ui.Checkbox`.\n","type":"Basics.Bool -> Nri.Ui.Checkbox.V7.IsSelected"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Checkbox.V7.Attribute msg"},{"name":"view","comment":" View a checkbox (the label is only used for accessibility hints unless visibleLabel attribute is applied)\n","type":"{ label : String.String, selected : Nri.Ui.Checkbox.V7.IsSelected } -> List.List (Nri.Ui.Checkbox.V7.Attribute msg) -> Html.Styled.Html msg"},{"name":"viewIcon","comment":" ","type":"List.List Css.Style -> Nri.Ui.Svg.V1.Svg -> Html.Styled.Html msg"},{"name":"visibleLabel","comment":" Shows the visible label. This is the default behavior\n","type":"Nri.Ui.Checkbox.V7.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.ClickableSvg.V2","comment":"\n\n\n# Patch changes:\n\n    - adds `nriDescription`, `testId`, and `id` helpers\n    - adds `iconForMobile`, `iconForQuizEngineMobile`, `iconForNarrowMobile`\n    - adds `submit` and `opensModal`\n    - replaces the `disabled` attribute with `aria-disabled=\"true\"`\n    - removes click handler from disabled buttons\n    - prevents default behavior for disabled submit buttons by setting `type=\"button\"`\n\n\n# Create a button or link\n\n@docs button, link\n@docs Attribute\n\n\n## Behavior\n\n@docs onClick, submit, opensModal\n@docs href, linkSpa, linkExternal, linkWithMethod, linkWithTracking, linkExternalWithTracking\n\n\n## Sizing\n\n@docs exactSize, exactWidth, exactHeight\n\n\n## State\n\n@docs disabled\n\n\n## Icons\n\n@docs rightIcon\n@docs iconForMobile, iconForQuizEngineMobile, iconForNarrowMobile\n\n\n## Customization\n\n@docs withBorder\n@docs primary, secondary, tertiary, quaternary, danger, dangerSecondary\n\n@docs custom, nriDescription, testId, id\n\n\n### CSS\n\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss\n\n\n### DEPRECATED\n\nIn practice, we don't use these sizes. Remove them!\n\n@docs small, medium, large\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"button","comment":" ","type":"String.String -> Nri.Ui.Svg.V1.Svg -> List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) -> Html.Styled.Html msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying Button styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"danger","comment":" White/transparent icon on a red background.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"dangerSecondary","comment":" Red icon on a white/transparent background.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"disabled","comment":" ","type":"Basics.Bool -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"exactHeight","comment":" Define a size in `px` for the element's total height.\n","type":"Basics.Int -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"exactSize","comment":" Set the size in `px` for the element's width and height.\n\nEquivalent to:\n\n    [ exactWidth inPx\n    , exactHeight inPx\n    ]\n\n","type":"Basics.Int -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"exactWidth","comment":" Define a size in `px` for the element's total width.\n","type":"Basics.Int -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"href","comment":" ","type":"String.String -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"iconForMobile","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"iconForNarrowMobile","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"iconForQuizEngineMobile","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"large","comment":" This attribute will be removed in the next version of ClickableSvg!\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"link","comment":" ","type":"String.String -> Nri.Ui.Svg.V1.Svg -> List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) -> Html.Styled.Html msg"},{"name":"linkExternal","comment":" ","type":"String.String -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"linkExternalWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"linkSpa","comment":" Use this link for routing within a single page app.\n\nThis will make a normal <a> tag, but change the Events.onClick behavior to avoid reloading the page.\n\nSee <https://github.com/elm-lang/html/issues/110> for details on this implementation.\n\n","type":"String.String -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"linkWithMethod","comment":" ","type":"{ method : String.String, url : String.String } -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"linkWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"medium","comment":" This attribute will be removed in the next version of ClickableSvg!\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"mobileCss","comment":" Equivalent to:\n\n    ClickableSvg.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"notMobileCss","comment":" Equivalent to:\n\n    ClickableSvg.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"onClick","comment":" ","type":"msg -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"opensModal","comment":" Use this attribute when interacting with the button will launch a modal.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"primary","comment":" white/transparent icon on an azure background.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"quaternary","comment":" Used to de-emphasize elements when not hovered.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Equivalent to:\n\n    ClickableSvg.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"rightIcon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"secondary","comment":" This is the default: a blue icon on a transparent background, or a blue icon\non a white/glacier icon with a blue border.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"small","comment":" This is the default. This attribute will be removed in the next version of ClickableSvg!\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"submit","comment":" By default, buttons have type \"button\". Use this attribute to change the button type to \"submit\".\n\nNote: this attribute is not supported by links.\n\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"tertiary","comment":" Used to de-emphasize elements when not hovered.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"withBorder","comment":" Display a border around the icon.\n","type":"Nri.Ui.ClickableSvg.V2.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.ClickableText.V3","comment":" Notes for V4:\n\n  - Remove the -v2- from dataDescriptor to avoid version specific\n  - Use dataDescriptor for clickable-text-label\n\n\n# Post-release patches\n\n  - uses ClickableAttributes\n  - adds `css` helper\n  - removes underline on hover and recolors to azureDark\n  - removes bottom border\n  - adds `nriDescription`, `testId`, and `id` helpers\n  - adds `modal` helper, for use in modal footers, same as applying large and Css.marginTop (Css.px 15)\n  - adds `notMobileCss`, `mobileCss`, `quizEngineMobileCss`\n  - adds `hideIconForMobile` and `hideIconAt`\n  - adds `hideTextForMobile` and `hideTextAt`\n  - adds `submit` and `opensModal`\n  - adds `disabled`\n  - adds `caption` size that matches up with Text.caption's font size\n  - replaces the `disabled` attribute with `aria-disabled=\"true\"`\n  - removes click handler from disabled buttons\n  - prevents default behavior for disabled submit buttons by setting `type=\"button\"`\n\n\n# Changes from V2\n\n  - Changes API to be attributes-based rather than config-based\n  - Makes a hole for custom attributes (like ids and styles)\n\n\n# About:\n\nClickableText looks different from Nri.Ui.Button in that it displays without margin or padding.\nClickableText has the suave, traditional look of a \"link\"!\n\nFor accessibility purposes, buttons that perform an action on the current page should be HTML `<button>`\nelements and are created here with `*Button` functions. Buttons that take the user to a new page should be\nHTML `<a>` elements and are created here with `*Link` functions.\n\n\n# `<button>` creators\n\n@docs button\n\n\n# `<a>` creators\n\n@docs link\n\n\n# Attributes\n\n@docs Attribute\n\n\n## Sizing\n\n@docs caption, small, medium, large, modal\n\n\n## Appearance\n\n@docs appearsInline\n\n\n## Behavior\n\n@docs onClick, submit, opensModal\n@docs href, linkSpa, linkExternal, linkWithMethod, linkWithTracking, linkExternalWithTracking\n@docs disabled\n\n\n## Icons\n\n@docs icon, rightIcon\n@docs hideIconForMobile, hideIconFor\n\n\n## Customization\n\n@docs custom, nriDescription, testId, id\n\n\n### CSS\n\n@docs hideTextForMobile, hideTextFor\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss, rightIconCss\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"appearsInline","comment":" Specifies whether it should have inline appearance.\n","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"button","comment":" Creates a `<button>` element\n","type":"String.String -> List.List (Nri.Ui.ClickableText.V3.Attribute msg) -> Html.Styled.Html msg"},{"name":"caption","comment":" This size setting corresponds to Text.caption's font size.\n","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying Button styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"disabled","comment":" Shows inactive styling.\n\nIf a button, this attribute will disable it as you'd expect.\n\nIf a link, this attribute will follow the pattern laid out in [Scott O'Hara's disabled links](https://www.scottohara.me/blog/2021/05/28/disabled-links.html) article,\nand essentially make the anchor a disabled placeholder.\n\n_Caveat!_\n\nThe Component Catalog example will NOT work correctly because of <https://github.com/elm/browser/issues/34>, which describes a problem where \"a tags without href generate a navigation event\".\n\nIn most cases, if you're not using Browser.application, disabled links should work just fine.\n\n","type":"Basics.Bool -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"hideIconFor","comment":" Hide the left-side icon for an arbitrary media query.\n","type":"Css.Media.MediaQuery -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"hideIconForMobile","comment":" Hide the left-side icon for the mobile breakpoint.\n","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"hideTextFor","comment":" ","type":"Css.Media.MediaQuery -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"hideTextForMobile","comment":" ","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"href","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"large","comment":" ","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"link","comment":" Creates a `<a>` element\n","type":"String.String -> List.List (Nri.Ui.ClickableText.V3.Attribute msg) -> Html.Styled.Html msg"},{"name":"linkExternal","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"linkExternalWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"linkSpa","comment":" Use this link for routing within a single page app.\n\nThis will make a normal <a> tag, but change the Events.onClick behavior to avoid reloading the page.\n\nSee <https://github.com/elm-lang/html/issues/110> for details on this implementation.\n\n","type":"String.String -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"linkWithMethod","comment":" ","type":"{ method : String.String, url : String.String } -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"linkWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"medium","comment":" ","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"mobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"modal","comment":" For use in Modal footers (adds `large` and `Css.marginTop (Css.px 15)`)\n","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"notMobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"onClick","comment":" ","type":"msg -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"opensModal","comment":" Use this attribute when interacting with the button will launch a modal.\n","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"rightIcon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"rightIconCss","comment":" Specifies custom styles for the rightIcon\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"small","comment":" ","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"submit","comment":" By default, buttons have type \"button\". Use this attribute to change the button type to \"submit\".\n\nNote: this attribute is not supported by links.\n\n","type":"Nri.Ui.ClickableText.V3.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V3.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.ClickableText.V4","comment":" Patch changes\n\n  - switchs `Medium` size to the default\n\n\n# Changes from V3\n\n  - removes the `caption` attribute\n  - removes `Css.display Css.inlineBlock`\n  - inherits font family and weight from parent\n  - adjusts font sizes\n  - uses `Css.display Css.inlineFlex` only on buttons\n  - removes `\"-v2\"` from data descriptor\n  - uses dataDescriptor for `\"clickable-text-label\"`\n  - adds `Inherited` size as default\n  - adjusts icon margins for `Inherited` size\n\n\n# About:\n\nClickableText looks different from Nri.Ui.Button in that it displays without margin or padding.\nClickableText has the suave, traditional look of a \"link\"!\n\nFor accessibility purposes, buttons that perform an action on the current page should be HTML `<button>`\nelements and are created here with `*Button` functions. Buttons that take the user to a new page should be\nHTML `<a>` elements and are created here with `*Link` functions.\n\n\n# `<button>` creators\n\n@docs button\n\n\n# `<a>` creators\n\n@docs link\n\n\n# Attributes\n\n@docs Attribute\n\n\n## Sizing\n\n@docs small, medium, large, modal\n\n\n## Appearance\n\n@docs appearsInline\n\n\n## Behavior\n\n@docs onClick, submit, opensModal\n@docs href, linkSpa, linkExternal, linkWithMethod, linkWithTracking, linkExternalWithTracking\n@docs disabled\n\n\n## Icons\n\n@docs icon, rightIcon\n@docs hideIconForMobile, hideIconFor\n\n\n## Customization\n\n@docs custom, nriDescription, testId, id\n\n\n### CSS\n\n@docs hideTextForMobile, hideTextFor\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss, rightIconCss\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"appearsInline","comment":" Specifies whether it should have inline appearance.\n","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"button","comment":" Creates a `<button>` element\n","type":"String.String -> List.List (Nri.Ui.ClickableText.V4.Attribute msg) -> Html.Styled.Html msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying Button styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"disabled","comment":" Shows inactive styling.\n\nIf a button, this attribute will disable it as you'd expect.\n\nIf a link, this attribute will follow the pattern laid out in [Scott O'Hara's disabled links](https://www.scottohara.me/blog/2021/05/28/disabled-links.html) article,\nand essentially make the anchor a disabled placeholder.\n\n_Caveat!_\n\nThe Component Catalog example will NOT work correctly because of <https://github.com/elm/browser/issues/34>, which describes a problem where \"a tags without href generate a navigation event\".\n\nIn most cases, if you're not using Browser.application, disabled links should work just fine.\n\n","type":"Basics.Bool -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"hideIconFor","comment":" Hide the left-side icon for an arbitrary media query.\n","type":"Css.Media.MediaQuery -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"hideIconForMobile","comment":" Hide the left-side icon for the mobile breakpoint.\n","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"hideTextFor","comment":" ","type":"Css.Media.MediaQuery -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"hideTextForMobile","comment":" ","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"href","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"large","comment":" ","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"link","comment":" Creates a `<a>` element\n","type":"String.String -> List.List (Nri.Ui.ClickableText.V4.Attribute msg) -> Html.Styled.Html msg"},{"name":"linkExternal","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"linkExternalWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"linkSpa","comment":" Use this link for routing within a single page app.\n\nThis will make a normal <a> tag, but change the Events.onClick behavior to avoid reloading the page.\n\nSee <https://github.com/elm-lang/html/issues/110> for details on this implementation.\n\n","type":"String.String -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"linkWithMethod","comment":" ","type":"{ method : String.String, url : String.String } -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"linkWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"medium","comment":" `Medium` is the default size.\n","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"mobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"modal","comment":" For use in Modal footers (adds `large` and `Css.marginTop (Css.px 15)`)\n","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"notMobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"onClick","comment":" ","type":"msg -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"opensModal","comment":" Use this attribute when interacting with the button will launch a modal.\n","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Equivalent to:\n\n    ClickableText.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"rightIcon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"rightIconCss","comment":" Specifies custom styles for the rightIcon\n","type":"List.List Css.Style -> Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"small","comment":" ","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"submit","comment":" By default, buttons have type \"button\". Use this attribute to change the button type to \"submit\".\n\nNote: this attribute is not supported by links.\n\n","type":"Nri.Ui.ClickableText.V4.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.ClickableText.V4.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Colors.Extra","comment":" Helpers for working with colors.\n\n\n# Conversions\n\n@docs toCssColor, fromCssColor\n@docs withAlpha\n@docs toCssString\n@docs highContrastColor\n\n","unions":[],"aliases":[],"values":[{"name":"fromCssColor","comment":" ","type":"Css.Color -> SolidColor.SolidColor"},{"name":"highContrastColor","comment":" ","type":"Css.Color -> Css.Color"},{"name":"toCssColor","comment":" ","type":"SolidColor.SolidColor -> Css.Color"},{"name":"toCssString","comment":" ","type":"Css.Color -> String.String"},{"name":"withAlpha","comment":" Add an alpha property to a Css.Color\ngrassland -- \"{ value = \"#56bf74\", color = Compatible, red = 86, green = 191, blue = 116, alpha = 1, warnings = [] } : Css.Color\"\nwithAlpha 0.5 grassland -- \"{ value = \"rgba(86, 191, 116, 0.5)\", color = Compatible, warnings = [], red = 86, green = 191, blue = 116, alpha = 0.5 } : Css.Color\"\n","type":"Basics.Float -> Css.Color -> Css.Color"}],"binops":[]},{"name":"Nri.Ui.Colors.V1","comment":" Comprehensive list of named colors.\n\nFor helpers & conversions, see Nri.Ui.Colors.Extra, or\nconsider [elm-color-extra](http://package.elm-lang.org/packages/eskimoblood/elm-color-extra/5.0.0/).\n\n@docs aqua, aquaDark, aquaLight, azure, azureDark\n@docs white\n@docs cornflower, cornflowerDark, cornflowerLight, cyan\n@docs frost\n@docs gray20, gray45, gray75, gray85, gray92, gray96\n@docs glacier, grassland, green, greenDark, greenDarkest, greenLight, greenLightest\n@docs highlightLightBlue, highlightLightMagenta, highlightLightYellow\n@docs highlightBlue, highlightBlueLightest, highlightBlueDark\n@docs highlightCyan, highlightCyanLightest, highlightCyanDark\n@docs highlightGreen, highlightGreenLightest, highlightGreenDark\n@docs highlightMagenta, highlightMagentaLightest, highlightMagentaDark\n@docs highlightPurple, highlightPurpleLightest, highlightPurpleDark\n@docs highlightYellow, highlightYellowLightest, highlightYellowDark\n@docs highlightBrown, highlightBrownLightest, highlightBrownDark\n@docs textHighlightYellow, textHighlightCyan, textHighlightMagenta, textHighlightGreen, textHighlightBlue, textHighlightPurple, textHighlightBrown\n@docs lichen\n@docs magenta\n@docs navy\n@docs orange, ochre, ochreDark\n@docs purple, purpleDark, purpleLight\n@docs red, redDark, redLight\n@docs sunshine\n@docs turquoise, turquoiseDark, turquoiseLight\n@docs mustard\n\n","unions":[],"aliases":[],"values":[{"name":"aqua","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"aquaDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"aquaLight","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"azure","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"azureDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"cornflower","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"cornflowerDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"cornflowerLight","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"cyan","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"frost","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"glacier","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"grassland","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"gray20","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"gray45","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"gray75","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"gray85","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"gray92","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"gray96","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"green","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"greenDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"greenDarkest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"greenLight","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"greenLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightBlue","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightBlueDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightBlueLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightBrown","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightBrownDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightBrownLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightCyan","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightCyanDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightCyanLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightGreen","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightGreenDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightGreenLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightLightBlue","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightLightMagenta","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightLightYellow","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightMagenta","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightMagentaDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightMagentaLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightPurple","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightPurpleDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightPurpleLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightYellow","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightYellowDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"highlightYellowLightest","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"lichen","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"magenta","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"mustard","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"navy","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"ochre","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"ochreDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"orange","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"purple","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"purpleDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"purpleLight","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"red","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"redDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"redLight","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"sunshine","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"textHighlightBlue","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"textHighlightBrown","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"textHighlightCyan","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"textHighlightGreen","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"textHighlightMagenta","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"textHighlightPurple","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"textHighlightYellow","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"turquoise","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"turquoiseDark","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"turquoiseLight","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"},{"name":"white","comment":" See <https://noredink-ui.netlify.com/#/doodad/Colors>\n","type":"Css.Color"}],"binops":[]},{"name":"Nri.Ui.Confetti.V2","comment":"\n\n@docs Model, init\n@docs view\n@docs Msg, burst, update, updatePageWidth, subscriptions\n\nPatch changes:\n\n  - adds stars to the confetti\n\nChanges from V1:\n\n  - removes custom words from confetti\n\n","unions":[{"name":"Model","comment":" ","args":[],"cases":[]}],"aliases":[{"name":"Msg","comment":" ","args":[],"type":"Particle.System.Msg Nri.Ui.Confetti.V2.Confetti"}],"values":[{"name":"burst","comment":" `burst` BURSTS CONFETTI!!!\n","type":"Nri.Ui.Confetti.V2.Model -> Nri.Ui.Confetti.V2.Model"},{"name":"init","comment":" `center` An argument to Particle.withLocation that determines the horizontal center of viewport where you would like confetti to rain.\n","type":"Basics.Float -> Nri.Ui.Confetti.V2.Model"},{"name":"subscriptions","comment":" ","type":"(Nri.Ui.Confetti.V2.Msg -> msg) -> Nri.Ui.Confetti.V2.Model -> Platform.Sub.Sub msg"},{"name":"update","comment":" ","type":"Particle.System.Msg Nri.Ui.Confetti.V2.Confetti -> Nri.Ui.Confetti.V2.Model -> Nri.Ui.Confetti.V2.Model"},{"name":"updatePageWidth","comment":" You will need to watch for page resize events and update the confetti model\nwith the new width. If you don't, your confetti will be off-center.\n\nWhy is this not part of subscriptions? Your application may already be listening\nfor browser resize events -- we don't want to double-up listeners unnecessarily.\n\n","type":"Basics.Int -> Nri.Ui.Confetti.V2.Model -> Nri.Ui.Confetti.V2.Model"},{"name":"view","comment":" ","type":"Nri.Ui.Confetti.V2.Model -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Container.V2","comment":" Common NoRedInk Containers\n\n\n# TODO in next version:\n\n  - remove `invalid`\n\n\n# Changelog\n\n\n## Patch changes\n\n  - use `Shadows`\n  - add notMobileCss, mobileCss, quizEngineMobileCss\n  - use internal `Content` module\n  - adds paragraph\n\n\n## Changes from V1\n\n  - removes fullHeight\n  - changes the API from providing many themed functions that create HTML (`alternate`, `general`, etc.) to having a single `view` helper that takes a list of attributes (including themed attributes and content attributes)\n  - adds `custom`, `testId`, `id`\n  - adds `plaintext` helper and `markdown` helper\n  - renames themes from:\n      - `alternate` -> `gray`\n      - `general` -> `default`\n      - `interactable` -> `pillow`\n  - removes `interactableWithLabel` theme\n  - adds `buttony` theme\n\n\n# Documentation\n\n\n## View\n\n@docs view, Attribute\n@docs custom, testId, id\n\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss\n@docs paddingPx\n\n\n## Content\n\n@docs paragraph, plaintext, markdown, html\n\n\n## Themes\n\n@docs gray, default, disabled, invalid, pillow, buttony\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"buttony","comment":" Used for clickable cards\n","type":"Nri.Ui.Container.V2.Attribute msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Container.V2.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.Container.V2.Attribute msg"},{"name":"default","comment":" Used for the default container case.\n","type":"Nri.Ui.Container.V2.Attribute msg"},{"name":"disabled","comment":" ","type":"Nri.Ui.Container.V2.Attribute msg"},{"name":"gray","comment":" Used when there are a lot of containers.\n","type":"Nri.Ui.Container.V2.Attribute msg"},{"name":"html","comment":" Provide a list of custom HTML.\n","type":"List.List (Html.Styled.Html msg) -> Nri.Ui.Container.V2.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Container.V2.Attribute msg"},{"name":"invalid","comment":" DEPRECATED -- this will be removed in the next version of this component.\n","type":"Nri.Ui.Container.V2.Attribute msg"},{"name":"markdown","comment":" Provide a string that will be rendered as markdown.\n\nNote that you may need to remove extra margin added by default\nto `p` tags by user agents.\n\n","type":"String.String -> Nri.Ui.Container.V2.Attribute msg"},{"name":"mobileCss","comment":" Set styles that will only apply if the viewport is narrower than NRI's mobile breakpoint.\n\nEquivalent to:\n\n    Container.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Container.V2.Attribute msg"},{"name":"notMobileCss","comment":" Set styles that will only apply if the viewport is wider than NRI's mobile breakpoint.\n\nEquivalent to:\n\n    Container.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Container.V2.Attribute msg"},{"name":"paddingPx","comment":" Changes the padding inside the container border around the content.\n","type":"Basics.Float -> Nri.Ui.Container.V2.Attribute msg"},{"name":"paragraph","comment":" Provide a plain-text string that will be put into a paragraph tag, with the default margin removed.\n","type":"String.String -> Nri.Ui.Container.V2.Attribute msg"},{"name":"pillow","comment":" Used for containers of interactive elements.\n","type":"Nri.Ui.Container.V2.Attribute msg"},{"name":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> Nri.Ui.Container.V2.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Set styles that will only apply if the viewport is narrower than NRI's quiz-engine-specific mobile breakpoint.\n\nEquivalent to:\n\n    Container.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Container.V2.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Container.V2.Attribute msg"},{"name":"view","comment":" ","type":"List.List (Nri.Ui.Container.V2.Attribute msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.CssVendorPrefix.V1","comment":" Vendor prefixed css properties.\n\n@docs property, value, complexProperty\n\n","unions":[],"aliases":[],"values":[{"name":"complexProperty","comment":" Used to build more complex Css styles\n","type":"(String.String -> Css.Style) -> Css.Style"},{"name":"property","comment":" Same as Css.property but vendor prefixed.\n","type":"String.String -> String.String -> Css.Style"},{"name":"value","comment":" Same as Css.property but vendor prefixed.\n","type":"String.String -> String.String -> Css.Style"}],"binops":[]},{"name":"Nri.Ui.Data.PremiumDisplay","comment":"\n\n@docs PremiumDisplay\n\n","unions":[{"name":"PremiumDisplay","comment":" ","args":[],"cases":[["Free",[]],["PremiumLocked",[]],["PremiumUnlocked",[]],["PremiumVouchered",[]]]}],"aliases":[],"values":[],"binops":[]},{"name":"Nri.Ui.Divider.V2","comment":" Patch changes:\n\n  - Title is navy, Muli, fontWeight 600\n\n@docs view\n\n","unions":[],"aliases":[],"values":[{"name":"view","comment":" ","type":"String.String -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Effects.V1","comment":" Css mixins reused across Nri modules.\n\n@docs selectionShadow\n\n","unions":[],"aliases":[],"values":[{"name":"selectionShadow","comment":" Draw a 2 px thick ochre border around the element to indicate it is\nselected.\n\nThis uses a CSS box shadow to draw what looks like a border. Box shadows are\nperfect for this because they don't affect the elements positioning in any way.\nThis means we can be sure switching the selection shadow on and off is not\ngoing to make the element jump.\n\n","type":"List.List Css.Style"}],"binops":[]},{"name":"Nri.Ui.FocusLoop.Lazy.V1","comment":" Like FocusLoop, but with lazy rendering. Prefer this when the set of items can change.\n\n@docs lazy, lazy2, lazy3, lazy4, lazy5\n\n","unions":[],"aliases":[],"values":[{"name":"lazy","comment":" Lazy version of FocusLoop.view\n\nAs the name suggests, this function uses Html.Lazy.lazy to render your `view` function.\n\nThere are special considerations to take into account when using this or the laziness will\nnot actually work. It is very easy to get this wrong or to accidentally break it, so please\nread the following carefully.\n\nThis function MUST be called with with a configuration and assigned to a TOP-LEVEL CONSTANT.\n\nSpecifically, this works:\n\n    viewFocusLoop : List item -> List ( String, Html msg )\n    viewFocusLoop =\n        FocusLoop.lazy\n            { toId = .id\n            , focus = Focus\n            , view = \\arrowKeyHandlers item -> ...\n            , leftRight = True\n            , upDown = True\n            }\n\nThis does NOT work:\n\n    viewFocusLoop : List item -> List ( String, Html msg )\n    viewFocusLoop items =\n        FocusLoop.lazy\n            { toId = .id\n            , focus = Focus\n            , view = \\arrowKeyHandlers item -> ...\n            , leftRight = True\n            , upDown = True\n            }\n            items\n\nFurther, the same considerations you would take for `Html.Lazy.lazyN` apply\nto the `item`s passed to this function. That is primitives are checked by value\nand everything else is checked by reference, see <https://guide.elm-lang.org/optimization/lazy>\n\nCrucially, this means that you cannot use records or instances of custom types that do not exist\non the model (such that the same reference will be passed on each render). Or put into inverse\nterms, you may not pass records or custom types that are instantiated in the view.\n\nConsider the following example using Tooltips. Knowing that we must assign the result of\n`FocusLoop.lazy` to a top-level constant, we might try the following:\n\n    type alias Model =\n        { activeTooltip : Maybe Tooltip\n        , items : List Item\n        }\n\n    type Tooltip\n        = ItemTooltip ItemId\n\n    type alias Item =\n        { id : ItemId\n        }\n\n    view : Model -> Html msg\n    view model =\n        div []\n            [ viewFocusLoop\n                (List.map\n                    (\\item ->\n                        { item = item\n                        , tooltipOpen = model.activeTooltip == Just (ItemTooltip item.id)\n                        }\n                    )\n                    model.items\n                )\n            ]\n\n    viewFocusLoop : List { item, tooltipOpen } -> List ( String, Html msg )\n    viewFocusLoop =\n        FocusLoop.lazy\n            { toId = .item.id\n            , focus = Focus\n            , view = \\arrowKeyHandlers { item, tooltipOpen } -> ...\n            , leftRight = True\n            , upDown = True\n            }\n\nHowever this will not work, because in the List.map call we are instantiating\na new anonymous record, and thus a new reference, on each call to view.\n\nIn this case, you will need to use one of the other FocusLoop.lazy functions. To follow\nthis thread, see the example for FocusLoop.lazy2.\n\n","type":"{ toId : item -> String.String, focus : String.String -> msg, view : List.List (Accessibility.Styled.Key.Event msg) -> item -> Accessibility.Styled.Html msg, leftRight : Basics.Bool, upDown : Basics.Bool } -> List.List item -> List.List ( String.String, Accessibility.Styled.Html msg )"},{"name":"lazy2","comment":" Like FocusLoop.lazy, but with 2 arguments to your view function.\n\nPicking up from the usage example for FocusLoop.lazy, we can use this function to\nuse Html.Lazy.lazy2 (actually Html.Lazy.lazy4, but the first two arguments are used\nby FocusLoop.lazy2 itself!) to check on individual arguments.\n\nBecause the restriction regarding assigning to a top-level constant still applies,\nour mapping side is the same as before:\n\n    view : Model -> Html msg\n    view model =\n        div []\n            [ viewFocusLoop\n                (List.map\n                    (\\item ->\n                        { item = item\n                        , tooltipOpen = model.activeTooltip == Just (ItemTooltip item.id)\n                        }\n                    )\n                    model.items\n                )\n            ]\n\nBut for our `viewFocusLoop` function we will use `lazy2` and supply an additional `apply`\nin the configuration to extract our arguments:\n\n    FocusLoop.lazy2\n        { apply = \\f { item, tooltipOpen } -> f item tooltipOpen\n        , ...\n        }\n\nYou can think of `f` in this function as being the `view` function passed to `Html.Lazy.lazy2`.\n\ni.e.\n\n                        -- vvv This lambda is `f` in the above example. vvv --\n    Html.Lazy.lazy2 <|              \\item tooltipOpen -> ...\n\nFor a more in-depth example, see UsageExamples/FocusLoop in the component catalog.\n\n","type":"{ apply : (a -> b -> Nri.Ui.FocusLoop.Lazy.V1.Args2 a b) -> item -> Nri.Ui.FocusLoop.Lazy.V1.Args2 a b, toId : item -> String.String, focus : String.String -> msg, view : List.List (Accessibility.Styled.Key.Event msg) -> a -> b -> Accessibility.Styled.Html msg, leftRight : Basics.Bool, upDown : Basics.Bool } -> List.List item -> List.List ( String.String, Accessibility.Styled.Html msg )"},{"name":"lazy3","comment":" Like FocusLoop.lazy, but with 3 arguments to your view function.\n\nSee lazy and lazy2 usage example for more details.\n\n","type":"{ apply : (a -> b -> c -> Nri.Ui.FocusLoop.Lazy.V1.Args3 a b c) -> item -> Nri.Ui.FocusLoop.Lazy.V1.Args3 a b c, toId : item -> String.String, focus : String.String -> msg, view : List.List (Accessibility.Styled.Key.Event msg) -> a -> b -> c -> Accessibility.Styled.Html msg, leftRight : Basics.Bool, upDown : Basics.Bool } -> List.List item -> List.List ( String.String, Accessibility.Styled.Html msg )"},{"name":"lazy4","comment":" Like FocusLoop.lazy, but with 4 arguments to your view function.\n\nSee lazy and lazy2 usage example for more details.\n\n","type":"{ apply : (a -> b -> c -> d -> Nri.Ui.FocusLoop.Lazy.V1.Args4 a b c d) -> item -> Nri.Ui.FocusLoop.Lazy.V1.Args4 a b c d, toId : item -> String.String, focus : String.String -> msg, view : List.List (Accessibility.Styled.Key.Event msg) -> a -> b -> c -> d -> Accessibility.Styled.Html msg, leftRight : Basics.Bool, upDown : Basics.Bool } -> List.List item -> List.List ( String.String, Accessibility.Styled.Html msg )"},{"name":"lazy5","comment":" Like FocusLoop.lazy, but with 5 arguments to your view function.\n\nSee lazy and lazy2 usage example for more details.\n\n","type":"{ apply : (a -> b -> c -> d -> e -> Nri.Ui.FocusLoop.Lazy.V1.Args5 a b c d e) -> item -> Nri.Ui.FocusLoop.Lazy.V1.Args5 a b c d e, toId : item -> String.String, focus : String.String -> msg, view : List.List (Accessibility.Styled.Key.Event msg) -> a -> b -> c -> d -> e -> Accessibility.Styled.Html msg, leftRight : Basics.Bool, upDown : Basics.Bool } -> List.List item -> List.List ( String.String, Accessibility.Styled.Html msg )"}],"binops":[]},{"name":"Nri.Ui.FocusLoop.V1","comment":" Sometimes, there are sets of interactive elements that we want users to be able to navigate\nthrough with arrow keys rather than with tabs, and we want the final focus change to wrap.\nThis module makes it easier to set up this focus and wrapping behavior.\n\n@docs view, addEvents\n\n","unions":[],"aliases":[],"values":[{"name":"addEvents","comment":" Zip a list of items with its corresponding keyboard events.\n","type":"{ focus : a -> msg, leftRight : Basics.Bool, upDown : Basics.Bool } -> List.List a -> List.List ( a, List.List (Accessibility.Styled.Key.Event msg) )"},{"name":"view","comment":" Helper for creating a list of elements with looping arrow-key navigation.\n\nYour `view` function will be called for each item with the corresponding keyboard\nevent handlers, as well as the item itself.\n\ne.g.\n\n    FocusLoop.view\n        { id = .id\n        , focus = Focus\n        , leftRight = True\n        , upDown = True\n        , view = viewFocusableItem\n        }\n        [ { id = 1, name = \"Foo\" } ]\n\n    viewFocusableItem item arrowKeyHandlers =\n        div\n            [ Key.onKeyDownPreventDefault arrowKeyHandlers ]\n            [ text item.name ]\n\nDoes your list support adding and removing items? If so, check out `FocusLoop.Lazy` which\nwill prevent recalculation of event handlers for every item when the list changes.\n\n","type":"{ toId : item -> id, focus : id -> msg, view : List.List (Accessibility.Styled.Key.Event msg) -> item -> Accessibility.Styled.Html msg, leftRight : Basics.Bool, upDown : Basics.Bool } -> List.List item -> List.List (Accessibility.Styled.Html msg)"}],"binops":[]},{"name":"Nri.Ui.FocusRing.V1","comment":"\n\n@docs forKeyboardUsers, forMouseUsers\n@docs styles, tightStyles\n@docs boxShadows, insetBoxShadows, outerBoxShadow, insetBoxShadow\n@docs customClass\n@docs outerColor, innerColor\n\n","unions":[],"aliases":[],"values":[{"name":"boxShadows","comment":"\n\n    focus\n        [ FocusRing.boxShadows [ \"inset 0 3px 0 0 \" ++ ColorsExtra.toCssString glacier ]\n        , Css.outline3 (Css.px 2) Css.solid Css.transparent\n        ]\n\n","type":"List.List String.String -> Css.Style"},{"name":"customClass","comment":" Add this class to remove global focus styles. Only do this\nif you'll be adding the two-tone focus ring styles another way.\n","type":"String.String"},{"name":"forKeyboardUsers","comment":" When :focus-visible, add the two-tone focus ring.\n\nHides default focus ring from elements that are tagged as having a custom focus ring.\n\n","type":"List.List Css.Global.Snippet"},{"name":"forMouseUsers","comment":" ","type":"List.List Css.Global.Snippet"},{"name":"innerColor","comment":" ","type":"Css.Color"},{"name":"insetBoxShadow","comment":" In special cases, we don't use a two-tone focus ring, and an outset focus ring would be obscured.\n\nBe very sure this is what you need before using this!\n\n","type":"Css.Style"},{"name":"insetBoxShadows","comment":" Please be sure that the padding on the element you add this style too is sufficient (at least 6px on all sides) that the inset box shadow won't cover any content.\n\n    focus\n        [ FocusRing.insetBoxShadows [ \"inset 0 3px 0 0 \" ++ ColorsExtra.toCssString glacier ]\n        , Css.outline3 (Css.px 2) Css.solid Css.transparent\n        ]\n\n","type":"List.List String.String -> Css.Style"},{"name":"outerBoxShadow","comment":" In special cases, we don't use a two-tone focus ring.\n\nBe very sure this is what you need before using this!\n\n","type":"Css.Style"},{"name":"outerColor","comment":" ","type":"Css.Color"},{"name":"styles","comment":" A two-tone focus ring that will be visually apparent for any background/element combination.\n\nNOTE: use `boxShadows` instead if your focusable element:\n\n  - already has a box shadow\n  - has an explicit border radius set\n\n","type":"List.List Css.Style"},{"name":"tightStyles","comment":" Prefer `styles` over tightStyles, except in cases where line spacing/font size will otherwise cause obscured content.\n","type":"List.List Css.Style"}],"binops":[]},{"name":"Nri.Ui.FocusTrap.V1","comment":" Patch changes:\n\n  - Use Nri.Ui.WhenFocusLeaves.V2\n\nCreate a focus trap.\n\n@docs FocusTrap, toAttribute\n\n","unions":[],"aliases":[{"name":"FocusTrap","comment":" Defines how focus will wrap in reponse to tab keypresses in a part of the UI.\n\nThe ids referenced here are expected to correspond to elements in the container\nwe are applying the focus trap on.\n\n","args":["msg"],"type":"{ firstId : String.String, lastId : String.String, focus : String.String -> msg }"}],"values":[{"name":"toAttribute","comment":" Attach this attribute to add a focus trap to an HTML element.\n","type":"Nri.Ui.FocusTrap.V1.FocusTrap msg -> Accessibility.Styled.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Fonts.V1","comment":" Fonts for NoRedInk projects\n\n@docs baseFont, quizFont, ugFont\n\n","unions":[],"aliases":[],"values":[{"name":"baseFont","comment":" Font for instructions, headers, and pretty much everything else\n","type":"Css.Style"},{"name":"quizFont","comment":" Font for question sentences, or most interactable or graded fields\n","type":"Css.Style"},{"name":"ugFont","comment":" Font for displaying user-generated content.\n","type":"Css.Style"}],"binops":[]},{"name":"Nri.Ui.Header.V1","comment":"\n\n\n## Changelog\n\n\n### Patch\n\n  - reduced the top-padding on the description from 20 to 5px\n\n\n### Major release adjustments\n\n  - removed extraSubheadContent\n\n@docs view, Attribute\n\n\n## Customize the header\n\n@docs aTagAttributes, customPageWidth, breadCrumbsLabel\n\n\n## Add additional content to the header\n\n@docs extraContent, description, extraNav\n\n","unions":[{"name":"Attribute","comment":" ","args":["route","msg"],"cases":[]}],"aliases":[],"values":[{"name":"aTagAttributes","comment":" ","type":"(route -> List.List (Accessibility.Styled.Attribute msg)) -> Nri.Ui.Header.V1.Attribute route msg"},{"name":"breadCrumbsLabel","comment":" Default label is \"breadcrumbs\". You will seldom need override the default.\n","type":"String.String -> Nri.Ui.Header.V1.Attribute route msg"},{"name":"customPageWidth","comment":" By default, the content within the header will expand up to 1000px (the mobile breakpoint value).\n\nFor some views, you may want to use MediaQuery.quizEngineBreakpoint instead.\n\n","type":"Css.Px -> Nri.Ui.Header.V1.Attribute route msg"},{"name":"description","comment":" ","type":"String.String -> Nri.Ui.Header.V1.Attribute route msg"},{"name":"extraContent","comment":" ","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Header.V1.Attribute route msg"},{"name":"extraNav","comment":" ","type":"String.String -> List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Header.V1.Attribute route msg"},{"name":"view","comment":" ","type":"List.List (Nri.Ui.Header.V1.Attribute route msg) -> { breadCrumbs : Nri.Ui.BreadCrumbs.V2.BreadCrumbs route, isCurrentRoute : route -> Basics.Bool } -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Heading.V3","comment":"\n\n\n# Changelog\n\n\n## Patch changes\n\n  - use internal `Content` module\n\n\n## Changes from V2:\n\n  - changes default h2 style to subhead\n  - remove `customAttr`\n  - remove `error` and `errorIf`\n  - replaces `style` with `top`, `subhead`, and `small`\n  - replaces list of HTML attributes with content approach (`plaintext`, `markdown`, `html`) used in Text\n\nHeadings with customization options.\n\n@docs h1, h2, h3, h4, h5\n\n\n# Content\n\n@docs plaintext, markdown, html\n\n\n## Customizations\n\n@docs Attribute\n@docs top, subhead, small\n@docs custom, css, nriDescription, testId, id\n\n","unions":[{"name":"Attribute","comment":" Like an `Html.Attribute msg`, but specifically for headings. Use things\nlike `style` in this module to construct an Attribute.\n","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"css","comment":" Set some custom CSS in this heading. For example, maybe you need to tweak\nmargins.\n","type":"List.List Css.Style -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"custom","comment":" Set some custom attributes.\n\nPlease don't make headers interactive! Use buttons or links instead so that keyboard and screen\nreader users can use the site too.\n\nFor style customizations, be sure to use the Heading.css helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"h1","comment":" Make a first-level heading (styled like a top-level heading by default.)\n","type":"List.List (Nri.Ui.Heading.V3.Attribute msg) -> Html.Styled.Html msg"},{"name":"h2","comment":" Make a second-level heading (styled like a tagline by default.)\n","type":"List.List (Nri.Ui.Heading.V3.Attribute msg) -> Html.Styled.Html msg"},{"name":"h3","comment":" Make a third-level heading (styled like a subhead by default.)\n","type":"List.List (Nri.Ui.Heading.V3.Attribute msg) -> Html.Styled.Html msg"},{"name":"h4","comment":" Make a fourth-level heading (styled like a small heading by default.)\n","type":"List.List (Nri.Ui.Heading.V3.Attribute msg) -> Html.Styled.Html msg"},{"name":"h5","comment":" Make a fifth-level heading (styled like a small heading by default.)\n","type":"List.List (Nri.Ui.Heading.V3.Attribute msg) -> Html.Styled.Html msg"},{"name":"html","comment":" Provide a list of custom HTML.\n","type":"List.List (Html.Styled.Html msg) -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"markdown","comment":" Provide a string that will be rendered as markdown.\n","type":"String.String -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"small","comment":" `small` headings are Colors.gray20 and have:\n\n    font-size: 16px\n    font-weight: 700\n\nBy default.\n\n`small` heading default styles also make the [letter-spacing](https://developer.mozilla.org/en-US/docs/Web/CSS/letter-spacing) slightly narrower, by 0.13px.\n\n","type":"Nri.Ui.Heading.V3.Attribute msg"},{"name":"subhead","comment":" `subhead` headings are Colors.navy and have:\n\n    font-size: 20px\n    font-weight: 700\n\nBy default.\n\n","type":"Nri.Ui.Heading.V3.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Heading.V3.Attribute msg"},{"name":"top","comment":" `top` headings are Colors.navy and have:\n\n    font-size: 30px\n    font-weight: 700\n\nBy default.\n\n","type":"Nri.Ui.Heading.V3.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Highlightable.V3","comment":" A Highlightable represents a span of text, typically a word, and its state.\n\nHighlightable is the unit by which text-wrapping happens. Depending on how the\nHighlighter is initialized, it's very possible for a Highlightable to consist of\njust a single whitespace.\n\n\n## Patch\n\n  - add new syntax for highlight on markdown parse, which supports custom colors\n  - add new initializer for markdown that receives the parsed markdown inlines instead of just the string\n\n\n## Changes from V2\n\n  - move the uIState out of the Highlightable\n  - make the attribute modeling more flexible\n  - replace init with initStatic and initInteractive, and remove attributes from the UI since they're seldom used\n  - remove UIState: it only makes sense in the context of an interactive highlighter\n  - joinAdjacentInteractiveHighlights now takes a sorter\n  - initFragments no longer takes a list of markers\n\n\n## Types\n\n@docs Highlightable, Type\n\n\n## Initializers\n\n@docs initStatic, initInteractive, initFragments\n@docs fromMarkdown, fromMarkdownInlines\n\n\n## UIState and marker\n\n@docs set\n@docs joinAdjacentInteractiveHighlights\n\n\n## Getters\n\n@docs asFragmentTuples, usedMarkers, text, byId\n\n","unions":[{"name":"Type","comment":" ","args":[],"cases":[["Interactive",[]],["Static",[]]]}],"aliases":[{"name":"Highlightable","comment":" A Highlightable comes in two flavors:\n\n  - **Highlightable** | Interactive piece of text.\n\n  - **Static** | Non-interactive piece of text.\n\n    Data for a Highlightable:\n\n  - **text**: String to display.\n\n  - **customAttributes**: User-supplied, non-interactive HTML attributes.\n\n  - **marked**: Current highlights, if any.\n\n  - **index**: Unique highlightable index.\n\n","args":["marker"],"type":"{ text : String.String, customAttributes : List.List (Html.Styled.Attribute Basics.Never), marked : List.List (Nri.Ui.HighlighterTool.V1.MarkerModel marker), index : Basics.Int, type_ : Nri.Ui.Highlightable.V3.Type }"}],"values":[{"name":"asFragmentTuples","comment":" Get a list of fragment texts and whether or not they are marked.\nUseful for encoding answers.\n","type":"List.List (Nri.Ui.Highlightable.V3.Highlightable marker) -> List.List ( List.List marker, String.String )"},{"name":"byId","comment":" Get the highlightable matching the passed-in ID, if any.\n","type":"Basics.Int -> List.List (Nri.Ui.Highlightable.V3.Highlightable kind) -> Maybe.Maybe (Nri.Ui.Highlightable.V3.Highlightable kind)"},{"name":"fromMarkdown","comment":" Initialize highlightables from a markdown string.\nThis will get all `nri-highlight` tags into markded elements, you can add a specific color\nusing the `color` attribute. The default color is yellow.\n\n    fromMarkdown \"for example, <nri-highlight>this phrase</nri-highlight> will show as highlighted\"\n\nwill result in a list of highlightables where \"this phrase\" is marked with the default marker.\n\n    fromMarkdown \"for example, <nri-highlight color=\" cyan \">this phrase</nri-highlight> will show as highlighted\"\n\nwill result in a list of highlightables where \"this phrase\" is marked with the cyan marker.\n\nThe available highlight colors are listed in the [Nri.Colors docs](https://noredink-ui.netlify.app/#/doodad/Colors),\nwhich are the following:\n\n  - `magenta` -> `Colors.highlightMagenta`\n  - `brown` -> `Colors.highlightBrown`\n  - `purple` -> `Colors.highlightPurple`\n  - `blue` -> `Colors.highlightBlue`\n  - `yellow` -> `Colors.highlightYellow`\n  - `green` -> `Colors.highlightGreen`\n  - `cyan` -> `Colors.highlightCyan`\n\nThere is also the empty url syntax, which is currently being deprecated:\n\n    fromMarkdown \"for example, [this phrase]() will show as highlighted\"\n\nwill result in a list of highlightables where \"this phrase\" is marked with the default marker.\n\n","type":"String.String -> List.List (Nri.Ui.Highlightable.V3.Highlightable ())"},{"name":"fromMarkdownInlines","comment":" Same as [`fromMarkdown`](#fromMarkdown), but receives a list of inlines parsed markdown instead of a string.\n\nYou might want to use this if you are parsing highlightables out of lists or in other block contexts that [`fromMarkdown`](#fromMarkdown) does not support.\n\n","type":"List.List (Markdown.Inline.Inline i) -> List.List (Nri.Ui.Highlightable.V3.Highlightable ())"},{"name":"initFragments","comment":" Initialize highlightables from a string.\n\nNote that we're transforming all whitespace to spaces, so newlines are not preserved\nas me move to and from fragments. Spaces will be treated as static elements. Words will be interactive.\n\n","type":"String.String -> List.List (Nri.Ui.Highlightable.V3.Highlightable marker)"},{"name":"initInteractive","comment":" ","type":"List.List (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Basics.Int -> String.String -> Nri.Ui.Highlightable.V3.Highlightable marker"},{"name":"initStatic","comment":" ","type":"List.List (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Basics.Int -> String.String -> Nri.Ui.Highlightable.V3.Highlightable marker"},{"name":"joinAdjacentInteractiveHighlights","comment":" ","type":"Sort.Sorter m -> List.List (Nri.Ui.Highlightable.V3.Highlightable m) -> List.List (Nri.Ui.Highlightable.V3.Highlightable m)"},{"name":"set","comment":" ","type":"Maybe.Maybe (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Nri.Ui.Highlightable.V3.Highlightable marker -> Nri.Ui.Highlightable.V3.Highlightable marker"},{"name":"text","comment":" Fetch the text from a series of highlightables.\n","type":"List.List (Nri.Ui.Highlightable.V3.Highlightable marker) -> String.String"},{"name":"usedMarkers","comment":" Get unique markers that have been used. Note: ignores marks on whitespace.\n","type":"Sort.Sorter marker -> List.List (Nri.Ui.Highlightable.V3.Highlightable marker) -> Sort.Set.Set marker"}],"binops":[]},{"name":"Nri.Ui.Highlighter.V5","comment":" Changes from V4:\n\n  - adds `isHovering` to track whether the user is already hovering over a group,\n    so that we don't reapply hover styles when the user toggles a highlight.\n  - renames `Blur` to `MouseOut` to be more consistent with `MouseOver` and because it's\n    not really a blur event.\n\nHighlighter provides a view/model/update to display a view to highlight text and show marks.\n\n\n# Patch changes:\n\n  - Made all highlighter views lazy\n  - Optimized `selectShortest` for the normal case of 0 or 1 highlight.\n  - Added `FoldState`, `initFoldState`, `viewFoldHighlighter`, and `viewFoldStatic`\n\n\n# Types\n\n@docs Model, Msg, PointerMsg\n\n\n# Init/View/Update\n\n@docs init, update\n\n@docs view, static, staticWithTags\n@docs viewMarkdown, staticMarkdown, staticMarkdownWithTags\n@docs viewWithOverlappingHighlights\n\n\n# Foldable Views\n\nIf you want more control over the rendering of the highlightables, you can use these functions inside of a fold to\nrender the highlightables one by one. Use `initFoldState` to set up the initial state and then each call to `viewFoldHighlighter`\nor `viewFoldStatic` will render a single highlightable along with an update to the state.\n\n@docs FoldState, initFoldState, viewFoldHighlighter, viewFoldStatic\n\n\n## Intents\n\n@docs Intent, hasChanged, HasChanged\n\n\n## Setters\n\n@docs removeHighlights\n\n\n## Getters\n\n@docs clickedHighlightable, hoveredHighlightable\n@docs selectShortest\n\n","unions":[{"name":"FoldState","comment":" A type that contains information needed to render individual `Highlightable`s one at a time\n","args":["marker"],"cases":[]},{"name":"HasChanged","comment":" ","args":[],"cases":[["Changed",[]],["NotChanged",[]]]},{"name":"Intent","comment":" Possible intents or \"external effects\" that the Highlighter can request (see `perform`).\n","args":[],"cases":[["Intent",["{ listenTo : Nri.Ui.Highlighter.V5.ListenTo, changed : Nri.Ui.Highlighter.V5.HasChanged }"]]]},{"name":"Msg","comment":" ","args":["marker"],"cases":[["Pointer",["Nri.Ui.Highlighter.V5.PointerMsg"]],["Keyboard",["Nri.Ui.Highlighter.V5.KeyboardMsg"]],["Focused",["Result.Result Browser.Dom.Error ()"]]]},{"name":"PointerMsg","comment":" Messages used by highlighter when interacting with a mouse or finger.\n","args":[],"cases":[["Down",["Basics.Int"]],["Out",[]],["Over",["Basics.Int"]],["Move",["Maybe.Maybe String.String","Basics.Int"]],["Up",["Maybe.Maybe String.String"]],["Ignored",[]]]}],"aliases":[{"name":"Model","comment":" Model of a highlighter\n","args":["marker"],"type":"{ id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker), marker : Nri.Ui.HighlighterTool.V1.Tool marker, joinAdjacentInteractiveHighlights : Basics.Bool, sorter : Sort.Sorter marker, hintingIndices : Maybe.Maybe ( Basics.Int, Basics.Int ), mouseDownIndex : Maybe.Maybe Basics.Int, mouseOverIndex : Maybe.Maybe Basics.Int, isInitialized : Nri.Ui.Highlighter.V5.Initialized, hasChanged : Nri.Ui.Highlighter.V5.HasChanged, selectionStartIndex : Maybe.Maybe Basics.Int, selectionEndIndex : Maybe.Maybe Basics.Int, focusIndex : Maybe.Maybe Basics.Int, isHovering : Basics.Bool }"}],"values":[{"name":"clickedHighlightable","comment":" You are not likely to need this helper unless you're working with inline commenting.\n","type":"Nri.Ui.Highlighter.V5.Model marker -> Maybe.Maybe (Nri.Ui.Highlightable.V3.Highlightable marker)"},{"name":"hasChanged","comment":" Check if the highlighter has changed.\n","type":"Nri.Ui.Highlighter.V5.Intent -> Nri.Ui.Highlighter.V5.HasChanged"},{"name":"hoveredHighlightable","comment":" You are not likely to need this helper unless you're working with inline commenting.\n","type":"Nri.Ui.Highlighter.V5.Model marker -> Maybe.Maybe (Nri.Ui.Highlightable.V3.Highlightable marker)"},{"name":"init","comment":" Setup initial model\n\njoinAdjacentInteractiveHighlights - When true, and static highlightables are sandwiched by highlighted interactive highlightables of the same type, apply the highlight to the static highlightable as well.\n\n","type":"{ id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker), marker : Nri.Ui.HighlighterTool.V1.Tool marker, joinAdjacentInteractiveHighlights : Basics.Bool, sorter : Sort.Sorter marker } -> Nri.Ui.Highlighter.V5.Model marker"},{"name":"initFoldState","comment":" Computes all the mark styles necessary to perform a fold over the `Highlightable` elements\n","type":"Nri.Ui.Highlighter.V5.Model marker -> Nri.Ui.Highlighter.V5.FoldState marker"},{"name":"removeHighlights","comment":" ","type":"Nri.Ui.Highlighter.V5.Model marker -> Nri.Ui.Highlighter.V5.Model marker"},{"name":"selectShortest","comment":" Highlights can overlap. Sometimes, we want to apply a certain behavior (e.g., hover color change) on just the shortest\nhighlight. Use this function to find out which marker applies to the least amount of text.\n\nNote that this is shortest by text length, not shortest by number of highlightables.\n\nYou are not likely to need this helper unless you're working with inline commenting.\n\n","type":"({ model | highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker), sorter : Sort.Sorter marker } -> Maybe.Maybe (Nri.Ui.Highlightable.V3.Highlightable marker)) -> { model | highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker), sorter : Sort.Sorter marker } -> Maybe.Maybe marker"},{"name":"static","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"staticMarkdown","comment":" Same as `static`, but will render strings like \"_blah_\" inside of emphasis tags.\n\nWARNING: the version of markdown used here is extremely limited, as the highlighter content needs to be entirely in-line content. Lists & other block-level elements will _not_ render as they usually would!\n\nWARNING: markdown is rendered highlightable by highlightable, so be sure to provide highlightables like [\"_New York Times_\"][\"*New York Times*\"], NOT like [\"_New \", \"York \", \"Times_\"][\"*New \", \"York \", \"Times*\"]\n\n","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"staticMarkdownWithTags","comment":" Same as `staticWithTags`, but will render strings like \"_blah_\" inside of emphasis tags.\n\nWARNING: the version of markdown used here is extremely limited, as the highlighter content needs to be entirely in-line content. Lists & other block-level elements will _not_ render as they usually would!\n\nWARNING: markdown is rendered highlightable by highlightable, so be sure to provide highlightables like [\"_New York Times_\"][\"*New York Times*\"], NOT like [\"_New \", \"York \", \"Times_\"][\"*New \", \"York \", \"Times*\"]\n\n","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"staticWithTags","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V3.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"update","comment":" Update for highlighter returning additional info about whether there was a change\n","type":"Nri.Ui.Highlighter.V5.Msg marker -> Nri.Ui.Highlighter.V5.Model marker -> ( Nri.Ui.Highlighter.V5.Model marker, Platform.Cmd.Cmd (Nri.Ui.Highlighter.V5.Msg marker), Nri.Ui.Highlighter.V5.Intent )"},{"name":"view","comment":" ","type":"Nri.Ui.Highlighter.V5.Model marker -> Html.Styled.Html (Nri.Ui.Highlighter.V5.Msg marker)"},{"name":"viewFoldHighlighter","comment":" Render a single `Highlightable` while also returning an updated state.\n\nA list of extraStyles is also accepted if, for example, you want to apply bold / italic / underline formatting to the generated span.\n\n","type":"List.List Css.Style -> Nri.Ui.Highlighter.V5.FoldState marker -> ( Nri.Ui.Highlighter.V5.FoldState marker, List.List (Html.Styled.Html (Nri.Ui.Highlighter.V5.Msg marker)) )"},{"name":"viewFoldStatic","comment":" Render a single `Highlightable` that is NOT interactive while also returning an updated state.\n\nA list of extraStyles is also accepted if, for example, you want to apply bold / italic / underline formatting to the generated span.\n\n","type":"List.List Css.Style -> Nri.Ui.Highlighter.V5.FoldState marker -> ( Nri.Ui.Highlighter.V5.FoldState marker, List.List (Html.Styled.Html msg) )"},{"name":"viewMarkdown","comment":" Same as `view`, but will render strings like \"_blah_\" inside of emphasis tags.\n\nWARNING: the version of markdown used here is extremely limited, as the highlighter content needs to be entirely in-line content. Lists & other block-level elements will _not_ render as they usually would!\n\nWARNING: markdown is rendered highlightable by highlightable, so be sure to provide highlightables like [\"_New York Times_\"][\"*New York Times*\"], NOT like [\"_New \", \"York \", \"Times_\"][\"*New \", \"York \", \"Times*\"]\n\n","type":"Nri.Ui.Highlighter.V5.Model marker -> Html.Styled.Html (Nri.Ui.Highlighter.V5.Msg marker)"},{"name":"viewWithOverlappingHighlights","comment":" ","type":"Nri.Ui.Highlighter.V5.Model marker -> Html.Styled.Html (Nri.Ui.Highlighter.V5.Msg marker)"}],"binops":[]},{"name":"Nri.Ui.HighlighterTool.V1","comment":"\n\n\n### Patch changes\n\n  - change the high-contrast styles to be border-based instead of background-color based\n  - adds buildMarkerWithoutRounding for inline comment styling\n  - changes the 4px of side padding on the marker to 2px of padding+negative margin\n\n@docs Tool\n@docs EraserModel, buildEraser\n@docs MarkerModel, buildMarker, buildMarkerWithBorder, buildMarkerWithoutRounding\n\n","unions":[{"name":"Tool","comment":" Tool that can be used on a highlighter\n","args":["kind"],"cases":[["Marker",["Nri.Ui.HighlighterTool.V1.MarkerModel kind"]],["Eraser",["Nri.Ui.HighlighterTool.V1.EraserModel"]]]}],"aliases":[{"name":"EraserModel","comment":" EraserModel\n","args":[],"type":"{ hoverClass : List.List Css.Style, hintClass : List.List Css.Style, startGroupClass : List.List Css.Style, endGroupClass : List.List Css.Style }"},{"name":"MarkerModel","comment":" A marker is used to highlight highlightables.\nA user can define a `kind`, which contains the meaning of a selection.\nMarker is also used to define styling of a selection.\n","args":["kind"],"type":"{ hoverClass : List.List Css.Style, hintClass : List.List Css.Style, startGroupClass : List.List Css.Style, endGroupClass : List.List Css.Style, highlightClass : List.List Css.Style, hoverHighlightClass : List.List Css.Style, kind : kind, name : Maybe.Maybe String.String }"}],"values":[{"name":"buildEraser","comment":" The default eraser.\n","type":"Nri.Ui.HighlighterTool.V1.EraserModel"},{"name":"buildMarker","comment":" ","type":"{ highlightColor : Css.Color, hoverColor : Css.Color, hoverHighlightColor : Css.Color, kind : kind, name : Maybe.Maybe String.String } -> Nri.Ui.HighlighterTool.V1.MarkerModel kind"},{"name":"buildMarkerWithBorder","comment":" Typically, this marker is only used for static highlighters.\n","type":"{ highlightColor : Css.Color, kind : kind, name : Maybe.Maybe String.String } -> Nri.Ui.HighlighterTool.V1.MarkerModel kind"},{"name":"buildMarkerWithoutRounding","comment":" Typically, this style of marker is used for inline comments.\n","type":"{ highlightColor : Css.Color, hoverColor : Css.Color, hoverHighlightColor : Css.Color, kind : kind, name : Maybe.Maybe String.String } -> Nri.Ui.HighlighterTool.V1.MarkerModel kind"}],"binops":[]},{"name":"Nri.Ui.HighlighterToolbar.V3","comment":" Bar with markers for choosing how text will be highlighted in a highlighter.\n\n@docs view\n\n\n### Changes from V2:\n\n  - Use radio inputs under the hood\n  - don't arbitrarily complicate API -- match the usecases on the monolith side\n\n\n### Patch changes:\n\n  - Ensure selected tool is clear in high contrast mode\n  - Remove focus rings from the tools on click\n  - Use safeId to generate valid HTML ids\n\n\n### Changes from V1:\n\n  - replaces `onChangeTag` and `onSetEraser` with `onSelect`.\n  - adds `highlighterId` to config\n  - adds keyboard navigation\n\n","unions":[],"aliases":[],"values":[{"name":"view","comment":" View renders each marker and an eraser. This is exclusively used with an interactive Highlighter, whose id you should pass in when initializing the HighlighterToolbar.\n","type":"{ onSelect : Maybe.Maybe tag -> msg, getNameAndColor : tag -> { extras | name : String.String, colorSolid : Css.Color, colorLight : Css.Color }, highlighterId : String.String } -> { model | currentTool : Maybe.Maybe tag, tags : List.List tag } -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Html.Attributes.V2","comment":"\n\n\n# Patch changes:\n\n    - adds `nriDescription` and `testId` helpers\n    - adds `maybe` helper\n\nExtras for working with Html.Attributes.\n\nThis is the new version of Nri.Ui.Html.Attributes.Extra.\n\n@docs none, includeIf, maybe\n@docs targetBlank\n@docs nriDescription, nriDescriptionSelector\n@docs testId\n@docs safeIdWithPrefix, safeId\n\n","unions":[],"aliases":[],"values":[{"name":"includeIf","comment":" conditionally include an attribute. Useful for CSS classes generated with\n`UniqueClass`!\n","type":"Basics.Bool -> Html.Styled.Attribute msg -> Html.Styled.Attribute msg"},{"name":"maybe","comment":" Transform a maybe value to an attribute or attach `none`\n","type":"(v -> Html.Styled.Attribute msg) -> Maybe.Maybe v -> Html.Styled.Attribute msg"},{"name":"none","comment":" Represents an attribute with no semantic meaning, useful for conditionals.\n\nThis is implemented such that whenever Html.Attributes.Extra.none is encountered\nby VirtualDom it will set a meaningless property on the element object itself to\nnull:\n\n    domNode['Html.Attributes.Extra.none'] = null\n\nIt's totally safe and lets us clean up conditional and maybe attributes\n\n","type":"Html.Styled.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Html.Styled.Attribute msg"},{"name":"nriDescriptionSelector","comment":"\n\n    Note: this does not handle html escaping the description before building the query\n\n","type":"String.String -> List.List Css.Style -> Css.Global.Snippet"},{"name":"safeId","comment":" Creates a lowercased string that is safe to use for HTML IDs.\nRemoves all groups of unsafe characters and replaces each group with a dash.\nprepends \"id-\" to the result to ensure that the ID starts with a letter. (necessary for CSS selectors including getElementById)\nSee code pen for examples: <https://codepen.io/ap-nri/pen/OJENQLY>\n","type":"String.String -> String.String"},{"name":"safeIdWithPrefix","comment":" Prepends a prefix to the result of safeId.\n","type":"String.String -> String.String -> String.String"},{"name":"targetBlank","comment":" Use this list of attributes instead of applying `Attributes.target \"_blank\"`\ndirectly. This prevents an exploits like \"tabnabbing\", among other things.\n\nSee these resources:\n\n  - <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Security_and_privacy_concerns>\n  - <https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever>\n\n","type":"List.List (Html.Styled.Attribute msg)"},{"name":"testId","comment":" See Cypress best practices: <https://docs.cypress.io/guides/references/best-practices.html#Selecting-Elements>\n","type":"String.String -> Html.Styled.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Html.V3","comment":"\n\n@docs viewJust, viewIf\n@docs onKeyUp, defaultOptions\n\n","unions":[],"aliases":[],"values":[{"name":"defaultOptions","comment":" ","type":"{ preventDefault : Basics.Bool, stopPropagation : Basics.Bool }"},{"name":"onKeyUp","comment":" Convert a keycode into a message on keyup\n","type":"{ preventDefault : Basics.Bool, stopPropagation : Basics.Bool } -> (Basics.Int -> Maybe.Maybe a) -> Html.Styled.Attribute a"},{"name":"viewIf","comment":" ","type":"(() -> Html.Styled.Html msg) -> Basics.Bool -> Html.Styled.Html msg"},{"name":"viewJust","comment":" View value of if `Maybe` is a `Just`, otherwise show nothing.\n","type":"(a -> Html.Styled.Html msg) -> Maybe.Maybe a -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.InputStyles.V4","comment":"\n\n\n### Changes from V3\n\n    - Remove ContentCreation theme\n\n\n### Patch changes\n\n  - expose defaultMarginTop\n\n\n### Changes from V2\n\n  - adds UserGenerated\n\nInputStyles used by the TextInput and TextArea widgets.\n\n@docs label, Theme, input\n\n\n## Shared hardcoded values\n\n@docs inputPaddingVertical, inputLineHeight, textAreaHeight, writingLineHeight, writingPadding, writingPaddingTop, writingMinHeight, defaultMarginTop\n@docs focusedInputBoxShadow, focusedErrorInputBoxShadow, errorClass, inputClass\n\n","unions":[{"name":"Theme","comment":" ","args":[],"cases":[["Standard",[]],["UserGenerated",[]],["Writing",[]]]}],"aliases":[],"values":[{"name":"defaultMarginTop","comment":" ","type":"Basics.Float"},{"name":"errorClass","comment":" ","type":"String.String"},{"name":"focusedErrorInputBoxShadow","comment":" ","type":"String.String"},{"name":"focusedInputBoxShadow","comment":" ","type":"String.String"},{"name":"input","comment":" In order to use these styles in an input module, you will need to add the class \"override-sass-styles\". This is because sass styles in the monolith have higher precendence than the class styles here.\n","type":"Nri.Ui.InputStyles.V4.Theme -> Css.Style"},{"name":"inputClass","comment":" ","type":"String.String"},{"name":"inputLineHeight","comment":" ","type":"Css.Px"},{"name":"inputPaddingVertical","comment":" ","type":"Css.Px"},{"name":"label","comment":" ","type":"Nri.Ui.InputStyles.V4.Theme -> Basics.Bool -> Css.Style"},{"name":"textAreaHeight","comment":" ","type":"Css.Px"},{"name":"writingLineHeight","comment":" ","type":"Css.Px"},{"name":"writingMinHeight","comment":" ","type":"Css.Px"},{"name":"writingPadding","comment":" ","type":"Css.Px"},{"name":"writingPaddingTop","comment":" ","type":"Css.Px"}],"binops":[]},{"name":"Nri.Ui.Loading.V1","comment":" Loading behaviors\n\n@docs fadeInPage, page\n@docs spinning\n@docs spinningPencil, spinningDots\n\n","unions":[],"aliases":[],"values":[{"name":"fadeInPage","comment":" View a full-screen loading page that fades into view.\n","type":"Html.Styled.Html msg"},{"name":"page","comment":" View a full-screen loading page.\n","type":"Html.Styled.Html msg"},{"name":"spinning","comment":" ","type":"Css.Px -> Css.Color -> Html.Styled.Html msg"},{"name":"spinningDots","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"spinningPencil","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.Logo.V1","comment":"\n\n@docs noredink, noredinkMonochrome\n@docs cleverSecureSync, clever, cleverBlue, cleverC, cleverCWhite, cleverLibrary, cleverWhite\n@docs google, googleClassroom, googleClassroomFull, googleG, googleGWhite\n@docs classLink, classLinkWhite, classLinkFull\n@docs canvas\n@docs canvasCircle\n@docs schoology\n@docs schoologyCircle\n@docs facebook, twitter\n@docs oneRoster, oneRosterFull\n@docs infiniteCampusFull, infiniteCampus\n\n","unions":[],"aliases":[],"values":[{"name":"canvas","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"canvasCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"classLink","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"classLinkFull","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"classLinkWhite","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"clever","comment":" DEPRECATED: Use cleverBlue or cleverWhite instead.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"cleverBlue","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"cleverC","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"cleverCWhite","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"cleverLibrary","comment":" DEPRECATED: Please use cleverWhite instead.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"cleverSecureSync","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"cleverWhite","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"facebook","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"google","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"googleClassroom","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"googleClassroomFull","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"googleG","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"googleGWhite","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"infiniteCampus","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"infiniteCampusFull","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"noredink","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"noredinkMonochrome","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"oneRoster","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"oneRosterFull","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"schoology","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"schoologyCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"twitter","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.Mark.V2","comment":"\n\n\n### Patch changes\n\n  - change how the start styles are attached when there is not an explicit tag to show in order to reduce how often the starting highlight ends up isolated on its own line\n  - add viewWithOverlaps\n  - ensure that view and viewWithInlineTags never leave the starting styles isolated on their own line\n  - markdown is now supported for the mark name\n  - adds animations to viewWithBalloonTags\n\n@docs Mark\n@docs view, viewWithInlineTags, viewWithBalloonTags\n@docs viewWithOverlaps\n\n","unions":[],"aliases":[{"name":"Mark","comment":" ","args":[],"type":"{ name : Maybe.Maybe String.String, startStyles : List.List Css.Style, styles : List.List Css.Style, endStyles : List.List Css.Style }"}],"values":[{"name":"view","comment":" When elements are marked, wrap them in a single `mark` html node.\n","type":"(content -> List.List Css.Style -> Html.Styled.Html msg) -> List.List ( content, Maybe.Maybe Nri.Ui.Mark.V2.Mark ) -> List.List (Html.Styled.Html msg)"},{"name":"viewWithBalloonTags","comment":" When elements are marked, wrap them in a single `mark` html node.\n\nShow the label for the mark, if present, in a balloon centered above the emphasized content.\n\n","type":"{ renderSegment : c -> List.List Css.Style -> Html.Styled.Html msg, backgroundColor : Css.Color, maybeMarker : Maybe.Maybe Nri.Ui.Mark.V2.Mark, labelPosition : Maybe.Maybe Nri.Ui.Mark.V2.LabelPosition, labelId : Maybe.Maybe String.String, labelContentId : Maybe.Maybe String.String } -> List.List c -> List.List (Html.Styled.Html msg)"},{"name":"viewWithInlineTags","comment":" When elements are marked, wrap them in a single `mark` html node.\n\nShow the label for the mark, if present, in-line with the emphasized content.\n\n","type":"(content -> List.List Css.Style -> Html.Styled.Html msg) -> List.List ( content, Maybe.Maybe Nri.Ui.Mark.V2.Mark ) -> List.List (Html.Styled.Html msg)"},{"name":"viewWithOverlaps","comment":" When elements are marked, add ::before and ::after elements indicating the start and end of the highlight.\n\n(We can't use a `mark` HTML element here because of the tree structure of HTML)\n\n","type":"(content -> List.List Css.Style -> Html.Styled.Html msg) -> List.List ( content, List.List Nri.Ui.Mark.V2.Mark ) -> List.List (Html.Styled.Html msg)"}],"binops":[]},{"name":"Nri.Ui.Mark.V6","comment":"\n\n\n### Changes from V5\n\n    -  Add `skipTagAnimation` for skipping balloon animations\n\n\n### Patch changes\n\n    - Factor `overlappingStyles` out of `viewWithOverlaps` to allow consumers finer grained control of rendering mark elements.\n\n@docs Mark\n@docs view, viewWithInlineTags, viewWithBalloonTags\n@docs viewWithOverlaps, overlappingStyles\n\n","unions":[],"aliases":[{"name":"Mark","comment":" ","args":[],"type":"{ name : Maybe.Maybe String.String, startStyles : List.List Css.Style, styles : List.List Css.Style, endStyles : List.List Css.Style }"}],"values":[{"name":"overlappingStyles","comment":" Compute the styles required to mark the segments.\n\nYou can use this if you require more control over the structure of how marked elements are laid out than `viewWithOverlaps` provides.\n\nThe `Maybe (Html msg)` result is a label element that should be rendered before the current segment.\n\n","type":"List.List ( content, List.List Nri.Ui.Mark.V6.Mark ) -> List.List ( content, Maybe.Maybe (Html.Styled.Html msg), List.List Css.Style )"},{"name":"view","comment":" When elements are marked, wrap them in a single `mark` html node.\n","type":"(content -> List.List Css.Style -> Html.Styled.Html msg) -> List.List ( content, Maybe.Maybe Nri.Ui.Mark.V6.Mark ) -> List.List (Html.Styled.Html msg)"},{"name":"viewWithBalloonTags","comment":" When elements are marked, wrap them in a single `mark` html node.\n\nShow the label for the mark, if present, in a balloon centered above the emphasized content.\n\n","type":"{ renderSegment : c -> List.List Css.Style -> Html.Styled.Html msg, backgroundColor : Css.Color, maybeMarker : Maybe.Maybe Nri.Ui.Mark.V6.Mark, labelPosition : Maybe.Maybe Nri.Ui.Mark.V6.LabelPosition, labelCss : List.List Css.Style, labelId : Maybe.Maybe String.String, labelContentId : Maybe.Maybe String.String, skipTagAnimation : Basics.Bool } -> List.List c -> List.List (Html.Styled.Html msg)"},{"name":"viewWithInlineTags","comment":" When elements are marked, wrap them in a single `mark` html node.\n\nShow the label for the mark, if present, in-line with the emphasized content.\n\n","type":"(content -> List.List Css.Style -> Html.Styled.Html msg) -> List.List ( content, Maybe.Maybe Nri.Ui.Mark.V6.Mark ) -> List.List (Html.Styled.Html msg)"},{"name":"viewWithOverlaps","comment":" When elements are marked, add ::before and ::after elements indicating the start and end of the highlight.\n\n(We can't use a `mark` HTML element here because of the tree structure of HTML)\n\n","type":"(content -> List.List Css.Style -> Html.Styled.Html msg) -> List.List ( content, List.List Nri.Ui.Mark.V6.Mark ) -> List.List (Html.Styled.Html msg)"}],"binops":[]},{"name":"Nri.Ui.MasteryIcon.V1","comment":"\n\n@docs levelZero, levelOne, levelTwo, levelThree, levelFour\n\n","unions":[],"aliases":[],"values":[{"name":"levelFour","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"levelOne","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"levelThree","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"levelTwo","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"levelZero","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.MediaQuery.V1","comment":" Major version changes:\n\n  - remove narrowMobileBreakPoint\n\nPatch changes:\n\n  - remove min-width:1 from media queries in order to support better composibility\n  - adds narrowMobileBreakpoint and deprecates narrowMobileBreakPoint\n  - adds withViewport for convenience when matching specific viewport size ranges\n  - fix `not` queries to not overlap with the regular breakpoint queries\n\nStandard media queries for responsive pages.\n\n    import Css\n    import Css.Media as Media\n    import Nri.Ui.MediaQuery.V1 as MediaQuery\n\n    style : Css.Style\n    style =\n        Media.withMedia\n            [ MediaQuery.mobile ]\n            [ Css.padding (Css.px 2)\n            ]\n\n@docs anyMotion, prefersReducedMotion\n@docs highContrastMode, notHighContrastMode\n\n@docs withViewport\n\n\n### 1000px breakpoint\n\n@docs mobile, notMobile\n@docs mobileBreakpoint\n\n\n### 750px breakpoint\n\n@docs quizEngineMobile, notQuizEngineMobile\n@docs quizEngineBreakpoint\n\n\n### 500px breakpoint\n\n@docs narrowMobile, notNarrowMobile\n@docs narrowMobileBreakpoint\n\n","unions":[],"aliases":[],"values":[{"name":"anyMotion","comment":" ","type":"List.List Css.Style -> Css.Style"},{"name":"highContrastMode","comment":" ","type":"List.List Css.Style -> Css.Style"},{"name":"mobile","comment":" Styles using the `mobileBreakpoint` value as the maxWidth.\n","type":"Css.Media.MediaQuery"},{"name":"mobileBreakpoint","comment":" 1000px\n","type":"Css.Px"},{"name":"narrowMobile","comment":" Styles using the `narrowMobileBreakpoint` value as the maxWidth\n","type":"Css.Media.MediaQuery"},{"name":"narrowMobileBreakpoint","comment":" 500px\n","type":"Css.Px"},{"name":"notHighContrastMode","comment":" ","type":"List.List Css.Style -> Css.Style"},{"name":"notMobile","comment":" Styles using the `mobileBreakpoint` value as the minWidth.\n","type":"Css.Media.MediaQuery"},{"name":"notNarrowMobile","comment":" Styles using the `quizEngineBreakpoint` value as the minWidth.\n","type":"Css.Media.MediaQuery"},{"name":"notQuizEngineMobile","comment":" Styles using the `quizEngineBreakpoint` value as the minWidth.\n","type":"Css.Media.MediaQuery"},{"name":"prefersReducedMotion","comment":" ","type":"List.List Css.Style -> Css.Style"},{"name":"quizEngineBreakpoint","comment":" 750px\n","type":"Css.Px"},{"name":"quizEngineMobile","comment":" Styles using the `quizEngineBreakpoint` value as the maxWidth.\n","type":"Css.Media.MediaQuery"},{"name":"withViewport","comment":"\n\n    MediaQuery.withViewport\n        MediaQuery.narrowMobileBreakpoint\n        MediaQuery.quizEngineBreakpoint\n        [ Css.flexDirection Css.column\n        ]\n\n","type":"Maybe.Maybe Css.Px -> Maybe.Maybe Css.Px -> List.List Css.Style -> Css.Style"}],"binops":[]},{"name":"Nri.Ui.Menu.V4","comment":" Patch changes:\n\n  - improve interoperability with Tooltip (Note that tooltip keyboard events are not fully supported!)\n  - Use Nri.Ui.WhenFocusLeaves.V2\n  - Adjust disabled styles\n  - when the Menu is a dialog or disclosure, _don't_ add role menuitem to the entries\n  - Use ClickableText.medium as the default size when the trigger is `Menu.clickableText`\n  - Adds containerCss, menuCss, groupContainerCss, and entryContainerCss to customize the style of the respective containers\n  - Adds captionedGroup to create a group with a caption\n  - Adds groupTitleCss and groupCaptionCss to customize the style of the group title and caption\n\nChanges from V3:\n\n  - improve composability with Button, ClickableText, and ClickableSvg\n\nA togglable menu view and related buttons.\n\n<https://zpl.io/a75OrE2>\n\n\n## Menu rendering\n\n@docs view, Attribute\n\n\n## Menu state\n\n@docs isOpen, isDisabled\n@docs opensOnHover\n\n\n## Triggering button options\n\n@docs defaultTrigger, button, clickableText, clickableSvg, clickableSvgWithoutIndicator\n@docs withTooltip\n@docs buttonId\n\n\n## Menu attributes\n\n@docs navMenuList, disclosure, dialog\n@docs menuWidth, menuId, menuZIndex\n@docs alignLeft, alignRight\n@docs containerCss, menuCss, groupContainerCss, entryContainerCss, groupTitleCss, groupCaptionCss\n\n\n## Menu content\n\n@docs Entry, group, captionedGroup, entry\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]},{"name":"Entry","comment":" Represents zero or more entries within the menu content\n","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"alignLeft","comment":" Align the menu popover on the left side of the triggering button.\n","type":"Nri.Ui.Menu.V4.Attribute msg"},{"name":"alignRight","comment":" Align the menu popover on the right side of the triggering button.\n\nRight (this property) is the default behavior.\n\n","type":"Nri.Ui.Menu.V4.Attribute msg"},{"name":"button","comment":" Use Button as the triggering element for the Menu.\n","type":"String.String -> List.List (Nri.Ui.Button.V10.Attribute msg) -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"buttonId","comment":" A unique string identifier for the button that opens/closes the menu\n","type":"String.String -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"captionedGroup","comment":" Represents a group of entries with a named legend and text caption.\n","type":"String.String -> String.String -> List.List (Nri.Ui.Menu.V4.Entry msg) -> Nri.Ui.Menu.V4.Entry msg"},{"name":"clickableSvg","comment":" Use ClickableSvg as the triggering element for the Menu.\n","type":"String.String -> Nri.Ui.Svg.V1.Svg -> List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"clickableSvgWithoutIndicator","comment":" Use ClickableSvg as the triggering element for the Menu without a dropdown indicator\n","type":"String.String -> Nri.Ui.Svg.V1.Svg -> List.List (Nri.Ui.ClickableSvg.V2.Attribute msg) -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"clickableText","comment":" Use ClickableText as the triggering element for the Menu.\n","type":"String.String -> List.List (Nri.Ui.ClickableText.V4.Attribute msg) -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"containerCss","comment":" Adds CSS to the element containing the menu.\n","type":"List.List Css.Style -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"defaultTrigger","comment":" Use Button with default styles as the triggering element for the Menu.\n","type":"String.String -> List.List (Nri.Ui.Button.V10.Attribute msg) -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"dialog","comment":" Makes the menu behave as a dialog.\n\nFor more information, please read [Dialog pattern](https://w3c.github.io/aria-practices/examples/dialog-modal/dialog.html/).\n\nYou will need to pass in the first and last focusable element in the dialog content in order for:\n\n  - any focusable elements in the dialog content to be keyboard accessible\n  - the tab to wrap around appropriately when the user tabs past all of the dialog content\n\n","type":"{ firstId : String.String, lastId : String.String } -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"disclosure","comment":" Makes the menu behave as a disclosure.\n\nFor more information, please read [Disclosure (Show/Hide) pattern](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/).\n\nYou will need to pass in the last focusable element in the disclosed content in order for:\n\n  - any focusable elements in the disclosed content to be keyboard accessible\n  - the disclosure to close appropriately when the user tabs past all of the disclosed content\n\n","type":"{ lastId : String.String } -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"entry","comment":" Represents a single **focusable** entry.\n\nPass in the id you'd like for your menu item, which will be used to manage the focus.\n\n    Menu.entry \"my-button-id\"\n        (\\attributes -> Button.button \"One great button\" [ Button.custom attributes ])\n\n","type":"String.String -> (List.List (Html.Styled.Attribute msg) -> Html.Styled.Html msg) -> Nri.Ui.Menu.V4.Entry msg"},{"name":"entryContainerCss","comment":" Adds CSS to the element containing the entry. This will style items created via Menu.entry\n","type":"List.List Css.Style -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"group","comment":" Represents a group of entries with a named legend.\n","type":"String.String -> List.List (Nri.Ui.Menu.V4.Entry msg) -> Nri.Ui.Menu.V4.Entry msg"},{"name":"groupCaptionCss","comment":" Adds CSS to the element containing the group caption. This will style the caption of items created via Menu.captionedGroup\n","type":"List.List Css.Style -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"groupContainerCss","comment":" Adds CSS to the element containing the group. This will style items created via Menu.group\n","type":"List.List Css.Style -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"groupTitleCss","comment":" Adds CSS to the element containing the group title. This will style the title of items created via Menu.group\n","type":"List.List Css.Style -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"isDisabled","comment":" Whether the menu can be opened\n","type":"Basics.Bool -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"isOpen","comment":" Whether the menu is open\n","type":"Basics.Bool -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"menuCss","comment":" Adds CSS to the content of the menu. This will style the menu itself.\n","type":"List.List Css.Style -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"menuId","comment":" A unique string identifier for the menu\n","type":"String.String -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"menuWidth","comment":" Fix the width of the popover |\n","type":"Basics.Int -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"menuZIndex","comment":" The CSS `z-index` used to render the menu. Defaults to `1`.\n","type":"Basics.Int -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"navMenuList","comment":" Makes the menu follow the [Navigation Menu pattern](https://www.w3.org/WAI/ARIA/apg/example-index/menu-button/menu-button-links.html).\n","type":"Nri.Ui.Menu.V4.Attribute msg"},{"name":"opensOnHover","comment":" Whether the menu will be opened/closed by mouseEnter and mouseLeave interaction. Defaults to `False`.\n","type":"Basics.Bool -> Nri.Ui.Menu.V4.Attribute msg"},{"name":"view","comment":" Menu/pulldown configuration:\n\n  - `focusAndToggle`: the message produced to control the open/closed state and DOM focus\n  - `attributes`: List of (attributes)[#menu-attributes] to apply to the menu.\n  - `entries`: the entries of the menu\n\n","type":"({ isOpen : Basics.Bool, focus : Maybe.Maybe String.String } -> msg) -> List.List (Nri.Ui.Menu.V4.Attribute msg) -> List.List (Nri.Ui.Menu.V4.Entry msg) -> Html.Styled.Html msg"},{"name":"withTooltip","comment":" Warning: Tooltip keyboard events are not fully supported!\n","type":"List.List (Nri.Ui.Tooltip.V3.Attribute msg) -> Nri.Ui.Menu.V4.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Message.V4","comment":" Changes from V3:\n\n  - adds `statusRole`\n  - removes `alertDialogRole`\n  - moves custom attributes and role to a div containing the icon and text\n  - makes this div programmatically focusable\n\nPatch changes:\n\n  - adds `notMobileCss`, `mobileCss`, `quizEngineMobileCss`\n  - adds `hideIconForMobile` and `hideIconFor`\n  - use `Shadows`\n  - use internal `Content` module\n  - make the tiny Message's icon size smaller\n\nChanges from V2:\n\n    - adds helpers: `custom`,`css`,`icon`,`testId`,`id`\n\n\n# View\n\n@docs somethingWentWrong\n@docs view, Attribute\n@docs icon, custom, testId, id\n\n\n# CSS\n\n@docs hideIconForMobile, hideIconFor\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss\n\n\n## Size\n\n@docs tiny, large, banner\n\n\n## Content\n\n@docs paragraph, plaintext, markdown, html, httpError, codeDetails\n\n\n## Theme\n\n@docs tip, error, alert, success, customTheme\n\n\n## Role\n\n@docs alertRole, statusRole\n\n\n## Actions\n\n@docs onDismiss\n\n","unions":[{"name":"Attribute","comment":" Construct an `Attribute` using a helper like `onDismiss` or `alert`.\n","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"alert","comment":" ","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"alertRole","comment":" Use this attribute when a user's immediate attention on the Message is required.\n\nFor example, use this attribute when:\n\n>   - An invalid value was entered into a form field\n>   - The user's login session is about to expire\n>   - The connection to the server was lost, local changes will not be saved\n\n-- Excerpted from [Using the alert role MDN docs](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_alert_role)\n\n","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"banner","comment":" Shows a banner alert message. This is even more prominent than `Message.large`.\nWe commonly use these for flash messages at the top of pages.\n\n    Message.view [ Message.banner ]\n\n","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"codeDetails","comment":" Details for Engineers\n\nWill be rendered in a closed details box\n\n","type":"String.String -> Nri.Ui.Message.V4.Attribute msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Message.V4.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Message.V4.Attribute msg"},{"name":"customTheme","comment":" ","type":"{ color : Css.Color, backgroundColor : Css.Color } -> Nri.Ui.Message.V4.Attribute msg"},{"name":"error","comment":" ","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"hideIconFor","comment":" ","type":"Css.Media.MediaQuery -> Nri.Ui.Message.V4.Attribute msg"},{"name":"hideIconForMobile","comment":" ","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"html","comment":" Provide a list of custom HTML.\n","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Message.V4.Attribute msg"},{"name":"httpError","comment":" Provide an HTTP error, which will be translated to user-friendly text.\n","type":"Http.Error -> Nri.Ui.Message.V4.Attribute msg"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.Message.V4.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Message.V4.Attribute msg"},{"name":"large","comment":" Shows a large alert or callout message. We commonly use these for highlighted tips, instructions, or asides in page copy.\n\n    Message.view [ Message.large ]\n\n","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"markdown","comment":" Provide a string that will be rendered as markdown.\n","type":"String.String -> Nri.Ui.Message.V4.Attribute msg"},{"name":"mobileCss","comment":" Equivalent to:\n\n    Message.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Message.V4.Attribute msg"},{"name":"notMobileCss","comment":" Equivalent to:\n\n    Message.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Message.V4.Attribute msg"},{"name":"onDismiss","comment":" Adds a dismiss (\"X\" icon) to a message which will produce the given `msg` when clicked.\n","type":"msg -> Nri.Ui.Message.V4.Attribute msg"},{"name":"paragraph","comment":" Provide a plain-text string that will be put into a paragraph tag, with the default margin removed.\n","type":"String.String -> Nri.Ui.Message.V4.Attribute msg"},{"name":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> Nri.Ui.Message.V4.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Equivalent to:\n\n    Message.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Message.V4.Attribute msg"},{"name":"somethingWentWrong","comment":" Shows an appropriate error message for when something unhandled happened.\n\n    view maybeDetailedErrorMessage =\n        viewMaybe Message.somethingWentWrong maybeDetailedErrorMessage\n\n","type":"String.String -> Accessibility.Styled.Html msg"},{"name":"statusRole","comment":" Use this attribute when a user's immediate attention on the Message is NOT required.\n\nThis means that a `status` Message has a lower priority than an `alert` Message.\n\n","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"success","comment":" ","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Message.V4.Attribute msg"},{"name":"tiny","comment":" Shows a tiny alert message. We commonly use these for validation errors and small hints to users.\n\n    Message.view [ Message.tiny ]\n\nThis is the default size for a Message.\n\n","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"tip","comment":" This is the default theme for a Message.\n","type":"Nri.Ui.Message.V4.Attribute msg"},{"name":"view","comment":"\n\n    view =\n        Message.view\n            [ Message.tip\n            , Message.markdown \"Don't tip too much, or your waitress will **fall over**!\"\n            ]\n\n","type":"List.List (Nri.Ui.Message.V4.Attribute msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Modal.V12","comment":" Patch changes:\n\n  - adjust the padding of the heading when the close X is present for viewports less than 1000px wide\n\nChanges from V11:\n\n  - remove use of FocusTrap type alias\n  - return ids to focus on instead of cmds (in order to make modals more testable via the effect pattern with program-test)\n  - use tesk9/accessible-html-with-css for SR-only content\n  - simplify internal attributes pattern\n  - adds Modal.atac to make a hole for the ATAC to render inside the modal\n\n```\nimport Browser exposing (element)\nimport Browser.Dom as Dom\nimport Css exposing (padding, px)\nimport Html.Styled exposing (..)\nimport Html.Styled.Attributes exposing (id)\nimport Html.Styled.Events as Events\nimport Nri.Ui.Modal.V12 as Modal\nimport Task\n\nmain : Program () Modal.Model Msg\nmain =\n    Browser.element\n        { init = \\_ -> init\n        , view = toUnstyled << view\n        , update = update\n        , subscriptions = \\model -> Sub.map ModalMsg (Modal.subscriptions model)\n        }\n\ninit : ( Modal.Model, Cmd Msg )\ninit =\n    -- When we load the page with a modal already open, we should return\n    -- the focus someplace sensible when the modal closes.\n    -- [This article](https://developer.paciellogroup.com/blog/2018/06/the-current-state-of-modal-dialog-accessibility/) recommends\n    -- focusing the main or body.\n    Modal.open { returnFocusTo = \"maincontent\", startFocusOn = Modal.closeButtonId }\n        |> Tuple.mapSecond (Task.attempt Focused << Dom.focus)\n\ntype Msg\n    = OpenModal String\n    | ModalMsg Modal.Msg\n    | CloseModal\n    | Focus String\n    | Focused (Result Dom.Error ())\n\nupdate : Msg -> Modal.Model -> ( Modal.Model, Cmd Msg )\nupdate msg model =\n    case msg of\n        OpenModal returnFocusTo ->\n            Modal.open\n                { returnFocusTo = returnFocusTo\n                , startFocusOn = Modal.closeButtonId\n                }\n                |> Tuple.mapSecond (Task.attempt Focused << Dom.focus)\n\n        ModalMsg modalMsg ->\n            let\n                ( newModel, maybeFocus ) =\n                    Modal.update\n                        { dismissOnEscAndOverlayClick = True }\n                        modalMsg\n                        model\n            in\n            ( newModel\n            , Maybe.map (Task.attempt Focused << Dom.focus) maybeFocus\n                |> Maybe.withDefault Cmd.none\n            )\n\n        CloseModal ->\n            let\n                ( newModel, maybeFocus ) =\n                    Modal.close model\n            in\n            ( newModel\n            , Maybe.map (Task.attempt Focused << Dom.focus) maybeFocus\n                |> Maybe.withDefault Cmd.none\n            )\n\n        Focus id ->\n            ( model, Task.attempt Focused (Dom.focus id) )\n\n        Focused _ ->\n            ( model, Cmd.none )\n\nview : Modal.Model -> Html Msg\nview model =\n    main_ [ id \"maincontent\" ]\n        [ button\n            [ id \"open-modal\"\n            , Events.onClick (OpenModal \"open-modal\")\n            ]\n            [ text \"Open Modal\" ]\n        , Modal.view\n            { title = \"First kind of modal\"\n            , wrapMsg = ModalMsg\n            , content = [ text \"Modal Content\" ]\n            , footer =\n                [ button\n                    [ Events.onClick CloseModal\n                    , id \"last-element-id\"\n                    ]\n                    [ text \"Close\" ]\n                ]\n            , focus = Focus\n            , firstId = Modal.closeButtonId\n            , lastId = \"last-element-id\"\n            }\n            [ Modal.hideTitle\n            , Modal.css [ padding (px 10) ]\n            , Modal.custom [ id \"first-modal\" ]\n            , Modal.closeButton\n            ]\n            model\n        ]\n```\n\nIf you're an NRI employee working in the monorepo, you should use `Nri.Effect.focus` instead of `Dom.focus`. `Test.Nri.Effect` exposes `ensureFocused`, which helps you test whether the correct effect has been produced and whether the id you attempted to focus on actually exists in the DOM.\n\n@docs view\n@docs Model, init, open, close\n@docs Msg, update, subscriptions\n\n\n### Attributes\n\n@docs Attribute\n@docs info, warning\n@docs closeButton\n@docs showTitle, hideTitle\n@docs testId, css, custom\n@docs atac\n\n\n### Id accessors\n\n@docs closeButtonId, titleId\n\n\n### State check\n\n@docs isOpen\n\n","unions":[{"name":"Attribute","comment":" ","args":[],"cases":[]},{"name":"Model","comment":" ","args":[],"cases":[]},{"name":"Msg","comment":" ","args":[],"cases":[]}],"aliases":[],"values":[{"name":"atac","comment":" Pass the [Assistive Technology Announcement Center and Announcement Log](\"https://paper.dropbox.com/doc/Assistive-Technology-Announcement-Center-ATAC--B_GuqwWltzU432ueq7p6Z42mAg-bOnmcnzOj631NRls1IBe3\").\n\nHTML passed here will render after the footer.\n\n","type":"Accessibility.Styled.Html Basics.Never -> Nri.Ui.Modal.V12.Attribute"},{"name":"close","comment":" The second part of the tuple is the id of the element to which focus should be returned.\n\n_You will need to explicitly move focus to this element!_\n\nIf you're an NRI employee working in the monorepo, pass the second part of the tuple to `Nri.Effect.maybeFocus`.\n\n","type":"Nri.Ui.Modal.V12.Model -> ( Nri.Ui.Modal.V12.Model, Maybe.Maybe String.String )"},{"name":"closeButton","comment":" Include the close button.\n","type":"Nri.Ui.Modal.V12.Attribute"},{"name":"closeButtonId","comment":" ","type":"String.String"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Modal.V12.Attribute"},{"name":"custom","comment":" Do NOT use this function for attaching styles -- use the `css` helper instead.\n\n    import Html.Styled.Attribute exposing (id)\n\n    Modal.view\n        { title = \"Some Great Modal\"\n        , wrapMsg = ModalMsg\n        , content = []\n        , footer = []\n        , firstId : Modal.closeButtonId\n        , lastId : Modal.closeButtonId\n        , focus : Focus\n        }\n        [ Modal.custom [ id \"my-modal\" ], Modal.closeButton ]\n        modalState\n\n","type":"List.List (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Modal.V12.Attribute"},{"name":"hideTitle","comment":" ","type":"Nri.Ui.Modal.V12.Attribute"},{"name":"info","comment":" This is the default theme.\n","type":"Nri.Ui.Modal.V12.Attribute"},{"name":"init","comment":" ","type":"Nri.Ui.Modal.V12.Model"},{"name":"isOpen","comment":" ","type":"Nri.Ui.Modal.V12.Model -> Basics.Bool"},{"name":"open","comment":" Pass the id of the element that should receive focus when the modal closes.\n\n> ...if a dialog was opened on page load, then focus could be placed on either the body or main element.\n> If the trigger was removed from the DOM, then placing focus as close to the trigger’s DOM location would be ideal.\n\n<https://developer.paciellogroup.com/blog/2018/06/the-current-state-of-modal-dialog-accessibility/>\n\n---\n\nThe second part of the returned tuple is the id of the element to which focus should be returned.\n\n_You will need to explicitly move focus to this element!_\n\n","type":"{ returnFocusTo : String.String, startFocusOn : String.String } -> ( Nri.Ui.Modal.V12.Model, String.String )"},{"name":"showTitle","comment":" This is the default setting.\n","type":"Nri.Ui.Modal.V12.Attribute"},{"name":"subscriptions","comment":" Include the subscription if you want the modal to dismiss on `Esc`.\n","type":"Nri.Ui.Modal.V12.Model -> Platform.Sub.Sub Nri.Ui.Modal.V12.Msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Modal.V12.Attribute"},{"name":"titleId","comment":" Id used for the `h1` that labels the modal.\n\nUseful if you're changing the modal contents and want to move the user's focus to the new modal's updated title to re-orient them.\n\n","type":"String.String"},{"name":"update","comment":" The second part of the tuple is the id of the element to which focus should be returned.\n\n_You will need to explicitly move focus to this element!_\n\nIf you're an NRI employee working in the monorepo, pass the second part of the tuple to `Nri.Effect.maybeFocus`.\n\n","type":"{ dismissOnEscAndOverlayClick : Basics.Bool } -> Nri.Ui.Modal.V12.Msg -> Nri.Ui.Modal.V12.Model -> ( Nri.Ui.Modal.V12.Model, Maybe.Maybe String.String )"},{"name":"view","comment":" ","type":"{ title : String.String, wrapMsg : Nri.Ui.Modal.V12.Msg -> msg, firstId : String.String, lastId : String.String, focus : String.String -> msg, content : List.List (Accessibility.Styled.Html msg), footer : List.List (Accessibility.Styled.Html msg) } -> List.List Nri.Ui.Modal.V12.Attribute -> Nri.Ui.Modal.V12.Model -> Accessibility.Styled.Html msg"},{"name":"warning","comment":" ","type":"Nri.Ui.Modal.V12.Attribute"}],"binops":[]},{"name":"Nri.Ui.Outline.V1","comment":" A nestable layout that can be themed.\n\n@docs Outline, view, row\n\nWhen you're adding or removing elements, use KeyedOutline and corresponding helpers:\n\n@docs KeyedOutline, viewKeyed, keyedRow, keyedRowWithExtraContent\n\n\n## Predefined color palettes for use with Outlines and KeyedOutlines.\n\n@docs RowTheme\n@docs white, gray, darkGray, blue, darkBlue, purple, turquoise, green, red, aqua, cornflower\n@docs blueDashBordered\n@docs purpleBordered, greenBordered\n\n","unions":[{"name":"KeyedOutline","comment":" Aliased strictly for exporting\n","args":["msg"],"cases":[]},{"name":"Outline","comment":" ","args":["msg"],"cases":[]}],"aliases":[{"name":"RowTheme","comment":" ","args":[],"type":"{ border : Css.Color, borderStyle : Css.Style, background : Css.Color }"}],"values":[{"name":"aqua","comment":" Aqua palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"blue","comment":" Blue palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"blueDashBordered","comment":" Blue palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"cornflower","comment":" Cornflower palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"darkBlue","comment":" Dark blue palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"darkGray","comment":" Dark Gray palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"gray","comment":" ","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"green","comment":" Green palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"greenBordered","comment":" Green palette with a green border instead of a green background color\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"keyedRow","comment":" Render an unstyled row with only the outline styles.\n\n    import Html.Styled exposing (..)\n    import Nri.Ui.Outline.V1 as Outline\n\n    main : Html msg\n    main =\n        Outline.viewKeyed []\n            [ Outline.keyedRow someKey\n                { title = Just \"My outline node\"\n                , content = text \"This is my content\"\n                , palette = RowTheme.red\n                , rows = []\n                }\n            ]\n\n","type":"String.String -> { title : Maybe.Maybe String.String, content : Html.Styled.Html msg, palette : Nri.Ui.Outline.V1.RowTheme, rows : List.List (Nri.Ui.Outline.V1.KeyedOutline msg) } -> Nri.Ui.Outline.V1.KeyedOutline msg"},{"name":"keyedRowWithExtraContent","comment":" Render a row with extra content. This row cannot have child rows.\n\n    import Html.Styled exposing (..)\n    import Nri.Ui.Outline.V1 as Outline\n\n    main : Html msg\n    main =\n        Outline.view\n            [ Outline.keyedRowWithExtraContent someKey\n                { title = Just \"My outline node\"\n                , content = text \"This is my content\"\n                , palette = RowTheme.red\n                , extraContent = text \"My extra content\"\n                , rows = []\n                }\n            ]\n\n","type":"String.String -> { rows : List.List (Nri.Ui.Outline.V1.KeyedOutline msg), extraContent : Html.Styled.Html msg, title : Maybe.Maybe String.String, content : Html.Styled.Html msg, palette : Nri.Ui.Outline.V1.RowTheme } -> Nri.Ui.Outline.V1.KeyedOutline msg"},{"name":"purple","comment":" Purple palette with a purple border instead of a purple background color\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"purpleBordered","comment":" Purple palette with a purple border instead of a purple background color\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"red","comment":" Red palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"row","comment":"\n\n    import Html.Styled exposing (..)\n    import Nri.Ui.Outline.V1 as Outline exposing (Outline)\n\n    myRow : Outline msg\n    myRow =\n        Outline.row\n            { title = Just \"My node\"\n            , content = text \"This is my content\"\n            , palette = RowTheme.red\n            , rows = []\n            }\n\n","type":"{ title : Maybe.Maybe String.String, content : Html.Styled.Html msg, palette : Nri.Ui.Outline.V1.RowTheme, rows : List.List (Nri.Ui.Outline.V1.Outline msg) } -> Nri.Ui.Outline.V1.Outline msg"},{"name":"turquoise","comment":" Turquoise palette\n","type":"Nri.Ui.Outline.V1.RowTheme"},{"name":"view","comment":"\n\n    import Html.Styled exposing (..)\n    import Nri.Ui.Outline.V1 as Outline\n\n    main : Html msg\n    main =\n        Outline.view []\n\n","type":"List.List (Nri.Ui.Outline.V1.Outline msg) -> Html.Styled.Html msg"},{"name":"viewKeyed","comment":" The row view.\n\n    import Html.Styled exposing (..)\n    import Nri.Ui.Outline.V1 as Outline\n\n    main : Html msg\n    main =\n        Outline.viewKeyed [{- Rows go here -}]\n\n","type":"List.List (Nri.Ui.Outline.V1.KeyedOutline msg) -> Html.Styled.Html msg"},{"name":"white","comment":" White palette (borders are blue)\n","type":"Nri.Ui.Outline.V1.RowTheme"}],"binops":[]},{"name":"Nri.Ui.Page.V3","comment":" Patch changes:\n\n  - added `headingId` as the `id` of the `h1` produced by `Page`\n  - made the `h1` produced by `Page` programmatically focusable\n\nA styled NRI error page.\n\n@docs httpError\n@docs DefaultPage, broken, blockedV4, blocked, notFound, noPermission, loggedOut, timeOut, networkError\n@docs RecoveryText\n@docs headingId\n\n","unions":[{"name":"RecoveryText","comment":" ReturnTo just needs the name of the page the user\nwill be returned to. Reload displays default text to reload\nthe current page. Custom is to add flexibility to the button.\n","args":[],"cases":[["ReturnTo",["String.String"]],["Reload",[]],["Custom",["String.String"]]]}],"aliases":[{"name":"DefaultPage","comment":" The default page information is for the button\nwhich will direct the user back to the main page of\nthe SPA. Specify its name and the message which will\nnavigate to the page.\n","args":["msg"],"type":"{ link : msg, recoveryText : Nri.Ui.Page.V3.RecoveryText }"}],"values":[{"name":"blocked","comment":" DEPRECATED: please use blockedV4.\n\nFor HTTP errors and other broken states, where link goes to \"/\".\n\n","type":"String.String -> Html.Styled.Html msg"},{"name":"blockedV4","comment":" Error page with details for engineers.\n","type":"String.String -> Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"},{"name":"broken","comment":" For HTTP errors and other broken states.\n","type":"Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"},{"name":"headingId","comment":" This ID is attached to the `h1` produced by Page.\nThis can be useful when you need to move focus to the heading to communicate to AT users that there's been an error.\n","type":"String.String"},{"name":"httpError","comment":" ","type":"Http.Error -> Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"},{"name":"loggedOut","comment":" When the user has been logged out.\n","type":"Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"},{"name":"networkError","comment":" When a request fails due to a connectivity failure.\n","type":"Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"},{"name":"noPermission","comment":" For pages the user does not have access to.\n","type":"Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"},{"name":"notFound","comment":" For the not found page.\n","type":"Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"},{"name":"timeOut","comment":" When a request takes too long to complete.\n","type":"Nri.Ui.Page.V3.DefaultPage msg -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Pagination.V1","comment":" Display a nav element aiding in navigating between pages of content.\n\n    [ Previous ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ Next ]\n\n@docs view\n\n","unions":[],"aliases":[],"values":[{"name":"view","comment":" Pass in a list of page URLs/on-click handlers and the currently-selected page's index.\n\n    view\n        [ { onClick = GoToPage 0, href = \"#page-1\" }\n        , { onClick = GoToPage 1, href = \"#page-2\" }\n        , { onClick = GoToPage 2, href = \"#page-3\" }\n        ]\n        2\n\nNote: the navigation will only show if there's 2 or more pages of content.\n\n","type":"List.List { onClick : msg, href : String.String } -> Basics.Int -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Palette.V1","comment":" Predefined color palettes for use in configurable components\n\n@docs Palette, PaletteName\n@docs white, gray, darkGray, blue, darkBlue, purple, turquoise, green, red, aqua, cornflower\n\n","unions":[{"name":"PaletteName","comment":" ","args":[],"cases":[["Gray",[]],["DarkGray",[]],["Blue",[]],["DarkBlue",[]],["Purple",[]],["Turquoise",[]],["Red",[]],["Green",[]],["White",[]],["Cornflower",[]],["Aqua",[]]]}],"aliases":[{"name":"Palette","comment":" ","args":[],"type":"{ border : Css.Color, background : Css.Color, primary : Css.Color, name : Nri.Ui.Palette.V1.PaletteName }"}],"values":[{"name":"aqua","comment":" Aqua palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"blue","comment":" Blue palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"cornflower","comment":" Cornflower palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"darkBlue","comment":" Dark blue palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"darkGray","comment":" Dark Gray palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"gray","comment":" Gray palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"green","comment":" Green palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"purple","comment":" Purple palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"red","comment":" Red palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"turquoise","comment":" Turquoise palette\n","type":"Nri.Ui.Palette.V1.Palette"},{"name":"white","comment":" White palette (borders are blue)\n","type":"Nri.Ui.Palette.V1.Palette"}],"binops":[]},{"name":"Nri.Ui.Panel.V1","comment":" Create panels (AKA wells.)\n\n\n## Changelog\n\n\n### Patch changes\n\n  - use internal `Content` module\n  - adds paragraph\n\n@docs view, Attribute\n\n\n## Content\n\n@docs header\n@docs paragraph, plaintext, markdown, html\n@docs containerCss, headerCss, css\n\n\n## Theme\n\n@docs primary, secondary\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"header","comment":" The main text for the panel's header\n","type":"String.String -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"headerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"html","comment":" Render panel content.\n","type":"List.List (Html.Styled.Html msg) -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"markdown","comment":" Use a markdown string for the panel content.\n","type":"String.String -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"paragraph","comment":" Provide a plain-text string that will be put into a paragraph tag, with the default margin removed.\n","type":"String.String -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"plaintext","comment":" Use a plain-text string for the panel content.\n","type":"String.String -> Nri.Ui.Panel.V1.Attribute msg"},{"name":"primary","comment":" use the primary color theme (this is the default)\n","type":"Nri.Ui.Panel.V1.Attribute msg"},{"name":"secondary","comment":" use the secondary color theme\n","type":"Nri.Ui.Panel.V1.Attribute msg"},{"name":"view","comment":" create a panel, given the options you specify\n","type":"List.List (Nri.Ui.Panel.V1.Attribute msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Pennant.V3","comment":" Changes from V2:\n\n    - premiumFlag replaced by a newly designed contentPremiumFlag and activePremiumFlag\n    - disabledPremiumFlag updated to inactivePremiumFlag with new design\n    - expiredPremiumFlag updated with new design\n    - giftPremiumFlag added for vouchered content\n\nUsed for indicating Premium content\n\n@docs contentPremiumFlag, activePremiumFlag, inactivePremiumFlag, expiredPremiumFlag, giftPremiumFlag\n\n","unions":[],"aliases":[],"values":[{"name":"activePremiumFlag","comment":" Pennant to indicate that premium status is active\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"contentPremiumFlag","comment":" Pennant to indicate that particular content is premium only\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"expiredPremiumFlag","comment":" Pennant to indicate that premium status has expired\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"giftPremiumFlag","comment":" Pennant to indicate premium content that is currently accessible through premium vouchers\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"inactivePremiumFlag","comment":" Pennant to indicate that premium status is inactive\n","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.PremiumCheckbox.V8","comment":"\n\n\n## Patch changes:\n\n  - Added vouchered state for premium vouchers with gift pennant\n  - Replaced lock icon with disabled checkbox for locked state\n  - Adjust height of locked Premium button to match other checkbox states\n  - Support no-margin option\n\n\n## Changes from V7:\n\n  - Use PremiumDisplay instead of PremiumLevel\n  - Rename showPennant to onLockedClick\n  - Fix clicking on locked checkbox to send a onLockedClick\n  - Exposes checkbox custom styling\n\n@docs view\n\n@docs selected, partiallySelected\n\n\n### Content\n\n@docs premium, onLockedClick\n\n\n### Attributes\n\n@docs Attribute\n@docs disabled, enabled\n@docs id\n\n\n### Custom CSS\n\n@docs setCheckboxContainerCss\n@docs setCheckboxEnabledLabelCss\n@docs setCheckboxDisabledLabelCss\n@docs noMargin\n\n","unions":[{"name":"Attribute","comment":" Customizations for the RadioButton.\n","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"disabled","comment":" This disables the input\n","type":"Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"enabled","comment":" This enables the input, this is the default behavior\n","type":"Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"id","comment":" Set a custom ID for this checkbox and label. If you don't set this,\nwe'll automatically generate one from the label you pass in, but this can\ncause problems if you have more than one checkbox with the same label on\nthe page. Use this to be more specific and avoid issues with duplicate IDs!\n","type":"String.String -> Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"noMargin","comment":" Remove default spacing from the top and bottom of the checkbox.\n","type":"Basics.Bool -> Nri.Ui.PremiumCheckbox.V8.Attribute value"},{"name":"onLockedClick","comment":" Show Premium pennant on Premium content.\n\nWhen a locked premium checkbox is clicked, the msg that's passed in will fire.\n\n","type":"msg -> Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"partiallySelected","comment":" ","type":"Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"premium","comment":" Lock Premium content if the user does not have Premium.\n","type":"Nri.Ui.Data.PremiumDisplay.PremiumDisplay -> Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"selected","comment":" ","type":"Basics.Bool -> Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"setCheckboxContainerCss","comment":" Set custom CSS for the checkbox container\n","type":"List.List Css.Style -> Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"setCheckboxDisabledLabelCss","comment":" Set custom CSS for the disabled checkbox label\n","type":"List.List Css.Style -> Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"setCheckboxEnabledLabelCss","comment":" Set custom CSS for the enabled checkbox label\n","type":"List.List Css.Style -> Nri.Ui.PremiumCheckbox.V8.Attribute msg"},{"name":"view","comment":" ","type":"{ label : String.String, onChange : Basics.Bool -> msg } -> List.List (Nri.Ui.PremiumCheckbox.V8.Attribute msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.QuestionBox.V6","comment":" Patch Changes\n\n  - Background color in Tip theme changed from white to sunshine yellow\n  - added html function\n  - Increase `minHeight` for tip question box so character fits\n\nChanges from V5:\n\n  - ???\n\n@docs view, Attribute\n\n@docs id, markdown, html\n@docs character, characterPosition\n@docs actions, actionsVertical, actionsHorizontal\n@docs neutral, correct, incorrect, tip\n@docs containerCss\n@docs leftActions\n\n@docs guidanceId\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"actions","comment":" ","type":"List.List (Nri.Ui.QuestionBox.V6.Action msg) -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"actionsHorizontal","comment":" Arranges the buttons horizontally on the QuestionBox.\n","type":"Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"actionsVertical","comment":" Arranges the buttons vertically on the QuestionBox. This is the default behavior.\n","type":"Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"character","comment":" Note that the character _only_ appears when the theme is `tip`!\n","type":"{ name : String.String, icon : Nri.Ui.Svg.V1.Svg } -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"characterPosition","comment":" ","type":"Nri.Ui.QuestionBox.V6.CharacterPosition -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"correct","comment":" A box that signifies that an answer was correct.\n\nThis dialog DOES NOT show the character icon (they should be showed as part of the `CharacterStage`)\n\n","type":"Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"guidanceId","comment":" This helper is how we create an id for the guidance speech bubble element based on the `QuestionBox.id` value. Use this helper to manage focus.\n\nWhen showing multiple questions in a sequence based on the user's answer, we want to move the user's focus to the guidance so that:\n\n  - Screenreader users are alerted to a new context -- the new question!\n  - Keyboard users's focus is somewhere convenient to answer the question (but not _on_ an answer, since we don't want accidental submissions or for the user to hit enter straight and miss the guidance!)\n\n","type":"String.String -> String.String"},{"name":"html","comment":" Content inside the question box, just before the buttons, is rendered as HTML.\nWe purposely don't allow the html to be interactive.\n","type":"Html.Styled.Html Basics.Never -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"incorrect","comment":" A box that signifies that an answer was incorrect.\n\nThis dialog DOES NOT show the character icon (they should be showed as part of the `CharacterStage`)\n\n","type":"Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"leftActions","comment":" Adds an arbitrary HTML on the left of the question box for the text to speech button\n","type":"Html.Styled.Html msg -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"markdown","comment":" Content inside the question box, just before the buttons, is rendered from markdown syntax\n","type":"String.String -> Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"neutral","comment":" A neutral box that should prompt the user with a question. This is the default theme.\n\nThis dialog DOES NOT show the character icon (they should be showed as part of the `CharacterStage`)\n\n","type":"Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"tip","comment":" An informational box that shows the character icon.\n","type":"Nri.Ui.QuestionBox.V6.Attribute msg"},{"name":"view","comment":"\n\n    QuestionBox.view\n        [ QuestionBox.markdown \"**WOW**, great component!\"\n        ]\n\n","type":"List.List (Nri.Ui.QuestionBox.V6.Attribute msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.QuestionBox.V7","comment":" Changes from V6:\n\n  - add an optional id to action\n\n@docs view, Attribute\n\n@docs id, markdown, html\n@docs character, characterPosition\n@docs actions, actionsVertical, actionsHorizontal\n@docs neutral, correct, incorrect, tip\n@docs containerCss\n@docs leftActions\n\n@docs guidanceId\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"actions","comment":" ","type":"List.List (Nri.Ui.QuestionBox.V7.Action msg) -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"actionsHorizontal","comment":" Arranges the buttons horizontally on the QuestionBox.\n","type":"Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"actionsVertical","comment":" Arranges the buttons vertically on the QuestionBox. This is the default behavior.\n","type":"Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"character","comment":" Note that the character _only_ appears when the theme is `tip`!\n","type":"{ name : String.String, icon : Nri.Ui.Svg.V1.Svg } -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"characterPosition","comment":" ","type":"Nri.Ui.QuestionBox.V7.CharacterPosition -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"correct","comment":" A box that signifies that an answer was correct.\n\nThis dialog DOES NOT show the character icon (they should be showed as part of the `CharacterStage`)\n\n","type":"Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"guidanceId","comment":" This helper is how we create an id for the guidance speech bubble element based on the `QuestionBox.id` value. Use this helper to manage focus.\n\nWhen showing multiple questions in a sequence based on the user's answer, we want to move the user's focus to the guidance so that:\n\n  - Screenreader users are alerted to a new context -- the new question!\n  - Keyboard users's focus is somewhere convenient to answer the question (but not _on_ an answer, since we don't want accidental submissions or for the user to hit enter straight and miss the guidance!)\n\n","type":"String.String -> String.String"},{"name":"html","comment":" Content inside the question box, just before the buttons, is rendered as HTML.\nWe purposely don't allow the html to be interactive.\n","type":"Html.Styled.Html Basics.Never -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"incorrect","comment":" A box that signifies that an answer was incorrect.\n\nThis dialog DOES NOT show the character icon (they should be showed as part of the `CharacterStage`)\n\n","type":"Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"leftActions","comment":" Adds an arbitrary HTML on the left of the question box for the text to speech button\n","type":"Html.Styled.Html msg -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"markdown","comment":" Content inside the question box, just before the buttons, is rendered from markdown syntax\n","type":"String.String -> Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"neutral","comment":" A neutral box that should prompt the user with a question. This is the default theme.\n\nThis dialog DOES NOT show the character icon (they should be showed as part of the `CharacterStage`)\n\n","type":"Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"tip","comment":" An informational box that shows the character icon.\n","type":"Nri.Ui.QuestionBox.V7.Attribute msg"},{"name":"view","comment":"\n\n    QuestionBox.view\n        [ QuestionBox.markdown \"**WOW**, great component!\"\n        ]\n\n","type":"List.List (Nri.Ui.QuestionBox.V7.Attribute msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.RadioButton.V4","comment":"\n\n\n### Patch changes:\n\n  - replace `height` use with `minHeight` to prevent vertical text overflow issues\n  - use `break-word` to prevent horizontal text overflow issues\n  - update color styling\n  - update unselected enabled label color\n  - when disabled, replaces the `disabled` attribute with `aria-disabled=\"true\"`\n    and removes onClick event handler. These changes prevent the element from\n    being selected but keep it in the tab order and ensure that tooltips can\n    still be displayed when the element is focused.\n  - add `rightIcon` property\n\n\n### Changes from V3:\n\n  - use PremiumDisplay instead of PremiumLevel\n  - rename showPennant to onLockedClick since its display depends on premium now\n  - make onLockedClick be triggers when clicking anywhere and not just pennant to match PremiumChecbox\n\n@docs view\n\n\n### Content\n\n@docs premium, onLockedClick\n@docs disclosure\n\n\n### Event handlers\n\n@docs onSelect\n\n\n### Attributes\n\n@docs Attribute\n@docs hiddenLabel, visibleLabel\n@docs containerCss, labelCss, custom, nriDescription, id, testId\n@docs disabled, enabled, errorIf, errorMessage, guidance, guidanceHtml\n@docs rightIcon\n\n","unions":[{"name":"Attribute","comment":" Customizations for the RadioButton.\n","args":["value","msg"],"cases":[]}],"aliases":[],"values":[{"name":"containerCss","comment":" Adds CSS to the element containing the input.\n","type":"List.List Css.Style -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"disabled","comment":" This disables the input\n","type":"Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"disclosure","comment":" Content that shows when this RadioButton is selected\n","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"enabled","comment":" This enables the input, this is the default behavior\n","type":"Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"errorIf","comment":" Sets whether or not the field will be highlighted as having a validation error.\n","type":"Basics.Bool -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"errorMessage","comment":" If `Just`, the field will be highlighted as having a validation error,\nand the given error message will be shown.\n","type":"Maybe.Maybe String.String -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"guidance","comment":" A guidance message shows below the input, unless an error message is showing instead.\n","type":"String.String -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"guidanceHtml","comment":" A guidance message (HTML) shows below the input, unless an error message is showing instead.\n","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"hiddenLabel","comment":" Hides the visible label. (There will still be an invisible label for screen readers.)\n","type":"Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"id","comment":" Set a custom ID for this radio input and label. If you don't set this,\nwe'll automatically generate one from the label you pass in, but this can\ncause problems if you have more than one radio input with the same label on\nthe page. You might also use this helper if you're manually managing focus.\n","type":"String.String -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"labelCss","comment":" Adds CSS to the element containing the label text.\n\nNote that these styles don't apply to the literal HTML label element, since it contains the icon SVG as well.\n\n","type":"List.List Css.Style -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"onLockedClick","comment":" Makes the Premium pennant clickable.\n\nWhen the pennant is clicked, the msg that's passed in will fire.\n\n","type":"msg -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"onSelect","comment":" Fire a message parameterized by the value type when selecting a radio option\n","type":"(value -> msg) -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"premium","comment":" Lock Premium content if the user does not have Premium.\n","type":"Nri.Ui.Data.PremiumDisplay.PremiumDisplay -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"rightIcon","comment":" Adds an icon to the right of the label\n","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.RadioButton.V4.Attribute value msg"},{"name":"view","comment":" View a single radio button.\n","type":"{ label : String.String, name : String.String, value : value, valueToString : value -> String.String, selectedValue : Maybe.Maybe value } -> List.List (Nri.Ui.RadioButton.V4.Attribute value msg) -> Accessibility.Styled.Html msg"},{"name":"visibleLabel","comment":" Shows the visible label. This is the default behavior\n","type":"Nri.Ui.RadioButton.V4.Attribute value msg"}],"binops":[]},{"name":"Nri.Ui.RadioButtonDotless.V1","comment":" Looks like a standard button, behaves like a radio button\n\n\n### Patch changes:\n\n    - Introduce `enabled`/`disabled` attributes and styles\n    - Support markdown for radio button contents (like Button does)\n\n\n# Create a radio button\n\n@docs view\n@docs Attribute\n\n\n## Behavior\n\n@docs onSelect\n\n\n## Customization\n\n@docs unboundedWidth, fillContainerWidth\n@docs textAlignCenter, textAlignLeft\n@docs small, medium, large\n@docs enabled, disabled\n@docs containerCss, labelCss\n\n\n## Attributes\n\n@docs id, custom, nriDescription, testId\n\n","unions":[{"name":"Attribute","comment":" Customizations for the RadioButton.\n","args":["value","msg"],"cases":[]}],"aliases":[],"values":[{"name":"containerCss","comment":" Adds CSS to the element containing the input.\n","type":"List.List Css.Style -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `containerCss` or `labelCss` helper.\n\n","type":"List.List (Html.Styled.Attribute Basics.Never) -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"disabled","comment":" Disable the input\n","type":"msg -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"enabled","comment":" Enable the input (this is the default)\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"fillContainerWidth","comment":" The button will attempt to fill the width of its container\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"id","comment":" Set a unique identifier for the button. This id will also be used as the root name for sub elements.\n","type":"String.String -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"labelCss","comment":" Adds CSS to the element containing the label text.\n\nNote that these styles don't apply to the literal HTML label element.\n\n","type":"List.List Css.Style -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"large","comment":" A large sized button (~56px tall)\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"medium","comment":" A medium sized button (~45px tall - this is the default)\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"nriDescription","comment":" Set the \"data-nri-description\" attribute\n","type":"String.String -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"onSelect","comment":" Fire a message upon selection of this radio button option\n","type":"(value -> msg) -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"small","comment":" A small sized button (~36px tall)\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"testId","comment":" See Cypress best practices: <https://docs.cypress.io/guides/references/best-practices.html#Selecting-Elements>\n","type":"String.String -> Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"textAlignCenter","comment":" Align the text to the center in the button\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"textAlignLeft","comment":" Align the text to the left in the button\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"unboundedWidth","comment":" Leave the width unbounded (this is the default)\n","type":"Nri.Ui.RadioButtonDotless.V1.Attribute value msg"},{"name":"view","comment":" View the single dotless radio button\n\n`label` supports bold and italic markdown syntax\n\n","type":"{ label : String.String, name : String.String, value : value, valueToString : value -> String.String, selectedValue : Maybe.Maybe value } -> List.List (Nri.Ui.RadioButtonDotless.V1.Attribute value msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.RingGauge.V1","comment":" A ring gauge made with svg that shows completion by stroking the circumference\nwith a specific color.\n\nUses the strategy discussed here:\n<https://medium.com/@heyoka/scratch-made-svg-donut-pie-charts-in-html5-2c587e935d72>\n\n@docs view, Settings\n\n","unions":[],"aliases":[{"name":"Settings","comment":"\n\n  - background color : the center of the ring's color\n  - empty color: representation of the not-yet-done/unfilled part of the ring\n  - filled color: representation of the done part of the ring\n  - percentage: 0-100 value representing completion\n\n","args":[],"type":"{ backgroundColor : Css.Color, emptyColor : Css.Color, filledColor : Css.Color, percentage : Basics.Float }"}],"values":[{"name":"view","comment":" Shows a configurable SVG ring guage\n","type":"Nri.Ui.RingGauge.V1.Settings -> Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.SegmentedControl.V14","comment":" Patch changes:\n\n  - use Tooltip.V3 instead of Tooltip.V2\n  - when tooltips aren't used, avoid using aria-owns and rendering tooltip-related code\n  - Option's attributes field gets passed into every radio element in `viewRadioGroup`\n\nChanges from V13:\n\n  - Adds tooltip support to `viewRadioGroup`\n\n@docs Option, view\n@docs Radio, viewRadioGroup\n@docs Positioning, Width\n\n","unions":[{"name":"Positioning","comment":" ","args":[],"cases":[["Left",["Nri.Ui.SegmentedControl.V14.Width"]],["Center",[]]]},{"name":"Width","comment":" ","args":[],"cases":[["FitContent",[]],["FillContainer",[]]]}],"aliases":[{"name":"Option","comment":" Tooltip defaults: `[Tooltip.smallPadding, Tooltip.onBottom, Tooltip.fitToContent]`\n","args":["value","msg"],"type":"{ value : value, idString : String.String, label : Accessibility.Styled.Html msg, attributes : List.List (Accessibility.Styled.Attribute msg), tabTooltip : List.List (Nri.Ui.Tooltip.V3.Attribute msg), icon : Maybe.Maybe Nri.Ui.Svg.V1.Svg, content : Accessibility.Styled.Html msg }"},{"name":"Radio","comment":" ","args":["value","msg"],"type":"{ value : value, idString : String.String, label : Accessibility.Styled.Html msg, attributes : List.List (Accessibility.Styled.Attribute msg), tooltip : List.List (Nri.Ui.Tooltip.V3.Attribute msg), icon : Maybe.Maybe Nri.Ui.Svg.V1.Svg }"}],"values":[{"name":"view","comment":"\n\n  - `focusAndSelect` : the message to produce when an option is selected by the user\n  - `options`: the list of options available\n  - `selected`: the value of the currently-selected option\n  - `positioning`: how to position and size the segmented control\n  - `toUrl`: a optional function that takes a `route` and returns the URL of that route. You should always use pass a `toUrl` function when the segmented control options correspond to routes in your SPA.\n\n","type":"{ focusAndSelect : { select : a, focus : Maybe.Maybe String.String } -> msg, options : List.List (Nri.Ui.SegmentedControl.V14.Option a msg), selected : a, positioning : Nri.Ui.SegmentedControl.V14.Positioning, toUrl : Maybe.Maybe (a -> String.String) } -> Accessibility.Styled.Html msg"},{"name":"viewRadioGroup","comment":" Creates a set of radio buttons styled to look like a segmented control.\n\n  - `onSelect`: the message to produce when an option is selected (clicked) by the user\n  - `idString`: function to get the radio value as a string\n  - `options`: the list of options available\n  - `selected`: if present, the value of the currently-selected option\n  - `positioning`: how to position and size the segmented control\n  - `legend`:\n      - value read to screenreader users to explain the radio group's purpose <https://dequeuniversity.com/rules/axe/3.3/radiogroup?application=axeAPI>\n      - after lowercasing & dashifying, this value is used to group the radio buttons together\n\n","type":"{ onSelect : a -> msg, options : List.List (Nri.Ui.SegmentedControl.V14.Radio a msg), selected : Maybe.Maybe a, positioning : Nri.Ui.SegmentedControl.V14.Positioning, legend : String.String } -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Select.V9","comment":" Build a select input with a label, optional guidance, and error messaging.\n\nPatch changes:\n\n  - Adjust disabled styles\n\nChanges from V8\n\n    - The option `value` attribute is no longer prefixed with `nri-select-`;\n      This is not a breaking change to the API, but affects automated tests\n      that are looking for this prefix.\n    - adds `icon` support\n    - when disabled, the select element is now replaced by a div element with\n      `aria-disabled=\"true\"` and `tabindex=\"0\"`. This change prevents user\n      interactions while maintaining the element in the tab order.\n    - sets cursor to `not-allowed` when disabled`\n\n@docs view, generateId\n\n\n### Input types\n\n@docs Choice, choices\n@docs ChoicesGroup, groupedChoices\n\n\n### Input content\n\n@docs value\n\n\n### Attributes\n\n@docs Attribute, defaultDisplayText\n@docs hiddenLabel, visibleLabel\n@docs disabled, loading, errorIf, errorMessage, guidance, guidanceHtml\n@docs custom, nriDescription, id, testId\n@docs icon\n@docs containerCss, noMargin\n@docs batch\n\n","unions":[{"name":"Attribute","comment":" Customizations for the Select.\n","args":["value"],"cases":[]}],"aliases":[{"name":"Choice","comment":" A single possible choice.\n","args":["value"],"type":"{ label : String.String, value : value }"},{"name":"ChoicesGroup","comment":" Groupings of choices (will be added _after_ isolated choices.)\n","args":["value"],"type":"{ label : String.String, choices : List.List (Nri.Ui.Select.V9.Choice value) }"}],"values":[{"name":"batch","comment":" Combine several attributes into one. A nice way to do nothing via batch []\n","type":"List.List (Nri.Ui.Select.V9.Attribute value) -> Nri.Ui.Select.V9.Attribute value"},{"name":"choices","comment":" ","type":"(value -> String.String) -> List.List (Nri.Ui.Select.V9.Choice value) -> Nri.Ui.Select.V9.Attribute value"},{"name":"containerCss","comment":" Adds CSS to the element containing the input.\n","type":"List.List Css.Style -> Nri.Ui.Select.V9.Attribute value"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Select.V9.Attribute value"},{"name":"defaultDisplayText","comment":" ","type":"String.String -> Nri.Ui.Select.V9.Attribute value"},{"name":"disabled","comment":" Disables the input\n","type":"Nri.Ui.Select.V9.Attribute value"},{"name":"errorIf","comment":" Sets whether or not the field will be highlighted as having a validation error.\n\nIf you have an error message to display, use `errorMessage` instead.\n\n","type":"Basics.Bool -> Nri.Ui.Select.V9.Attribute value"},{"name":"errorMessage","comment":" If `Just`, the field will be highlighted as having a validation error,\nand the given error message will be shown.\n","type":"Maybe.Maybe String.String -> Nri.Ui.Select.V9.Attribute value"},{"name":"generateId","comment":" Pass in the label to generate the default DOM element id used by a `Select.view` with the given label.\n","type":"String.String -> String.String"},{"name":"groupedChoices","comment":" ","type":"(value -> String.String) -> List.List (Nri.Ui.Select.V9.ChoicesGroup value) -> Nri.Ui.Select.V9.Attribute value"},{"name":"guidance","comment":" A guidance message shows below the input, unless an error message is showing instead.\n","type":"String.String -> Nri.Ui.Select.V9.Attribute value"},{"name":"guidanceHtml","comment":" A guidance message (HTML) shows below the input, unless an error message is showing instead.\n","type":"List.List (Accessibility.Styled.Html Basics.Never) -> Nri.Ui.Select.V9.Attribute value"},{"name":"hiddenLabel","comment":" Hides the visible label. (There will still be an invisible label for screen readers.)\n","type":"Nri.Ui.Select.V9.Attribute value"},{"name":"icon","comment":" Add an SVG icon that will render on top of the select by way of absolute positioning.\n","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.Select.V9.Attribute msg"},{"name":"id","comment":" Set a custom ID for this text input and label. If you don't set this,\nwe'll automatically generate one from the label you pass in, but this can\ncause problems if you have more than one text input with the same label on\nthe page. Use this to be more specific and avoid issues with duplicate IDs!\n","type":"String.String -> Nri.Ui.Select.V9.Attribute value"},{"name":"loading","comment":" Use this while the form the input is a part of is being submitted.\n","type":"Nri.Ui.Select.V9.Attribute value"},{"name":"noMargin","comment":" Remove default spacing from the Input.\n","type":"Basics.Bool -> Nri.Ui.Select.V9.Attribute value"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Select.V9.Attribute value"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Select.V9.Attribute value"},{"name":"value","comment":" ","type":"Maybe.Maybe value -> Nri.Ui.Select.V9.Attribute value"},{"name":"view","comment":" ","type":"String.String -> List.List (Nri.Ui.Select.V9.Attribute a) -> Accessibility.Styled.Html a"},{"name":"visibleLabel","comment":" Default behavior.\n","type":"Nri.Ui.Select.V9.Attribute value"}],"binops":[]},{"name":"Nri.Ui.Shadows.V1","comment":" We use three levels of shadow:\n\n@docs low, medium, high\n\n","unions":[],"aliases":[],"values":[{"name":"high","comment":" High: for “floating” elements like tooltips, popovers, and modals\n","type":"Css.Style"},{"name":"low","comment":" Low: for standard containers and similar elements like large messages\n","type":"Css.Style"},{"name":"medium","comment":" Medium: for larger, more prominent containers like Container.Pillow and marketing site cards\n","type":"Css.Style"}],"binops":[]},{"name":"Nri.Ui.SideNav.V5","comment":"\n\n\n### Patch changes:\n\n  - uses `ul>li` for the structure\n  - adds `aria-current=\"true\"` to the parent of the current page\n  - expose missing import\n  - correct locked premium content to match `ul>li` structure\n  - honor icon/rightIcon for entries with children\n\n\n### Changes from V4\n\n  - removes primary and secondary\n  - adds `compactGroup`\n  - premium flag replaces lock icon in lock display\n\n\n## View\n\n@docs view, Config, NavAttribute\n@docs collapsible, CollapsibleConfig\n@docs navLabel, navId\n@docs navCss, navNotMobileCss, navMobileCss, navQuizEngineMobileCss\n\n\n## Entries\n\n@docs entry, entryWithChildren, html, compactGroup\n@docs Entry, Attribute, EntryAttribute, GroupAttribute\n@docs icon, rightIcon\n@docs custom, css, nriDescription, testId, id\n\n\n## Behavior\n\n@docs onClick\n@docs href, linkSpa, linkExternal, linkWithMethod, linkWithTracking, linkExternalWithTracking\n\n\n## Change the state\n\n@docs premiumDisplay\n\n","unions":[{"name":"Attribute","comment":" ","args":["entryOrGroup","msg"],"cases":[]},{"name":"Entry","comment":" Use `entry` to create a sidebar entry.\n","args":["route","msg"],"cases":[]},{"name":"NavAttribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[{"name":"CollapsibleConfig","comment":" ","args":["msg"],"type":"{ isOpen : Basics.Bool, toggle : Basics.Bool -> msg, isTooltipOpen : Basics.Bool, toggleTooltip : Basics.Bool -> msg }"},{"name":"Config","comment":" ","args":["route","msg"],"type":"{ isCurrentRoute : route -> Basics.Bool, routeToString : route -> String.String, onSkipNav : msg }"},{"name":"EntryAttribute","comment":" ","args":["route","msg"],"type":"Nri.Ui.SideNav.V5.Attribute (Nri.Ui.SideNav.V5.EntrySpecificConfic route msg) msg"},{"name":"GroupAttribute","comment":" ","args":[],"type":"Nri.Ui.SideNav.V5.Attribute {} Basics.Never"}],"values":[{"name":"collapsible","comment":" ","type":"Nri.Ui.SideNav.V5.CollapsibleConfig msg -> Nri.Ui.SideNav.V5.NavAttribute msg"},{"name":"compactGroup","comment":" Add a labelled \"group\" of entries, typically taking the form of plain links.\n\n    SideNav.compactGroup \"Resources\"\n        []\n        [ SideNav.entry \"Docs\" [ SideNav.linkExternal \"www.docs.com\" ]\n        , SideNav.entry \"Examples\" [ SideNav.linkExternal \"www.examples.com\" ]\n        , SideNav.entry \"Google\" [ SideNav.linkExternal \"www.google.com\" ]\n        ]\n\n","type":"String.String -> List.List Nri.Ui.SideNav.V5.GroupAttribute -> List.List (Nri.Ui.SideNav.V5.Entry route msg) -> Nri.Ui.SideNav.V5.Entry route msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V5.Attribute entryOrGroup msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.SideNav.V5.Attribute entryOrGroup msg"},{"name":"entry","comment":" ","type":"String.String -> List.List (Nri.Ui.SideNav.V5.EntryAttribute route msg) -> Nri.Ui.SideNav.V5.Entry route msg"},{"name":"entryWithChildren","comment":" ","type":"String.String -> List.List (Nri.Ui.SideNav.V5.EntryAttribute route msg) -> List.List (Nri.Ui.SideNav.V5.Entry route msg) -> Nri.Ui.SideNav.V5.Entry route msg"},{"name":"href","comment":" ","type":"route -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"html","comment":" ","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.SideNav.V5.Entry route msg"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.SideNav.V5.Attribute entryOrGroup msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.SideNav.V5.Attribute entryOrGroup msg"},{"name":"linkExternal","comment":" ","type":"String.String -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"linkExternalWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"linkSpa","comment":" Use this link for routing within a single page app.\n\nThis will make a normal <a> tag, but change the Events.onClick behavior to avoid reloading the page.\n\nSee <https://github.com/elm-lang/html/issues/110> for details on this implementation.\n\n","type":"route -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"linkWithMethod","comment":" ","type":"{ method : String.String, url : route } -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"linkWithTracking","comment":" ","type":"{ track : msg, url : route } -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"navCss","comment":" These styles are included automatically in the nav container:\n\n    [ flexBasis (px 300)\n    , flexShrink (num 0)\n    , borderRadius (px 8)\n    , backgroundColor Colors.gray96\n    , padding (px 20)\n    , marginRight (px 20)\n    ]\n\n","type":"List.List Css.Style -> Nri.Ui.SideNav.V5.NavAttribute msg"},{"name":"navId","comment":" ","type":"String.String -> Nri.Ui.SideNav.V5.NavAttribute msg"},{"name":"navLabel","comment":" Give screenreader users context on what this particular sidenav is for.\n\nIf the nav is collapsible, this value will also be used for the sidenav tooltips.\n\n","type":"String.String -> Nri.Ui.SideNav.V5.NavAttribute msg"},{"name":"navMobileCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V5.NavAttribute msg"},{"name":"navNotMobileCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V5.NavAttribute msg"},{"name":"navQuizEngineMobileCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V5.NavAttribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.SideNav.V5.Attribute entryOrGroup msg"},{"name":"onClick","comment":" ","type":"msg -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"premiumDisplay","comment":" ","type":"Nri.Ui.Data.PremiumDisplay.PremiumDisplay -> msg -> Nri.Ui.SideNav.V5.EntryAttribute route msg"},{"name":"rightIcon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.SideNav.V5.Attribute entryOrGroup msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.SideNav.V5.Attribute entryOrGroup msg"},{"name":"view","comment":" ","type":"Nri.Ui.SideNav.V5.Config route msg -> List.List (Nri.Ui.SideNav.V5.NavAttribute msg) -> List.List (Nri.Ui.SideNav.V5.Entry route msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.SortableTable.V4","comment":" Changes from V3:\n\n  - Change to an HTML-like API\n  - Allow the table header to be sticky\n  - Adds an optional hover z-index for sticky table headers\n\n@docs Column, Sorter, State\n@docs init, initDescending\n@docs custom, string\n@docs Attribute, updateMsg, state, stickyHeader, stickyHeaderCustom, StickyConfig, view, viewLoading\n@docs invariantSort, simpleSort, combineSorters\n\n","unions":[{"name":"Attribute","comment":" Customize how the table is rendered, for example by adding sorting or\nstickiness.\n","args":["id","msg"],"cases":[]},{"name":"Column","comment":" ","args":["id","entry","msg"],"cases":[]}],"aliases":[{"name":"Sorter","comment":" ","args":["a"],"type":"Nri.Ui.Table.V7.SortDirection -> a -> a -> Basics.Order"},{"name":"State","comment":" ","args":["id"],"type":"{ column : id, sortDirection : Nri.Ui.Table.V7.SortDirection }"},{"name":"StickyConfig","comment":" How the header will be set up to be sticky.\n\n  - `topOffset` controls how far off the top of the viewport the headers will\n    stick, in pixels. (**Default value:** 0)\n  - `zIndex` controls where in the stacking context the header will end\n    up. Useful to prevent elements in rows from appearing over the header.\n    (**Default value:** 0)\n\nHeaders are never sticky on mobile-sized viewports because doing so causes some\naccessibility issues with zooming and panning.\n\n","args":[],"type":"{ topOffset : Basics.Float, zIndex : Basics.Int, pageBackgroundColor : Css.Color, hoverZIndex : Maybe.Maybe Basics.Int }"}],"values":[{"name":"combineSorters","comment":" ","type":"List.List (Nri.Ui.SortableTable.V4.Sorter entry) -> Nri.Ui.SortableTable.V4.Sorter entry"},{"name":"custom","comment":" ","type":"{ id : id, header : Html.Styled.Html msg, view : entry -> Html.Styled.Html msg, sorter : Maybe.Maybe (Nri.Ui.SortableTable.V4.Sorter entry), width : Basics.Int, cellStyles : entry -> List.List Css.Style } -> Nri.Ui.SortableTable.V4.Column id entry msg"},{"name":"init","comment":" ","type":"id -> Nri.Ui.SortableTable.V4.State id"},{"name":"initDescending","comment":" ","type":"id -> Nri.Ui.SortableTable.V4.State id"},{"name":"invariantSort","comment":" Create a sorter function that always orders the entries in the same order.\nFor example, this is useful when we want to resolve ties and sort the tied\nentries by name, no matter of the sort direction set on the table.\n","type":"(entry -> comparable) -> Nri.Ui.SortableTable.V4.Sorter entry"},{"name":"simpleSort","comment":" Create a simple sorter function that orders entries by mapping a function\nover the collection. It will also reverse it when the sort direction is descending.\n","type":"(entry -> comparable) -> Nri.Ui.SortableTable.V4.Sorter entry"},{"name":"state","comment":" Sort a column. You can get an initial state with `init` or `initDescending`.\nIf you make this sorting interactive, you should store the state in your model\nand provide it to this function instead of recreating it on every update.\n","type":"Nri.Ui.SortableTable.V4.State id -> Nri.Ui.SortableTable.V4.Attribute id msg"},{"name":"stickyHeader","comment":" Make the header sticky (that is, it will stick to the top of the viewport\nwhen it otherwise would have been scrolled off.) You probably will want to set a\nbackground color on the header as well.\n","type":"Nri.Ui.SortableTable.V4.Attribute id msg"},{"name":"stickyHeaderCustom","comment":" Does the same thing as `stickyHeader`, but with adaptations for your\nspecific use.\n","type":"Nri.Ui.SortableTable.V4.StickyConfig -> Nri.Ui.SortableTable.V4.Attribute id msg"},{"name":"string","comment":" ","type":"{ id : id, header : String.String, value : entry -> String.String, width : Basics.Int, cellStyles : entry -> List.List Css.Style } -> Nri.Ui.SortableTable.V4.Column id entry msg"},{"name":"updateMsg","comment":" Add interactivity in sorting columns. When this attribute is provided and\nsorting is enabled, columns will be sortable by clicking the headers.\n","type":"(Nri.Ui.SortableTable.V4.State id -> msg) -> Nri.Ui.SortableTable.V4.Attribute id msg"},{"name":"view","comment":" ","type":"List.List (Nri.Ui.SortableTable.V4.Attribute id msg) -> List.List (Nri.Ui.SortableTable.V4.Column id entry msg) -> List.List entry -> Html.Styled.Html msg"},{"name":"viewLoading","comment":" ","type":"List.List (Nri.Ui.SortableTable.V4.Attribute id msg) -> List.List (Nri.Ui.SortableTable.V4.Column id entry msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Spacing.V1","comment":" Patch changes:\n\n  - added centeredNarrowContentWithSidePadding, narrowCenteredContent\n\n\n## Center a container on the page:\n\n@docs centeredContentWithSidePadding, centeredContent\n@docs centeredQuizEngineContentWithSidePadding, quizEngineCenteredContent\n@docs centeredNarrowContentWithSidePadding, narrowCenteredContent\n@docs centeredContentWithSidePaddingAndCustomWidth, centeredContentWithCustomWidth\n\n\n## Whitespace constants and helpers:\n\n@docs pageTopWhitespace, pageTopWhitespacePx\n@docs pageSideWhitespace, pageSideWhitespacePx\n@docs pageBottomWhitespace, pageBottomWhitespacePx\n\n\n## Deprecated:\n\n@docs verticalSpacerPx, horizontalSpacerPx\n\n","unions":[],"aliases":[],"values":[{"name":"centeredContent","comment":" Center content with a max width of the mobile breakpoint.\n\nThis style does not add side padding on mobile, which means that this can be used for containers that should snap flush to the edges of the mobile viewport.\n\n","type":"Css.Style"},{"name":"centeredContentWithCustomWidth","comment":" Advanced use only: center content up to a custom page width.\n","type":"Css.Px -> Css.Style"},{"name":"centeredContentWithSidePadding","comment":" This is meant to be reusable for any area that:\n\n  - should be centered\n  - on wide viewports, should fill the width of the screen up to a max width of the mobile breakpoint\n  - on narrow viewports, should have standard side padding\n\nIf you have a container that should snap flush to the edges on mobile, this isn't the right style to use.\n\n","type":"Css.Style"},{"name":"centeredContentWithSidePaddingAndCustomWidth","comment":" Advanced use only: center content up to a custom page width, with side padding when narrower.\n","type":"Css.Px -> Css.Style"},{"name":"centeredNarrowContentWithSidePadding","comment":" Use this style on pages with a narrow (500px) breakpoint.\n\nThis is identical to `content`, except that it uses the narrow breakpoint instead of the mobile breakpoint.\n\nIf you have a container that should snap flush to the edges on mobile, this isn't the right style to use.\n\n","type":"Css.Style"},{"name":"centeredQuizEngineContentWithSidePadding","comment":" Use this style on Quiz Engine pages.\n\nThis is identical to `content`, except that it uses the quizEngineMobile breakpoint instead of the mobile breakpoint.\n\nIf you have a container that should snap flush to the edges on mobile, this isn't the right style to use.\n\n","type":"Css.Style"},{"name":"horizontalSpacerPx","comment":" DEPRECATED -- do not use. A future version of noredink-ui will remove.\n","type":"Css.Px"},{"name":"narrowCenteredContent","comment":" Use this style on pages with a narrow (500px) breakpoint.\n\nThis is identical to `centeredContent`, except that it uses the narrow breakpoint instead of the mobile breakpoint.\n\nThis style does not add side padding on mobile, which means that this can be used for containers that should snap flush to the edges of the mobile viewport.\n\n","type":"Css.Style"},{"name":"pageBottomWhitespace","comment":" Convenience for adding the appriopriate amount of whitespace at the end of the page with margin.\n","type":"Css.Style"},{"name":"pageBottomWhitespacePx","comment":" Every page should have 50px of whitespace at the end, so that footers don't end up spanning the middle of the page, and for consistency's sake.\n\nSee [the UI Style Guide and Caveats' Spacing section](https://paper.dropbox.com/doc/UI-Style-Guide-and-Caveats--BobQllelpdS56NBITiRcrO6gAg-PvOLxeX3oyujYEzdJx5pu#:uid=905917270049954035442315&h2=:under-construction:-Spacing) for more details.\n\n","type":"Css.Px"},{"name":"pageSideWhitespace","comment":" Convenience for adding the appriopriate amount of whitespace on the sides of a full-width container on the page or on the page with side padding.\n","type":"Css.Style"},{"name":"pageSideWhitespacePx","comment":" Unless content is flush with the edges of the viewport, there should be 15px of left/right spacing between the content and the viewport edge.\n\nSee [the UI Style Guide and Caveats' Spacing section](https://paper.dropbox.com/doc/UI-Style-Guide-and-Caveats--BobQllelpdS56NBITiRcrO6gAg-PvOLxeX3oyujYEzdJx5pu#:uid=905917270049954035442315&h2=:under-construction:-Spacing) for more details.\n\n","type":"Css.Px"},{"name":"pageTopWhitespace","comment":" Convenience for adding the appriopriate amount of whitespace at the end of the page with margin.\n","type":"Css.Style"},{"name":"pageTopWhitespacePx","comment":" Every page should have 30px of whitespace separating the header nav and the page content, as well as before any secondary headers.\n\nSee [the UI Style Guide and Caveats' Spacing section](https://paper.dropbox.com/doc/UI-Style-Guide-and-Caveats--BobQllelpdS56NBITiRcrO6gAg-PvOLxeX3oyujYEzdJx5pu#:uid=905917270049954035442315&h2=:under-construction:-Spacing) for more details.\n\n","type":"Css.Px"},{"name":"quizEngineCenteredContent","comment":" Use this style on Quiz Engine pages.\n\nThis is identical to `centeredContent`, except that it uses the quizEngineMobile breakpoint instead of the mobile breakpoint.\n\nThis style does not add side padding on mobile, which means that this can be used for containers that should snap flush to the edges of the mobile viewport.\n\n","type":"Css.Style"},{"name":"verticalSpacerPx","comment":" DEPRECATED -- do not use. A future version of noredink-ui will remove.\n","type":"Css.Px"}],"binops":[]},{"name":"Nri.Ui.Sprite.V1","comment":"\n\n@docs Sprite, attach\n@docs SpriteId, use, spriteIdToString\n@docs bold, italic, underline, list, link, undo, redo\n\n","unions":[{"name":"Sprite","comment":" ","args":[],"cases":[]},{"name":"SpriteId","comment":" ","args":[],"cases":[]}],"aliases":[],"values":[{"name":"attach","comment":" Sprites _must_ be attached to the page for them to be usable!\n\nIf your icons are missing, please make sure you're using this HTML in your view!\n\n","type":"Accessibility.Styled.Html Basics.Never"},{"name":"bold","comment":"\n\n    svg [] [ Sprite.use Sprite.bold ]\n\n","type":"Nri.Ui.Sprite.V1.SpriteId"},{"name":"italic","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId"},{"name":"link","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId"},{"name":"list","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId"},{"name":"redo","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId"},{"name":"spriteIdToString","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId -> String.String"},{"name":"underline","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId"},{"name":"undo","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId"},{"name":"use","comment":" ","type":"Nri.Ui.Sprite.V1.SpriteId -> Svg.Styled.Svg msg"}],"binops":[]},{"name":"Nri.Ui.Svg.V1","comment":"\n\n@docs Svg\n@docs withColor, withLabel, withWidth, withHeight, withCss, withCustom, withViewBox\n@docs init, toHtml\n\n","unions":[{"name":"Svg","comment":" Opaque type describing a non-interactable Html element.\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"init","comment":" Pass through the viewbox as the first argument and the contents of the svg node as the second argument.\n","type":"String.String -> List.List (Svg.Styled.Svg Basics.Never) -> Nri.Ui.Svg.V1.Svg"},{"name":"toHtml","comment":" render an svg.\n","type":"Nri.Ui.Svg.V1.Svg -> Svg.Styled.Svg msg"},{"name":"withColor","comment":" ","type":"Css.Color -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"},{"name":"withCss","comment":" Css for the SVG's container.\n","type":"List.List Css.Style -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"},{"name":"withCustom","comment":" ","type":"List.List (Svg.Styled.Attribute Basics.Never) -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"},{"name":"withHeight","comment":" ","type":"Css.Px -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"},{"name":"withLabel","comment":" Add a title to the svg. Note that when the label is _not_ present, the icon will be entirely hidden from screenreader users.\n\nRead [Carie Fisher's \"Accessible Svgs\"](https://www.smashingmagazine.com/2021/05/accessible-svg-patterns-comparison/) article to learn more about accessible svgs.\n\nGo through the [WCAG images tutorial](https://www.w3.org/WAI/tutorials/images/) to learn more about identifying when images are functional or decorative or something else.\n\n","type":"String.String -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"},{"name":"withViewBox","comment":" ","type":"String.String -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"},{"name":"withWidth","comment":" ","type":"Css.Px -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.Switch.V3","comment":"\n\n\n### Changes from V2:\n\n    - Replace underlying checkbox input with a custom implementation\n    - Allow attributes that produce msgs to be passed through\n\n@docs view\n\n\n### Attributes\n\n@docs Attribute\n@docs selected\n@docs containerCss, labelCss, custom, nriDescription, testId\n@docs onSwitch, disabled\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"containerCss","comment":" Adds CSS to the Switch container.\n","type":"List.List Css.Style -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"custom","comment":" Pass custom attributes through to be attached to the underlying input.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use `containerCss` or `labelCss`.\n\n","type":"List.List (Html.Styled.Attribute msg) -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"disabled","comment":" Explicitly specify that you want this switch to be disabled. If you don't\nspecify `onSwitch`, this is the default, but it's provided so you don't have\nto resort to `filterMap` or similar to build a clean list of attributes.\n","type":"Basics.Bool -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"labelCss","comment":" Adds CSS to the element containing the label text.\n\nNote that these styles don't apply to the literal HTML label element, since it contains the icon SVG as well.\n\n","type":"List.List Css.Style -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"onSwitch","comment":" Specify what happens when the switch is toggled.\n","type":"(Basics.Bool -> msg) -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"selected","comment":" What is the status of the Switch, selected or not?\n","type":"Basics.Bool -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Switch.V3.Attribute msg"},{"name":"view","comment":" Render a switch. The boolean here indicates whether the switch is on\nor not.\n","type":"{ label : String.String, id : String.String } -> List.List (Nri.Ui.Switch.V3.Attribute msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Table.V7","comment":" Upgrading from V6:\n\n  - If you don't have extra styles for the table, add an empty list to calls\n    to `view`.\n  - Consider moving to `SortableTable`, as in V4 a non-interactive table renders\n    just the same but has additional flexibility in the API and will make future\n    upgrades easier.\n\n@docs Column, SortDirection, custom, string, rowHeader\n\n@docs view, viewWithoutHeader\n\n@docs viewLoading, viewLoadingWithoutHeader\n\n","unions":[{"name":"Column","comment":" Closed representation of how to render the header and cells of a column\nin the table\n","args":["data","msg"],"cases":[]},{"name":"SortDirection","comment":" Which direction is a table column sorted? Only set these on columns that\nactually have an explicit sort!\n","args":[],"cases":[["Ascending",[]],["Descending",[]]]}],"aliases":[],"values":[{"name":"custom","comment":" A column that renders however you want it to\n","type":"{ header : Html.Styled.Html msg, view : data -> Html.Styled.Html msg, width : Css.LengthOrAuto compatible, cellStyles : data -> List.List Css.Style, sort : Maybe.Maybe Nri.Ui.Table.V7.SortDirection } -> Nri.Ui.Table.V7.Column data msg"},{"name":"rowHeader","comment":" A column whose cells are row headers\n","type":"{ header : Html.Styled.Html msg, view : data -> Html.Styled.Html msg, width : Css.LengthOrAuto compatible, cellStyles : data -> List.List Css.Style, sort : Maybe.Maybe Nri.Ui.Table.V7.SortDirection } -> Nri.Ui.Table.V7.Column data msg"},{"name":"string","comment":" A column that renders some aspect of a value as text\n","type":"{ header : String.String, value : data -> String.String, width : Css.LengthOrAuto compatible, cellStyles : data -> List.List Css.Style, sort : Maybe.Maybe Nri.Ui.Table.V7.SortDirection } -> Nri.Ui.Table.V7.Column data msg"},{"name":"view","comment":" Displays a table of data based on the provided column definitions\n","type":"List.List Css.Style -> List.List (Nri.Ui.Table.V7.Column data msg) -> List.List data -> Html.Styled.Html msg"},{"name":"viewLoading","comment":" Display a table with the given columns but instead of data, show blocked\nout text with an interesting animation. This view lets the user know that\ndata is on its way and what it will look like when it arrives.\n","type":"List.List Css.Style -> List.List (Nri.Ui.Table.V7.Column data msg) -> Html.Styled.Html msg"},{"name":"viewLoadingWithoutHeader","comment":" Display the loading table without a header row\n","type":"List.List Css.Style -> List.List (Nri.Ui.Table.V7.Column data msg) -> Html.Styled.Html msg"},{"name":"viewWithoutHeader","comment":" Displays a table of data without a header row\n","type":"List.List Css.Style -> List.List (Nri.Ui.Table.V7.Column data msg) -> List.List data -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Tabs.V6","comment":" Changes from V5:\n\n  - Uses TabsInternal under the hood\n  - Allows user to focus on the selected tabpanel\n\n@docs view\n@docs Alignment\n@docs Tab, viewTabDefault\n\n","unions":[{"name":"Alignment","comment":" Determines whether tabs are centered or floating to the left or right.\n","args":[],"cases":[["Left",[]],["Center",[]],["Right",[]]]}],"aliases":[{"name":"Tab","comment":" ","args":["id","msg"],"type":"{ id : id, idString : String.String, tabView : Html.Styled.Html msg, panelView : Html.Styled.Html msg, spaHref : Maybe.Maybe String.String }"}],"values":[{"name":"view","comment":" ","type":"{ title : Maybe.Maybe String.String, alignment : Nri.Ui.Tabs.V6.Alignment, customSpacing : Maybe.Maybe Basics.Float, onSelect : id -> msg, onFocus : String.String -> msg, selected : id, tabs : List.List (Nri.Ui.Tabs.V6.Tab id msg) } -> Html.Styled.Html msg"},{"name":"viewTabDefault","comment":" ","type":"String.String -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Tabs.V8","comment":" Changes from V7:\n\n  - Uses an HTML-like API\n  - Adds sticky positioning\n  - Adds background color in the tab list (for use with sticky positioning)\n  - Adds the ability to make the background of the active tab fade into the background of the panel below it\n  - Adds an `data-nri-description='Nri-Ui__tabs'` attribute to the tabs container\n\n\n### Attributes\n\n@docs Attribute, title, spacing\n@docs Alignment, alignment\n@docs pageBackgroundColor\n@docs tabListSticky, TabListStickyConfig, tabListStickyCustom\n@docs view\n\n\n### Tabs\n\n@docs Tab, TabAttribute, build\n@docs tabString, tabHtml, withTooltip, labelledBy, describedBy\n@docs panelHtml\n@docs spaHref\n\n","unions":[{"name":"Alignment","comment":" Determines whether tabs are centered or floating to the left or right.\n","args":[],"cases":[["Left",[]],["Center",[]],["Right",[]]]},{"name":"Attribute","comment":" Ways to adapt the appearance of the tabs to your application.\n","args":["id","msg"],"cases":[]},{"name":"Tab","comment":" ","args":["id","msg"],"cases":[]},{"name":"TabAttribute","comment":" ","args":["id","msg"],"cases":[]}],"aliases":[{"name":"TabListStickyConfig","comment":" Configure how the top bar is sticky.\n\n  - `topOffset` controls how far from the top of the viewport the bar will\n    stick, in pixels. Content will be visible below this offset in the z-order.\n    (**Default value:** 0)\n  - `topPadding` controls how far from the top of the viewport the bar will\n    be padded. Unlike `topOffset`, content will _not_ be visible behind the\n    padding. Be aware that this padding will add space in the DOM even when the\n    bar is not sticky. (**Default value:** 0)\n  - `zIndex` controls how high up the z-order the bar will float. (**Default\n    value:** 0)\n\n","args":[],"type":"{ topOffset : Basics.Float, topPadding : Basics.Float, zIndex : Basics.Int }"}],"values":[{"name":"alignment","comment":" Set the alignment of the tab list.\n","type":"Nri.Ui.Tabs.V8.Alignment -> Nri.Ui.Tabs.V8.Attribute id msg"},{"name":"build","comment":" ","type":"{ id : id, idString : String.String } -> List.List (Nri.Ui.Tabs.V8.TabAttribute id msg) -> Nri.Ui.Tabs.V8.Tab id msg"},{"name":"describedBy","comment":" Like [`labelledBy`](#labelledBy), but it describes the given element\ninstead of labeling it.\n\nThis attribute can be used multiple times if more than one element describes\nthis tab.\n\n","type":"String.String -> Nri.Ui.Tabs.V8.TabAttribute id msg"},{"name":"labelledBy","comment":" Sets an overriding labelledBy on the tab for an external tooltip.\nThis assumes an external tooltip is set and disables any internal tooltip configured.\n","type":"String.String -> Nri.Ui.Tabs.V8.TabAttribute id msg"},{"name":"pageBackgroundColor","comment":" Tell this tab list about the background color of the page it lievs on.\n\nYou may want to use this if, for example:\n\n  - you are setting up sticky headers, to prevent page content from showing\n    through the background.\n\n  - you are using tabs in a page that has non-white background, so the\n    background of the active tab fades into the panel below it.\n\n","type":"Css.Color -> Nri.Ui.Tabs.V8.Attribute id msg"},{"name":"panelHtml","comment":" ","type":"Html.Styled.Html msg -> Nri.Ui.Tabs.V8.TabAttribute id msg"},{"name":"spaHref","comment":" ","type":"String.String -> Nri.Ui.Tabs.V8.TabAttribute id msg"},{"name":"spacing","comment":" Set the spacing between tabs in the tab list.\n","type":"Basics.Float -> Nri.Ui.Tabs.V8.Attribute id msg"},{"name":"tabHtml","comment":" ","type":"Html.Styled.Html Basics.Never -> Nri.Ui.Tabs.V8.TabAttribute id msg"},{"name":"tabListSticky","comment":" Make the tab list sticky. You probably want to set an explicit background\ncolor along with this!\n","type":"Nri.Ui.Tabs.V8.Attribute id msg"},{"name":"tabListStickyCustom","comment":" Make the tab list sticky, overriding the default behavior. You should\nprobably set an explicit background color along with this.\n","type":"Nri.Ui.Tabs.V8.TabListStickyConfig -> Nri.Ui.Tabs.V8.Attribute id msg"},{"name":"tabString","comment":" ","type":"String.String -> Nri.Ui.Tabs.V8.TabAttribute id msg"},{"name":"title","comment":" Set a title in the tab list.\n","type":"String.String -> Nri.Ui.Tabs.V8.Attribute id msg"},{"name":"view","comment":" ","type":"{ focusAndSelect : { select : id, focus : Maybe.Maybe String.String } -> msg, selected : id } -> List.List (Nri.Ui.Tabs.V8.Attribute id msg) -> List.List (Nri.Ui.Tabs.V8.Tab id msg) -> Html.Styled.Html msg"},{"name":"withTooltip","comment":" Tooltip defaults: `[Tooltip.smallPadding, Tooltip.onBottom, Tooltip.fitToContent]`\n","type":"List.List (Nri.Ui.Tooltip.V3.Attribute msg) -> Nri.Ui.Tabs.V8.TabAttribute id msg"}],"binops":[]},{"name":"Nri.Ui.TabsMinimal.V1","comment":" This forks Nri.Ui.Tabs.V8\n\n@docs view\n\n\n### Tabs\n\n@docs Tab, TabAttribute, build\n@docs tabString, tabHtml\n@docs panelHtml\n@docs spaHref\n\n","unions":[{"name":"Tab","comment":" ","args":["id","msg"],"cases":[]},{"name":"TabAttribute","comment":" ","args":["id","msg"],"cases":[]}],"aliases":[],"values":[{"name":"build","comment":" ","type":"{ id : id, idString : String.String } -> List.List (Nri.Ui.TabsMinimal.V1.TabAttribute id msg) -> Nri.Ui.TabsMinimal.V1.Tab id msg"},{"name":"panelHtml","comment":" ","type":"Html.Styled.Html msg -> Nri.Ui.TabsMinimal.V1.TabAttribute id msg"},{"name":"spaHref","comment":" ","type":"String.String -> Nri.Ui.TabsMinimal.V1.TabAttribute id msg"},{"name":"tabHtml","comment":" ","type":"Html.Styled.Html Basics.Never -> Nri.Ui.TabsMinimal.V1.TabAttribute id msg"},{"name":"tabString","comment":" ","type":"String.String -> Nri.Ui.TabsMinimal.V1.TabAttribute id msg"},{"name":"view","comment":" ","type":"{ focusAndSelect : { select : id, focus : Maybe.Maybe String.String } -> msg, selected : id } -> List.List (Nri.Ui.TabsMinimal.V1.Tab id msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Text.V6","comment":" Patch changes:\n\n  - use internal `Content` module\n\nChanges from V5:\n\n  - adds helpers: `custom`, `nriDescription`,`testId`,`id`\n  - instead of view helpers that take HTML, offer attribute helpers supporting plaintext, markdown, and html content\n  - :skull: remove noWidow, which is not used\n  - noBreak now takes a bool\n\n\n## Understanding spacing\n\n  - All text styles have a specific line-height. This is set so that when text in the given style\n    is long enough to wrap, the spacing between wrapped lines looks good.\n  - No text styles have padding.\n  - **Paragraph styles** only have bottom margin, but with **:last-child bottom margin set to zero**.\n    This bottom margin is set to look good when multiple paragraphs of the same style follow one another.\n      - If you want content after the paragraph and don't want the margin, put the paragraph in a `div` so that it will be the last-child, which will get rid of the bottom margin.\n  - **User-authored content blocks** preserve line breaks and do not have margin.\n\n\n## Headings\n\nYou're in the wrong place! Headings live in Nri.Ui.Heading.V3.\n\n\n## Paragraph styles\n\n@docs caption, mediumBody, mediumBodyGray, smallBody, smallBodyGray\n@docs footnote\n\n\n## User-authored content blocks:\n\n@docs ugMediumBody, ugSmallBody\n\n\n# Content\n\n@docs plaintext, markdown, html\n\n\n## Customizations\n\n@docs Attribute, noBreak, css, id, custom\n@docs nriDescription, testId\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"caption","comment":" This is a little note or caption.\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"css","comment":" Add some custom CSS to the text. If you find yourself using this a lot,\nplease add a stricter attribute to noredink-ui!\n","type":"List.List Css.Style -> Nri.Ui.Text.V6.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Text.V6.Attribute msg"},{"name":"footnote","comment":" This is a little note or footnote. Please be aware that under the hood, this is only a paragraph tag. If you're actually citing a resource, wrap this in the [`cite` HTML element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite).\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"html","comment":" Provide a list of custom HTML.\n","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Text.V6.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Text.V6.Attribute msg"},{"name":"markdown","comment":" Provide a string that will be rendered as markdown.\n","type":"String.String -> Nri.Ui.Text.V6.Attribute msg"},{"name":"mediumBody","comment":" This is some medium body copy.\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"mediumBodyGray","comment":" `mediumBody`, but with a lighter gray color than the default.\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"noBreak","comment":" Pass True to prevent text from ever wrapping.\n\nThe default Text behavior is `noBreak False`, which means content will wrap.\n\n","type":"Basics.Bool -> Nri.Ui.Text.V6.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Text.V6.Attribute msg"},{"name":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> Nri.Ui.Text.V6.Attribute msg"},{"name":"smallBody","comment":" This is some small body copy.\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"smallBodyGray","comment":" This is some small body copy but it's gray.\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Text.V6.Attribute msg"},{"name":"ugMediumBody","comment":" User-generated text.\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"ugSmallBody","comment":" User-generated text.\n","type":"List.List (Nri.Ui.Text.V6.Attribute msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Text.Writing.V1","comment":" DEPRECATED: use Nri.Ui.Text.V\\*.footnote instead.\n\n@docs footnote\n\n","unions":[],"aliases":[],"values":[{"name":"footnote","comment":" This is a little note or footnote.\n","type":"List.List (Html.Styled.Html msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.TextArea.V5","comment":"\n\n\n## Changelog\n\n\n### Patch changes\n\n  - No longer defaults the placeholder value to the label text\n  - Adjust disabled styles\n  - Fix initial autoresize not working in Firefox\n\n\n### Changes from V4\n\n  - Removes contentCreation view styles\n  - Changes to a list-based API\n  - Adds guidance and errorMessage support\n  - Adds id, custom, nriDescription, testId, css, and noMargin\n  - Adds disabled support\n  - Adds onFocus\n\n\n## The next version of TextArea should:\n\n  - update the disabled styles\n\n\n## Upgrading to V4\n\n  - Adds field for onBlur\n\n\n## The Nri Component-Catalog-specified textarea with overlapping label\n\n\n## Creating New Versions\n\nWhen upgrading this module, we need to make sure to also include a new\ncustom element, or else autosizing will break! This means doing the following:\n\n1.  Creating a new module in `lib/TextArea`\n2.  Requiring that module in `lib/index.js`\n\n\n## API\n\n@docs view, generateId\n@docs Attribute\n@docs value\n\n\n### Event handlers\n\n@docs onInput, onBlur, onFocus\n\n\n### Visual behavior\n\n@docs hiddenLabel, visibleLabel\n@docs css, noMargin\n@docs standard, writing\n@docs autoResize, autoResizeSingleLine\n\n\n### Other\n\n@docs custom, nriDescription, id, testId\n@docs placeholder, autofocus\n@docs disabled, errorIf, errorMessage, guidance, guidanceHtml\n\n","unions":[{"name":"Attribute","comment":" Customizations for the TextArea.\n","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"autoResize","comment":" ","type":"Nri.Ui.TextArea.V5.Attribute msg"},{"name":"autoResizeSingleLine","comment":" ","type":"Nri.Ui.TextArea.V5.Attribute msg"},{"name":"autofocus","comment":" Sets the `autofocus` attribute of the textarea to true.\n","type":"Nri.Ui.TextArea.V5.Attribute msg"},{"name":"css","comment":" Adds CSS to the element containing the textarea.\n","type":"List.List Css.Style -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute Basics.Never) -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"disabled","comment":" This disables the textarea.\n","type":"Nri.Ui.TextArea.V5.Attribute msg"},{"name":"errorIf","comment":" Sets whether or not the field will be highlighted as having a validation error.\n","type":"Basics.Bool -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"errorMessage","comment":" If `Just`, the field will be highlighted as having a validation error,\nand the given error message will be shown.\n","type":"Maybe.Maybe String.String -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"generateId","comment":" ","type":"String.String -> String.String"},{"name":"guidance","comment":" A guidance message shows below the input, unless an error message is showing instead.\n","type":"String.String -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"guidanceHtml","comment":" A guidance message (HTML) shows below the input, unless an error message is showing instead.\n","type":"List.List (Html.Styled.Html msg) -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"hiddenLabel","comment":" Hides the visible label. (There will still be an invisible label for screen readers.)\n","type":"Nri.Ui.TextArea.V5.Attribute msg"},{"name":"id","comment":" Set a custom ID for this text area. If you don't set the id explicitly,\nwe'll automatically generate one from the label you pass in, but this can\ncause problems if you have more than one textarea with the same label on\nthe page. Use this to be more specific and avoid issues with duplicate IDs.\n","type":"String.String -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"noMargin","comment":" Remove default spacing from the Input.\n","type":"Basics.Bool -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"onBlur","comment":" Produce the given `msg` when the field is blurred.\n","type":"msg -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"onFocus","comment":" Produce the given `msg` when the field is focused.\n","type":"msg -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"onInput","comment":" Produce the given `msg` when the input is changed.\n","type":"(String.String -> msg) -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"placeholder","comment":" ","type":"String.String -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"standard","comment":" Use the Standard theme for the TextArea. This is the default.\n","type":"Nri.Ui.TextArea.V5.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"value","comment":" ","type":"String.String -> Nri.Ui.TextArea.V5.Attribute msg"},{"name":"view","comment":" ","type":"String.String -> List.List (Nri.Ui.TextArea.V5.Attribute msg) -> Html.Styled.Html msg"},{"name":"visibleLabel","comment":" Default behavior.\n","type":"Nri.Ui.TextArea.V5.Attribute msg"},{"name":"writing","comment":" Use the Writing theme for the TextArea.\n","type":"Nri.Ui.TextArea.V5.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.TextInput.V8","comment":"\n\n\n# Changes from V7\n\n  - add `visibilityToggleId` to password inputs to enable blurring and refocusing on the toggle button, ensuring that screen readers announce the label change.\n\n@docs view, generateId\n\n\n### Input types\n\n@docs number, float, text, newPassword, currentPassword, email, search, addressLevel2, addressLine1, countryName, familyName, givenName, username, organization, organizationTitle, postalCode, sex, tel, date, datetime\n@docs readOnlyText\n\n\n### Input content\n\n@docs value, map\n\n\n### Event handlers\n\n@docs onFocus, onBlur, onEnter\n\n\n### Attributes\n\n@docs Attribute, placeholder, autofocus\n@docs hiddenLabel, visibleLabel\n@docs css, custom, nriDescription, id, testId, noMargin\n@docs disabled, loading, errorIf, errorMessage, guidance, guidanceHtml\n@docs writing\n\n","unions":[{"name":"Attribute","comment":" Customizations for the TextInput.\n","args":["value","msg"],"cases":[]}],"aliases":[],"values":[{"name":"addressLevel2","comment":" An input that allows address-level2 entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"addressLine1","comment":" An input that allows address-line1 entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"autofocus","comment":" Sets the `autofocus` attribute of the resulting HTML input.\n","type":"Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"countryName","comment":" An input that allows country-name entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"css","comment":" Adds CSS to the element containing the input.\n\nIf you want to customize colors, borders, font sizes, etc, you should instead add to the TextInput API\nto support what you need.\n\n","type":"List.List Css.Style -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"currentPassword","comment":" An input that allows password entry with autocomplete value \"current-password\"\n\nIf the user types at least one character into the input box, a\nfloating control \"Show password\" will appear. When clicked, the\ninput type will change from \"password\" to \"text\", in order\nto enable the user to check what they've typed.\n\n","type":"{ onInput : String.String -> msg, showPassword : Basics.Bool, setShowPassword : Basics.Bool -> msg, visibilityToggleId : String.String } -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Html.Styled.Attribute Basics.Never) -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"date","comment":" An input that allows date entry. The date is represented as a `Maybe Time.Posix`\nvalue, where `Nothing` represents an empty date field. The date is formatted as\nan ISO8601 date string, with the time portion removed.\n\nFormat for a date input field is `YYYY-MM-DD`. Iso8601.fromTime generates a string in\nthe format `YYYY-MM-DDThh:mmZ` so we slice to only use the first 10 characters.\n\n","type":"(Maybe.Maybe Time.Posix -> msg) -> Nri.Ui.TextInput.V8.Attribute (Maybe.Maybe Time.Posix) msg"},{"name":"datetime","comment":" An input that allows datetime entry. The datetime is represented as a `Maybe Time.Posix`\nvalue, where `Nothing` represents an empty datetime field. The datetime is formatted as\nan ISO8601 datetime string, with the time zone removed.\n\nFormat for a datetime input field value should be `YYYY-MM-DDThh:mm`.\nFrom [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#value):\n\n> There are several methods provided by JavaScript's Date that can be used to convert numeric\n> date information into a properly-formatted string. For example, the Date.toISOString() method\n> returns the date/time in UTC with the suffix \"Z\" denoting that timezone; removing the \"Z\" would\n> provide a value in the format expected by a datetime-local input.\n\nIso8601.fromTime generates the same string as Date.toISOString, so we need to drop the \"Z\" suffix.\n\n","type":"(Maybe.Maybe Time.Posix -> msg) -> Nri.Ui.TextInput.V8.Attribute (Maybe.Maybe Time.Posix) msg"},{"name":"disabled","comment":" This disables the input\n","type":"Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"email","comment":" An input that is optimized for email entry\n\nNOTE: this uses `inputmode=\"email\"` so that mobile devices will use the email keyboard,\nbut not `type=\"email\"` because that would enable browser-provided validation which is inconsistent and at odds\nwith our validation UI.\n\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"errorIf","comment":" Sets whether or not the field will be highlighted as having a validation error.\n","type":"Basics.Bool -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"errorMessage","comment":" If `Just`, the field will be highlighted as having a validation error,\nand the given error message will be shown.\n","type":"Maybe.Maybe String.String -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"familyName","comment":" An input that allows family-name entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"float","comment":" An input that allows float entry\n","type":"(Maybe.Maybe Basics.Float -> msg) -> Nri.Ui.TextInput.V8.Attribute (Maybe.Maybe Basics.Float) msg"},{"name":"generateId","comment":" Gives you the default DOM element id that will be used by a `TextInput.view` with the given label.\nThis is for use when you need the DOM element id for use in javascript (such as trigger an event to focus a particular text input)\n","type":"String.String -> String.String"},{"name":"givenName","comment":" An input that allows given-name entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"guidance","comment":" A guidance message shows below the input, unless an error message is showing instead.\n","type":"String.String -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"guidanceHtml","comment":" A guidance message (HTML) shows below the input, unless an error message is showing instead.\n","type":"List.List (Html.Styled.Html msg) -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"hiddenLabel","comment":" Hides the visible label. (There will still be an invisible label for screen readers.)\n","type":"Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"id","comment":" Set a custom ID for this text input and label. If you don't set this,\nwe'll automatically generate one from the label you pass in, but this can\ncause problems if you have more than one text input with the same label on\nthe page. Use this to be more specific and avoid issues with duplicate IDs!\n","type":"String.String -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"loading","comment":" Use this while the form the input is a part of is being submitted.\n","type":"Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"map","comment":" ","type":"(a -> b) -> (b -> String.String) -> Nri.Ui.TextInput.V8.Attribute a msg -> Nri.Ui.TextInput.V8.Attribute b msg"},{"name":"newPassword","comment":" An input that allows password entry with autocomplete value \"new-password\"\n\nIf the user types at least one character into the input box, a\nfloating control \"Show password\" will appear. When clicked, the\ninput type will change from \"password\" to \"text\", in order\nto enable the user to check what they've typed.\n\n","type":"{ onInput : String.String -> msg, showPassword : Basics.Bool, setShowPassword : Basics.Bool -> msg, visibilityToggleId : String.String } -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"noMargin","comment":" Remove default spacing from the Input.\n","type":"Basics.Bool -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"number","comment":" An input that allows integer entry\n","type":"(Maybe.Maybe Basics.Int -> msg) -> Nri.Ui.TextInput.V8.Attribute (Maybe.Maybe Basics.Int) msg"},{"name":"onBlur","comment":" Causes the TextInput to produce the given `msg` when the field is blurred.\n","type":"msg -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"onEnter","comment":" ","type":"msg -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"onFocus","comment":" Causes the TextInput to produce the given `msg` when the field is focused.\n","type":"msg -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"organization","comment":" An input that allows organization entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"organizationTitle","comment":" An input that allows organization-title entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"placeholder","comment":" ","type":"String.String -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"postalCode","comment":" An input that allows postal-code entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"readOnlyText","comment":" A read-only input for text values\n","type":"Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"search","comment":" An input with [\"search\" type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/search) specified.\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"sex","comment":" An input that allows sex entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"tel","comment":" An input that allows tel entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"text","comment":" An input that allows text entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"username","comment":" An input that allows username entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V8.Attribute String.String msg"},{"name":"value","comment":" ","type":"value -> Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"view","comment":" Render the TextInput as HTML.\n","type":"String.String -> List.List (Nri.Ui.TextInput.V8.Attribute value msg) -> Html.Styled.Html msg"},{"name":"visibleLabel","comment":" Default behavior.\n","type":"Nri.Ui.TextInput.V8.Attribute value msg"},{"name":"writing","comment":" Uses the \"Writing\" input style.\n","type":"Nri.Ui.TextInput.V8.Attribute value msg"}],"binops":[]},{"name":"Nri.Ui.Tooltip.V3","comment":" Patch changes:\n\n  - defaults mobile-specific alignment and direction to the non-mobile version, rather than top and middle\n  - adds onTopForQuizEngineMobile, onBottomForQuizEngineMobile, onLeftForQuizEngineMobile, onRightForQuizEngineMobile\n  - adds onTopForNarrowMobile, onBottomForNarrowMobile, onLeftForNarrowMobile, onRightForNarrowMobile\n  - adds alignStartForQuizEngineMobile, alignMiddleForQuizEngineMobile, alignEndForQuizEngineMobile\n  - adds alignStartForNarrowMobile, alignMiddleForNarrowMobile, alignEndForNarrowMobile\n  - adds narrowMobileCss\n  - use internal `Content` module\n  - adds `paragraph` and `markdown` support\n  - add partially-transparent white border around tooltips\n  - Use Nri.Ui.WhenFocusLeaves.V2\n  - prevent default and stop propagation on click for disclosure tooltips\n  - adds `helpfullyDisabled` option\n  - adds `onTriggerKeyDown` option\n  - add `stopTooltipMousePropagation` option\n\nChanges from V2:\n\n  - Support `disclosure` pattern for rich-content tooltips\n  - render tooltip content in the DOM when closed (now, they're hidden with display:none)\n  - tooltips MUST be closable via keyboard without moving focus. [Understanding Success Criterion 1.4.13: Content on Hover or Focus](https://www.w3.org/WAI/WCAG21/Understanding/content-on-hover-or-focus.html)\n  - remove onClick helper\n  - prefer the accessible name to using aria-labelledby and aria-label together\n  - :skull: remove customTooltipAttributes\n  - change `css` to extend the current list of styles, NOT override them entirely.\n  - fix spelling of \"auxillary\" to \"auxiliary\"\n  - toggleTip -> viewToggleTip\n  - Adds notMobileCss, mobileCss, quizEngineMobileCss\n  - onHover -> onToggle\n\nThese tooltips aim to follow the accessibility recommendations from:\n\n  - <https://inclusive-components.design/tooltips-toggletips>\n  - <https://sarahmhigley.com/writing/tooltips-in-wcag-21/>\n\n@docs view, viewToggleTip\n@docs Attribute\n@docs paragraph, plaintext, markdown, html\n@docs withoutTail\n\n@docs onTop, onBottom, onLeft, onRight\n@docs onTopForQuizEngineMobile, onBottomForQuizEngineMobile, onLeftForQuizEngineMobile, onRightForQuizEngineMobile\n@docs onTopForNarrowMobile, onBottomForNarrowMobile, onLeftForNarrowMobile, onRightForNarrowMobile\n@docs onTopForMobile, onBottomForMobile, onLeftForMobile, onRightForMobile\n\n@docs alignStart, alignMiddle, alignEnd\n@docs alignStartForQuizEngineMobile, alignMiddleForQuizEngineMobile, alignEndForQuizEngineMobile\n@docs alignStartForNarrowMobile, alignMiddleForNarrowMobile, alignEndForNarrowMobile\n@docs alignStartForMobile, alignMiddleForMobile, alignEndForMobile\n\n@docs exactWidth, fitToContent\n@docs smallPadding, normalPadding, customPadding\n@docs onToggle, onTriggerKeyDown, stopTooltipMousePropagation\n@docs open\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss, narrowMobileCss, containerCss\n@docs custom\n@docs nriDescription, testId\n@docs primaryLabel, auxiliaryDescription, helpfullyDisabled, disclosure\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"alignEnd","comment":" Put the tail at the \"end\" of the tooltip.\nFor onTop & onBottom tooltips, this means \"right\".\nFor onLeft & onRight tooltip, this means \"bottom\".\n\n     __________\n    |______  _|\n           \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignEndForMobile","comment":" Put the tail at the \"end\" of the tooltip when the viewport has a mobile width.\nFor onTop & onBottom tooltips, this means \"right\".\nFor onLeft & onRight tooltip, this means \"bottom\".\n\n     __________\n    |______  _|\n           \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignEndForNarrowMobile","comment":" Put the tail at the \"end\" of the tooltip when the viewport has a narrow mobile (500px) width or narrower.\nFor onTop & onBottom tooltips, this means \"right\".\nFor onLeft & onRight tooltip, this means \"bottom\".\n\n     __________\n    |______  _|\n           \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignEndForQuizEngineMobile","comment":" Put the tail at the \"end\" of the tooltip when the viewport has a quiz engine mobile (750px) width or narrower.\nFor onTop & onBottom tooltips, this means \"right\".\nFor onLeft & onRight tooltip, this means \"bottom\".\n\n     __________\n    |______  _|\n           \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignMiddle","comment":" Put the tail at the \"middle\" of the tooltip. This is the default behavior.\n\n     __________\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignMiddleForMobile","comment":" Put the tail at the \"middle\" of the tooltip when the viewport has a mobile width.\n\n     __________\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignMiddleForNarrowMobile","comment":" Put the tail at the \"middle\" of the tooltip when the viewport has a narrow mobile (500px) width or narrower.\n\n     __________\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignMiddleForQuizEngineMobile","comment":" Put the tail at the \"middle\" of the tooltip when the viewport has a quiz engine mobile (750px) width or narrower.\n\n     __________\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignStart","comment":" Put the tail at the \"start\" of the tooltip.\nFor onTop & onBottom tooltips, this means \"left\".\nFor onLeft & onRight tooltip, this means \"top\".\n\n     __________\n    |_  ______|\n      \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignStartForMobile","comment":" Put the tail at the \"start\" of the tooltip when the viewport has a mobile width.\nFor onTop & onBottom tooltips, this means \"left\".\nFor onLeft & onRight tooltip, this means \"top\".\n\n     __________\n    |_  ______|\n      \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignStartForNarrowMobile","comment":" Put the tail at the \"start\" of the tooltip when the viewport has a narrow mobile (500px) width or narrower.\nFor onTop & onBottom tooltips, this means \"left\".\nFor onLeft & onRight tooltip, this means \"top\".\n\n     __________\n    |_  ______|\n      \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"alignStartForQuizEngineMobile","comment":" Put the tail at the \"start\" of the tooltip when the viewport has a quiz engine mobile (750px) width or narrower.\nFor onTop & onBottom tooltips, this means \"left\".\nFor onLeft & onRight tooltip, this means \"top\".\n\n     __________\n    |_  ______|\n      \\/\n\n","type":"Css.Px -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"auxiliaryDescription","comment":" Used when the content of the tooltip provides an \"auxiliary description\" for its content.\n\nAn auxiliary description is used when the tooltip content provides supplementary information about its trigger content.\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"css","comment":" Set some custom styles on the tooltip.\n","type":"List.List Css.Style -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"custom","comment":" Use this helper to add custom attributes.\n\nDo NOT use this helper to add css styles, as they may not be applied the way\nyou want/expect if underlying styles change.\nInstead, please use the `css` helper.\n\n","type":"List.List (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"customPadding","comment":" Pass in the desired spacing around the edge of the tooltip (pixels).\n","type":"Basics.Float -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"disclosure","comment":" Sometimes a \"tooltip\" only _looks_ like a tooltip, but is really more about hiding and showing extra information when the user asks for it.\n\nIf clicking the \"tooltip trigger\" only ever shows you more info (and especially if this info is rich or interactable), use this attribute.\n\nFor more information, please read [Sarah Higley's \"Tooltips in the time of WCAG 2.1\" post](https://sarahmhigley.com/writing/tooltips-in-wcag-21).\n\nYou will need to pass in the last focusable element in the disclosed content in order for:\n\n  - any focusable elements in the disclosed content to be keyboard accessible\n  - the disclosure to close appropriately when the user tabs past all of the disclosed content\n\nYou may pass a lastId of Nothing if there is NO focusable content within the disclosure.\n\n","type":"{ triggerId : String.String, lastId : Maybe.Maybe String.String } -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"exactWidth","comment":" Define a size in `px` for the tooltips's total width. The default is 320px.\n","type":"Basics.Int -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"fitToContent","comment":" Tooltip width fits its content.\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"helpfullyDisabled","comment":" Used when the tooltip trigger is disabled.\n\nProvides information about why the tooltip trigger is disabled.\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"html","comment":" Provide a list of custom HTML.\n","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"markdown","comment":" Provide a string that will be rendered as markdown.\n","type":"String.String -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"mobileCss","comment":" Set styles that will only apply if the viewport is narrower than NRI's mobile breakpoint.\n\nEquivalent to:\n\n    Tooltip.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.mobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"narrowMobileCss","comment":" Set styles that will only apply if the viewport is narrower than NRI's narrow mobile breakpoint.\n\nEquivalent to:\n\n    Tooltip.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.narrowMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"normalPadding","comment":" This the default spacing.\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"notMobileCss","comment":" Set styles that will only apply if the viewport is wider than NRI's mobile breakpoint.\n\nEquivalent to:\n\n    Tooltip.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.notMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onBottom","comment":"\n\n     ___/\\_____\n    |         |\n    |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onBottomForMobile","comment":" Set the position of the tooltip when the mobile breakpoint applies.\n\n     ___/\\_____\n    |         |\n    |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onBottomForNarrowMobile","comment":" Set the position of the tooltip when the narrow mobile breakpoint (500px) applies.\n\n     ___/\\_____\n    |         |\n    |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onBottomForQuizEngineMobile","comment":" Set the position of the tooltip when the quiz engine breakpoint (750px) applies.\n\n     ___/\\_____\n    |         |\n    |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onLeft","comment":"\n\n      __________\n     |         |\n     |          >\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onLeftForMobile","comment":" Set the position of the tooltip when the mobile breakpoint applies.\n\n      __________\n     |         |\n     |          >\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onLeftForNarrowMobile","comment":" Set the position of the tooltip when the narrow mobile breakpoint (500px) applies.\n\n      __________\n     |         |\n     |          >\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onLeftForQuizEngineMobile","comment":" Set the position of the tooltip when the quiz engine breakpoint (750px) applies.\n\n      __________\n     |         |\n     |          >\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onRight","comment":"\n\n      __________\n     |         |\n    <          |\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onRightForMobile","comment":" Set the position of the tooltip when the mobile breakpoint applies.\n\n      __________\n     |         |\n    <          |\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onRightForNarrowMobile","comment":" Set the position of the tooltip when the narrow mobile breakpoint (500px) applies.\n\n      __________\n     |         |\n    <          |\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onRightForQuizEngineMobile","comment":" Set the position of the tooltip when the quiz engine breakpoint (750px) applies.\n\n      __________\n     |         |\n    <          |\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onToggle","comment":" The Tooltip event cycle depends on whether you're following the Disclosure pattern, but disguising the Disclosure as a tooltip visually or you're actually adding a hint or label for sighted users.\n\nIf you're adding a tooltip to an element that _does_ something on its own, e.g., a \"Print\" ClickableSvg, then it doesn't make sense for the tooltip to change state on click/enter/space.\n\nHowever, if you're adding a tooltip to an element that is not interactive at all if you don't count the tooltip, then we can use the click/enter/space events to manage the tooltip state too. This style of \"tooltip\" is the only kind that will be accessible for touch users on mobile -- it's important to get the access pattern right!\n\nIf the tooltip behavior you're seeing doesn't _feel_ quite right, consider whether you need to change tooltip \"types\" to `disclosure` or to `auxiliaryDescription`.\n\n","type":"(Basics.Bool -> msg) -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onTop","comment":"\n\n     __________\n    |         |\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onTopForMobile","comment":" Set the position of the tooltip when the mobile breakpoint applies.\n\n     __________\n    |         |\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onTopForNarrowMobile","comment":" Set the position of the tooltip when the narrow mobile breakpoint (500px) applies.\n\n     __________\n    |         |\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onTopForQuizEngineMobile","comment":" Set the position of the tooltip when the quiz engine breakpoint (750px) applies.\n\n     __________\n    |         |\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"onTriggerKeyDown","comment":" Add additional keydown handlers to the trigger element.\n\nThis is required rather than applying them directly to the trigger element because the attributes\npassed into the trigger view function (to be applied to the trigger) include an onKeyDown event\nhandler that is used to close the tooltip when the escape key is pressed, and Elm requires that\nonly one onKeyDown event handler be applied to an element (otherwise, the last one wins).\n\n","type":"List.List (Accessibility.Styled.Key.Event msg) -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"open","comment":" Pass a bool indicating whether the tooltip should be open or closed.\n","type":"Basics.Bool -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"paragraph","comment":" Provide a plain-text string that will be put into a paragraph tag, with the default margin removed.\n","type":"String.String -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"primaryLabel","comment":" Used when the content of the tooltip is identical to the accessible name.\n\nFor example, when using the Tooltip component with the ClickableSvg component, the Tooltip is providing\nextra information to sighted users that screenreader users already have.\n\nThis is the default.\n\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"quizEngineMobileCss","comment":" Set styles that will only apply if the viewport is narrower than NRI's quiz-engine-specific mobile breakpoint.\n\nEquivalent to:\n\n    Tooltip.css\n        [ Css.Media.withMedia [ Nri.Ui.MediaQuery.V1.quizEngineMobile ] styles ]\n\n","type":"List.List Css.Style -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"smallPadding","comment":" ","type":"Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"stopTooltipMousePropagation","comment":" Stops propagation of mouseup / mousedown / click on the tooltip bubble.\n\nUse this if your tooltip is contained withing a clickable/draggable element and you do not\nwant clicking on the tooltip bubble to act like a click on the parent.\n\n","type":"msg -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Tooltip.V3.Attribute msg"},{"name":"view","comment":" Here's what the fields in the configuration record do:\n\n  - `trigger`: What element do you interact with to open the tooltip?\n  - `id`: A unique identifier used to associate the trigger with its content\n\n","type":"{ trigger : List.List (Accessibility.Styled.Attribute msg) -> Accessibility.Styled.Html msg, id : String.String } -> List.List (Nri.Ui.Tooltip.V3.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"viewToggleTip","comment":" Supplementary information triggered by a \"?\" icon.\n\nThis is a helper for setting up a commonly-used `disclosure` tooltip. Please see the documentation for `disclosure` to learn more.\n\n","type":"{ label : String.String, lastId : Maybe.Maybe String.String } -> List.List (Nri.Ui.Tooltip.V3.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"withoutTail","comment":" Makes it so that the tooltip does not have a tail!\n","type":"Nri.Ui.Tooltip.V3.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.UiIcon.V1","comment":" How to add new icons: <https://paper.dropbox.com/doc/How-to-create-a-new-SVG-icon-for-use-in-Elm--Ay9uhSLfGUAix0ERIiJ0Dm8dAg-8WNqtARdr4EgjmYEHPeYD>\n\n@docs seeMore, openClose, download, sort, gear, flipper, hamburger, kebab\n@docs archive, unarchive\n@docs playInCircle, pauseInCircle, stopInCircle, speaker, mutedSpeaker\n@docs play, skip\n@docs share, preview, copyToClipboard, gift, print\n@docs activity\n@docs footsteps, footstepsVideo, compass, speedometer, help, checklist, checklistComplete\n@docs sparkleBulb, baldBulb, bulb\n@docs hat, keychain\n@docs sprout, sapling, tree\n@docs person, couple, class, leaderboard, performance\n@docs emptyCalendar, calendar, clock\n@docs missingDocument, document, documents, newspaper, openBook, openBooks\n@docs edit, pen, highlighter, eraser\n@docs speechBalloon, mail\n@docs arrowTop, arrowRight, arrowDown, arrowLeft, arrowPointingRight, arrowPointingRightThick, sortArrow, sortArrowDown\n@docs checkmark, checkmarkInCircle, checkmarkInCircleInverse, emptyCircle, x, xInCircle\n@docs attention, exclamation\n@docs flag, star, starFilled, starOutline, no\n@docs equals, plus, null\n@docs key, lock, premiumLock\n@docs badge, tada, count\n@docs bold, italic, underline, list, link, undo, redo\n@docs home, homeInCircle, library\n@docs search, searchInCicle\n@docs openQuotationMark, closeQuotationMark\n@docs microscope, scale\n@docs openInNewTab, sync\n@docs apple, appleOutline, briefcase\n@docs school, highSchool, company, homeSchool, graduateCap\n@docs flagUs, globe\n@docs info\n@docs brain, projectorScreen, stretch\n@docs heapOfBoxes, climbingStairs, twoHandsHoldingBox, atlas\n@docs gradingAssistant, manuallyGraded\n\n    import Html.Styled exposing (..)\n    import Nri.Ui.Colors.V1 as Colors\n    import Nri.Ui.Svg.V1 as Svg\n    import Nri.Ui.UiIcon.V1 as UiIcon\n\n    view : Html msg\n    view =\n        UiIcon.unarchive\n            |> Svg.withColor Colors.lichen\n            |> Svg.toHtml\n\n","unions":[],"aliases":[],"values":[{"name":"activity","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"apple","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"appleOutline","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"archive","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"arrowDown","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"arrowLeft","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"arrowPointingRight","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"arrowPointingRightThick","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"arrowRight","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"arrowTop","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"atlas","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"attention","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"badge","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"baldBulb","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"bold","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"brain","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"briefcase","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"bulb","comment":" `bulb` will be removed in a future version of noredink-ui.\n\nUse the more-specific `baldBulb` instead please.\n\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"calendar","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"checklist","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"checklistComplete","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"checkmark","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"checkmarkInCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"checkmarkInCircleInverse","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"class","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"climbingStairs","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"clock","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"closeQuotationMark","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"company","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"compass","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"copyToClipboard","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"count","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"couple","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"document","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"documents","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"download","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"edit","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"emptyCalendar","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"emptyCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"equals","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"eraser","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"exclamation","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"flag","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"flagUs","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"flipper","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"footsteps","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"footstepsVideo","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"gear","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"gift","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"globe","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"gradingAssistant","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"graduateCap","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"hamburger","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"hat","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"heapOfBoxes","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"help","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"highSchool","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"highlighter","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"home","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"homeInCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"homeSchool","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"info","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"italic","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"kebab","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"key","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"keychain","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"leaderboard","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"library","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"link","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"list","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"lock","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"mail","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"manuallyGraded","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"microscope","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"missingDocument","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"mutedSpeaker","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"newspaper","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"no","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"null","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"openBook","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"openBooks","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"openClose","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"openInNewTab","comment":" The tightest-possible edging for this svg would have a viewport of \"0 0 70 70\". However, there's a bit of an optical illusion that makes this icon look far too big in context, so we add some default extra whitespace via the viewport to ensure the icon doesn't look overly big. Note that you can override the viewport with `Svg.withViewBox`, although this makes your view more brittle since people are likely to change out icons in this file without checking for `withViewBox` uses.\n","type":"Nri.Ui.Svg.V1.Svg"},{"name":"openQuotationMark","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"pauseInCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"pen","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"performance","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"person","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"play","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"playInCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"plus","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"premiumLock","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"preview","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"print","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"projectorScreen","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"redo","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sapling","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"scale","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"school","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"search","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"searchInCicle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"seeMore","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"share","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"skip","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sort","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sortArrow","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sortArrowDown","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sparkleBulb","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"speaker","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"speechBalloon","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"speedometer","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sprout","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"star","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"starFilled","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"starOutline","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"stopInCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"stretch","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sync","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"tada","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"tree","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"twoHandsHoldingBox","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"unarchive","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"underline","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"undo","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"x","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"xInCircle","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.WhenFocusLeaves.V2","comment":" Listen for when the focus leaves the area, and then do an action.\n\n@docs onKeyDown, onKeyDownPreventDefault\n@docs toDecoder\n\n","unions":[],"aliases":[],"values":[{"name":"onKeyDown","comment":" Use `WhenFocusLeaves.toDecoder` helper with the \"keydown\" event.\n","type":"List.List (Accessibility.Styled.Key.Event msg) -> { firstIds : List.List String.String, lastIds : List.List String.String, tabBackAction : msg, tabForwardAction : msg } -> Accessibility.Styled.Attribute msg"},{"name":"onKeyDownPreventDefault","comment":" Use `WhenFocusLeaves.toDecoder` helper with the \"keydown\" event and prevent default.\n","type":"List.List (Accessibility.Styled.Key.Event msg) -> { firstIds : List.List String.String, lastIds : List.List String.String, tabBackAction : msg, tabForwardAction : msg } -> Accessibility.Styled.Attribute msg"},{"name":"toDecoder","comment":" Use this helper to add a focus watcher to an HTML element and define\nwhat to do in reponse to tab keypresses in a part of the UI.\n\nThe ids referenced here are expected to correspond to elements in the container\nwe are adding the attribute to.\n\n    import Accessibility.Styled.Key as Key\n    import Nri.Ui.WhenFocusLeaves.V1 as WhenFocusLeaves\n    import Html.Styled.Events as Events\n\n\n    Events.on \"keydown\"\n        (WhenFocusLeaves.toDecoder\n            [ Key.escape CloseModal ]\n            { firstIds = [\"first-id\"]\n            , lastIds = [\"last-id\"]\n            , tabBackAction = GoToLastId\n            , tabForwardAction = GoToFirstId\n            }\n        )\n\n","type":"List.List (Accessibility.Styled.Key.Event msg) -> { firstIds : List.List String.String, lastIds : List.List String.String, tabBackAction : msg, tabForwardAction : msg } -> Json.Decode.Decoder msg"}],"binops":[]}]