[{"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.V1","comment":"\n\n@docs view, viewKeyed\n@docs viewCaret, Caret\n@docs AccordionOptions, StyleOptions\n\n","unions":[{"name":"Caret","comment":" DefaultCaret is the blue caret\n","args":[],"cases":[["DefaultCaret",[]],["WhiteCaret",[]],["NoneCaret",[]]]}],"aliases":[{"name":"AccordionOptions","comment":" ","args":["entry","msg"],"type":"{ entries : List.List ( entry, Basics.Bool ), viewHeader : entry -> Accessibility.Styled.Html msg, viewContent : entry -> Accessibility.Styled.Html msg, customStyles : Maybe.Maybe (entry -> Nri.Ui.Accordion.V1.StyleOptions), caret : Nri.Ui.Accordion.V1.Caret, toggle : entry -> 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":"view","comment":" ","type":"Nri.Ui.Accordion.V1.AccordionOptions entry msg -> Accessibility.Styled.Html msg"},{"name":"viewCaret","comment":" Just the caret!\n","type":"Basics.Bool -> Nri.Ui.Accordion.V1.Caret -> Accessibility.Styled.Html msg"},{"name":"viewKeyed","comment":" If your accordion's rows can be moved around, use viewKeyed. It prevents\nthe caret's animation from firing off incorrectly when rows move.\n","type":"Nri.Ui.Accordion.V1.AccordionOptions entry msg -> (entry -> String.String) -> Accessibility.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    import Nri.Ui.DisclosureIndicator.V2 as DisclosureIndicator\n\n    view : Model -> Html Msg\n    view model =\n        div []\n            [ Accordion.view\n                { entries =\n                    [ AccordionEntry\n                        { caret = \\isOpen -> DisclosureIndicator.large [ marginRight (px 8) ] isOpen\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\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":"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.AssetPath","comment":" Helpers for dealing with assets.\n\n@docs Asset, url\n\n","unions":[{"name":"Asset","comment":" ","args":[],"cases":[["Asset",["String.String"]]]}],"aliases":[],"values":[{"name":"url","comment":" ","type":"Nri.Ui.AssetPath.Asset -> String.String"}],"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\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":"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.V1","comment":" You propably want to use `Nri.Tooltip` not this.\nThis is used to display a ballon-like container.\n\n@docs balloon\n\n\n## Customizations for Balloon\n\nUse these if you don't want the standard green balloon\n\n@docs Attribute\n@docs green, purple, orange, white, navy\n@docs onBottom, onLeft, onRight, onTop\n@docs widthPx, widthPct\n@docs paddingPx\n\n    balloon [ green, onTop ] (text \"hello\")\n\n","unions":[{"name":"Attribute","comment":" Balloon's attributes.\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"balloon","comment":" Green balloon without an arrow by default.\n\n     __________\n    |         |\n    |_________|\n\n","type":"List.List Nri.Ui.Balloon.V1.Attribute -> Html.Styled.Html msg -> Html.Styled.Html msg"},{"name":"green","comment":" Green theme (This is the default theme.)\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"navy","comment":" Navy theme\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"onBottom","comment":" Balloon with the arrow on the top.\n\n     ___/\\_____\n    |         |\n    |_________|\n\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"onLeft","comment":" Balloon with the arrow on the right.\n\n      __________\n     |         |\n     |          >\n     |_________|\n\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"onRight","comment":" Balloon with the arrow on the left.\n\n      __________\n     |         |\n    <          |\n     |_________|\n\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"onTop","comment":" Balloon with the arrow on the bottom.\n\n     __________\n    |         |\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"orange","comment":" Orange theme\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"paddingPx","comment":" Padding of the balloon in pixels.\n","type":"Basics.Float -> Nri.Ui.Balloon.V1.Attribute"},{"name":"purple","comment":" Purple theme\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"white","comment":" White theme\n","type":"Nri.Ui.Balloon.V1.Attribute"},{"name":"widthPct","comment":" Warning: using a percentage-based width may change the positioning of the element\nin unexpected ways.\n","type":"Basics.Float -> Nri.Ui.Balloon.V1.Attribute"},{"name":"widthPx","comment":" Width of the balloon in pixels.\n","type":"Basics.Float -> Nri.Ui.Balloon.V1.Attribute"}],"binops":[]},{"name":"Nri.Ui.Button.V10","comment":"\n\n\n# Patch changes:\n\n  - uses ClickableAttributes\n  - adds `nriDescription`, `testId`, and `id` helpers\n  - adds `modal` helper, an alias for `large` size\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@docs icon, custom, css, nriDescription, testId, id\n\n\n## Behavior\n\n@docs onClick\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\n\n## Change the color scheme\n\n@docs primary, secondary, danger, premium\n\n\n## Change the state (buttons only)\n\n@docs enabled, unfulfilled, disabled, error, loading, success\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":"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":"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. If a button, this attribute will disable it.\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":"fillContainerWidth","comment":" ","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":"modal","comment":" Alias for Button.large\n","type":"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":"premium","comment":" ","type":"Nri.Ui.Button.V10.Attribute msg"},{"name":"primary","comment":" ","type":"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":"success","comment":" Shows success styling. If a button, this attribute will disable it.\n","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":"unfulfilled","comment":" Shows inactive styles.\n","type":"Nri.Ui.Button.V10.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Checkbox.V5","comment":"\n\n\n# Patch changes\n\n  - Use Nri.Ui.Svg.V1 rather than a custom Icon type specific to this module\n  - Make the filter ids within the svg unique (now the id depends on the checkbox identifier)\n  - Explicitly box-sizing content-box on the label (<https://github.com/NoRedInk/NoRedInk/pull/30886#issuecomment-737854831>)\n\n\n# Changes from V5:\n\n  - Removes `noOpMsg` from Model\n  - Removes dependency on external assets\n\n@docs Model, Theme, IsSelected\n\n@docs view, viewWithLabel\n\n@docs selectedFromBool\n\n","unions":[{"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",[]]]},{"name":"Theme","comment":" ","args":[],"cases":[["Square",[]],["Locked",[]]]}],"aliases":[{"name":"Model","comment":" ","args":["msg"],"type":"{ identifier : String.String, label : String.String, setterMsg : Basics.Bool -> msg, selected : Nri.Ui.Checkbox.V5.IsSelected, disabled : Basics.Bool, theme : Nri.Ui.Checkbox.V5.Theme }"}],"values":[{"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.V5.IsSelected"},{"name":"view","comment":" Shows a checkbox (the label is only used for accessibility hints)\n","type":"Nri.Ui.Checkbox.V5.Model msg -> Accessibility.Styled.Html msg"},{"name":"viewWithLabel","comment":" Shows a checkbox and its label text\n","type":"Nri.Ui.Checkbox.V5.Model msg -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.ClickableSvg.V2","comment":"\n\n\n# Patch changes:\n\n    - adds `nriDescription`, `testId`, and `id` helpers\n\n\n# Create a button or link\n\n@docs button, link\n@docs Attribute\n\n\n## Behavior\n\n@docs onClick\n@docs href, linkSpa, linkExternal, linkWithMethod, linkWithTracking, linkExternalWithTracking\n\n\n## Sizing\n\n@docs small, medium, large\n@docs exactWidth, exactHeight\n\n\n## State\n\n@docs disabled\n\n\n## Customization\n\n@docs withBorder\n@docs primary, secondary, danger, dangerSecondary\n\n@docs custom, css, nriDescription, testId, id\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":"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":"id","comment":" ","type":"String.String -> Nri.Ui.ClickableSvg.V2.Attribute msg"},{"name":"large","comment":" ","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":" ","type":"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":"primary","comment":" white/transparent icon on an azure background.\n","type":"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.\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":"\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\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## Behavior\n\n@docs onClick\n@docs href, linkSpa, linkExternal, linkWithMethod, linkWithTracking, linkExternalWithTracking\n\n@docs icon\n@docs custom, css, nriDescription, testId, id\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"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":"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":"modal","comment":" For use in Modal footers (adds `large` and `Css.marginTop (Css.px 15)`)\n","type":"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":"small","comment":" ","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\n","unions":[],"aliases":[],"values":[{"name":"fromCssColor","comment":" ","type":"Css.Color -> SolidColor.SolidColor"},{"name":"toCssColor","comment":" ","type":"SolidColor.SolidColor -> Css.Color"},{"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":" ","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# Changelog\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 paddingPx, custom, css, testId, id\n\n\n## Content\n\n@docs 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":" ","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":"paddingPx","comment":" Changes the padding inside the container border around the content.\n","type":"Basics.Float -> 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":"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.PremiumLevel","comment":"\n\n@docs PremiumLevel, allowedFor, highest, lowest\n\n","unions":[{"name":"PremiumLevel","comment":" ","args":[],"cases":[["Free",[]],["Premium",[]],["PremiumWithWriting",[]]]}],"aliases":[],"values":[{"name":"allowedFor","comment":" Is content of the required premium level accessbile by the actor?\n","type":"Nri.Ui.Data.PremiumLevel.PremiumLevel -> Nri.Ui.Data.PremiumLevel.PremiumLevel -> Basics.Bool"},{"name":"highest","comment":" The highest premium level in a list\n","type":"List.List Nri.Ui.Data.PremiumLevel.PremiumLevel -> Maybe.Maybe Nri.Ui.Data.PremiumLevel.PremiumLevel"},{"name":"lowest","comment":" The lowest premium level in a list\n","type":"List.List Nri.Ui.Data.PremiumLevel.PremiumLevel -> Maybe.Maybe Nri.Ui.Data.PremiumLevel.PremiumLevel"}],"binops":[]},{"name":"Nri.Ui.DisclosureIndicator.V2","comment":"\n\n\n# Changes from V1\n\n  - Removes dependency on Icon that makes versioned assets hard to work with\n  - Renames the helpers to `medium` and `large`\n  - Removes `Config` in favor of an explicit type annotation\n\n\n# About:\n\nA caret that indicates that a section can expand and collapse. When `isOpen` is True, the caret will rotate down.\n\"Disclosure indicator\" is a standard term for something that indicates that section can expand.\n\n@docs medium, large\n\n","unions":[],"aliases":[],"values":[{"name":"large","comment":" ","type":"List.List Css.Style -> Basics.Bool -> Html.Styled.Html msg"},{"name":"medium","comment":" ","type":"List.List Css.Style -> Basics.Bool -> Html.Styled.Html msg"}],"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.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.Heading.V2","comment":"\n\n\n# Patch changes:\n\n    - adds `nriDescription`, `testId`, and `id` helpers\n\nHeadings with customization options for accessibility.\n\n@docs h1, h2, h3, h4, h5\n\n@docs Attribute, style, Style, error, errorIf\n\n@docs custom, css, nriDescription, testId, id\n@docs customAttr\n\n","unions":[{"name":"Attribute","comment":" Like an `Html.Attribute msg`, but specifically for headings. Use things\nlike `style` and `errorIf` in this module to construct them.\n","args":["msg"],"cases":[]},{"name":"Style","comment":" ","args":[],"cases":[["Top",[]],["Tagline",[]],["Subhead",[]],["Small",[]]]}],"aliases":[],"values":[{"name":"css","comment":" Set some custom CSS in this heading. For example, maybe you need to tweak\nmargins. Now you can!\n","type":"List.List Css.Style -> Nri.Ui.Heading.V2.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.V2.Attribute msg"},{"name":"customAttr","comment":" Please prefer `custom` for API consistency.\n","type":"Html.Styled.Attribute msg -> Nri.Ui.Heading.V2.Attribute msg"},{"name":"error","comment":" Use this when the header is on top of a section in an error state.\n","type":"Nri.Ui.Heading.V2.Attribute msg"},{"name":"errorIf","comment":" Show an error if some condition is met.\n\n    Heading.h1\n        [ Heading.errorIf (model.errorMessage /= Nothing) ]\n        [ Html.text \"Hello! ]\n\n","type":"Basics.Bool -> Nri.Ui.Heading.V2.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.V2.Attribute msg) -> List.List (Html.Styled.Html 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.V2.Attribute msg) -> List.List (Html.Styled.Html 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.V2.Attribute msg) -> List.List (Html.Styled.Html 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.V2.Attribute msg) -> List.List (Html.Styled.Html 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.V2.Attribute msg) -> List.List (Html.Styled.Html msg) -> Html.Styled.Html msg"},{"name":"id","comment":" ","type":"String.String -> Nri.Ui.Heading.V2.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Heading.V2.Attribute msg"},{"name":"style","comment":" Select which of the base styles this heading should look like. Each of h1..5\nhas a default, check their docs to see if you don't need to override this.\n","type":"Nri.Ui.Heading.V2.Style -> Nri.Ui.Heading.V2.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Heading.V2.Attribute msg"}],"binops":[]},{"name":"Nri.Ui.Html.Attributes.V2","comment":"\n\n\n# Patch changes:\n\n    - adds `nriDescription` and `testId` helpers\n\nExtras for working with Html.Attributes.\n\nThis is the new version of Nri.Ui.Html.Attributes.Extra.\n\n@docs none, includeIf, targetBlank, nriDescription, 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":"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":"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.V3","comment":" InputStyles 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\n\n## Changelog\n\n  - patch: expose defaultMarginTop\n\n  - V3: add UserGenerated\n\n","unions":[{"name":"Theme","comment":" ","args":[],"cases":[["ContentCreation",[]],["Standard",[]],["UserGenerated",[]],["Writing",[]]]}],"aliases":[],"values":[{"name":"defaultMarginTop","comment":" ","type":"Basics.Float"},{"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.V3.Theme -> Basics.Bool -> Css.Style"},{"name":"inputLineHeight","comment":" ","type":"Css.Px"},{"name":"inputPaddingVertical","comment":" ","type":"Css.Px"},{"name":"label","comment":" ","type":"Nri.Ui.InputStyles.V3.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 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":"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\n@docs facebook, twitter, clever, cleverC, googleClassroom, googleG\n\n","unions":[],"aliases":[],"values":[{"name":"clever","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"cleverC","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"facebook","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"googleClassroom","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"googleG","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"noredink","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"twitter","comment":" ","type":"Nri.Ui.Svg.V1.Svg"}],"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":" Standard media queries for NRI responsive pages.\nCan be used to create a Snippet using Css.Global.media\n\n@docs mobile, notMobile\n@docs quizEngineMobile\n\n","unions":[],"aliases":[],"values":[{"name":"mobile","comment":" Mobile styles using a 1000px max-width\n\n`minWidth (px 1)` is for a bug in IE which causes the media query to initially trigger regardless of window size\n\nSee: <http://stackoverflow.com/questions/25673707/ie11-triggers-css-transition-on-page-load-when-non-applied-media-query-exists/25850649#25850649>\n\n","type":"Css.Media.MediaQuery"},{"name":"notMobile","comment":" Non-mobile styles using a 1000px min-width\n","type":"Css.Media.MediaQuery"},{"name":"quizEngineMobile","comment":" Teacher & student facing styles using a 700px max-width\n\n`minWidth (px 1)` is for a bug in IE which causes the media query to initially trigger regardless of window size\n\nSee: <http://stackoverflow.com/questions/25673707/ie11-triggers-css-transition-on-page-load-when-non-applied-media-query-exists/25850649#25850649>\n\n","type":"Css.Media.MediaQuery"}],"binops":[]},{"name":"Nri.Ui.Menu.V1","comment":" A togglable menu view and related buttons.\n\n<https://zpl.io/a75OrE2>\n\n\n## Menu buttons\n\n@docs view, Alignment, TitleWrapping\n@docs iconButton\n@docs iconButtonWithMenu\n@docs iconLink\n\n\n## Menu content\n\n@docs Entry, group, none, entry\n\n","unions":[{"name":"Alignment","comment":" Whether the menu content sticks to the left or right side of the button\n","args":[],"cases":[["Left",[]],["Right",[]]]},{"name":"Entry","comment":" Represents zero or more entries within the menu content\n","args":["msg"],"cases":[]},{"name":"TitleWrapping","comment":" Determines how we deal with long titles. Should we make the menu expand in\nheight to show the full title or truncate it instead?\n","args":[],"cases":[["WrapAndExpandTitle",[]],["TruncateTitle",[]]]}],"aliases":[],"values":[{"name":"entry","comment":" Represents a single entry\n","type":"Html.Styled.Html msg -> Nri.Ui.Menu.V1.Entry msg"},{"name":"group","comment":" Represents a group of entries with a named legend\n","type":"String.String -> List.List (Nri.Ui.Menu.V1.Entry msg) -> Nri.Ui.Menu.V1.Entry msg"},{"name":"iconButton","comment":" Display an icon button consistent with menu button.\n","type":"{ icon : Nri.Ui.Svg.V1.Svg, label : String.String, isTooltipOpen : Basics.Bool, onShowTooltip : Basics.Bool -> msg, onClick : msg, isDisabled : Basics.Bool, id : String.String } -> Html.Styled.Html msg"},{"name":"iconButtonWithMenu","comment":" Configure the icon button & menu\n\n  - `icon`: the icon that will be used in the iconButton\n  - `label`: the text to display in the tooltip\n  - `isTooltipOpen`: whether the tooltip is open when hovering over the icon\n  - `onShowTooltip`: the message for toggling the tooltip\n  - `entries`: the entries of the menu\n  - `isOpen`: whether the menu is opened\n  - `onToggle`: a message to trigger when then menu wants to invert its open state\n  - `alignment`: where the menu popover should appear relative to the button\n  - `isDisabled`: whether the menu can be openned\n  - `id`: a unique string id for the menu elements\n  - `menuWidth` : optionally fix the width of the popover\n\n","type":"{ icon : Nri.Ui.Svg.V1.Svg, label : String.String, isTooltipOpen : Basics.Bool, onShowTooltip : Basics.Bool -> msg, entries : List.List (Nri.Ui.Menu.V1.Entry msg), isOpen : Basics.Bool, onToggle : Basics.Bool -> msg, alignment : Nri.Ui.Menu.V1.Alignment, isDisabled : Basics.Bool, menuWidth : Maybe.Maybe Basics.Int, id : String.String } -> Html.Styled.Html msg"},{"name":"iconLink","comment":" Display an icon link consistent with menu button styles.\n","type":"{ icon : Nri.Ui.Svg.V1.Svg, label : String.String, isTooltipOpen : Basics.Bool, onShowTooltip : Basics.Bool -> msg, linkUrl : String.String, isDisabled : Basics.Bool } -> Html.Styled.Html msg"},{"name":"none","comment":" Represents no entries. Useful for conditionals\n","type":"Nri.Ui.Menu.V1.Entry msg"},{"name":"view","comment":" Configure the menu\n\n  - `icon`: display a particular icon to the left of the title\n  - `entries`: the entries of the menu\n  - `title`: the text to display in the menu button\n  - `onToggle`: a message to trigger when then menu wants to invert its open state\n  - `hasBorder`: whether the menu button has a border\n  - `alignment`: where the menu popover should appear relative to the button\n  - `isDisabled`: whether the menu can be openned\n  - `buttonWidth`: optionally fix the width of the button to a number of pixels\n  - `menuWidth` : optionally fix the width of the popover\n  - `id`: a unique string id for the menu elements\n\n","type":"{ icon : Maybe.Maybe Nri.Ui.Svg.V1.Svg, entries : List.List (Nri.Ui.Menu.V1.Entry msg), title : String.String, isOpen : Basics.Bool, onToggle : Basics.Bool -> msg, hasBorder : Basics.Bool, alignment : Nri.Ui.Menu.V1.Alignment, wrapping : Nri.Ui.Menu.V1.TitleWrapping, isDisabled : Basics.Bool, buttonWidth : Maybe.Maybe Basics.Int, menuWidth : Maybe.Maybe Basics.Int, id : String.String } -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Menu.V2","comment":" Changes from V1:\n\n  - Improves keyboard support\n  - replaces `onToggle` with `focusAndToggle`\n  - remove `iconButton` and `iconLink` (use ClickableSvg instead)\n  - replace iconButtonWithMenu helper with a custom helper\n  - explicitly pass in a buttonId and a menuId (instead of the container id)\n  - when wrapping the menu title, use the title in the description rather than an HTML id string\n  - separate out the data for the viewCustom menu and the data used to make a nice looking shared default button\n  - remove None\n  - change the Single API to allow passing-in of the id and passing-back of the menu item attributes\n\nA togglable menu view and related buttons.\n\n<https://zpl.io/a75OrE2>\n\n\n## Menu buttons\n\n@docs view, Alignment, TitleWrapping\n@docs viewCustom\n\n\n## Menu content\n\n@docs Entry, group, entry\n\n","unions":[{"name":"Alignment","comment":" Whether the menu content sticks to the left or right side of the button\n","args":[],"cases":[["Left",[]],["Right",[]]]},{"name":"Entry","comment":" Represents zero or more entries within the menu content\n","args":["msg"],"cases":[]},{"name":"TitleWrapping","comment":" Determines how we deal with long titles. Should we make the menu expand in\nheight to show the full title or truncate it instead?\n","args":[],"cases":[["WrapAndExpandTitle",[]],["TruncateTitle",[]]]}],"aliases":[],"values":[{"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.V2.Entry msg"},{"name":"group","comment":" Represents a group of entries with a named legend.\n","type":"String.String -> List.List (Nri.Ui.Menu.V2.Entry msg) -> Nri.Ui.Menu.V2.Entry msg"},{"name":"view","comment":" Menu/pulldown configuration:\n\n  - `entries`: the entries of the menu\n  - `focusAndToggle`: the message produced to control the open/closed state and DOM focus\n  - `alignment`: where the menu popover should appear relative to the button\n  - `isDisabled`: whether the menu can be openned\n  - `menuWidth` : optionally fix the width of the popover\n  - `buttonId`: a unique string identifier for the button that opens/closes the menu\n  - `menuId`: a unique string identifier for the menu\n\nButton configuration:\n\n  - `icon`: display a particular icon to the left of the title\n  - `title`: the text to display in the menu button\n  - `wrapping`: WrapAndExpandTitle | TruncateTitle\n  - `hasBorder`: whether the menu button has a border\n  - `buttonWidth`: optionally fix the width of the button to a number of pixels\n\n","type":"{ entries : List.List (Nri.Ui.Menu.V2.Entry msg), isOpen : Basics.Bool, focusAndToggle : { isOpen : Basics.Bool, focus : Maybe.Maybe String.String } -> msg, alignment : Nri.Ui.Menu.V2.Alignment, isDisabled : Basics.Bool, menuWidth : Maybe.Maybe Basics.Int, buttonId : String.String, menuId : String.String } -> { icon : Maybe.Maybe Nri.Ui.Svg.V1.Svg, title : String.String, wrapping : Nri.Ui.Menu.V2.TitleWrapping, hasBorder : Basics.Bool, buttonWidth : Maybe.Maybe Basics.Int } -> Html.Styled.Html msg"},{"name":"viewCustom","comment":"\n\n  - `entries`: the entries of the menu\n  - `focusAndToggle`: the message produced to control the open/closed state and DOM focus\n  - `alignment`: where the menu popover should appear relative to the button\n  - `isDisabled`: whether the menu can be openned\n  - `menuWidth` : optionally fix the width of the popover\n  - `buttonId`: a unique string identifier for the button that opens/closes the menu\n  - `menuId`: a unique string identifier for the menu\n\n","type":"{ entries : List.List (Nri.Ui.Menu.V2.Entry msg), isOpen : Basics.Bool, focusAndToggle : { isOpen : Basics.Bool, focus : Maybe.Maybe String.String } -> msg, alignment : Nri.Ui.Menu.V2.Alignment, isDisabled : Basics.Bool, menuWidth : Maybe.Maybe Basics.Int, buttonId : String.String, menuId : String.String } -> (List.List (Html.Styled.Attribute msg) -> Html.Styled.Html msg) -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Menu.V3","comment":" Changes from V2:\n\n  - Adpoted attribute pattern\n  - Added option to customize the z-index\n\nA togglable menu view and related buttons.\n\n<https://zpl.io/a75OrE2>\n\n\n## Menu rendering\n\n@docs view, button, custom\n@docs Attribute, Button, ButtonAttribute\n\n\n## Menu attributes\n\n@docs alignment, isDisabled, menuWidth, buttonId, menuId, menuZIndex\n@docs Alignment\n\n\n## Button attributes\n\n@docs icon, wrapping, hasBorder, buttonWidth\n@docs TitleWrapping\n\n\n## Menu content\n\n@docs Entry, group, entry\n\n","unions":[{"name":"Alignment","comment":" Whether the menu content sticks to the left or right side of the button\n","args":[],"cases":[["Left",[]],["Right",[]]]},{"name":"Attribute","comment":" ","args":["msg"],"cases":[]},{"name":"Button","comment":" ","args":["msg"],"cases":[]},{"name":"ButtonAttribute","comment":" ","args":[],"cases":[]},{"name":"Entry","comment":" Represents zero or more entries within the menu content\n","args":["msg"],"cases":[]},{"name":"TitleWrapping","comment":" Determines how we deal with long titles. Should we make the menu expand in\nheight to show the full title or truncate it instead?\n","args":[],"cases":[["WrapAndExpandTitle",[]],["TruncateTitle",[]]]}],"aliases":[],"values":[{"name":"alignment","comment":" Where the menu popover should appear relative to the button\n","type":"Nri.Ui.Menu.V3.Alignment -> Nri.Ui.Menu.V3.Attribute msg"},{"name":"button","comment":" Defines a standard `Button` for the menu\n","type":"List.List Nri.Ui.Menu.V3.ButtonAttribute -> String.String -> Nri.Ui.Menu.V3.Button msg"},{"name":"buttonId","comment":" A unique string identifier for the button that opens/closes the menu\n","type":"String.String -> Nri.Ui.Menu.V3.Attribute msg"},{"name":"buttonWidth","comment":" Fix the width of the button to a number of pixels\n","type":"Basics.Int -> Nri.Ui.Menu.V3.ButtonAttribute"},{"name":"custom","comment":" Defines a custom `Button` for the menu\n","type":"(List.List (Html.Styled.Attribute msg) -> Html.Styled.Html msg) -> Nri.Ui.Menu.V3.Button 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.V3.Entry msg"},{"name":"group","comment":" Represents a group of entries with a named legend.\n","type":"String.String -> List.List (Nri.Ui.Menu.V3.Entry msg) -> Nri.Ui.Menu.V3.Entry msg"},{"name":"hasBorder","comment":" Whether the menu button has a border. If not specified it defaults to `True`.\n","type":"Basics.Bool -> Nri.Ui.Menu.V3.ButtonAttribute"},{"name":"icon","comment":" Display a particular icon to the left of the title\n","type":"Nri.Ui.Svg.V1.Svg -> Nri.Ui.Menu.V3.ButtonAttribute"},{"name":"isDisabled","comment":" Whether the menu can be openned\n","type":"Basics.Bool -> Nri.Ui.Menu.V3.Attribute msg"},{"name":"menuId","comment":" A unique string identifier for the menu\n","type":"String.String -> Nri.Ui.Menu.V3.Attribute msg"},{"name":"menuWidth","comment":" Fix the width of the popover |\n","type":"Basics.Int -> Nri.Ui.Menu.V3.Attribute msg"},{"name":"menuZIndex","comment":" The CSS `z-index` used to render the menu. Defaults to `1`.\n","type":"Basics.Int -> Nri.Ui.Menu.V3.Attribute msg"},{"name":"view","comment":" Menu/pulldown configuration:\n\n  - `attributes`: List of (attributes)[#menu-attributes] to apply to the menu.\n  - `config`: Configuration parameters:\n      - `button`: the `Button` to open the menu\n      - `entries`: the entries of the menu\n      - `isOpen`: whether the menu is currently open or not\n      - `focusAndToggle`: the message produced to control the open/closed state and DOM focus\n\n","type":"List.List (Nri.Ui.Menu.V3.Attribute msg) -> Nri.Ui.Menu.V3.Config msg -> Html.Styled.Html msg"},{"name":"wrapping","comment":" Determines how we deal with long titles. If not specified it defaults to `WrapAndExpandTitle`.\n","type":"Nri.Ui.Menu.V3.TitleWrapping -> Nri.Ui.Menu.V3.ButtonAttribute"}],"binops":[]},{"name":"Nri.Ui.Message.V3","comment":" Changes from V2:\n\n    - adds helpers: `custom`,`css`,`icon`,`testId`,`id`\n\nPatch changes:\n\n  - add `httpError`\n\n\n# View\n\n@docs somethingWentWrong\n@docs view, Attribute\n@docs icon, custom, css, testId, id\n\n\n## Size\n\n@docs tiny, large, banner\n\n\n## Content\n\n@docs plaintext, markdown, html, httpError\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":"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":"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":"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":"plaintext","comment":" Provide a plain-text string.\n","type":"String.String -> 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\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":" ","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.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.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.V6","comment":"\n\n@docs view\n\nThis module is used when there may or may not be Premium\ncontent to be \"checked\"!\n\n\n# Patch changes\n\n  - Use Nri.Ui.Pennant.V2.premiumFlag instead of Nri.Ui.Pennant.V1.premiumFlag\n\n\n# Changes from V5\n\n  - Allow checkbox to show pennant, or not, based on bool\n  - Remove PremiumWithWriting, it's only Premium now\n\n","unions":[],"aliases":[],"values":[{"name":"view","comment":" A checkbox that should be used for premium content\n\n  - `onChange`: A message for when the user toggles the checkbox\n  - `onLockedClick`: A message for when the user clicks a checkbox they don't have PremiumLevel for.\n    If you get this message, you should show an `Nri.Ui.Premium.Model.view`\n\n","type":"{ label : String.String, id : String.String, selected : Nri.Ui.Checkbox.V5.IsSelected, disabled : Basics.Bool, isLocked : Basics.Bool, isPremium : Basics.Bool, onChange : Basics.Bool -> msg, onLockedClick : msg } -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.RadioButton.V2","comment":" Changes from V1:\n\n  - adds an outline when a radio button is focused\n  - remove NoOp/event swallowing (it broke default radio button behavior)\n\n@docs view, premium\n\n","unions":[],"aliases":[],"values":[{"name":"premium","comment":" A radio button that should be used for premium content.\n\nThis radio button is locked when the premium level of the content\nis greater than the premium level of the teacher.\n\n  - `onChange`: A message for when the user selected the radio button\n  - `onLockedClick`: A message for when the user clicks a radio button they don't have PremiumLevel for.\n    If you get this message, you should show an `Nri.Premium.Model.view`\n\n","type":"{ label : String.String, value : a, name : String.String, selectedValue : Maybe.Maybe a, teacherPremiumLevel : Nri.Ui.Data.PremiumLevel.PremiumLevel, contentPremiumLevel : Nri.Ui.Data.PremiumLevel.PremiumLevel, onSelect : a -> msg, premiumMsg : msg, valueToString : a -> String.String, showPennant : Basics.Bool, isDisabled : Basics.Bool } -> Accessibility.Styled.Html msg"},{"name":"view","comment":" View a single radio button.\nIf used in a group, all radio buttons in the group should have the same name attribute.\n","type":"{ label : String.String, value : a, name : String.String, selectedValue : Maybe.Maybe a, onSelect : a -> msg, valueToString : a -> String.String } -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.RadioButton.V3","comment":" Changes from V2:\n\n  - list based API instead of record based\n  - add disclosure to show rich content when the radio is selected\n  - allow customization of the id\n  - add gray and azure borders to make the radios easier to distinguish visually\n\n@docs view\n\n\n### Content\n\n@docs premium, showPennant\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.V3.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.V3.Attribute value msg"},{"name":"disabled","comment":" This disables the input\n","type":"Nri.Ui.RadioButton.V3.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.V3.Attribute value msg"},{"name":"enabled","comment":" This enables the input, this is the default behavior\n","type":"Nri.Ui.RadioButton.V3.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.V3.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.V3.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.V3.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.V3.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 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.V3.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.V3.Attribute value msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.RadioButton.V3.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.V3.Attribute value msg"},{"name":"premium","comment":" Lock Premium content if the user does not have Premium.\n","type":"{ teacherPremiumLevel : Nri.Ui.Data.PremiumLevel.PremiumLevel, contentPremiumLevel : Nri.Ui.Data.PremiumLevel.PremiumLevel } -> Nri.Ui.RadioButton.V3.Attribute value msg"},{"name":"showPennant","comment":" Show Premium pennant on Premium content.\n\nWhen the pennant is clicked, the msg that's passed in will fire.\n\nFor RadioButton.V4, consider removing `showPennant` from the API.\n\n","type":"msg -> Nri.Ui.RadioButton.V3.Attribute value msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.RadioButton.V3.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.V3.Attribute value msg) -> Accessibility.Styled.Html msg"},{"name":"visibleLabel","comment":" Shows the visible label. This is the default behavior\n","type":"Nri.Ui.RadioButton.V3.Attribute value msg"}],"binops":[]},{"name":"Nri.Ui.SegmentedControl.V14","comment":" Changes 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.V2.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.V2.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\n\n### Input content\n\n@docs value\n\n\n### Attributes\n\n@docs Attribute, defaultDisplayText\n@docs hiddenLabel, visibleLabel\n@docs 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 }"}],"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":"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":"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":"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.Slide.V1","comment":" Note: You'll almost certainly want to used keyed nodes if you're\nusing this module.\n\n@docs AnimationDirection\n@docs withSlidingContents\n@docs animateIn, animateOut\n\n","unions":[{"name":"AnimationDirection","comment":" Slide from right to left or from left to right.\n","args":[],"cases":[["FromRTL",[]],["FromLTR",[]]]}],"aliases":[],"values":[{"name":"animateIn","comment":" Add this style to the element you want to animate in.\n","type":"Nri.Ui.Slide.V1.AnimationDirection -> Css.Style"},{"name":"animateOut","comment":" Add this style to the element you want to animate out.\nNote: this will absolutely position the element.\nYou must add `withSlidingContents` to one of its ancestors.\n","type":"Nri.Ui.Slide.V1.AnimationDirection -> Css.Style"},{"name":"withSlidingContents","comment":" Add this class to the container whose descendents are sliding.\n","type":"Css.Style"}],"binops":[]},{"name":"Nri.Ui.SlideModal.V2","comment":"\n\n@docs Config, Panel\n@docs State, closed, open\n@docs view\n\n","unions":[{"name":"State","comment":" ","args":[],"cases":[]}],"aliases":[{"name":"Config","comment":" ","args":["msg"],"type":"{ panels : List.List Nri.Ui.SlideModal.V2.Panel, height : Css.Px, parentMsg : Nri.Ui.SlideModal.V2.State -> msg }"},{"name":"Panel","comment":" Configuration for a single modal view in the sequence of modal views.\n","args":[],"type":"{ icon : Accessibility.Styled.Html Basics.Never, title : String.String, content : Accessibility.Styled.Html Basics.Never, buttonLabel : String.String }"}],"values":[{"name":"closed","comment":" Close the modal.\n","type":"Nri.Ui.SlideModal.V2.State"},{"name":"open","comment":" Create the open state for the modal (the first panel will show).\n","type":"Nri.Ui.SlideModal.V2.State"},{"name":"view","comment":" View the modal (includes the modal backdrop).\n","type":"Nri.Ui.SlideModal.V2.Config msg -> Nri.Ui.SlideModal.V2.State -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.SortableTable.V2","comment":"\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.V2.State id -> msg, columns : List.List (Nri.Ui.SortableTable.V2.Column id entry msg) }"},{"name":"Sorter","comment":" ","args":["a"],"type":"Nri.Ui.SortableTable.V2.SortDirection -> a -> a -> Basics.Order"},{"name":"State","comment":" ","args":["id"],"type":"{ column : id, sortDirection : Nri.Ui.SortableTable.V2.SortDirection }"}],"values":[{"name":"combineSorters","comment":" ","type":"List.List (Nri.Ui.SortableTable.V2.Sorter entry) -> Nri.Ui.SortableTable.V2.Sorter entry"},{"name":"custom","comment":" ","type":"{ id : id, header : Html.Styled.Html msg, view : entry -> Html.Styled.Html msg, sorter : Nri.Ui.SortableTable.V2.Sorter entry, width : Basics.Int, cellStyles : entry -> List.List Css.Style } -> Nri.Ui.SortableTable.V2.Column id entry msg"},{"name":"init","comment":" ","type":"id -> Nri.Ui.SortableTable.V2.State id"},{"name":"initDescending","comment":" ","type":"id -> Nri.Ui.SortableTable.V2.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.V2.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.V2.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.V2.Column id entry msg"},{"name":"view","comment":" ","type":"Nri.Ui.SortableTable.V2.Config id entry msg -> Nri.Ui.SortableTable.V2.State id -> List.List entry -> Html.Styled.Html msg"},{"name":"viewLoading","comment":" ","type":"Nri.Ui.SortableTable.V2.Config id entry msg -> Nri.Ui.SortableTable.V2.State id -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Svg.V1","comment":"\n\n@docs Svg\n@docs withColor, withLabel, withWidth, withHeight, withCss\n@docs fromHtml, toHtml\n\n","unions":[{"name":"Svg","comment":" Opaque type describing a non-interactable Html element.\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"fromHtml","comment":" Tag html as being an svg.\n","type":"Html.Styled.Html Basics.Never -> Nri.Ui.Svg.V1.Svg"},{"name":"toHtml","comment":" Render an svg.\n","type":"Nri.Ui.Svg.V1.Svg -> Html.Styled.Html 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":"withHeight","comment":" ","type":"Css.Px -> Nri.Ui.Svg.V1.Svg -> Nri.Ui.Svg.V1.Svg"},{"name":"withLabel","comment":" Add a string aria-label property to the element.\n\nSee [Using the aria-label attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute) for\nguidelines of when and how to use this attribute.\n\n","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.V1","comment":"\n\n@docs view, Attribute, onSwitch, disabled, id, label, custom\n\n","unions":[{"name":"Attribute","comment":" ","args":["msg"],"cases":[]}],"aliases":[],"values":[{"name":"custom","comment":" Pass custom attributes through to be attached to the underlying input.\n","type":"List.List (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Switch.V1.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":"Nri.Ui.Switch.V1.Attribute msg"},{"name":"id","comment":" Set the HTML ID of the switch toggle. If you have only one on the page,\nyou don't need to set this, but you should definitely set it if you have\nmore than one.\n","type":"String.String -> Nri.Ui.Switch.V1.Attribute msg"},{"name":"label","comment":" Add labeling text to the switch. This text should be descriptive and\nable to be displayed inline. It should _not_ be interactive (if it were\nergonomic to make this argument `Html Never`, we would!)\n","type":"Accessibility.Styled.Html msg -> Nri.Ui.Switch.V1.Attribute msg"},{"name":"onSwitch","comment":" Specify what happens when the switch is toggled.\n","type":"(Basics.Bool -> msg) -> Nri.Ui.Switch.V1.Attribute msg"},{"name":"view","comment":" Render a switch. The boolean here indicates whether the switch is on\nor not.\n","type":"List.List (Nri.Ui.Switch.V1.Attribute msg) -> Basics.Bool -> Accessibility.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Table.V4","comment":" Upgrading from V1:\n\n  - All the `width` fields in column configurations now take an elm-css length\n    value rather than an Integer. Change `width = 100` to `width = px 100` to get\n    the same widths as before.\n  - Tables now by default take the full width of the container they are placed in.\n    If this is not what you want, wrap the table in an element with a fixed width.\n  - The table module now makes use of `Html.Styled` and no longer exposes a\n    separate `styles` value.\n    Check out the [elm-css](http://package.elm-lang.org/packages/rtfeldman/elm-css/14.0.0/Html-Styled)\n    documentation on Html.Styled to see how to work with it.\n  - The default cell padding has been removed and content is not vertically\n    centered in its cell. If you need to overwrite this, wrap your cells in\n    elements providing custom styling to the cell.\n\n@docs Column, custom, string\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":[]}],"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 } -> Nri.Ui.Table.V4.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 } -> Nri.Ui.Table.V4.Column data msg"},{"name":"view","comment":" Displays a table of data based on the provided column definitions\n","type":"List.List (Nri.Ui.Table.V4.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.V4.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.V4.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.V4.Column data msg) -> List.List data -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.Table.V5","comment":" Upgrading from V4:\n\n  - The columns take an additional `cellStyles` property that allow\n    you to specify additional styles such as cell background color\n    or text alignment.\n\n@docs Column, custom, string\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":[]}],"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 } -> Nri.Ui.Table.V5.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 } -> Nri.Ui.Table.V5.Column data msg"},{"name":"view","comment":" Displays a table of data based on the provided column definitions\n","type":"List.List (Nri.Ui.Table.V5.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.V5.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.V5.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.V5.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":" Changes 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.V2.Attribute msg) -> Nri.Ui.Tabs.V7.Attribute id msg"}],"binops":[]},{"name":"Nri.Ui.Text.V6","comment":" Changes 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.V2.\n\n\n## Paragraph styles\n\n@docs caption, mediumBody, mediumBodyGray, smallBody, smallBodyGray\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":"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":" Text types for writing:\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.V4","comment":"\n\n\n## Upgrading to V4\n\n  - Adds field for onBlur\n\n\n## The Nri styleguide-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@docs view, writing, contentCreation, Height, HeightBehavior, Model, generateId\n\n","unions":[{"name":"Height","comment":" For specifying the actual height.\n","args":[],"cases":[["DefaultHeight",[]],["SingleLine",[]]]},{"name":"HeightBehavior","comment":" Control whether to auto-expand the height.\n","args":[],"cases":[["Fixed",[]],["AutoResize",["Nri.Ui.TextArea.V4.Height"]]]}],"aliases":[{"name":"Model","comment":" ","args":["msg"],"type":"{ value : String.String, autofocus : Basics.Bool, onInput : String.String -> msg, onBlur : Maybe.Maybe msg, isInError : Basics.Bool, height : Nri.Ui.TextArea.V4.HeightBehavior, placeholder : String.String, label : String.String, showLabel : Basics.Bool }"}],"values":[{"name":"contentCreation","comment":" Used for Content Creation\n","type":"Nri.Ui.TextArea.V4.Model msg -> Html.Styled.Html msg"},{"name":"generateId","comment":" ","type":"String.String -> String.String"},{"name":"view","comment":" ","type":"Nri.Ui.TextArea.V4.Model msg -> Html.Styled.Html msg"},{"name":"writing","comment":" Used for Writing Cycles\n","type":"Nri.Ui.TextArea.V4.Model msg -> Html.Styled.Html msg"}],"binops":[]},{"name":"Nri.Ui.TextInput.V7","comment":"\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\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":"autofocus","comment":" Sets the `autofocus` attribute of the resulting HTML input.\n","type":"Nri.Ui.TextInput.V7.Attribute value 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":"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":"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":"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":"placeholder","comment":" If not explicit placeholder is given, the input label will be used as the placeholder.\n","type":"String.String -> Nri.Ui.TextInput.V7.Attribute value 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":"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":"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.V1","comment":" A tooltip component!\n\nThese tooltips follow the accessibility recommendations from: <https://inclusive-components.design/tooltips-toggletips>\n\nExample usage:\n\n        tooltip [ Html.text \"Gradebook\" ]\n        |> withPadding SmallPadding\n        |> withWidth FitToContent\n        |> primaryLabel {\n            trigger = OnClick\n            , triggerHtml = someTriggerHtml\n            , onTrigger = MyOnTriggerMsg\n            , isOpen = True\n            , extraButtonAttrs = modalV9LastFocusableElement\n        }\n\n\n## Suggested Improvements for V2\n\n  - The toggle tip does not currently manage focus correctly for keyboard users - if a\n    user tries to click on a link in the toggle tip, the tip will disappear as focus moves\n    to the next item in the page. This should be improved in the next release.\n  - Currently, only toggle tip supports links on hover - generalize this to all tooltips\n\n\n## Tooltip Construction\n\n@docs Tooltip, tooltip\n\n@docs Position, withPosition\n\n@docs Width, withWidth\n\n@docs Padding, withPadding\n\n@docs withTooltipStyleOverrides\n\n@docs Trigger\n\n\n## View Functions\n\n@docs primaryLabel, auxillaryDescription, toggleTip\n\n","unions":[{"name":"Padding","comment":" How much padding should be around the content inside the tooltip?\n","args":[],"cases":[["SmallPadding",[]],["NormalPadding",[]]]},{"name":"Position","comment":" Where should this tooltip be positioned?\n","args":[],"cases":[["OnTop",[]],["OnBottom",[]],["OnLeft",[]],["OnRight",[]]]},{"name":"Tooltip","comment":" A standard NoRedInk tooltip, which appears around its parent element.\n\nCreate versions of me with `tooltip`, and customize them with functions like\n`withPosition` and `withTheme` from this model. Like so:\n\n    tooltip [ Html.text \"Hello, World!\" ]\n        |> withPosition OnLeft\n\n","args":["msg"],"cases":[]},{"name":"Trigger","comment":" How do you open this tooltip?\n\n  - `OnHover`: the tooltip opens when hovering over the trigger element, and\n    closes when the hover stops.\n  - `OnClick`: the tooltip opens when clicking the root element, and closes when\n    anything but the tooltip is clicked again.\n\nNote: design typically prefers `OnHover`. However, if your tooltip has a link that someone\nneeds to click, use `OnClick` because hover tooltips will currently close when you try\nto click the link.\n\nFIXME: Make it so you can click on links in hover tooltips.\n\n","args":[],"cases":[["OnHover",[]],["OnClick",[]]]},{"name":"Width","comment":" Should the tooltip be exactly some measurement or fit to the width of the\ncontent?\n","args":[],"cases":[["Exactly",["Basics.Int"]],["FitToContent",[]]]}],"aliases":[],"values":[{"name":"auxillaryDescription","comment":" Used when the content of the tooltip provides an \"auxillary description\" for its content.\n","type":"{ trigger : Nri.Ui.Tooltip.V1.Trigger, triggerHtml : Accessibility.Styled.Html msg, extraButtonAttrs : List.List (Accessibility.Styled.Attribute msg), onTrigger : Basics.Bool -> msg, isOpen : Basics.Bool, id : String.String } -> Nri.Ui.Tooltip.V1.Tooltip msg -> Accessibility.Styled.Html msg"},{"name":"primaryLabel","comment":" Used when the content of the tooltip is the \"primary label\" for its content, for example,\nwhen the trigger content is an icon. The tooltip content will supercede the content of the trigger\nHTML for screen readers.\n\nHere's what the fields in the configuration record do:\n\n  - `trigger`: How do you open this tooltip?\n  - `triggerHtml`: What element do you interact with to open the tooltip?\n  - `extraButtonAttrs`: Adds attributes to the trigger button. Useful for things like focus management, like with Accessible Modal\n  - `onTrigger`: What `msg` should I send when the tooltip should open and\n    close? The `Bool` represents the next `isOpen` value.\n  - `isOpen`: Is the tooltip open now? (keep track of this in your model somewhere)\n  - `id`: A unique identifier used to associate the trigger with its content\n\n","type":"{ trigger : Nri.Ui.Tooltip.V1.Trigger, triggerHtml : Accessibility.Styled.Html msg, extraButtonAttrs : List.List (Accessibility.Styled.Attribute msg), onTrigger : Basics.Bool -> msg, isOpen : Basics.Bool, id : String.String } -> Nri.Ui.Tooltip.V1.Tooltip msg -> Accessibility.Styled.Html msg"},{"name":"toggleTip","comment":" Supplementary information triggered by a \"?\" icon\n\nA toggle tip is always triggered by a hover (or focus, for keyboard users)\n\n","type":"{ onTrigger : Basics.Bool -> msg, isOpen : Basics.Bool, label : String.String, extraButtonAttrs : List.List (Accessibility.Styled.Attribute msg) } -> Nri.Ui.Tooltip.V1.Tooltip msg -> Accessibility.Styled.Html msg"},{"name":"tooltip","comment":" Construct a tooltip given some content.\n","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Tooltip.V1.Tooltip msg"},{"name":"withPadding","comment":" Set the padding around the edges of the tooltip.\n","type":"Nri.Ui.Tooltip.V1.Padding -> Nri.Ui.Tooltip.V1.Tooltip msg -> Nri.Ui.Tooltip.V1.Tooltip msg"},{"name":"withPosition","comment":" Set a tooltip's position:\n\n    tooltip [ text \"I'm on the left!\" ]\n        |> withPosition OnLeft\n\n","type":"Nri.Ui.Tooltip.V1.Position -> Nri.Ui.Tooltip.V1.Tooltip msg -> Nri.Ui.Tooltip.V1.Tooltip msg"},{"name":"withTooltipStyleOverrides","comment":" Set some custom styles on the tooltip. These will be treated as overrides,\nso be careful!\n","type":"List.List Css.Style -> Nri.Ui.Tooltip.V1.Tooltip msg -> Nri.Ui.Tooltip.V1.Tooltip msg"},{"name":"withWidth","comment":" Set the width of the tooltip itself.\n","type":"Nri.Ui.Tooltip.V1.Width -> Nri.Ui.Tooltip.V1.Tooltip msg -> Nri.Ui.Tooltip.V1.Tooltip msg"}],"binops":[]},{"name":"Nri.Ui.Tooltip.V2","comment":" Known issues:\n\n  - tooltips with focusable content (e.g., a link) will not handle focus correctly for\n    keyboard-only users when using the onHover attribute\n\nPost-release patches:\n\n  - fix overlay for onClick toolTip having a border\n  - mark customTriggerAttributes as deprecated\n  - add containerCss\n  - adds `nriDescription` and `testId`\n  - fix <https://github.com/NoRedInk/noredink-ui/issues/766>\n\nChanges from V1:\n\n  - {Position, withPosition} -> {onTop, onBottom, onLeft, onRight}\n  - withTooltipStyleOverrides -> css\n  - {Width, withWidth} -> {exactWidth, fitToContent}\n  - {Padding, withPadding} -> {smallPadding, normalPadding}\n  - adds customPadding\n  - adds custom for custom attributes\n  - adds plaintext, html helpers for setting the content\n  - pass a list of attributes rather than requiring a pipeline to set up the tooltip\n  - move Trigger into the attributes\n  - change primaryLabel and auxillaryDescription to attributes, adding view\n  - move the onTrigger event to the attributes\n  - extraButtonAttrs becomes attribute `customTriggerAttributes`\n  - isOpen field becomes the `open` attribute\n  - fold toggleTip and view into each other, so there's less to maintain\n  - adds withoutTail\n\nThese tooltips follow the accessibility recommendations from: <https://inclusive-components.design/tooltips-toggletips>\n\nExample usage:\n\n        Tooltip.view\n            { trigger =\n                \\attrs ->\n                    ClickableText.button \"Click me to open the tooltip\"\n                        [ ClickableText.custom attrs ]\n            , id = \"my-tooltip\"\n            }\n            [ Tooltip.plaintext \"Gradebook\"\n            , Tooltip.primaryLabel\n            , Tooltip.onClick MyOnTriggerMsg\n            , Tooltip.open True\n            ]\n\n@docs view, toggleTip\n@docs Attribute\n@docs plaintext, html\n@docs withoutTail\n@docs onTop, onBottom, onLeft, onRight\n@docs alignStart, alignMiddle, alignEnd\n@docs exactWidth, fitToContent\n@docs smallPadding, normalPadding, customPadding\n@docs onClick, onHover\n@docs open\n@docs css, containerCss\n@docs custom, customTriggerAttributes\n@docs nriDescription, testId\n@docs primaryLabel, auxillaryDescription\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.V2.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.V2.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.V2.Attribute msg"},{"name":"auxillaryDescription","comment":" Used when the content of the tooltip provides an \"auxillary description\" for its content.\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"containerCss","comment":" ","type":"List.List Css.Style -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"css","comment":" Set some custom styles on the tooltip. These will be treated as overrides,\nso be careful!\n","type":"List.List Css.Style -> Nri.Ui.Tooltip.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 (Accessibility.Styled.Attribute Basics.Never) -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"customPadding","comment":" Pass in the desired spacing around the edge of the tooltip (pixels).\n","type":"Basics.Float -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"customTriggerAttributes","comment":" DEPRECATED -- a future release will remove this helper.\n","type":"List.List (Accessibility.Styled.Attribute msg) -> Nri.Ui.Tooltip.V2.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.V2.Attribute msg"},{"name":"fitToContent","comment":" Tooltip width fits its content.\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"html","comment":" ","type":"List.List (Accessibility.Styled.Html msg) -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"normalPadding","comment":" This the default spacing.\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"nriDescription","comment":" ","type":"String.String -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"onBottom","comment":"\n\n     ___/\\_____\n    |         |\n    |_________|\n\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"onClick","comment":" The tooltip opens when clicking the root element, and closes when anything but the tooltip is clicked again.\n","type":"(Basics.Bool -> msg) -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"onHover","comment":" The tooltip opens when hovering over the trigger element, and closes when the hover stops.\n","type":"(Basics.Bool -> msg) -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"onLeft","comment":"\n\n      __________\n     |         |\n     |          >\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"onRight","comment":"\n\n      __________\n     |         |\n    <          |\n     |_________|\n\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"onTop","comment":"\n\n     __________\n    |         |\n    |___  ____|\n        \\/\n\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"open","comment":" ","type":"Basics.Bool -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"plaintext","comment":" ","type":"String.String -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"primaryLabel","comment":" Used when the content of the tooltip is the \"primary label\" for its content, for example,\nwhen the trigger content is an icon. The tooltip content will supercede the content of the trigger\nHTML for screen readers.\n\nThis is the default.\n\n","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"smallPadding","comment":" ","type":"Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"testId","comment":" ","type":"String.String -> Nri.Ui.Tooltip.V2.Attribute msg"},{"name":"toggleTip","comment":" Supplementary information triggered by a \"?\" icon.\n","type":"{ label : String.String } -> List.List (Nri.Ui.Tooltip.V2.Attribute msg) -> Accessibility.Styled.Html 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.V2.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.V2.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, sortArrow\n@docs archive, unarchive\n@docs share, preview, skip, copyToClipboard, gift\n@docs activity\n@docs footsteps, compass, speedometer, bulb, help, checklist\n@docs hat, keychain\n@docs sprout, sapling, tree\n@docs person, couple, class, leaderboard, performance\n@docs calendar, clock\n@docs missingDocument, document, documents, newspaper, openBook, openBooks\n@docs edit, pen\n@docs speechBalloon, mail\n@docs arrowTop, arrowRight, arrowDown, arrowLeft, arrowPointingRight, arrowPointingRightThick\n@docs checkmark, checkmarkInCircle, x\n@docs attention, exclamation\n@docs flag, star, starFilled, starOutline\n@docs equals, plus, null\n@docs key, lock, premiumLock\n@docs badge\n@docs bold, italic, underline, list, link, undo, redo\n@docs home, library\n@docs search, searchInCicle\n@docs openQuotationMark, closeQuotationMark\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":"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":"bold","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"bulb","comment":" ","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":"checkmark","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"checkmarkInCircle","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":"compass","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"copyToClipboard","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":"equals","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":"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":"hat","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"help","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"home","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"italic","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":"missingDocument","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":"openQuotationMark","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":"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":"redo","comment":" ","type":"Nri.Ui.Svg.V1.Svg"},{"name":"sapling","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":"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":"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"}],"binops":[]}]