@bendyline/gilde 0.1.94 → 0.2.0

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.
Files changed (209) hide show
  1. package/data/craftbook-templates/ab/ab-test-readout/manifest.json +4 -0
  2. package/data/craftbook-templates/al/album-curate/manifest.json +4 -0
  3. package/data/craftbook-templates/an/anniversary-cut/manifest.json +4 -0
  4. package/data/craftbook-templates/an/annotated-bibliography/manifest.json +4 -0
  5. package/data/craftbook-templates/an/annual-document-review/manifest.json +4 -0
  6. package/data/craftbook-templates/an/anomaly-scan/manifest.json +3 -0
  7. package/data/craftbook-templates/au/audio-ad-spot/manifest.json +4 -0
  8. package/data/craftbook-templates/bo/board-deck/manifest.json +3 -0
  9. package/data/craftbook-templates/bo/board-game-web/manifest.json +4 -0
  10. package/data/craftbook-templates/br/branding-website/manifest.json +4 -0
  11. package/data/craftbook-templates/br/broadcast-announcement/manifest.json +4 -0
  12. package/data/craftbook-templates/ca/calendar-brief/manifest.json +3 -0
  13. package/data/craftbook-templates/ch/chapter-weave/manifest.json +4 -0
  14. package/data/craftbook-templates/ch/chart-pack/manifest.json +3 -0
  15. package/data/craftbook-templates/co/codebase-ux-review/manifest.json +3 -0
  16. package/data/craftbook-templates/co/cohort-analysis/manifest.json +3 -0
  17. package/data/craftbook-templates/co/company-research-brief/manifest.json +4 -0
  18. package/data/craftbook-templates/co/compat-check/manifest.json +4 -0
  19. package/data/craftbook-templates/co/competitive-analysis/manifest.json +4 -0
  20. package/data/craftbook-templates/co/content-accuracy-review/manifest.json +4 -0
  21. package/data/craftbook-templates/co/content-deck/manifest.json +4 -0
  22. package/data/craftbook-templates/co/contract-template/manifest.json +4 -0
  23. package/data/craftbook-templates/co/corpus-email-digest/manifest.json +3 -0
  24. package/data/craftbook-templates/co/cover-letter/manifest.json +3 -0
  25. package/data/craftbook-templates/cr/crm-update-batch/manifest.json +3 -0
  26. package/data/craftbook-templates/cr/crossword-forge/manifest.json +4 -0
  27. package/data/craftbook-templates/cs/csv-transformer/manifest.json +3 -0
  28. package/data/craftbook-templates/da/dashboard-spec/manifest.json +4 -0
  29. package/data/craftbook-templates/da/data-dictionary/manifest.json +3 -0
  30. package/data/craftbook-templates/da/data-export-migrate/manifest.json +4 -0
  31. package/data/craftbook-templates/da/data-join-merge/manifest.json +3 -0
  32. package/data/craftbook-templates/da/data-quality-audit/manifest.json +3 -0
  33. package/data/craftbook-templates/da/data-to-report/manifest.json +4 -0
  34. package/data/craftbook-templates/da/data-viz-page/manifest.json +4 -0
  35. package/data/craftbook-templates/da/dataset-clean/manifest.json +3 -0
  36. package/data/craftbook-templates/de/design-review/manifest.json +4 -0
  37. package/data/craftbook-templates/de/design-system-consultation/manifest.json +4 -0
  38. package/data/craftbook-templates/di/diagram-from-text/manifest.json +4 -0
  39. package/data/craftbook-templates/dr/drive-wrap-up/manifest.json +4 -0
  40. package/data/craftbook-templates/du/due-diligence-brief/manifest.json +4 -0
  41. package/data/craftbook-templates/en/engineering-retrospective/manifest.json +4 -0
  42. package/data/craftbook-templates/ex/expense-categorize/manifest.json +4 -0
  43. package/data/craftbook-templates/ex/explain-code-folder/manifest.json +26 -0
  44. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/craftbook.json +233 -0
  45. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/README.md +29 -0
  46. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/package.json +17 -0
  47. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/src/format.js +15 -0
  48. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/src/index.js +50 -0
  49. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/src/store.js +45 -0
  50. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/test/store.test.js +61 -0
  51. package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/test.json +106 -0
  52. package/data/craftbook-templates/fa/family-story-chapter/manifest.json +4 -0
  53. package/data/craftbook-templates/fo/forecast-model/manifest.json +4 -0
  54. package/data/craftbook-templates/ga/game-with-screens/manifest.json +4 -0
  55. package/data/craftbook-templates/gl/glossary-build/manifest.json +3 -0
  56. package/data/craftbook-templates/ha/handbook-section/manifest.json +3 -0
  57. package/data/craftbook-templates/he/hero-image/manifest.json +4 -0
  58. package/data/craftbook-templates/ht/html-arcade-game/manifest.json +4 -0
  59. package/data/craftbook-templates/ht/html-puzzle-game/manifest.json +4 -0
  60. package/data/craftbook-templates/id/idle-clicker-game/manifest.json +4 -0
  61. package/data/craftbook-templates/in/inbox-triage/manifest.json +3 -0
  62. package/data/craftbook-templates/in/insurance-inventory/manifest.json +4 -0
  63. package/data/craftbook-templates/in/interactive-quiz/manifest.json +3 -0
  64. package/data/craftbook-templates/in/invoice-generator/manifest.json +3 -0
  65. package/data/craftbook-templates/in/invoice-run/manifest.json +3 -0
  66. package/data/craftbook-templates/index.json +1 -1
  67. package/data/craftbook-templates/ju/juice-pass/manifest.json +4 -0
  68. package/data/craftbook-templates/kp/kpi-scorecard/manifest.json +4 -0
  69. package/data/craftbook-templates/la/landing-page/manifest.json +4 -0
  70. package/data/craftbook-templates/le/lead-enrichment/manifest.json +4 -0
  71. package/data/craftbook-templates/li/literature-review/manifest.json +4 -0
  72. package/data/craftbook-templates/lo/logo-set/manifest.json +4 -0
  73. package/data/craftbook-templates/ma/market-scan/manifest.json +4 -0
  74. package/data/craftbook-templates/me/meeting-minutes/manifest.json +3 -0
  75. package/data/craftbook-templates/me/meeting-notes-to-actions/manifest.json +3 -0
  76. package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.1.2/craftbook.json +255 -0
  77. package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.1.2/samples/team-sync/notes.md +47 -0
  78. package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.1.2/test.json +78 -0
  79. package/data/craftbook-templates/me/meeting-prep-brief/manifest.json +3 -0
  80. package/data/craftbook-templates/me/meeting-summary-audio/manifest.json +3 -0
  81. package/data/craftbook-templates/me/memory-prompt-session/manifest.json +3 -0
  82. package/data/craftbook-templates/mi/micro-game-jam/manifest.json +4 -0
  83. package/data/craftbook-templates/mo/mock-interview/manifest.json +3 -0
  84. package/data/craftbook-templates/mo/mod-scaffold/manifest.json +4 -0
  85. package/data/craftbook-templates/mo/month-close/manifest.json +3 -0
  86. package/data/craftbook-templates/mo/monthly-recording-review/manifest.json +3 -0
  87. package/data/craftbook-templates/oc/ocr-extract/manifest.json +4 -0
  88. package/data/craftbook-templates/of/offer-compare/manifest.json +3 -0
  89. package/data/craftbook-templates/on/one-pager/manifest.json +4 -0
  90. package/data/craftbook-templates/ph/photo-cull/manifest.json +4 -0
  91. package/data/craftbook-templates/ph/photo-library-nightly/manifest.json +4 -0
  92. package/data/craftbook-templates/ph/physics-toy/manifest.json +4 -0
  93. package/data/craftbook-templates/pi/pitch-deck/manifest.json +4 -0
  94. package/data/craftbook-templates/pl/playtest-report/manifest.json +4 -0
  95. package/data/craftbook-templates/po/powerpoint-deck/manifest.json +4 -0
  96. package/data/craftbook-templates/pr/practice-exam/manifest.json +3 -0
  97. package/data/craftbook-templates/pr/practice-session/manifest.json +3 -0
  98. package/data/craftbook-templates/pr/price-tracker/manifest.json +4 -0
  99. package/data/craftbook-templates/pr/proposal-sow/manifest.json +3 -0
  100. package/data/craftbook-templates/pu/puzzle-pack-layout/manifest.json +4 -0
  101. package/data/craftbook-templates/qu/quarterly-summary/manifest.json +4 -0
  102. package/data/craftbook-templates/raw-index.json +1 -1
  103. package/data/craftbook-templates/re/reading-list/manifest.json +3 -0
  104. package/data/craftbook-templates/re/receipt-intake/manifest.json +4 -0
  105. package/data/craftbook-templates/re/receipt-ocr-ledger/manifest.json +3 -0
  106. package/data/craftbook-templates/re/recurring-invoice-run/manifest.json +3 -0
  107. package/data/craftbook-templates/re/release-announcement/manifest.json +4 -0
  108. package/data/craftbook-templates/re/resume-cv/manifest.json +3 -0
  109. package/data/craftbook-templates/re/review-code-folder/manifest.json +25 -0
  110. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/craftbook.json +223 -0
  111. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/README.md +29 -0
  112. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/package.json +17 -0
  113. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/src/format.js +15 -0
  114. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/src/index.js +50 -0
  115. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/src/store.js +44 -0
  116. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/test/store.test.js +37 -0
  117. package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/test.json +108 -0
  118. package/data/craftbook-templates/sc/scrape-to-structured/manifest.json +3 -0
  119. package/data/craftbook-templates/sp/spa-dashboard/manifest.json +4 -0
  120. package/data/craftbook-templates/sp/spreadsheet-findings/manifest.json +26 -0
  121. package/data/craftbook-templates/sp/spreadsheet-findings/versions/1.0.0/craftbook.json +186 -0
  122. package/data/craftbook-templates/sp/spreadsheet-findings/versions/1.0.0/samples/shop-sales/sales.csv +49 -0
  123. package/data/craftbook-templates/sp/spreadsheet-findings/versions/1.0.0/test.json +88 -0
  124. package/data/craftbook-templates/sp/spreadsheet-model/manifest.json +4 -0
  125. package/data/craftbook-templates/sp/sprite-sheet/manifest.json +4 -0
  126. package/data/craftbook-templates/sq/sql-analysis/manifest.json +3 -0
  127. package/data/craftbook-templates/st/standup-summary/manifest.json +3 -0
  128. package/data/craftbook-templates/st/status-report/manifest.json +3 -0
  129. package/data/craftbook-templates/su/subscription-audit/manifest.json +4 -0
  130. package/data/craftbook-templates/su/survey-analysis/manifest.json +4 -0
  131. package/data/craftbook-templates/ta/tailor-resume/manifest.json +3 -0
  132. package/data/craftbook-templates/ti/tidy-spreadsheet/manifest.json +26 -0
  133. package/data/craftbook-templates/ti/tidy-spreadsheet/versions/1.0.0/craftbook.json +183 -0
  134. package/data/craftbook-templates/ti/tidy-spreadsheet/versions/1.0.0/samples/club-members/members.csv +43 -0
  135. package/data/craftbook-templates/ti/tidy-spreadsheet/versions/1.0.0/test.json +108 -0
  136. package/data/craftbook-templates/ti/tileset-batch/manifest.json +4 -0
  137. package/data/craftbook-templates/to/topic-explainer/manifest.json +4 -0
  138. package/data/craftbook-templates/tr/transcribe-audio/manifest.json +4 -0
  139. package/data/craftbook-templates/tr/transcribe-index/manifest.json +4 -0
  140. package/data/craftbook-templates/vi/visit-prep/manifest.json +4 -0
  141. package/data/craftbook-templates/we/weak-spot-drill/manifest.json +3 -0
  142. package/data/craftbook-templates/we/week-plan/manifest.json +3 -0
  143. package/data/craftbook-templates/we/weekly-pipeline-review/manifest.json +3 -0
  144. package/data/craftbook-templates/we/weekly-review/manifest.json +3 -0
  145. package/data/craftbook-templates/ye/year-in-review/manifest.json +4 -0
  146. package/data/image-models/an/animagine-xl-4/versions/4.0.1/manifest.json +16 -0
  147. package/data/image-models/fl/flux-2-klein-4b-q4/versions/1.0.1/manifest.json +29 -0
  148. package/data/image-models/index.json +1 -1
  149. package/data/image-models/ir/iris-3b-f32/manifest.json +39 -0
  150. package/data/image-models/ir/iris-3b-f32/versions/1.0.0/manifest.json +19 -0
  151. package/data/image-models/ir/iris-3b-f32/versions/1.0.1/manifest.json +25 -0
  152. package/data/image-models/kr/krea-2-turbo-q4/versions/1.0.1/manifest.json +29 -0
  153. package/data/image-models/kr/krea-2-turbo-q6/versions/1.0.1/manifest.json +29 -0
  154. package/data/image-models/kr/krea-2-turbo-q8/versions/1.0.1/manifest.json +29 -0
  155. package/data/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.1/manifest.json +50 -0
  156. package/data/image-models/raw-index.json +1 -1
  157. package/data/image-models/sd/sd-1.5/versions/1.0.1/manifest.json +16 -0
  158. package/data/image-models/sd/sd-turbo/versions/1.0.1/manifest.json +16 -0
  159. package/data/image-models/sd/sdxl-base-1.0/versions/1.0.1/manifest.json +16 -0
  160. package/data/image-models/sd/sdxl-lightning-4step/versions/1.0.1/manifest.json +16 -0
  161. package/data/image-models/sd/sdxl-turbo/versions/1.0.1/manifest.json +16 -0
  162. package/data/project-types/ca/caregiving-binder/manifest.json +4 -0
  163. package/data/project-types/de/design-scheme/manifest.json +4 -0
  164. package/data/project-types/fi/fitness-coach/manifest.json +4 -0
  165. package/data/project-types/fr/freelance-office/manifest.json +3 -0
  166. package/data/project-types/fu/fundraiser-hq/manifest.json +4 -0
  167. package/data/project-types/ho/household-budget/manifest.json +3 -0
  168. package/data/project-types/index.json +1 -1
  169. package/data/project-types/jo/job-hunt/manifest.json +4 -0
  170. package/data/project-types/jo/job-hunt/versions/1.0.3/about.md +10 -0
  171. package/data/project-types/jo/job-hunt/versions/1.0.3/activity.json +4 -0
  172. package/data/project-types/jo/job-hunt/versions/1.0.3/manifest.json +212 -0
  173. package/data/project-types/jo/job-hunt/versions/1.0.3/mission.md +9 -0
  174. package/data/project-types/jo/job-hunt/versions/1.0.3/pages/dashboard/index.html +430 -0
  175. package/data/project-types/jo/job-hunt/versions/1.0.3/pipeline.json +6 -0
  176. package/data/project-types/li/life-binder/manifest.json +4 -0
  177. package/data/project-types/raw-index.json +1 -1
  178. package/data/project-types/so/social-feed/manifest.json +3 -0
  179. package/data/project-types/tr/trip-planner/versions/1.0.3/about.md +7 -0
  180. package/data/project-types/tr/trip-planner/versions/1.0.3/journal.json +4 -0
  181. package/data/project-types/tr/trip-planner/versions/1.0.3/manifest.json +226 -0
  182. package/data/project-types/tr/trip-planner/versions/1.0.3/mission.md +4 -0
  183. package/data/project-types/tr/trip-planner/versions/1.0.3/packing.json +8 -0
  184. package/data/project-types/tr/trip-planner/versions/1.0.3/pages/dashboard/index.html +368 -0
  185. package/data/project-types/tr/trip-planner/versions/1.0.3/trip.json +8 -0
  186. package/data/toolsets/do/docblocks/versions/2.7.0/manifest.json +95 -0
  187. package/data/toolsets/index.json +1 -1
  188. package/data/toolsets/raw-index.json +1 -1
  189. package/data/video-models/index.json +1 -1
  190. package/data/video-models/lt/ltx-2-19b/versions/1.0.1/manifest.json +375 -0
  191. package/data/video-models/lt/ltx-2.3-22b/versions/1.0.1/manifest.json +377 -0
  192. package/data/video-models/lt/ltx-2.3-22b-distilled/versions/1.0.1/manifest.json +377 -0
  193. package/data/video-models/lt/ltx-video-0.9.7-dev/versions/1.0.1/manifest.json +195 -0
  194. package/data/video-models/lt/ltx-video-0.9.8-13b-distilled/versions/1.0.1/manifest.json +190 -0
  195. package/data/video-models/raw-index.json +1 -1
  196. package/data/video-models/wa/wan2.2-ti2v-5b/versions/1.0.1/manifest.json +168 -0
  197. package/package.json +2 -1
  198. package/schemas/craftbook-doc.schema.json +35 -0
  199. package/schemas/craftbook-template-identity.schema.json +18 -0
  200. package/schemas/craftbook-template-version.schema.json +35 -0
  201. package/schemas/image-model-identity.schema.json +0 -2
  202. package/schemas/image-model-version.schema.json +50 -0
  203. package/schemas/project-type-identity.schema.json +18 -0
  204. package/schemas/video-model-identity.schema.json +0 -2
  205. package/schemas/video-model-version.schema.json +25 -0
  206. package/data/image-models/fl/flux-1-dev-q4/manifest.json +0 -38
  207. package/data/image-models/fl/flux-1-dev-q4/versions/1.0.0/manifest.json +0 -29
  208. package/data/image-models/fl/flux-1-schnell-q4/manifest.json +0 -39
  209. package/data/image-models/fl/flux-1-schnell-q4/versions/1.0.0/manifest.json +0 -29
