@@ -0,0 +1,258 @@
commands =
volume : "osascript -e 'output volume of (get volume settings)'"
ismuted : "osascript -e 'output muted of (get volume settings)'"
battery : "pmset -g batt | egrep '([0-9]+\%).*' -o --colour=auto | cut -f1 -d';'"
ischarging : "sh ./supernerd.widget/scripts/ischarging.sh"
wifi: "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | sed -e \"s/^ *SSID: //p\" -e d"
isconnected: "echo true"
focus : "/usr/local/bin/chunkc tiling::query --window name"
playing: "osascript -e 'tell application \"iTunes\" to if player state is playing then artist of current track & \" - \" & name of current track'"
time: "date +\"%H:%M\""
cpu : "ps -A -o %cpu | awk '{s+=$1} END {printf(\"%.2f\",s/8);}'"
mem : "ps -A -o %mem | awk '{s+=$1} END {print s \"%\"}' "
hdd : "df / | awk 'END{print $5}'"



command: "echo " +
"$(#{ commands.volume }):::" +
"$(#{ commands.ismuted }):::" +
"$(#{ commands.battery }):::" +
"$(#{ commands.ischarging }):::" +
"$(#{ commands.wifi }):::" +
"$(#{ commands.isconnected }):::" +
"$(#{ commands.time }):::" +
"$(#{ commands.cpu }):::" +
"$(#{ commands.mem }):::" +
"$(#{ commands.hdd }):::"

refreshFrequency: '10s'

render: ( ) ->
"""
<div class="container">

<div class="widg" id="volume">
<div class="icon-container" id='volume-icon-container'>
<i id="volume-icon"></i>
</div>
<!-- <span class='output'>
<div class="bar-output" id="volume-bar-output">
<div class="bar-output" id="volume-bar-color-output"></div>
</div>
</span> -->
<span class="output" id='volume-output'></span>
</div>

<div class="widg" id="wifi">
<div class="icon-container" id='wifi-icon-container'>
<i class="fa fa-wifi"></i>
</div>
<span class="output" id='wifi-output'></span>
</div>

<div class="widg pinned" id="battery">
<div class="icon-container" id='battery-icon-container'>
<i class="battery-icon"></i>
</div>
<span class="output" id='battery-output'></span>
</div>

<div class="widg pinned red" id="time">
<span class="output pinned" id="time-output"></span>
</div>

<div class="widg tray" id="system-monitor">

<div class="widg" id="cpu">
<div class="icon-container" id='cpu-icon-container'>
<i class="fa fa-spinner"></i>
</div>
<span class="output" id="cpu-output"></span>
</div>

<div class="widg" id="mem">
<div class="icon-container" id='mem-icon-container'>
<i class="fas fa-server"></i>
</div>
<span class="output" id="mem-output"></span>
</div>

<div class="widg" id="hdd">
<div class="icon-container" id='hdd-icon-container'>
<i class="fas fa-hdd"></i>
</div>
<span class="output" id="hdd-output"></span>
</div>

<div class="icon-container" id="system-icon-container">
<i class="fas fa-power-off" id="focus-icon"></i>
</div>

</div>

</div>

"""

update: ( output, domEl ) ->
output = output.split( /:::/g )

values = []

values.volume = output[ 0 ]
values.ismuted = output[ 1 ]
values.battery = output[ 2 ]
values.ischarging = output[ 3 ]
values.wifi = output[ 4 ]
values.isconnected = output[ 5 ]
values.time = output[ 6 ]
values.cpu = output[ 7 ]
values.mem = output[ 8 ]
values.hdd = output[ 9 ]

controls = ['battery','volume','wifi','time']
for control in controls
outputId = "#"+control+"-output"
currentValue = $("#{outputId}").value
updatedValue = values[control]

if updatedValue != currentValue
$("#{ outputId }").text("#{ updatedValue }")

