@timurtekb/tekjobs 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +131 -0
- package/LICENSE +21 -0
- package/README.md +145 -0
- package/app/README.md +22 -0
- package/app/dist/assets/index-DzGgV6NF.css +1 -0
- package/app/dist/assets/index-QteuouKv.js +77 -0
- package/app/dist/favicon.svg +1 -0
- package/app/dist/index.html +16 -0
- package/app/server/cover-letter.mjs +243 -0
- package/app/server/index.mjs +113 -0
- package/app/server/mail-check.mjs +234 -0
- package/app/server/mcp.mjs +129 -0
- package/app/server/people.mjs +164 -0
- package/app/server/store.mjs +1131 -0
- package/app/server/tailored-resume.mjs +213 -0
- package/cli.mjs +205 -0
- package/package.json +74 -0
- package/run.cmd +10 -0
- package/run.mjs +201 -0
- package/run.sh +12 -0
- package/samples/vault/Jobs/Basalt Systems - Senior Design Engineer, Growth (1010).md +56 -0
- package/samples/vault/Jobs/Brightline Studio - Design Engineer (1005).md +51 -0
- package/samples/vault/Jobs/Copperleaf - Principal Design Engineer (1006).md +53 -0
- package/samples/vault/Jobs/Example Studio - Senior Design Engineer (1013).md +52 -0
- package/samples/vault/Jobs/Fjord Analytics - Staff Frontend Engineer, Platform (1003).md +58 -0
- package/samples/vault/Jobs/Halcyon Robotics - Senior UX Engineer (1004).md +52 -0
- package/samples/vault/Jobs/Lumen Health - Design Systems Engineer (1002).md +51 -0
- package/samples/vault/Jobs/Meridian Pay - Staff Design Engineer (1009).md +67 -0
- package/samples/vault/Jobs/Northwind Labs - Staff Design Engineer, Design Systems (1000).md +57 -0
- package/samples/vault/Jobs/Orbital Software - Senior Design Engineer (1001).md +52 -0
- package/samples/vault/Jobs/Quill & Co - Design Engineer, Editor (1008).md +55 -0
- package/samples/vault/Jobs/Signalfire Design - Design Engineer (1012).md +53 -0
- package/samples/vault/Jobs/Tessellate - Senior Frontend Engineer, Design Systems (1007).md +52 -0
- package/samples/vault/Jobs/Verdant - UX Engineer (1011).md +51 -0
- package/samples/vault/Logs/2026-09-16.md +13 -0
- package/samples/vault/Logs/2026-09-23.md +13 -0
- package/samples/vault/People/Lee Example (Fjord Analytics).md +22 -0
- package/samples/vault/People/Priya Example (Meridian Pay).md +23 -0
- package/samples/vault/People/Sam Example (Northwind Labs).md +20 -0
- package/samples/vault/Profile/Positioning.md +16 -0
- package/samples/vault/Profile/Profile.md +41 -0
- package/samples/vault/Profile/Resume.md +32 -0
- package/samples/vault/Profile/Voice.md +15 -0
- package/samples/vault/README.md +11 -0
- package/samples/vault/Targets/Companies.md +318 -0
- package/samples/vault/Targets/Search Criteria.md +234 -0
- package/samples/vault/_Home.md +54 -0
- package/scraper/config.mjs +122 -0
- package/scraper/health.mjs +50 -0
- package/scraper/import-link.mjs +281 -0
- package/scraper/profile.mjs +186 -0
- package/scraper/rescore.mjs +236 -0
- package/scraper/resume-sync.mjs +224 -0
- package/scraper/resume.mjs +65 -0
- package/scraper/score.mjs +114 -0
- package/scraper/sources-email.mjs +242 -0
- package/scraper/sources-extra.mjs +558 -0
- package/scraper/sources-sites.mjs +280 -0
- package/scraper/sources.mjs +264 -0
- package/scraper/starter/companies-table.md +306 -0
- package/scraper/starter/criteria.json +56 -0
- package/scraper/starter/profile.md +38 -0
- package/scraper/vault.mjs +212 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Every release, newest first. Written by semantic-release from the commit messages.
|
|
4
|
+
|
|
5
|
+
## <small>0.24.1 (2026-09-24)</small>
|
|
6
|
+
|
|
7
|
+
* fix(cli): publish as @timurtekb/tekjobs ([b573310](https://github.com/Timurtek/tekjobs/commit/b573310))
|
|
8
|
+
* ci: publish to npm through trusted publishing, switched on by a variable ([36a0d56](https://github.com/Timurtek/tekjobs/commit/36a0d56))
|
|
9
|
+
|
|
10
|
+
## 0.24.0 (2026-09-24)
|
|
11
|
+
|
|
12
|
+
* feat(cli): tekjobs --version ([0ed168a](https://github.com/Timurtek/tekjobs/commit/0ed168a))
|
|
13
|
+
|
|
14
|
+
## 0.23.0 (2026-09-24)
|
|
15
|
+
|
|
16
|
+
* feat(cli): npx tekjobs init, and the docs say which CLI does what ([c6e318d](https://github.com/Timurtek/tekjobs/commit/c6e318d))
|
|
17
|
+
|
|
18
|
+
## 0.22.0 (2026-09-24)
|
|
19
|
+
|
|
20
|
+
* feat(app): the profile page opens on a summary read from the notes ([576b473](https://github.com/Timurtek/tekjobs/commit/576b473))
|
|
21
|
+
|
|
22
|
+
## 0.21.0 (2026-09-24)
|
|
23
|
+
|
|
24
|
+
* feat(app): criteria edits preview their effect live, and notes rescore from the page ([918a36e](https://github.com/Timurtek/tekjobs/commit/918a36e))
|
|
25
|
+
|
|
26
|
+
## 0.20.0 (2026-09-24)
|
|
27
|
+
|
|
28
|
+
* feat(app): overview answers whether the search is working ([8d21437](https://github.com/Timurtek/tekjobs/commit/8d21437))
|
|
29
|
+
|
|
30
|
+
## 0.19.0 (2026-09-24)
|
|
31
|
+
|
|
32
|
+
* feat(app): runs read as success, partial or failed, with the problems behind a click ([2285b7a](https://github.com/Timurtek/tekjobs/commit/2285b7a))
|
|
33
|
+
|
|
34
|
+
## <small>0.18.2 (2026-09-24)</small>
|
|
35
|
+
|
|
36
|
+
* chore(site): screenshots from the sample vault ([9ca6ec4](https://github.com/Timurtek/tekjobs/commit/9ca6ec4))
|
|
37
|
+
* fix(app): the fit ceiling counts every point the scorer can award ([6500f3f](https://github.com/Timurtek/tekjobs/commit/6500f3f))
|
|
38
|
+
|
|
39
|
+
## <small>0.18.1 (2026-09-24)</small>
|
|
40
|
+
|
|
41
|
+
* fix: what the interview meets on a dead link and on the first dashboard ([0f3ff65](https://github.com/Timurtek/tekjobs/commit/0f3ff65))
|
|
42
|
+
|
|
43
|
+
## 0.18.0 (2026-09-23)
|
|
44
|
+
|
|
45
|
+
* feat(cli): tekjobs schedule, and the first-run path as a stranger meets it ([07ef3ea](https://github.com/Timurtek/tekjobs/commit/07ef3ea))
|
|
46
|
+
|
|
47
|
+
## 0.17.0 (2026-09-23)
|
|
48
|
+
|
|
49
|
+
* feat: a fictional sample profile folder, built by the product's own writers ([774e0a0](https://github.com/Timurtek/tekjobs/commit/774e0a0))
|
|
50
|
+
* refactor: the scan's code lives in scraper/, not src/ ([f3c0ca5](https://github.com/Timurtek/tekjobs/commit/f3c0ca5))
|
|
51
|
+
* chore: check out every text file as LF ([69366ee](https://github.com/Timurtek/tekjobs/commit/69366ee))
|
|
52
|
+
* chore(repo): the way in for contributors, and a clean-clone rehearsal's fixes ([270cfe5](https://github.com/Timurtek/tekjobs/commit/270cfe5))
|
|
53
|
+
|
|
54
|
+
## 0.16.0 (2026-09-23)
|
|
55
|
+
|
|
56
|
+
* feat(app): the sidebar is an icon strip across the top on phones ([1c4cd39](https://github.com/Timurtek/tekjobs/commit/1c4cd39))
|
|
57
|
+
|
|
58
|
+
## 0.15.0 (2026-09-23)
|
|
59
|
+
|
|
60
|
+
* feat(app): jobs as master-detail on wide screens, with J/K and a counter ([e4b04b0](https://github.com/Timurtek/tekjobs/commit/e4b04b0))
|
|
61
|
+
|
|
62
|
+
## 0.14.0 (2026-09-23)
|
|
63
|
+
|
|
64
|
+
* feat(app): sources page with board and feed health, and a retry for failed boards ([122af4c](https://github.com/Timurtek/tekjobs/commit/122af4c))
|
|
65
|
+
|
|
66
|
+
## 0.13.0 (2026-09-23)
|
|
67
|
+
|
|
68
|
+
* feat(site): one pass over the employer form from the audit ([cdf8c2b](https://github.com/Timurtek/tekjobs/commit/cdf8c2b))
|
|
69
|
+
|
|
70
|
+
## 0.12.0 (2026-09-23)
|
|
71
|
+
|
|
72
|
+
* feat(app): mark postings that came through tekjobs ([8e86282](https://github.com/Timurtek/tekjobs/commit/8e86282))
|
|
73
|
+
|
|
74
|
+
## 0.11.0 (2026-09-23)
|
|
75
|
+
|
|
76
|
+
* feat(site): employer flow, public job pages and the tekjobs feed source ([7a78286](https://github.com/Timurtek/tekjobs/commit/7a78286))
|
|
77
|
+
|
|
78
|
+
## 0.10.0 (2026-09-23)
|
|
79
|
+
|
|
80
|
+
* feat(site): terms of use, privacy policy and refund policy ([4a6ef72](https://github.com/Timurtek/tekjobs/commit/4a6ef72))
|
|
81
|
+
|
|
82
|
+
## <small>0.9.2 (2026-09-23)</small>
|
|
83
|
+
|
|
84
|
+
* chore(repo): ignore env files, key files and local artefacts at every root ([79b9ebb](https://github.com/Timurtek/tekjobs/commit/79b9ebb))
|
|
85
|
+
* chore(site): stop tracking the TypeScript build info file ([73a77ac](https://github.com/Timurtek/tekjobs/commit/73a77ac))
|
|
86
|
+
* fix(site): accept the service account however it was pasted ([e9aafd4](https://github.com/Timurtek/tekjobs/commit/e9aafd4))
|
|
87
|
+
|
|
88
|
+
## <small>0.9.1 (2026-09-23)</small>
|
|
89
|
+
|
|
90
|
+
* fix(site): add the files a failed git add left out of v0.9.0 ([388d5d4](https://github.com/Timurtek/tekjobs/commit/388d5d4))
|
|
91
|
+
|
|
92
|
+
## 0.9.0 (2026-09-23)
|
|
93
|
+
|
|
94
|
+
* feat(site): the landing page and docs for tekjobs.timurtek.com ([6624620](https://github.com/Timurtek/tekjobs/commit/6624620))
|
|
95
|
+
|
|
96
|
+
## 0.8.0 (2026-09-22)
|
|
97
|
+
|
|
98
|
+
* feat(import): read Google and Apple job pages, and name plain pages properly ([10e91d4](https://github.com/Timurtek/tekjobs/commit/10e91d4))
|
|
99
|
+
|
|
100
|
+
## <small>0.7.1 (2026-09-22)</small>
|
|
101
|
+
|
|
102
|
+
* fix(import): keep a URL's slash out of the note filename ([746ade0](https://github.com/Timurtek/tekjobs/commit/746ade0))
|
|
103
|
+
* fix(jobs): put the collapse control first, icon only ([b55b2da](https://github.com/Timurtek/tekjobs/commit/b55b2da))
|
|
104
|
+
|
|
105
|
+
## 0.7.0 (2026-09-22)
|
|
106
|
+
|
|
107
|
+
* feat(profile): resume variants, note previews, a settings page, and link-only attach ([bf770b3](https://github.com/Timurtek/tekjobs/commit/bf770b3))
|
|
108
|
+
|
|
109
|
+
## <small>0.6.1 (2026-09-22)</small>
|
|
110
|
+
|
|
111
|
+
* fix(shell): drop the mail button from the top bar ([9fc1fb1](https://github.com/Timurtek/tekjobs/commit/9fc1fb1))
|
|
112
|
+
|
|
113
|
+
## 0.6.0 (2026-09-22)
|
|
114
|
+
|
|
115
|
+
* feat(jobs): remember the last filter set between visits ([1a45e7d](https://github.com/Timurtek/tekjobs/commit/1a45e7d))
|
|
116
|
+
|
|
117
|
+
## <small>0.5.1 (2026-09-22)</small>
|
|
118
|
+
|
|
119
|
+
* fix(jobs): condense folds the filters away, not the table rows ([0ba2eeb](https://github.com/Timurtek/tekjobs/commit/0ba2eeb))
|
|
120
|
+
|
|
121
|
+
## 0.5.0 (2026-09-22)
|
|
122
|
+
|
|
123
|
+
* feat(mail): give Mail its own page in the navigation ([8d364c7](https://github.com/Timurtek/tekjobs/commit/8d364c7))
|
|
124
|
+
|
|
125
|
+
## 0.4.0 (2026-09-22)
|
|
126
|
+
|
|
127
|
+
* feat(rescore): score every note again from the note itself ([61842d2](https://github.com/Timurtek/tekjobs/commit/61842d2))
|
|
128
|
+
|
|
129
|
+
## 0.3.0 (2026-09-22)
|
|
130
|
+
|
|
131
|
+
* feat(mail): read the mailbox after the morning scan, show what waits from any page ([0a3434e](https://github.com/Timurtek/tekjobs/commit/0a3434e))
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Timurtek
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# TekJobs
|
|
2
|
+
|
|
3
|
+
A local-first job-search machine. It watches hundreds of company job boards every day, scores every posting against a profile you own, and files the matches as markdown notes in a folder on your machine. The LLM is whichever one you already pay for, connected through MCP. No accounts, no API keys, nothing leaves your computer.
|
|
4
|
+
|
|
5
|
+
Working name. Built by one person for his own search first; the venture and the product come after.
|
|
6
|
+
|
|
7
|
+
## Requirements
|
|
8
|
+
|
|
9
|
+
- **Node 20 or newer.** The scraper has one dependency (PDF reading); the app has its own `npm install`.
|
|
10
|
+
- **A folder for your profile.** Plain markdown. Obsidian is the nicest way to read it, and not required.
|
|
11
|
+
- **A coding CLI that can run MCP tools, signed in on this machine.** Claude Code by default. The interview and everything an agent does over MCP work with any MCP client (Codex, Cursor, Claude Desktop). The app's "Write cover letter" and "Tailor resume" buttons run a CLI with the prompt as an argument and read its output; the default is `claude -p --output-format text`, and another command goes under `"llm"` in `~/.tekjobs/config.json` or on the Settings page. No API key, nothing metered.
|
|
12
|
+
- **"Check mail" needs Claude Code specifically**, with its Gmail connector enabled. The run allows exactly three Gmail read tools by name and denies every write and shell tool, which is what makes it safe to run unattended; another CLI would need a Gmail MCP with matching tool names. Everything else works without it.
|
|
13
|
+
- Optional: free Adzuna and USAJOBS keys for those two feeds, and `"contact"` in `~/.tekjobs/config.json` so the user agent on scan requests names a way to reach you.
|
|
14
|
+
|
|
15
|
+
Nothing personal lives in this repository. Your profile folder (profile, resume, criteria, watchlist, job notes, logs, mail state) and `~/.tekjobs/config.json` are outside it; the repository is the code and the starter notes a new profile folder begins with.
|
|
16
|
+
|
|
17
|
+
## What you get
|
|
18
|
+
|
|
19
|
+
- **A profile folder** (default `~/.tekjobs/profile`): your profile, your resume as text, the scoring criteria, the board watchlist, one note per matched job, and scan logs. Plain markdown, readable in Obsidian or anything else.
|
|
20
|
+
- **A daily scan** over Greenhouse, Lever, Ashby, Workday, Rippling, SmartRecruiters, Workable, BambooHR, Breezy, Personio, Teamtailor and Eightfold boards, the Atlassian, GitHub, Spotify and Amazon career APIs, the Google and Apple career pages (keyword-searched; they have no API), and eleven aggregator feeds including Wellfound's and Built In's remote listing pages. All public, all key-free. Two optional feeds need a free key: Adzuna, which reaches listings that never make it to a company board, and USAJOBS, which is every federal posting in the United States. Job alert emails saved into `Inbox/` are read too, which is how LinkedIn and Indeed listings get in without anything contacting those sites. Around 25,000 postings a run, deduplicated, scored, and cut to the ones that fit you.
|
|
21
|
+
- **An app** (Zengin UI): a Today queue, filterable jobs table with a detail sheet, drag-and-drop pipeline, a Sources page with each board's health and a retry for the failed ones, criteria editor, scan history with a run button, and the agent setup page.
|
|
22
|
+
- **An MCP server** with 42 tools, so Claude Code, Claude Desktop, ChatGPT or Cursor can run the whole search: onboard you, find matches, move them through the pipeline, pull your profile and a posting together to tailor an application, save the draft into the note, add boards, start scans.
|
|
23
|
+
|
|
24
|
+
## Getting started
|
|
25
|
+
|
|
26
|
+
Without cloning:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
npx @timurtekb/tekjobs init ~/Obsidian/JobSearch --resume ~/Downloads/resume.pdf
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The folder can be anywhere; inside an Obsidian vault is the nicest place. For the daily task, install it rather than running from npx's cache, so the scheduled command has a home that lasts: `npm install -g @timurtekb/tekjobs`, then `tekjobs schedule`.
|
|
33
|
+
|
|
34
|
+
From a clone (to change the code, or to run the app from source):
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
git clone https://github.com/Timurtek/tekjobs && cd tekjobs
|
|
38
|
+
npm install # one dependency, for reading PDF resumes
|
|
39
|
+
npm run init -- --resume ~/Downloads/resume.pdf # creates the profile folder and imports the resume
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Then the interview. Open Claude Code in the `app/` folder (its `.mcp.json` connects the `tekjobs` server) and say:
|
|
43
|
+
|
|
44
|
+
> Use the tekjobs MCP server. Call onboarding_status, then onboarding_materials, and follow its script: interview me, write my profile, set the criteria, run a dry scan, and show me the top matches.
|
|
45
|
+
|
|
46
|
+
Any MCP client works the same way: the server is `tekjobs mcp` (or `node app/server/mcp.mjs` from a clone) on stdio; in Codex, Cursor or Claude Desktop, add it as `{ "command": "tekjobs", "args": ["mcp"] }`. The interview reads your resume, asks the few things a resume cannot say (target titles, seniority, work mode, pay floor, hard exclusions, links), writes `Profile/Profile.md` and the criteria, and runs the first scan. LinkedIn: give it your LinkedIn data export, not a URL; it will not scrape profile pages.
|
|
47
|
+
|
|
48
|
+
Then the app:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
cd app && npm install
|
|
52
|
+
npm run server # API on http://127.0.0.1:8787
|
|
53
|
+
npm run dev # UI on http://localhost:5173
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`npm run start` in `app/` builds the UI and serves it from the API on one port. The scan itself is `npm run scan` at the root. `tekjobs schedule` makes it a morning task: the Windows Task Scheduler entry that runs `run.cmd`, or the crontab or launchd line that runs `run.sh`, daily at 07:30 (`--time` to change it, `--print` to see the command first).
|
|
57
|
+
|
|
58
|
+
## Try it without your own data
|
|
59
|
+
|
|
60
|
+
`samples/vault` is a complete, fictional profile folder: Jordan Example, a design engineer three weeks into a search, with fourteen postings at companies that do not exist, one application in interview, a rejection, two passes, a closed listing, three people on the threads, two scan logs and the dashboard. Every note in it was written by the product's own code (`npm run sample` rebuilds it with today's dates), so it is always in the shape the app expects.
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
TEKJOBS_PROFILE=$PWD/samples/vault npm run serve
|
|
64
|
+
cd app && npm run dev
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Point the API at it and the app shows a search in progress instead of an empty folder. Nothing in it is a real person, company or posting.
|
|
68
|
+
|
|
69
|
+
## Cover letters
|
|
70
|
+
|
|
71
|
+
Each job has a Cover letter tab. "Write cover letter" runs a local LLM CLI you are already signed in to (Claude Code by default; set another under `"llm"` in `~/.tekjobs/config.json`), so there is no API key and nothing metered. It writes from the live posting and your resume, and your resume is the only source of facts. How it sounds comes from `Profile/Voice.md` in your profile folder: your voice rules, the shape of a letter you would send, the patterns you never use, and samples of your own prose. Edit that note to change every letter after it; there is a generic fallback for a profile without one. The prompt makes the model draft and then edit against the same checklist (portability test, repeated shapes, self-adjectives, quote count). The result is saved under `## Cover letter` in the job note and checked: a figure that is not on your resume, your profile or the posting is flagged, along with dashes, placeholders, stock phrases, a letter that never names the company, and the tells of a generated letter: a "decade" opener, "You ask for X" stanzas, tag lines, "not X but Y" contrasts, colon reveals, applicant boilerplate, adjectives about yourself. An agent connected over MCP can do the same with `cover_letter_materials` and `save_cover_letter`. If the CLI is signed out or out of date the tab says so and what to run.
|
|
72
|
+
|
|
73
|
+
## Tailored resumes
|
|
74
|
+
|
|
75
|
+
Each job also has a Resume tab. "Tailor my resume to this posting" produces a version of your resume of record with the summary rewritten for the posting and the bullets, capabilities and products reordered and pruned to what it asks for. It may not add anything: the check traces every bullet back to a line of your real resume and flags any bullet, figure, date range or job header that is not there. The result is saved under `## Tailored resume` in the job note (headings nested, restored on read) and the print view at `/api/jobs/<id>/resume.html` is where the PDF you upload comes from: print, save as PDF, margins and page size are set. Over MCP: `tailored_resume_materials` and `save_tailored_resume`.
|
|
76
|
+
|
|
77
|
+
## Adding a job you found yourself
|
|
78
|
+
|
|
79
|
+
The scan watches boards. For the posting you saw on LinkedIn, in a newsletter, or in a friend's message, paste the link: the "Add by link" button in the Jobs view, `tekjobs add <url> [<url>...]` on the command line, or the `add_job` MCP tool. Each link is read once, turned into the same job shape the scan produces, scored with your criteria, and written as a note unless the scan already has it, a note already points at that link, or an existing note has the same company and title. A Greenhouse, Lever or Ashby link is read through the board's API, so the note is as full as a scanned one; a Google or Apple job page is read by the same parsers the scan uses on those sites; any other page is read through its JSON-LD posting data when it has some, and its best title (not a "Job details" label), site name and text when it does not. A LinkedIn job link is opened once as a signed-out visitor, the way a browser would open it, and when the posting names the company's own apply page on one of those boards, that page is imported instead and the LinkedIn link is kept as where it was seen. Nothing searches or crawls: one link in, one request or two out. Indeed blocks signed-out reads; paste the company's own link instead. A note that has no posting (created from an email, say) takes one later through the job sheet's Attach posting: **Attach** reads the posting and replaces the note's facts and score, **Link only** records just the link, for a page that cannot be read or when the note is already right; either way Open posting then goes somewhere real.
|
|
80
|
+
|
|
81
|
+
## What the mailbox says
|
|
82
|
+
|
|
83
|
+
Applications come back as email: a confirmation, a rejection, an interview request. "Check mail" on Today reads those through the same local CLI that writes the letters, using the Gmail connector already attached to it, and with the run boxed: only the Gmail read tools are allowed and every write tool is denied by name, so a run can read and nothing else. The model only extracts (company, role, kind, date, one-line gist, message id); matching each email to a note and everything that changes a note is ordinary code, and nothing changes until you confirm an item. A confirmation on a note you had not marked applied marks it applied as of the mail's date; a rejection marks it rejected; an interview request marks it interviewing; an email about a job with no note offers to create one. Every confirmed item writes a dated line with the gist and a link to the message into the note, and fills the packet's Applied on when it is empty, which is what makes the response numbers on Overview real. Also `tekjobs mail [--days N]`, and `mail_check` / `mail_items` over MCP (read and start only; confirming is yours). The daily task runs the read right after the morning scan (`run.cmd`), and the envelope in the top bar shows how many email groups wait on you from any page, with a Check now for between-times.
|
|
84
|
+
|
|
85
|
+
## People
|
|
86
|
+
|
|
87
|
+
The recruiters, hiring managers, interviewers and referrals a search meets: one note each under `People/` (role, company, email, links, a line of context, the job notes they are on, a dated log of contacts), and a `## People` section on each job note naming who is on that thread. Most arrive from the mail check: when the email a person confirms was written by a human rather than a no-reply address, that human is added, put on the note, and gets the email on their log. The rest are added on the People page or from a job sheet's People tab. Nothing is enriched or looked up anywhere; the record is who actually wrote to you and who you actually met. Over MCP: `list_people`, `get_person`, `add_person`, `attach_person`, `log_contact`.
|
|
88
|
+
|
|
89
|
+
## The copy panel
|
|
90
|
+
|
|
91
|
+
Application forms ask for the same dozen things. The clipboard icon in the top bar opens a panel of one-click snippets: name, email, phone, location, links, availability, the salary answer, and anything you add (a work-authorization line, a standard "why this role" opener, a multi-line blurb). Type a few letters and Enter copies the first match. The list is yours: Customize edits labels, groups, values and order, and it is stored in `Profile/Snippets.md` as a json block, so Obsidian can edit it too. Until you save once, the panel offers a set read from your profile's Basics. Over MCP, `list_snippets` gives an agent the same answers verbatim.
|
|
92
|
+
|
|
93
|
+
## Applying
|
|
94
|
+
|
|
95
|
+
TekJobs never submits an application. The agent tailors the resume and cover letter from the note, prefills what it can, and stops. You review and click. Every field it drafts is written into the job note so the record survives.
|
|
96
|
+
|
|
97
|
+
## How scoring works
|
|
98
|
+
|
|
99
|
+
Everything is in the criteria JSON block in `Targets/Search Criteria.md`, which the interview writes and you can edit: title terms (weighted), hard exclusions, description keywords, seniority, remote rule, a pay floor with a stretch band beneath it, recency, and which aggregator feeds are on. A posting needs `minScore` to become a note. Notes are never rewritten once they exist; only their `listing:` line flips to closed when a posting disappears. Your `status:` edits are the record.
|
|
100
|
+
|
|
101
|
+
The app's **Criteria** page edits the same JSON as fields (bar, penalties, title and description terms, seniority words, location and pay rules, recency, source toggles) with the raw JSON one tab over; keys the form does not know about are kept. **Presets** are named criteria sets under `Targets/Criteria/`: save the current form as one, load one to edit it, make one the active set, or run a single scan with it without touching the daily scan (`tekjobs scan --criteria "<name>"`, the Score with picker on Runs, or `run_scan` with `criteria` over MCP). Every run logs which set it scored with, and every note carries that set's weights fingerprint. After a criteria change, `tekjobs rescore --full --dry` shows what the existing notes would score under the new rules (rebuilt from each note, recency judged at the day it was found, description points kept where the note holds only part of the posting) and `--full` without `--dry` applies it: score, pay band, the match reasons, and a status-log line on every note that moved.
|
|
102
|
+
|
|
103
|
+
The **Profile** page edits the notes applications are written from: `Profile/Profile.md` (who you are), `Positioning.md` (how the story is told), `Voice.md` (how you write), each with an Edit and a Preview; the resume note is shown read-only because `tekjobs resume sync` replaces it. Above it, **resume variants**: every PDF, DOCX, Markdown or text file in the variants folder (`Templates/Resume` inside the profile folder unless Settings says otherwise), each one a click from being the resume of record, and offered by name in the packet's Resume variant field.
|
|
104
|
+
|
|
105
|
+
**Settings** (System) holds the few things kept outside the profile folder, in `~/.tekjobs/config.json`: the profile folder itself (a change takes effect on the next server start; `tekjobs init <dir>` starts a new one), the resume variants folder, the writing CLI's command and arguments, and the optional contact for scan requests.
|
|
106
|
+
|
|
107
|
+
## Commands
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
node cli.mjs init [dir] [--resume <file>] create (or adopt) a profile folder and remember it
|
|
111
|
+
node cli.mjs resume <file> import or replace the resume (PDF, DOCX, Markdown, text)
|
|
112
|
+
node cli.mjs status what the onboarding still needs
|
|
113
|
+
node cli.mjs scan [--dry] [--min N] [--floor N] [--only <slug>] [--criteria <preset name | file>]
|
|
114
|
+
node cli.mjs add <url> [<url>...] [--dry] add postings you found yourself
|
|
115
|
+
node cli.mjs serve the app + API
|
|
116
|
+
node cli.mjs mcp the MCP server on stdio
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The profile folder is resolved from `TEKJOBS_PROFILE`, then `~/.tekjobs/config.json`, then `~/.tekjobs/profile`.
|
|
120
|
+
|
|
121
|
+
## Layout
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
cli.mjs tekjobs command
|
|
125
|
+
run.mjs the scan
|
|
126
|
+
scraper/config.mjs profile folder resolution, the two config notes
|
|
127
|
+
scraper/profile.mjs init, resume import, onboarding status, interview materials, save profile, fetch link
|
|
128
|
+
scraper/resume.mjs PDF / DOCX / Markdown text extraction
|
|
129
|
+
scraper/sources.mjs Greenhouse, Lever, Ashby, Workday, RemoteOK, HN
|
|
130
|
+
scraper/sources-extra.mjs the other platforms, career APIs, aggregators
|
|
131
|
+
scraper/score.mjs scoring and pay-range parsing
|
|
132
|
+
scraper/vault.mjs job notes, dedupe state, closed detection, log, dashboard
|
|
133
|
+
scraper/starter/ the notes a new profile folder starts with (including the board registry)
|
|
134
|
+
app/ Zengin UI front end, API server, MCP server
|
|
135
|
+
site/ tekjobs.timurtek.com: the landing page and docs (Next.js on Zengin UI, deployed from this folder on Vercel)
|
|
136
|
+
tools/ board and source discovery scripts
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Releases
|
|
140
|
+
|
|
141
|
+
The package on npm is [`@timurtekb/tekjobs`](https://www.npmjs.com/package/@timurtekb/tekjobs) (the bare name was too close to an existing package for npm's liking); every release that changes the scan, the CLI or the app is published there by the release workflow, and `npx @timurtekb/tekjobs` runs the latest. Versions come from the commit messages, by [semantic-release](https://semantic-release.gitbook.io/) on every push to `main` (`.github/workflows/release.yml`): tests, the app's type check and `zengin check` run first; then `feat:` commits make a minor release and `fix:` and `perf:` a patch. The project is at 0.x on purpose, so a `BREAKING CHANGE:` footer or a `!` after the type also bumps the minor (the `releaseRules` line in `.releaserc.json`); delete that line when 1.0 is earned and breaking changes become majors. The release bumps `package.json`, writes `CHANGELOG.md`, tags `vX.Y.Z` and publishes the notes on GitHub. Nothing is published to npm. Commit messages are checked locally by commitlint through a husky hook (`npm install` at the root sets it up), in the [Conventional Commits](https://www.conventionalcommits.org/) shape: `type(scope): summary`, scope optional, and a prose body is welcome. The app's sidebar footer shows the running version.
|
|
142
|
+
|
|
143
|
+
## Contributing
|
|
144
|
+
|
|
145
|
+
The two things that compound are data files: the board registry (`scraper/starter/companies-table.md`, platform + slug per company) and, soon, criteria presets per role. Pull requests to either are the most useful contribution. [CONTRIBUTING.md](CONTRIBUTING.md) has the mechanics (three installs, the design-system check, the commit format); [SECURITY.md](SECURITY.md) says where to report a vulnerability, and what counts as one.
|
package/app/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# tekjobs-app
|
|
2
|
+
|
|
3
|
+
Created with `zengin create` from the **saas** template. The components in `src/components/ui` are yours: edit them, the engine keeps everything else on the system they define.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install
|
|
7
|
+
npm run dev # http://localhost:5173
|
|
8
|
+
npm run storybook # http://localhost:6006
|
|
9
|
+
npm run check # zengin check: every file in src against zengin/
|
|
10
|
+
npm run add -- select switch # more components from the registry
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Where things are
|
|
14
|
+
|
|
15
|
+
| Path | What |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `src/components/ui/` | Avatar, Badge, BarChart, Button, Card, Icon, Dialog, LineChart, Menu, Popover, Progress, Select, Separator, Sheet, Sparkline, Switch, Table, TextArea, TextField, Toast, Tooltip. Each file carries a `zengin-owned` pragma with the version it was copied from, so a rollup can tell how far it has drifted. |
|
|
18
|
+
| `zengin/` | `tokens.json`, `tokens.dark.json`, `components.json`: the definitions the engine enforces against. |
|
|
19
|
+
| `src/theme/brand.css` | Your brand as token overrides. The one place literals are allowed. |
|
|
20
|
+
| `src/styles/` | The base stylesheet and the component imports. `generated/tokens.css` is built by `zengin tokens`. |
|
|
21
|
+
| `zengin.config.yaml` | The policy. Every rule at error. |
|
|
22
|
+
| `.mcp.json`, `.claude/settings.json` | The MCP server and the edit hook, so agents working here are checked as they write. |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root,[data-theme=light]{--color-surface:#fff;--color-surface-raised:#f8fafc;--color-surface-sunken:#f1f5f9;--color-surface-overlay:#0f172acc;--color-text:#0f172a;--color-text-muted:#475569;--color-text-subtle:#94a3b8;--color-text-faint:#94a3b8;--color-border:#e2e8f0;--color-border-strong:#cbd5e1;--color-primary:#2563eb;--color-primary-hover:#1d4ed8;--color-primary-active:#1e40af;--color-primary-soft:#dbeafe;--color-primary-soft-hover:#bfdbfe;--color-primary-soft-foreground:#1e40af;--color-on-primary:#fff;--color-danger:#dc2626;--color-danger-hover:#b91c1c;--color-danger-active:#991b1b;--color-danger-soft:#fee2e2;--color-danger-soft-hover:#fecaca;--color-danger-soft-foreground:#991b1b;--color-on-danger:#fff;--color-success:#15803d;--color-success-soft:#dcfce7;--color-success-soft-foreground:#166534;--color-on-success:#fff;--color-warning:#b45309;--color-warning-soft:#fef3c7;--color-warning-soft-foreground:#92400e;--color-on-warning:#fff;--color-neutral:#334155;--color-neutral-hover:#1e293b;--color-neutral-active:#0f172a;--color-neutral-soft:#e2e8f0;--color-neutral-soft-hover:#cbd5e1;--color-neutral-soft-foreground:#0f172a;--color-on-neutral:#fff;--color-focus:#3b82f6;--color-outline:#0000;--spacing-0:0px;--spacing-1:4px;--spacing-2:8px;--spacing-3:12px;--spacing-4:16px;--spacing-5:20px;--spacing-6:24px;--spacing-8:32px;--spacing-10:40px;--spacing-12:48px;--spacing-16:64px;--spacing-20:80px;--spacing-24:96px;--spacing-32:128px;--radius-none:0px;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--radius-xl:16px;--radius-full:9999px;--border-width:1px;--shadow-sm:0 1px 2px 0 #0f172a0f;--shadow-md:0 4px 8px -2px #0f172a1a, 0 2px 4px -2px #0f172a0f;--shadow-lg:0 12px 24px -6px #0f172a29, 0 4px 8px -4px #0f172a14;--text-xs:.75rem;--text-sm:.875rem;--text-base:1rem;--text-lg:1.125rem;--text-xl:1.25rem;--text-2xl:1.5rem;--text-3xl:1.875rem;--text-4xl:2.25rem;--text-5xl:3rem;--text-6xl:3.75rem;--font-sans:Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--font-display:Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-weight-regular:400;--font-weight-medium:500;--font-weight-semibold:600;--leading-tight:1.25;--leading-normal:1.5;--leading-none:1.05;--tracking-tighter:-.03em;--tracking-tight:-.02em;--tracking-snug:-.01em;--tracking-normal:0;--tracking-wide:.04em;--tracking-wider:.06em;--tracking-widest:.08em;--tracking-caps:.14em;--duration-fast:.12s;--duration-normal:.2s;--duration-slow:.32s;--ease-standard:cubic-bezier(.2, 0, 0, 1);--ease-emphasized:cubic-bezier(.3, 0, 0, 1);--ease-exit:cubic-bezier(.4, 0, 1, 1);--breakpoint-sm:40rem;--breakpoint-md:52rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem}[data-theme=dark]{--color-surface:#0f172a;--color-surface-raised:#1e293b;--color-surface-sunken:#020617;--color-surface-overlay:#020617cc;--color-text:#f1f5f9;--color-text-muted:#94a3b8;--color-text-subtle:#64748b;--color-text-faint:#64748b;--color-border:#1e293b;--color-border-strong:#334155;--color-primary:#3b82f6;--color-primary-hover:#60a5fa;--color-primary-active:#93c5fd;--color-primary-soft:#1e3a8a;--color-primary-soft-hover:#1e40af;--color-primary-soft-foreground:#93c5fd;--color-on-primary:#0f172a;--color-danger:#ef4444;--color-danger-hover:#f87171;--color-danger-active:#fca5a5;--color-danger-soft:#7f1d1d;--color-danger-soft-hover:#991b1b;--color-danger-soft-foreground:#fca5a5;--color-on-danger:#0f172a;--color-success:#22c55e;--color-success-soft:#14532d;--color-success-soft-foreground:#86efac;--color-on-success:#0f172a;--color-warning:#f59e0b;--color-warning-soft:#78350f;--color-warning-soft-foreground:#fcd34d;--color-on-warning:#0f172a;--color-neutral:#cbd5e1;--color-neutral-hover:#e2e8f0;--color-neutral-active:#f1f5f9;--color-neutral-soft:#334155;--color-neutral-soft-hover:#475569;--color-neutral-soft-foreground:#f1f5f9;--color-on-neutral:#0f172a;--color-focus:#60a5fa}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--color-surface:#0f172a;--color-surface-raised:#1e293b;--color-surface-sunken:#020617;--color-surface-overlay:#020617cc;--color-text:#f1f5f9;--color-text-muted:#94a3b8;--color-text-subtle:#64748b;--color-text-faint:#64748b;--color-border:#1e293b;--color-border-strong:#334155;--color-primary:#3b82f6;--color-primary-hover:#60a5fa;--color-primary-active:#93c5fd;--color-primary-soft:#1e3a8a;--color-primary-soft-hover:#1e40af;--color-primary-soft-foreground:#93c5fd;--color-on-primary:#0f172a;--color-danger:#ef4444;--color-danger-hover:#f87171;--color-danger-active:#fca5a5;--color-danger-soft:#7f1d1d;--color-danger-soft-hover:#991b1b;--color-danger-soft-foreground:#fca5a5;--color-on-danger:#0f172a;--color-success:#22c55e;--color-success-soft:#14532d;--color-success-soft-foreground:#86efac;--color-on-success:#0f172a;--color-warning:#f59e0b;--color-warning-soft:#78350f;--color-warning-soft-foreground:#fcd34d;--color-on-warning:#0f172a;--color-neutral:#cbd5e1;--color-neutral-hover:#e2e8f0;--color-neutral-active:#f1f5f9;--color-neutral-soft:#334155;--color-neutral-soft-hover:#475569;--color-neutral-soft-foreground:#f1f5f9;--color-on-neutral:#0f172a;--color-focus:#60a5fa}}.z-button,.z-badge,.z-card,.z-field,.z-checkbox,.z-dialog,.z-tooltip,.z-tabs,.z-select,.z-switch,.z-toast,.z-menu,.z-table,.z-avatar,.z-skeleton,.z-sheet,.z-popover,.z-progress,.z-separator,.z-textarea,.z-chart,.z-sparkline,.z-markdown,.z-codeblock,.z-conversation,.z-message,.z-prompt,.z-reasoning,.z-toolcall,.z-sources,.z-suggestions,.z-loader{box-sizing:border-box;font-family:var(--font-sans);line-height:var(--leading-normal);-webkit-font-smoothing:antialiased}.z-button *,.z-card *,.z-field *,.z-checkbox *,.z-dialog *,.z-tabs *,.z-select *,.z-switch *,.z-toast *,.z-menu *,.z-table *,.z-avatar *,.z-skeleton *,.z-sheet *,.z-popover *,.z-progress *,.z-separator *,.z-textarea *,.z-chart *,.z-markdown *,.z-codeblock *,.z-conversation *,.z-message *,.z-prompt *,.z-reasoning *,.z-toolcall *,.z-sources *,.z-suggestions *,.z-loader *{box-sizing:border-box}.z-focusable:focus-visible{outline:2px solid var(--color-focus);outline-offset:2px}.z-focusable:focus:not(:focus-visible){outline:none}.z-icon{flex:none;width:1em;height:1em;display:inline-flex}.z-icon>svg{width:100%;height:100%}.z-sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.z-chart{width:100%;color:var(--color-text);font-family:var(--font-sans);position:relative}.z-chart__svg{touch-action:none;width:100%;display:block;overflow:visible}.z-chart__grid{stroke:var(--color-border);stroke-width:1px}.z-chart__tick{fill:var(--color-text-subtle);font-size:var(--text-xs);font-variant-numeric:tabular-nums}.z-chart__line{fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.z-chart__area{fill-opacity:.12}.z-chart__bar{transition:opacity var(--duration-fast) var(--ease-standard)}.z-chart__cursor line{stroke:var(--color-border-strong);stroke-dasharray:3 3}.z-chart__cursor circle{stroke:var(--color-surface);stroke-width:2px}[data-tone=primary]>.z-chart__line,[data-tone=primary]>.z-chart__bar,circle[data-tone=primary]{stroke:var(--color-primary)}[data-tone=success]>.z-chart__line,[data-tone=success]>.z-chart__bar,circle[data-tone=success]{stroke:var(--color-success)}[data-tone=warning]>.z-chart__line,[data-tone=warning]>.z-chart__bar,circle[data-tone=warning]{stroke:var(--color-warning)}[data-tone=danger]>.z-chart__line,[data-tone=danger]>.z-chart__bar,circle[data-tone=danger]{stroke:var(--color-danger)}[data-tone=neutral]>.z-chart__line,[data-tone=neutral]>.z-chart__bar,circle[data-tone=neutral]{stroke:var(--color-neutral)}[data-tone=primary]>.z-chart__area,[data-tone=primary]>.z-chart__bar,circle[data-tone=primary],[data-tone=primary]>.z-chart__swatch{fill:var(--color-primary);background-color:var(--color-primary)}[data-tone=success]>.z-chart__area,[data-tone=success]>.z-chart__bar,circle[data-tone=success],[data-tone=success]>.z-chart__swatch{fill:var(--color-success);background-color:var(--color-success)}[data-tone=warning]>.z-chart__area,[data-tone=warning]>.z-chart__bar,circle[data-tone=warning],[data-tone=warning]>.z-chart__swatch{fill:var(--color-warning);background-color:var(--color-warning)}[data-tone=danger]>.z-chart__area,[data-tone=danger]>.z-chart__bar,circle[data-tone=danger],[data-tone=danger]>.z-chart__swatch{fill:var(--color-danger);background-color:var(--color-danger)}[data-tone=neutral]>.z-chart__area,[data-tone=neutral]>.z-chart__bar,circle[data-tone=neutral],[data-tone=neutral]>.z-chart__swatch{fill:var(--color-neutral);background-color:var(--color-neutral)}.z-chart__bar{stroke:none}.z-chart__readout{top:var(--spacing-2);z-index:1;gap:var(--spacing-1);padding:var(--spacing-2) var(--spacing-3);background-color:var(--color-surface);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);font-size:var(--text-xs);line-height:var(--leading-tight);white-space:nowrap;pointer-events:none;display:grid;position:absolute}.z-chart__readout[data-side=right]{transform:translateX(var(--spacing-3))}.z-chart__readout[data-side=left]{transform:translateX(calc(-100% - var(--spacing-3)))}.z-chart__readout-label{color:var(--color-text-muted)}.z-chart__readout-row{align-items:center;gap:var(--spacing-2);display:flex}.z-chart__readout-row strong{font-variant-numeric:tabular-nums;margin-left:auto}.z-chart__swatch{width:var(--spacing-2);height:var(--spacing-2);border-radius:var(--radius-full);display:inline-block}.z-chart__legend{gap:var(--spacing-1) var(--spacing-4);margin:var(--spacing-2) 0 0;font-size:var(--text-xs);color:var(--color-text-muted);flex-wrap:wrap;padding:0;list-style:none;display:flex}.z-chart__legend li{align-items:center;gap:var(--spacing-2);display:inline-flex}@media (prefers-reduced-motion:reduce){.z-chart__bar{transition-duration:0s}}.z-enter-fade{animation:z-enter-fade var(--duration-normal) var(--ease-standard) both}.z-enter-rise{animation:z-enter-rise var(--duration-slow) var(--ease-emphasized) both}.z-enter-scale{animation:z-enter-scale var(--duration-normal) var(--ease-emphasized) both}.z-stagger>*{animation:z-enter-rise var(--duration-slow) var(--ease-emphasized) both}.z-stagger>:first-child{animation-delay:0s}.z-stagger>:nth-child(2){animation-delay:calc(var(--duration-fast) * .5)}.z-stagger>:nth-child(3){animation-delay:calc(var(--duration-fast) * 1)}.z-stagger>:nth-child(4){animation-delay:calc(var(--duration-fast) * 1.5)}.z-stagger>:nth-child(5){animation-delay:calc(var(--duration-fast) * 2)}.z-stagger>:nth-child(6){animation-delay:calc(var(--duration-fast) * 2.5)}.z-stagger>:nth-child(7){animation-delay:calc(var(--duration-fast) * 3)}.z-stagger>:nth-child(8){animation-delay:calc(var(--duration-fast) * 3.5)}.z-stagger>:nth-child(9){animation-delay:calc(var(--duration-fast) * 4)}.z-stagger>:nth-child(10){animation-delay:calc(var(--duration-fast) * 4.5)}.z-stagger>:nth-child(11){animation-delay:calc(var(--duration-fast) * 5)}.z-stagger>:nth-child(12){animation-delay:calc(var(--duration-fast) * 5.5)}@keyframes z-enter-fade{0%{opacity:0}to{opacity:1}}@keyframes z-enter-rise{0%{opacity:0;transform:translateY(var(--spacing-2))}to{opacity:1;transform:translateY(0)}}@keyframes z-enter-scale{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.z-enter-rise,.z-enter-scale,.z-stagger>*{animation-name:z-enter-fade;animation-duration:var(--duration-fast);animation-delay:0s}}.z-avatar{background-color:var(--color-neutral-soft);color:var(--color-neutral-soft-foreground);font-weight:var(--font-weight-medium);-webkit-user-select:none;user-select:none;vertical-align:middle;flex:none;justify-content:center;align-items:center;line-height:1;display:inline-flex;position:relative;overflow:hidden}.z-avatar[data-shape=circle]{border-radius:var(--radius-full)}.z-avatar[data-shape=square]{border-radius:var(--radius-md)}.z-avatar[data-size=sm]{width:1.5rem;height:1.5rem;font-size:var(--text-xs)}.z-avatar[data-size=md]{width:2rem;height:2rem;font-size:var(--text-xs)}.z-avatar[data-size=lg]{width:2.5rem;height:2.5rem;font-size:var(--text-sm)}.z-avatar[data-size=xl]{width:4rem;height:4rem;font-size:var(--text-xl)}.z-avatar__image{object-fit:cover;width:100%;height:100%}.z-avatar__fallback{justify-content:center;align-items:center;width:100%;height:100%;display:inline-flex}.z-badge{align-items:center;gap:var(--spacing-1);border:var(--border-width) solid var(--color-outline);border-radius:var(--radius-full);font-weight:var(--font-weight-medium);line-height:var(--leading-tight);white-space:nowrap;display:inline-flex}.z-badge[data-size=sm]{padding:var(--spacing-0) var(--spacing-2);font-size:var(--text-xs)}.z-badge[data-size=md]{padding:var(--spacing-1) var(--spacing-3);font-size:var(--text-sm)}.z-badge[data-variant=soft][data-tone=neutral]{background-color:var(--color-neutral-soft);color:var(--color-neutral-soft-foreground)}.z-badge[data-variant=soft][data-tone=primary]{background-color:var(--color-primary-soft);color:var(--color-primary-soft-foreground)}.z-badge[data-variant=soft][data-tone=danger]{background-color:var(--color-danger-soft);color:var(--color-danger-soft-foreground)}.z-badge[data-variant=soft][data-tone=success]{background-color:var(--color-success-soft);color:var(--color-success-soft-foreground)}.z-badge[data-variant=soft][data-tone=warning]{background-color:var(--color-warning-soft);color:var(--color-warning-soft-foreground)}.z-badge[data-variant=solid][data-tone=neutral]{background-color:var(--color-neutral);color:var(--color-on-neutral)}.z-badge[data-variant=solid][data-tone=primary]{background-color:var(--color-primary);color:var(--color-on-primary)}.z-badge[data-variant=solid][data-tone=danger]{background-color:var(--color-danger);color:var(--color-on-danger)}.z-badge[data-variant=solid][data-tone=success]{background-color:var(--color-success);color:var(--color-on-success)}.z-badge[data-variant=solid][data-tone=warning]{background-color:var(--color-warning);color:var(--color-on-warning)}.z-badge[data-variant=outline]{background-color:#0000}.z-badge[data-variant=outline][data-tone=neutral]{border-color:var(--color-border-strong);color:var(--color-text-muted)}.z-badge[data-variant=outline][data-tone=primary]{border-color:var(--color-primary);color:var(--color-primary)}.z-badge[data-variant=outline][data-tone=danger]{border-color:var(--color-danger);color:var(--color-danger)}.z-badge[data-variant=outline][data-tone=success]{border-color:var(--color-success);color:var(--color-success)}.z-badge[data-variant=outline][data-tone=warning]{border-color:var(--color-warning);color:var(--color-warning)}.z-chart[data-kind=bar] .z-chart__group:hover .z-chart__bar,.z-chart[data-kind=bar] .z-chart__group[data-hover] .z-chart__bar{opacity:.8}.z-button{justify-content:center;align-items:center;gap:var(--spacing-2);border:var(--border-width) solid var(--color-outline);border-radius:var(--radius-md);font-weight:var(--font-weight-medium);line-height:var(--leading-tight);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard), transform var(--duration-fast) var(--ease-standard);text-decoration:none;display:inline-flex;position:relative}.z-button[data-align=center]{justify-content:center}.z-button[data-align=start]{justify-content:flex-start}.z-button[data-size=sm]{min-height:2rem;padding:var(--spacing-1) var(--spacing-3);font-size:var(--text-sm)}.z-button[data-size=md]{min-height:2.5rem;padding:var(--spacing-2) var(--spacing-4);font-size:var(--text-sm)}.z-button[data-size=lg]{min-height:3rem;padding:var(--spacing-3) var(--spacing-5);font-size:var(--text-base)}.z-button[data-variant=solid][data-tone=neutral]{background-color:var(--color-neutral);color:var(--color-on-neutral)}.z-button[data-variant=solid][data-tone=neutral]:hover{background-color:var(--color-neutral-hover)}.z-button[data-variant=solid][data-tone=neutral]:active{background-color:var(--color-neutral-active)}.z-button[data-variant=solid][data-tone=primary]{background-color:var(--color-primary);color:var(--color-on-primary)}.z-button[data-variant=solid][data-tone=primary]:hover{background-color:var(--color-primary-hover)}.z-button[data-variant=solid][data-tone=primary]:active{background-color:var(--color-primary-active)}.z-button[data-variant=solid][data-tone=danger]{background-color:var(--color-danger);color:var(--color-on-danger)}.z-button[data-variant=solid][data-tone=danger]:hover{background-color:var(--color-danger-hover)}.z-button[data-variant=solid][data-tone=danger]:active{background-color:var(--color-danger-active)}.z-button[data-variant=soft][data-tone=neutral]{background-color:var(--color-neutral-soft);color:var(--color-neutral-soft-foreground)}.z-button[data-variant=soft][data-tone=neutral]:hover{background-color:var(--color-neutral-soft-hover)}.z-button[data-variant=soft][data-tone=primary]{background-color:var(--color-primary-soft);color:var(--color-primary-soft-foreground)}.z-button[data-variant=soft][data-tone=primary]:hover{background-color:var(--color-primary-soft-hover)}.z-button[data-variant=soft][data-tone=danger]{background-color:var(--color-danger-soft);color:var(--color-danger-soft-foreground)}.z-button[data-variant=soft][data-tone=danger]:hover{background-color:var(--color-danger-soft-hover)}.z-button[data-variant=ghost]{background-color:#0000}.z-button[data-variant=ghost][data-tone=neutral]{color:var(--color-text)}.z-button[data-variant=ghost][data-tone=neutral]:hover{background-color:var(--color-neutral-soft)}.z-button[data-variant=ghost][data-tone=primary]{color:var(--color-primary)}.z-button[data-variant=ghost][data-tone=primary]:hover{background-color:var(--color-primary-soft)}.z-button[data-variant=ghost][data-tone=danger]{color:var(--color-danger)}.z-button[data-variant=ghost][data-tone=danger]:hover{background-color:var(--color-danger-soft)}.z-button[data-variant=link]{border-radius:var(--radius-sm);background-color:#0000;min-height:0;padding:0}.z-button[data-variant=link][data-tone=neutral]{color:var(--color-text)}.z-button[data-variant=link][data-tone=primary]{color:var(--color-primary)}.z-button[data-variant=link][data-tone=danger]{color:var(--color-danger)}.z-button[data-variant=link]:hover{text-underline-offset:.2em;text-decoration:underline}.z-button:not([data-variant=link]):active:not([data-disabled]){transform:translateY(1px)}.z-button[data-disabled]{cursor:not-allowed;opacity:.55;transform:none}.z-button[data-loading] .z-button__label{visibility:hidden}.z-button__spinner{justify-content:center;align-items:center;display:inline-flex;position:absolute;inset:0}.z-button__spinner>svg{width:1.125em;height:1.125em;animation:z-spin var(--duration-slow) linear infinite;animation-duration:.8s}@keyframes z-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.z-button{transition-duration:0s}.z-button:active{transform:none}.z-button__spinner>svg{animation-duration:1.6s}}.z-card{background-color:var(--color-surface);border:var(--border-width) solid var(--color-outline);border-radius:var(--radius-lg);color:var(--color-text);transition:border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard), transform var(--duration-normal) var(--ease-standard);flex-direction:column;display:flex}.z-card[data-variant=outlined]{border-color:var(--color-border)}.z-card[data-variant=elevated]{box-shadow:var(--shadow-md)}.z-card[data-variant=sunken]{background-color:var(--color-surface-sunken)}.z-card[data-padding=none]{padding:var(--spacing-0)}.z-card[data-padding=sm]{padding:var(--spacing-3)}.z-card[data-padding=md]{padding:var(--spacing-4)}.z-card[data-padding=lg]{padding:var(--spacing-6)}.z-card:has(>.z-card__header,>.z-card__body,>.z-card__footer){padding:0}.z-card[data-padding=sm]>.z-card__header,.z-card[data-padding=sm]>.z-card__body,.z-card[data-padding=sm]>.z-card__footer{padding:var(--spacing-3)}.z-card[data-padding=md]>.z-card__header,.z-card[data-padding=md]>.z-card__body,.z-card[data-padding=md]>.z-card__footer{padding:var(--spacing-4)}.z-card[data-padding=lg]>.z-card__header,.z-card[data-padding=lg]>.z-card__body,.z-card[data-padding=lg]>.z-card__footer{padding:var(--spacing-6)}.z-card__header{align-items:center;gap:var(--spacing-3);border-bottom:var(--border-width) solid var(--color-border);font-weight:var(--font-weight-semibold);display:flex}.z-card__body{flex:1}.z-card__footer{justify-content:flex-end;align-items:center;gap:var(--spacing-2);border-top:var(--border-width) solid var(--color-border);background-color:var(--color-surface-raised);border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;display:flex}.z-card[data-interactive]{cursor:pointer}.z-card[data-interactive]:hover{border-color:var(--color-border-strong);box-shadow:var(--shadow-md);transform:translateY(-1px)}.z-card[data-interactive][data-variant=elevated]:hover{box-shadow:var(--shadow-lg)}@media (prefers-reduced-motion:reduce){.z-card{transition-duration:0s}.z-card[data-interactive]:hover{transform:none}}.z-dialog__overlay{z-index:50;background-color:var(--color-surface-overlay);animation:z-dialog-fade-in var(--duration-slow) var(--ease-standard);position:fixed;inset:0}.z-dialog__overlay[data-state=closed]{animation:z-dialog-fade-out var(--duration-normal) var(--ease-exit)}.z-dialog{z-index:51;gap:var(--spacing-3);width:calc(100vw - var(--spacing-8));max-height:calc(100vh - var(--spacing-8));background-color:var(--color-surface);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);color:var(--color-text);animation:z-dialog-enter var(--duration-slow) var(--ease-emphasized);flex-direction:column;display:flex;position:fixed;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%)}.z-dialog[data-state=closed]{animation:z-dialog-exit var(--duration-normal) var(--ease-exit)}.z-dialog:focus{outline:none}.z-dialog[data-size=sm]{max-width:24rem;padding:var(--spacing-5)}.z-dialog[data-size=md]{max-width:32rem;padding:var(--spacing-6)}.z-dialog[data-size=lg]{max-width:48rem;padding:var(--spacing-8)}.z-dialog__title{padding-right:var(--spacing-8);font-size:var(--text-lg);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);margin:0}.z-dialog__description{color:var(--color-text-muted);font-size:var(--text-sm);line-height:var(--leading-normal);margin:0}.z-dialog__footer{justify-content:flex-end;gap:var(--spacing-2);margin-top:var(--spacing-2);flex-wrap:wrap;display:flex}.z-dialog__close{top:var(--spacing-3);right:var(--spacing-3);border-radius:var(--radius-md);width:2rem;height:2rem;color:var(--color-text-muted);cursor:pointer;transition:background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);background-color:#0000;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.z-dialog__close>svg{width:1rem;height:1rem}.z-dialog__close:hover{background-color:var(--color-neutral-soft);color:var(--color-text)}@keyframes z-dialog-fade-in{0%{opacity:0}to{opacity:1}}@keyframes z-dialog-fade-out{0%{opacity:1}to{opacity:0}}@keyframes z-dialog-enter{0%{opacity:0;transform:translate(-50%,-46%)scale(.96)}to{opacity:1;transform:translate(-50%,-50%)scale(1)}}@keyframes z-dialog-exit{0%{opacity:1;transform:translate(-50%,-50%)scale(1)}to{opacity:0;transform:translate(-50%,-48%)scale(.98)}}@media (prefers-reduced-motion:reduce){.z-dialog{animation:z-dialog-fade-in var(--duration-normal) var(--ease-standard)}.z-dialog[data-state=closed]{animation:z-dialog-fade-out var(--duration-fast) var(--ease-exit)}.z-dialog__close{transition-duration:0s}}.z-chart[data-kind=line] .z-chart__svg{cursor:crosshair}.z-menu{z-index:60;min-width:11rem;max-height:var(--radix-dropdown-menu-content-available-height);padding:var(--spacing-1);background-color:var(--color-surface);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--color-text);font-size:var(--text-sm);transform-origin:var(--radix-dropdown-menu-content-transform-origin);animation:z-menu-enter var(--duration-fast) var(--ease-standard);overflow:auto}.z-menu[data-state=closed]{animation:z-menu-exit var(--duration-fast) var(--ease-exit)}.z-menu__item{align-items:center;gap:var(--spacing-2);padding:var(--spacing-2) var(--spacing-3);border-radius:var(--radius-sm);line-height:var(--leading-tight);cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;display:flex;position:relative}.z-menu__item--check{padding-left:var(--spacing-8)}.z-menu__item[data-highlighted]{background-color:var(--color-neutral-soft)}.z-menu__item[data-tone=danger]{color:var(--color-danger)}.z-menu__item[data-tone=danger][data-highlighted]{background-color:var(--color-danger-soft);color:var(--color-danger-soft-foreground)}.z-menu__item[data-disabled]{color:var(--color-text-subtle);cursor:not-allowed}.z-menu__icon{color:var(--color-text-muted)}.z-menu__item[data-tone=danger] .z-menu__icon{color:inherit}.z-menu__text{flex:1;min-width:0}.z-menu__shortcut{margin-left:var(--spacing-4);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--color-text-subtle)}.z-menu__indicator{left:var(--spacing-3);width:1rem;height:1rem;color:var(--color-primary);display:inline-flex;position:absolute}.z-menu__indicator>svg{width:100%;height:100%}.z-menu__label{padding:var(--spacing-2) var(--spacing-3) var(--spacing-1);font-size:var(--text-xs);font-weight:var(--font-weight-medium);color:var(--color-text-muted)}.z-menu__separator{height:1px;margin:var(--spacing-1) 0;background-color:var(--color-border)}@keyframes z-menu-enter{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}@keyframes z-menu-exit{0%{opacity:1}to{opacity:0}}@media (prefers-reduced-motion:reduce){.z-menu,.z-menu[data-state=closed]{animation:none}}.z-popover{z-index:60;background-color:var(--color-surface);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);color:var(--color-text);font-size:var(--text-sm);line-height:var(--leading-normal);transform-origin:var(--radix-popover-content-transform-origin);animation:z-popover-enter var(--duration-normal) var(--ease-emphasized)}.z-popover[data-state=closed]{animation:z-popover-exit var(--duration-fast) var(--ease-exit)}.z-popover:focus{outline:none}.z-popover[data-size=sm]{width:16rem;padding:var(--spacing-3)}.z-popover[data-size=md]{width:20rem;padding:var(--spacing-4)}.z-popover[data-size=lg]{width:28rem;padding:var(--spacing-5)}.z-popover__arrow{fill:var(--color-surface);stroke:var(--color-border);stroke-width:1px}@keyframes z-popover-enter{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes z-popover-exit{0%{opacity:1}to{opacity:0}}@media (prefers-reduced-motion:reduce){.z-popover,.z-popover[data-state=closed]{animation:none}}.z-progress{gap:var(--spacing-1);width:100%;color:var(--color-text);display:grid}.z-progress__head{justify-content:space-between;gap:var(--spacing-3);font-size:var(--text-sm);line-height:var(--leading-tight);display:flex}.z-progress__label{font-weight:var(--font-weight-medium)}.z-progress__value{color:var(--color-text-muted);font-variant-numeric:tabular-nums}.z-progress__track{background-color:var(--color-neutral-soft);border-radius:var(--radius-full);width:100%;position:relative;overflow:hidden}.z-progress[data-size=sm] .z-progress__track{height:var(--spacing-1)}.z-progress[data-size=md] .z-progress__track{height:var(--spacing-2)}.z-progress__indicator{border-radius:inherit;width:100%;height:100%;transition:transform var(--duration-slow) var(--ease-standard)}.z-progress[data-tone=primary] .z-progress__indicator{background-color:var(--color-primary)}.z-progress[data-tone=neutral] .z-progress__indicator{background-color:var(--color-neutral)}.z-progress[data-tone=success] .z-progress__indicator{background-color:var(--color-success)}.z-progress[data-tone=warning] .z-progress__indicator{background-color:var(--color-warning)}.z-progress[data-tone=danger] .z-progress__indicator{background-color:var(--color-danger)}.z-progress__track[data-state=indeterminate] .z-progress__indicator{width:40%;animation:z-progress-sweep 1.4s var(--ease-standard) infinite}@keyframes z-progress-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media (prefers-reduced-motion:reduce){.z-progress__indicator{transition-duration:0s}.z-progress__track[data-state=indeterminate] .z-progress__indicator{width:100%;animation:z-progress-pulse 1.4s var(--ease-standard) infinite alternate}}@keyframes z-progress-pulse{0%{opacity:.4}to{opacity:1}}.z-select{gap:var(--spacing-1);color:var(--color-text);flex-direction:column;display:flex}.z-select__label{font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-tight)}.z-select__required{color:var(--color-danger)}.z-select__trigger{justify-content:space-between;align-items:center;gap:var(--spacing-2);background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-md);width:100%;min-width:0;color:var(--color-text);font-family:inherit;line-height:var(--leading-normal);text-align:left;cursor:pointer;transition:border-color var(--duration-fast) var(--ease-standard), background-color var(--duration-fast) var(--ease-standard);display:inline-flex}.z-select__trigger[data-placeholder]{color:var(--color-text-subtle)}.z-select__value{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.z-select__chevron{width:1rem;height:1rem;color:var(--color-text-muted);flex:none;display:inline-flex}.z-select__chevron>svg{width:100%;height:100%}.z-select[data-size=sm] .z-select__trigger{min-height:2rem;padding:var(--spacing-1) var(--spacing-2);font-size:var(--text-sm)}.z-select[data-size=md] .z-select__trigger{min-height:2.5rem;padding:var(--spacing-2) var(--spacing-3);font-size:var(--text-sm)}.z-select[data-size=lg] .z-select__trigger{min-height:3rem;padding:var(--spacing-3) var(--spacing-4);font-size:var(--text-base)}.z-select__trigger:hover:not(:disabled){border-color:var(--color-text-muted)}.z-select__trigger:focus-visible{border-color:var(--color-focus);outline-offset:0}.z-select[data-invalid] .z-select__trigger{border-color:var(--color-danger)}.z-select[data-disabled]{color:var(--color-text-subtle)}.z-select__trigger:disabled{background-color:var(--color-surface-sunken);color:var(--color-text-subtle);cursor:not-allowed}.z-select__description,.z-select__error{font-size:var(--text-xs);line-height:var(--leading-normal);margin:0}.z-select__description{color:var(--color-text-muted)}.z-select__error{color:var(--color-danger)}.z-select__content{z-index:60;min-width:var(--radix-select-trigger-width);max-height:var(--radix-select-content-available-height);background-color:var(--color-surface);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--color-text);font-size:var(--text-sm);transform-origin:var(--radix-select-content-transform-origin);animation:z-select-enter var(--duration-fast) var(--ease-standard);overflow:hidden}.z-select__content[data-state=closed]{animation:z-select-exit var(--duration-fast) var(--ease-exit)}.z-select__viewport{padding:var(--spacing-1)}.z-select__scroll{height:var(--spacing-6);color:var(--color-text-muted);justify-content:center;align-items:center;display:flex}.z-select__scroll>svg{width:1rem;height:1rem}.z-select__item{align-items:center;gap:var(--spacing-2);padding:var(--spacing-2) var(--spacing-8) var(--spacing-2) var(--spacing-3);border-radius:var(--radius-sm);line-height:var(--leading-tight);cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;display:flex;position:relative}.z-select__item[data-highlighted]{background-color:var(--color-neutral-soft)}.z-select__item[data-state=checked]{font-weight:var(--font-weight-medium)}.z-select__item[data-disabled]{color:var(--color-text-subtle);cursor:not-allowed}.z-select__indicator{right:var(--spacing-3);width:1rem;height:1rem;color:var(--color-primary);display:inline-flex;position:absolute}.z-select__indicator>svg{width:100%;height:100%}.z-select__group-label{padding:var(--spacing-2) var(--spacing-3) var(--spacing-1);font-size:var(--text-xs);font-weight:var(--font-weight-medium);color:var(--color-text-muted)}.z-select__separator{height:1px;margin:var(--spacing-1) 0;background-color:var(--color-border)}@keyframes z-select-enter{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}@keyframes z-select-exit{0%{opacity:1}to{opacity:0}}@media (prefers-reduced-motion:reduce){.z-select__trigger{transition-duration:0s}.z-select__content,.z-select__content[data-state=closed]{animation:none}}.z-separator{background-color:var(--color-border);flex:none}.z-separator[data-orientation=horizontal]{width:100%;height:1px}.z-separator[data-orientation=vertical]{align-self:stretch;width:1px;height:100%;min-height:1em}.z-separator--labelled{align-items:center;gap:var(--spacing-3);background:0 0;height:auto;display:flex}.z-separator__line{background-color:var(--color-border);flex:1;height:1px}.z-separator__label{font-size:var(--text-xs);line-height:var(--leading-tight);color:var(--color-text-muted);white-space:nowrap}.z-sheet__overlay{z-index:50;background-color:var(--color-surface-overlay);animation:z-sheet-fade-in var(--duration-slow) var(--ease-standard);position:fixed;inset:0}.z-sheet__overlay[data-state=closed]{animation:z-sheet-fade-out var(--duration-normal) var(--ease-exit)}.z-sheet{z-index:51;gap:var(--spacing-3);padding:var(--spacing-6);background-color:var(--color-surface);box-shadow:var(--shadow-lg);color:var(--color-text);animation-duration:var(--duration-slow);animation-timing-function:var(--ease-emphasized);flex-direction:column;display:flex;position:fixed;overflow:auto}.z-sheet:focus{outline:none}.z-sheet[data-side=right]{border-left:var(--border-width) solid var(--color-border);animation-name:z-sheet-from-right;top:0;bottom:0;right:0}.z-sheet[data-side=left]{border-right:var(--border-width) solid var(--color-border);animation-name:z-sheet-from-left;top:0;bottom:0;left:0}.z-sheet[data-side=top]{border-bottom:var(--border-width) solid var(--color-border);animation-name:z-sheet-from-top;top:0;left:0;right:0}.z-sheet[data-side=bottom]{border-top:var(--border-width) solid var(--color-border);animation-name:z-sheet-from-bottom;bottom:0;left:0;right:0}.z-sheet[data-state=closed]{animation-duration:var(--duration-normal);animation-timing-function:var(--ease-exit);animation-direction:reverse}.z-sheet[data-side=right][data-size=sm],.z-sheet[data-side=left][data-size=sm]{width:min(100vw,20rem)}.z-sheet[data-side=right][data-size=md],.z-sheet[data-side=left][data-size=md]{width:min(100vw,28rem)}.z-sheet[data-side=right][data-size=lg],.z-sheet[data-side=left][data-size=lg]{width:min(100vw,40rem)}.z-sheet[data-side=top][data-size=sm],.z-sheet[data-side=bottom][data-size=sm]{max-height:40vh}.z-sheet[data-side=top][data-size=md],.z-sheet[data-side=bottom][data-size=md]{max-height:60vh}.z-sheet[data-side=top][data-size=lg],.z-sheet[data-side=bottom][data-size=lg]{max-height:85vh}.z-sheet__title{padding-right:var(--spacing-8);font-size:var(--text-lg);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);margin:0}.z-sheet__description{color:var(--color-text-muted);font-size:var(--text-sm);line-height:var(--leading-normal);margin:0}.z-sheet__footer{justify-content:flex-end;gap:var(--spacing-2);padding-top:var(--spacing-4);flex-wrap:wrap;margin-top:auto;display:flex}.z-sheet__close{top:var(--spacing-3);right:var(--spacing-3);border-radius:var(--radius-md);width:2rem;height:2rem;color:var(--color-text-muted);cursor:pointer;transition:background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);background-color:#0000;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.z-sheet__close>svg{width:1rem;height:1rem}.z-sheet__close:hover{background-color:var(--color-neutral-soft);color:var(--color-text)}@keyframes z-sheet-fade-in{0%{opacity:0}to{opacity:1}}@keyframes z-sheet-fade-out{0%{opacity:1}to{opacity:0}}@keyframes z-sheet-from-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes z-sheet-from-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes z-sheet-from-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes z-sheet-from-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.z-sheet{animation-name:z-sheet-fade-in;animation-duration:var(--duration-normal)}.z-sheet[data-state=closed]{animation-name:z-sheet-fade-out;animation-direction:normal}.z-sheet__close{transition-duration:0s}}.z-sparkline{vertical-align:middle;width:100%;min-width:3rem;line-height:0;display:inline-block}.z-sparkline__svg{width:100%;display:block;overflow:visible}.z-sparkline__line{stroke-width:1.5px}.z-sparkline[data-tone=primary],.z-sparkline[data-tone=success],.z-sparkline[data-tone=warning],.z-sparkline[data-tone=danger],.z-sparkline[data-tone=neutral]{color:var(--color-text)}.z-switch{align-items:flex-start;gap:var(--spacing-2);color:var(--color-text);display:inline-flex}.z-switch__box{height:calc(var(--text-sm) * var(--leading-normal));flex:none;align-items:center;display:inline-flex}.z-switch[data-size=sm] .z-switch__box{height:calc(var(--text-xs) * var(--leading-normal))}.z-switch__control{background-color:var(--color-border-strong);border-radius:var(--radius-full);cursor:pointer;transition:background-color var(--duration-fast) var(--ease-standard);border:2px solid #0000;flex:none;align-items:center;padding:0;display:inline-flex;position:relative}.z-switch[data-size=sm] .z-switch__control{width:1.75rem;height:1rem}.z-switch[data-size=md] .z-switch__control{width:2.25rem;height:1.25rem}.z-switch__thumb{background-color:var(--color-surface);border-radius:var(--radius-full);box-shadow:var(--shadow-sm);transition:transform var(--duration-normal) var(--ease-emphasized);display:block}.z-switch[data-size=sm] .z-switch__thumb{width:.75rem;height:.75rem}.z-switch[data-size=md] .z-switch__thumb{width:1rem;height:1rem}.z-switch[data-size=sm] .z-switch__control[data-state=checked] .z-switch__thumb{transform:translate(.75rem)}.z-switch[data-size=md] .z-switch__control[data-state=checked] .z-switch__thumb{transform:translate(1rem)}.z-switch__control:hover:not(:disabled){background-color:var(--color-text-muted)}.z-switch__control[data-state=checked]{background-color:var(--color-primary)}.z-switch__control[data-state=checked]:hover:not(:disabled){background-color:var(--color-primary-hover)}.z-switch__control:disabled{background-color:var(--color-border);cursor:not-allowed}.z-switch__control:disabled[data-state=checked]{background-color:var(--color-text-subtle)}.z-switch__text{gap:var(--spacing-0);flex-direction:column;display:flex}.z-switch__label{font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-normal);cursor:pointer}.z-switch[data-size=sm] .z-switch__label{font-size:var(--text-xs)}.z-switch__description{font-size:var(--text-xs);line-height:var(--leading-normal);color:var(--color-text-muted);margin:0}.z-switch[data-disabled]{color:var(--color-text-subtle)}.z-switch[data-disabled] .z-switch__label{cursor:not-allowed}@media (prefers-reduced-motion:reduce){.z-switch__control,.z-switch__thumb{transition-duration:0s}}.z-table{border:var(--border-width) solid var(--color-border);border-radius:var(--radius-lg);width:100%;color:var(--color-text);overflow:auto}.z-table__table{border-collapse:collapse;width:100%;font-size:var(--text-sm);line-height:var(--leading-tight)}.z-table__cell{border-bottom:var(--border-width) solid var(--color-border);text-align:left;vertical-align:middle}.z-table[data-density=sm] .z-table__cell{padding:var(--spacing-2) var(--spacing-3);font-size:var(--text-xs)}.z-table[data-density=md] .z-table__cell{padding:var(--spacing-3) var(--spacing-4);font-size:var(--text-sm)}.z-table__cell--head{font-weight:var(--font-weight-medium);color:var(--color-text-muted);white-space:nowrap}.z-table__head .z-table__cell{background-color:var(--color-surface-raised)}.z-table[data-sticky] .z-table__head .z-table__cell{z-index:1;position:sticky;top:0}.z-table__body .z-table__row:last-child .z-table__cell{border-bottom:0}.z-table__foot .z-table__cell{border-top:var(--border-width) solid var(--color-border);background-color:var(--color-surface-raised);font-weight:var(--font-weight-medium);border-bottom:0}.z-table__cell[data-align=center]{text-align:center}.z-table__cell[data-align=end]{text-align:right}.z-table__cell[data-numeric]{font-variant-numeric:tabular-nums}.z-table__row[data-interactive]{cursor:pointer;transition:background-color var(--duration-fast) var(--ease-standard)}.z-table__row[data-interactive]:hover .z-table__cell{background-color:var(--color-surface-raised)}.z-table__row[data-selected] .z-table__cell{background-color:var(--color-primary-soft)}@media (prefers-reduced-motion:reduce){.z-table__row[data-interactive]{transition-duration:0s}}.z-textarea{gap:var(--spacing-1);color:var(--color-text);flex-direction:column;display:flex}.z-textarea__label{font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-tight)}.z-textarea__required{color:var(--color-danger)}.z-textarea__control{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-md);width:100%;min-width:0;color:var(--color-text);font-family:inherit;line-height:var(--leading-normal);transition:border-color var(--duration-fast) var(--ease-standard), background-color var(--duration-fast) var(--ease-standard)}.z-textarea__control::placeholder{color:var(--color-text-subtle)}.z-textarea[data-resize=none] .z-textarea__control{resize:none}.z-textarea[data-resize=vertical] .z-textarea__control{resize:vertical}.z-textarea[data-resize=both] .z-textarea__control{resize:both}.z-textarea[data-size=sm] .z-textarea__control{padding:var(--spacing-1) var(--spacing-2);font-size:var(--text-sm)}.z-textarea[data-size=md] .z-textarea__control{padding:var(--spacing-2) var(--spacing-3);font-size:var(--text-sm)}.z-textarea[data-size=lg] .z-textarea__control{padding:var(--spacing-3) var(--spacing-4);font-size:var(--text-base)}.z-textarea__control:hover:not(:disabled):not(:read-only){border-color:var(--color-text-muted)}.z-textarea__control:focus-visible{border-color:var(--color-focus);outline-offset:0}.z-textarea[data-invalid] .z-textarea__control{border-color:var(--color-danger)}.z-textarea[data-invalid] .z-textarea__control:focus-visible{outline-color:var(--color-danger)}.z-textarea[data-readonly] .z-textarea__control{background-color:var(--color-surface-sunken)}.z-textarea[data-disabled]{color:var(--color-text-subtle)}.z-textarea__control:disabled{background-color:var(--color-surface-sunken);color:var(--color-text-subtle);cursor:not-allowed}.z-textarea__description,.z-textarea__error{font-size:var(--text-xs);line-height:var(--leading-normal);margin:0}.z-textarea__description{color:var(--color-text-muted)}.z-textarea__error{color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.z-textarea__control{transition-duration:0s}}.z-textarea[data-font=mono] .z-textarea__control{font-family:var(--font-mono)}.z-field{gap:var(--spacing-1);color:var(--color-text);flex-direction:column;display:flex}.z-field__label{font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-tight)}.z-field__required{color:var(--color-danger)}.z-field__control{align-items:center;display:flex;position:relative}.z-field__input{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-md);width:100%;min-width:0;color:var(--color-text);font-family:inherit;line-height:var(--leading-normal);transition:border-color var(--duration-fast) var(--ease-standard), background-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard)}.z-field__input::placeholder{color:var(--color-text-subtle)}.z-field[data-size=sm] .z-field__input{min-height:2rem;padding:var(--spacing-1) var(--spacing-2);font-size:var(--text-sm)}.z-field[data-size=md] .z-field__input{min-height:2.5rem;padding:var(--spacing-2) var(--spacing-3);font-size:var(--text-sm)}.z-field[data-size=lg] .z-field__input{min-height:3rem;padding:var(--spacing-3) var(--spacing-4);font-size:var(--text-base)}.z-field__icon{color:var(--color-text-muted);pointer-events:none;position:absolute}.z-field__icon:first-child{left:var(--spacing-3)}.z-field__icon:last-child{right:var(--spacing-3)}.z-field__control:has(>.z-field__icon:first-child)>.z-field__input{padding-left:var(--spacing-8)}.z-field__control:has(>.z-field__icon:last-child)>.z-field__input{padding-right:var(--spacing-8)}.z-field__input:hover:not(:disabled):not(:read-only){border-color:var(--color-text-muted)}.z-field__input:focus-visible{border-color:var(--color-focus);outline-offset:0}.z-field[data-invalid] .z-field__input{border-color:var(--color-danger)}.z-field[data-invalid] .z-field__input:focus-visible{outline-color:var(--color-danger)}.z-field[data-readonly] .z-field__input{background-color:var(--color-surface-sunken)}.z-field[data-disabled]{color:var(--color-text-subtle)}.z-field__input:disabled{background-color:var(--color-surface-sunken);color:var(--color-text-subtle);cursor:not-allowed}.z-field__description,.z-field__error{font-size:var(--text-xs);line-height:var(--leading-normal);margin:0}.z-field__description{color:var(--color-text-muted)}.z-field__error{color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.z-field__input{transition-duration:0s}}.z-field[data-font=mono] .z-field__input{font-family:var(--font-mono)}.z-toast__viewport{z-index:70;gap:var(--spacing-2);width:min(100vw - var(--spacing-8), 24rem);padding:var(--spacing-4);outline:none;flex-direction:column;margin:0;list-style:none;display:flex;position:fixed}.z-toast__viewport[data-position=bottom-right]{bottom:0;right:0}.z-toast__viewport[data-position=bottom-left]{bottom:0;left:0}.z-toast__viewport[data-position=top-right]{top:0;right:0}.z-toast__viewport[data-position=top-left]{top:0;left:0}.z-toast{align-items:start;gap:var(--spacing-3);padding:var(--spacing-3) var(--spacing-3) var(--spacing-3) var(--spacing-4);background-color:var(--color-surface);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);color:var(--color-text);animation:z-toast-enter var(--duration-slow) var(--ease-emphasized);border-left-width:3px;grid-template-columns:minmax(0,1fr) auto auto;display:grid}.z-toast[data-state=closed]{animation:z-toast-exit var(--duration-normal) var(--ease-exit)}.z-toast[data-swipe=move]{transform:translateX(var(--radix-toast-swipe-move-x))}.z-toast[data-swipe=cancel]{transition:transform var(--duration-normal) var(--ease-standard);transform:translate(0)}.z-toast[data-swipe=end]{animation:z-toast-swipe-out var(--duration-fast) var(--ease-exit)}.z-toast[data-tone=neutral]{border-left-color:var(--color-neutral)}.z-toast[data-tone=success]{border-left-color:var(--color-success)}.z-toast[data-tone=warning]{border-left-color:var(--color-warning)}.z-toast[data-tone=danger]{border-left-color:var(--color-danger)}.z-toast__body{gap:var(--spacing-1);min-width:0;display:grid}.z-toast__title{font-size:var(--text-sm);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);margin:0}.z-toast__description{font-size:var(--text-sm);line-height:var(--leading-normal);color:var(--color-text-muted);margin:0}.z-toast__action{padding:var(--spacing-1) var(--spacing-2);background-color:var(--color-neutral-soft);border-radius:var(--radius-md);color:var(--color-neutral-soft-foreground);font-family:inherit;font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-tight);white-space:nowrap;cursor:pointer;border:0}.z-toast__action:hover{background-color:var(--color-neutral-soft-hover)}.z-toast--clear{box-shadow:none;background:0 0;border:0;justify-content:flex-end;padding:0;display:flex}.z-toast__clear{padding:var(--spacing-1) var(--spacing-2);background-color:var(--color-neutral-soft);border-radius:var(--radius-md);color:var(--color-neutral-soft-foreground);font-family:inherit;font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-tight);cursor:pointer;border:0}.z-toast__close{border-radius:var(--radius-md);width:1.5rem;height:1.5rem;color:var(--color-text-muted);cursor:pointer;background-color:#0000;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.z-toast__close>svg{width:.875rem;height:.875rem}.z-toast__close:hover{background-color:var(--color-neutral-soft);color:var(--color-text)}@keyframes z-toast-enter{0%{opacity:0;transform:translateY(var(--spacing-3))}to{opacity:1;transform:translateY(0)}}@keyframes z-toast-exit{0%{opacity:1}to{opacity:0}}@keyframes z-toast-swipe-out{0%{transform:translateX(var(--radix-toast-swipe-end-x))}to{transform:translateX(calc(100% + var(--spacing-8)))}}@media (prefers-reduced-motion:reduce){.z-toast{animation:z-toast-exit var(--duration-fast) var(--ease-standard) reverse}}.z-tooltip{z-index:60;max-width:18rem;padding:var(--spacing-1) var(--spacing-2);background-color:var(--color-text);border-radius:var(--radius-md);box-shadow:var(--shadow-md);color:var(--color-surface);font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-normal);transform-origin:var(--radix-tooltip-content-transform-origin);animation:z-tooltip-enter var(--duration-fast) var(--ease-standard)}.z-tooltip[data-state=closed]{animation:z-tooltip-exit var(--duration-fast) var(--ease-exit)}.z-tooltip__arrow{fill:var(--color-text)}@keyframes z-tooltip-enter{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes z-tooltip-exit{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.98)}}@media (prefers-reduced-motion:reduce){.z-tooltip,.z-tooltip[data-state=closed]{animation:none}}.z-checkbox{align-items:flex-start;gap:var(--spacing-2);color:var(--color-text);display:inline-flex}.z-checkbox__control{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-sm);color:var(--color-on-primary);cursor:pointer;transition:background-color var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.z-checkbox__box{height:calc(var(--text-sm) * var(--leading-normal));flex:none;align-items:center;display:inline-flex}.z-checkbox[data-size=sm] .z-checkbox__box{height:calc(var(--text-xs) * var(--leading-normal))}.z-checkbox[data-size=sm] .z-checkbox__control{width:1rem;height:1rem}.z-checkbox[data-size=md] .z-checkbox__control{width:1.25rem;height:1.25rem}.z-checkbox__control:hover:not(:disabled){border-color:var(--color-text-muted)}.z-checkbox__control[data-state=checked],.z-checkbox__control[data-state=indeterminate]{background-color:var(--color-primary);border-color:var(--color-primary)}.z-checkbox__control[data-state=checked]:hover:not(:disabled),.z-checkbox__control[data-state=indeterminate]:hover:not(:disabled){background-color:var(--color-primary-hover);border-color:var(--color-primary-hover)}.z-checkbox__control:disabled{background-color:var(--color-surface-sunken);border-color:var(--color-border);cursor:not-allowed}.z-checkbox__control:disabled[data-state=checked],.z-checkbox__control:disabled[data-state=indeterminate]{background-color:var(--color-text-subtle);border-color:var(--color-text-subtle)}.z-checkbox__indicator{width:80%;height:80%;display:inline-flex}.z-checkbox__indicator>svg{width:100%;height:100%}.z-checkbox__check,.z-checkbox__dash{stroke-dasharray:20;stroke-dashoffset:20px;transition:stroke-dashoffset var(--duration-normal) var(--ease-emphasized)}.z-checkbox__control[data-state=checked] .z-checkbox__check,.z-checkbox__control[data-state=indeterminate] .z-checkbox__dash{stroke-dashoffset:0}.z-checkbox__text{gap:var(--spacing-0);flex-direction:column;display:flex}.z-checkbox__label{font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-normal);cursor:pointer}.z-checkbox[data-size=sm] .z-checkbox__label{font-size:var(--text-xs)}.z-checkbox__description{color:var(--color-text-muted);font-size:var(--text-xs);line-height:var(--leading-normal);margin:0}.z-checkbox[data-disabled] .z-checkbox__label,.z-checkbox[data-disabled] .z-checkbox__description{color:var(--color-text-subtle);cursor:not-allowed}@media (prefers-reduced-motion:reduce){.z-checkbox__control,.z-checkbox__check,.z-checkbox__dash{transition-duration:0s}}.z-codeblock{background-color:var(--color-surface-sunken);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-md);color:var(--color-text);display:grid;overflow:hidden}.z-codeblock__head{justify-content:space-between;align-items:center;gap:var(--spacing-2);padding:var(--spacing-1) var(--spacing-1) var(--spacing-1) var(--spacing-3);border-bottom:var(--border-width) solid var(--color-border);display:flex}.z-codeblock__language{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--color-text-muted)}.z-codeblock__copy{margin-left:auto}.z-codeblock__pre{padding:var(--spacing-3);font-family:var(--font-mono);font-size:var(--text-xs);line-height:var(--leading-normal);tab-size:2;margin:0;overflow-x:auto}.z-codeblock[data-wrap] .z-codeblock__pre{white-space:pre-wrap;word-break:break-word}.z-markdown{gap:var(--spacing-3);color:var(--color-text);font-size:var(--text-sm);line-height:var(--leading-normal);overflow-wrap:anywhere;display:grid}.z-markdown>*{margin:0}.z-markdown h1,.z-markdown h2,.z-markdown h3,.z-markdown h4,.z-markdown h5,.z-markdown h6{font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}.z-markdown h1{font-size:var(--text-xl)}.z-markdown h2{font-size:var(--text-lg)}.z-markdown h3,.z-markdown h4,.z-markdown h5,.z-markdown h6{font-size:var(--text-base)}.z-markdown ul,.z-markdown ol{gap:var(--spacing-1);padding-left:var(--spacing-5);display:grid}.z-markdown code{padding:var(--spacing-0) var(--spacing-1);background-color:var(--color-surface-sunken);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:.9em}.z-markdown a{color:var(--color-primary);text-underline-offset:.15em}.z-markdown blockquote{padding-left:var(--spacing-3);border-left:2px solid var(--color-border-strong);color:var(--color-text-muted)}.z-markdown hr{background-color:var(--color-border);border:0;height:1px}.z-markdown__cursor{width:2px;height:1em;margin-left:var(--spacing-0);vertical-align:text-bottom;background-color:var(--color-text-muted);animation:1s steps(2,end) infinite z-markdown-blink;display:inline-block}@keyframes z-markdown-blink{to{opacity:0}}@media (prefers-reduced-motion:reduce){.z-markdown__cursor{animation:none}}.z-tabs{color:var(--color-text);flex-direction:column;display:flex}.z-tabs__list{flex-wrap:wrap;align-items:center;display:flex}.z-tabs__trigger{align-items:center;gap:var(--spacing-2);color:var(--color-text-muted);font-family:inherit;font-weight:var(--font-weight-medium);line-height:var(--leading-tight);white-space:nowrap;cursor:pointer;transition:color var(--duration-fast) var(--ease-standard), background-color var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard);background:0 0;border:0;display:inline-flex}.z-tabs__trigger:hover:not(:disabled){color:var(--color-text)}.z-tabs__trigger:disabled{color:var(--color-text-subtle);cursor:not-allowed}.z-tabs__trigger[data-state=active]{color:var(--color-text)}.z-tabs[data-size=sm] .z-tabs__trigger{padding:var(--spacing-1) var(--spacing-2);font-size:var(--text-xs)}.z-tabs[data-size=md] .z-tabs__trigger{padding:var(--spacing-2) var(--spacing-3);font-size:var(--text-sm)}.z-tabs[data-variant=line] .z-tabs__list{gap:var(--spacing-1);box-shadow:inset 0 -1px 0 var(--color-border)}.z-tabs[data-variant=line] .z-tabs__trigger{border-radius:var(--radius-sm) var(--radius-sm) 0 0;border-bottom:2px solid #0000}.z-tabs[data-variant=line] .z-tabs__trigger[data-state=active]{border-bottom-color:var(--color-primary);color:var(--color-primary)}.z-tabs[data-variant=pill] .z-tabs__list{align-self:flex-start;gap:var(--spacing-1);padding:var(--spacing-1);background-color:var(--color-surface-sunken);border-radius:var(--radius-md)}.z-tabs[data-variant=pill] .z-tabs__trigger{border-radius:var(--radius-sm)}.z-tabs[data-variant=pill] .z-tabs__trigger[data-state=active]{background-color:var(--color-surface);box-shadow:var(--shadow-sm)}.z-tabs__content{padding-top:var(--spacing-4);outline-offset:0}.z-tabs__content[data-state=inactive]{display:none}.z-skeleton{background-color:var(--color-neutral-soft);animation:z-skeleton-pulse var(--duration-slow) var(--ease-standard) infinite alternate;display:inline-block}.z-skeleton[data-variant=text]{border-radius:var(--radius-sm);vertical-align:middle;width:100%;height:1em}.z-skeleton[data-variant=rect]{border-radius:var(--radius-md);width:100%;height:4rem}.z-skeleton[data-variant=circle]{border-radius:var(--radius-full);width:2.5rem;height:2.5rem}.z-skeleton-lines{gap:var(--spacing-2);width:100%;display:grid}@keyframes z-skeleton-pulse{0%{opacity:1}to{opacity:.5}}@media (prefers-reduced-motion:reduce){.z-skeleton{animation:none}}.z-loader{align-items:center;gap:var(--spacing-2);color:var(--color-text-muted);font-size:var(--text-xs);display:inline-flex}.z-loader__dots{gap:var(--spacing-1);display:inline-flex}.z-loader__dots>span{border-radius:var(--radius-full);animation:z-loader-bounce 1.2s var(--ease-standard) infinite;background-color:currentColor;display:block}.z-loader[data-size=sm] .z-loader__dots>span{width:var(--spacing-1);height:var(--spacing-1)}.z-loader[data-size=md] .z-loader__dots>span{width:var(--spacing-2);height:var(--spacing-2)}.z-loader__dots>span:nth-child(2){animation-delay:.15s}.z-loader__dots>span:nth-child(3){animation-delay:.3s}@keyframes z-loader-bounce{0%,60%,to{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-25%)}}@media (prefers-reduced-motion:reduce){.z-loader__dots>span{animation:z-loader-fade 1.2s var(--ease-standard) infinite alternate}}@keyframes z-loader-fade{0%{opacity:.3}to{opacity:1}}.z-empty{justify-items:center;gap:var(--spacing-2);padding:var(--spacing-8);border:var(--border-width) dashed var(--color-border);border-radius:var(--radius-lg);color:var(--color-text-muted);text-align:center;display:grid}.z-empty[data-size=sm]{padding:var(--spacing-5)}.z-empty__icon{color:var(--color-text-subtle);display:inline-flex}.z-empty[data-tone=danger] .z-empty__icon{color:var(--color-danger)}.z-empty__title{color:var(--color-text);font-weight:var(--font-weight-medium);margin:0}.z-empty[data-size=md] .z-empty__title{font-size:var(--text-lg)}.z-empty__description{max-width:44ch;font-size:var(--text-sm);text-wrap:pretty;margin:0}.z-empty__action{margin-top:var(--spacing-2)}.z-kanban{gap:var(--spacing-4);grid-auto-columns:minmax(16rem,1fr);grid-auto-flow:column;align-items:start;display:grid;overflow-x:auto}.z-kanban__column{gap:var(--spacing-3);padding:var(--spacing-3);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-lg);background-color:var(--color-surface-sunken);display:grid}.z-kanban__column[data-over]{border-color:var(--color-primary)}.z-kanban__head{justify-content:space-between;align-items:center;gap:var(--spacing-2);display:flex}.z-kanban__title{font-size:var(--text-sm);font-weight:var(--font-weight-semibold);margin:0}.z-kanban__list{gap:var(--spacing-2);margin:0;padding:0;list-style:none;display:grid}.z-kanban__slot[data-drop]:before{content:"";height:2px;margin-bottom:var(--spacing-2);background-color:var(--color-primary);border-radius:var(--radius-full);display:block}.z-kanban__card{padding:var(--spacing-3);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-md);background-color:var(--color-surface);cursor:grab}.z-kanban__card[data-lifted]{cursor:grabbing;border-color:var(--color-primary);box-shadow:var(--shadow-md)}.z-kanban[data-density=sm] .z-kanban__card,.z-kanban[data-density=sm] .z-kanban__column{padding:var(--spacing-2)}.z-combobox{gap:var(--spacing-2);display:grid;position:relative}.z-combobox__label{font-size:var(--text-sm);font-weight:var(--font-weight-medium)}.z-combobox__control{align-items:center;gap:var(--spacing-1);padding:var(--spacing-1) var(--spacing-2);border:var(--border-width) solid var(--color-outline);border-radius:var(--radius-md);background-color:var(--color-surface);flex-wrap:wrap;display:flex}.z-combobox[data-invalid] .z-combobox__control{border-color:var(--color-danger)}.z-combobox[data-disabled] .z-combobox__control{background-color:var(--color-surface-sunken);opacity:.55}.z-combobox__input{min-width:6rem;padding-block:var(--spacing-1);color:inherit;background:0 0;border:0;flex:6rem;font-family:inherit}.z-combobox[data-size=sm] .z-combobox__input,.z-combobox[data-size=md] .z-combobox__input{font-size:var(--text-sm)}.z-combobox[data-size=lg] .z-combobox__input{font-size:var(--text-base)}.z-combobox__chip{align-items:center;gap:var(--spacing-1);display:inline-flex}.z-combobox__remove{color:inherit;cursor:pointer;background:0 0;border:0;align-items:center;padding:0;display:inline-flex}.z-combobox__chevron{color:var(--color-text-subtle);display:inline-flex}.z-combobox__list{z-index:20;max-height:16rem;margin:var(--spacing-1) 0 0;padding:var(--spacing-1);border:var(--border-width) solid var(--color-border);border-radius:var(--radius-md);background-color:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-lg);list-style:none;position:absolute;top:100%;left:0;right:0;overflow-y:auto}.z-combobox__list ul{margin:0;padding:0;list-style:none}.z-combobox__group-name{margin:var(--spacing-2) var(--spacing-2) var(--spacing-1);font-family:var(--font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wider);text-transform:uppercase;color:var(--color-text-subtle)}.z-combobox__option{align-items:center;column-gap:var(--spacing-2);padding:var(--spacing-2);border-radius:var(--radius-sm);cursor:pointer;grid-template-columns:1fr auto;display:grid}.z-combobox__option[data-active=true]{background-color:var(--color-surface-sunken)}.z-combobox__option[aria-disabled]{opacity:.55;cursor:not-allowed}.z-combobox__option-label{font-size:var(--text-sm)}.z-combobox__option-hint{font-size:var(--text-xs);color:var(--color-text-muted);grid-column:1}.z-combobox__tick{color:var(--color-primary);grid-area:1/2/-1;display:inline-flex}.z-combobox__empty{padding:var(--spacing-3);font-size:var(--text-sm);color:var(--color-text-muted)}.z-combobox__description{font-size:var(--text-xs);color:var(--color-text-muted);margin:0}.z-combobox__error{font-size:var(--text-xs);color:var(--color-danger);margin:0}:root,[data-theme=light]{--font-sans:"Hanken Grotesk", Helvetica, Arial, sans-serif;--font-display:"Bricolage Grotesque", "Hanken Grotesk", sans-serif;--font-mono:"Azeret Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--text-xs:.75rem;--text-sm:.8125rem;--text-base:.875rem;--text-lg:1rem;--text-xl:1.0625rem;--text-2xl:1.375rem;--text-3xl:1.5rem;--text-4xl:1.875rem;--leading-normal:1.45;--leading-tight:1.15;--tracking-caps:.08em;--radius-sm:3px;--radius-md:4px;--radius-lg:6px;--radius-xl:8px;--shadow-sm:none;--shadow-md:none;--shadow-lg:none;--color-surface:#f4f8f5;--color-surface-raised:#e9f0eb;--color-surface-sunken:#e4ece6;--color-surface-overlay:#0e1a13cc;--color-text:#0e1a13;--color-text-muted:#3a4f43;--color-text-subtle:#54675c;--color-border:#d0dcd3;--color-border-strong:#b3c6b9;--color-primary:#1e6b3c;--color-primary-hover:#185a32;--color-primary-active:#124a28;--color-primary-soft:#d8ecdd;--color-primary-soft-hover:#c8e2cf;--color-primary-soft-foreground:#1e6b3c;--color-on-primary:#fff;--color-focus:#1e6b3c;--color-neutral:#22332a;--color-neutral-hover:#2f4438;--color-neutral-active:#0e1a13;--color-neutral-soft:#e9f0eb;--color-neutral-soft-hover:#d8ecdd;--color-neutral-soft-foreground:#0e1a13;--color-on-neutral:#fff;--color-success:#1e6b3c;--color-success-soft:#d8ecdd;--color-success-soft-foreground:#1e6b3c;--color-on-success:#fff;--color-warning:#8a6a12;--color-warning-soft:#f1e9c8;--color-warning-soft-foreground:#6b5210;--color-on-warning:#fff;--color-danger:#b4402c;--color-danger-hover:#9c3624;--color-danger-active:#7f2a1b;--color-danger-soft:#f4dcd7;--color-danger-soft-hover:#ecc9c2;--color-danger-soft-foreground:#8f3322;--color-on-danger:#fff;--color-text-faint:#6d7f75}[data-theme=dark]{--color-surface:#0d1a14;--color-surface-raised:#122119;--color-surface-sunken:#08120c;--color-surface-overlay:#08120ccc;--color-text:#e9f5ee;--color-text-muted:#a9c2b4;--color-text-subtle:#8aa596;--color-border:#1c2e25;--color-border-strong:#274536;--color-primary:#c8f542;--color-primary-hover:#d4f766;--color-primary-active:#9fcf2a;--color-primary-soft:#1a3326;--color-primary-soft-hover:#224030;--color-primary-soft-foreground:#c8f542;--color-on-primary:#08120c;--color-focus:#c8f542;--color-neutral:#c3d6cb;--color-neutral-hover:#d6e6dc;--color-neutral-active:#e9f5ee;--color-neutral-soft:#122119;--color-neutral-soft-hover:#1a3326;--color-neutral-soft-foreground:#e9f5ee;--color-on-neutral:#08120c;--color-success:#7fd9a2;--color-success-soft:#123324;--color-success-soft-foreground:#7fd9a2;--color-on-success:#08120c;--color-warning:#d9b85c;--color-warning-soft:#2a2812;--color-warning-soft-foreground:#e6c76b;--color-on-warning:#08120c;--color-danger:#ef8f8f;--color-danger-hover:#f4a3a3;--color-danger-active:#e07676;--color-danger-soft:#341c1c;--color-danger-soft-hover:#442424;--color-danger-soft-foreground:#ef8f8f;--color-on-danger:#08120c;--color-text-faint:#6c8878}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--color-surface:#0d1a14;--color-surface-raised:#122119;--color-surface-sunken:#08120c;--color-surface-overlay:#08120ccc;--color-text:#e9f5ee;--color-text-muted:#a9c2b4;--color-text-subtle:#8aa596;--color-border:#1c2e25;--color-border-strong:#274536;--color-primary:#c8f542;--color-primary-hover:#d4f766;--color-primary-active:#9fcf2a;--color-primary-soft:#1a3326;--color-primary-soft-hover:#224030;--color-primary-soft-foreground:#c8f542;--color-on-primary:#08120c;--color-focus:#c8f542;--color-neutral:#c3d6cb;--color-neutral-hover:#d6e6dc;--color-neutral-active:#e9f5ee;--color-neutral-soft:#122119;--color-neutral-soft-hover:#1a3326;--color-neutral-soft-foreground:#e9f5ee;--color-on-neutral:#08120c;--color-success:#7fd9a2;--color-success-soft:#123324;--color-success-soft-foreground:#7fd9a2;--color-on-success:#08120c;--color-warning:#d9b85c;--color-warning-soft:#2a2812;--color-warning-soft-foreground:#e6c76b;--color-on-warning:#08120c;--color-danger:#ef8f8f;--color-danger-hover:#f4a3a3;--color-danger-active:#e07676;--color-danger-soft:#341c1c;--color-danger-soft-hover:#442424;--color-danger-soft-foreground:#ef8f8f;--color-on-danger:#08120c;--color-text-faint:#6c8878}}.brand-mark{align-items:center;gap:var(--spacing-2);color:var(--color-text);font-family:var(--font-display);font-size:var(--text-2xl);font-weight:var(--font-weight-semibold);letter-spacing:.02em;text-transform:uppercase;line-height:1;text-decoration:none;display:inline-flex}.brand-mark__logo{border-radius:var(--radius-md);object-fit:cover;width:32px;height:32px}.brand-mark__accent{color:var(--color-primary)}body{font-family:var(--font-sans);background-color:var(--color-surface-sunken);color:var(--color-text);-webkit-font-smoothing:antialiased;margin:0}.shell *,.shell :before,.shell :after{box-sizing:border-box}.shell h1,.shell h2,.shell h3,.shell p{margin:0}.shell{grid-template-columns:12.5rem minmax(0,1fr);min-height:100vh;display:grid}@media (width<=64rem){.shell{grid-template-columns:minmax(0,1fr)}}.sidebar{gap:var(--spacing-6);height:100vh;padding:var(--spacing-6) var(--spacing-4);background-color:var(--color-surface);border-right:1px solid var(--color-border);flex-direction:column;display:flex;position:sticky;top:0}@media (width<=64rem){.sidebar:not(.sidebar--sheet){display:none}}.sidebar--sheet{border:0;height:auto;padding:0;position:static}.nav__group{gap:var(--spacing-1);display:grid}.nav__group+.nav__group{margin-top:var(--spacing-4)}.nav__group-title{padding:0 var(--spacing-3);font-family:var(--font-mono);font-size:10px;font-weight:var(--font-weight-regular);letter-spacing:var(--tracking-caps);text-transform:uppercase;color:var(--color-text-faint)}.nav__count{font-family:var(--font-mono);font-size:var(--text-xs);font-weight:var(--font-weight-regular);color:var(--color-text-subtle);margin-left:auto}.brand{align-items:center;gap:var(--spacing-3);font-weight:var(--font-weight-semibold);display:flex}.brand__meta{line-height:var(--leading-tight);display:grid}.brand__meta small{font-size:var(--text-xs);font-weight:var(--font-weight-regular);color:var(--color-text-muted)}.nav{gap:var(--spacing-1);display:grid}.nav__item{width:100%}.sidebar__foot{align-items:center;gap:var(--spacing-3);padding-top:var(--spacing-4);border-top:1px solid var(--color-border);margin-top:auto;display:flex}.sidebar__user{min-width:0;font-size:var(--text-sm);line-height:var(--leading-tight);flex:1;display:grid}.sidebar__user small{font-size:var(--text-xs);color:var(--color-text-muted);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.main{flex-direction:column;min-width:0;display:flex}.topbar{z-index:5;align-items:center;gap:var(--spacing-4);padding:var(--spacing-3) var(--spacing-10);background-color:var(--color-surface);border-bottom:1px solid var(--color-border);flex-wrap:wrap;display:flex;position:sticky;top:0}.topbar__title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}.topbar__search{width:16.25rem;margin-left:auto}.topbar__search .num{font-size:var(--text-xs);color:var(--color-text-faint)}@media (width<=52rem){.topbar__search{display:none}}.topbar__actions{align-items:center;gap:var(--spacing-2);display:flex}.topbar__menu{display:none}@media (width<=64rem){.topbar__menu{display:inline-flex}}.page{gap:var(--spacing-6);padding:var(--spacing-8) var(--spacing-10) var(--spacing-12);display:grid}@media (width<=52rem){.page{padding:var(--spacing-5) var(--spacing-4) var(--spacing-8)}}.page__head{justify-content:space-between;align-items:flex-end;gap:var(--spacing-3);flex-wrap:wrap;display:flex}.page__head p{max-width:45rem;font-size:var(--text-sm);color:var(--color-text-muted);text-wrap:pretty}.page__head p+p{margin-top:var(--spacing-1)}.stats{gap:var(--spacing-4);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}@media (width<=64rem){.stats{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=40rem){.stats{grid-template-columns:minmax(0,1fr)}}.stat{gap:var(--spacing-2);display:grid}.stat__label{font-size:var(--text-sm);color:var(--color-text-muted)}.stat__row{justify-content:space-between;align-items:flex-end;gap:var(--spacing-3);display:flex}.stat__value{font-family:var(--font-mono);font-size:var(--text-4xl);font-weight:var(--font-weight-regular);line-height:var(--leading-none);font-variant-numeric:tabular-nums}.stat__spark{width:6rem}.stat__delta{align-items:center;gap:var(--spacing-2);font-size:var(--text-xs);color:var(--color-text-muted);display:flex}.charts{gap:var(--spacing-4);grid-template-columns:minmax(0,3fr) minmax(0,2fr);display:grid}@media (width<=64rem){.charts{grid-template-columns:minmax(0,1fr)}}.panel{gap:var(--spacing-4);display:grid}.panel__head{justify-content:space-between;align-items:center;gap:var(--spacing-3);flex-wrap:wrap;display:flex}.panel__head h2{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}.panel__head p{font-size:var(--text-sm);color:var(--color-text-muted)}.who{align-items:center;gap:var(--spacing-3);display:flex}.who__text{min-width:0;line-height:var(--leading-tight);display:grid}.who__text small{font-size:var(--text-xs);color:var(--color-text-muted);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.muted{color:var(--color-text-muted)}.toolbar{align-items:flex-end;gap:var(--spacing-3);flex-wrap:wrap;display:flex}.toolbar__search{width:16rem}.toolbar__filter{width:11rem}.toolbar__spacer{flex:1}.cell-spark{width:5rem}.pager{justify-content:space-between;align-items:center;gap:var(--spacing-3);font-size:var(--text-sm);color:var(--color-text-muted);display:flex}.pager__buttons{gap:var(--spacing-2);display:flex}.detail{gap:var(--spacing-4);display:grid}.detail__grid{gap:var(--spacing-3) var(--spacing-4);font-size:var(--text-sm);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.detail__grid dt{color:var(--color-text-muted)}.detail__grid dd{font-weight:var(--font-weight-medium);margin:0}.billing{gap:var(--spacing-4);grid-template-columns:minmax(0,2fr) minmax(0,3fr);display:grid}@media (width<=64rem){.billing{grid-template-columns:minmax(0,1fr)}}.plan{gap:var(--spacing-4);display:grid}.plan__price{font-size:var(--text-3xl);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}.plan__price small{font-size:var(--text-sm);font-weight:var(--font-weight-regular);color:var(--color-text-muted)}.quotas{gap:var(--spacing-4);display:grid}.switches{gap:var(--spacing-3);display:grid}.settings{gap:var(--spacing-4);grid-template-columns:minmax(0,1fr);max-width:44rem;display:grid}.form{gap:var(--spacing-4);display:grid}.form__row{gap:var(--spacing-4);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}@media (width<=40rem){.form__row{grid-template-columns:minmax(0,1fr)}}.form__actions{justify-content:flex-end;gap:var(--spacing-2);display:flex}.danger{justify-content:space-between;align-items:center;gap:var(--spacing-3);flex-wrap:wrap;display:flex}.danger p{font-size:var(--text-sm);color:var(--color-text-muted)}.notifications{gap:var(--spacing-3);display:grid}.notifications__item{gap:var(--spacing-0);font-size:var(--text-sm);display:grid}.notifications__item small{font-size:var(--text-xs);color:var(--color-text-muted)}.section-title{font-size:var(--text-sm);font-weight:var(--font-weight-semibold)}.toolbar__filter--narrow{width:7rem}@media (width<=52rem){.jobs-narrow thead{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.jobs-narrow tbody tr{column-gap:var(--spacing-3);row-gap:var(--spacing-1);padding:var(--spacing-3) var(--spacing-4);border-bottom:1px solid var(--color-border);grid-template-columns:3rem minmax(0,1fr) auto;grid-template-areas:"score company pay""score role status""score where posted";display:grid}.jobs-narrow tbody td{border:0;min-width:0;padding:0;display:block}.jobs-narrow tbody td:first-child{font-weight:var(--font-weight-semibold);grid-area:score}.jobs-narrow tbody td:nth-child(2){font-weight:var(--font-weight-semibold);grid-area:company}.jobs-narrow tbody td:nth-child(3){grid-area:role}.jobs-narrow tbody td:nth-child(4){grid-area:pay;justify-self:end}.jobs-narrow tbody td:nth-child(5){grid-area:where}.jobs-narrow tbody td:nth-child(6){grid-area:posted;justify-self:end}.jobs-narrow tbody td:nth-child(7){grid-area:status;justify-self:end}.jobs-narrow tbody td[colspan]{grid-area:auto}.jobs-narrow .where{max-width:none}}.where{align-items:center;gap:var(--spacing-2);min-width:0;max-width:16rem;display:flex}.views{align-items:center;gap:var(--spacing-2);padding-bottom:var(--spacing-3);border-bottom:1px solid var(--color-border);flex-wrap:wrap;display:flex}.views__label{padding-right:var(--spacing-1);font-family:var(--font-mono);letter-spacing:var(--tracking-caps);text-transform:uppercase;color:var(--color-text-faint);font-size:10px}.filters{align-items:center;gap:var(--spacing-2);flex-wrap:wrap;display:flex}.filters__search{width:14rem}.filters__summary{justify-content:space-between;align-items:baseline;gap:var(--spacing-2) var(--spacing-5);font-size:var(--text-xs);color:var(--color-text-faint);flex-wrap:wrap;display:flex}.filters__query{overflow-wrap:anywhere;min-width:0}.filters__summary b{font-weight:var(--font-weight-regular);color:var(--color-text)}.filters__summary>span:first-child{align-items:center;gap:var(--spacing-3);display:inline-flex}.chip{border:1px solid var(--color-border-strong);border-radius:var(--radius-md);font-size:var(--text-xs);align-items:center;display:inline-flex;overflow:hidden}.chip--on{border-color:var(--color-primary)}.chip--default{border-style:dashed}.chip--current{border-color:var(--color-primary);background-color:var(--color-primary-soft)}.chip>*+*{border-left:1px solid var(--color-border)}.chip__dot{border-radius:var(--radius-full);background-color:var(--color-border-strong);width:8px;height:8px;display:inline-block}.chip--on .chip__dot{background-color:var(--color-primary)}.chip__value{margin-left:var(--spacing-2);color:var(--color-text-muted)}.chip__editor{gap:var(--spacing-3);min-width:16rem;display:grid}.jobs-narrow thead th,.jobs-narrow thead th .col{font-family:var(--font-mono);font-size:10px;font-weight:var(--font-weight-regular);letter-spacing:var(--tracking-caps);text-transform:uppercase;color:var(--color-text-faint)}.shell--collapsed{grid-template-columns:3.5rem minmax(0,1fr)}.shell--collapsed .sidebar{padding-inline:var(--spacing-2);gap:var(--spacing-4)}.shell--collapsed .brand-mark{gap:0;font-size:0}.shell--collapsed .brand-mark__logo{width:32px;height:32px}.shell--collapsed .nav__group+.nav__group{margin-top:var(--spacing-3)}.sidebar__collapse{margin-left:auto}.shell--collapsed .sidebar__collapse{margin-left:0}.sheet-head{justify-content:space-between;align-items:flex-start;gap:var(--spacing-4) var(--spacing-6);flex-wrap:wrap;display:flex}.sheet-head__main{gap:var(--spacing-2);min-width:0;display:grid}.sheet-head__meta{font-size:var(--text-xs);color:var(--color-text-subtle);margin:0}.sheet-head h2{font-family:var(--font-display);font-size:var(--text-4xl);font-weight:var(--font-weight-semibold);letter-spacing:-.02em;line-height:var(--leading-tight);margin:0}.sheet-head__side{justify-items:end;gap:var(--spacing-2);flex-shrink:0;display:grid}.sheet-head__links{gap:var(--spacing-3);flex-wrap:wrap;display:flex}.split{gap:var(--spacing-8);grid-template-columns:minmax(0,1fr) 16rem;align-items:start;display:grid}@media (width<=52rem){.split{grid-template-columns:minmax(0,1fr)}}.reasons{border-bottom:1px solid var(--color-border);flex-direction:column;display:flex}.reasons__head{justify-content:space-between;align-items:baseline;gap:var(--spacing-4);padding-bottom:var(--spacing-3);font-size:var(--text-xs);display:flex}.reasons__fit{font-size:var(--text-2xl);color:var(--color-primary)}.reasons__fit small{font-size:var(--text-xs)}.reasons__row{gap:var(--spacing-4);padding:var(--spacing-3) 0;border-top:1px solid var(--color-border);grid-template-columns:minmax(0,1fr) 3.75rem;display:grid}.reasons__detail{font-size:var(--text-xs);color:var(--color-text-faint)}.reasons__pts{text-align:right;color:var(--color-primary)}.reasons__pts--neg{color:var(--color-danger)}.reasons__log{padding:var(--spacing-3) 0;border-top:1px solid var(--color-border);font-size:var(--text-xs);color:var(--color-text-subtle)}.reasons__log summary{cursor:pointer}.split__aside{gap:var(--spacing-5);font-size:var(--text-xs);display:grid}.split__aside p{margin:var(--spacing-2) 0 0;color:var(--color-text-muted);line-height:var(--leading-normal)}.split__aside .small{font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere}.microlabel{font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--color-text-faint);font-size:10px}.people__list,.people__threads{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.people__row{justify-content:space-between;align-items:flex-start;gap:var(--spacing-4);padding:var(--spacing-3) 0;border-top:1px solid var(--color-border);display:flex}.people__row:last-child{border-bottom:1px solid var(--color-border)}.people__row>div:first-child{align-items:center;gap:var(--spacing-2);flex-wrap:wrap;display:flex}.people__row .reasons__detail{flex-basis:100%}.people__threads li{align-items:center;gap:var(--spacing-2);padding:var(--spacing-2) 0;border-top:1px solid var(--color-border);display:flex}.people__thread{color:var(--color-text);text-decoration:none}.people__thread:hover{color:var(--color-primary)}.people__add{gap:var(--spacing-3);padding-top:var(--spacing-2);display:grid}.preview-doc{max-width:46rem;padding:var(--spacing-2) 0}.variants__foot{padding:var(--spacing-3) var(--spacing-4);font-size:var(--text-xs);margin:0}.settings__h{margin:0 0 var(--spacing-1);font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--font-weight-semibold)}.sidebar__legal{color:var(--color-text-faint);text-decoration:none}.sidebar__legal:hover{color:var(--color-text)}.mailstrip{justify-content:space-between;align-items:center;gap:var(--spacing-3);flex-wrap:wrap;display:flex}.mailstrip>span{align-items:center;gap:var(--spacing-2);display:inline-flex}.copy{gap:var(--spacing-3);min-width:0;display:grid}.copy__groups{gap:var(--spacing-3);max-height:min(24rem,100vh - 14rem);display:grid;overflow:auto}.copy__group{gap:var(--spacing-1);display:grid}.copy__row{width:100%}.copy__label{font-weight:var(--font-weight-regular);flex-shrink:0}.copy__value{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-xs);color:var(--color-text-subtle);margin-left:auto;overflow:hidden}.copy__empty{padding:var(--spacing-2);margin:0}.copy__foot{justify-content:space-between;align-items:center;gap:var(--spacing-3);padding-top:var(--spacing-2);border-top:1px solid var(--color-border);font-size:var(--text-xs);display:flex}.copy__rows{gap:var(--spacing-4);display:grid}.copy__edit{gap:var(--spacing-2);padding-bottom:var(--spacing-4);border-bottom:1px solid var(--color-border);display:grid}.copy__edit-actions{justify-content:flex-end;gap:var(--spacing-1);display:flex}.num{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.today__date{font-family:var(--font-display);font-size:var(--text-4xl);font-weight:var(--font-weight-semibold);letter-spacing:-.015em;line-height:var(--leading-tight);margin:0}.today__figures{gap:var(--spacing-8);flex-wrap:wrap;display:flex}.today__figure{gap:var(--spacing-1);display:grid}.today__figure b{font-family:var(--font-mono);font-size:var(--text-3xl);font-weight:var(--font-weight-regular);line-height:var(--leading-none)}.today__figure b[data-tone=danger]{color:var(--color-danger)}.today__figure small{font-size:var(--text-sm);color:var(--color-text-subtle)}.today__hint{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--color-text-faint);margin-left:auto}.today__section-head{align-items:baseline;gap:var(--spacing-3);display:flex}.sidebar__foot{font-size:var(--text-sm);color:var(--color-text-faint);line-height:var(--leading-normal)}.preview{gap:var(--spacing-4);margin-top:var(--spacing-3);display:grid}.preview__block h3{font-size:var(--text-sm);margin-bottom:var(--spacing-2)}.preview__list{gap:var(--spacing-1);font-size:var(--text-sm);margin:0;padding:0;list-style:none;display:grid}.preview__score{font-variant-numeric:tabular-nums;min-width:5.5rem;color:var(--color-text-muted);display:inline-block}.import-results{margin:var(--spacing-3) 0 0;gap:var(--spacing-2);font-size:var(--text-sm);padding:0;list-style:none;display:grid}.import-results li{align-items:baseline;gap:var(--spacing-2);display:flex}.import-results__row{align-items:baseline;gap:var(--spacing-2);flex-wrap:wrap;display:inline-flex}.toolbar__switch{align-self:flex-end;margin-block-end:var(--spacing-2)}.toolbar__filter--wide{width:22rem;max-width:100%}.loading{padding:var(--spacing-6)}.mono{font-family:var(--font-mono);font-size:var(--text-sm)}.clamp{text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;max-width:18rem;display:inline-block;overflow:hidden}.chips{gap:var(--spacing-2);flex-wrap:wrap;display:flex}.detail__actions{align-items:flex-end;gap:var(--spacing-3);flex-wrap:wrap;display:flex}.steps{gap:var(--spacing-3);max-width:52rem;display:grid}.step{gap:var(--spacing-4);align-items:flex-start;display:flex}.step__mark{width:var(--spacing-8);height:var(--spacing-8);color:var(--color-primary);background-color:var(--color-primary-soft);border-radius:var(--radius-full);flex:none;justify-content:center;align-items:center;display:inline-flex}.step__n{font-size:var(--text-sm);font-weight:var(--font-weight-semibold)}.step__body{gap:var(--spacing-2);flex:1;min-width:0;display:grid}.step__label{font-weight:var(--font-weight-semibold)}.step__row{gap:var(--spacing-3);flex-wrap:wrap;align-items:flex-end;display:flex}.step__row>:first-child{flex:1;min-width:16rem}.form__actions--start{justify-content:flex-start}.kcard{gap:var(--spacing-1);cursor:grab;display:grid}.kcard:active{cursor:grabbing}.kcard__head{justify-content:space-between;align-items:center;gap:var(--spacing-2);display:flex}.kcard__company{font-family:var(--font-mono);font-size:10px;font-weight:var(--font-weight-regular);color:var(--color-text-faint);text-transform:uppercase;letter-spacing:.06em}.kcard__title{font-size:var(--text-sm);font-weight:var(--font-weight-regular);line-height:1.35}.kcard__meta{gap:var(--spacing-2);margin-top:var(--spacing-1);font-size:var(--text-xs);flex-wrap:wrap;display:flex}.kcard__score{color:var(--color-text-subtle)}.kcard__pay{color:var(--color-text-muted)}.kcard__pay--floor{color:var(--color-primary)}.today__section{gap:var(--spacing-3);margin-bottom:var(--spacing-6);display:grid}.today__heading{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);color:var(--color-text);margin:0}.today__subheading{margin:0 0 var(--spacing-1);font-size:var(--text-base);font-weight:var(--font-weight-semibold)}.today__cols{gap:var(--spacing-4);grid-template-columns:repeat(auto-fit,minmax(20rem,1fr));align-items:start;display:grid}.today__cols>*,.today__list>li,.today__row{min-width:0}.today__actions{gap:var(--spacing-2);justify-content:flex-end;display:flex}.today__list{gap:var(--spacing-1);margin:var(--spacing-3) 0 0;padding:0;list-style:none;display:grid}.today__row{width:100%;overflow:hidden}.today__row-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.packet__state{gap:var(--spacing-1);padding:var(--spacing-3);background-color:var(--color-surface-sunken);border-radius:var(--radius-md);justify-items:start;display:grid}.packet__field{gap:var(--spacing-1);display:grid}.letter__options{gap:var(--spacing-3);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.letter__meta{gap:var(--spacing-2);flex-wrap:wrap;display:flex}.letter__warnings{gap:var(--spacing-2);font-size:var(--text-sm);margin:0;padding:0;list-style:none;display:grid}.letter__warnings li{gap:var(--spacing-2);align-items:flex-start;display:flex}.resume-preview{max-height:60vh;padding:var(--spacing-4);background-color:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);overflow:auto}.z-table__row[data-posted]>td:first-child{box-shadow:inset 3px 0 0 var(--color-primary)}.z-table__row[data-posted]{background-color:color-mix(in srgb, var(--color-primary) 6%, transparent)}.kcard[data-posted]{border-left:3px solid var(--color-primary);background-color:color-mix(in srgb, var(--color-primary) 6%, var(--color-surface-raised))}.posted-co{align-items:center;gap:var(--spacing-2);min-width:0;display:inline-flex}.posted__glyph{width:12px;height:12px;margin-right:var(--spacing-1);border-radius:var(--radius-sm);display:inline-block}.health{gap:var(--spacing-1);margin-bottom:var(--spacing-4);flex-wrap:wrap;display:flex}.jobs{gap:var(--spacing-6);min-width:0;display:grid}.jobs--split{--tj-topbar:3.5625rem;margin:calc(var(--spacing-8) * -1) calc(var(--spacing-10) * -1) calc(var(--spacing-12) * -1);grid-template-columns:minmax(18.75rem,23.75rem) minmax(0,1fr);align-items:start;gap:0}.jobs__list{top:var(--tj-topbar);align-content:start;gap:var(--spacing-4);max-height:calc(100vh - var(--tj-topbar));padding:var(--spacing-5) var(--spacing-5) var(--spacing-12);border-right:1px solid var(--color-border);display:grid;position:sticky;overflow-y:auto}.jobs__detail{top:var(--tj-topbar);height:calc(100vh - var(--tj-topbar));padding:var(--spacing-5) var(--spacing-8) var(--spacing-12);position:sticky;overflow-y:auto;container-type:inline-size}@container (width<=38.75rem){.split{grid-template-columns:minmax(0,1fr)}}.ctools{gap:var(--spacing-2);display:grid}.ctools__row{align-items:center;gap:var(--spacing-2);display:flex}.ctools__row>.z-field{flex:1;min-width:0}.ctools__meta{font-size:var(--text-xs);color:var(--color-text-subtle);justify-content:space-between}.ctools__meta b{color:var(--color-text);font-weight:var(--font-weight-semibold)}.clist{border-top:1px solid var(--color-border);display:grid}.clist .clist__item{gap:var(--spacing-3);height:auto;padding:var(--spacing-3) var(--spacing-3);border-bottom:1px solid var(--color-border);text-align:left;white-space:normal;border-radius:0;grid-template-columns:2.75rem minmax(0,1fr);display:grid}.clist .clist__item[aria-current=true]{background-color:var(--color-surface-sunken);box-shadow:inset 3px 0 0 var(--color-primary)}.clist .clist__item[data-posted]{background-color:color-mix(in srgb, var(--color-primary) 6%, transparent)}.clist__score{font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}.clist__text{gap:var(--spacing-1);min-width:0;display:grid}.clist__role{font-weight:var(--font-weight-medium);line-height:var(--leading-tight);color:var(--color-text)}.clist__meta{font-size:var(--text-xs);font-weight:var(--font-weight-regular);color:var(--color-text-muted)}.clist__pay--floor{color:var(--color-primary)}.clist__pager{justify-content:space-between;align-items:center;gap:var(--spacing-2);padding-top:var(--spacing-3);font-size:var(--text-xs);display:flex}.sheet-nav{align-items:center;gap:var(--spacing-1);display:flex}.sheet-nav__count{padding-left:var(--spacing-2);font-size:var(--text-xs);color:var(--color-text-subtle)}.sheet-nav .sheet-nav__close{margin-left:auto}.sheet-head__title{margin:0}@media (width<=40rem){.shell--strip .sidebar:not(.sidebar--sheet){align-items:center;gap:var(--spacing-2);z-index:6;height:auto;padding:var(--spacing-2) var(--spacing-3);border-right:0;border-bottom:1px solid var(--color-border);scrollbar-width:none;flex-direction:row;display:flex;position:sticky;top:0;overflow-x:auto}.shell--strip .sidebar::-webkit-scrollbar{display:none}.shell--strip .brand-mark{gap:0;font-size:0}.shell--strip .brand-mark__logo{width:28px;height:28px}.shell--strip .nav,.shell--strip .nav__group{gap:var(--spacing-1);display:flex}.shell--strip .nav__group+.nav__group{margin:0 0 0 var(--spacing-1);padding-left:var(--spacing-2);border-left:1px solid var(--color-border)}.shell--strip .nav__item{width:auto}.shell--strip .topbar__menu{display:none}}.runs__outcome{gap:var(--spacing-1);justify-items:start;display:grid}.runs__outcome small{font-size:var(--text-xs)}.runs__live{align-items:center;gap:var(--spacing-2);display:inline-flex}.runs__problems{gap:var(--spacing-1);margin:0 0 var(--spacing-2);padding-left:var(--spacing-5);font-size:var(--text-xs);display:grid}.funnel__bar{width:100%;min-width:6rem;height:var(--spacing-2);border-radius:var(--radius-full);background-color:var(--color-surface-sunken);overflow:hidden}.funnel__bar span{border-radius:inherit;background-color:var(--color-primary);height:100%;display:block}.panel--pad{padding:var(--spacing-4) var(--spacing-4) 0}p.panel--pad,.chips.panel--pad{padding-bottom:var(--spacing-4)}.impact{align-items:center;gap:var(--spacing-2);margin-top:var(--spacing-3);padding-top:var(--spacing-3);border-top:1px solid var(--color-border);font-size:var(--text-sm);flex-wrap:wrap;display:flex}.impact--after{color:var(--color-text-muted)}.summary__list{gap:var(--spacing-2);font-size:var(--text-sm);margin:0;padding:0;list-style:none;display:grid}
|