[{"data":1,"prerenderedAt":474},["ShallowReactive",2],{"navigation":3,"\u002Fguide\u002Freports-calendar":80,"\u002Fguide\u002Freports-calendar-surround":469},[4,9,14,50,75],{"title":5,"path":6,"stem":7,"icon":8},"Getting started","\u002Fgetting-started","1.getting-started","i-lucide-rocket",{"title":10,"path":11,"stem":12,"icon":13},"Installation","\u002Finstallation","2.installation","i-lucide-hard-drive-download",{"title":15,"path":16,"stem":17,"children":18,"page":49},"Guide","\u002Fguide","3.guide",[19,24,29,34,39,44],{"title":20,"path":21,"stem":22,"icon":23},"Timer & entries","\u002Fguide\u002Ftimer-and-entries","3.guide\u002F1.timer-and-entries","i-lucide-timer",{"title":25,"path":26,"stem":27,"icon":28},"Projects, clients & tasks","\u002Fguide\u002Fprojects-clients-tasks","3.guide\u002F2.projects-clients-tasks","i-lucide-git-branch",{"title":30,"path":31,"stem":32,"icon":33},"Reports & calendar","\u002Fguide\u002Freports-calendar","3.guide\u002F3.reports-calendar","i-lucide-chart-column",{"title":35,"path":36,"stem":37,"icon":38},"Theme editor","\u002Fguide\u002Ftheme-editor","3.guide\u002F4.theme-editor","i-lucide-palette",{"title":40,"path":41,"stem":42,"icon":43},"Importing data","\u002Fguide\u002Fimport","3.guide\u002F5.import","i-lucide-hard-drive-upload",{"title":45,"path":46,"stem":47,"icon":48},"Team & organizations","\u002Fguide\u002Fteam","3.guide\u002F6.team","i-lucide-users",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Reference","\u002Freference","4.reference",[55,60,65,70],{"title":56,"path":57,"stem":58,"icon":59},"Data model","\u002Freference\u002Fdata-model","4.reference\u002F1.data-model","i-lucide-database",{"title":61,"path":62,"stem":63,"icon":64},"API routes","\u002Freference\u002Fapi","4.reference\u002F2.api","i-lucide-route",{"title":66,"path":67,"stem":68,"icon":69},"Environment variables","\u002Freference\u002Fenv","4.reference\u002F3.env","i-lucide-settings-2",{"title":71,"path":72,"stem":73,"icon":74},"Security","\u002Freference\u002Fsecurity","4.reference\u002F4.security","i-lucide-shield",{"title":76,"path":77,"stem":78,"icon":79},"About","\u002Fabout","5.about","i-lucide-info",{"id":81,"title":30,"body":82,"description":463,"extension":464,"meta":465,"navigation":466,"path":31,"seo":467,"stem":32,"__hash__":468},"docs\u002F3.guide\u002F3.reports-calendar.md",{"type":83,"value":84,"toc":450},"minimark",[85,90,99,104,142,146,166,187,191,194,285,294,300,304,322,349,353,364,440,447],[86,87,89],"h2",{"id":88},"reports","Reports",[91,92,93,94,98],"p",{},"The Reports page aggregates the whole org's entries over a date range. All aggregation happens server-side in one SQL pass (chains and rates resolve per ",[95,96,97],"a",{"href":26},"Rules 1–2","); trashed rows and running timers are always excluded.",[100,101,103],"h3",{"id":102},"filters","Filters",[105,106,107,124,133],"ul",{},[108,109,110,114,115,119,120,123],"li",{},[111,112,113],"strong",{},"Range",": ",[116,117,118],"em",{},"This week \u002F Last week \u002F This month",", plus a ",[111,121,122],{},"custom range"," with explicit from\u002Fto dates. The header subline restates the resolved range (\"This week · Sep 7 – Sep 13 · 24 entries\").",[108,125,126,114,129,132],{},[111,127,128],{},"Billable",[116,130,131],{},"All \u002F Billable \u002F Non-billable",".",[108,134,135,114,138,141],{},[111,136,137],{},"Group by",[116,139,140],{},"Client \u002F Project \u002F Task \u002F Tag"," — regroups both the chart and the breakdown table.",[100,143,145],{"id":144},"what-you-see","What you see",[105,147,148,154,160],{},[108,149,150,153],{},[111,151,152],{},"Stat cards",": Tracked (with worked-day count), Billable (% of tracked), Amount (with average $\u002Fh), Per day (average over worked days).",[108,155,156,159],{},[111,157,158],{},"Hours by day",": a stacked column chart, one column per day, segments colored by the current grouping. Series colors are assigned by rank on the server and shared between the chart and the table chips, so the legend always matches.",[108,161,162,165],{},[111,163,164],{},"Breakdown table",": color chip + label + parent sub-line, a share bar with %, entry count, hours, billable hours and amount, with a Total row. Unassigned time is real data, not hidden — \"No client\", \"No project\", \"No task\" and \"Untagged\" appear as their own rows.",[167,168,169],"warning",{},[91,170,171,174,175,179,180,179,183,186],{},[111,172,173],{},"Tag rows sum above the total, by design."," Grouping by tag counts an entry once per tag it carries, so an entry tagged ",[176,177,178],"code",{},"#design"," ",[116,181,182],{},"and",[176,184,185],{},"#dev"," appears in both rows — and the same fan-out applies to the chart's daily segments. The Total row and the stat cards count each entry exactly once, which is why the rows can add up to more than 100% of it. Every other grouping (client, project, task) is one row per entry.",[100,188,190],{"id":189},"export","Export",[91,192,193],{},"Three buttons, three different artifacts:",[195,196,197,210],"table",{},[198,199,200],"thead",{},[201,202,203,207],"tr",{},[204,205,206],"th",{},"Button",[204,208,209],{},"What you get",[211,212,213,246,272],"tbody",{},[201,214,215,221],{},[216,217,218],"td",{},[111,219,220],{},"CSV",[216,222,223,226,227,230,231,234,235,234,238,241,242,245],{},[176,224,225],{},"GET \u002Fapi\u002Fexport\u002Fcsv"," — one row per entry, for a spreadsheet. Columns: ",[176,228,229],{},"date, start, end, duration_h, name, task, project, client, tags, billable, rate, amount",". Honors the range and the billable filter; grouping does not apply. RFC 4180 quoting, and fields starting with ",[176,232,233],{},"=",", ",[176,236,237],{},"+",[176,239,240],{},"-"," or ",[176,243,244],{},"@"," are neutralized so nothing executes on open",[201,247,248,253],{},[216,249,250],{},[111,251,252],{},"Export PDF",[216,254,255,258,259,261,262,265,266,268,269],{},[176,256,257],{},"GET \u002Fapi\u002Fexport\u002Fpdf"," — a server-rendered A4 document: header with org name, range, billable filter and grouping; the four stat figures; an ",[111,260,158],{}," table (hours, billable, amount per day, with a Total); a ",[111,263,264],{},"Breakdown by …"," table matching the current grouping; page numbers. Honors range, billable filter ",[116,267,182],{}," grouping. No browser dialog, no headless Chrome — it is drawn with ",[176,270,271],{},"pdf-lib",[201,273,274,279],{},[216,275,276],{},[111,277,278],{},"Print",[216,280,281,284],{},[176,282,283],{},"window.print()"," over a print stylesheet that drops the sidebar, timer bar and controls and remaps the theme to a light palette. Use it when you want the page exactly as it looks, or your browser's own \"Save as PDF\"",[91,286,287,288,234,291,132],{},"Both downloads arrive as attachments with a dated filename — ",[176,289,290],{},"tick-export-2026-09-07--2026-09-13.csv",[176,292,293],{},"tick-report-2026-09-07_2026-09-13.pdf",[295,296,297],"note",{},[91,298,299],{},"The PDF's per-day billable and amount figures are computed fan-out-safe, so a tag-grouped PDF still shows correct daily totals even though its breakdown rows fan out as described above.",[86,301,303],{"id":302},"calendar","Calendar",[91,305,306,307,310,311,314,315,318,319,321],{},"The Calendar shows entries as blocks on a time grid — ",[111,308,309],{},"Week"," (7 columns, Monday start) or ",[111,312,313],{},"Day"," view, with ‹ ",[111,316,317],{},"Today"," › navigation. Narrow screens (under 1024px) open in ",[111,320,313],{}," view, since seven columns on a phone are unreadable; the segmented control still switches to Week if you want it. The base window is 7am–7pm; days with earlier or later entries extend the grid, and the body scrolls when it outgrows 12 hours. Each day header shows the weekday, the day number (accent ring on today) and that day's total; today gets a live \"now\" line.",[91,323,324,325,328,329,332,333,336,337,340,341,344,345,348],{},"Blocks carry the entry name and chain, with an accent edge when billable, plus a small ",[111,326,327],{},"play button"," on the right edge. Each ",[111,330,331],{},"running timer"," renders as a live block growing toward now — display-only until you stop it. Entries that overlap in time — two timers you ran together, or the entries they became once stopped — share the column ",[111,334,335],{},"side by side"," while each lane can still carry a name beside its play button: Day view, where a phone keeps three lanes and a desktop all ten. Where lanes would be too narrow (every overlap in Week view, whose columns are 100–160px wide), the whole group is drawn as ",[111,338,339],{},"one block listing its members by name",", with ",[176,342,343],{},"+N"," when they don't all fit. Click it for a list of the entries — full name, chain, time range — each with its own play button, so you always read which entry you are restarting; a running timer in the group shows its live clock and taps into the timer bar. A block with nothing beside it keeps the full width. An entry that ran ",[111,346,347],{},"past midnight"," is drawn on both days: a head on the day it started, cut off at the bottom with a dashed edge, and a tail from midnight on the next day, cut at the top. Both open the same entry; the head is the part you drag or resize, and the day header's total counts the whole entry on the day it started.",[100,350,352],{"id":351},"clicking-and-dragging","Clicking and dragging",[91,354,355,356,359,360,363],{},"Everything snaps to ",[111,357,358],{},"5 minutes",", and ",[176,361,362],{},"Esc"," cancels an in-progress drag:",[195,365,366,376],{},[198,367,368],{},[201,369,370,373],{},[204,371,372],{},"Gesture",[204,374,375],{},"Effect",[211,377,378,390,404,412,420,428],{},[201,379,380,383],{},[216,381,382],{},"Click a block (no drag)",[216,384,385,386,389],{},"Opens that entry in the ",[111,387,388],{},"edit dialog"," — the same one the Time page uses, with description, chain, billable, date, start\u002Fend and tags. Saving updates the entry in place",[201,391,392,398],{},[216,393,394,395],{},"Click the block's ",[111,396,397],{},"▶ play button",[216,399,400,403],{},[111,401,402],{},"Start again"," — copies name, reference and billable flag to the timer and starts it",[201,405,406,409],{},[216,407,408],{},"Drag on empty space",[216,410,411],{},"Draws a ghost block, then opens the new-entry dialog prefilled with that day and time range",[201,413,414,417],{},[216,415,416],{},"Drag a block",[216,418,419],{},"Moves it — across days too, in week view",[201,421,422,425],{},[216,423,424],{},"Drag a block's top\u002Fbottom edge",[216,426,427],{},"Resizes it (changes start or end)",[201,429,430,437],{},[216,431,432,433,436],{},"Click a ",[111,434,435],{},"folded"," block",[216,438,439],{},"Opens the list of entries it stands for, each with an edit row and its own ▶. Folded entries are moved or resized through the edit dialog — or in Day view, where they get lanes again",[91,441,442,443,446],{},"Where a block is drawn, its play button is always visible rather than hover-only, and it swallows the pointer press so tapping it never starts a drag. A folded block has no play button on its face — nothing there is legible enough to restart by — so its list carries one per entry. Starting a timer is deliberately the ",[116,444,445],{},"narrow"," target: a bare block surface that silently begins tracking is too easy to hit by accident, so the wide target does the reversible thing (open the editor) instead.",[91,448,449],{},"Moves and resizes commit optimistically and revert if the server rejects them; duration and amount always come back from the server, so rate resolution stays correct after an edit. Edits made through the dialog re-fetch the visible range when it closes, so a changed time or chain redraws immediately.",{"title":451,"searchDepth":452,"depth":452,"links":453},"",2,[454,460],{"id":88,"depth":452,"text":89,"children":455},[456,458,459],{"id":102,"depth":457,"text":103},3,{"id":144,"depth":457,"text":145},{"id":189,"depth":457,"text":190},{"id":302,"depth":452,"text":303,"children":461},[462],{"id":351,"depth":457,"text":352},"Aggregated reports with regroupable breakdowns, CSV export, and a drag-editable week calendar.","md",{},{"icon":33},{"title":30,"description":463},"m3_Bufz_cbqCcIqs3N6Ib_MRawOt7xlGL5a28bS92TM",[470,472],{"title":25,"path":26,"stem":27,"description":471,"icon":28,"children":-1},"The open-ended catalog, the three data rules that drive it, and the trash.",{"title":35,"path":36,"stem":37,"description":473,"icon":38,"children":-1},"Presets, palettes, radius, fonts and the starfield — everything applies live, per user.",1790777312388]