if control is 'battery'
@handleBattery( domEl, Number( values["battery"].replace( /%/g, "" ) ), values["ischarging"] )
else if control is 'wifi' then @handleWifi( domEl, values["wifi"] )
else if control is 'volume' then @handleVolume( domEl, Number( values["volume"]), values["ismuted"] )
else if control is 'brightness' then @handleBrightness( domEl, values["brightness"] )

$( "#cpu-output").text("# }%")
$( "#mem-output").text("#{ values.mem }")
$( "#hdd-output").text("#{ values.hdd }")

@handleSysmon( domEl, Number( values.cpu ), '#cpu' )
@handleSysmon( domEl, Number( values.mem.replace( /%/g, "") ), '#mem' )
@handleSysmon( domEl, Number( values.hdd.replace( /%/g, "") ), '#hdd' )


#
# ─── HANDLE SYSMON –─────────────────────────────────────────────────────────
#
handleSysmon: ( domEl, sysmon, monid ) ->
div = $(domEl)

div.find(monid).removeClass('blue')
div.find(monid).removeClass('cyan')
div.find(monid).removeClass('green')
div.find(monid).removeClass('yellow')
div.find(monid).removeClass('magenta')
div.find(monid).removeClass('red')

if sysmon <= 10
div.find(monid).addClass('blue')
else if sysmon <= 20
div.find(monid).addClass('blue')
else if sysmon <= 40
div.find(monid).addClass('cyan')
else if sysmon <= 50
div.find(monid).addClass('green')
else if sysmon <= 75
div.find(monid).addClass('yellow')
else
div.find(monid).addClass('red')

#
# ─── HANDLE BRIGHTNESS ─────────────────────────────────────────────────────────
handleBrightness: (domEl, brightness ) ->
brightness = Math.round(100*brightness) + 2
$("#brightness-output").text("#{brightness}")
$( "#brightness-bar-color-output" ).width( "#{brightness}%" )

#
#
# ─── HANDLE VOLUME ─────────────────────────────────────────────────────────
#

handleVolume: ( domEl, volume, ismuted ) ->
div = $( domEl )

volumeIcon = switch
when volume == 0 then "fa-volume-off"
when volume <= 50 then "fa-volume-down"
when volume <= 100 then "fa-volume-up"

#
# div.find("#volume").removeClass('blue')
# div.find("#volume").removeClass('red')
#
# if ismuted != 'true'
# div.find( "#volume-output").text("#{ volume }")
# div.find('#volume').addClass('blue')
# div.find('#volume-icon-container').addClass('blue')
# else
# div.find( "#volume-output").text("Muted")
# volumeIcon = "fa-volume-off"
# div.find('#volume').addClass('red')
# div.find('#volume-icon-container').addClass('red')

$("#volume-output").text("#{volume}")
$( "#volume-icon" ).html( "<i class=\"fa #{ volumeIcon }\"></i>" )
$( "#volume-bar-color-output" ).width( "#{volume}%" )


#
# ─── HANDLE BATTERY ─────────────────────────────────────────────────────────
#

handleBattery: ( domEl, percentage, ischarging ) ->
div = $( domEl )

batteryIcon = switch
when percentage <= 12 then "fa-battery-empty"
when percentage <= 25 then "fa-battery-quarter"
when percentage <= 50 then "fa-battery-half"
when percentage <= 75 then "fa-battery-three-quarters"
when percentage <= 100 then "fa-battery-full"


div.find("#battery").removeClass('green')
div.find("#battery").removeClass('yellow')
div.find("#battery").removeClass('red')

if percentage >= 35
div.find('#battery').addClass('green')
div.find('#battery-icon-container').addClass('green')
else if percentage >= 15
div.find('#battery').addClass('yellow')
div.find('#battery-icon-container').addClass('yellow')
else
div.find('#battery').addClass('red')
div.find('#battery-icon-container').addClass('red')

if ischarging == "true"
batteryIcon = "fas fa-bolt"
$( ".battery-icon" ).html( "<i class=\"fa #{ batteryIcon }\"></i>" )

#
# ─── HANDLE WIFI ─────────────────────────────────────────────────────────
#

