diff --git a/TOPICAL-AUTHORITY-MAP.md b/TOPICAL-AUTHORITY-MAP.md index 84c06d6a..4b9ba49e 100644 --- a/TOPICAL-AUTHORITY-MAP.md +++ b/TOPICAL-AUTHORITY-MAP.md @@ -70,7 +70,7 @@ All articles must follow the SEO Skill ([`.agents/skills/seo-skill/SKILL.md`](.a - [ ] Best lightweight ATS for teams that hate bloated software 🟒 **Supporting β€” Head-to-head comparisons:** -- [ ] Greenhouse vs open source ATS: honest comparison 🟒 +- [x] Greenhouse vs open source ATS: honest comparison 🟒 - [ ] Lever vs open source ATS: features, cost, and flexibility 🟒 - [ ] Ashby vs open source ATS: modern ATS showdown 🟒 - [ ] Workable vs open source ATS: which is more flexible? 🟒 diff --git a/app/assets/css/main.css b/app/assets/css/main.css index 55b5a31a..1fecf175 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -141,6 +141,13 @@ background-color: var(--color-surface-950); color: var(--color-surface-100); } + + /* Native checkboxes/radios: use dark rendering in dark mode */ + .dark input[type="checkbox"], + .dark input[type="radio"] { + color-scheme: dark; + border-color: var(--color-surface-600); + } } /* ── Premium fade-in animations (Linear-style) ─────────── */ diff --git a/app/components/AppSidebar.vue b/app/components/AppSidebar.vue deleted file mode 100644 index 47aa9d66..00000000 --- a/app/components/AppSidebar.vue +++ /dev/null @@ -1,244 +0,0 @@ - - - diff --git a/app/components/AppTopBar.vue b/app/components/AppTopBar.vue index abbb545a..d9ac89c8 100644 --- a/app/components/AppTopBar.vue +++ b/app/components/AppTopBar.vue @@ -4,7 +4,7 @@ import { Kanban, FileText, LogOut, Table2, Sun, Moon, MessageSquarePlus, Settings, ChevronDown, Menu, X, Users, ChevronLeft, - LayoutDashboard, + LayoutDashboard, Calendar, } from 'lucide-vue-next' const route = useRoute() @@ -101,9 +101,11 @@ const jobTabs = computed(() => { // ───────────────────────────────────────────── const mainNav = [ - { label: 'Jobs', to: '/dashboard', icon: Briefcase, exact: true }, + { label: 'Dashboard', to: '/dashboard', icon: LayoutDashboard, exact: true }, + { label: 'Jobs', to: '/dashboard/jobs', icon: Briefcase, exact: false }, { label: 'Candidates', to: '/dashboard/candidates', icon: Users, exact: false }, { label: 'Applications', to: '/dashboard/applications', icon: FileText, exact: false }, + { label: 'Interviews', to: '/dashboard/interviews', icon: Calendar, exact: false }, { label: 'Settings', to: '/dashboard/settings', icon: Settings, exact: false }, ] @@ -292,9 +294,6 @@ onUnmounted(() => document.removeEventListener('click', onClickOutsideUser)) enter-active-class="transition duration-200 ease-out" enter-from-class="opacity-0 -translate-y-1" enter-to-class="opacity-100 translate-y-0" - leave-active-class="transition duration-150 ease-in" - leave-from-class="opacity-100 translate-y-0" - leave-to-class="opacity-0 -translate-y-1" >
document.removeEventListener('click', onClickOutsideUser)) >
diff --git a/app/components/ApplyCandidateModal.vue b/app/components/ApplyCandidateModal.vue index b79ffe7f..09a9851c 100644 --- a/app/components/ApplyCandidateModal.vue +++ b/app/components/ApplyCandidateModal.vue @@ -2,9 +2,12 @@ import { Search, X, UserPlus } from 'lucide-vue-next' import { usePreviewReadOnly } from '~/composables/usePreviewReadOnly' -const props = defineProps<{ +const props = withDefaults(defineProps<{ jobId: string -}>() + teleportTarget?: string | HTMLElement +}>(), { + teleportTarget: 'body', +}) const emit = defineEmits<{ (e: 'close'): void @@ -58,7 +61,7 @@ async function applyCandidate(candidateId: string) {