2 ( Element, none, text, el
3 , row, wrappedRow, column
4 , paragraph, textColumn
5 , Column, table, IndexedColumn, indexedTable
6 , Attribute, width, height, Length, px, shrink, fill, fillPortion, maximum, minimum
8 , padding, paddingXY, paddingEach
9 , spacing, spacingXY, spaceEvenly
10 , centerX, centerY, alignLeft, alignRight, alignTop, alignBottom
11 , transparent, alpha, pointer
12 , moveUp, moveDown, moveRight, moveLeft, rotate, scale
14 , scrollbars, scrollbarX, scrollbarY
15 , layout, layoutWith, Option, noStaticStyleSheet, forceHover, noHover, focusStyle, FocusStyle
16 , link, newTabLink, download, downloadAs
18 , Color, rgba, rgb, rgb255, rgba255, fromRgb, fromRgb255, toRgb
19 , above, below, onRight, onLeft, inFront, behindContent
20 , Attr, Decoration, mouseOver, mouseDown, focused
21 , Device, DeviceClass(..), Orientation(..), classifyDevice
32@docs Element, none, text, el
37When we want more than one child on an element, we want to be _specific_ about how they will be layed out.
39So, the common ways to do that would be `row` and `column`.
41@docs row, wrappedRow, column
46Text layout needs some specific considerations.
48@docs paragraph, textColumn
53@docs Column, table, IndexedColumn, indexedTable
58@docs Attribute, width, height, Length, px, shrink, fill, fillPortion, maximum, minimum
68There's no concept of margin in `elm-ui`, instead we have padding and spacing.
70Padding is the distance between the outer edge and the content, and spacing is the space between children.
72So, if we have the following row, with some padding and spacing.
74 Element.row [ padding 10, spacing 7 ]
80Here's what we can expect:
82
84**Note** `spacing` set on a `paragraph`, will set the pixel spacing between lines.
86@docs padding, paddingXY, paddingEach
88@docs spacing, spacingXY, spaceEvenly
93Alignment can be used to align an `Element` within another `Element`.
95 Element.el [ centerX, alignTop ] (text "I'm centered and aligned top!")
97If alignment is set on elements in a layout such as `row`, then the element will push the other elements in that direction. Here's an example.
100 [ Element.el [] Element.none
101 , Element.el [ alignLeft ] Element.none
102 , Element.el [ centerX ] Element.none
103 , Element.el [ alignRight ] Element.none
106will result in a layout like
110Where there are two elements on the left, one in the center, and one on the right.
112@docs centerX, centerY, alignLeft, alignRight, alignTop, alignBottom
117@docs transparent, alpha, pointer
122@docs moveUp, moveDown, moveRight, moveLeft, rotate, scale
125# Clipping and Scrollbars
127Clip the content if it overflows.
129@docs clip, clipX, clipY
131Add a scrollbar if the content is larger than the element.
133@docs scrollbars, scrollbarX, scrollbarY
138@docs layout, layoutWith, Option, noStaticStyleSheet, forceHover, noHover, focusStyle, FocusStyle
143@docs link, newTabLink, download, downloadAs
153In order to use attributes like `Font.color` and `Background.color`, you'll need to make some colors!
155@docs Color, rgba, rgb, rgb255, rgba255, fromRgb, fromRgb255, toRgb
160Let's say we want a dropdown menu. Essentially we want to say: _put this element below this other element, but don't affect the layout when you do_.
164 [ Element.below (Element.text "I'm below!")
166 (Element.text "I'm normal!")
174Where `"I'm Below"` doesn't change the size of `Element.row`.
176This is very useful for things like dropdown menus or tooltips.
178@docs above, below, onRight, onLeft, inFront, behindContent
183@docs Attr, Decoration, mouseOver, mouseDown, focused
188The main technique for responsiveness is to store window size information in your model.
190Install the `Browser` package, and set up a subscription for [`Browser.Events.onResize`](https://package.elm-lang.org/packages/elm/browser/latest/Browser-Events#onResize).
192You'll also need to retrieve the initial window size. You can either run the following task:
194 Task.perform (\size -> WindowResize { width = size.width, height = size.height }) Window.size
196Or pass in `window.innerWidth` and `window.innerHeight` as flags to your program, which is the preferred way. This requires minor setup on the JS side, but allows you to avoid the state where you don't have window info.
198@docs Device, DeviceClass, Orientation, classifyDevice
208@docs map, mapAttribute
213@docs html, htmlAttribute
217import Html exposing (Html)
218import Html.Attributes
219import Internal.Flag as Flag exposing (Flag)
220import Internal.Model as Internal
221import Internal.Style exposing (classes)
229{-| Provide the red, green, and blue channels for the color.
231Each channel takes a value between 0 and 1.
234rgb : Float -> Float -> Float -> Color
236 Internal.Rgba r g b 1
240rgba : Float -> Float -> Float -> Float -> Color
245{-| Provide the red, green, and blue channels for the color.
247Each channel takes a value between 0 and 255.
250rgb255 : Int -> Int -> Int -> Color
251rgb255 red green blue =
254 (toFloat green / 255)
260rgba255 : Int -> Int -> Int -> Float -> Color
261rgba255 red green blue a =
264 (toFloat green / 255)
269{-| Create a color from an RGB record.
296 (toFloat clr.red / 255)
297 (toFloat clr.green / 255)
298 (toFloat clr.blue / 255)
302{-| Deconstruct a `Color` into it's rgb channels.
312toRgb (Internal.Rgba r g b a) =
320{-| The basic building block of your layout.
324 Element.el [] (Element.text "Howdy!")
327type alias Element msg =
331{-| An attribute that can be attached to an `Element`
333type alias Attribute msg =
334 Internal.Attribute () msg
337{-| This is a special attribute that counts as both a `Attribute msg` and a `Decoration`.
339type alias Attr decorative msg =
340 Internal.Attribute decorative msg
345type alias Decoration =
346 Internal.Attribute Never Never
350html : Html msg -> Element msg
356htmlAttribute : Html.Attribute msg -> Attribute msg
362map : (msg -> msg1) -> Element msg -> Element msg1
368mapAttribute : (msg -> msg1) -> Attribute msg -> Attribute msg1
384{-| Shrink an element to fit its contents.
391{-| Fill the available space. The available space will be split evenly between elements that have `width fill`.
398{-| Similarly you can set a minimum boundary.
408 (text "I will stop at 300px")
411minimum : Int -> Length -> Length
416{-| Add a maximum to a length.
424 (text "I will stop at 300px")
427maximum : Int -> Length -> Length
432{-| Sometimes you may not want to split available space evenly. In this case you can use `fillPortion` to define which elements should have what portion of the available space.
434So, two elements, one with `width (fillPortion 2)` and one with `width (fillPortion 3)`. The first would get 2 portions of the available space, while the second would get 3.
436**Also:** `fill == fillPortion 1`
439fillPortion : Int -> Length
444{-| This is your top level node where you can turn `Element` into `Html`.
446layout : List (Attribute msg) -> Element msg -> Html msg
448 layoutWith { options = [] }
452layoutWith : { options : List Option } -> List (Attribute msg) -> Element msg -> Html msg
453layoutWith { options } attrs child =
454 Internal.renderRoot options
461 -- , classes.contentCenterX
462 -- , classes.contentCenterY
465 :: (Internal.rootStyle ++ attrs)
475{-| Elm UI embeds two StyleSheets, one that is constant, and one that changes dynamically based on styles collected from the elments being rendered.
477This option will stop the static/constant stylesheet from rendering.
479Make sure to render the constant/static stylesheet at least once on your page!
482noStaticStyleSheet : Option
484 Internal.RenderModeOption Internal.NoStaticStyleSheet
489 { borderColor : Maybe Color
490 , backgroundColor : Maybe Color
494 , offset : ( Int, Int )
500 Internal.focusDefaultStyle
504type alias FocusStyle =
505 { borderColor : Maybe Color
506 , backgroundColor : Maybe Color
510 , offset : ( Int, Int )
518focusStyle : FocusStyle -> Option
520 Internal.FocusStyleOption
523{-| Disable all `mouseOver` styles.
527 Internal.HoverOption Internal.NoHover
530{-| Any `hover` styles, aka attributes with `mouseOver` in the name, will be always turned on.
532This is useful for when you're targeting a platform that has no mouse, such as mobile.
537 Internal.HoverOption Internal.ForceHover
540{-| When you want to render exactly nothing.
547{-| Create some plain text.
549 text "Hello, you stylish developer!"
551**Note** text does not wrap by default. In order to get text to wrap, check out `paragraph`!
554text : String -> Element msg
556 Internal.Text content
559{-| The basic building block of your layout.
561You can think of an `el` as a `div`, but it can only have one child.
563If you want multiple children, you'll need to use something like `row` or `column`
565 import Element exposing (Element, rgb)
566 import Element.Background as Background
567 import Element.Border as Border
569 myElement : Element msg
572 [ Background.color (rgb 0 0.5 0)
573 , Border.color (rgb 0 0.7 0)
575 (Element.text "You've made a stylish element!")
578el : List (Attribute msg) -> Element msg -> Element msg
587 (Internal.Unkeyed [ child ])
591row : List (Attribute msg) -> List (Element msg) -> Element msg
596 (Internal.htmlClass (classes.contentLeft ++ " " ++ classes.contentCenterY)
601 (Internal.Unkeyed children)
605column : List (Attribute msg) -> List (Element msg) -> Element msg
606column attrs children =
613 ++ classes.contentLeft
619 (Internal.Unkeyed children)
622{-| Same as `row`, but will wrap if it takes up too much horizontal space.
624wrappedRow : List (Attribute msg) -> List (Element msg) -> Element msg
625wrappedRow attrs children =
628 Internal.extractSpacingAndPadding attrs
638 ++ classes.contentCenterY
646 (Internal.Unkeyed children)
648 Just (Internal.Spaced spaceName x y) ->
652 Just (Internal.Padding name t r b l) ->
653 if r >= x && b >= y then
657 (Internal.PaddingStyle
658 (Internal.paddingName t
683 ++ classes.contentCenterY
692 (Internal.Unkeyed children)
695 -- Not enough space in padding to compensate for spacing
707 ++ classes.contentCenterY
712 (Html.Attributes.style "margin-bottom" (String.fromInt (negate y) ++ "px"))
715 :: Internal.StyleClass Flag.spacing (Internal.SpacingStyle spaceName x y)
718 (Internal.Unkeyed children)
723{-| This is just an alias for `Debug.todo`
729{-| Highlight the borders of an element and it's children below. This can really help if you're running into some issue with your layout!
731**Note** This attribute needs to be handed `Debug.todo` in order to work, even though it won't do anything with it. This is a safety measure so you don't accidently ship code with `explain` in it, as Elm won't compile with `--optimize` if you still have a `Debug` statement in your code.
734 [ Element.explain Debug.todo
736 (text "Help! I'm being debugged!")
739explain : Todo -> Attribute msg
741 Internal.htmlClass "explain"
745type alias Column record msg =
746 { header : Element msg
748 , view : record -> Element msg
752{-| Show some tabular data.
754Start with a list of records and specify how each column should be rendered.
756So, if we have a list of `persons`:
763 persons : List Person
765 [ { firstName = "David"
768 , { firstName = "Florence"
773We could render it using
778 [ { header = Element.text "First Name"
782 Element.text person.firstName
784 , { header = Element.text "Last Name"
788 Element.text person.lastName
793**Note:** Sometimes you might not have a list of records directly in your model. In this case it can be really nice to write a function that transforms some part of your model into a list of records before feeding it into `Element.table`.
799 { data : List records
800 , columns : List (Column records msg)
807 List.map InternalColumn config.columns
812type alias IndexedColumn record msg =
813 { header : Element msg
815 , view : Int -> record -> Element msg
819{-| Same as `Element.table` except the `view` for each column will also receive the row index as well as the record.
824 { data : List records
825 , columns : List (IndexedColumn records msg)
828indexedTable attrs config =
832 List.map InternalIndexedColumn config.columns
837type alias InternalTable records msg =
838 { data : List records
839 , columns : List (InternalTableColumn records msg)
844type InternalTableColumn record msg
845 = InternalIndexedColumn (IndexedColumn record msg)
846 | InternalColumn (Column record msg)
849tableHelper : List (Attribute msg) -> InternalTable data msg -> Element msg
850tableHelper attrs config =
853 Internal.getSpacing attrs ( 0, 0 )
857 InternalIndexedColumn colConfig ->
860 InternalColumn colConfig ->
865 InternalIndexedColumn colConfig ->
868 InternalColumn colConfig ->
872 List.map columnHeader config.columns
874 if List.all ((==) Internal.Empty) headers then
878 Just (List.indexedMap (\col header -> onGrid 1 (col + 1) header) headers)
882 Internal.StyleClass Flag.gridTemplate <|
883 Internal.GridTemplateStyle
884 { spacing = ( px sX, px sY )
885 , columns = List.map columnWidth config.columns
886 , rows = List.repeat (List.length config.data) Internal.Content
889 onGrid rowLevel columnLevel elem =
893 [ Internal.StyleClass Flag.gridPosition
894 (Internal.GridPosition
902 (Internal.Unkeyed [ elem ])
904 add cell columnConfig cursor =
906 InternalIndexedColumn col ->
912 (if maybeHeaders == Nothing then
921 , column = cursor.column + 1
924 InternalColumn col ->
927 onGrid cursor.row cursor.column (col.view cell)
929 , column = cursor.column + 1
932 build columns rowData cursor =
935 List.foldl (add rowData)
940 | row = cursor.row + 1
945 List.foldl (build config.columns)
948 if maybeHeaders == Nothing then
965 (case maybeHeaders of
969 Just renderedHeaders ->
970 renderedHeaders ++ children.elements
975{-| A paragraph will layout all children as wrapped, inline elements.
978 import Element.Font as Font
981 [ text "lots of text ...."
982 , el [ Font.bold ] (text "this is bold")
983 , text "lots of text ...."
986This is really useful when you want to markup text by having some parts be bold, or some be links, or whatever you so desire.
988Also, if a child element has `alignLeft` or `alignRight`, then it will be moved to that side and the text will flow around it, (ah yes, `float` behavior).
990This makes it particularly easy to do something like a [dropped capital](https://en.wikipedia.org/wiki/Initial).
993 import Element.Font as Font
1001 , text "o much text ...."
1004Which will look something like
1006
1008**Note** `spacing` on a paragraph will set the pixel spacing between lines.
1011paragraph : List (Attribute msg) -> List (Element msg) -> Element msg
1012paragraph attrs children =
1014 Internal.asParagraph
1016 (Internal.Describe Internal.Paragraph
1021 (Internal.Unkeyed children)
1024{-| Now that we have a paragraph, we need some way to attach a bunch of paragraph's together.
1026To do that we can use a `textColumn`.
1028The main difference between a `column` and a `textColumn` is that `textColumn` will flow the text around elements that have `alignRight` or `alignLeft`, just like we just saw with paragraph.
1030In the following example, we have a `textColumn` where one child has `alignLeft`.
1032 Element.textColumn [ spacing 10, padding 10 ]
1033 [ paragraph [] [ text "lots of text ...." ]
1034 , el [ alignLeft ] none
1035 , paragraph [] [ text "lots of text ...." ]
1038Which will result in something like:
1040
1043textColumn : List (Attribute msg) -> List (Element msg) -> Element msg
1044textColumn attrs children =
1046 Internal.asTextColumn
1055 (Internal.Unkeyed children)
1058{-| Both a source and a description are required for images.
1060The description is used for people using screen readers.
1062Leaving the description blank will cause the image to be ignored by assistive technology. This can make sense for images that are purely decorative and add no additional information.
1064So, take a moment to describe your image as you would to someone who has a harder time seeing.
1067image : List (Attribute msg) -> { src : String, description : String } -> Element msg
1068image attrs { src, description } =
1078 Internal.Height _ ->
1088 (Internal.htmlClass classes.imageContainer
1094 (Internal.NodeName "img")
1095 ([ Internal.Attr <| Html.Attributes.src src
1096 , Internal.Attr <| Html.Attributes.alt description
1100 (Internal.Unkeyed [])
1108 { url = "http://fruits.com"
1109 , label = text "A link to my favorite fruit provider."
1114 List (Attribute msg)
1117 , label : Element msg
1120link attrs { url, label } =
1123 (Internal.NodeName "a")
1124 (Internal.Attr (Html.Attributes.href url)
1125 :: Internal.Attr (Html.Attributes.rel "noopener noreferrer")
1128 :: Internal.htmlClass
1129 (classes.contentCenterX
1131 ++ classes.contentCenterY
1135 (Internal.Unkeyed [ label ])
1140 List (Attribute msg)
1143 , label : Element msg
1146newTabLink attrs { url, label } =
1149 (Internal.NodeName "a")
1150 (Internal.Attr (Html.Attributes.href url)
1151 :: Internal.Attr (Html.Attributes.rel "noopener noreferrer")
1152 :: Internal.Attr (Html.Attributes.target "_blank")
1155 :: Internal.htmlClass (classes.contentCenterX ++ " " ++ classes.contentCenterY)
1158 (Internal.Unkeyed [ label ])
1161{-| A link to download a file.
1163**Note** If you're using `Browser.application`, then this won't be enough to actually trigger a file download due to how `Browser.Navigation` works.
1165[Here's a description of what needs to happen](https://github.com/elm/html/issues/175).
1169 List (Attribute msg)
1172 , label : Element msg
1175download attrs { url, label } =
1178 (Internal.NodeName "a")
1179 (Internal.Attr (Html.Attributes.href url)
1180 :: Internal.Attr (Html.Attributes.download "")
1183 :: Internal.htmlClass classes.contentCenterX
1184 :: Internal.htmlClass classes.contentCenterY
1187 (Internal.Unkeyed [ label ])
1190{-| A link to download a file, but you can specify the filename.
1193 List (Attribute msg)
1195 { label : Element msg
1200downloadAs attrs { url, filename, label } =
1203 (Internal.NodeName "a")
1204 (Internal.Attr (Html.Attributes.href url)
1205 :: Internal.Attr (Html.Attributes.download filename)
1208 :: Internal.htmlClass classes.contentCenterX
1209 :: Internal.htmlClass classes.contentCenterY
1212 (Internal.Unkeyed [ label ])
1216below : Element msg -> Attribute msg
1218 Internal.Nearby Internal.Below element
1222above : Element msg -> Attribute msg
1224 Internal.Nearby Internal.Above element
1228onRight : Element msg -> Attribute msg
1230 Internal.Nearby Internal.OnRight element
1234onLeft : Element msg -> Attribute msg
1236 Internal.Nearby Internal.OnLeft element
1239{-| This will place an element in front of another.
1241**Note:** If you use this on a `layout` element, it will place the element as fixed to the viewport which can be useful for modals and overlays.
1244inFront : Element msg -> Attribute msg
1246 Internal.Nearby Internal.InFront element
1249{-| This will place an element between the background and the content of an element.
1251behindContent : Element msg -> Attribute msg
1252behindContent element =
1253 Internal.Nearby Internal.Behind element
1257width : Length -> Attribute msg
1263height : Length -> Attribute msg
1269scale : Float -> Attr decorative msg
1271 Internal.TransformComponent Flag.scale (Internal.Scale ( n, n, 1 ))
1275rotate : Float -> Attr decorative msg
1277 Internal.TransformComponent Flag.rotate (Internal.Rotate ( 0, 0, 1 ) angle)
1281moveUp : Float -> Attr decorative msg
1283 Internal.TransformComponent Flag.moveY (Internal.MoveY (negate y))
1287moveDown : Float -> Attr decorative msg
1289 Internal.TransformComponent Flag.moveY (Internal.MoveY y)
1293moveRight : Float -> Attr decorative msg
1295 Internal.TransformComponent Flag.moveX (Internal.MoveX x)
1299moveLeft : Float -> Attr decorative msg
1301 Internal.TransformComponent Flag.moveX (Internal.MoveX (negate x))
1305padding : Int -> Attribute msg
1307 Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt x) x x x x)
1310{-| Set horizontal and vertical padding.
1312paddingXY : Int -> Int -> Attribute msg
1315 Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt x) x x x x)
1318 Internal.StyleClass Flag.padding
1319 (Internal.PaddingStyle
1320 ("p-" ++ String.fromInt x ++ "-" ++ String.fromInt y)
1328{-| If you find yourself defining unique paddings all the time, you might consider defining
1339 paddingEach { edges | right = 5 }
1342paddingEach : { top : Int, right : Int, bottom : Int, left : Int } -> Attribute msg
1343paddingEach { top, right, bottom, left } =
1344 if top == right && top == bottom && top == left then
1345 Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt top) top top top top)
1348 Internal.StyleClass Flag.padding
1349 (Internal.PaddingStyle
1350 (Internal.paddingName top right bottom left)
1359centerX : Attribute msg
1361 Internal.AlignX Internal.CenterX
1365centerY : Attribute msg
1367 Internal.AlignY Internal.CenterY
1371alignTop : Attribute msg
1373 Internal.AlignY Internal.Top
1377alignBottom : Attribute msg
1379 Internal.AlignY Internal.Bottom
1383alignLeft : Attribute msg
1385 Internal.AlignX Internal.Left
1389alignRight : Attribute msg
1391 Internal.AlignX Internal.Right
1395spaceEvenly : Attribute msg
1397 Internal.Class Flag.xAlign (.spaceEvenly Internal.Style.classes)
1401spacing : Int -> Attribute msg
1403 Internal.StyleClass Flag.spacing (Internal.SpacingStyle (Internal.spacingName x x) x x)
1406{-| In the majority of cases you'll just need to use `spacing`, which will work as intended.
1408However for some layouts, like `textColumn`, you may want to set a different spacing for the x axis compared to the y axis.
1411spacingXY : Int -> Int -> Attribute msg
1413 Internal.StyleClass Flag.spacing (Internal.SpacingStyle (Internal.spacingName x y) x y)
1416{-| Make an element transparent and have it ignore any mouse or touch events, though it will stil take up space.
1418transparent : Bool -> Attr decorative msg
1421 Internal.StyleClass Flag.transparency (Internal.Transparency "transparent" 1.0)
1424 Internal.StyleClass Flag.transparency (Internal.Transparency "visible" 0.0)
1427{-| A capped value between 0.0 and 1.0, where 0.0 is transparent and 1.0 is fully opaque.
1429Semantically equavalent to html opacity.
1432alpha : Float -> Attr decorative msg
1441 Internal.StyleClass Flag.transparency <| Internal.Transparency ("transparency-" ++ Internal.floatClass transparency) transparency
1446-- hidden : Bool -> Attribute msg
1449-- Internal.class "hidden"
1451-- Internal.NoAttribute
1455scrollbars : Attribute msg
1457 Internal.Class Flag.overflow classes.scrollbars
1461scrollbarY : Attribute msg
1463 Internal.Class Flag.overflow classes.scrollbarsY
1467scrollbarX : Attribute msg
1469 Internal.Class Flag.overflow classes.scrollbarsX
1475 Internal.Class Flag.overflow classes.clip
1479clipY : Attribute msg
1481 Internal.Class Flag.overflow classes.clipY
1485clipX : Attribute msg
1487 Internal.Class Flag.overflow classes.clipX
1490{-| Set the cursor to be a pointing hand when it's hovering over this element.
1492pointer : Attribute msg
1494 Internal.Class Flag.cursor classes.cursorPointer
1499 { class : DeviceClass
1500 , orientation : Orientation
1518{-| Takes in a Window.Size and returns a device profile which can be used for responsiveness.
1520classifyDevice : { window | height : Int, width : Int } -> Device
1521classifyDevice window =
1523 if window.width <= 600 then
1526 else if window.width > 600 && window.width <= 1200 then
1529 else if window.width > 1200 && window.width <= 1800 then
1535 if window.width < window.height then
1543{-| When designing it's nice to use a modular scale to set spacial rythms.
1546 Scale.modular 16 1.25
1548A modular scale starts with a number, and multiplies it by a ratio a number of times.
1549Then, when setting font sizes you can use:
1551 Font.size (scaled 1) -- results in 16
1553 Font.size (scaled 2) -- 16 * 1.25 results in 20
1555 Font.size (scaled 4) -- 16 * 1.25 ^ (4 - 1) results in 31.25
1557We can also provide negative numbers to scale below 16px.
1559 Font.size (scaled -1) -- 16 * 1.25 ^ (-1) results in 12.8
1562modular : Float -> Float -> Int -> Float
1563modular normal ratio rescale =
1564 if rescale == 0 then
1567 else if rescale < 0 then
1568 normal * ratio ^ toFloat rescale
1571 normal * ratio ^ (toFloat rescale - 1)
1575mouseOver : List Decoration -> Attribute msg
1577 Internal.StyleClass Flag.hover <|
1578 Internal.PseudoSelector Internal.Hover
1579 (Internal.unwrapDecorations decs)
1583mouseDown : List Decoration -> Attribute msg
1585 Internal.StyleClass Flag.active <|
1586 Internal.PseudoSelector Internal.Active
1587 (Internal.unwrapDecorations decs)
1591focused : List Decoration -> Attribute msg
1593 Internal.StyleClass Flag.focus <|
1594 Internal.PseudoSelector Internal.Focus
1595 (Internal.unwrapDecorations decs)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list