handleWifi: (domEl, wifi ) ->
$( "#wifi-output").text("#{ wifi }")

if wifi == ''
wifiIcon = 'fas fa-exclamation-circle'
else
wifiIcon = 'fa fa-wifi'
$(domEl).find( ".wifi-icon" ).html( "<i class=\"fa #{ wifiIcon }\"></i>" )


#
# ─── ANIMATION ─────────────────────────────────────────────────────────
#
afterRender: (domEl) ->
$(domEl).on 'mouseover', ".widg", (e) => $(domEl).find( $($(e.target))).addClass('open')

$(domEl).on 'mouseout', ".widg", (e) => $(domEl).find( $($(e.target))).removeClass('open')

$(domEl).on 'click', ".widg", (e) => if $(domEl).find( $($(e.target))).attr('id') != "time" then $(domEl).find( $($(e.target))).toggleClass('pinned')
@@ -0,0 +1,32 @@
commands =
date : "date +\"%a %d %b\""

command: "echo " +
"$(#{ commands.date }):::"

refreshFrequency: '30m'

render: ( ) ->
"""
<div class="container">
<div class="widg" id="date">
<span class="output nohidden" id="date-output"></span>
</div>
</div>
"""

update: ( output, domEl ) ->
output = output.split( /:::/g )

values = []

values.date = output[ 0 ]

controls = ['date']
for control in controls
outputId = "#"+control+"-output"
currentValue = $("#{outputId}").value
updatedValue = values[control]

if updatedValue != currentValue
$("#{ outputId }").text("#{ updatedValue }")
@@ -0,0 +1,39 @@
commands =
activedesk: "echo $(/usr/local/bin/chunkc tiling::query -d id)"

command: "echo " +
"$(#{ commands.activedesk}):::"

refreshFrequency: false

render: ( ) ->
"""
<div class="container pinned" id="desktop">
<div class="widg " id="home">
<div class="icon-container" id="home-icon-container">
<i class="far fa-home"></i>
</div>
<span class="output" id="desktop-output">1</span>
</div>
</div>
"""

update: ( output, domEl ) ->
values = []
values.desktop = output.split( /:::/g )[ 0 ]

controls = ['desktop']
for control in controls
outputId = "#"+control+"-output"
currentValue = $("#{outputId}").value
updatedValue = values[control]

if updatedValue != currentValue
$("#{ outputId }").text("#{ updatedValue }")

#$(domEl).find("#desktop-output").text("#{activedesk}")
#$(domEl).on 'click', "#home-icon-container", (e) -> #switch to desktop 1??


#$(domEl).find(".active").removeClass("active")
#$(domEl).find("#desk"+activedesk).addClass('active')
@@ -0,0 +1,52 @@
commands =
nrhn: "sh ./supernerd.widget/scripts/getnewshackernews.sh"

command: "echo " +
"$(#{ commands.nrhn }):::"

refreshFrequency: false

render: ( ) ->
"""
<div class="widg panel" id="panel">

<div class="panel-header-container" id="panel-title">
<div class="panel-header" id="header-1">
<div class="icon-container" id='mail-icon-container'>
<i class="far fa-envelope"></i>
Mail
</div>
</div>
<div class="panel-header" id="header-2">
<div class="icon-container" id='mail-icon-container'>
<i class="far fa-envelope">< /i>
Mail
</div>
</div>
<div class="panel-header" id="header-3">
<div class="icon-container" id='mail-icon-container'>
<i class="far fa-envelope"></i>
Mail
</div>
</div>
</div>

<div class="panel-body-container" id="panel-body">
<div class="panel-body" id="body-1">
Lorem ipsum dolor sit amet
</div>
<div class="panel-body" id="body-2">
Lorem ipsum
</div>
<div class="panel-body" id="body-3">
Lorem ipsum
</div>
</div>

</div>
"""

update: ( output, domEl ) ->
output = output.split( /:::/g )
mail = output[0]
$( "#body-1" ).text("asdhs")
@@ -0,0 +1,23 @@
commands =
focus: "echo $(/usr/local/bin/chunkc tiling::query --window name)"

