[{"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.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.AnimatedIcon.V1","comment":"\n\n@docs mobileOpenClose, arrowRightDown, 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":"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# 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\n@docs quickWriteCircled, guidedDraftCircled, peerReviewCircled, selfReviewCircled\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":"diagnostic","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":"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":"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.V3","comment":"\n\n@docs view, Attribute\n\n\n## Content\n\n@docs plaintext\n@docs Content, content\n@docs phrase, wordWithQuestionBox\n@docs space\n@docs blank, blankWithQuestionBox\n\n\n## Content customization\n\n@docs emphasize\n\n\n## Labels & positioning\n\n@docs label\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\n\n### Visual customization\n\n@docs yellow, cyan, magenta, green, blue, purple, brown\n\n\n### Add a question box\n\n@docs withQuestionBox\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":" You will only need to use this helper if you're also using `content` to construct a more complex Block. For a less complex blank Block, don't include content or plaintext in the list of attributes.\n","type":"Nri.Ui.Block.V3.Content msg"},{"name":"blankWithQuestionBox","comment":" You will only need to use this helper if you're also using `content` to construct a more complex Block. For a less complex blank Block, don't include content or plaintext in the list of attributes.\n","type":"List.List (Nri.Ui.QuestionBox.V2.Attribute msg) -> Maybe.Maybe Browser.Dom.Element -> Nri.Ui.Block.V3.Content msg"},{"name":"blue","comment":" ","type":"Nri.Ui.Block.V3.Attribute msg"},{"name":"brown","comment":" ","type":"Nri.Ui.Block.V3.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 :: Block.phrase \"!\" ) ]\n        ]\n\n","type":"List.List (Nri.Ui.Block.V3.Content msg) -> Nri.Ui.Block.V3.Attribute msg"},{"name":"cyan","comment":" ","type":"Nri.Ui.Block.V3.Attribute msg"},{"name":"emphasize","comment":" Mark content as emphasized.\n","type":"Nri.Ui.Block.V3.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.V3.LabelPosition"},{"name":"green","comment":" ","type":"Nri.Ui.Block.V3.Attribute msg"},{"name":"label","comment":" ","type":"String.String -> Nri.Ui.Block.V3.Attribute msg"},{"name":"labelContentId","comment":" ","type":"String.String -> String.String"},{"name":"labelId","comment":" ","type":"String.String -> Nri.Ui.Block.V3.Attribute msg"},{"name":"labelPosition","comment":" Use `getLabelPositions` to calculate what these values should be.\n","type":"Maybe.Maybe Nri.Ui.Block.V3.LabelPosition -> Nri.Ui.Block.V3.Attribute msg"},{"name":"magenta","comment":" ","type":"Nri.Ui.Block.V3.Attribute msg"},{"name":"phrase","comment":" ","type":"String.String -> List.List (Nri.Ui.Block.V3.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.V3.Attribute msg"},{"name":"purple","comment":" ","type":"Nri.Ui.Block.V3.Attribute msg"},{"name":"space","comment":" ","type":"Nri.Ui.Block.V3.Content msg"},{"name":"view","comment":"\n\n    Block.view [ Block.plaintext \"Hello, world!\" ]\n\n","type":"List.List (Nri.Ui.Block.V3.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"withQuestionBox","comment":" Pass in a list of question box attributes and the sizing (taken using Dom.Browser.getElement) of the question box\n","type":"List.List (Nri.Ui.QuestionBox.V2.Attribute msg) -> Maybe.Maybe Browser.Dom.Element -> Nri.Ui.Block.V3.Attribute msg"},{"name":"wordWithQuestionBox","comment":" ","type":"String.String -> List.List (Nri.Ui.QuestionBox.V2.Attribute msg) -> Maybe.Maybe Browser.Dom.Element -> Nri.Ui.Block.V3.Content msg"},{"name":"yellow","comment":" ","type":"Nri.Ui.Block.V3.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Block.V4","comment":"\n\n@docs view, Attribute\n\n\n## Content\n\n@docs plaintext\n@docs Content, content\n@docs phrase, wordWithId, space, blank, blankWithId, bold, italic\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\n\n### Visual customization\n\n@docs yellow, cyan, magenta, green, blue, purple, brown\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":" You will only need to use this helper if you're also using `content` to construct a more complex Block. For a less complex blank Block, don't include content or plaintext in the list of attributes.\n","type":"Nri.Ui.Block.V4.Content msg"},{"name":"blankWithId","comment":" You will only need to use this helper if you're also using `content` to construct a more complex Block. For a less complex blank Block, don't include content or plaintext in the list of attributes.\n","type":"String.String -> Nri.Ui.Block.V4.Content msg"},{"name":"blue","comment":" ","type":"Nri.Ui.Block.V4.Attribute msg"},{"name":"bold","comment":" Wraps a group of content in a `strong` tag\n","type":"List.List (Nri.Ui.Block.V4.Content msg) -> Nri.Ui.Block.V4.Content msg"},{"name":"brown","comment":" ","type":"Nri.Ui.Block.V4.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 :: Block.phrase \"!\" ) ]\n        ]\n\n","type":"List.List (Nri.Ui.Block.V4.Content msg) -> Nri.Ui.Block.V4.Attribute msg"},{"name":"cyan","comment":" ","type":"Nri.Ui.Block.V4.Attribute msg"},{"name":"emphasize","comment":" Mark content as emphasized.\n","type":"Nri.Ui.Block.V4.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.V4.LabelPosition"},{"name":"green","comment":" ","type":"Nri.Ui.Block.V4.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Block.V4.Attribute msg"},{"name":"italic","comment":" Wraps a group of content in a `em` tag\n","type":"List.List (Nri.Ui.Block.V4.Content msg) -> Nri.Ui.Block.V4.Content msg"},{"name":"label","comment":" ","type":"String.String -> Nri.Ui.Block.V4.Attribute msg"},{"name":"labelContentId","comment":" ","type":"String.String -> String.String"},{"name":"labelId","comment":" ","type":"String.String -> Nri.Ui.Block.V4.Attribute msg"},{"name":"labelPosition","comment":" Use `getLabelPositions` to calculate what these values should be.\n","type":"Maybe.Maybe Nri.Ui.Block.V4.LabelPosition -> Nri.Ui.Block.V4.Attribute msg"},{"name":"magenta","comment":" ","type":"Nri.Ui.Block.V4.Attribute msg"},{"name":"phrase","comment":" ","type":"String.String -> List.List (Nri.Ui.Block.V4.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.V4.Attribute msg"},{"name":"purple","comment":" ","type":"Nri.Ui.Block.V4.Attribute msg"},{"name":"space","comment":" ","type":"Nri.Ui.Block.V4.Content 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.V4.Attribute msg) -> Accessibility.Styled.Html msg"},{"name":"wordWithId","comment":" Use this helper with `content` when you need to attach an id to a particular word inside of an emphasis.\n","type":"{ id : String.String, word : String.String } -> Nri.Ui.Block.V4.Content msg"},{"name":"yellow","comment":" ","type":"Nri.Ui.Block.V4.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.\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\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\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@docs toggleButton\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":"toggleButton","comment":" A button that can be toggled into a pressed state and back again.\n","type":"{ label : String.String, onSelect : msg, onDeselect : msg, pressed : Basics.Bool } -> Accessibility.Styled.Html 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.CharacterIcon.V1","comment":"\n\n@docs panda\n@docs redPanda\n\n","unions":[],"aliases":[],"values":[{"name":"panda","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"redPanda","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.Checkbox.V7","comment":"\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\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 Basics.Never) -> 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":"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":"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) -> Accessibility.Styled.Html msg"},{"name":"viewIcon","comment":" ","type":"List.List Css.Style -> Nri.Ui.Svg.V1.Svg -> Accessibility.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\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\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 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":"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.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, highlightBlueDark\n@docs highlightCyan, highlightCyanDark\n@docs highlightGreen, highlightGreenDark\n@docs highlightMagenta, highlightMagentaDark\n@docs highlightPurple, highlightPurpleDark\n@docs highlightYellow, highlightYellowDark\n@docs highlightBrown, 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 yellow, mustard\n\n","unions":[],"aliases":[],"values":[{"name":"aqua","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"aquaDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"aquaLight","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"azure","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"azureDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"cornflower","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"cornflowerDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"cornflowerLight","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"cyan","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"frost","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"glacier","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"grassland","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"gray20","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"gray45","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"gray75","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"gray85","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"gray92","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"gray96","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"green","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"greenDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"greenDarkest","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"greenLight","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"greenLightest","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightBlue","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightBlueDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightBrown","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightBrownDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightCyan","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightCyanDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightGreen","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightGreenDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightLightBlue","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightLightMagenta","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightLightYellow","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightMagenta","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightMagentaDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightPurple","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightPurpleDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightYellow","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"highlightYellowDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"lichen","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"magenta","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"mustard","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"navy","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"ochre","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"ochreDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"orange","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"purple","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"purpleDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"purpleLight","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"red","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"redDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"redLight","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"sunshine","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"textHighlightBlue","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"textHighlightBrown","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"textHighlightCyan","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"textHighlightGreen","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"textHighlightMagenta","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"textHighlightPurple","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"textHighlightYellow","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"turquoise","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"turquoiseDark","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"turquoiseLight","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"white","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n","type":"Css.Color"},{"name":"yellow","comment":" See <https://noredink-ui.netlify.com/#category/Colors>\n\nDEPRECATED: use [`mustard`](#mustard) instead. `yellow` will be removed in V2.\n\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\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",[]]]}],"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.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":" Create 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.V1","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 changes\n\n  - move asFragmentTuples, usedMarkers, and text to the Highlightable module\n\n\n## Types\n\n@docs Highlightable, Type, UIState, Attribute\n\n\n## Initializers\n\n@docs init, initFragment, initFragments\n@docs fromMarkdown\n\n\n## Transformations\n\n@docs splitHighlightableOnWords, splitWords\n\n\n## UIState related\n\n@docs blur, clearHint, hint, hover\n\n\n## Marker related\n\n@docs set, toggle\n\n\n## Attribute related\n\n@docs attributeSorter\n\n\n## Getters\n\n@docs asFragmentTuples, usedMarkers, text\n\n","unions":[{"name":"Attribute","comment":" Custom attributes that do not change after initialization.\n\n  - `Class`: add a class to the highlight\n  - `Data`: add a `data-X` to the highlight (you don't need to prepend\n    `data-` to this name.)\n\n","args":[],"cases":[["Class",["String.String"]],["Data",["String.String","String.String"]]]},{"name":"Type","comment":" ","args":[],"cases":[["Interactive",[]],["Static",[]]]},{"name":"UIState","comment":" UIState connects user-behavior to the highlightable.\n\nState transitions:\n\n  - None → (mouse over) → Hovered\n  - None → (click & drag over highlightables) → Hinted\n  - Hovered → (mouse out) → None\n  - Hovered → (mouse down) → Hinted\n  - Hinted → (mouse out) → None\n  - Hinted → (mouse up while on a different Highlightable) → None\n  - Hinted → (mouse up while on me) → Hovered\n\n","args":[],"cases":[["Hovered",[]],["Hinted",[]],["None",[]]]}],"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. Gets highlighted grudgingly if the\n    UI is going to get unintuitive otherwise. i.e. does not get highlighted\n    when hovered etc.\n\n    Data for a Highlightable:\n\n  - **text**: String to display.\n\n  - **uiState**: How the user is currently interacting with the Highlightable.\n\n  - **customAttributes**: User-supplied attributes that do not change once a Highlightable is initialized.\n\n  - **marked**: Current highlight.\n\n  - **groupIndex**: Index that identifies the fragment this Highlightable belongs to.\n\n","args":["marker"],"type":"{ text : String.String, uiState : Nri.Ui.Highlightable.V1.UIState, customAttributes : List.List Nri.Ui.Highlightable.V1.Attribute, marked : Maybe.Maybe (Nri.Ui.HighlighterTool.V1.MarkerModel marker), groupIndex : Basics.Int, type_ : Nri.Ui.Highlightable.V1.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.V1.Highlightable marker) -> List.List ( Maybe.Maybe marker, String.String )"},{"name":"attributeSorter","comment":" A Sorter for Attributes\n","type":"Sort.Sorter Nri.Ui.Highlightable.V1.Attribute"},{"name":"blur","comment":" ","type":"Nri.Ui.Highlightable.V1.Highlightable marker -> Nri.Ui.Highlightable.V1.Highlightable marker"},{"name":"clearHint","comment":" ","type":"Nri.Ui.Highlightable.V1.Highlightable marker -> Nri.Ui.Highlightable.V1.Highlightable marker"},{"name":"fromMarkdown","comment":" How do we know which elements should be marked, if all we have is a markdown string?\n\nWe do some funky parsing to interpret empty anchor tags and tagged spans as highlighted!\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.V1.Highlightable ())"},{"name":"hint","comment":" ","type":"Nri.Ui.Highlightable.V1.Highlightable marker -> Nri.Ui.Highlightable.V1.Highlightable marker"},{"name":"hover","comment":" ","type":"Nri.Ui.Highlightable.V1.Highlightable marker -> Nri.Ui.Highlightable.V1.Highlightable marker"},{"name":"init","comment":" ","type":"Nri.Ui.Highlightable.V1.Type -> Maybe.Maybe (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Basics.Int -> ( List.List Nri.Ui.Highlightable.V1.Attribute, String.String ) -> Nri.Ui.Highlightable.V1.Highlightable marker"},{"name":"initFragment","comment":" Split a multi-word string into multiple single-word highlights.\nThis is to deal with the highlighter not doing line breaks within a highlight group,\nwhich can look funny if a highlight contains longer text.\n","type":"Maybe.Maybe (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Basics.Int -> List.List ( List.List Nri.Ui.Highlightable.V1.Attribute, String.String ) -> List.List (Nri.Ui.Highlightable.V1.Highlightable marker)"},{"name":"initFragments","comment":" Similar to initFragment but each word is treated as a fragment,\ninstead of treating the whole string as a fragment.\n\nNote that we're transforming all whitespace to spaces, so newlines are not preserved\nas me move to and from fragments\n\n","type":"Maybe.Maybe (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> String.String -> List.List (Nri.Ui.Highlightable.V1.Highlightable marker)"},{"name":"set","comment":" ","type":"Maybe.Maybe (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Nri.Ui.Highlightable.V1.Highlightable marker -> Nri.Ui.Highlightable.V1.Highlightable marker"},{"name":"splitHighlightableOnWords","comment":" Split a highlightable into one highlightable per word.\n","type":"Nri.Ui.Highlightable.V1.Highlightable marker -> List.List (Nri.Ui.Highlightable.V1.Highlightable marker)"},{"name":"splitWords","comment":" Create list of words intersperse with spaces.\n","type":"String.String -> List.List String.String"},{"name":"text","comment":" Fetch the text from a series of highlightables.\n","type":"List.List (Nri.Ui.Highlightable.V1.Highlightable marker) -> String.String"},{"name":"toggle","comment":" ","type":"Nri.Ui.HighlighterTool.V1.MarkerModel marker -> Nri.Ui.Highlightable.V1.Highlightable marker -> Nri.Ui.Highlightable.V1.Highlightable marker"},{"name":"usedMarkers","comment":" Get unique markers that have been used.\n","type":"Sort.Sorter marker -> List.List (Nri.Ui.Highlightable.V1.Highlightable marker) -> Sort.Set.Set marker"}],"binops":[]},{"name":"Nri.Ui.Highlightable.V2","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## Changes from V1\n\n  - move asFragmentTuples, usedMarkers, and text to the Highlightable module\n  - remove initFragment, splitHighlightableOnWords, splitWords\n  - remove toggle, which is not used\n  - rename groupIndex -> index\n  - ensure that fromMarkdown indexes the fragments correctly\n  - support multiple kinds of mark\n  - move joinAdjacentInteractiveHighlights to the Highlightable module\n  - adds byId\n\n\n## Types\n\n@docs Highlightable, Type, UIState, Attribute\n\n\n## Initializers\n\n@docs init, initFragments\n@docs fromMarkdown\n\n\n## UIState and marker\n\n@docs blur, clearHint, hint, hover\n@docs set\n@docs joinAdjacentInteractiveHighlights\n\n\n## Attribute related\n\n@docs attributeSorter\n\n\n## Getters\n\n@docs asFragmentTuples, usedMarkers, text, byId\n\n","unions":[{"name":"Attribute","comment":" Custom attributes that do not change after initialization.\n\n  - `Class`: add a class to the highlight\n  - `Data`: add a `data-X` to the highlight (you don't need to prepend\n    `data-` to this name.)\n\n","args":[],"cases":[["Class",["String.String"]],["Data",["String.String","String.String"]]]},{"name":"Type","comment":" ","args":[],"cases":[["Interactive",[]],["Static",[]]]},{"name":"UIState","comment":" UIState connects user-behavior to the highlightable.\n\nState transitions:\n\n  - None → (mouse over) → Hovered\n  - None → (click & drag over highlightables) → Hinted\n  - Hovered → (mouse out) → None\n  - Hovered → (mouse down) → Hinted\n  - Hinted → (mouse out) → None\n  - Hinted → (mouse up while on a different Highlightable) → None\n  - Hinted → (mouse up while on me) → Hovered\n\n","args":[],"cases":[["Hovered",[]],["Hinted",[]],["None",[]]]}],"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. Gets highlighted grudgingly if the\n    UI is going to get unintuitive otherwise. i.e. does not get highlighted\n    when hovered etc.\n\n    Data for a Highlightable:\n\n  - **text**: String to display.\n\n  - **uiState**: How the user is currently interacting with the Highlightable.\n\n  - **customAttributes**: User-supplied attributes that do not change once a Highlightable is initialized.\n\n  - **marked**: Current highlights, if any.\n\n  - **index**: Index that identifies the fragment this Highlightable belongs to. Must be unique in the list of highlightables.\n\n","args":["marker"],"type":"{ text : String.String, uiState : Nri.Ui.Highlightable.V2.UIState, customAttributes : List.List Nri.Ui.Highlightable.V2.Attribute, marked : List.List (Nri.Ui.HighlighterTool.V1.MarkerModel marker), index : Basics.Int, type_ : Nri.Ui.Highlightable.V2.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.V2.Highlightable marker) -> List.List ( List.List marker, String.String )"},{"name":"attributeSorter","comment":" A Sorter for Attributes\n","type":"Sort.Sorter Nri.Ui.Highlightable.V2.Attribute"},{"name":"blur","comment":" ","type":"Nri.Ui.Highlightable.V2.Highlightable marker -> Nri.Ui.Highlightable.V2.Highlightable marker"},{"name":"byId","comment":" Get the highlightable matching the passed-in ID, if any.\n","type":"Basics.Int -> List.List (Nri.Ui.Highlightable.V2.Highlightable kind) -> Maybe.Maybe (Nri.Ui.Highlightable.V2.Highlightable kind)"},{"name":"clearHint","comment":" ","type":"Nri.Ui.Highlightable.V2.Highlightable marker -> Nri.Ui.Highlightable.V2.Highlightable marker"},{"name":"fromMarkdown","comment":" How do we know which elements should be marked, if all we have is a markdown string?\n\nWe do some funky parsing to interpret empty anchor tags and tagged spans as highlighted!\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.V2.Highlightable ())"},{"name":"hint","comment":" ","type":"Nri.Ui.Highlightable.V2.Highlightable marker -> Nri.Ui.Highlightable.V2.Highlightable marker"},{"name":"hover","comment":" ","type":"Nri.Ui.Highlightable.V2.Highlightable marker -> Nri.Ui.Highlightable.V2.Highlightable marker"},{"name":"init","comment":" ","type":"Nri.Ui.Highlightable.V2.Type -> List.List (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Basics.Int -> ( List.List Nri.Ui.Highlightable.V2.Attribute, String.String ) -> Nri.Ui.Highlightable.V2.Highlightable marker"},{"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":"List.List (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> String.String -> List.List (Nri.Ui.Highlightable.V2.Highlightable marker)"},{"name":"joinAdjacentInteractiveHighlights","comment":" ","type":"List.List (Nri.Ui.Highlightable.V2.Highlightable m) -> List.List (Nri.Ui.Highlightable.V2.Highlightable m)"},{"name":"set","comment":" ","type":"Maybe.Maybe (Nri.Ui.HighlighterTool.V1.MarkerModel marker) -> Nri.Ui.Highlightable.V2.Highlightable marker -> Nri.Ui.Highlightable.V2.Highlightable marker"},{"name":"text","comment":" Fetch the text from a series of highlightables.\n","type":"List.List (Nri.Ui.Highlightable.V2.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.V2.Highlightable marker) -> Sort.Set.Set marker"}],"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## 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\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":" How do we know which elements should be marked, if all we have is a markdown string?\n\nWe do some funky parsing to interpret empty anchor tags and tagged spans as highlighted!\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":"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.V2","comment":" Changes from V1:\n\n  - When rendering with a markdown helper, spaces will now be preserved instead of being \"eaten\"\n  - Remove emptyIntent, which is not used\n  - adds setting for joining adjacent interactive highlights of the same type\n\nHighlighter provides a view/model/update to display a view to highlight text and show marks.\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\n\n## Intents\n\n@docs Intent, hasChanged, HasChanged\n\n\n# Setters\n\n@docs removeHighlights\n\n\n# Getters\n\n@docs asFragmentTuples, usedMarkers, text\n\n","unions":[{"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.V2.ListenTo, changed : Nri.Ui.Highlighter.V2.HasChanged }"]]]},{"name":"Msg","comment":" ","args":["marker"],"cases":[["Pointer",["Nri.Ui.Highlighter.V2.PointerMsg"]],["Keyboard",["Nri.Ui.Highlighter.V2.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",["Basics.Int"]],["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.V1.Highlightable marker), marker : Nri.Ui.HighlighterTool.V1.Tool marker, joinAdjacentInteractiveHighlights : Basics.Bool, mouseDownIndex : Maybe.Maybe Basics.Int, mouseOverIndex : Maybe.Maybe Basics.Int, isInitialized : Nri.Ui.Highlighter.V2.Initialized, hasChanged : Nri.Ui.Highlighter.V2.HasChanged, selectionStartIndex : Maybe.Maybe Basics.Int, selectionEndIndex : Maybe.Maybe Basics.Int, focusIndex : Maybe.Maybe Basics.Int }"}],"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.V1.Highlightable marker) -> List.List ( Maybe.Maybe marker, String.String )"},{"name":"hasChanged","comment":" Check if the highlighter has changed.\n","type":"Nri.Ui.Highlighter.V2.Intent -> Nri.Ui.Highlighter.V2.HasChanged"},{"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.V1.Highlightable marker), marker : Nri.Ui.HighlighterTool.V1.Tool marker, joinAdjacentInteractiveHighlights : Basics.Bool } -> Nri.Ui.Highlighter.V2.Model marker"},{"name":"removeHighlights","comment":" ","type":"Nri.Ui.Highlighter.V2.Model marker -> Nri.Ui.Highlighter.V2.Model marker"},{"name":"static","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V1.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.V1.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.V1.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"staticWithTags","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V1.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"text","comment":" Fetch the text from a series of highlightables.\n","type":"List.List (Nri.Ui.Highlightable.V1.Highlightable marker) -> String.String"},{"name":"update","comment":" Update for highlighter returning additional info about whether there was a change\n","type":"Nri.Ui.Highlighter.V2.Msg marker -> Nri.Ui.Highlighter.V2.Model marker -> ( Nri.Ui.Highlighter.V2.Model marker, Platform.Cmd.Cmd (Nri.Ui.Highlighter.V2.Msg marker), Nri.Ui.Highlighter.V2.Intent )"},{"name":"usedMarkers","comment":" Get unique markers that have been used.\n","type":"Sort.Sorter marker -> Nri.Ui.Highlighter.V2.Model marker -> Sort.Set.Set marker"},{"name":"view","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V1.Highlightable marker), focusIndex : Maybe.Maybe Basics.Int, marker : Nri.Ui.HighlighterTool.V1.Tool marker } -> Html.Styled.Html (Nri.Ui.Highlighter.V2.Msg marker)"},{"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":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V1.Highlightable marker), focusIndex : Maybe.Maybe Basics.Int, marker : Nri.Ui.HighlighterTool.V1.Tool marker } -> Html.Styled.Html (Nri.Ui.Highlighter.V2.Msg marker)"}],"binops":[]},{"name":"Nri.Ui.Highlighter.V3","comment":" Patch changes:\n\n  - fixed :bug: where clicking on a static space would cause the space to be marked\n\nChanges from V2:\n\n  - support overlapping highlights (by way of removing the underlying mark element)\n  - move asFragmentTuples, usedMarkers, and text to the Highlightable module\n\nHighlighter provides a view/model/update to display a view to highlight text and show marks.\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, staticWithOverlappingHighlights\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\n","unions":[{"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.V3.ListenTo, changed : Nri.Ui.Highlighter.V3.HasChanged }"]]]},{"name":"Msg","comment":" ","args":["marker"],"cases":[["Pointer",["Nri.Ui.Highlighter.V3.PointerMsg"]],["Keyboard",["Nri.Ui.Highlighter.V3.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",["Basics.Int"]],["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.V2.Highlightable marker), marker : Nri.Ui.HighlighterTool.V1.Tool marker, joinAdjacentInteractiveHighlights : Basics.Bool, mouseDownIndex : Maybe.Maybe Basics.Int, mouseOverIndex : Maybe.Maybe Basics.Int, isInitialized : Nri.Ui.Highlighter.V3.Initialized, hasChanged : Nri.Ui.Highlighter.V3.HasChanged, selectionStartIndex : Maybe.Maybe Basics.Int, selectionEndIndex : Maybe.Maybe Basics.Int, focusIndex : Maybe.Maybe Basics.Int }"}],"values":[{"name":"clickedHighlightable","comment":" You are not likely to need this helper unless you're working with inline commenting.\n","type":"Nri.Ui.Highlighter.V3.Model marker -> Maybe.Maybe (Nri.Ui.Highlightable.V2.Highlightable marker)"},{"name":"hasChanged","comment":" Check if the highlighter has changed.\n","type":"Nri.Ui.Highlighter.V3.Intent -> Nri.Ui.Highlighter.V3.HasChanged"},{"name":"hoveredHighlightable","comment":" You are not likely to need this helper unless you're working with inline commenting.\n","type":"Nri.Ui.Highlighter.V3.Model marker -> Maybe.Maybe (Nri.Ui.Highlightable.V2.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.V2.Highlightable marker), marker : Nri.Ui.HighlighterTool.V1.Tool marker, joinAdjacentInteractiveHighlights : Basics.Bool } -> Nri.Ui.Highlighter.V3.Model marker"},{"name":"removeHighlights","comment":" ","type":"Nri.Ui.Highlighter.V3.Model marker -> Nri.Ui.Highlighter.V3.Model marker"},{"name":"static","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V2.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.V2.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.V2.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"staticWithOverlappingHighlights","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V2.Highlightable marker) } -> Html.Styled.Html msg"},{"name":"staticWithTags","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V2.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.V3.Msg marker -> Nri.Ui.Highlighter.V3.Model marker -> ( Nri.Ui.Highlighter.V3.Model marker, Platform.Cmd.Cmd (Nri.Ui.Highlighter.V3.Msg marker), Nri.Ui.Highlighter.V3.Intent )"},{"name":"view","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V2.Highlightable marker), focusIndex : Maybe.Maybe Basics.Int, marker : Nri.Ui.HighlighterTool.V1.Tool marker } -> Html.Styled.Html (Nri.Ui.Highlighter.V3.Msg marker)"},{"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":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V2.Highlightable marker), focusIndex : Maybe.Maybe Basics.Int, marker : Nri.Ui.HighlighterTool.V1.Tool marker } -> Html.Styled.Html (Nri.Ui.Highlighter.V3.Msg marker)"},{"name":"viewWithOverlappingHighlights","comment":" ","type":"{ config | id : String.String, highlightables : List.List (Nri.Ui.Highlightable.V2.Highlightable marker), focusIndex : Maybe.Maybe Basics.Int, marker : Nri.Ui.HighlighterTool.V1.Tool marker } -> Html.Styled.Html (Nri.Ui.Highlighter.V3.Msg marker)"}],"binops":[]},{"name":"Nri.Ui.Highlighter.V4","comment":" Changes from V3:\n\n  - Highlighter.init now takes a sorter for the markers\n  - Modeling for highlightable ui state moved to the Highlighter model\n  - removes staticWithOverlappingHighlights\n\nHighlighter provides a view/model/update to display a view to highlight text and show marks.\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## 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":"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.V4.ListenTo, changed : Nri.Ui.Highlighter.V4.HasChanged }"]]]},{"name":"Msg","comment":" ","args":["marker"],"cases":[["Pointer",["Nri.Ui.Highlighter.V4.PointerMsg"]],["Keyboard",["Nri.Ui.Highlighter.V4.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",["Basics.Int"]],["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.V4.Initialized, hasChanged : Nri.Ui.Highlighter.V4.HasChanged, selectionStartIndex : Maybe.Maybe Basics.Int, selectionEndIndex : Maybe.Maybe Basics.Int, focusIndex : Maybe.Maybe Basics.Int }"}],"values":[{"name":"clickedHighlightable","comment":" You are not likely to need this helper unless you're working with inline commenting.\n","type":"Nri.Ui.Highlighter.V4.Model marker -> Maybe.Maybe (Nri.Ui.Highlightable.V3.Highlightable marker)"},{"name":"hasChanged","comment":" Check if the highlighter has changed.\n","type":"Nri.Ui.Highlighter.V4.Intent -> Nri.Ui.Highlighter.V4.HasChanged"},{"name":"hoveredHighlightable","comment":" You are not likely to need this helper unless you're working with inline commenting.\n","type":"Nri.Ui.Highlighter.V4.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.V4.Model marker"},{"name":"removeHighlights","comment":" ","type":"Nri.Ui.Highlighter.V4.Model marker -> Nri.Ui.Highlighter.V4.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.V4.Msg marker -> Nri.Ui.Highlighter.V4.Model marker -> ( Nri.Ui.Highlighter.V4.Model marker, Platform.Cmd.Cmd (Nri.Ui.Highlighter.V4.Msg marker), Nri.Ui.Highlighter.V4.Intent )"},{"name":"view","comment":" ","type":"Nri.Ui.Highlighter.V4.Model marker -> Html.Styled.Html (Nri.Ui.Highlighter.V4.Msg marker)"},{"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.V4.Model marker -> Html.Styled.Html (Nri.Ui.Highlighter.V4.Msg marker)"},{"name":"viewWithOverlappingHighlights","comment":" ","type":"Nri.Ui.Highlighter.V4.Model marker -> Html.Styled.Html (Nri.Ui.Highlighter.V4.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.V1","comment":" Bar with markers for choosing how text will be highlighted in a highlighter.\n\n@docs view\n\n","unions":[],"aliases":[],"values":[{"name":"view","comment":" View renders each marker and an eraser. This is usually used with a Highlighter.\n","type":"{ onSetEraser : msg, onChangeTag : tag -> msg, getColor : tag -> { extras | colorSolid : Css.Color, colorLight : Css.Color }, getName : tag -> String.String } -> { model | currentTool : Maybe.Maybe tag, tags : List.List tag } -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.HighlighterToolbar.V2","comment":" Bar with markers for choosing how text will be highlighted in a highlighter.\n\n@docs view\n\n\n### Patch changes:\n\n  - Ensure selected tool is clear in high contrast mode\n\n\n### Changes from V1:\n\n  - replaces `onChangeTag` and `onSetEraser` with `focusAndSelect`.\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 usually used with a Highlighter.\n","type":"{ focusAndSelect : { select : Maybe.Maybe tag, focus : Maybe.Maybe String.String } -> msg, getColor : tag -> { extras | colorSolid : Css.Color, colorLight : Css.Color }, getName : tag -> String.String, highlighterId : String.String } -> { model | currentTool : Maybe.Maybe tag, tags : List.List tag } -> Html.Styled.Html msg"}],"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\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\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":"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\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.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":" Patch 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, 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":" DEPRECATED: prefer narrowMobileBreakpoint, which follows other casing conventions.\n","type":"Css.Px"},{"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\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\n\n## Menu content\n\n@docs Entry, group, 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":"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.V3.Attribute msg) -> 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":"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":"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":"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.V3","comment":" Patch 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, alertDialogRole\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.V3.Attribute msg"},{"name":"alertDialogRole","comment":" Use this attribute when (1) a user's immediate attention on the Message is required,\n(2) the Message contains interactible elements, and (3) you've correctly set up the Message to be\nmodal (i.e., you've set up tab-wrapping, the body's overflow is hidden, the user\ncan't interact with elements apart from the Message's contents...)\n\nWhen you use this role, verify that you are using it correctly using [this\nMDN article](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_alertdialog_role).\n\n","type":"Nri.Ui.Message.V3.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.V3.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.V3.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.V3.Attribute msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Message.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.Message.V3.Attribute msg"},{"name":"customTheme","comment":" ","type":"{ color : Css.Color, backgroundColor : Css.Color } -> Nri.Ui.Message.V3.Attribute msg"},{"name":"error","comment":" ","type":"Nri.Ui.Message.V3.Attribute msg"},{"name":"hideIconFor","comment":" ","type":"Css.Media.MediaQuery -> Nri.Ui.Message.V3.Attribute msg"},{"name":"hideIconForMobile","comment":" ","type":"Nri.Ui.Message.V3.Attribute msg"},{"name":"html","comment":" Provide a list of custom HTML.\n","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Message.V3.Attribute msg"},{"name":"httpError","comment":" Provide an HTTP error, which will be translated to user-friendly text.\n","type":"Http.Error -> Nri.Ui.Message.V3.Attribute msg"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.Message.V3.Attribute msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Message.V3.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.V3.Attribute msg"},{"name":"markdown","comment":" Provide a string that will be rendered as markdown.\n","type":"String.String -> Nri.Ui.Message.V3.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.V3.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.V3.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.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.Message.V3.Attribute msg"},{"name":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> Nri.Ui.Message.V3.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.V3.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":"success","comment":" ","type":"Nri.Ui.Message.V3.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Message.V3.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.V3.Attribute msg"},{"name":"tip","comment":" This is the default theme for a Message.\n","type":"Nri.Ui.Message.V3.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.V3.Attribute msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Modal.V11","comment":"\n\n\n# Patch changes:\n\n  - adds `testId` helper\n  - adds data-nri-descriptions to the header, content, and footer\n  - use `Shadows`\n\n\n# Changes from V10:\n\n  - remove `initOpen`\n  - change `open`, `close` to return `(Model, Cmd Msg)` rather than `Msg`\n  - make info and warning themes\n  - adds `custom` helper for adding arbitrary html attributes (primarily useful to make limiting the scope of selectors in tests easier by adding ids to modals)\n  - tab and tabback events stop propagation and prevent default\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.FocusTrap.V1 as FocusTrap exposing (FocusTrap)\nimport Nri.Ui.Modal.V11 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    let\n        ( model, cmd ) =\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\n                { startFocusOn = Modal.closeButtonId\n                , returnFocusTo = \"maincontent\"\n                }\n    in\n    ( model, Cmd.map ModalMsg cmd )\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            let\n                ( newModel, cmd ) =\n                    Modal.open\n                        { startFocusOn = Modal.closeButtonId\n                        , returnFocusTo = returnFocusTo\n                        }\n            in\n            ( newModel, Cmd.map ModalMsg cmd )\n\n        ModalMsg modalMsg ->\n            let\n                ( newModel, cmd ) =\n                    Modal.update\n                        { dismissOnEscAndOverlayClick = True }\n                        modalMsg\n                        model\n            in\n            ( newModel, Cmd.map ModalMsg cmd )\n\n        CloseModal ->\n            let\n                ( newModel, cmd ) =\n                    Modal.close model\n            in\n            ( newModel, Cmd.map ModalMsg cmd )\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            , focusTrap =\n                { focus = Focus\n                , firstId = Modal.closeButtonId\n                , lastId = \"last-element-id\"\n                }\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\n@docs view, closeButton, closeButtonId\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 showTitle, hideTitle\n@docs testId, css, custom\n\n\n### State checks\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":"close","comment":" ","type":"Nri.Ui.Modal.V11.Model -> ( Nri.Ui.Modal.V11.Model, Platform.Cmd.Cmd Nri.Ui.Modal.V11.Msg )"},{"name":"closeButton","comment":" Include the close button.\n","type":"Nri.Ui.Modal.V11.Attribute"},{"name":"closeButtonId","comment":" ","type":"String.String"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.Modal.V11.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        }\n        [ Modal.custom [ id \"my-modal\" ]]\n        modalState\n\n","type":"List.List (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Modal.V11.Attribute"},{"name":"hideTitle","comment":" ","type":"Nri.Ui.Modal.V11.Attribute"},{"name":"info","comment":" This is the default theme.\n","type":"Nri.Ui.Modal.V11.Attribute"},{"name":"init","comment":" ","type":"Nri.Ui.Modal.V11.Model"},{"name":"isOpen","comment":" ","type":"Nri.Ui.Modal.V11.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","type":"{ startFocusOn : String.String, returnFocusTo : String.String } -> ( Nri.Ui.Modal.V11.Model, Platform.Cmd.Cmd Nri.Ui.Modal.V11.Msg )"},{"name":"showTitle","comment":" This is the default setting.\n","type":"Nri.Ui.Modal.V11.Attribute"},{"name":"subscriptions","comment":" Include the subscription if you want the modal to dismiss on `Esc`.\n","type":"Nri.Ui.Modal.V11.Model -> Platform.Sub.Sub Nri.Ui.Modal.V11.Msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Modal.V11.Attribute"},{"name":"update","comment":" ","type":"{ dismissOnEscAndOverlayClick : Basics.Bool } -> Nri.Ui.Modal.V11.Msg -> Nri.Ui.Modal.V11.Model -> ( Nri.Ui.Modal.V11.Model, Platform.Cmd.Cmd Nri.Ui.Modal.V11.Msg )"},{"name":"view","comment":" `FocusTrap` comes from `Nri.Ui.FocusTrap.V1`.\n","type":"{ title : String.String, wrapMsg : Nri.Ui.Modal.V11.Msg -> msg, focusTrap : Nri.Ui.FocusTrap.V1.FocusTrap msg, content : List.List (Accessibility.Styled.Html msg), footer : List.List (Accessibility.Styled.Html msg) } -> List.List Nri.Ui.Modal.V11.Attribute -> Nri.Ui.Modal.V11.Model -> Accessibility.Styled.Html msg"},{"name":"warning","comment":" ","type":"Nri.Ui.Modal.V11.Attribute"}],"binops":[]},{"name":"Nri.Ui.Page.V3","comment":" A styled NRI page!\n\n@docs httpError\n@docs DefaultPage, broken, blockedV4, blocked, notFound, noPermission, loggedOut, timeOut, networkError\n@docs RecoveryText\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":"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.V2","comment":" Used for indicating Premium content\n\n@docs premiumFlag, disabledPremiumFlag, expiredPremiumFlag\n\n","unions":[],"aliases":[],"values":[{"name":"disabledPremiumFlag","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"expiredPremiumFlag","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"premiumFlag","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"binops":[]},{"name":"Nri.Ui.PremiumCheckbox.V8","comment":" 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\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":"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.V2","comment":"\n\n@docs view, Attribute\n\n@docs id, markdown, actions, character\n@docs standalone, pointingTo\n@docs containerCss\n\n@docs guidanceId\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"actions","comment":" ","type":"List.List { label : String.String, onClick : msg } -> Nri.Ui.QuestionBox.V2.Attribute msg"},{"name":"character","comment":" ","type":"Maybe.Maybe { name : String.String, icon : Nri.Ui.Svg.V1.Svg } -> Nri.Ui.QuestionBox.V2.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.QuestionBox.V2.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":"id","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V2.Attribute msg"},{"name":"markdown","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V2.Attribute msg"},{"name":"pointingTo","comment":" This type of `QuestionBox` is absolutely positioned & has an arrow pointing to its relatively positioned ancestor.\n\nTypically, you would use this type of `QuestionBox` type with a `Block` by way of `Block.withHtml`.\n\nYou will need to pass a measurement, taken using Dom.Browser, in order for the question box to be positioned correctly horizontally so that it doesn't get cut off by the viewport.\n\n","type":"Maybe.Maybe Browser.Dom.Element -> Nri.Ui.QuestionBox.V2.Attribute msg"},{"name":"standalone","comment":" This is the default type of question box. It doesn't have a programmatic or direct visual relationship to any piece of content.\n","type":"Nri.Ui.QuestionBox.V2.Attribute msg"},{"name":"view","comment":"\n\n    QuestionBox.view\n        [ QuestionBox.markdown \"**WOW**, great component!\"\n        ]\n\n","type":"List.List (Nri.Ui.QuestionBox.V2.Attribute msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.QuestionBox.V3","comment":"\n\n@docs view, Attribute\n\n@docs id, markdown, actions, character\n@docs standalone, pointingTo\n@docs containerCss\n@docs setLeftActions\n\n@docs guidanceId\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"actions","comment":" ","type":"List.List { label : String.String, onClick : msg } -> Nri.Ui.QuestionBox.V3.Attribute msg"},{"name":"character","comment":" ","type":"Maybe.Maybe { name : String.String, icon : Nri.Ui.Svg.V1.Svg } -> Nri.Ui.QuestionBox.V3.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.QuestionBox.V3.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":"id","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V3.Attribute msg"},{"name":"markdown","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V3.Attribute msg"},{"name":"pointingTo","comment":" This type of `QuestionBox` has an arrow pointing to the block whose id you pass in, if that block is on the final line of its paragraph.\nThe QuestionBox should be vertically aligned beneath the block, viewport permitting.\n\nPass in the id for the block the QuestionBox should point to.\n\nYou will need to pass 2 measurements, taken using Dom.Browser, in order for the question box to be positioned correctly.\n\n","type":"String.String -> Maybe.Maybe { block : Browser.Dom.Element, paragraph : Browser.Dom.Element, questionBox : Browser.Dom.Element } -> Nri.Ui.QuestionBox.V3.Attribute msg"},{"name":"setLeftActions","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.V3.Attribute msg"},{"name":"standalone","comment":" This is the default type of question box. It doesn't have a programmatic or direct visual relationship to any piece of content.\n","type":"Nri.Ui.QuestionBox.V3.Attribute msg"},{"name":"view","comment":"\n\n    QuestionBox.view\n        [ QuestionBox.markdown \"**WOW**, great component!\"\n        ]\n\n","type":"List.List (Nri.Ui.QuestionBox.V3.Attribute msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.QuestionBox.V4","comment":"\n\n\n## Patch Changes\n\n  - Modified `viewPointingTo` to be hidden when measurements are `Nothing` to reduce the jitter of the question box moving to its correct position.\n\n@docs view, Attribute\n\n@docs id, markdown, actions, character\n@docs standalone, pointingTo\n@docs containerCss\n@docs setLeftActions\n\n@docs guidanceId\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"actions","comment":" ","type":"List.List { label : String.String, onClick : msg } -> Nri.Ui.QuestionBox.V4.Attribute msg"},{"name":"character","comment":" ","type":"Maybe.Maybe { name : String.String, icon : Nri.Ui.Svg.V1.Svg } -> Nri.Ui.QuestionBox.V4.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.QuestionBox.V4.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":"id","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V4.Attribute msg"},{"name":"markdown","comment":" ","type":"String.String -> Nri.Ui.QuestionBox.V4.Attribute msg"},{"name":"pointingTo","comment":" This type of `QuestionBox` has an arrow pointing to the block whose id you pass in, if that block is on the final line of its paragraph.\nThe QuestionBox should be vertically aligned beneath the block, viewport permitting. When there is a container the container will be used to\ncalculate the offset from the viewport.\n\nPass in the id for the block the QuestionBox should point to.\n\nYou will need to pass 4 measurements, taken using Dom.Browser, in order for the question box to be positioned correctly. The question box\nwill be hidden the first time when you pass `Nothing` for the measurements to reduce the jitter of the question box moving to its correct\nposition.\n\n","type":"String.String -> Maybe.Maybe { block : Browser.Dom.Element, paragraph : Browser.Dom.Element, questionBox : Browser.Dom.Element, container : Maybe.Maybe Browser.Dom.Element } -> Nri.Ui.QuestionBox.V4.Attribute msg"},{"name":"setLeftActions","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.V4.Attribute msg"},{"name":"standalone","comment":" This is the default type of question box. It doesn't have a programmatic or direct visual relationship to any piece of content.\n","type":"Nri.Ui.QuestionBox.V4.Attribute msg"},{"name":"view","comment":"\n\n    QuestionBox.view\n        [ QuestionBox.markdown \"**WOW**, great component!\"\n        ]\n\n","type":"List.List (Nri.Ui.QuestionBox.V4.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 horiztonal text overflow issues\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\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 Basics.Never) -> 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":"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":"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.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\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.V8","comment":" Build a select input with a label, optional guidance, and error messaging.\n\n\n# Changes from V7\n\n    - view adds a label\n    - adds standard custom, nriDescription, etc. attributes\n    - switches to a list-based attribute API from a record-based API\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\n@docs custom, nriDescription, id, testId\n@docs containerCss, noMargin\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.V8.Choice value) }"}],"values":[{"name":"choices","comment":" ","type":"(value -> String.String) -> List.List (Nri.Ui.Select.V8.Choice value) -> Nri.Ui.Select.V8.Attribute value"},{"name":"containerCss","comment":" Adds CSS to the element containing the input.\n","type":"List.List Css.Style -> Nri.Ui.Select.V8.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.V8.Attribute value"},{"name":"defaultDisplayText","comment":" ","type":"String.String -> Nri.Ui.Select.V8.Attribute value"},{"name":"disabled","comment":" Disables the input\n","type":"Nri.Ui.Select.V8.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.V8.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.V8.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.V8.ChoicesGroup value) -> Nri.Ui.Select.V8.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.V8.Attribute value"},{"name":"hiddenLabel","comment":" Hides the visible label. (There will still be an invisible label for screen readers.)\n","type":"Nri.Ui.Select.V8.Attribute value"},{"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.V8.Attribute value"},{"name":"loading","comment":" Use this while the form the input is a part of is being submitted.\n","type":"Nri.Ui.Select.V8.Attribute value"},{"name":"noMargin","comment":" Remove default spacing from the Input.\n","type":"Basics.Bool -> Nri.Ui.Select.V8.Attribute value"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Select.V8.Attribute value"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Select.V8.Attribute value"},{"name":"value","comment":" ","type":"Maybe.Maybe value -> Nri.Ui.Select.V8.Attribute value"},{"name":"view","comment":" ","type":"String.String -> List.List (Nri.Ui.Select.V8.Attribute a) -> Accessibility.Styled.Html a"},{"name":"visibleLabel","comment":" Default behavior.\n","type":"Nri.Ui.Select.V8.Attribute value"}],"binops":[]},{"name":"Nri.Ui.Select.V9","comment":" Build a select input with a label, optional guidance, and error messaging.\n\n\n# Changes 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\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\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":"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.V4","comment":"\n\n\n### Patch changes\n\n  - add missing aria-current=page attribute\n  - don't render an empty nav when there are no entries\n  - adjust closed sidenav toggle button styles\n\n\n### Changes from V3\n\n  - make the nav configurably collapsible\n\n@docs view, Config, NavAttribute\n@docs collapsible\n@docs navLabel, navId\n@docs navCss, navNotMobileCss, navMobileCss, navQuizEngineMobileCss\n\n\n## Entries\n\n@docs entry, entryWithChildren, html, Entry, Attribute\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 color scheme\n\n@docs primary, secondary\n\n\n## Change the state\n\n@docs premiumDisplay\n\n","unions":[{"name":"Attribute","comment":" ","args":["route","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":"Config","comment":" ","args":["route","msg"],"type":"{ isCurrentRoute : route -> Basics.Bool, routeToString : route -> String.String, onSkipNav : msg }"}],"values":[{"name":"collapsible","comment":" ","type":"Nri.Ui.SideNav.V4.CollapsibleConfig msg -> Nri.Ui.SideNav.V4.NavAttribute msg"},{"name":"css","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V4.Attribute route 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.SideNav.V4.Attribute route msg"},{"name":"entry","comment":" ","type":"String.String -> List.List (Nri.Ui.SideNav.V4.Attribute route msg) -> Nri.Ui.SideNav.V4.Entry route msg"},{"name":"entryWithChildren","comment":" ","type":"String.String -> List.List (Nri.Ui.SideNav.V4.Attribute route msg) -> List.List (Nri.Ui.SideNav.V4.Entry route msg) -> Nri.Ui.SideNav.V4.Entry route msg"},{"name":"href","comment":" ","type":"route -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"html","comment":" ","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.SideNav.V4.Entry route msg"},{"name":"icon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"linkExternal","comment":" ","type":"String.String -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"linkExternalWithTracking","comment":" ","type":"{ track : msg, url : String.String } -> Nri.Ui.SideNav.V4.Attribute 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.V4.Attribute route msg"},{"name":"linkWithMethod","comment":" ","type":"{ method : String.String, url : route } -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"linkWithTracking","comment":" ","type":"{ track : msg, url : route } -> Nri.Ui.SideNav.V4.Attribute 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.V4.NavAttribute msg"},{"name":"navId","comment":" ","type":"String.String -> Nri.Ui.SideNav.V4.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.V4.NavAttribute msg"},{"name":"navMobileCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V4.NavAttribute msg"},{"name":"navNotMobileCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V4.NavAttribute msg"},{"name":"navQuizEngineMobileCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.SideNav.V4.NavAttribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"onClick","comment":" ","type":"msg -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"premiumDisplay","comment":" ","type":"Nri.Ui.Data.PremiumDisplay.PremiumDisplay -> msg -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"primary","comment":" ","type":"Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"rightIcon","comment":" ","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"secondary","comment":" ","type":"Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.SideNav.V4.Attribute route msg"},{"name":"view","comment":" ","type":"Nri.Ui.SideNav.V4.Config route msg -> List.List (Nri.Ui.SideNav.V4.NavAttribute msg) -> List.List (Nri.Ui.SideNav.V4.Entry route msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.SortableTable.V3","comment":" TODO for next major version:\n\n  - add the possibility to pass Aria.sortAscending and Aria.sortDescending attributes to the <th> tag\n\nChanges from V2:\n\n  - made column non-sortable (e.g. buttons in a column should not be sorted)\n  - use a button instead of a clickable div in headers\n  - use Aria.roleDescription instead of Aria.label in sortable columns headers\n  - use Nri.Ui.UiIcon.V1 sortArrow and Nri.Ui.UiIcon.V1 sortArrowDown icons for the sort indicators\n\n@docs Column, Config, Sorter, State\n@docs init, initDescending\n@docs custom, string, view, viewLoading\n@docs invariantSort, simpleSort, combineSorters\n\n","unions":[{"name":"Column","comment":" ","args":["id","entry","msg"],"cases":[]}],"aliases":[{"name":"Config","comment":" ","args":["id","entry","msg"],"type":"{ updateMsg : Nri.Ui.SortableTable.V3.State id -> msg, columns : List.List (Nri.Ui.SortableTable.V3.Column id entry msg) }"},{"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 }"}],"values":[{"name":"combineSorters","comment":" ","type":"List.List (Nri.Ui.SortableTable.V3.Sorter entry) -> Nri.Ui.SortableTable.V3.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.V3.Sorter entry), width : Basics.Int, cellStyles : entry -> List.List Css.Style } -> Nri.Ui.SortableTable.V3.Column id entry msg"},{"name":"init","comment":" ","type":"id -> Nri.Ui.SortableTable.V3.State id"},{"name":"initDescending","comment":" ","type":"id -> Nri.Ui.SortableTable.V3.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.V3.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.V3.Sorter entry"},{"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.V3.Column id entry msg"},{"name":"view","comment":" ","type":"Nri.Ui.SortableTable.V3.Config id entry msg -> Nri.Ui.SortableTable.V3.State id -> List.List entry -> Html.Styled.Html msg"},{"name":"viewLoading","comment":" ","type":"Nri.Ui.SortableTable.V3.Config id entry msg -> Nri.Ui.SortableTable.V3.State id -> Html.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":"\n\n\n## Center a container on the page:\n\n@docs centeredContentWithSidePadding, centeredContent\n@docs centeredQuizEngineContentWithSidePadding, quizEngineCenteredContent\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":"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":"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.V2","comment":"\n\n\n### Patch Changes:\n\n    - Fix cursor styles when hovering over the transparent checkbox\n\n\n### Changes from V1:\n\n    - Fixes invalid ARIA use, [conformance requirements](https://www.w3.org/TR/html-aria/#docconformance)\n    - labels should only support strings (this is the only way they're actually used in practice)\n    - extends API to be more consistent with other form/control components\n    - Use Colors values instead of hardcoded hex strings\n    - Move the status (selected or not selected) to the list api\n    - REQUIRE label and id always\n    - Move custom attributes to the container\n    - change disabled to take a bool (which I think is the slighty more common pattern)\n    - Adds `role=\"switch\"`\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.V2.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 (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Switch.V2.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.V2.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.V2.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Switch.V2.Attribute msg"},{"name":"onSwitch","comment":" Specify what happens when the switch is toggled.\n","type":"(Basics.Bool -> msg) -> Nri.Ui.Switch.V2.Attribute msg"},{"name":"selected","comment":" What is the status of the Switch, selected or not?\n","type":"Basics.Bool -> Nri.Ui.Switch.V2.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Switch.V2.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.V2.Attribute msg) -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Table.V6","comment":" Upgrading from V5:\n\n  - The columns take an additional `sort` property that allows\n    you to specify ARIA sorting\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.V6.SortDirection } -> Nri.Ui.Table.V6.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.V6.SortDirection } -> Nri.Ui.Table.V6.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.V6.SortDirection } -> Nri.Ui.Table.V6.Column data msg"},{"name":"view","comment":" Displays a table of data based on the provided column definitions\n","type":"List.List (Nri.Ui.Table.V6.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 (Nri.Ui.Table.V6.Column data msg) -> Html.Styled.Html msg"},{"name":"viewLoadingWithoutHeader","comment":" Display the loading table without a header row\n","type":"List.List (Nri.Ui.Table.V6.Column data msg) -> Html.Styled.Html msg"},{"name":"viewWithoutHeader","comment":" Displays a table of data without a header row\n","type":"List.List (Nri.Ui.Table.V6.Column data msg) -> List.List data -> 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.V7","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\nChanges from V6:\n\n  - Changes Tab construction to follow attributes-based approach\n  - Adds tooltip support\n  - combine onFocus and onSelect into focusAndSelect msg handler (for tooltips)\n\n@docs view\n@docs Alignment\n@docs Tab, Attribute, build\n@docs tabString, tabHtml, withTooltip, disabled, 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":" ","args":["id","msg"],"cases":[]},{"name":"Tab","comment":" ","args":["id","msg"],"cases":[]}],"aliases":[],"values":[{"name":"build","comment":" ","type":"{ id : id, idString : String.String } -> List.List (Nri.Ui.Tabs.V7.Attribute id msg) -> Nri.Ui.Tabs.V7.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.V7.Attribute id msg"},{"name":"disabled","comment":" Makes it so that the tab can't be clicked or focused via keyboard navigation\n","type":"Basics.Bool -> Nri.Ui.Tabs.V7.Attribute 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.V7.Attribute id msg"},{"name":"panelHtml","comment":" ","type":"Html.Styled.Html msg -> Nri.Ui.Tabs.V7.Attribute id msg"},{"name":"spaHref","comment":" ","type":"String.String -> Nri.Ui.Tabs.V7.Attribute id msg"},{"name":"tabHtml","comment":" ","type":"Html.Styled.Html Basics.Never -> Nri.Ui.Tabs.V7.Attribute id msg"},{"name":"tabString","comment":" ","type":"String.String -> Nri.Ui.Tabs.V7.Attribute id msg"},{"name":"view","comment":" ","type":"{ title : Maybe.Maybe String.String, alignment : Nri.Ui.Tabs.V7.Alignment, customSpacing : Maybe.Maybe Basics.Float, focusAndSelect : { select : id, focus : Maybe.Maybe String.String } -> msg, selected : id, tabs : List.List (Nri.Ui.Tabs.V7.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.V7.Attribute id 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\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, disabled, 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":"disabled","comment":" Makes it so that the tab can't be clicked or focused via keyboard navigation\n","type":"Basics.Bool -> 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.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\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\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\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\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":"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":"onInput","comment":" Produce the given `msg` when the field is focused.\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.V7","comment":"\n\n\n# Patch changes\n\n  - no longer defaults the placeholder value to the label text\n\n\n# Changes from V6\n\n  - custom takes a list of attributes and appends them to the end of the previous attributes, instead of prepending a single attr.\n  - change `view` API so it only takes a list of attributes (meaning the value and input type are now passed in as attributes)\n  - make the search icon and reset pattern the default for `search`\n  - add \"Show password\" and \"Hide password\" as default behavior for `password` inputs\n  - split password into `newPassword` and `currentPassword` to fix the autocomplete behavior\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\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.V7.Attribute String.String msg"},{"name":"addressLine1","comment":" An input that allows address-line1 entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"autofocus","comment":" Sets the `autofocus` attribute of the resulting HTML input.\n","type":"Nri.Ui.TextInput.V7.Attribute value msg"},{"name":"countryName","comment":" An input that allows country-name entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.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.V7.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 } -> Nri.Ui.TextInput.V7.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.V7.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.V7.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.V7.Attribute (Maybe.Maybe Time.Posix) msg"},{"name":"disabled","comment":" This disables the input\n","type":"Nri.Ui.TextInput.V7.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.V7.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.V7.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.V7.Attribute value msg"},{"name":"familyName","comment":" An input that allows family-name entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"float","comment":" An input that allows float entry\n","type":"(Maybe.Maybe Basics.Float -> msg) -> Nri.Ui.TextInput.V7.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.V7.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.V7.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.V7.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.V7.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.V7.Attribute value msg"},{"name":"map","comment":" ","type":"(a -> b) -> (b -> String.String) -> Nri.Ui.TextInput.V7.Attribute a msg -> Nri.Ui.TextInput.V7.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 } -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"noMargin","comment":" Remove default spacing from the Input.\n","type":"Basics.Bool -> Nri.Ui.TextInput.V7.Attribute value msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.TextInput.V7.Attribute value msg"},{"name":"number","comment":" An input that allows integer entry\n","type":"(Maybe.Maybe Basics.Int -> msg) -> Nri.Ui.TextInput.V7.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.V7.Attribute value msg"},{"name":"onEnter","comment":" ","type":"msg -> Nri.Ui.TextInput.V7.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.V7.Attribute value msg"},{"name":"organization","comment":" An input that allows organization entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"organizationTitle","comment":" An input that allows organization-title entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"placeholder","comment":" ","type":"String.String -> Nri.Ui.TextInput.V7.Attribute value msg"},{"name":"postalCode","comment":" An input that allows postal-code entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"readOnlyText","comment":" A read-only input for text values\n","type":"Nri.Ui.TextInput.V7.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.V7.Attribute String.String msg"},{"name":"sex","comment":" An input that allows sex entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"tel","comment":" An input that allows tel entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.TextInput.V7.Attribute value msg"},{"name":"text","comment":" An input that allows text entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"username","comment":" An input that allows username entry\n","type":"(String.String -> msg) -> Nri.Ui.TextInput.V7.Attribute String.String msg"},{"name":"value","comment":" ","type":"value -> Nri.Ui.TextInput.V7.Attribute value msg"},{"name":"view","comment":" Render the TextInput as HTML.\n","type":"String.String -> List.List (Nri.Ui.TextInput.V7.Attribute value msg) -> Html.Styled.Html msg"},{"name":"visibleLabel","comment":" Default behavior.\n","type":"Nri.Ui.TextInput.V7.Attribute value msg"},{"name":"writing","comment":" Uses the \"Writing\" input style.\n","type":"Nri.Ui.TextInput.V7.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\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\n@docs open\n@docs css, notMobileCss, mobileCss, quizEngineMobileCss, narrowMobileCss, containerCss\n@docs custom\n@docs nriDescription, testId\n@docs primaryLabel, auxiliaryDescription, 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":"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":"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":"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, 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\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\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":"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":"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":"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":"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":"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":"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":"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":"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.V1","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) -> { firstId : String.String, lastId : 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) -> { firstId : String.String, lastId : 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            { firstId = \"first-id\"\n            , lastId = \"last-id\"\n            , tabBackAction = GoToLastId\n            , tabForwardAction = GoToFirstId\n            }\n        )\n\n","type":"List.List (Accessibility.Styled.Key.Event msg) -> { firstId : String.String, lastId : String.String, tabBackAction : msg, tabForwardAction : msg } -> Json.Decode.Decoder msg"}],"binops":[]}]