Initial commit
This commit is contained in:
commit
a3fb7dd5e4
|
@ -0,0 +1 @@
|
||||||
|
elm-stuff
|
|
@ -0,0 +1,28 @@
|
||||||
|
ifeq ("$(ELM)","")
|
||||||
|
ELM=elm
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ("$(ELMLIVE)", "")
|
||||||
|
ELMLIVE=elm-live
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ("$(UGLIFYJS)", "")
|
||||||
|
UGLIFYJS=uglifyjs
|
||||||
|
endif
|
||||||
|
|
||||||
|
BUILD_DIR=js
|
||||||
|
|
||||||
|
dev: js/main.js
|
||||||
|
release: js/main.min.js
|
||||||
|
|
||||||
|
js/main.js: src/**
|
||||||
|
$(ELM) make src/Main.elm --output $(BUILD_DIR)/main.js
|
||||||
|
|
||||||
|
js/main.min.js: js/main.tmp.js
|
||||||
|
@$(UGLIFYJS) $(BUILD_DIR)/main.tmp.js --compress 'pure_funcs="F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9",pure_getters,keep_fargs=false,unsafe_comps,unsafe' | $(UGLIFYJS) --mangle > $(BUILD_DIR)/main.min.js
|
||||||
|
|
||||||
|
js/main.tmp.js: src/**
|
||||||
|
@$(ELM) make src/Main.elm --optimize --output $(BUILD_DIR)/main.tmp.js
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -rf $(BUILD_DIR)/{main.js,main.min.js}
|
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"type": "application",
|
||||||
|
"source-directories": [
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"elm-version": "0.19.1",
|
||||||
|
"dependencies": {
|
||||||
|
"direct": {
|
||||||
|
"elm/browser": "1.0.2",
|
||||||
|
"elm/core": "1.0.5",
|
||||||
|
"elm/html": "1.0.0",
|
||||||
|
"mdgriffith/elm-ui": "1.1.8"
|
||||||
|
},
|
||||||
|
"indirect": {
|
||||||
|
"elm/json": "1.1.3",
|
||||||
|
"elm/time": "1.0.0",
|
||||||
|
"elm/url": "1.0.0",
|
||||||
|
"elm/virtual-dom": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test-dependencies": {
|
||||||
|
"direct": {},
|
||||||
|
"indirect": {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
<!doctype HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>elmoji</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="node"></div>
|
||||||
|
<script src="js/main.js"></script>
|
||||||
|
<script>
|
||||||
|
var app = Elm.Main.init({
|
||||||
|
node: document.getElementById('node')
|
||||||
|
});
|
||||||
|
|
||||||
|
app.ports.copy.subscribe(function(str) {
|
||||||
|
var el = document.createElement('textarea');
|
||||||
|
el.value = str;
|
||||||
|
el.setAttribute('readonly', '');
|
||||||
|
el.style = {position: 'absolute', left: '-9999px'};
|
||||||
|
document.body.appendChild(el);
|
||||||
|
el.select();
|
||||||
|
document.execCommand('copy');
|
||||||
|
document.body.removeChild(el);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,127 @@
|
||||||
|
port module Main exposing (..)
|
||||||
|
|
||||||
|
import Browser
|
||||||
|
import Element exposing (Element)
|
||||||
|
import Element.Border as Border
|
||||||
|
import Element.Input as Input
|
||||||
|
import Emoji
|
||||||
|
import Html
|
||||||
|
import Html.Attributes
|
||||||
|
|
||||||
|
|
||||||
|
main =
|
||||||
|
Browser.element
|
||||||
|
{ init = init
|
||||||
|
, update = update
|
||||||
|
, subscriptions = \_ -> Sub.none
|
||||||
|
, view = view
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- MODEL --
|
||||||
|
|
||||||
|
|
||||||
|
type alias Model =
|
||||||
|
{ category : Emoji.Category
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
init : () -> ( Model, Cmd Msg )
|
||||||
|
init _ =
|
||||||
|
( { category = Emoji.Recent }, Cmd.none )
|
||||||
|
|
||||||
|
|
||||||
|
type Msg
|
||||||
|
= CategoryClicked Emoji.Category
|
||||||
|
| Copy String
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- UPDATE --
|
||||||
|
|
||||||
|
|
||||||
|
update : Msg -> Model -> ( Model, Cmd Msg )
|
||||||
|
update msg model =
|
||||||
|
case msg of
|
||||||
|
CategoryClicked category ->
|
||||||
|
( { model | category = category }, Cmd.none )
|
||||||
|
|
||||||
|
Copy c ->
|
||||||
|
( model, copy c )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- VIEW --
|
||||||
|
|
||||||
|
|
||||||
|
view : Model -> Html.Html Msg
|
||||||
|
view model =
|
||||||
|
Element.layout []
|
||||||
|
(Element.column [ Element.width (Element.px 512), Element.height (Element.px 512) ]
|
||||||
|
[ header, panel (Emoji.getEmojis model.category) ]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
header : Element Msg
|
||||||
|
header =
|
||||||
|
Element.row [ Element.width Element.fill, Element.padding 5, Element.spacing 10 ]
|
||||||
|
(Emoji.categories
|
||||||
|
|> List.map
|
||||||
|
(\x ->
|
||||||
|
Input.button [ Element.padding 5, Border.color (Element.rgb255 0 0 0), Border.width 1, Border.rounded 5 ]
|
||||||
|
{ label = Element.el [] (emoji (Emoji.categoryEmoji x))
|
||||||
|
, onPress = Just (CategoryClicked x)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
panel : List Emoji.Emoji -> Element Msg
|
||||||
|
panel em =
|
||||||
|
em
|
||||||
|
|> regroup 10
|
||||||
|
|> List.map (\x -> List.map maybeEmoji x)
|
||||||
|
|> List.map (Element.row [ Element.width Element.fill ])
|
||||||
|
|> Element.column [ Element.width (Element.px 512), Element.height (Element.px 512), Element.scrollbarY ]
|
||||||
|
|
||||||
|
|
||||||
|
emoji : Emoji.Emoji -> Element Msg
|
||||||
|
emoji e =
|
||||||
|
Input.button [ Element.htmlAttribute (Html.Attributes.title e.name), Element.centerX, Element.centerY ]
|
||||||
|
{ label = Element.text e.unicode, onPress = Just (Copy e.unicode) }
|
||||||
|
|
||||||
|
|
||||||
|
maybeEmoji : Maybe Emoji.Emoji -> Element Msg
|
||||||
|
maybeEmoji e =
|
||||||
|
Element.el [ Element.width Element.fill, Element.padding 10 ] (Maybe.map emoji e |> Maybe.withDefault Element.none)
|
||||||
|
|
||||||
|
|
||||||
|
regroup : Int -> List Emoji.Emoji -> List (List (Maybe Emoji.Emoji))
|
||||||
|
regroup num input =
|
||||||
|
List.reverse (regroupAux [] [] num input)
|
||||||
|
|
||||||
|
|
||||||
|
regroupAux : List (List (Maybe Emoji.Emoji)) -> List (Maybe Emoji.Emoji) -> Int -> List Emoji.Emoji -> List (List (Maybe Emoji.Emoji))
|
||||||
|
regroupAux currentTotal currentPart num input =
|
||||||
|
case input of
|
||||||
|
[] ->
|
||||||
|
if List.length currentPart < num then
|
||||||
|
regroupAux currentTotal (Nothing :: currentPart) num []
|
||||||
|
|
||||||
|
else
|
||||||
|
List.reverse currentPart :: currentTotal
|
||||||
|
|
||||||
|
h :: t ->
|
||||||
|
if List.length currentPart >= num then
|
||||||
|
regroupAux (List.reverse currentPart :: currentTotal) [ Just h ] num t
|
||||||
|
|
||||||
|
else
|
||||||
|
regroupAux currentTotal (Just h :: currentPart) num t
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- PORTS --
|
||||||
|
|
||||||
|
|
||||||
|
port copy : String -> Cmd msg
|
Loading…
Reference in New Issue