summaryrefslogtreecommitdiff
path: root/mac/.config/sketchybar.mon/sketchybar/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'mac/.config/sketchybar.mon/sketchybar/plugins')
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/aerospace.sh117
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/aerospace_display.sh185
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/apple.sh38
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/battery.sh48
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/bluetooth.sh93
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/calendar.sh117
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/change_windows.sh3
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/clock.sh19
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/clock_click.sh43
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/cpu.sh37
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/front_app.sh104
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/get_input_source.sh13
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/icon_map.sh637
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/monitor_watcher.sh25
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/now_playing.sh77
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/space.sh7
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/space_windows.sh87
-rw-r--r--mac/.config/sketchybar.mon/sketchybar/plugins/test_click.sh3
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/volume.sh77
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/volume_click.sh82
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/weather.sh52
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/wifi.sh53
-rwxr-xr-xmac/.config/sketchybar.mon/sketchybar/plugins/zen.sh43
23 files changed, 1960 insertions, 0 deletions
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/aerospace.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/aerospace.sh
new file mode 100755
index 0000000..b8825d5
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/aerospace.sh
@@ -0,0 +1,117 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+WORKSPACE_ID="$1"
+
+# Get currently focused workspace
+FOCUSED_WORKSPACE=$(aerospace list-workspaces --focused)
+
+# Get workspaces for each monitor
+MONITOR_1_WORKSPACES=$(aerospace list-workspaces --monitor 1)
+MONITOR_2_WORKSPACES=$(aerospace list-workspaces --monitor 2)
+
+# Check if this workspace is on monitor 1 or 2
+ON_MONITOR_1=""
+ON_MONITOR_2=""
+
+for ws in $MONITOR_1_WORKSPACES; do
+ if [ "$ws" = "$WORKSPACE_ID" ]; then
+ ON_MONITOR_1="true"
+ break
+ fi
+done
+
+for ws in $MONITOR_2_WORKSPACES; do
+ if [ "$ws" = "$WORKSPACE_ID" ]; then
+ ON_MONITOR_2="true"
+ break
+ fi
+done
+
+# Show workspace if:
+# 1. It's the currently focused workspace (global focus)
+# 2. OR it's one of the "representative" workspaces from each monitor
+SHOULD_SHOW="false"
+
+if [ "$WORKSPACE_ID" = "$FOCUSED_WORKSPACE" ]; then
+ # Always show the currently focused workspace
+ SHOULD_SHOW="true"
+elif [ "$ON_MONITOR_1" = "true" ] && [ "$WORKSPACE_ID" = "1" ]; then
+ # Show workspace 1 as representative of monitor 1
+ SHOULD_SHOW="true"
+elif [ "$ON_MONITOR_2" = "true" ] && [ "$WORKSPACE_ID" = "4" ]; then
+ # Show workspace 4 as representative of monitor 2 (adjust this number as needed)
+ SHOULD_SHOW="true"
+fi
+
+if [ "$SHOULD_SHOW" = "true" ]; then
+ # Show the workspace item
+ sketchybar --set "$NAME" drawing=on
+
+ if [ "$WORKSPACE_ID" = "$FOCUSED_WORKSPACE" ]; then
+ # Active workspace styling - more noticeable text
+ sketchybar --set "$NAME" \
+ background.drawing=on \
+ background.color=$BACKGROUND_2 \
+ background.corner_radius=6 \
+ background.height=26 \
+ background.border_width=0 \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Semibold:14.0" \
+ label.color=$WHITE
+ else
+ # Workspace visible on other display but not focused - subtle styling
+ sketchybar --set "$NAME" \
+ background.drawing=on \
+ background.color=$BACKGROUND_1 \
+ background.corner_radius=6 \
+ background.height=26 \
+ background.border_width=0 \
+ icon.color=$GREY \
+ icon.font="SF Pro:Medium:14.0" \
+ label.color=$GREY
+ fi
+else
+ # Hide workspace that's not active on any display
+ sketchybar --set "$NAME" drawing=off
+fi
+
+
+
+# MAIN_COLOR=0xffa17fa7
+# ACCENT_COLOR=0xffe19286
+#
+# echo $NAME > ~/debug_skekychybar
+#
+# if [ "$1" = "change-focused-window" ]; then
+# echo "change-focused-window"
+# focused_window_info=$(aerospace list-windows --focused)
+# focused_window_id=$(echo $focused_window_info | awk -F ' \\| ' '{print $1}')
+# if [ "$2" = "$focused_window_id" ]; then
+# sketchybar --set $NAME icon.color=$ACCENT_COLOR
+# else
+# sketchybar --set $NAME icon.color=$MAIN_COLOR
+# fi
+# fi
+#
+# if [ "$1" = "change-focused-workspace" ]; then
+# echo "change-focused-workspace"
+# focused_workspace=$(aerospace list-workspaces --focused)
+# if [ "$2" = "$focused_workspace" ]; then
+# sketchybar --set $NAME label.color=$ACCENT_COLOR
+# else
+# sketchybar --set $NAME label.color=$MAIN_COLOR
+# fi
+# fi
+#
+# if [ "$1" = "move-window-within-workspace" ]; then
+# echo "move-window-within-workspace"
+# focused_workspace=$(aerospace list-workspaces --focused)
+# if [ "$2" = "$focused_workspace" ]; then
+# sketchybar --set $NAME label.color=$ACCENT_COLOR
+# else
+# sketchybar --set $NAME label.color=$MAIN_COLOR
+# fi
+# fi
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/aerospace_display.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/aerospace_display.sh
new file mode 100755
index 0000000..206666a
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/aerospace_display.sh
@@ -0,0 +1,185 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Get all available monitors
+AVAILABLE_MONITORS=$(aerospace list-monitors)
+FOCUSED_WORKSPACE=$(aerospace list-workspaces --focused)
+
+# Create a cache file to store last known state
+CACHE_FILE="/tmp/aerospace_display_state"
+
+# Map aerospace monitor IDs to our logical naming
+# M1 = Primary (Built-in Retina Display) = aerospace monitor 2
+# M2 = External (MAG 274UPF E2) = aerospace monitor 1
+MONITOR_M1_ID="2" # Built-in Retina Display
+MONITOR_M2_ID="1" # External Monitor
+
+# Check which monitors are currently connected
+MONITOR_M1_CONNECTED=$(echo "$AVAILABLE_MONITORS" | grep "^$MONITOR_M1_ID " | wc -l)
+MONITOR_M2_CONNECTED=$(echo "$AVAILABLE_MONITORS" | grep "^$MONITOR_M2_ID " | wc -l)
+
+# Function to get the current workspace for a monitor
+get_current_workspace_for_monitor() {
+ local monitor_id="$1"
+ local workspaces=$(aerospace list-workspaces --monitor "$monitor_id" 2>/dev/null)
+
+ # If monitor doesn't exist, return empty
+ if [ -z "$workspaces" ]; then
+ echo ""
+ return
+ fi
+
+ # Check if the focused workspace is on this monitor
+ for ws in $workspaces; do
+ if [ "$ws" = "$FOCUSED_WORKSPACE" ]; then
+ echo "$ws"
+ return
+ fi
+ done
+
+ # If focused workspace is not on this monitor, return cached value or first workspace
+ if [ -f "$CACHE_FILE" ]; then
+ local cached_ws=$(grep "^$monitor_id:" "$CACHE_FILE" | cut -d: -f2)
+ if [ -n "$cached_ws" ]; then
+ # Verify the cached workspace still exists on this monitor
+ for ws in $workspaces; do
+ if [ "$ws" = "$cached_ws" ]; then
+ echo "$cached_ws"
+ return
+ fi
+ done
+ fi
+ fi
+
+ # Fallback to first workspace on this monitor
+ echo "$workspaces" | head -n1
+}
+
+# Update cache with current state
+update_cache() {
+ local monitor_id="$1"
+ local workspace="$2"
+
+ # Create or update cache file
+ if [ -f "$CACHE_FILE" ]; then
+ # Remove old entry for this monitor
+ grep -v "^$monitor_id:" "$CACHE_FILE" > "$CACHE_FILE.tmp"
+ mv "$CACHE_FILE.tmp" "$CACHE_FILE"
+ fi
+
+ # Add current entry
+ echo "$monitor_id:$workspace" >> "$CACHE_FILE"
+}
+
+# Get current workspace for each monitor (if connected)
+MONITOR_M1_CURRENT=""
+MONITOR_M2_CURRENT=""
+
+if [ "$MONITOR_M1_CONNECTED" -gt 0 ]; then
+ MONITOR_M1_CURRENT=$(get_current_workspace_for_monitor "$MONITOR_M1_ID")
+ if [ -n "$MONITOR_M1_CURRENT" ]; then
+ update_cache "$MONITOR_M1_ID" "$MONITOR_M1_CURRENT"
+ fi
+fi
+
+if [ "$MONITOR_M2_CONNECTED" -gt 0 ]; then
+ MONITOR_M2_CURRENT=$(get_current_workspace_for_monitor "$MONITOR_M2_ID")
+ if [ -n "$MONITOR_M2_CURRENT" ]; then
+ update_cache "$MONITOR_M2_ID" "$MONITOR_M2_CURRENT"
+ fi
+fi
+
+# Handle display logic based on what's connected
+if [ "$MONITOR_M1_CONNECTED" -gt 0 ] && [ "$MONITOR_M2_CONNECTED" -gt 0 ]; then
+ # Both monitors connected - show both
+ sketchybar --set monitor_1_workspace \
+ icon="M1:$MONITOR_M1_CURRENT" \
+ drawing=on \
+ icon.width=52 \
+ icon.align=center \
+ icon.padding_left=4 \
+ icon.padding_right=4 \
+ click_script="aerospace workspace $MONITOR_M1_CURRENT"
+
+ sketchybar --set monitor_2_workspace \
+ icon="M2:$MONITOR_M2_CURRENT" \
+ drawing=on \
+ icon.width=52 \
+ icon.align=center \
+ icon.padding_left=4 \
+ icon.padding_right=4 \
+ click_script="aerospace workspace $MONITOR_M2_CURRENT"
+
+ # Highlight the currently focused workspace
+ if [ "$MONITOR_M1_CURRENT" = "$FOCUSED_WORKSPACE" ]; then
+ sketchybar --set monitor_1_workspace \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Semibold:12.0" \
+ background.color=$BACKGROUND_2
+
+ sketchybar --set monitor_2_workspace \
+ icon.color=$GREY \
+ icon.font="SF Pro:Medium:12.0" \
+ background.color=$BACKGROUND_1
+ elif [ "$MONITOR_M2_CURRENT" = "$FOCUSED_WORKSPACE" ]; then
+ sketchybar --set monitor_2_workspace \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Semibold:12.0" \
+ background.color=$BACKGROUND_2
+
+ sketchybar --set monitor_1_workspace \
+ icon.color=$GREY \
+ icon.font="SF Pro:Medium:12.0" \
+ background.color=$BACKGROUND_1
+ else
+ # Neither monitor has focus, show both as inactive
+ sketchybar --set monitor_1_workspace \
+ icon.color=$GREY \
+ icon.font="SF Pro:Medium:12.0" \
+ background.color=$BACKGROUND_1
+
+ sketchybar --set monitor_2_workspace \
+ icon.color=$GREY \
+ icon.font="SF Pro:Medium:12.0" \
+ background.color=$BACKGROUND_1
+ fi
+
+elif [ "$MONITOR_M1_CONNECTED" -gt 0 ]; then
+ # Only M1 (primary) connected - show just the workspace number
+ sketchybar --set monitor_1_workspace \
+ icon="$MONITOR_M1_CURRENT" \
+ drawing=on \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Semibold:14.0" \
+ icon.width=32 \
+ icon.align=center \
+ icon.padding_left=4 \
+ icon.padding_right=4 \
+ background.color=$BACKGROUND_2 \
+ click_script="aerospace workspace $MONITOR_M1_CURRENT"
+
+ sketchybar --set monitor_2_workspace drawing=off
+
+elif [ "$MONITOR_M2_CONNECTED" -gt 0 ]; then
+ # Only M2 (external) connected - show just the workspace number
+ sketchybar --set monitor_2_workspace \
+ icon="$MONITOR_M2_CURRENT" \
+ drawing=on \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Semibold:14.0" \
+ icon.width=32 \
+ icon.align=center \
+ icon.padding_left=4 \
+ icon.padding_right=4 \
+ background.color=$BACKGROUND_2 \
+ click_script="aerospace workspace $MONITOR_M2_CURRENT"
+
+ sketchybar --set monitor_1_workspace drawing=off
+
+else
+ # No monitors detected - hide both (shouldn't happen)
+ sketchybar --set monitor_1_workspace drawing=off
+ sketchybar --set monitor_2_workspace drawing=off
+fi \ No newline at end of file
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/apple.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/apple.sh
new file mode 100755
index 0000000..8a22606
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/apple.sh
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Create a simple popup menu for the Apple logo
+sketchybar --set apple.logo popup.drawing=toggle
+
+# Check if popup is being shown
+if [ "$(sketchybar --query apple.logo | jq -r '.popup.drawing')" = "on" ]; then
+ # Add popup items
+ sketchybar --add item apple.prefs popup.apple.logo \
+ --set apple.prefs icon="󰒓" \
+ icon.color=$BLUE \
+ label="System Preferences" \
+ click_script="open /System/Applications/System\ Preferences.app; sketchybar --set apple.logo popup.drawing=off"
+
+ sketchybar --add item apple.activity popup.apple.logo \
+ --set apple.activity icon="󰖚" \
+ icon.color=$GREEN \
+ label="Activity Monitor" \
+ click_script="open /System/Applications/Utilities/Activity\ Monitor.app; sketchybar --set apple.logo popup.drawing=off"
+
+ sketchybar --add item apple.lock popup.apple.logo \
+ --set apple.lock icon="󰌾" \
+ icon.color=$RED \
+ label="Lock Screen" \
+ click_script="pmset displaysleepnow; sketchybar --set apple.logo popup.drawing=off"
+
+ sketchybar --add item apple.sleep popup.apple.logo \
+ --set apple.sleep icon="󰤄" \
+ icon.color=$YELLOW \
+ label="Sleep" \
+ click_script="pmset sleepnow; sketchybar --set apple.logo popup.drawing=off"
+else
+ # Remove popup items when hiding
+ sketchybar --remove apple.prefs apple.activity apple.lock apple.sleep
+fi
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/battery.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/battery.sh
new file mode 100755
index 0000000..72535e2
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/battery.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Get battery information
+BATTERY_INFO=$(pmset -g batt | grep -Eo "[0-9]+%" | cut -d% -f1)
+POWER_SOURCE=$(pmset -g ps | head -1)
+
+# Check if charging
+if [[ $POWER_SOURCE == *"AC Power"* ]]; then
+ CHARGING=true
+else
+ CHARGING=false
+fi
+
+# Set battery level
+BATTERY_LEVEL=$BATTERY_INFO
+
+# Determine icon and color based on battery level and charging status
+if [[ $CHARGING == true ]]; then
+ ICON="󰂄" # Charging icon
+ COLOR=$ACCENT_SECONDARY
+else
+ if [[ $BATTERY_LEVEL -gt 75 ]]; then
+ ICON="󰁹" # Full battery
+ COLOR=$BATTERY_1
+ elif [[ $BATTERY_LEVEL -gt 50 ]]; then
+ ICON="󰁾" # Three quarters
+ COLOR=$BATTERY_2
+ elif [[ $BATTERY_LEVEL -gt 25 ]]; then
+ ICON="󰁼" # Half battery
+ COLOR=$BATTERY_3
+ elif [[ $BATTERY_LEVEL -gt 10 ]]; then
+ ICON="󰁻" # Quarter battery
+ COLOR=$BATTERY_4
+ else
+ ICON="󰁺" # Empty battery
+ COLOR=$BATTERY_5
+ fi
+fi
+
+# Update the battery item
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color="$COLOR" \
+ label="$BATTERY_LEVEL%" \
+ label.color=$WHITE \
+ label.font="SF Pro:Medium:13.0"
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/bluetooth.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/bluetooth.sh
new file mode 100755
index 0000000..d8dd1b6
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/bluetooth.sh
@@ -0,0 +1,93 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Multiple methods to detect Bluetooth status
+BT_ENABLED=false
+AIRPODS_CONNECTED=false
+
+# Method 1: Check using defaults (most reliable)
+BT_STATE=$(defaults read /Library/Preferences/com.apple.Bluetooth ControllerPowerState 2>/dev/null)
+if [[ "$BT_STATE" == "1" ]]; then
+ BT_ENABLED=true
+fi
+
+# Method 2: Check using system_profiler with better parsing
+if [[ "$BT_ENABLED" == false ]]; then
+ BT_POWER=$(system_profiler SPBluetoothDataType 2>/dev/null | grep -i "state" | grep -i "on")
+ if [[ -n "$BT_POWER" ]]; then
+ BT_ENABLED=true
+ fi
+fi
+
+# Method 3: Check if blueutil is available and use it (most accurate)
+if command -v blueutil &> /dev/null; then
+ BT_UTIL_STATE=$(blueutil -p 2>/dev/null)
+ if [[ "$BT_UTIL_STATE" == "1" ]]; then
+ BT_ENABLED=true
+ elif [[ "$BT_UTIL_STATE" == "0" ]]; then
+ BT_ENABLED=false
+ fi
+fi
+
+# Method 4: Check if any Bluetooth devices are connected as fallback
+if [[ "$BT_ENABLED" == false ]]; then
+ BT_DEVICES=$(system_profiler SPBluetoothDataType 2>/dev/null | grep -i "connected: yes")
+ if [[ -n "$BT_DEVICES" ]]; then
+ BT_ENABLED=true
+ fi
+fi
+
+# Check specifically for AirPods connection
+if [[ "$BT_ENABLED" == true ]]; then
+ # Method 1: Check for AirPods in connected devices (SPBluetoothDataType)
+ AIRPODS_CHECK=$(system_profiler SPBluetoothDataType 2>/dev/null | grep -i -A 10 -B 2 "airpods\|air pods")
+ if [[ -n "$AIRPODS_CHECK" ]]; then
+ # Check if AirPods are actually connected (not just paired)
+ AIRPODS_CONNECTED_CHECK=$(echo "$AIRPODS_CHECK" | grep -i "connected: yes")
+ if [[ -n "$AIRPODS_CONNECTED_CHECK" ]]; then
+ AIRPODS_CONNECTED=true
+ fi
+ fi
+
+ # Method 2: Check if AirPods are active audio device (more reliable)
+ if [[ "$AIRPODS_CONNECTED" == false ]]; then
+ AIRPODS_AUDIO_CHECK=$(system_profiler SPAudioDataType 2>/dev/null | grep -i -A 5 -B 5 "airpods")
+ if [[ -n "$AIRPODS_AUDIO_CHECK" ]]; then
+ # Check if AirPods are set as default output device
+ AIRPODS_DEFAULT_OUTPUT=$(echo "$AIRPODS_AUDIO_CHECK" | grep -i "default output device: yes")
+ if [[ -n "$AIRPODS_DEFAULT_OUTPUT" ]]; then
+ AIRPODS_CONNECTED=true
+ fi
+ fi
+ fi
+
+ # Method 3: Alternative check using blueutil if available
+ if [[ "$AIRPODS_CONNECTED" == false ]] && command -v blueutil &> /dev/null; then
+ CONNECTED_DEVICES=$(blueutil --connected 2>/dev/null)
+ if [[ "$CONNECTED_DEVICES" == *"AirPods"* ]] || [[ "$CONNECTED_DEVICES" == *"Air Pods"* ]]; then
+ AIRPODS_CONNECTED=true
+ fi
+ fi
+fi
+
+# Set icon and color based on connection status
+if [[ "$AIRPODS_CONNECTED" == true ]]; then
+ # AirPods connected - AirPods icon in white
+ ICON="󰋋"
+ COLOR=$ACCENT_PINK
+elif [[ "$BT_ENABLED" == true ]]; then
+ # Bluetooth enabled but no AirPods - blue Bluetooth icon
+ ICON="󰂯"
+ COLOR=$ACCENT_PRIMARY # Blue
+else
+ # Bluetooth disabled - gray icon
+ ICON="󰂲"
+ COLOR=$GREY
+fi
+
+# Update the Bluetooth item - icon only, no label
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color="$COLOR" \
+ label.drawing=off \ No newline at end of file
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/calendar.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/calendar.sh
new file mode 100755
index 0000000..013e3db
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/calendar.sh
@@ -0,0 +1,117 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Get next calendar event
+get_next_event() {
+ # Use EventKit to get calendar events
+ local event_info=$(osascript << 'EOF'
+tell application "Calendar"
+ set currentDate to current date
+ set endOfDay to currentDate + (1 * days)
+
+ set allEvents to {}
+ repeat with cal in calendars
+ set calEvents to (events of cal whose start date ≥ currentDate and start date ≤ endOfDay)
+ set allEvents to allEvents & calEvents
+ end repeat
+
+ if (count of allEvents) > 0 then
+ set nextEvent to item 1 of allEvents
+ set eventStart to start date of nextEvent
+ set eventTitle to summary of nextEvent
+
+ # Find the earliest upcoming event
+ repeat with evt in allEvents
+ if start date of evt < eventStart and start date of evt ≥ currentDate then
+ set nextEvent to evt
+ set eventStart to start date of evt
+ set eventTitle to summary of evt
+ end if
+ end repeat
+
+ # Format the time properly
+ set eventHour to hours of eventStart
+ set eventMinute to minutes of eventStart
+
+ # Convert to 12-hour format
+ if eventHour = 0 then
+ set displayHour to 12
+ set ampm to "AM"
+ else if eventHour < 12 then
+ set displayHour to eventHour
+ set ampm to "AM"
+ else if eventHour = 12 then
+ set displayHour to 12
+ set ampm to "PM"
+ else
+ set displayHour to eventHour - 12
+ set ampm to "PM"
+ end if
+
+ # Format minutes with leading zero if needed
+ if eventMinute < 10 then
+ set minuteStr to "0" & eventMinute
+ else
+ set minuteStr to eventMinute as string
+ end if
+
+ set formattedTime to displayHour & ":" & minuteStr & " " & ampm
+
+ set eventDate to date string of eventStart
+ set todayDate to date string of currentDate
+
+ if eventDate = todayDate then
+ return eventTitle & "|" & formattedTime
+ else
+ return eventTitle & "|Tomorrow " & formattedTime
+ end if
+ else
+ return "No events"
+ end if
+end tell
+EOF
+)
+
+ echo "$event_info"
+}
+
+# Get calendar information
+EVENT_INFO=$(get_next_event 2>/dev/null)
+
+if [[ "$EVENT_INFO" == "No events" ]] || [[ -z "$EVENT_INFO" ]]; then
+ # No upcoming events
+ ICON="󰸗"
+ COLOR=$GREY
+ LABEL="No Events"
+else
+ # Parse event information
+ IFS='|' read -r event_title event_time <<< "$EVENT_INFO"
+
+ # Set icon and color based on time
+ if [[ "$event_time" == "Tomorrow"* ]]; then
+ ICON="󰸗"
+ COLOR=$ACCENT_QUATERNARY
+ else
+ ICON="󰃭"
+ COLOR=$ACCENT_PRIMARY
+ fi
+
+ # Truncate long event titles
+ if [[ ${#event_title} -gt 15 ]]; then
+ event_title="${event_title:0:15}..."
+ fi
+
+ # Create multi-line label using actual newline
+ LABEL="$event_title
+$event_time"
+fi
+
+# Update the Calendar item
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color="$COLOR" \
+ label="$LABEL" \
+ label.color=$WHITE \
+ label.font="SF Pro:Medium:12.0" \
+ label.max_chars=20
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/change_windows.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/change_windows.sh
new file mode 100755
index 0000000..69364b8
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/change_windows.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo change_windows.sh NAME: $NAME, SENDER: $SENDER >> ~/aaaa
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/clock.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/clock.sh
new file mode 100755
index 0000000..f93c806
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/clock.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Get current time and date
+TIME=$(date "+%I:%M %p")
+DATE=$(date "+%a %d %b")
+
+# Format the label with both time and date
+LABEL="$TIME $DATE"
+
+# Set the clock with enhanced styling
+sketchybar --set "$NAME" label="$LABEL" \
+ icon="󰅐" \
+ icon.color=$YELLOW \
+ label.color=$WHITE \
+ label.font="SF Pro:Medium:13.0"
+
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/clock_click.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/clock_click.sh
new file mode 100755
index 0000000..e2419ad
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/clock_click.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Create a popup showing calendar and date info
+sketchybar --set clock popup.drawing=toggle
+
+# Check if popup is being shown
+if [ "$(sketchybar --query clock | jq -r '.popup.drawing')" = "on" ]; then
+ # Get current date info
+ FULL_DATE=$(date "+%A, %B %d, %Y")
+ WEEK_NUMBER=$(date "+Week %V")
+ DAY_OF_YEAR=$(date "+Day %j of %Y")
+
+ # Add date information items
+ sketchybar --add item clock.full_date popup.clock \
+ --set clock.full_date icon="󰸘" \
+ icon.color=$YELLOW \
+ label="$FULL_DATE" \
+ click_script="open /System/Applications/Calendar.app; sketchybar --set clock popup.drawing=off"
+
+ sketchybar --add item clock.week popup.clock \
+ --set clock.week icon="󰸗" \
+ icon.color=$BLUE \
+ label="$WEEK_NUMBER" \
+ click_script="sketchybar --set clock popup.drawing=off"
+
+ sketchybar --add item clock.day_of_year popup.clock \
+ --set clock.day_of_year icon="󰸙" \
+ icon.color=$GREEN \
+ label="$DAY_OF_YEAR" \
+ click_script="sketchybar --set clock popup.drawing=off"
+
+ sketchybar --add item clock.calendar popup.clock \
+ --set clock.calendar icon="󰸝" \
+ icon.color=$ORANGE \
+ label="Open Calendar" \
+ click_script="open /System/Applications/Calendar.app; sketchybar --set clock popup.drawing=off"
+else
+ # Remove popup items when hiding
+ sketchybar --remove clock.full_date clock.week clock.day_of_year clock.calendar
+fi \ No newline at end of file
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/cpu.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/cpu.sh
new file mode 100755
index 0000000..dd55b0a
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/cpu.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Get CPU usage percentage
+CPU_USAGE=$(top -l 1 -n 0 | grep "CPU usage" | awk '{print $3}' | sed 's/%//')
+
+# Handle empty CPU usage
+if [[ -z "$CPU_USAGE" ]]; then
+ CPU_USAGE=0
+fi
+
+# Remove decimal point for comparison
+CPU_INT=${CPU_USAGE%.*}
+
+# Set icon and color based on CPU usage
+if [[ $CPU_INT -le 25 ]]; then
+ ICON="󰍛" # Low CPU
+ COLOR=$ACCENT_SECONDARY # Green
+elif [[ $CPU_INT -le 50 ]]; then
+ ICON="󰍜" # Medium CPU
+ COLOR=$ACCENT_PRIMARY # Blue
+elif [[ $CPU_INT -le 75 ]]; then
+ ICON="󰍝" # High CPU
+ COLOR=$ACCENT_TERTIARY # Orange
+else
+ ICON="󰍞" # Very High CPU
+ COLOR=$RED # Red
+fi
+
+# Update the CPU item
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color="$COLOR" \
+ label="$CPU_USAGE%" \
+ label.color=$WHITE \
+ label.font="SF Pro:Medium:12.0"
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/front_app.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/front_app.sh
new file mode 100755
index 0000000..fcae89d
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/front_app.sh
@@ -0,0 +1,104 @@
+#!/usr/bin/env bash
+
+# Source colors and icons for consistent theming
+source "$CONFIG_DIR/colors.sh"
+source "$CONFIG_DIR/icons.sh"
+
+# Get the current application
+if [ "$SENDER" = "front_app_switched" ]; then
+ APP_NAME="$INFO"
+else
+ APP_NAME=$(yabai -m query --windows --window | jq -r '.app' 2>/dev/null || echo "$(osascript -e 'tell application "System Events" to get name of first application process whose frontmost is true')")
+fi
+
+# Icon mapping for common applications
+case $APP_NAME in
+ "Cursor")
+ ICON="󰨞"
+ ;;
+ "Visual Studio Code")
+ ICON="󰨞"
+ ;;
+ "Slack")
+ ICON="󰒱"
+ ;;
+ "Discord")
+ ICON="󰙯"
+ ;;
+ "Google Chrome")
+ ICON="󰊯"
+ ;;
+ "Safari")
+ ICON="󰀹"
+ ;;
+ "Firefox")
+ ICON="󰈹"
+ ;;
+ "Terminal")
+ ICON="󰆍"
+ ;;
+ "iTerm2")
+ ICON="󰆍"
+ ;;
+ "Finder")
+ ICON="󰀶"
+ ;;
+ "Spotify")
+ ICON="󰓇"
+ ;;
+ "Music")
+ ICON="󰎆"
+ ;;
+ "Mail")
+ ICON="󰇮"
+ ;;
+ "Messages")
+ ICON="󰍦"
+ ;;
+ "FaceTime")
+ ICON="󰍫"
+ ;;
+ "Zoom")
+ ICON="󰊶"
+ ;;
+ "Notion")
+ ICON="󰈭"
+ ;;
+ "Obsidian")
+ ICON="󰈭"
+ ;;
+ "Xcode")
+ ICON="󰙳"
+ ;;
+ "Docker")
+ ICON="󰡨"
+ ;;
+ "Figma")
+ ICON="󰤼"
+ ;;
+ "Sketch")
+ ICON="󰤼"
+ ;;
+ "Photoshop")
+ ICON="󰤿"
+ ;;
+ "System Preferences")
+ ICON="󰒓"
+ ;;
+ "System Settings")
+ ICON="󰒓"
+ ;;
+ "Activity Monitor")
+ ICON="󰖚"
+ ;;
+ *)
+ # Default icon for unknown applications
+ ICON="󰄛"
+ ;;
+esac
+
+# Update the front_app item
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color=$ACCENT_QUATERNARY \
+ label="$APP_NAME" \
+ label.color=$WHITE
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/get_input_source.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/get_input_source.sh
new file mode 100755
index 0000000..89dab2b
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/get_input_source.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# hangul and english item
+
+# Read the plist data
+plist_data=$(defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleSelectedInputSources)
+current_input_source=$(echo "$plist_data" | plutil -convert xml1 -o - - | grep -A1 'KeyboardLayout Name' | tail -n1 | cut -d '>' -f2 | cut -d '<' -f1)
+
+if [ "$current_input_source" = "ABC" ]; then
+ sketchybar --set input_source icon="􀂕"
+else
+ sketchybar --set input_source icon="􀂩"
+fi
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/icon_map.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/icon_map.sh
new file mode 100755
index 0000000..e23f8d0
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/icon_map.sh
@@ -0,0 +1,637 @@
+#!/usr/bin/env bash
+
+### START-OF-ICON-MAP
+function __icon_map() {
+ case "$1" in
+ "Live")
+ icon_result=":ableton:"
+ ;;
+ "Adobe Bridge"*)
+ icon_result=":adobe_bridge:"
+ ;;
+ "Affinity Designer")
+ icon_result=":affinity_designer:"
+ ;;
+ "Affinity Designer 2")
+ icon_result=":affinity_designer_2:"
+ ;;
+ "Affinity Photo")
+ icon_result=":affinity_photo:"
+ ;;
+ "Affinity Photo 2")
+ icon_result=":affinity_photo_2:"
+ ;;
+ "Affinity Publisher")
+ icon_result=":affinity_publisher:"
+ ;;
+ "Affinity Publisher 2")
+ icon_result=":affinity_publisher_2:"
+ ;;
+ "Airmail")
+ icon_result=":airmail:"
+ ;;
+ "Alacritty")
+ icon_result=":alacritty:"
+ ;;
+ "Alfred")
+ icon_result=":alfred:"
+ ;;
+ "Android Messages")
+ icon_result=":android_messages:"
+ ;;
+ "Android Studio")
+ icon_result=":android_studio:"
+ ;;
+ "Anytype")
+ icon_result=":anytype:"
+ ;;
+ "App Eraser")
+ icon_result=":app_eraser:"
+ ;;
+ "App Store")
+ icon_result=":app_store:"
+ ;;
+ "Arc")
+ icon_result=":arc:"
+ ;;
+ "Atom")
+ icon_result=":atom:"
+ ;;
+ "Audacity")
+ icon_result=":audacity:"
+ ;;
+ "Bambu Studio")
+ icon_result=":bambu_studio:"
+ ;;
+ "MoneyMoney")
+ icon_result=":bank:"
+ ;;
+ "Battle.net")
+ icon_result=":battle_net:"
+ ;;
+ "Bear")
+ icon_result=":bear:"
+ ;;
+ "BetterTouchTool")
+ icon_result=":bettertouchtool:"
+ ;;
+ "Bilibili" | "哔哩哔哩")
+ icon_result=":bilibili:"
+ ;;
+ "Bitwarden")
+ icon_result=":bit_warden:"
+ ;;
+ "Blender")
+ icon_result=":blender:"
+ ;;
+ "BluOS Controller")
+ icon_result=":bluos_controller:"
+ ;;
+ "Calibre")
+ icon_result=":book:"
+ ;;
+ "Brave Browser")
+ icon_result=":brave_browser:"
+ ;;
+ "Calculator" | "Calculette")
+ icon_result=":calculator:"
+ ;;
+ "Calendar" | "日历" | "Fantastical" | "Cron" | "Amie" | "Calendrier" | "Notion Calendar")
+ icon_result=":calendar:"
+ ;;
+ "Caprine")
+ icon_result=":caprine:"
+ ;;
+ "Citrix Workspace" | "Citrix Viewer")
+ icon_result=":citrix:"
+ ;;
+ "ClickUp")
+ icon_result=":click_up:"
+ ;;
+ "Code" | "Code - Insiders")
+ icon_result=":code:"
+ ;;
+ "Color Picker" | "数码测色计")
+ icon_result=":color_picker:"
+ ;;
+ "CotEditor")
+ icon_result=":coteditor:"
+ ;;
+ "Creative Cloud")
+ icon_result=":creative_cloud:"
+ ;;
+ "Cypress")
+ icon_result=":cypress:"
+ ;;
+ "DataGrip")
+ icon_result=":datagrip:"
+ ;;
+ "DataSpell")
+ icon_result=":dataspell:"
+ ;;
+ "DaVinci Resolve")
+ icon_result=":davinciresolve:"
+ ;;
+ "Default")
+ icon_result=":default:"
+ ;;
+ "CleanMyMac X")
+ icon_result=":desktop:"
+ ;;
+ "DEVONthink 3")
+ icon_result=":devonthink3:"
+ ;;
+ "DingTalk" | "钉钉" | "阿里钉")
+ icon_result=":dingtalk:"
+ ;;
+ "Discord" | "Discord Canary" | "Discord PTB")
+ icon_result=":discord:"
+ ;;
+ "Docker" | "Docker Desktop")
+ icon_result=":docker:"
+ ;;
+ "GrandTotal" | "Receipts")
+ icon_result=":dollar:"
+ ;;
+ "Double Commander")
+ icon_result=":doublecmd:"
+ ;;
+ "Drafts")
+ icon_result=":drafts:"
+ ;;
+ "Dropbox")
+ icon_result=":dropbox:"
+ ;;
+ "Element")
+ icon_result=":element:"
+ ;;
+ "Emacs")
+ icon_result=":emacs:"
+ ;;
+ "Evernote Legacy")
+ icon_result=":evernote_legacy:"
+ ;;
+ "FaceTime" | "FaceTime 通话")
+ icon_result=":face_time:"
+ ;;
+ "Figma")
+ icon_result=":figma:"
+ ;;
+ "Final Cut Pro")
+ icon_result=":final_cut_pro:"
+ ;;
+ "Finder" | "访达")
+ icon_result=":finder:"
+ ;;
+ "Firefox")
+ icon_result=":firefox:"
+ ;;
+ "Firefox Developer Edition" | "Firefox Nightly")
+ icon_result=":firefox_developer_edition:"
+ ;;
+ "Folx")
+ icon_result=":folx:"
+ ;;
+ "Fusion")
+ icon_result=":fusion:"
+ ;;
+ "System Preferences" | "System Settings" | "系统设置" | "Réglages Système")
+ icon_result=":gear:"
+ ;;
+ "GitHub Desktop")
+ icon_result=":git_hub:"
+ ;;
+ "Godot")
+ icon_result=":godot:"
+ ;;
+ "GoLand")
+ icon_result=":goland:"
+ ;;
+ "Chromium" | "Google Chrome" | "Google Chrome Canary")
+ icon_result=":google_chrome:"
+ ;;
+ "Grammarly Editor")
+ icon_result=":grammarly:"
+ ;;
+ "Home Assistant")
+ icon_result=":home_assistant:"
+ ;;
+ "Hyper")
+ icon_result=":hyper:"
+ ;;
+ "IntelliJ IDEA")
+ icon_result=":idea:"
+ ;;
+ "Inkdrop")
+ icon_result=":inkdrop:"
+ ;;
+ "Inkscape")
+ icon_result=":inkscape:"
+ ;;
+ "Insomnia")
+ icon_result=":insomnia:"
+ ;;
+ "Iris")
+ icon_result=":iris:"
+ ;;
+ "iTerm" | "iTerm2")
+ icon_result=":iterm:"
+ ;;
+ "Jellyfin Media Player")
+ icon_result=":jellyfin:"
+ ;;
+ "Joplin")
+ icon_result=":joplin:"
+ ;;
+ "카카오톡" | "KakaoTalk")
+ icon_result=":kakaotalk:"
+ ;;
+ "Kakoune")
+ icon_result=":kakoune:"
+ ;;
+ "KeePassXC")
+ icon_result=":kee_pass_x_c:"
+ ;;
+ "Keyboard Maestro")
+ icon_result=":keyboard_maestro:"
+ ;;
+ "Keynote" | "Keynote 讲演")
+ icon_result=":keynote:"
+ ;;
+ "kitty")
+ icon_result=":kitty:"
+ ;;
+ "League of Legends")
+ icon_result=":league_of_legends:"
+ ;;
+ "LibreWolf")
+ icon_result=":libre_wolf:"
+ ;;
+ "Adobe Lightroom")
+ icon_result=":lightroom:"
+ ;;
+ "Lightroom Classic")
+ icon_result=":lightroomclassic:"
+ ;;
+ "LINE")
+ icon_result=":line:"
+ ;;
+ "Linear")
+ icon_result=":linear:"
+ ;;
+ "LM Studio")
+ icon_result=":lm_studio:"
+ ;;
+ "LocalSend")
+ icon_result=":localsend:"
+ ;;
+ "Logic Pro")
+ icon_result=":logicpro:"
+ ;;
+ "Logseq")
+ icon_result=":logseq:"
+ ;;
+ "Canary Mail" | "HEY" | "Mail" | "Mailspring" | "MailMate" | "Superhuman" | "Spark" | "邮件")
+ icon_result=":mail:"
+ ;;
+ "MAMP" | "MAMP PRO")
+ icon_result=":mamp:"
+ ;;
+ "Maps" | "Google Maps")
+ icon_result=":maps:"
+ ;;
+ "Matlab")
+ icon_result=":matlab:"
+ ;;
+ "Mattermost")
+ icon_result=":mattermost:"
+ ;;
+ "Messages" | "信息" | "Nachrichten")
+ icon_result=":messages:"
+ ;;
+ "Messenger")
+ icon_result=":messenger:"
+ ;;
+ "Microsoft Edge")
+ icon_result=":microsoft_edge:"
+ ;;
+ "Microsoft Excel")
+ icon_result=":microsoft_excel:"
+ ;;
+ "Microsoft Outlook")
+ icon_result=":microsoft_outlook:"
+ ;;
+ "Microsoft PowerPoint")
+ icon_result=":microsoft_power_point:"
+ ;;
+ "Microsoft Remote Desktop")
+ icon_result=":microsoft_remote_desktop:"
+ ;;
+ "Microsoft Teams" | "Microsoft Teams (work or school)")
+ icon_result=":microsoft_teams:"
+ ;;
+ "Microsoft Word")
+ icon_result=":microsoft_word:"
+ ;;
+ "Min")
+ icon_result=":min_browser:"
+ ;;
+ "Miro")
+ icon_result=":miro:"
+ ;;
+ "MongoDB Compass"*)
+ icon_result=":mongodb:"
+ ;;
+ "mpv")
+ icon_result=":mpv:"
+ ;;
+ "Mullvad Browser")
+ icon_result=":mullvad_browser:"
+ ;;
+ "Music" | "音乐" | "Musique")
+ icon_result=":music:"
+ ;;
+ "Neovide" | "neovide")
+ icon_result=":neovide:"
+ ;;
+ "Neovim" | "neovim" | "nvim")
+ icon_result=":neovim:"
+ ;;
+ "网易云音乐")
+ icon_result=":netease_music:"
+ ;;
+ "Noodl" | "Noodl Editor")
+ icon_result=":noodl:"
+ ;;
+ "NordVPN")
+ icon_result=":nord_vpn:"
+ ;;
+ "Notability")
+ icon_result=":notability:"
+ ;;
+ "Notes" | "备忘录")
+ icon_result=":notes:"
+ ;;
+ "Notion")
+ icon_result=":notion:"
+ ;;
+ "Nova")
+ icon_result=":nova:"
+ ;;
+ "Numbers" | "Numbers 表格")
+ icon_result=":numbers:"
+ ;;
+ "Obsidian")
+ icon_result=":obsidian:"
+ ;;
+ "OBS")
+ icon_result=":obsstudio:"
+ ;;
+ "OmniFocus")
+ icon_result=":omni_focus:"
+ ;;
+ "1Password")
+ icon_result=":one_password:"
+ ;;
+ "ChatGPT")
+ icon_result=":openai:"
+ ;;
+ "OpenVPN Connect")
+ icon_result=":openvpn_connect:"
+ ;;
+ "Opera")
+ icon_result=":opera:"
+ ;;
+ "OrcaSlicer")
+ icon_result=":orcaslicer:"
+ ;;
+ "Orion" | "Orion RC")
+ icon_result=":orion:"
+ ;;
+ "Pages" | "Pages 文稿")
+ icon_result=":pages:"
+ ;;
+ "Parallels Desktop")
+ icon_result=":parallels:"
+ ;;
+ "Parsec")
+ icon_result=":parsec:"
+ ;;
+ "Preview" | "预览" | "Skim" | "zathura" | "Aperçu")
+ icon_result=":pdf:"
+ ;;
+ "PDF Expert")
+ icon_result=":pdf_expert:"
+ ;;
+ "Adobe Photoshop"*)
+ icon_result=":photoshop:"
+ ;;
+ "PhpStorm")
+ icon_result=":php_storm:"
+ ;;
+ "Pi-hole Remote")
+ icon_result=":pihole:"
+ ;;
+ "Pine")
+ icon_result=":pine:"
+ ;;
+ "Podcasts" | "播客")
+ icon_result=":podcasts:"
+ ;;
+ "PomoDone App")
+ icon_result=":pomodone:"
+ ;;
+ "Postman")
+ icon_result=":postman:"
+ ;;
+ "Proton Mail" | "Proton Mail Bridge")
+ icon_result=":proton_mail:"
+ ;;
+ "PrusaSlicer" | "SuperSlicer")
+ icon_result=":prusaslicer:"
+ ;;
+ "PyCharm")
+ icon_result=":pycharm:"
+ ;;
+ "QQ")
+ icon_result=":qq:"
+ ;;
+ "QQ音乐" | "QQMusic")
+ icon_result=":qqmusic:"
+ ;;
+ "Quantumult X")
+ icon_result=":quantumult_x:"
+ ;;
+ "qutebrowser")
+ icon_result=":qute_browser:"
+ ;;
+ "Raindrop.io")
+ icon_result=":raindrop_io:"
+ ;;
+ "Reeder")
+ icon_result=":reeder5:"
+ ;;
+ "Reminders" | "提醒事项" | "Rappels")
+ icon_result=":reminders:"
+ ;;
+ "Replit")
+ icon_result=":replit:"
+ ;;
+ "Rider" | "JetBrains Rider")
+ icon_result=":rider:"
+ ;;
+ "Safari" | "Safari浏览器" | "Safari Technology Preview")
+ icon_result=":safari:"
+ ;;
+ "Sequel Ace")
+ icon_result=":sequel_ace:"
+ ;;
+ "Sequel Pro")
+ icon_result=":sequel_pro:"
+ ;;
+ "Setapp")
+ icon_result=":setapp:"
+ ;;
+ "SF Symbols")
+ icon_result=":sf_symbols:"
+ ;;
+ "Signal")
+ icon_result=":signal:"
+ ;;
+ "Sketch")
+ icon_result=":sketch:"
+ ;;
+ "Skype")
+ icon_result=":skype:"
+ ;;
+ "Slack")
+ icon_result=":slack:"
+ ;;
+ "Spark Desktop")
+ icon_result=":spark:"
+ ;;
+ "Spotify")
+ icon_result=":spotify:"
+ ;;
+ "Spotlight")
+ icon_result=":spotlight:"
+ ;;
+ "Sublime Text")
+ icon_result=":sublime_text:"
+ ;;
+ "Tana")
+ icon_result=":tana:"
+ ;;
+ "TeamSpeak 3")
+ icon_result=":team_speak:"
+ ;;
+ "Telegram")
+ icon_result=":telegram:"
+ ;;
+ "Terminal" | "终端")
+ icon_result=":terminal:"
+ ;;
+ "Typora")
+ icon_result=":text:"
+ ;;
+ "Microsoft To Do" | "Things")
+ icon_result=":things:"
+ ;;
+ "Thunderbird")
+ icon_result=":thunderbird:"
+ ;;
+ "TickTick")
+ icon_result=":tick_tick:"
+ ;;
+ "TIDAL")
+ icon_result=":tidal:"
+ ;;
+ "Tiny RDM")
+ icon_result=":tinyrdm:"
+ ;;
+ "Todoist")
+ icon_result=":todoist:"
+ ;;
+ "Toggl Track")
+ icon_result=":toggl_track:"
+ ;;
+ "Tor Browser")
+ icon_result=":tor_browser:"
+ ;;
+ "Tower")
+ icon_result=":tower:"
+ ;;
+ "Transmit")
+ icon_result=":transmit:"
+ ;;
+ "Trello")
+ icon_result=":trello:"
+ ;;
+ "Tweetbot" | "Twitter")
+ icon_result=":twitter:"
+ ;;
+ "MacVim" | "Vim" | "VimR")
+ icon_result=":vim:"
+ ;;
+ "Vivaldi")
+ icon_result=":vivaldi:"
+ ;;
+ "VLC")
+ icon_result=":vlc:"
+ ;;
+ "VMware Fusion")
+ icon_result=":vmware_fusion:"
+ ;;
+ "VSCodium")
+ icon_result=":vscodium:"
+ ;;
+ "Warp")
+ icon_result=":warp:"
+ ;;
+ "WebStorm")
+ icon_result=":web_storm:"
+ ;;
+ "微信" | "WeChat")
+ icon_result=":wechat:"
+ ;;
+ "企业微信" | "WeCom")
+ icon_result=":wecom:"
+ ;;
+ "WezTerm")
+ icon_result=":wezterm:"
+ ;;
+ "WhatsApp" | "‎WhatsApp")
+ icon_result=":whats_app:"
+ ;;
+ "Xcode")
+ icon_result=":xcode:"
+ ;;
+ "Яндекс Музыка")
+ icon_result=":yandex_music:"
+ ;;
+ "Yuque" | "语雀")
+ icon_result=":yuque:"
+ ;;
+ "Zed")
+ icon_result=":zed:"
+ ;;
+ "Zeplin")
+ icon_result=":zeplin:"
+ ;;
+ "zoom.us")
+ icon_result=":zoom:"
+ ;;
+ "Zotero")
+ icon_result=":zotero:"
+ ;;
+ "Zulip")
+ icon_result=":zulip:"
+ ;;
+ *)
+ icon_result=":default:"
+ ;;
+ esac
+}
+### END-OF-ICON-MAP
+__icon_map "$1"
+echo "$icon_result"
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/monitor_watcher.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/monitor_watcher.sh
new file mode 100755
index 0000000..50868d3
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/monitor_watcher.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Store current monitor state to detect changes
+MONITOR_STATE_FILE="/tmp/aerospace_monitor_state"
+
+# Get current monitor state
+CURRENT_MONITORS=$(aerospace list-monitors | awk '{print $1}' | sort | tr '\n' ' ')
+
+# Check if state has changed
+if [ -f "$MONITOR_STATE_FILE" ]; then
+ PREVIOUS_MONITORS=$(cat "$MONITOR_STATE_FILE")
+ if [ "$CURRENT_MONITORS" != "$PREVIOUS_MONITORS" ]; then
+ # Monitor configuration changed, update display
+ "$CONFIG_DIR/plugins/aerospace_display.sh"
+ fi
+else
+ # First run, create state file
+ "$CONFIG_DIR/plugins/aerospace_display.sh"
+fi
+
+# Save current state
+echo "$CURRENT_MONITORS" > "$MONITOR_STATE_FILE" \ No newline at end of file
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/now_playing.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/now_playing.sh
new file mode 100755
index 0000000..0ae68c7
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/now_playing.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Function to get Spotify info
+get_spotify_info() {
+ local state=$(osascript -e 'tell application "Spotify" to player state as string' 2>/dev/null)
+ if [[ "$state" == "playing" ]]; then
+ local artist=$(osascript -e 'tell application "Spotify" to artist of current track as string' 2>/dev/null)
+ local track=$(osascript -e 'tell application "Spotify" to name of current track as string' 2>/dev/null)
+ echo "playing|$artist|$track"
+ elif [[ "$state" == "paused" ]]; then
+ echo "paused"
+ else
+ echo "stopped"
+ fi
+}
+
+# Function to get Apple Music info
+get_apple_music_info() {
+ local state=$(osascript -e 'tell application "Music" to player state as string' 2>/dev/null)
+ if [[ "$state" == "playing" ]]; then
+ local artist=$(osascript -e 'tell application "Music" to artist of current track as string' 2>/dev/null)
+ local track=$(osascript -e 'tell application "Music" to name of current track as string' 2>/dev/null)
+ echo "playing|$artist|$track"
+ elif [[ "$state" == "paused" ]]; then
+ echo "paused"
+ else
+ echo "stopped"
+ fi
+}
+
+# Check Spotify first, then Apple Music
+SPOTIFY_INFO=$(get_spotify_info)
+APPLE_MUSIC_INFO=$(get_apple_music_info)
+
+if [[ "$SPOTIFY_INFO" == "playing|"* ]]; then
+ # Spotify is playing - show the item
+ sketchybar --set "$NAME" drawing=on
+ ICON="󰓇"
+ COLOR=$ACCENT_SECONDARY
+ IFS='|' read -r state artist track <<< "$SPOTIFY_INFO"
+ if [[ ${#track} -gt 20 ]]; then
+ LABEL="${track:0:20}..."
+ else
+ LABEL="$track"
+ fi
+elif [[ "$APPLE_MUSIC_INFO" == "playing|"* ]]; then
+ # Apple Music is playing - show the item
+ sketchybar --set "$NAME" drawing=on
+ ICON="󰎆"
+ COLOR=$ACCENT_QUATERNARY
+ IFS='|' read -r state artist track <<< "$APPLE_MUSIC_INFO"
+ if [[ ${#track} -gt 20 ]]; then
+ LABEL="${track:0:20}..."
+ else
+ LABEL="$track"
+ fi
+elif [[ "$SPOTIFY_INFO" == "paused" ]] || [[ "$APPLE_MUSIC_INFO" == "paused" ]]; then
+ # Music is paused - show paused state
+ sketchybar --set "$NAME" drawing=on
+ ICON="󰏤"
+ COLOR=$ACCENT_TERTIARY
+ LABEL="Paused"
+else
+ # No music playing - hide the item completely
+ sketchybar --set "$NAME" drawing=off
+ exit 0
+fi
+
+# Update the Now Playing item (only if we're showing it)
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color="$COLOR" \
+ label="$LABEL" \
+ label.color=$WHITE \
+ label.font="SF Pro:Medium:12.0" \ No newline at end of file
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/space.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/space.sh
new file mode 100755
index 0000000..b8602b5
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/space.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# The $SELECTED variable is available for space components and indicates if
+# the space invoking this script (with name: $NAME) is currently selected:
+# https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item
+
+sketchybar --set "$NAME" background.drawing="$SELECTED"
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/space_windows.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/space_windows.sh
new file mode 100755
index 0000000..c8996cb
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/space_windows.sh
@@ -0,0 +1,87 @@
+#!/usr/bin/env bash
+
+echo AEROSPACE_PREV_WORKSPACE: $AEROSPACE_PREV_WORKSPACE, \
+ AEROSPACE_FOCUSED_WORKSPACE: $AEROSPACE_FOCUSED_WORKSPACE \
+ SELECTED: $SELECTED \
+ BG2: $BG2 \
+ INFO: $INFO \
+ SENDER: $SENDER \
+ NAME: $NAME \
+ >> ~/aaaa
+
+source "$CONFIG_DIR/colors.sh"
+
+AEROSPACE_FOCUSED_MONITOR=$(aerospace list-monitors --focused | awk '{print $1}')
+AEROSAPCE_WORKSPACE_FOCUSED_MONITOR=$(aerospace list-workspaces --monitor focused --empty no)
+AEROSPACE_EMPTY_WORKESPACE=$(aerospace list-workspaces --monitor focused --empty)
+
+reload_workspace_icon() {
+ # echo reload_workspace_icon "$@" >> ~/aaaa
+ apps=$(aerospace list-windows --workspace "$@" | awk -F'|' '{gsub(/^ *| *$/, "", $2); print $2}')
+
+ icon_strip=" "
+ if [ "${apps}" != "" ]; then
+ while read -r app
+ do
+ icon_strip+=" $($CONFIG_DIR/plugins/icon_map.sh "$app")"
+ done <<< "${apps}"
+ else
+ icon_strip=" —"
+ fi
+
+ sketchybar --animate sin 10 --set space.$@ label="$icon_strip"
+}
+
+if [ "$SENDER" = "aerospace_workspace_change" ]; then
+
+ # if [ $i = "$FOCUSED_WORKSPACE" ]; then
+ # sketchybar --set space.$FOCUSED_WORKSPACE background.drawing=on
+ # else
+ # sketchybar --set space.$FOCUSED_WORKSPACE background.drawing=off
+ # fi
+ #echo 'space_windows_change: '$AEROSPACE_FOCUSED_WORKSPACE >> ~/aaaa
+ #echo space: $space >> ~/aaaa
+ #space="$(echo "$INFO" | jq -r '.space')"
+ #apps="$(echo "$INFO" | jq -r '.apps | keys[]')"
+ # apps=$(aerospace list-windows --workspace $AEROSPACE_FOCUSED_WORKSPACE | awk -F'|' '{gsub(/^ *| *$/, "", $2); print $2}')
+ #
+ # icon_strip=" "
+ # if [ "${apps}" != "" ]; then
+ # while read -r app
+ # do
+ # icon_strip+=" $($CONFIG_DIR/plugins/icon_map.sh "$app")"
+ # done <<< "${apps}"
+ # else
+ # icon_strip=" —"
+ # fi
+
+ reload_workspace_icon "$AEROSPACE_PREV_WORKSPACE"
+ reload_workspace_icon "$AEROSPACE_FOCUSED_WORKSPACE"
+
+ #sketchybar --animate sin 10 --set space.$space label="$icon_strip"
+
+ # current workspace space border color
+ sketchybar --set space.$AEROSPACE_FOCUSED_WORKSPACE icon.highlight=true \
+ label.highlight=true \
+ background.border_color=$GREY
+
+ # prev workspace space border color
+ sketchybar --set space.$AEROSPACE_PREV_WORKSPACE icon.highlight=false \
+ label.highlight=false \
+ background.border_color=$BACKGROUND_2
+
+ # if [ "$AEROSPACE_FOCUSED_WORKSPACE" -gt 3 ]; then
+ # sketchybar --animate sin 10 --set space.$AEROSPACE_FOCUSED_WORKSPACE display=1
+ # fi
+ ## focused 된 모니터에 space 상태 보이게 설정
+ for i in $AEROSAPCE_WORKSPACE_FOCUSED_MONITOR; do
+ sketchybar --set space.$i display=$AEROSPACE_FOCUSED_MONITOR
+ done
+
+ for i in $AEROSPACE_EMPTY_WORKESPACE; do
+ sketchybar --set space.$i display=0
+ done
+
+ sketchybar --set space.$AEROSPACE_FOCUSED_WORKSPACE display=$AEROSPACE_FOCUSED_MONITOR
+
+fi
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/test_click.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/test_click.sh
new file mode 100644
index 0000000..7cb66f2
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/test_click.sh
@@ -0,0 +1,3 @@
+#/bin/bash -c
+
+osascript -e 'display notification "Volume clicked'
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/volume.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/volume.sh
new file mode 100755
index 0000000..6135b1f
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/volume.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Get volume information
+if [ "$SENDER" = "volume_change" ]; then
+ VOLUME="$INFO"
+ # Check if muted by trying to get current mute state
+ MUTED=$(osascript -e "output muted of (get volume settings)" 2>/dev/null)
+else
+ VOLUME=$(osascript -e "output volume of (get volume settings)" 2>/dev/null)
+ MUTED=$(osascript -e "output muted of (get volume settings)" 2>/dev/null)
+fi
+
+# Fallback if osascript fails
+if [[ -z "$VOLUME" ]]; then
+ VOLUME=50
+fi
+
+# Determine icon and color based on volume level and mute status
+if [[ $MUTED == "true" ]]; then
+ ICON="󰖁" # Muted icon
+ COLOR=$RED
+ LABEL="" # No label for muted state since we're not showing labels
+else
+ if [[ $VOLUME -gt 75 ]]; then
+ ICON="󰕾" # High volume
+ COLOR=$ACCENT_PRIMARY
+ elif [[ $VOLUME -gt 50 ]]; then
+ ICON="󰖀" # Medium volume
+ COLOR=$ACCENT_PRIMARY
+ elif [[ $VOLUME -gt 25 ]]; then
+ ICON="󰕿" # Low volume
+ COLOR=$YELLOW
+ elif [[ $VOLUME -gt 0 ]]; then
+ ICON="󰕿" # Very low volume
+ COLOR=$ORANGE
+ else
+ ICON="󰖁" # No volume
+ COLOR=$RED
+ fi
+ LABEL="" # No label since we're not showing labels in the bar
+fi
+
+# Update the volume item
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color="$COLOR" \
+ label="$LABEL"
+
+# Update popup if it's currently showing
+if [ "$(sketchybar --query volume | jq -r '.popup.drawing')" = "on" ]; then
+ # Update the slider bar
+ SLIDER_BAR=""
+ FILLED_SEGMENTS=$((VOLUME / 2))
+
+ for i in {1..50}; do
+ if [ $i -le $FILLED_SEGMENTS ]; then
+ SLIDER_BAR="${SLIDER_BAR}█"
+ else
+ SLIDER_BAR="${SLIDER_BAR}▒"
+ fi
+ done
+
+ # Update mute button
+ if [[ $MUTED == "true" ]]; then
+ MUTE_ICON="󰖁"
+ MUTE_COLOR=$RED
+ else
+ MUTE_ICON="󰕾"
+ MUTE_COLOR=$GREEN
+ fi
+
+ sketchybar --set volume.mute icon="$MUTE_ICON" icon.color="$MUTE_COLOR"
+ sketchybar --set volume.slider icon="$SLIDER_BAR"
+ sketchybar --set volume.percent icon="$VOLUME%"
+fi
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/volume_click.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/volume_click.sh
new file mode 100755
index 0000000..82badb8
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/volume_click.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Toggle popup
+sketchybar --set volume popup.drawing=toggle
+
+# Get current volume and mute status
+VOLUME=$(osascript -e "output volume of (get volume settings)" 2>/dev/null || echo "50")
+MUTED=$(osascript -e "output muted of (get volume settings)" 2>/dev/null || echo "false")
+
+# Add mute toggle
+if [ "$MUTED" = "true" ]; then
+ MUTE_ICON="󰖁"
+ MUTE_COLOR=$RED
+else
+ MUTE_ICON="󰕾"
+ MUTE_COLOR=$GREEN
+fi
+
+sketchybar --add item volume.mute popup.volume \
+ --set volume.mute icon="$MUTE_ICON" \
+ icon.color="$MUTE_COLOR" \
+ label.drawing=off \
+ background.drawing=off \
+ padding_left=8 \
+ padding_right=2 \
+ click_script="osascript -e 'set volume output muted not (output muted of (get volume settings))'"
+
+# Add volume down button
+sketchybar --add item volume.down popup.volume \
+ --set volume.down icon="−" \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Medium:14.0" \
+ label.drawing=off \
+ background.drawing=off \
+ padding_left=2 \
+ padding_right=2 \
+ click_script="osascript -e 'set volume output volume ((output volume of (get volume settings)) - 5)'"
+
+# Create compact slider bar with 50 segments
+SLIDER_BAR=""
+FILLED_SEGMENTS=$((VOLUME / 2))
+
+for i in {1..50}; do
+ if [ $i -le $FILLED_SEGMENTS ]; then
+ SLIDER_BAR="${SLIDER_BAR}█"
+ else
+ SLIDER_BAR="${SLIDER_BAR}▒"
+ fi
+done
+
+sketchybar --add item volume.slider popup.volume \
+ --set volume.slider icon="$SLIDER_BAR" \
+ icon.color=$ACCENT_PRIMARY \
+ icon.font="SF Pro:Regular:2.0" \
+ label.drawing=off \
+ background.drawing=off \
+ padding_left=2 \
+ padding_right=2 \
+ click_script="osascript -e 'set volume output volume 50'"
+
+# Add volume up button
+sketchybar --add item volume.up popup.volume \
+ --set volume.up icon="+" \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Medium:14.0" \
+ label.drawing=off \
+ background.drawing=off \
+ padding_left=2 \
+ padding_right=2 \
+ click_script="osascript -e 'set volume output volume ((output volume of (get volume settings)) + 5)'"
+
+# Add volume percentage
+sketchybar --add item volume.percent popup.volume \
+ --set volume.percent icon="$VOLUME%" \
+ icon.color=$WHITE \
+ icon.font="SF Pro:Medium:9.0" \
+ label.drawing=off \
+ background.drawing=off \
+ padding_left=2
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/weather.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/weather.sh
new file mode 100755
index 0000000..b96bab8
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/weather.sh
@@ -0,0 +1,52 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Cache file for weather data
+CACHE_FILE="/tmp/sketchybar_weather_cache"
+CACHE_DURATION=1800 # 30 minutes
+
+# Function to get weather data
+get_weather() {
+ # You can replace this with your preferred weather API
+ # For now, using a simple placeholder
+ local location="San Francisco" # Change to your location
+
+ # Try to get weather from wttr.in (simple text-based weather)
+ local weather_data=$(curl -s "wttr.in/$location?format=3" 2>/dev/null)
+
+ if [ -n "$weather_data" ]; then
+ echo "$weather_data"
+ else
+ echo "Weather unavailable"
+ fi
+}
+
+# Check if cache is valid
+if [ -f "$CACHE_FILE" ]; then
+ cache_time=$(stat -f %m "$CACHE_FILE" 2>/dev/null || echo 0)
+ current_time=$(date +%s)
+
+ if [ $((current_time - cache_time)) -lt $CACHE_DURATION ]; then
+ weather=$(cat "$CACHE_FILE")
+ else
+ weather=$(get_weather)
+ echo "$weather" > "$CACHE_FILE"
+ fi
+else
+ weather=$(get_weather)
+ echo "$weather" > "$CACHE_FILE"
+fi
+
+# Extract temperature and condition
+if [[ "$weather" =~ ([0-9.-]+°[CF]) ]]; then
+ temp="${BASH_REMATCH[1]}"
+ sketchybar --set "$NAME" label="$temp" \
+ icon.color=$BLUE \
+ label.color=$WHITE
+else
+ sketchybar --set "$NAME" label="N/A" \
+ icon.color=$GREY \
+ label.color=$GREY
+fi
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/wifi.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/wifi.sh
new file mode 100755
index 0000000..408fd00
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/wifi.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+
+# Source colors for consistent theming
+source "$CONFIG_DIR/colors.sh"
+
+# Multiple methods to detect WiFi status
+WIFI_CONNECTED=false
+WIFI_SSID=""
+
+# Method 1: Check if WiFi interface is up and has IP
+WIFI_IP=$(ifconfig en0 2>/dev/null | grep "inet " | awk '{print $2}' | head -1)
+if [[ -n "$WIFI_IP" && "$WIFI_IP" != "127.0.0.1" ]]; then
+ # Method 2: Get network name using networksetup
+ WIFI_INFO=$(networksetup -getairportnetwork en0 2>/dev/null)
+ if [[ "$WIFI_INFO" != *"You are not associated"* ]] && [[ "$WIFI_INFO" != *"not found"* ]]; then
+ WIFI_SSID=$(echo "$WIFI_INFO" | sed 's/Current Wi-Fi Network: //')
+ WIFI_CONNECTED=true
+ fi
+fi
+
+# Method 3: Alternative check using system_profiler (slower but more reliable)
+if [[ "$WIFI_CONNECTED" == false ]]; then
+ WIFI_STATUS=$(system_profiler SPAirPortDataType 2>/dev/null | grep -A 1 "Current Network Information:" | grep "^[[:space:]]*[^:]" | head -1 | xargs)
+ if [[ -n "$WIFI_STATUS" && "$WIFI_STATUS" != "" ]]; then
+ WIFI_SSID="$WIFI_STATUS"
+ WIFI_CONNECTED=true
+ fi
+fi
+
+# Method 4: Check using scutil (most reliable)
+if [[ "$WIFI_CONNECTED" == false ]]; then
+ WIFI_CHECK=$(scutil --nc list | grep Connected | head -1)
+ if [[ -n "$WIFI_CHECK" ]]; then
+ WIFI_CONNECTED=true
+ WIFI_SSID="Connected"
+ fi
+fi
+
+# Set icon and color based on connection status
+if [[ "$WIFI_CONNECTED" == true ]]; then
+ # WiFi is connected - green icon
+ ICON="󰤨"
+ COLOR=$ACCENT_SECONDARY # Green
+else
+ # WiFi is disconnected - gray icon
+ ICON="󰤭"
+ COLOR=$GREY
+fi
+
+# Update the WiFi item - icon only, no label
+sketchybar --set "$NAME" icon="$ICON" \
+ icon.color="$COLOR" \
+ label.drawing=off
diff --git a/mac/.config/sketchybar.mon/sketchybar/plugins/zen.sh b/mac/.config/sketchybar.mon/sketchybar/plugins/zen.sh
new file mode 100755
index 0000000..38f2291
--- /dev/null
+++ b/mac/.config/sketchybar.mon/sketchybar/plugins/zen.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+zen_on() {
+ sketchybar --set wifi drawing=off \
+ --set apple.logo drawing=off \
+ --set '/cpu.*/' drawing=off \
+ --set calendar icon.drawing=off \
+ --set separator drawing=off \
+ --set front_app drawing=off \
+ --set volume_icon drawing=off \
+ --set spotify.anchor drawing=off \
+ --set spotify.play updates=off \
+ --set brew drawing=off \
+ --set volume drawing=off \
+ --set github.bell drawing=off
+}
+
+zen_off() {
+ sketchybar --set wifi drawing=on \
+ --set apple.logo drawing=on \
+ --set '/cpu.*/' drawing=on \
+ --set calendar icon.drawing=on \
+ --set separator drawing=on \
+ --set front_app drawing=on \
+ --set volume_icon drawing=on \
+ --set spotify.play updates=on \
+ --set brew drawing=on \
+ --set volume drawing=on \
+ --set github.bell drawing=on
+}
+
+if [ "$1" = "on" ]; then
+ zen_on
+elif [ "$1" = "off" ]; then
+ zen_off
+else
+ if [ "$(sketchybar --query apple.logo | jq -r ".geometry.drawing")" = "on" ]; then
+ zen_on
+ else
+ zen_off
+ fi
+fi
+