@@ -0,0 +1,430 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="gezel-demo" content="standalone" />
7
+ <title>Job hunt pipeline</title>
8
+ <style>
9
+ :root {
10
+ color-scheme: light dark;
11
+ --bg: #faf7f2;
12
+ --card: #fff;
13
+ --ink: #2b2620;
14
+ --muted: #7a7166;
15
+ --accent: #b5651d;
16
+ --track: #ece5da;
17
+ --good: #4a7c59;
18
+ --warn: #a4552e;
19
+ }
20
+ :root[data-theme='dark'] {
21
+ --bg: #1c1a17;
22
+ --card: #262320;
23
+ --ink: #efe9e0;
24
+ --muted: #a59a8c;
25
+ --accent: #e0894a;
26
+ --track: #3a352f;
27
+ --good: #7fae8d;
28
+ --warn: #d98a63;
29
+ }
30
+ @media (prefers-color-scheme: dark) {
31
+ :root:not([data-theme='light']) {
32
+ --bg: #1c1a17;
33
+ --card: #262320;
34
+ --ink: #efe9e0;
35
+ --muted: #a59a8c;
36
+ --accent: #e0894a;
37
+ --track: #3a352f;
38
+ --good: #7fae8d;
39
+ --warn: #d98a63;
40
+ }
41
+ }
42
+ * { box-sizing: border-box; }
43
+ body {
44
+ margin: 0;
45
+ font: 15px/1.5 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
46
+ background: var(--bg);
47
+ color: var(--ink);
48
+ padding: 1.5rem 1.25rem 2rem;
49
+ }
50
+ main { max-width: 960px; margin: 0 auto; }
51
+ h1 {
52
+ font-family: Georgia, 'PT Serif', 'Times New Roman', serif;
53
+ font-size: 1.4rem;
54
+ font-weight: 600;
55
+ margin: 0 0 0.15rem;
56
+ }
57
+ .sub { color: var(--muted); margin: 0 0 1.25rem; font-size: 0.9rem; }
58
+ .tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.6rem; margin-bottom: 1.25rem; }
59
+ .tile {
60
+ background: var(--card);
61
+ border: 1px solid var(--track);
62
+ border-radius: 10px;
63
+ padding: 0.7rem 0.85rem;
64
+ }
65
+ .tile .n { font-size: 1.5rem; font-weight: 700; color: var(--accent); line-height: 1.2; }
66
+ .tile .l { font-size: 0.72rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.05em; }
67
+ .board { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0.6rem; margin-bottom: 1.25rem; }
68
+ .col { min-width: 0; }
69
+ .col h2 {
70
+ font-size: 0.72rem;
71
+ text-transform: uppercase;
72
+ letter-spacing: 0.05em;
73
+ color: var(--muted);
74
+ margin: 0 0 0.4rem;
75
+ font-weight: 600;
76
+ display: flex;
77
+ justify-content: space-between;
78
+ align-items: baseline;
79
+ }
80
+ .col h2 .count { color: var(--ink); }
81
+ .card {
82
+ background: var(--card);
83
+ border: 1px solid var(--track);
84
+ border-radius: 6px;
85
+ padding: 0.5rem 0.6rem;
86
+ margin-bottom: 0.45rem;
87
+ font-size: 0.85rem;
88
+ }
89
+ .card .co { font-weight: 600; overflow-wrap: anywhere; }
90
+ .card .ro { color: var(--muted); font-size: 0.8rem; overflow-wrap: anywhere; }
91
+ .card .ft { margin-top: 0.3rem; display: flex; gap: 0.35rem; flex-wrap: wrap; align-items: center; color: var(--muted); font-size: 0.72rem; }
92
+ .chip {
93
+ display: inline-block;
94
+ border: 1px solid var(--track);
95
+ border-radius: 4px;
96
+ padding: 0 0.3rem;
97
+ font-size: 0.7rem;
98
+ line-height: 1.4;
99
+ }
100
+ .chip.stale { color: var(--warn); border-color: var(--warn); }
101
+ .chip.signed { color: var(--good); border-color: var(--good); }
102
+ .panels { display: grid; grid-template-columns: 1fr 1fr; gap: 0.6rem; }
103
+ .panel {
104
+ background: var(--card);
105
+ border: 1px solid var(--track);
106
+ border-radius: 10px;
107
+ padding: 0.85rem 1rem;
108
+ }
109
+ .panel h2 { font-size: 0.9rem; margin: 0 0 0.5rem; }
110
+ .panel ul { margin: 0; padding-left: 1.05rem; font-size: 0.85rem; }
111
+ .panel li { margin: 0.25rem 0; }
112
+ .panel .when { color: var(--muted); font-size: 0.78rem; }
113
+ .overdue { color: var(--warn); font-weight: 600; }
114
+ .empty { color: var(--muted); font-style: italic; }
115
+ .board-empty {
116
+ background: var(--card);
117
+ border: 1px dashed var(--track);
118
+ border-radius: 10px;
119
+ padding: 0.85rem 1.25rem;
120
+ text-align: center;
121
+ color: var(--muted);
122
+ margin-bottom: 0.75rem;
123
+ }
124
+ @media (max-width: 720px) {
125
+ .tiles { grid-template-columns: repeat(2, 1fr); }
126
+ .board { grid-template-columns: 1fr; }
127
+ .panels { grid-template-columns: 1fr; }
128
+ }
129
+ .demo-banner {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: space-between;
133
+ gap: 0.75rem;
134
+ margin: 0 0 0.85rem;
135
+ padding: 0.5rem 0.65rem;
136
+ border: 1px solid var(--accent);
137
+ border-radius: 6px;
138
+ background: color-mix(in srgb, var(--card) 88%, var(--accent));
139
+ color: var(--ink);
140
+ font-size: 0.8rem;
141
+ }
142
+ .demo-banner[hidden] { display: none; }
143
+ .demo-banner strong { font-weight: 700; }
144
+ .demo-reset {
145
+ flex: none;
146
+ padding: 0.25rem 0.5rem;
147
+ border: 1px solid var(--accent);
148
+ border-radius: 6px;
149
+ background: var(--card);
150
+ color: var(--ink);
151
+ cursor: pointer;
152
+ font: inherit;
153
+ }
154
+ .demo-reset:hover { border-color: var(--ink); }
155
+ </style>
156
+ </head>
157
+ <body>
158
+ <main>
159
+ <div class="demo-banner" data-gezel-demo-banner hidden>
160
+ <span><strong>Demo mode</strong> — sample data stays in this page.</span>
161
+ <button type="button" class="demo-reset" onclick="location.reload()">Reset demo</button>
162
+ </div>
163
+ <h1 id="title">Job hunt</h1>
164
+ <p class="sub" id="sub">Loading the pipeline…</p>
165
+ <div class="tiles">
166
+ <div class="tile"><div class="n" id="t-play">—</div><div class="l">In play</div></div>
167
+ <div class="tile"><div class="n" id="t-interview">—</div><div class="l">Interviewing</div></div>
168
+ <div class="tile"><div class="n" id="t-offer">—</div><div class="l">Offers</div></div>
169
+ <div class="tile"><div class="n" id="t-follow">—</div><div class="l">Follow-ups this week</div></div>
170
+ </div>
171
+ <div class="board-empty" id="board-empty" hidden>
172
+ No applications yet — tell your Loopbaancoach about the first one.
173
+ </div>
174
+ <div class="board" id="board"></div>
175
+ <div class="panels">
176
+ <div class="panel">
177
+ <h2>This week</h2>
178
+ <ul id="week"><li class="empty">Nothing due — nice and current.</li></ul>
179
+ </div>
180
+ <div class="panel">
181
+ <h2>Recent activity</h2>
182
+ <ul id="activity"><li class="empty">No activity yet.</li></ul>
183
+ </div>
184
+ </div>
185
+ </main>
186
+ <script>
187
+ /* gezel-page-demo-stub v1 */
188
+ /*
189
+ * The canonical demo stub for Gezel type pages. MIT License.
190
+ *
191
+ * Paste this file's bytes verbatim into a <script> block ahead of the
192
+ * page's own code, then call makeDemoGezel({ page, tools, data }) with the
193
+ * page's demo handlers. Served by Gezel, the real window.gezel is already
194
+ * injected and the stub steps aside; opened as a raw file (the live demos
195
+ * on gezelgilde.com), it installs a window.gezel whose tools and data are
196
+ * the page-supplied handler maps — one code path in every mode. `tools`
197
+ * and `data` map a tool name / declared read path to a function; data
198
+ * handlers back read() and list(), and url() returns the handler's value
199
+ * or passes a data: URI through. See docs/page-authoring.md.
200
+ */
201
+ (function () {
202
+ 'use strict';
203
+ window.makeDemoGezel = function (opts) {
204
+ if (window.gezel) return window.gezel;
205
+ var page = (opts && opts.page) || {};
206
+ var tools = (opts && opts.tools) || {};
207
+ var data = (opts && opts.data) || {};
208
+ var themeListeners = [];
209
+ var media = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
210
+ var ui = {
211
+ theme: { mode: media && media.matches ? 'dark' : 'light' },
212
+ onTheme: function (cb) {
213
+ themeListeners.push(cb);
214
+ return function () {
215
+ var at = themeListeners.indexOf(cb);
216
+ if (at >= 0) themeListeners.splice(at, 1);
217
+ };
218
+ },
219
+ };
220
+ if (media && media.addEventListener) {
221
+ media.addEventListener('change', function (ev) {
222
+ ui.theme = { mode: ev.matches ? 'dark' : 'light' };
223
+ themeListeners.slice().forEach(function (cb) { cb(ui.theme); });
224
+ });
225
+ }
226
+ function fail(code, message) {
227
+ var err = new Error(message);
228
+ err.code = code;
229
+ return Promise.reject(err);
230
+ }
231
+ function run(map, key, arg) {
232
+ if (!Object.prototype.hasOwnProperty.call(map, key)) return null;
233
+ return Promise.resolve().then(function () { return map[key](arg); });
234
+ }
235
+ window.gezel = {
236
+ page: {
237
+ api: 1,
238
+ projectId: 'demo',
239
+ source: 'type',
240
+ entry: page.entry || 'index.html',
241
+ typeName: page.typeName || 'demo',
242
+ params: page.params || {},
243
+ mode: 'demo',
244
+ },
245
+ tools: {
246
+ list: function () { return Promise.resolve(Object.keys(tools)); },
247
+ invoke: function (name, input) {
248
+ var call = run(tools, name, input || {});
249
+ if (!call) return fail('not-allowed', "The demo does not handle the tool '" + name + "'.");
250
+ return call.then(function (output) { return { output: output }; });
251
+ },
252
+ },
253
+ data: {
254
+ read: function (path, o) {
255
+ return run(data, path, o || {}) || fail('not-allowed', "The demo has no data for '" + path + "'.");
256
+ },
257
+ list: function (path, o) {
258
+ return run(data, path, o || {}) || Promise.resolve([]);
259
+ },
260
+ watch: function () { return function () {}; },
261
+ url: function (path) {
262
+ if (Object.prototype.hasOwnProperty.call(data, path)) return String(data[path]({}));
263
+ return typeof path === 'string' && path.indexOf('data:') === 0 ? path : '';
264
+ },
265
+ },
266
+ ui: ui,
267
+ refresh: function () {},
268
+ };
269
+ return window.gezel;
270
+ };
271
+ })();
272
+ </script>
273
+ <script>
274
+ // Reads the pipeline and activity records through window.gezel (both
275
+ // paths are declared in the manifest's pages.reads).
276
+ (function () {
277
+ 'use strict';
278
+ var WEEK = 7 * 24 * 60 * 60 * 1000;
279
+ var DAY = 24 * 60 * 60 * 1000;
280
+ var FALLBACK_STAGES = ['applied', 'screening', 'interview', 'offer', 'closed'];
281
+
282
+ // ── demo pipeline (used only when the page opens as a raw file) ──
283
+ var demoPipeline = {
284
+ role: 'Product designer',
285
+ stages: FALLBACK_STAGES,
286
+ records: [
287
+ { id: 'app-12', status: 'applied', updatedAt: new Date(Date.now() - 3 * DAY).toISOString(), fields: { company: 'Canal Labs', role: 'Senior Product Designer' }, history: [{ at: new Date(Date.now() - 3 * DAY).toISOString() }] },
288
+ { id: 'app-11', status: 'screening', updatedAt: new Date(Date.now() - 9 * DAY).toISOString(), fields: { company: 'Northwind', role: 'Product Designer' }, history: [{ at: new Date(Date.now() - 9 * DAY).toISOString() }] },
289
+ { id: 'app-10', status: 'interview', updatedAt: new Date(Date.now() - DAY).toISOString(), fields: { company: 'Veld Works', role: 'Staff Product Designer' }, history: [{ at: new Date(Date.now() - 5 * DAY).toISOString() }] },
290
+ { id: 'app-09', status: 'offer', updatedAt: new Date().toISOString(), fields: { company: 'Juniper Press', role: 'Design Lead' }, history: [{ at: new Date().toISOString() }] },
291
+ { id: 'app-08', status: 'closed', updatedAt: new Date(Date.now() - 12 * DAY).toISOString(), fields: { company: 'Old Mill', role: 'Product Designer', outcome: 'withdrew' }, history: [{ at: new Date(Date.now() - 12 * DAY).toISOString() }] },
292
+ ],
293
+ };
294
+ var demoActivity = { events: [
295
+ { kind: 'note', at: new Date(Date.now() - 2 * DAY).toISOString(), note: 'Prepared portfolio stories for Veld Works.' },
296
+ { kind: 'follow-up', at: new Date(Date.now() - DAY).toISOString(), note: 'Send Northwind a short follow-up', data: { dueAt: new Date(Date.now() + DAY).toISOString() } },
297
+ { kind: 'interview', at: new Date().toISOString(), note: 'Juniper Press final conversation completed.' },
298
+ ] };
299
+
300
+ makeDemoGezel({
301
+ page: { entry: 'dashboard/index.html', typeName: 'Job Hunt', params: { role: 'Software Engineer', focus: 'Just getting started.' } },
302
+ data: {
303
+ 'pipeline.json': function () { return demoPipeline; },
304
+ 'activity.json': function () { return demoActivity; },
305
+ },
306
+ });
307
+
308
+ // ── one code path from here: window.gezel exists in every mode ──
309
+ var demoMode = gezel.page.mode === 'demo';
310
+
311
+ function applyTheme(mode) {
312
+ document.documentElement.setAttribute('data-theme', mode === 'dark' ? 'dark' : 'light');
313
+ }
314
+ applyTheme(gezel.ui.theme.mode);
315
+ gezel.ui.onTheme(function (theme) { applyTheme(theme.mode); });
316
+
317
+ if (demoMode) document.querySelector('[data-gezel-demo-banner]').hidden = false;
318
+
319
+ function esc(s) {
320
+ return String(s).replace(/[&<>"]/g, function (c) {
321
+ return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c];
322
+ });
323
+ }
324
+ function cap(s) { return s.charAt(0).toUpperCase() + s.slice(1); }
325
+ function daysAgo(iso) { return Math.floor((Date.now() - Date.parse(iso)) / DAY); }
326
+
327
+ function render(pipeline, act) {
328
+ var stages = Array.isArray(pipeline.stages) && pipeline.stages.length ? pipeline.stages : FALLBACK_STAGES;
329
+ var records = Array.isArray(pipeline.records) ? pipeline.records : [];
330
+ var events = Array.isArray(act.events) ? act.events : [];
331
+ var now = Date.now();
332
+
333
+ if (pipeline.role) document.getElementById('title').textContent = 'Job hunt: ' + pipeline.role;
334
+
335
+ var inPlay = records.filter(function (r) { return r.status !== 'closed'; });
336
+ var followUps = events.filter(function (e) {
337
+ var due = e.data && typeof e.data.dueAt === 'string' ? Date.parse(e.data.dueAt) : null;
338
+ return e.kind === 'follow-up' && due !== null && due <= now + WEEK;
339
+ });
340
+ document.getElementById('t-play').textContent = inPlay.length;
341
+ document.getElementById('t-interview').textContent = records.filter(function (r) { return r.status === 'interview'; }).length;
342
+ document.getElementById('t-offer').textContent = records.filter(function (r) { return r.status === 'offer'; }).length;
343
+ document.getElementById('t-follow').textContent = followUps.length;
344
+ document.getElementById('sub').textContent =
345
+ inPlay.length + ' in play · ' + followUps.length + ' follow-up' + (followUps.length === 1 ? '' : 's') + ' this week';
346
+
347
+ // The stage columns always render — even empty, the board teaches
348
+ // the shape of the campaign. The empty-state line sits above it.
349
+ document.getElementById('board-empty').hidden = records.length > 0;
350
+ var board = document.getElementById('board');
351
+ board.innerHTML = stages
352
+ .map(function (stage) {
353
+ var here = records.filter(function (r) { return r.status === stage; });
354
+ var cards = here
355
+ .map(function (r) {
356
+ var f = r.fields || {};
357
+ var chips = '';
358
+ var last = (r.history && r.history[r.history.length - 1]) || null;
359
+ var inStage = last ? daysAgo(last.at) : null;
360
+ if (stage !== 'closed' && daysAgo(r.updatedAt) > 7) {
361
+ chips += '<span class="chip stale">stale</span>';
362
+ }
363
+ if (stage === 'closed' && f.outcome) {
364
+ chips += '<span class="chip ' + (f.outcome === 'signed' ? 'signed' : '') + '">' + esc(f.outcome) + '</span>';
365
+ }
366
+ return (
367
+ '<div class="card"><div class="co">' + esc(f.company || r.id) + '</div>' +
368
+ (f.role ? '<div class="ro">' + esc(f.role) + '</div>' : '') +
369
+ '<div class="ft">' + (inStage !== null ? '<span>' + inStage + 'd in stage</span>' : '') + chips + '</div></div>'
370
+ );
371
+ })
372
+ .join('');
373
+ return (
374
+ '<div class="col"><h2><span>' + esc(cap(stage)) + '</span><span class="count">' + here.length + '</span></h2>' + cards + '</div>'
375
+ );
376
+ })
377
+ .join('');
378
+
379
+ var week = document.getElementById('week');
380
+ var weekItems = [];
381
+ followUps
382
+ .slice()
383
+ .sort(function (a, b) { return Date.parse(a.data.dueAt) - Date.parse(b.data.dueAt); })
384
+ .forEach(function (e) {
385
+ var overdue = Date.parse(e.data.dueAt) < now;
386
+ weekItems.push(
387
+ '<li>' + (overdue ? '<span class="overdue">Overdue:</span> ' : '') + esc(e.note || 'Follow up') +
388
+ ' <span class="when">(' + esc(String(e.data.dueAt).slice(0, 10)) + ')</span></li>',
389
+ );
390
+ });
391
+ inPlay.forEach(function (r) {
392
+ var quiet = daysAgo(r.updatedAt);
393
+ if (quiet > 7) {
394
+ weekItems.push(
395
+ '<li>' + esc((r.fields && r.fields.company) || r.id) + ' <span class="when">— no touch in ' + quiet + ' days</span></li>',
396
+ );
397
+ }
398
+ });
399
+ week.innerHTML = weekItems.length ? weekItems.join('') : '<li class="empty">Nothing due — nice and current.</li>';
400
+
401
+ var activityList = document.getElementById('activity');
402
+ var recent = events.slice(-6).reverse();
403
+ if (recent.length) {
404
+ activityList.innerHTML = recent
405
+ .map(function (e) {
406
+ return '<li>' + esc(e.note || e.kind) + ' <span class="when">(' + esc(String(e.at).slice(0, 10)) + ')</span></li>';
407
+ })
408
+ .join('');
409
+ }
410
+ }
411
+
412
+ function loadPipeline() {
413
+ return Promise.all([
414
+ gezel.data.read('pipeline.json'),
415
+ gezel.data.read('activity.json').catch(function () { return { events: [] }; }),
416
+ ])
417
+ .then(function (results) { render(results[0] || {}, results[1] || { events: [] }); })
418
+ .catch(function () {
419
+ document.getElementById('sub').textContent =
420
+ 'No pipeline yet — tell your Loopbaancoach about your first application.';
421
+ });
422
+ }
423
+
424
+ loadPipeline();
425
+ gezel.data.watch('pipeline.json', function () { loadPipeline(); });
426
+ gezel.data.watch('activity.json', function () { loadPipeline(); });
427
+ })();
428
+ </script>
429
+ </body>
430
+ </html>
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 1,
3
+ "role": "{{role}}",
4
+ "stages": ["applied", "screening", "interview", "offer", "closed"],
5
+ "records": []
6
+ }
@@ -12,6 +12,10 @@
12
12
  "insurance"
13
13
  ],
14
14
  "category": "money",
15
+ "interests": [
16
+ "home",
17
+ "legal"
18
+ ],
15
19
  "maintainer": {
16
20
  "name": "Gezel"
17
21
  },