command: "echo " +
"$(#{ commands.focus}):::"

refreshFrequency: false

render: ( ) ->
"""
<div class="container" id="window">
<div class="widg" id="window">
<div class="icon-container" id="music-icon-container">
</div>
<span class="output" id="window-output"></span>
</div>
</div>
"""

update: ( output, domEl ) ->
window = output.split( /:::/g )[ 0 ]
window = window.split( /–/g )[ 0 ]
$( "#window-output" ).text(window)

This file was deleted.

@@ -0,0 +1,3 @@
#!/bin/bash

nr hackernews
@@ -0,0 +1 @@
/usr/local/bin/mpc current
@@ -4,17 +4,13 @@

:root {

--global_margin: 8px;
--left-margin: 512px;
--right-margin: 512px;
--line-size: 30px;
--global_margin: 0px;
--left-margin: 0px;
--right-margin: 0px;
--line-size: 32px;
}


/* ––––––––––––––––
––––––––––––––––––– GENERAL
––––––––––––––––––– */

#supernerd-widget-system-monitor-coffee {
right:var(--globar-margin);
}
@@ -85,7 +85,6 @@ i, .icon-container, .output {
padding-left:calc(var(--line-size)/4);
}


/* ––––––––––––––––
––––––––––––––––––– BEHAVIOUR (pinned, open, alt)
––––––––––––––––––– */
@@ -98,6 +97,7 @@ i, .icon-container, .output {

.open .output {
display: flex;
animation: slideout 0.1s;
}

.pinned .output {
@@ -245,8 +245,8 @@ the script. So don't think of sanitizing them to classes */
/* ––––––––––––––– CENTER */
#supernerd-widget-date-coffee, #supernerd-widget-date-weather-coffee {
top:var(--global_margin);
left:33%;
right:33%;
left:42%;
right:42%;
display:flex;
justify-content: center;
}
@@ -274,3 +274,7 @@ the script. So don't think of sanitizing them to classes */
bottom:var(--global_margin);
right:var(--right-margin);
}

/* ––––––––––––––––
––––––––––––––––––– DEFAULT SIZING
––––––––––––––––––– */
@@ -25,6 +25,10 @@
opacity: 0.8;
}

.opt {
background-color: var(--background);
}

/* ––––––––––––––––
––––––––––––––––––– BEHAVIOUR (pinned, open, alt)
––––––––––––––––––– */
@@ -6,7 +6,7 @@
--global_margin: 8px;
--left-margin: 8px;
--right-margin: 8px;
--line-size: 48px;
--line-size: 32px;
}


@@ -16,5 +16,9 @@
––––––––––––––––––– */

#supernerd-widget-system-monitor-coffee {
right:var(--globar-margin);
bottom:var(--global_margin);
left:33%;
right:33%;
display:flex;
justify-content: center;
}
@@ -14,7 +14,3 @@
/* ––––––––––––––––
––––––––––––––––––– GENERAL
––––––––––––––––––– */

.widg {

}
@@ -0,0 +1,38 @@
.panel {
display:block;
color: var(--foreground);
background-color: var(--background);
width:2400px;
}

.panel-header-container, .panel-body-container {
display:inline;
left:33%;
right:33%;
display:flex;
justify-content: center;
}

.panel-header-container {
background-color: var(--color4);
height:var(--line-size);
}

.panel-body-container {
background-color: var(--background);
height:calc(10*var(--line-size));
}

.panel-header, .panel-body {
width:33%;
margin-right: 15%;
margin-left: 15%;
}

#supernerd-widget-panel-coffee {
top:60px;
left:10%;
right:10%;
display:flex;
justify-content: center;
}
@@ -67,7 +67,7 @@ convertBytes: (bytes) ->
kb = bytes / 1024
mb = kb / 1024
if mb < 0.01
return "0.00mb"
return "0.00MB"
return "#{parseFloat(mb.toFixed(2))}MB"

update: ( output, domEl ) ->