@flickfyi/flkr 0.0.182 → 0.0.185

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 (243) hide show
  1. package/dist/{api-client-CAg1b8Bh.js → api-client-nn4U_Vfn.js} +1 -1
  2. package/dist/{app-DpM5nhb9.js → app-COXGJhrt.js} +3 -3
  3. package/dist/{bundler-DNrDcqyk.js → bundler-CW4YC73e.js} +4 -2
  4. package/dist/cli.js +11 -11
  5. package/dist/{delegate-DcVye0KE.js → delegate-aUVluBjB.js} +2 -2
  6. package/dist/{generate-B1l1z_FZ.js → generate-BeL1QPDi.js} +1 -1
  7. package/dist/{preview-Dqn_Tq6K.js → preview-DTVM8Csb.js} +2 -2
  8. package/dist/{publish-BmDqO1xU.js → publish-BJG-s-w5.js} +4 -4
  9. package/dist/{pull-CO80DMn8.js → pull-B_Yfjpi2.js} +1 -1
  10. package/dist/{save-8crfOeo1.js → save-UrfgmK2-.js} +2 -2
  11. package/dist/{sdk-app-BXWrf_pf.js → sdk-app-BAxznAf9.js} +3 -3
  12. package/dist/{sdk-deploy-CaEonlvx.js → sdk-deploy-D1wgQxse.js} +3 -3
  13. package/dist/{sdk-generation-CF8ATbrL.js → sdk-generation-CLQ-QrVM.js} +1 -1
  14. package/dist/{sdk-project-CKV3U3u9.js → sdk-project-BaO0fqhW.js} +1 -1
  15. package/dist/{use-auth-B6nwU2rp.js → use-auth-CtM4_BAY.js} +1 -1
  16. package/node_modules/@flickfyi/biscuit/.turbo/turbo-build.log +4 -4
  17. package/node_modules/@flickfyi/core/README.md +19 -9
  18. package/node_modules/@flickfyi/core/dist/chunks/{default-CuxDsQoM.js → default-BTmKidHV.js} +1 -1
  19. package/node_modules/@flickfyi/core/dist/chunks/{default-BB6YexEH.cjs → default-JhTq5I_y.cjs} +1 -1
  20. package/node_modules/@flickfyi/core/dist/chunks/{define-CUJRqVKY.cjs → define-BKCRhpuY.cjs} +1 -1
  21. package/node_modules/@flickfyi/core/dist/chunks/{define-e_VqSs4M.js → define-DZXgUsy7.js} +5 -5
  22. package/node_modules/@flickfyi/core/dist/kowalski/catalog.cjs +1 -1
  23. package/node_modules/@flickfyi/core/dist/kowalski/catalog.js +728 -549
  24. package/node_modules/@flickfyi/core/dist/kowalski/index.cjs +5 -5
  25. package/node_modules/@flickfyi/core/dist/kowalski/index.js +4297 -3700
  26. package/node_modules/@flickfyi/core/dist/kowalski/schemas.cjs +1 -0
  27. package/node_modules/@flickfyi/core/dist/kowalski/schemas.js +637 -0
  28. package/node_modules/@flickfyi/core/dist/kowalski-catalog.css +516 -0
  29. package/node_modules/@flickfyi/core/dist/kowalski.css +10 -0
  30. package/node_modules/@flickfyi/core/dist/themes/athletic/athletic.cjs +1 -1
  31. package/node_modules/@flickfyi/core/dist/themes/athletic/athletic.js +1 -1
  32. package/node_modules/@flickfyi/core/dist/themes/compact/compact.cjs +1 -1
  33. package/node_modules/@flickfyi/core/dist/themes/compact/compact.js +1 -1
  34. package/node_modules/@flickfyi/core/dist/themes/default/default.cjs +1 -1
  35. package/node_modules/@flickfyi/core/dist/themes/default/default.js +1 -1
  36. package/node_modules/@flickfyi/core/dist/themes/editorial/editorial.cjs +1 -1
  37. package/node_modules/@flickfyi/core/dist/themes/editorial/editorial.js +1 -1
  38. package/node_modules/@flickfyi/core/dist/themes/handwritten/handwritten.cjs +1 -1
  39. package/node_modules/@flickfyi/core/dist/themes/handwritten/handwritten.js +1 -1
  40. package/node_modules/@flickfyi/core/dist/themes/index.cjs +1 -1
  41. package/node_modules/@flickfyi/core/dist/themes/index.js +1 -1
  42. package/node_modules/@flickfyi/core/dist/themes/kids/kids.cjs +1 -1
  43. package/node_modules/@flickfyi/core/dist/themes/kids/kids.js +1 -1
  44. package/node_modules/@flickfyi/core/dist/themes/rounded/rounded.cjs +1 -1
  45. package/node_modules/@flickfyi/core/dist/themes/rounded/rounded.js +1 -1
  46. package/node_modules/@flickfyi/core/dist/themes/technical/technical.cjs +1 -1
  47. package/node_modules/@flickfyi/core/dist/themes/technical/technical.js +1 -1
  48. package/node_modules/@flickfyi/core/dist-types/hooks/use-feature-store/index.d.ts +43 -0
  49. package/node_modules/@flickfyi/core/dist-types/kowalski/calculations.d.ts +57 -3
  50. package/node_modules/@flickfyi/core/dist-types/kowalski/calculator.d.ts +7 -6
  51. package/node_modules/@flickfyi/core/dist-types/kowalski/catalog.d.cts +524 -809
  52. package/node_modules/@flickfyi/core/dist-types/kowalski/catalog.d.ts +524 -809
  53. package/node_modules/@flickfyi/core/dist-types/kowalski/components/bill-split.d.ts +38 -0
  54. package/node_modules/@flickfyi/core/dist-types/kowalski/components/bookmark.d.ts +48 -0
  55. package/node_modules/@flickfyi/core/dist-types/kowalski/components/budget.d.ts +39 -0
  56. package/node_modules/@flickfyi/core/dist-types/kowalski/components/calculator.d.ts +62 -0
  57. package/node_modules/@flickfyi/core/dist-types/kowalski/components/checklist.d.ts +35 -0
  58. package/node_modules/@flickfyi/core/dist-types/kowalski/components/color-palette.d.ts +32 -0
  59. package/node_modules/@flickfyi/core/dist-types/kowalski/components/contact.d.ts +41 -0
  60. package/node_modules/@flickfyi/core/dist-types/kowalski/components/countdown.d.ts +34 -0
  61. package/node_modules/@flickfyi/core/dist-types/kowalski/components/event.d.ts +43 -0
  62. package/node_modules/@flickfyi/core/dist-types/kowalski/components/expense.d.ts +40 -0
  63. package/node_modules/@flickfyi/core/dist-types/kowalski/components/goal.d.ts +36 -0
  64. package/node_modules/@flickfyi/core/dist-types/kowalski/components/habit.d.ts +57 -0
  65. package/node_modules/@flickfyi/core/dist-types/kowalski/components/ledger.d.ts +43 -0
  66. package/node_modules/@flickfyi/core/dist-types/kowalski/components/note.d.ts +35 -0
  67. package/node_modules/@flickfyi/core/dist-types/kowalski/components/poll.d.ts +41 -0
  68. package/node_modules/@flickfyi/core/dist-types/kowalski/components/random-picker.d.ts +69 -0
  69. package/node_modules/@flickfyi/core/dist-types/kowalski/components/rating.d.ts +33 -0
  70. package/node_modules/@flickfyi/core/dist-types/kowalski/components/reminder.d.ts +48 -0
  71. package/node_modules/@flickfyi/core/dist-types/kowalski/components/rotation.d.ts +39 -0
  72. package/node_modules/@flickfyi/core/dist-types/kowalski/components/scoreboard.d.ts +37 -0
  73. package/node_modules/@flickfyi/core/dist-types/kowalski/components/shopping-list.d.ts +41 -0
  74. package/node_modules/@flickfyi/core/dist-types/kowalski/components/task-board.d.ts +39 -0
  75. package/node_modules/@flickfyi/core/dist-types/kowalski/components/time-zone.d.ts +34 -0
  76. package/node_modules/@flickfyi/core/dist-types/kowalski/components/timer.d.ts +43 -0
  77. package/node_modules/@flickfyi/core/dist-types/kowalski/components/trip.d.ts +61 -0
  78. package/node_modules/@flickfyi/core/dist-types/kowalski/components/unit-converter.d.ts +106 -0
  79. package/node_modules/@flickfyi/core/dist-types/kowalski/create-schemas.d.ts +6 -0
  80. package/node_modules/@flickfyi/core/dist-types/kowalski/date-time.d.ts +1 -1
  81. package/node_modules/@flickfyi/core/dist-types/kowalski/everyday.d.ts +28 -8
  82. package/node_modules/@flickfyi/core/dist-types/kowalski/feature-schema.d.ts +65 -0
  83. package/node_modules/@flickfyi/core/dist-types/kowalski/format.d.ts +4 -0
  84. package/node_modules/@flickfyi/core/dist-types/kowalski/fortune.d.ts +21 -0
  85. package/node_modules/@flickfyi/core/dist-types/kowalski/frame.d.ts +4 -4
  86. package/node_modules/@flickfyi/core/dist-types/kowalski/index.d.cts +31 -7
  87. package/node_modules/@flickfyi/core/dist-types/kowalski/index.d.ts +31 -7
  88. package/node_modules/@flickfyi/core/dist-types/kowalski/lesson.d.ts +89 -0
  89. package/node_modules/@flickfyi/core/dist-types/kowalski/recipe.d.ts +129 -8
  90. package/node_modules/@flickfyi/core/dist-types/kowalski/schemas.d.cts +4 -0
  91. package/node_modules/@flickfyi/core/dist-types/kowalski/schemas.d.ts +4 -0
  92. package/node_modules/@flickfyi/core/dist-types/kowalski/time-since.d.ts +34 -0
  93. package/node_modules/@flickfyi/core/examples/example-metadata.ts +19 -2
  94. package/node_modules/@flickfyi/core/examples/kowalski/bill-split/bill-split.stories.tsx +25 -6
  95. package/node_modules/@flickfyi/core/examples/kowalski/bill-split/bill-split.tsx +6 -12
  96. package/node_modules/@flickfyi/core/examples/kowalski/bookmark/bookmark.stories.tsx +22 -5
  97. package/node_modules/@flickfyi/core/examples/kowalski/bookmark/bookmark.tsx +6 -18
  98. package/node_modules/@flickfyi/core/examples/kowalski/budget/budget.stories.tsx +26 -5
  99. package/node_modules/@flickfyi/core/examples/kowalski/budget/budget.tsx +6 -21
  100. package/node_modules/@flickfyi/core/examples/kowalski/calculator/calculator.stories.tsx +18 -5
  101. package/node_modules/@flickfyi/core/examples/kowalski/calculator/calculator.tsx +6 -19
  102. package/node_modules/@flickfyi/core/examples/kowalski/checklist/checklist.stories.tsx +25 -5
  103. package/node_modules/@flickfyi/core/examples/kowalski/checklist/checklist.tsx +6 -21
  104. package/node_modules/@flickfyi/core/examples/kowalski/color-palette/color-palette.stories.tsx +19 -6
  105. package/node_modules/@flickfyi/core/examples/kowalski/color-palette/color-palette.tsx +6 -17
  106. package/node_modules/@flickfyi/core/examples/kowalski/contact/contact.stories.tsx +30 -5
  107. package/node_modules/@flickfyi/core/examples/kowalski/contact/contact.tsx +6 -18
  108. package/node_modules/@flickfyi/core/examples/kowalski/countdown/countdown.stories.tsx +22 -5
  109. package/node_modules/@flickfyi/core/examples/kowalski/countdown/countdown.tsx +6 -18
  110. package/node_modules/@flickfyi/core/examples/kowalski/event/event.stories.tsx +23 -5
  111. package/node_modules/@flickfyi/core/examples/kowalski/event/event.tsx +6 -19
  112. package/node_modules/@flickfyi/core/examples/kowalski/expense/expense.stories.tsx +23 -5
  113. package/node_modules/@flickfyi/core/examples/kowalski/expense/expense.tsx +6 -18
  114. package/node_modules/@flickfyi/core/examples/kowalski/fortune/fortune.stories.tsx +61 -0
  115. package/node_modules/@flickfyi/core/examples/kowalski/fortune/fortune.tsx +11 -0
  116. package/node_modules/@flickfyi/core/examples/kowalski/goal/goal.stories.tsx +18 -5
  117. package/node_modules/@flickfyi/core/examples/kowalski/goal/goal.tsx +3 -19
  118. package/node_modules/@flickfyi/core/examples/kowalski/habit/habit.stories.tsx +22 -5
  119. package/node_modules/@flickfyi/core/examples/kowalski/habit/habit.tsx +6 -18
  120. package/node_modules/@flickfyi/core/examples/kowalski/ledger/ledger.stories.tsx +25 -5
  121. package/node_modules/@flickfyi/core/examples/kowalski/ledger/ledger.tsx +6 -20
  122. package/node_modules/@flickfyi/core/examples/kowalski/lesson/lesson.stories.tsx +99 -0
  123. package/node_modules/@flickfyi/core/examples/kowalski/lesson/lesson.tsx +11 -0
  124. package/node_modules/@flickfyi/core/examples/kowalski/note/note.stories.tsx +21 -5
  125. package/node_modules/@flickfyi/core/examples/kowalski/note/note.tsx +3 -17
  126. package/node_modules/@flickfyi/core/examples/kowalski/poll/poll.stories.tsx +26 -5
  127. package/node_modules/@flickfyi/core/examples/kowalski/poll/poll.tsx +3 -21
  128. package/node_modules/@flickfyi/core/examples/kowalski/random-picker/random-picker.stories.tsx +37 -6
  129. package/node_modules/@flickfyi/core/examples/kowalski/random-picker/random-picker.tsx +6 -18
  130. package/node_modules/@flickfyi/core/examples/kowalski/rating/rating.stories.tsx +18 -5
  131. package/node_modules/@flickfyi/core/examples/kowalski/rating/rating.tsx +6 -14
  132. package/node_modules/@flickfyi/core/examples/kowalski/recipe/recipe.stories.tsx +117 -5
  133. package/node_modules/@flickfyi/core/examples/kowalski/recipe/recipe.tsx +6 -115
  134. package/node_modules/@flickfyi/core/examples/kowalski/reminder/reminder.stories.tsx +22 -5
  135. package/node_modules/@flickfyi/core/examples/kowalski/reminder/reminder.tsx +6 -18
  136. package/node_modules/@flickfyi/core/examples/kowalski/rotation/rotation.stories.tsx +26 -5
  137. package/node_modules/@flickfyi/core/examples/kowalski/rotation/rotation.tsx +6 -22
  138. package/node_modules/@flickfyi/core/examples/kowalski/scoreboard/scoreboard.stories.tsx +26 -5
  139. package/node_modules/@flickfyi/core/examples/kowalski/scoreboard/scoreboard.tsx +6 -21
  140. package/node_modules/@flickfyi/core/examples/kowalski/shopping-list/shopping-list.stories.tsx +28 -6
  141. package/node_modules/@flickfyi/core/examples/kowalski/shopping-list/shopping-list.tsx +6 -22
  142. package/node_modules/@flickfyi/core/examples/kowalski/task-board/task-board.stories.tsx +27 -6
  143. package/node_modules/@flickfyi/core/examples/kowalski/task-board/task-board.tsx +6 -22
  144. package/node_modules/@flickfyi/core/examples/kowalski/time-since/time-since.stories.tsx +33 -0
  145. package/node_modules/@flickfyi/core/examples/kowalski/time-since/time-since.tsx +12 -0
  146. package/node_modules/@flickfyi/core/examples/kowalski/time-zone/time-zone.stories.tsx +22 -6
  147. package/node_modules/@flickfyi/core/examples/kowalski/time-zone/time-zone.tsx +6 -17
  148. package/node_modules/@flickfyi/core/examples/kowalski/timer/timer.stories.tsx +18 -5
  149. package/node_modules/@flickfyi/core/examples/kowalski/timer/timer.tsx +6 -18
  150. package/node_modules/@flickfyi/core/examples/kowalski/trip/trip.stories.tsx +25 -5
  151. package/node_modules/@flickfyi/core/examples/kowalski/trip/trip.tsx +3 -21
  152. package/node_modules/@flickfyi/core/examples/kowalski/unit-converter/unit-converter.stories.tsx +19 -6
  153. package/node_modules/@flickfyi/core/examples/kowalski/unit-converter/unit-converter.tsx +6 -19
  154. package/node_modules/@flickfyi/core/examples/parrott/calculator/calculator.stories.tsx +10 -3
  155. package/node_modules/@flickfyi/core/examples/parrott/calculator/calculator.tsx +2 -13
  156. package/node_modules/@flickfyi/core/examples/parrott/checklist/checklist.stories.tsx +10 -3
  157. package/node_modules/@flickfyi/core/examples/parrott/checklist/checklist.tsx +0 -8
  158. package/node_modules/@flickfyi/core/examples/parrott/countdown/countdown.stories.tsx +10 -3
  159. package/node_modules/@flickfyi/core/examples/parrott/countdown/countdown.tsx +0 -8
  160. package/node_modules/@flickfyi/core/examples/parrott/counter/counter.stories.tsx +10 -3
  161. package/node_modules/@flickfyi/core/examples/parrott/counter/counter.tsx +0 -8
  162. package/node_modules/@flickfyi/core/examples/parrott/fortune/fortune.stories.tsx +10 -3
  163. package/node_modules/@flickfyi/core/examples/parrott/fortune/fortune.tsx +0 -8
  164. package/node_modules/@flickfyi/core/examples/parrott/grid/grid.stories.tsx +10 -3
  165. package/node_modules/@flickfyi/core/examples/parrott/grid/grid.tsx +4 -9
  166. package/node_modules/@flickfyi/core/examples/parrott/kale-smoothie/kale-smoothie.stories.tsx +10 -3
  167. package/node_modules/@flickfyi/core/examples/parrott/kale-smoothie/kale-smoothie.tsx +0 -8
  168. package/node_modules/@flickfyi/core/examples/parrott/list/list.stories.tsx +10 -3
  169. package/node_modules/@flickfyi/core/examples/parrott/list/list.tsx +0 -8
  170. package/node_modules/@flickfyi/core/examples/parrott/log/log.stories.tsx +10 -3
  171. package/node_modules/@flickfyi/core/examples/parrott/log/log.tsx +0 -8
  172. package/node_modules/@flickfyi/core/examples/parrott/timed-task/timed-task.stories.tsx +10 -3
  173. package/node_modules/@flickfyi/core/examples/parrott/timed-task/timed-task.tsx +0 -8
  174. package/node_modules/@flickfyi/core/examples/parrott/timer/timer.stories.tsx +10 -3
  175. package/node_modules/@flickfyi/core/examples/parrott/timer/timer.tsx +0 -8
  176. package/node_modules/@flickfyi/core/package.json +16 -3
  177. package/node_modules/@flickfyi/core/src/{kowalski/use-configured-feature.ts → hooks/use-configured-feature/index.ts} +1 -1
  178. package/node_modules/@flickfyi/core/src/{kowalski/use-feature-store.ts → hooks/use-feature-store/index.ts} +37 -12
  179. package/node_modules/@flickfyi/core/src/kowalski/README.md +13 -0
  180. package/node_modules/@flickfyi/core/src/kowalski/calculations.ts +36 -8
  181. package/node_modules/@flickfyi/core/src/kowalski/calculator.ts +15 -7
  182. package/node_modules/@flickfyi/core/src/kowalski/catalog.ts +110 -704
  183. package/node_modules/@flickfyi/core/src/kowalski/components/bill-split.tsx +284 -0
  184. package/node_modules/@flickfyi/core/src/kowalski/components/bookmark.tsx +347 -0
  185. package/node_modules/@flickfyi/core/src/kowalski/components/budget.tsx +169 -0
  186. package/node_modules/@flickfyi/core/src/kowalski/components/calculator.tsx +202 -0
  187. package/node_modules/@flickfyi/core/src/kowalski/components/checklist.tsx +119 -0
  188. package/node_modules/@flickfyi/core/src/kowalski/components/color-palette.tsx +302 -0
  189. package/node_modules/@flickfyi/core/src/kowalski/components/contact.tsx +247 -0
  190. package/node_modules/@flickfyi/core/src/kowalski/components/countdown.tsx +173 -0
  191. package/node_modules/@flickfyi/core/src/kowalski/components/event.tsx +260 -0
  192. package/node_modules/@flickfyi/core/src/kowalski/components/expense.tsx +257 -0
  193. package/node_modules/@flickfyi/core/src/kowalski/components/goal.tsx +182 -0
  194. package/node_modules/@flickfyi/core/src/kowalski/components/habit.tsx +272 -0
  195. package/node_modules/@flickfyi/core/src/kowalski/components/ledger.tsx +211 -0
  196. package/node_modules/@flickfyi/core/src/kowalski/components/note.tsx +188 -0
  197. package/node_modules/@flickfyi/core/src/kowalski/components/poll.tsx +242 -0
  198. package/node_modules/@flickfyi/core/src/kowalski/components/random-picker.tsx +308 -0
  199. package/node_modules/@flickfyi/core/src/kowalski/components/rating.tsx +112 -0
  200. package/node_modules/@flickfyi/core/src/kowalski/components/reminder.tsx +298 -0
  201. package/node_modules/@flickfyi/core/src/kowalski/components/rotation.tsx +146 -0
  202. package/node_modules/@flickfyi/core/src/kowalski/components/scoreboard.tsx +139 -0
  203. package/node_modules/@flickfyi/core/src/kowalski/components/shopping-list.tsx +144 -0
  204. package/node_modules/@flickfyi/core/src/kowalski/components/task-board.tsx +146 -0
  205. package/node_modules/@flickfyi/core/src/kowalski/components/time-zone.tsx +240 -0
  206. package/node_modules/@flickfyi/core/src/kowalski/components/timer.tsx +225 -0
  207. package/node_modules/@flickfyi/core/src/kowalski/components/trip.tsx +338 -0
  208. package/node_modules/@flickfyi/core/src/kowalski/components/unit-converter.tsx +285 -0
  209. package/node_modules/@flickfyi/core/src/kowalski/create-schemas.ts +8 -0
  210. package/node_modules/@flickfyi/core/src/kowalski/date-time.tsx +1 -1
  211. package/node_modules/@flickfyi/core/src/kowalski/everyday.tsx +1 -640
  212. package/node_modules/@flickfyi/core/src/kowalski/feature-schema.ts +84 -0
  213. package/node_modules/@flickfyi/core/src/kowalski/format.ts +29 -3
  214. package/node_modules/@flickfyi/core/src/kowalski/fortune.tsx +67 -0
  215. package/node_modules/@flickfyi/core/src/kowalski/frame.tsx +5 -6
  216. package/node_modules/@flickfyi/core/src/kowalski/index.ts +31 -22
  217. package/node_modules/@flickfyi/core/src/kowalski/lesson.tsx +564 -0
  218. package/node_modules/@flickfyi/core/src/kowalski/recipe.tsx +78 -37
  219. package/node_modules/@flickfyi/core/src/kowalski/schemas.ts +67 -0
  220. package/node_modules/@flickfyi/core/src/kowalski/stories/composition.tsx +22 -20
  221. package/node_modules/@flickfyi/core/src/kowalski/time-since.tsx +145 -0
  222. package/node_modules/@flickfyi/core/src/molecules/progress/progress.tsx +4 -1
  223. package/node_modules/@flickfyi/core/src/oklch.ts +1 -6
  224. package/node_modules/@flickfyi/core/src/parrott/theme.ts +3 -1
  225. package/node_modules/@flickfyi/core/src/themes/editorial/editorial.ts +6 -1
  226. package/node_modules/@flickfyi/core/src/themes/palette.ts +5 -5
  227. package/node_modules/@flickfyi/core/src/themes/stories/composition.tsx +11 -9
  228. package/node_modules/@flickfyi/core/src/themes/stories/gallery.tsx +7 -11
  229. package/node_modules/@flickfyi/core/tsgo.bun.lock +7 -7
  230. package/node_modules/@flickfyi/core/tsgo.package.json +1 -1
  231. package/package.json +2 -2
  232. package/node_modules/@flickfyi/core/dist-types/kowalski/clocks.d.ts +0 -4
  233. package/node_modules/@flickfyi/core/dist-types/kowalski/details.d.ts +0 -7
  234. package/node_modules/@flickfyi/core/dist-types/kowalski/productivity.d.ts +0 -5
  235. package/node_modules/@flickfyi/core/dist-types/kowalski/tools.d.ts +0 -7
  236. package/node_modules/@flickfyi/core/dist-types/kowalski/use-feature-store.d.ts +0 -15
  237. package/node_modules/@flickfyi/core/src/kowalski/clocks.tsx +0 -464
  238. package/node_modules/@flickfyi/core/src/kowalski/details.tsx +0 -1387
  239. package/node_modules/@flickfyi/core/src/kowalski/productivity.tsx +0 -575
  240. package/node_modules/@flickfyi/core/src/kowalski/tools.tsx +0 -1213
  241. /package/node_modules/@flickfyi/core/dist-types/{kowalski/use-clock.d.ts → hooks/use-clock/index.d.ts} +0 -0
  242. /package/node_modules/@flickfyi/core/dist-types/{kowalski/use-configured-feature.d.ts → hooks/use-configured-feature/index.d.ts} +0 -0
  243. /package/node_modules/@flickfyi/core/src/{kowalski/use-clock.ts → hooks/use-clock/index.ts} +0 -0
@@ -1,16 +1,276 @@
1
- import e from "validator/lib/isURL.js";
2
- import { z as t } from "zod/v4";
3
- // src/kowalski/catalog.ts
4
- var n = t.string().regex(/^[A-Za-z][A-Za-z0-9]*$/).optional(), r = t.enum(["private", "public"]).default("private"), i = {
5
- budget: "spent_",
6
- checklist: "completed_",
7
- habit: "completed_",
8
- poll: "vote_",
9
- recipe: "step_",
10
- scoreboard: "score_",
11
- shoppingList: "got_",
12
- taskBoard: "status_"
13
- }, a = [
1
+ import { z as e } from "zod/v4";
2
+ import { Decimal as t } from "decimal.js";
3
+ import { z as n } from "zod";
4
+ // src/kowalski/calculations.ts
5
+ var r = {
6
+ c: {
7
+ dimension: "temperature",
8
+ factor: 1,
9
+ offset: 0
10
+ },
11
+ f: {
12
+ dimension: "temperature",
13
+ factor: 5 / 9,
14
+ offset: -32
15
+ },
16
+ ft: {
17
+ dimension: "length",
18
+ factor: .3048,
19
+ offset: 0
20
+ },
21
+ g: {
22
+ dimension: "mass",
23
+ factor: .001,
24
+ offset: 0
25
+ },
26
+ k: {
27
+ dimension: "temperature",
28
+ factor: 1,
29
+ offset: -273.15
30
+ },
31
+ kg: {
32
+ dimension: "mass",
33
+ factor: 1,
34
+ offset: 0
35
+ },
36
+ km: {
37
+ dimension: "length",
38
+ factor: 1e3,
39
+ offset: 0
40
+ },
41
+ lb: {
42
+ dimension: "mass",
43
+ factor: .45359237,
44
+ offset: 0
45
+ },
46
+ m: {
47
+ dimension: "length",
48
+ factor: 1,
49
+ offset: 0
50
+ },
51
+ mi: {
52
+ dimension: "length",
53
+ factor: 1609.344,
54
+ offset: 0
55
+ }
56
+ };
57
+ t.clone({
58
+ precision: 40,
59
+ rounding: t.ROUND_HALF_UP
60
+ });
61
+ // src/kowalski/feature-schema.ts
62
+ var i = e.string().regex(/^[A-Za-z][A-Za-z0-9]*$/).optional(), a = e.enum(["private", "public"]).default("private"), o = {
63
+ id: i,
64
+ revision: e.number().default(0),
65
+ scope: a
66
+ };
67
+ function s(t) {
68
+ return e.object({
69
+ configuration: e.record(e.string(), e.unknown()).nullable().default(null),
70
+ configurationRevision: e.number().default(0),
71
+ ...t
72
+ });
73
+ }
74
+ var ee = e.enum(/* @__PURE__ */ "checklist.timer.habit.goal.poll.event.reminder.trip.countdown.timeZone.colorPalette.billSplit.expense.unitConverter.calculator.randomPicker.contact.bookmark.note.budget.scoreboard.taskBoard.recipe.rotation.shoppingList.rating.ledger.timeSince.fortune.lesson".split("."));
75
+ function c(t, n, r) {
76
+ let i = s(r), a = new Set(Object.keys(i.shape));
77
+ return e.intersection(i.loose(), e.looseRecord(e.templateLiteral([t, e.string()]), n)).refine((e) => Object.keys(e).every((e) => a.has(e) || e.startsWith(t)), `Item fields must start with ${t}.`);
78
+ }
79
+ function l(t) {
80
+ return e.object({ value: t }).default(() => ({ value: t.parse(void 0) }));
81
+ }
82
+ // src/kowalski/components/bill-split.tsx
83
+ var te = "private", u = /* @__PURE__ */ e.strictObject({
84
+ currency: e.string().optional().describe("A three-letter ISO currency code, e.g. \"USD\" or \"EUR\". Omit for \"USD\"."),
85
+ people: e.number().describe("How many people split the bill, e.g. 4."),
86
+ tipPercent: e.number().optional().describe("Tip as a percentage of the total, e.g. 18. Omit for no tip."),
87
+ title: e.string().optional().describe("A short heading. Omit for \"Split the bill\"."),
88
+ total: e.number().describe("The bill total before tip, in the currency, e.g. 84.5.")
89
+ }).describe("Split a bill equally with an optional tip, rounding in the selected currency."), d = e.strictObject({
90
+ data: u,
91
+ ...o,
92
+ scope: o.scope.default(te)
93
+ });
94
+ s({
95
+ people: e.number().default(1),
96
+ tipPercent: e.number().default(0),
97
+ total: e.number().default(0)
98
+ });
99
+ // src/kowalski/components/bookmark.tsx
100
+ var ne = {
101
+ max_allowed_length: 2048,
102
+ protocols: ["http", "https"],
103
+ require_host: !0,
104
+ require_protocol: !0,
105
+ require_tld: !1,
106
+ require_valid_protocol: !0
107
+ }, re = "private", f = /* @__PURE__ */ e.strictObject({
108
+ note: e.string().optional().describe("A short note about the link. Omit for none."),
109
+ title: e.string().describe("A short heading."),
110
+ url: e.string().describe("The full http or https address, e.g. \"https://example.com\".")
111
+ }).describe("Display, edit, and retain a web bookmark. No implicit metadata fetch."), ie = e.strictObject({
112
+ data: f,
113
+ ...o,
114
+ scope: o.scope.default(re)
115
+ });
116
+ s({
117
+ note: l(e.string().default("")),
118
+ title: l(e.string().default("")),
119
+ url: l(e.string().nullable().default(null))
120
+ });
121
+ // src/kowalski/components/budget.tsx
122
+ var ae = "private", p = /* @__PURE__ */ e.strictObject({
123
+ categories: e.array(e.strictObject({
124
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
125
+ label: e.string().describe("The category name, e.g. \"Groceries\"."),
126
+ limit: e.number().describe("The spending limit for the period, e.g. 400.")
127
+ })).describe("A few spending categories."),
128
+ currency: e.string().optional().describe("A three-letter ISO currency code, e.g. \"USD\" or \"EUR\". Omit for \"USD\"."),
129
+ title: e.string().optional().describe("A short heading. Omit for \"Budget\".")
130
+ }).describe("Track spending against category limits for one budget period. No bank connection or payments."), m = e.strictObject({
131
+ data: p,
132
+ ...o,
133
+ scope: o.scope.default(ae)
134
+ });
135
+ c("spent_", e.number(), {});
136
+ // src/kowalski/components/calculator.tsx
137
+ var h = "private", g = /* @__PURE__ */ e.strictObject({
138
+ left: e.number().optional().describe("The starting number. Omit for 0."),
139
+ operator: e.enum([
140
+ "+",
141
+ "-",
142
+ "*",
143
+ "/"
144
+ ]).optional().describe("The pending operator. Omit for \"+\"."),
145
+ right: e.number().optional().describe("The second operand. Omit for 0."),
146
+ title: e.string().optional().describe("A short heading. Omit for \"Calculate\".")
147
+ }).describe("A persistent keypad calculator with chained arithmetic, decimals, sign, percent, and repeated equals. Supports +, -, *, /. No executable expression strings."), _ = e.strictObject({
148
+ data: g,
149
+ ...o,
150
+ scope: o.scope.default(h)
151
+ });
152
+ s({ calculation: e.object({
153
+ entry: e.string().max(40).regex(/^(?:-?\d+(?:\.\d*)?(?:e[+-]?\d+)?|Error)$/),
154
+ left: e.number(),
155
+ operator: e.enum([
156
+ "+",
157
+ "-",
158
+ "*",
159
+ "/"
160
+ ]),
161
+ overwrite: e.boolean(),
162
+ phase: e.enum([
163
+ "left",
164
+ "operator",
165
+ "right",
166
+ "result",
167
+ "error"
168
+ ]),
169
+ right: e.number()
170
+ }).refine((e) => e.phase === "error" ? e.entry === "Error" : e.entry !== "Error" && Number.isFinite(Number(e.entry)), "Calculator entry must match its phase and represent a finite number.").default({
171
+ entry: "0",
172
+ left: 0,
173
+ operator: "+",
174
+ overwrite: !1,
175
+ phase: "left",
176
+ right: 0
177
+ }) });
178
+ // src/kowalski/components/checklist.tsx
179
+ var oe = "private", v = /* @__PURE__ */ e.strictObject({
180
+ items: e.array(e.strictObject({
181
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
182
+ label: e.string().describe("One short task, e.g. \"Pack tent\".")
183
+ })).describe("The checklist items, in order."),
184
+ title: e.string().describe("A short heading.")
185
+ }).describe("A persistent checklist with independent completion and progress. No external actions."), se = e.strictObject({
186
+ data: v,
187
+ ...o,
188
+ scope: o.scope.default(oe)
189
+ });
190
+ c("completed_", e.boolean(), {});
191
+ // src/kowalski/components/color-palette.tsx
192
+ var ce = "private", y = /* @__PURE__ */ e.strictObject({
193
+ color: e.string().describe("The starting color as a six-digit hex code, e.g. \"#3366FF\"."),
194
+ title: e.string().optional().describe("A short heading. Omit for \"Palette\".")
195
+ }).describe("Choose and retain an sRGB color and display matching shades."), le = e.strictObject({
196
+ data: y,
197
+ ...o,
198
+ scope: o.scope.default(ce)
199
+ });
200
+ s({ color: l(e.string().default("#6366f1")) });
201
+ // ../schemas/dist/person.js
202
+ var ue = /* @__PURE__ */ n.strictObject({
203
+ email: n.string().optional().describe("An email address. Omit if unknown."),
204
+ name: n.string().describe("The person’s name."),
205
+ phone: n.string().optional().describe("A phone number as written. Omit if unknown.")
206
+ }).describe("Display, edit, and retain a contact. Does not insert into the address book."), de = "private", b = ue, fe = e.strictObject({
207
+ data: b,
208
+ ...o,
209
+ scope: o.scope.default(de)
210
+ });
211
+ s({
212
+ email: l(e.string().nullable().default(null)),
213
+ name: l(e.string().default("")),
214
+ phone: l(e.string().nullable().default(null))
215
+ });
216
+ // src/kowalski/components/countdown.tsx
217
+ var pe = "private", x = /* @__PURE__ */ e.strictObject({
218
+ target: e.string().describe("The moment to count down to, as ISO 8601 with an offset, e.g. \"2026-12-31T23:59:59-08:00\"."),
219
+ timeZone: e.string().optional().describe("An IANA time zone, e.g. \"America/New_York\". Omit for UTC."),
220
+ title: e.string().describe("A short heading.")
221
+ }).describe("Count down to an explicit instant. Resolve missing dates before instantiation."), me = e.strictObject({
222
+ data: x,
223
+ ...o,
224
+ scope: o.scope.default(pe)
225
+ });
226
+ s({ target: l(e.string().nullable().default(null)) });
227
+ // ../schemas/dist/event.js
228
+ var he = /* @__PURE__ */ n.strictObject({
229
+ location: n.string().optional().describe("Where it happens. Omit if unknown."),
230
+ startsAt: n.string().optional().describe("When it starts, as ISO 8601 with an offset, e.g. \"2026-11-01T18:30:00-07:00\". Omit if unknown."),
231
+ timeZone: n.string().optional().describe("An IANA time zone, e.g. \"America/New_York\". Omit for UTC."),
232
+ title: n.string().describe("A short heading.")
233
+ }).describe("Save and edit event details in the app. Does not create a calendar event."), ge = "private", S = he, _e = e.strictObject({
234
+ data: S,
235
+ ...o,
236
+ scope: o.scope.default(ge)
237
+ });
238
+ s({
239
+ location: l(e.string().default("")),
240
+ startsAt: l(e.string().nullable().default(null)),
241
+ title: l(e.string().default(""))
242
+ });
243
+ // src/kowalski/components/expense.tsx
244
+ var ve = "private", C = /* @__PURE__ */ e.strictObject({
245
+ amount: e.number().describe("The amount spent, e.g. 12.5."),
246
+ category: e.string().optional().describe("A short category, e.g. \"Food\". Omit for \"Other\"."),
247
+ currency: e.string().optional().describe("A three-letter ISO currency code, e.g. \"USD\" or \"EUR\". Omit for \"USD\"."),
248
+ title: e.string().describe("A short heading.")
249
+ }).describe("Edit and retain one expense. No payments, bank connection, or exchange-rate lookup."), ye = e.strictObject({
250
+ data: C,
251
+ ...o,
252
+ scope: o.scope.default(ve)
253
+ });
254
+ s({
255
+ amount: e.number().default(0),
256
+ category: l(e.string().default("Other")),
257
+ title: l(e.string().default(""))
258
+ });
259
+ // src/kowalski/components/goal.tsx
260
+ var w = "private", T = /* @__PURE__ */ e.strictObject({
261
+ progress: e.number().optional().describe("Progress so far. Omit for 0."),
262
+ step: e.number().optional().describe("How much one tap adds, e.g. 1 or 0.5. Omit for 1."),
263
+ target: e.number().describe("The amount that completes the goal, e.g. 10."),
264
+ title: e.string().describe("A short heading."),
265
+ unit: e.string().optional().describe("A short unit after the numbers, e.g. \"km\" or \"pages\". Omit for none.")
266
+ }).describe("A personal goal with editable progress, target, and a fixed increment. Not a distributed counter."), E = e.strictObject({
267
+ data: T,
268
+ ...o,
269
+ scope: o.scope.default(w)
270
+ });
271
+ s({ progress: e.number().default(0) });
272
+ // src/kowalski/components/habit.tsx
273
+ var D = [
14
274
  "sunday",
15
275
  "monday",
16
276
  "tuesday",
@@ -18,621 +278,540 @@ var n = t.string().regex(/^[A-Za-z][A-Za-z0-9]*$/).optional(), r = t.enum(["priv
18
278
  "thursday",
19
279
  "friday",
20
280
  "saturday"
21
- ], o = {
22
- billSplit: {
23
- description: "Split a bill equally with an optional tip, rounding in the selected currency.",
24
- exportName: "BillSplit",
25
- props: d({
26
- currency: f(),
27
- people: t.number().int().min(1).max(1e3),
28
- tipPercent: t.number().min(0).max(100).default(0),
29
- title: v("Split the bill"),
30
- total: t.number().min(0).max(0xe8d4a51000)
281
+ ], O = "private", k = /* @__PURE__ */ e.strictObject({
282
+ timeZone: e.string().optional().describe("An IANA time zone, e.g. \"America/New_York\". Omit for UTC."),
283
+ title: e.string().describe("A short heading."),
284
+ weekdays: e.array(e.enum(D)).optional().describe("The days the habit is scheduled. Omit for every day.")
285
+ }).describe("Track a habit by local date and edit its weekday schedule. No notifications."), A = e.strictObject({
286
+ data: k,
287
+ ...o,
288
+ scope: o.scope.default(O)
289
+ });
290
+ c("completed_", e.boolean(), { weekdays: e.array(e.enum(D)).default([...D]) });
291
+ // src/kowalski/components/ledger.tsx
292
+ var j = "private", M = /* @__PURE__ */ e.strictObject({
293
+ currency: e.string().optional().describe("A three-letter ISO currency code, e.g. \"USD\" or \"EUR\". Omit for \"USD\"."),
294
+ people: e.array(e.strictObject({
295
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
296
+ label: e.string().describe("A person’s name.")
297
+ })).describe("Exactly two people sharing the tab."),
298
+ title: e.string().optional().describe("A short heading. Omit for \"Shared tab\".")
299
+ }).describe("A running tab of shared costs between two people, split evenly, with settle up. No payments."), N = e.strictObject({
300
+ data: M,
301
+ ...o,
302
+ scope: o.scope.default(j)
303
+ });
304
+ s({ entries: e.array(e.strictObject({
305
+ amount: e.number(),
306
+ id: e.string(),
307
+ label: e.string(),
308
+ paidBy: e.string()
309
+ })).default([]) });
310
+ // src/kowalski/components/note.tsx
311
+ var P = "private", F = /* @__PURE__ */ e.strictObject({
312
+ body: e.string().describe("The note text, as plain text."),
313
+ title: e.string().describe("A short heading. Use an empty string for none.")
314
+ }).describe("An editable persistent note. Plain text; no HTML or code execution."), be = e.strictObject({
315
+ data: F,
316
+ ...o,
317
+ scope: o.scope.default(P)
318
+ });
319
+ s({
320
+ body: l(e.string().default("")),
321
+ title: l(e.string().default(""))
322
+ });
323
+ // src/kowalski/components/poll.tsx
324
+ var I = /* @__PURE__ */ e.strictObject({
325
+ options: e.array(e.strictObject({
326
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
327
+ label: e.string().describe("One short answer choice.")
328
+ })).describe("Two or more answer choices."),
329
+ question: e.string().describe("The question being voted on."),
330
+ shared: e.boolean().optional().describe("True only when other people vote on the same poll. Omit for a private poll.")
331
+ }).describe("Cast or change a vote and derive totals from votes. Shared voting only when explicitly requested."), xe = e.strictObject({
332
+ data: I,
333
+ ...o
334
+ });
335
+ c("vote_", v.shape.items.element.shape.id, {});
336
+ var Se = e.object({
337
+ configuration: e.string().default(""),
338
+ voter: e.string()
339
+ }), Ce = "private", L = /* @__PURE__ */ e.discriminatedUnion("mode", [
340
+ e.strictObject({
341
+ mode: e.literal("coin"),
342
+ title: e.string().optional().describe("A short heading. Omit for \"Pick one\".")
343
+ }),
344
+ e.strictObject({
345
+ mode: e.literal("dice"),
346
+ title: e.string().optional().describe("A short heading. Omit for \"Pick one\".")
347
+ }),
348
+ e.strictObject({
349
+ maximum: e.number().describe("The largest whole number that can be picked."),
350
+ minimum: e.number().describe("The smallest whole number that can be picked."),
351
+ mode: e.literal("range"),
352
+ title: e.string().optional().describe("A short heading. Omit for \"Pick one\".")
353
+ }),
354
+ e.strictObject({
355
+ mode: e.literal("list"),
356
+ options: e.array(e.string()).describe("The choices to pick from."),
357
+ title: e.string().optional().describe("A short heading. Omit for \"Pick one\".")
358
+ })
359
+ ]).describe("Flip a coin, roll a die, or pick from a whole-number range or list. Retains the last result."), we = e.strictObject({
360
+ data: L,
361
+ ...o,
362
+ scope: o.scope.default(Ce)
363
+ });
364
+ s({ result: e.strictObject({
365
+ domain: Te(),
366
+ value: e.union([e.number(), e.string()])
367
+ }).nullable().default(null) });
368
+ function Te() {
369
+ return e.union([
370
+ e.strictObject({ mode: e.literal("coin") }),
371
+ e.strictObject({ mode: e.literal("dice") }),
372
+ e.strictObject({
373
+ maximum: e.number(),
374
+ minimum: e.number(),
375
+ mode: e.literal("range")
31
376
  }),
32
- storeSchema: _({
33
- people: t.number().int().min(1).max(1e3).default(1),
34
- tipPercent: t.number().min(0).max(100).default(0),
35
- total: t.number().min(0).max(0xe8d4a51000).default(0)
377
+ e.strictObject({
378
+ mode: e.literal("list"),
379
+ options: e.array(e.string())
36
380
  })
381
+ ]);
382
+ }
383
+ // src/kowalski/components/rating.tsx
384
+ var Ee = "private", R = /* @__PURE__ */ e.strictObject({
385
+ subject: e.string().describe("What is being rated, e.g. \"Pad thai at Lotus\"."),
386
+ title: e.string().optional().describe("A short heading. Omit for \"Your rating\".")
387
+ }).describe("Rate one thing from one to five stars and keep a short note about it."), De = e.strictObject({
388
+ data: R,
389
+ ...o,
390
+ scope: o.scope.default(Ee)
391
+ });
392
+ s({
393
+ note: l(e.string().default("")),
394
+ stars: e.number().default(0)
395
+ });
396
+ // src/kowalski/components/reminder.tsx
397
+ var Oe = "private", z = /* @__PURE__ */ e.strictObject({
398
+ dueAt: e.string().optional().describe("When it is due, as ISO 8601 with an offset, e.g. \"2026-11-01T09:00:00-07:00\". Omit if no time was given."),
399
+ recurrence: e.enum([
400
+ "none",
401
+ "daily",
402
+ "weekly"
403
+ ]).optional().describe("How it repeats. Omit for \"none\"."),
404
+ timeZone: e.string().optional().describe("An IANA time zone, e.g. \"America/New_York\". Omit for the device’s time zone."),
405
+ title: e.string().describe("What to be reminded of.")
406
+ }).describe("Complete, reopen, and edit an in-app reminder. Does not schedule notifications."), ke = e.strictObject({
407
+ data: z,
408
+ ...o,
409
+ scope: o.scope.default(Oe)
410
+ });
411
+ s({
412
+ completedAt: e.number().nullable().default(null),
413
+ dueAt: l(e.string().nullable().default(null)),
414
+ title: l(e.string().default(""))
415
+ });
416
+ // src/kowalski/components/rotation.tsx
417
+ var Ae = "private", B = /* @__PURE__ */ e.strictObject({
418
+ people: e.array(e.strictObject({
419
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
420
+ label: e.string().describe("A person’s name.")
421
+ })).describe("Everyone taking turns, in order."),
422
+ task: e.string().describe("The chore or turn, e.g. \"Take out the trash\"."),
423
+ title: e.string().optional().describe("A short heading. Omit for \"Whose turn\".")
424
+ }).describe("Take turns through a fixed group in order and pass the turn on when done."), je = e.strictObject({
425
+ data: B,
426
+ ...o,
427
+ scope: o.scope.default(Ae)
428
+ });
429
+ s({
430
+ completed: e.number().default(0),
431
+ turn: e.string().nullable().default(null)
432
+ });
433
+ // src/kowalski/components/scoreboard.tsx
434
+ var Me = "private", V = /* @__PURE__ */ e.strictObject({
435
+ players: e.array(e.strictObject({
436
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
437
+ label: e.string().describe("A player or team name.")
438
+ })).describe("Everyone keeping score."),
439
+ step: e.number().optional().describe("Points per tap. Omit for 1."),
440
+ title: e.string().optional().describe("A short heading. Omit for \"Scores\".")
441
+ }).describe("Keep score for a few players with a fixed step. Not a distributed counter or a league."), Ne = e.strictObject({
442
+ data: V,
443
+ ...o,
444
+ scope: o.scope.default(Me)
445
+ });
446
+ c("score_", e.number(), {});
447
+ // src/kowalski/components/shopping-list.tsx
448
+ var Pe = "private", H = /* @__PURE__ */ e.strictObject({
449
+ currency: e.string().optional().describe("A three-letter ISO currency code, e.g. \"USD\" or \"EUR\". Omit for \"USD\"."),
450
+ items: e.array(e.strictObject({
451
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
452
+ label: e.string().describe("One item to buy, e.g. \"Oat milk\"."),
453
+ price: e.number().optional().describe("Price per unit. Omit if unknown."),
454
+ quantity: e.number().optional().describe("How many to buy. Omit for 1.")
455
+ })).describe("The items to buy."),
456
+ title: e.string().optional().describe("A short heading. Omit for \"Shopping list\".")
457
+ }).describe("Check items off a shopping list with optional prices and a running cart total. No ordering."), Fe = e.strictObject({
458
+ data: H,
459
+ ...o,
460
+ scope: o.scope.default(Pe)
461
+ });
462
+ c("got_", e.boolean(), {});
463
+ // src/kowalski/components/task-board.tsx
464
+ var Ie = "private", U = /* @__PURE__ */ e.strictObject({
465
+ tasks: e.array(e.strictObject({
466
+ id: e.string().describe("A short ID, unique within this list, e.g. \"tent\"."),
467
+ label: e.string().describe("One short task.")
468
+ })).describe("The tasks, all starting in To do."),
469
+ title: e.string().optional().describe("A short heading. Omit for \"Tasks\".")
470
+ }).describe("Move tasks between To do, Doing, and Done. No assignees, dates, or sync."), Le = e.strictObject({
471
+ data: U,
472
+ ...o,
473
+ scope: o.scope.default(Ie)
474
+ });
475
+ c("status_", e.enum([
476
+ "todo",
477
+ "doing",
478
+ "done"
479
+ ]), {});
480
+ // src/kowalski/components/time-zone.tsx
481
+ var Re = "private", W = /* @__PURE__ */ e.strictObject({
482
+ at: e.string().optional().describe("A moment to compare, as ISO 8601 with an offset. Omit to show the live current time."),
483
+ title: e.string().optional().describe("A short heading. Omit for \"World clock\"."),
484
+ zones: e.array(e.string()).describe("Two or more IANA time zones to compare, e.g. \"Europe/London\".")
485
+ }).describe("Compare local times in named time zones, live or at an explicit instant."), ze = e.strictObject({
486
+ data: W,
487
+ ...o,
488
+ scope: o.scope.default(Re)
489
+ });
490
+ s({ at: l(e.string().nullable().default(null)) });
491
+ // src/kowalski/components/timer.tsx
492
+ var Be = "private", G = /* @__PURE__ */ e.strictObject({
493
+ durationSeconds: e.number().optional().describe("Countdown length in seconds, e.g. 1500 for 25 minutes. Omit for 300."),
494
+ mode: e.enum([
495
+ "countdown",
496
+ "focus",
497
+ "break",
498
+ "stopwatch"
499
+ ]).optional().describe("Omit for \"countdown\"."),
500
+ title: e.string().optional().describe("A short heading. Omit for \"Timer\".")
501
+ }).describe("Countdown, focus, break, or stopwatch. Start, pause, resume, reset; no background alarm."), Ve = e.strictObject({
502
+ data: G,
503
+ ...o,
504
+ scope: o.scope.default(Be)
505
+ });
506
+ s({
507
+ elapsedSeconds: e.number().default(0),
508
+ startedAt: e.number().nullable().default(null)
509
+ });
510
+ // src/kowalski/components/trip.tsx
511
+ var He = "private", K = /* @__PURE__ */ e.strictObject({
512
+ destination: e.string().describe("Where the trip goes."),
513
+ endDate: e.string().optional().describe("The last day as YYYY-MM-DD. Omit if unknown."),
514
+ origin: e.string().describe("Where the trip starts."),
515
+ startDate: e.string().optional().describe("The first day as YYYY-MM-DD. Omit if unknown."),
516
+ title: e.string().optional().describe("A short heading. Omit for \"Trip\"."),
517
+ transport: e.enum([
518
+ "car",
519
+ "train",
520
+ "plane",
521
+ "walk",
522
+ "other"
523
+ ]).optional().describe("How the trip is made. Omit for \"other\".")
524
+ }).describe("Edit and retain trip details. No bookings or itinerary retrieval."), Ue = e.strictObject({
525
+ data: K,
526
+ ...o,
527
+ scope: o.scope.default(He)
528
+ });
529
+ s({
530
+ destination: l(e.string().default("")),
531
+ endDate: l(e.string().nullable().default(null)),
532
+ origin: l(e.string().default("")),
533
+ startDate: l(e.string().nullable().default(null))
534
+ }).refine((e) => !e.startDate.value || !e.endDate.value || e.endDate.value >= e.startDate.value, "The trip cannot end before it starts.");
535
+ // src/kowalski/components/unit-converter.tsx
536
+ var We = "private", q = /* @__PURE__ */ e.strictObject({
537
+ from: e.enum([
538
+ "m",
539
+ "km",
540
+ "mi",
541
+ "ft",
542
+ "kg",
543
+ "g",
544
+ "lb",
545
+ "c",
546
+ "f",
547
+ "k"
548
+ ]).describe("The unit to convert from."),
549
+ title: e.string().optional().describe("A short heading. Omit for \"Convert\"."),
550
+ to: e.enum([
551
+ "m",
552
+ "km",
553
+ "mi",
554
+ "ft",
555
+ "kg",
556
+ "g",
557
+ "lb",
558
+ "c",
559
+ "f",
560
+ "k"
561
+ ]).describe("The unit to convert to; it must measure the same thing."),
562
+ value: e.number().describe("The amount to convert.")
563
+ }).describe("Convert compatible length, mass, or temperature units deterministically."), Ge = e.strictObject({
564
+ data: q,
565
+ ...o,
566
+ scope: o.scope.default(We)
567
+ });
568
+ s({
569
+ from: l(q.shape.from.default("km")),
570
+ to: l(q.shape.from.default("mi")),
571
+ value: e.number().default(0)
572
+ });
573
+ // src/kowalski/fortune.tsx
574
+ var J = /* @__PURE__ */ e.strictObject({
575
+ action: e.string().describe("A short button command, e.g. \"Crack cookie\" or \"Ask the eight ball\"."),
576
+ answers: e.array(e.string()).describe("The complete pool of short fortunes or answers to reveal, one at a time. Match the requested topic and tone."),
577
+ prompt: e.string().describe("The short invitation shown before the first reveal, e.g. \"Your fortune awaits\" or \"Think of a yes-or-no question\"."),
578
+ title: e.string().describe("The heading, e.g. \"Fortune cookie\" or \"Magic 8 Ball\".")
579
+ }).describe("Content for one existing Fortune React component. It already implements a button that randomly reveals one answer. Supply concise UI copy and a ready-to-use answer pool for a fortune cookie, magic eight ball, or themed oracle. Answers are supplied at generation time; the component does not generate new answers or interpret questions at runtime."), Y = e.strictObject({ data: J }), X = /* @__PURE__ */ n.strictObject({
580
+ hasPart: n.array(n.strictObject({
581
+ acceptedAnswer: n.array(n.strictObject({
582
+ answerExplanation: n.string().describe("One or two sentences explaining why this answer is right."),
583
+ text: n.string().describe("The correct answer.")
584
+ })).describe("The correct answers: exactly one for \"Multiple choice\" and \"Flashcard\", one or more for \"Checkbox\". For \"Checkbox\", put each independently selectable correct answer in its own object, so each gets a separate checkbox."),
585
+ assesses: n.string().describe("The id of the concept in teaches that this question practices. The app teaches this concept before showing its questions. Use only material from this concept or earlier ones."),
586
+ eduQuestionType: n.enum([
587
+ "Checkbox",
588
+ "Flashcard",
589
+ "Multiple choice"
590
+ ]).describe("\"Multiple choice\" picks one answer, \"Checkbox\" picks every correct answer, and \"Flashcard\" reveals the answer for the learner to grade themselves."),
591
+ id: n.string().describe("A short ID, unique within this lesson, e.g. \"count-1\"."),
592
+ suggestedAnswer: n.array(n.strictObject({
593
+ comment: n.string().optional().describe("Why this choice is wrong, shown when the learner picks it. Omit if the correct answer’s explanation covers it."),
594
+ text: n.string().describe("A plausible wrong answer.")
595
+ })).describe("One to three plausible wrong answers shown alongside the correct ones. Empty for \"Flashcard\"."),
596
+ text: n.string().describe("The question, applying only what has been taught so far, e.g. \"You hold ♠KQ4 ♥A73 ♦J852 ♣K6. How many points?\"")
597
+ })).describe("The questions, two or three per concept, in teaching order."),
598
+ teaches: n.array(n.strictObject({
599
+ description: n.string().describe("Two to four sentences that teach this one idea to a beginner."),
600
+ examples: n.array(n.strictObject({
601
+ name: n.string().describe("The example itself, e.g. \"Buenos días\" or \"♠AK5 ♥QJ4 ♦K82 ♣J73\"."),
602
+ value: n.string().describe("What the example shows, e.g. \"morning\" or \"15 points\".")
603
+ })).describe("Worked examples of the idea as schema.org PropertyValue pairs: the example and what it shows. Empty if none helps."),
604
+ id: n.string().describe("A short ID, unique within this lesson, e.g. \"count-points\"."),
605
+ name: n.string().describe("A short name for the idea, e.g. \"Counting points\".")
606
+ })).describe("The ideas this lesson teaches, in teaching order, usually two to four."),
607
+ title: n.string().describe("The lesson name, e.g. \"Opening bids\".")
608
+ }).describe("A short lesson: the ideas it teaches in order, and questions that practice each idea."), Ke = e.strictObject({
609
+ data: X,
610
+ ...o
611
+ });
612
+ c("result_", e.enum(["first", "retry"]).nullable(), {
613
+ missed: e.array(e.string()).default([]),
614
+ seen: e.array(e.string()).default([]),
615
+ started: e.boolean().default(!1)
616
+ });
617
+ // ../schemas/dist/recipe.js
618
+ var qe = /* @__PURE__ */ n.strictObject({
619
+ ingredients: n.array(n.strictObject({
620
+ amount: n.number().optional().describe("How much, e.g. 2 or 0.5. Omit if unmeasured."),
621
+ id: Z(),
622
+ label: n.string().describe("The ingredient, e.g. \"Flour\"."),
623
+ notes: n.array(n.string()).optional().describe("Short notes, e.g. \"sifted\"."),
624
+ unit: n.string().optional().describe("A short unit, e.g. \"cup\" or \"g\".")
625
+ })).describe("Every ingredient, each with an ID unique among ingredients."),
626
+ servings: n.number().optional().describe("How many it serves. Omit if unknown."),
627
+ steps: n.array(n.strictObject({
628
+ after: n.array(Z()).optional().describe("Prerequisite step IDs, all earlier in this recipe. Independent steps have no dependency."),
629
+ attention: n.enum(["active", "passive"]).optional().describe("\"passive\" when the cook can walk away, e.g. while baking."),
630
+ doneness: n.string().optional().describe("How to tell it is done."),
631
+ duration: n.strictObject({
632
+ maxMinutes: n.number().optional(),
633
+ minMinutes: n.number().optional(),
634
+ raw: n.string().describe("The duration as written, e.g. \"10–12 minutes\".")
635
+ }).optional(),
636
+ equipment: n.array(n.string()).optional(),
637
+ id: Z(),
638
+ instruction: n.string().describe("What to do in this step."),
639
+ kind: n.enum([
640
+ "setup",
641
+ "transform",
642
+ "wait",
643
+ "serve"
644
+ ]).optional(),
645
+ label: n.string().optional().describe("A short name for the step."),
646
+ outputs: n.array(n.strictObject({
647
+ id: Z(),
648
+ name: n.string().optional()
649
+ })).optional().describe("Products of this step, referenced by later steps through uses."),
650
+ temperature: n.string().optional().describe("As written, e.g. \"350°F\"."),
651
+ uses: n.array(n.strictObject({
652
+ id: Z(),
653
+ portion: n.string().optional().describe("How much of it, e.g. \"half\"."),
654
+ source: n.discriminatedUnion("kind", [n.strictObject({
655
+ ingredientId: Z(),
656
+ kind: n.literal("ingredient")
657
+ }), n.strictObject({
658
+ kind: n.literal("output"),
659
+ outputId: Z()
660
+ })])
661
+ })).optional().describe("Ingredients or earlier step outputs consumed here. Output references create dependencies.")
662
+ })).describe("The steps in order, each with an ID unique among steps."),
663
+ title: n.string().describe("The recipe name."),
664
+ yield: n.string().optional().describe("What it makes, e.g. \"12 cookies\".")
665
+ }).describe("A recipe dependency graph (RGF), with ingredients and ordered steps.");
666
+ function Z() {
667
+ return n.string().describe("A short ID, e.g. \"flour\".");
668
+ }
669
+ // src/kowalski/recipe.tsx
670
+ var Je = "private", Q = qe, Ye = e.strictObject({
671
+ data: Q,
672
+ ...o,
673
+ scope: o.scope.default(Je)
674
+ });
675
+ c("step_", e.strictObject({
676
+ done: e.boolean(),
677
+ endsAt: e.number().nullable()
678
+ }), {
679
+ cooking: e.boolean().default(!1),
680
+ servings: e.number().default(1)
681
+ });
682
+ // src/kowalski/time-since.tsx
683
+ var Xe = "public", $ = /* @__PURE__ */ e.strictObject({
684
+ action: e.string().describe("The big button that updates it, as a short command for doing it now, e.g. \"Give pill\" or \"Water plants\"."),
685
+ label: e.string().describe("A small line above the title naming the kind of tracker, e.g. \"Pill timer\". Pass an empty string to hide it."),
686
+ subject: e.string().describe("What gets done, as a short noun, e.g. \"pill\" or \"watering\". With \"pill\", the timestamp reads \"Last pill today at 5:04 PM\"."),
687
+ title: e.string().describe("Who or what is being tracked, shown as the heading, e.g. \"Winnie\" or \"Fern\".")
688
+ }).describe("Four short UI strings for an existing TimeSince React component: a heading, tracker label, event noun, and button command. The component already implements the elapsed clock, reset button, and saved state. Supply concise copy for each field, not explanations, implementation instructions, timestamps, or claims about the timer’s current state."), Ze = e.strictObject({
689
+ data: $,
690
+ ...o,
691
+ scope: o.scope.default(Xe)
692
+ });
693
+ s({ lastAt: e.number().nullable().default(null) });
694
+ // src/kowalski/catalog.ts
695
+ var Qe = {
696
+ billSplit: {
697
+ exportName: "BillSplit",
698
+ props: d
37
699
  },
38
700
  bookmark: {
39
- description: "Display, edit, and retain a web bookmark. No implicit metadata fetch.",
40
701
  exportName: "Bookmark",
41
- props: d({
42
- note: t.string().max(1e4).default(""),
43
- title: v(),
44
- url: C()
45
- }),
46
- storeSchema: _({
47
- note: w(t.string().max(1e4).default("")),
48
- title: w(t.string().max(160).default("")),
49
- url: w(C().nullable().default(null))
50
- })
702
+ props: ie
51
703
  },
52
704
  budget: {
53
- description: "Track spending against category limits for one budget period. No bank connection or payments.",
54
705
  exportName: "Budget",
55
- props: d({
56
- categories: m({
57
- label: t.string().min(1).max(80),
58
- limit: t.number().positive().max(0xe8d4a51000)
59
- }, 12),
60
- currency: f(),
61
- title: v("Budget")
62
- }),
63
- storeSchema: p(i.budget, t.number().min(0).max(0xe8d4a51000), {})
706
+ props: m
64
707
  },
65
708
  calculator: {
66
- description: "A persistent keypad calculator with chained arithmetic, decimals, sign, percent, and repeated equals. Supports +, -, *, /. No executable expression strings.",
67
709
  exportName: "Calculator",
68
- props: d({
69
- left: t.number().default(0),
70
- operator: t.enum([
71
- "+",
72
- "-",
73
- "*",
74
- "/"
75
- ]).default("+"),
76
- right: t.number().default(0),
77
- title: v("Calculate")
78
- }),
79
- storeSchema: _({ calculation: t.object({
80
- entry: t.string().max(40).regex(/^(?:-?\d+(?:\.\d*)?(?:e[+-]?\d+)?|Error)$/),
81
- left: t.number(),
82
- operator: t.enum([
83
- "+",
84
- "-",
85
- "*",
86
- "/"
87
- ]),
88
- overwrite: t.boolean(),
89
- phase: t.enum([
90
- "left",
91
- "operator",
92
- "right",
93
- "result",
94
- "error"
95
- ]),
96
- right: t.number()
97
- }).refine((e) => e.phase === "error" ? e.entry === "Error" : e.entry !== "Error" && Number.isFinite(Number(e.entry)), "Calculator entry must match its phase and represent a finite number.").default({
98
- entry: "0",
99
- left: 0,
100
- operator: "+",
101
- overwrite: !1,
102
- phase: "left",
103
- right: 0
104
- }) })
710
+ props: _
105
711
  },
106
712
  checklist: {
107
- description: "A persistent checklist with independent completion and progress. No external actions.",
108
713
  exportName: "Checklist",
109
- props: d({
110
- items: m({ label: t.string().min(1).max(500) }, 100),
111
- title: v()
112
- }),
113
- storeSchema: p(i.checklist, t.boolean(), {})
714
+ props: se
114
715
  },
115
716
  colorPalette: {
116
- description: "Choose and retain an sRGB color and display matching shades.",
117
717
  exportName: "ColorPalette",
118
- props: d({
119
- color: t.string().regex(/^#[\da-fA-F]{6}$/),
120
- title: v("Palette")
121
- }),
122
- storeSchema: _({ color: w(t.string().regex(/^#[\da-fA-F]{6}$/).default("#6366f1")) })
718
+ props: le
123
719
  },
124
720
  contact: {
125
- description: "Display, edit, and retain a contact. Does not insert into the address book.",
126
721
  exportName: "Contact",
127
- props: d({
128
- email: t.email().optional(),
129
- name: t.string().min(1).max(160),
130
- phone: t.string().min(1).max(80).optional()
131
- }),
132
- storeSchema: _({
133
- email: w(t.email().nullable().default(null)),
134
- name: w(t.string().max(160).default("")),
135
- phone: w(t.string().min(1).max(80).nullable().default(null))
136
- })
722
+ props: fe
137
723
  },
138
724
  countdown: {
139
- description: "Count down to an explicit instant. Resolve missing dates before instantiation.",
140
725
  exportName: "Countdown",
141
- props: d({
142
- target: t.iso.datetime({ offset: !0 }),
143
- timeZone: x().default("UTC"),
144
- title: v()
145
- }),
146
- storeSchema: _({ target: w(t.iso.datetime({ offset: !0 }).nullable().default(null)) })
726
+ props: me
147
727
  },
148
728
  event: {
149
- description: "Save and edit event details in the app. Does not create a calendar event.",
150
729
  exportName: "Event",
151
- props: d({
152
- location: t.string().max(500).default(""),
153
- startsAt: t.iso.datetime({ offset: !0 }).nullable().default(null),
154
- timeZone: x().default("UTC"),
155
- title: v()
156
- }),
157
- storeSchema: _({
158
- location: w(t.string().max(500).default("")),
159
- startsAt: w(t.iso.datetime({ offset: !0 }).nullable().default(null)),
160
- title: w(t.string().max(160).default(""))
161
- })
730
+ props: _e
162
731
  },
163
732
  expense: {
164
- description: "Edit and retain one expense. No payments, bank connection, or exchange-rate lookup.",
165
733
  exportName: "Expense",
166
- props: d({
167
- amount: t.number().min(0).max(0xe8d4a51000),
168
- category: t.string().max(80).default("Other"),
169
- currency: f(),
170
- title: v()
171
- }),
172
- storeSchema: _({
173
- amount: t.number().min(0).max(0xe8d4a51000).default(0),
174
- category: w(t.string().max(80).default("Other")),
175
- title: w(t.string().max(160).default(""))
176
- })
734
+ props: ye
735
+ },
736
+ fortune: {
737
+ exportName: "Fortune",
738
+ props: Y
177
739
  },
178
740
  goal: {
179
- description: "A personal goal with editable progress, target, and a fixed increment. Not a distributed counter.",
180
741
  exportName: "Goal",
181
- props: d({
182
- progress: t.number().min(0).max(0xe8d4a51000).default(0),
183
- step: t.number().positive().max(1e9).default(1),
184
- target: t.number().positive().max(0xe8d4a51000),
185
- title: v(),
186
- unit: t.string().max(40).default("")
187
- }),
188
- storeSchema: _({ progress: t.number().min(0).default(0) })
742
+ props: E
189
743
  },
190
744
  habit: {
191
- description: "Track a habit by local date and edit its weekday schedule. No notifications.",
192
745
  exportName: "Habit",
193
- props: d({
194
- timeZone: x().default("UTC"),
195
- title: v(),
196
- weekdays: S()
197
- }),
198
- storeSchema: p(i.habit, t.boolean(), { weekdays: S() })
746
+ props: A
199
747
  },
200
748
  ledger: {
201
- description: "A running tab of shared costs between two people, split evenly, with settle up. No payments.",
202
749
  exportName: "Ledger",
203
- props: d({
204
- currency: f(),
205
- people: m({ label: t.string().min(1).max(80) }, 2, 2),
206
- title: v("Shared tab")
207
- }),
208
- storeSchema: _({ entries: t.array(t.strictObject({
209
- amount: t.number().positive().max(0xe8d4a51000),
210
- id: h(),
211
- label: t.string().max(160),
212
- paidBy: h()
213
- })).max(200).default([]) })
750
+ props: N
751
+ },
752
+ lesson: {
753
+ exportName: "Lesson",
754
+ props: Ke
214
755
  },
215
756
  note: {
216
- description: "An editable persistent note. Plain text; no HTML or code execution.",
217
757
  exportName: "Note",
218
- props: d({
219
- body: t.string().max(2e4),
220
- title: t.string().max(160)
221
- }),
222
- storeSchema: _({
223
- body: w(t.string().max(2e4).default("")),
224
- title: w(t.string().max(160).default(""))
225
- })
758
+ props: be
226
759
  },
227
760
  poll: {
228
761
  exportName: "Poll",
229
- description: "Cast or change a vote and derive totals from votes. Shared voting only when explicitly requested.",
230
- props: d({
231
- options: m({ label: t.string().min(1).max(160) }, 12, 2),
232
- question: t.string().min(1).max(500),
233
- shared: t.boolean().default(!1)
234
- }),
235
- storeSchema: p(i.poll, h(), {})
762
+ props: xe
236
763
  },
237
764
  randomPicker: {
238
- description: "Flip a coin, roll a die, or pick from a bounded integer range or list. Retains the last result.",
239
765
  exportName: "RandomPicker",
240
- props: t.discriminatedUnion("mode", [
241
- d({
242
- mode: t.literal("coin"),
243
- title: v("Pick one")
244
- }),
245
- d({
246
- mode: t.literal("dice"),
247
- title: v("Pick one")
248
- }),
249
- d({
250
- maximum: t.number().int().min(-1e9).max(1e9),
251
- minimum: t.number().int().min(-1e9).max(1e9),
252
- mode: t.literal("range"),
253
- title: v("Pick one")
254
- }).refine((e) => e.minimum <= e.maximum, {
255
- message: "Minimum cannot exceed maximum.",
256
- path: ["maximum"]
257
- }),
258
- d({
259
- mode: t.literal("list"),
260
- options: t.array(t.string().min(1).max(160)).min(1).max(100),
261
- title: v("Pick one")
262
- })
263
- ]),
264
- storeSchema: _({ result: t.strictObject({
265
- domain: g(),
266
- value: t.union([t.number().int(), t.string().max(160)])
267
- }).nullable().default(null) })
766
+ props: we
268
767
  },
269
768
  rating: {
270
- description: "Rate one thing from one to five stars and keep a short note about it.",
271
769
  exportName: "Rating",
272
- props: d({
273
- subject: t.string().min(1).max(160),
274
- title: v("Your rating")
275
- }),
276
- storeSchema: _({
277
- note: w(t.string().max(2e3).default("")),
278
- stars: t.number().int().min(0).max(5).default(0)
279
- })
770
+ props: De
280
771
  },
281
772
  recipe: {
282
- description: "Cook a recipe whose steps follow the Recipe Graph Format (rgf/0-draft): each step uses ingredients or earlier step outputs, waits on the steps in after, and may carry a duration, doneness cue, and attention. Ingredients carry a numeric amount and unit, and meta.servings is a number, so amounts scale with servings. Shows running timers, the current step, and the next few. No nutrition or shopping lookup.",
283
773
  exportName: "Recipe",
284
- props: d({
285
- ingredients: m({
286
- amount: t.number().positive().max(1e6).optional(),
287
- label: t.string().min(1).max(160),
288
- notes: t.array(t.string().max(160)).max(10).optional(),
289
- unit: t.string().max(40).optional()
290
- }, 60),
291
- servings: t.number().int().min(1).max(100).optional(),
292
- steps: t.array(t.strictObject({
293
- after: t.array(h()).max(60).optional(),
294
- attention: t.enum(["active", "passive"]).optional(),
295
- doneness: t.string().max(200).optional(),
296
- duration: t.strictObject({
297
- maxMinutes: t.number().nonnegative().max(10080).optional(),
298
- minMinutes: t.number().nonnegative().max(10080).optional(),
299
- raw: t.string().min(1).max(80)
300
- }).refine((e) => e.minMinutes === void 0 || e.maxMinutes === void 0 || e.minMinutes <= e.maxMinutes, "minMinutes cannot exceed maxMinutes.").optional(),
301
- equipment: t.array(t.string().min(1).max(160)).max(20).optional(),
302
- id: h(),
303
- instruction: t.string().min(1).max(500),
304
- kind: t.enum([
305
- "setup",
306
- "transform",
307
- "wait",
308
- "serve"
309
- ]).optional(),
310
- label: t.string().max(80).optional(),
311
- outputs: t.array(t.strictObject({
312
- id: h(),
313
- name: t.string().max(160).optional()
314
- })).max(10).optional(),
315
- temperature: t.string().min(1).max(80).optional(),
316
- uses: t.array(t.strictObject({
317
- id: h(),
318
- portion: t.string().max(80).optional(),
319
- source: t.discriminatedUnion("kind", [t.strictObject({
320
- ingredientId: h(),
321
- kind: t.literal("ingredient")
322
- }), t.strictObject({
323
- kind: t.literal("output"),
324
- outputId: h()
325
- })])
326
- })).max(30).default([])
327
- })).min(1).max(60),
328
- title: v(),
329
- yield: t.string().max(160).optional()
330
- }).superRefine((e, t) => {
331
- let n = new Set(e.ingredients.map((e) => e.id)), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set();
332
- for (let a of e.steps) {
333
- !r.has(a.id) && (a.after ?? []).every((e) => r.has(e)) && a.uses.every((e) => e.source.kind === "ingredient" ? n.has(e.source.ingredientId) : i.has(e.source.outputId)) || t.addIssue({
334
- code: "custom",
335
- message: `Step ${a.id} needs a unique ID and can only use ingredients and earlier steps.`
336
- }), r.add(a.id);
337
- for (let e of a.outputs ?? []) i.has(e.id) && t.addIssue({
338
- code: "custom",
339
- message: "Output IDs must be unique."
340
- }), i.add(e.id);
341
- }
342
- }),
343
- storeSchema: p(i.recipe, t.strictObject({
344
- done: t.boolean(),
345
- endsAt: t.number().nullable()
346
- }), {
347
- cooking: t.boolean().default(!1),
348
- servings: t.number().int().min(1).max(100).default(1)
349
- })
774
+ props: Ye
350
775
  },
351
776
  reminder: {
352
- description: "Complete, reopen, and edit an in-app reminder. Does not schedule notifications.",
353
777
  exportName: "Reminder",
354
- props: d({
355
- dueAt: t.iso.datetime({ offset: !0 }).nullable().default(null),
356
- recurrence: t.enum([
357
- "none",
358
- "daily",
359
- "weekly"
360
- ]).default("none"),
361
- timeZone: x().optional(),
362
- title: t.string().min(1).max(500)
363
- }),
364
- storeSchema: _({
365
- completedAt: t.number().nullable().default(null),
366
- dueAt: w(t.iso.datetime({ offset: !0 }).nullable().default(null)),
367
- title: w(t.string().max(500).default(""))
368
- })
778
+ props: ke
369
779
  },
370
780
  rotation: {
371
- description: "Take turns through a fixed group in order and pass the turn on when done.",
372
781
  exportName: "Rotation",
373
- props: d({
374
- people: m({ label: t.string().min(1).max(80) }, 20, 2),
375
- task: t.string().min(1).max(160),
376
- title: v("Whose turn")
377
- }),
378
- storeSchema: _({
379
- completed: t.number().int().min(0).default(0),
380
- turn: h().nullable().default(null)
381
- })
782
+ props: je
382
783
  },
383
784
  scoreboard: {
384
- description: "Keep score for a few players with a fixed step. Not a distributed counter or a league.",
385
785
  exportName: "Scoreboard",
386
- props: d({
387
- players: m({ label: t.string().min(1).max(80) }, 12, 2),
388
- step: t.number().int().positive().max(1e3).default(1),
389
- title: v("Scores")
390
- }),
391
- storeSchema: p(i.scoreboard, t.number().int(), {})
786
+ props: Ne
392
787
  },
393
788
  shoppingList: {
394
- description: "Check items off a shopping list with optional prices and a running cart total. No ordering.",
395
789
  exportName: "ShoppingList",
396
- props: d({
397
- currency: f(),
398
- items: m({
399
- label: t.string().min(1).max(160),
400
- price: t.number().min(0).max(1e9).optional(),
401
- quantity: t.number().int().min(1).max(999).default(1)
402
- }, 100),
403
- title: v("Shopping list")
404
- }),
405
- storeSchema: p(i.shoppingList, t.boolean(), {})
790
+ props: Fe
406
791
  },
407
792
  taskBoard: {
408
- description: "Move tasks between To do, Doing, and Done. No assignees, dates, or sync.",
409
793
  exportName: "TaskBoard",
410
- props: d({
411
- tasks: m({ label: t.string().min(1).max(500) }, 50),
412
- title: v("Tasks")
413
- }),
414
- storeSchema: p(i.taskBoard, t.enum([
415
- "todo",
416
- "doing",
417
- "done"
418
- ]), {})
794
+ props: Le
795
+ },
796
+ timeSince: {
797
+ exportName: "TimeSince",
798
+ props: Ze
419
799
  },
420
800
  timeZone: {
421
- description: "Compare local times in named time zones, live or at an explicit instant.",
422
801
  exportName: "TimeZone",
423
- props: d({
424
- at: t.iso.datetime({ offset: !0 }).nullable().default(null),
425
- title: v("World clock"),
426
- zones: t.array(x()).min(2).max(6)
427
- }),
428
- storeSchema: _({ at: w(t.iso.datetime({ offset: !0 }).nullable().default(null)) })
802
+ props: ze
429
803
  },
430
804
  timer: {
431
- description: "Countdown, focus, break, or stopwatch. Start, pause, resume, reset; no background alarm.",
432
805
  exportName: "Timer",
433
- props: d({
434
- durationSeconds: t.number().int().min(1).max(604800).default(300),
435
- mode: t.enum([
436
- "countdown",
437
- "focus",
438
- "break",
439
- "stopwatch"
440
- ]).default("countdown"),
441
- title: v("Timer")
442
- }),
443
- storeSchema: _({
444
- elapsedSeconds: t.number().min(0).default(0),
445
- startedAt: t.number().nullable().default(null)
446
- })
806
+ props: Ve
447
807
  },
448
808
  trip: {
449
- description: "Edit and retain trip details. No bookings or itinerary retrieval.",
450
809
  exportName: "Trip",
451
- props: d({
452
- destination: t.string().min(1).max(160),
453
- endDate: t.iso.date().nullable().default(null),
454
- origin: t.string().min(1).max(160),
455
- startDate: t.iso.date().nullable().default(null),
456
- title: v("Trip"),
457
- transport: t.enum([
458
- "car",
459
- "train",
460
- "plane",
461
- "walk",
462
- "other"
463
- ]).default("other")
464
- }).refine((e) => !e.startDate || !e.endDate || e.endDate >= e.startDate, {
465
- message: "The trip cannot end before it starts.",
466
- path: ["endDate"]
467
- }),
468
- storeSchema: _({
469
- destination: w(t.string().max(160).default("")),
470
- endDate: w(t.iso.date().nullable().default(null)),
471
- origin: w(t.string().max(160).default("")),
472
- startDate: w(t.iso.date().nullable().default(null))
473
- }).refine((e) => !e.startDate.value || !e.endDate.value || e.endDate.value >= e.startDate.value, "The trip cannot end before it starts.")
810
+ props: Ue
474
811
  },
475
812
  unitConverter: {
476
- description: "Convert compatible length, mass, or temperature units deterministically.",
477
813
  exportName: "UnitConverter",
478
- props: d({
479
- from: b(),
480
- title: v("Convert"),
481
- to: b(),
482
- value: t.number()
483
- }).refine(({ from: e, to: t }) => u[e].dimension === u[t].dimension, {
484
- message: "Source and destination units must measure the same dimension.",
485
- path: ["to"]
486
- }),
487
- storeSchema: _({
488
- from: w(b().default("km")),
489
- to: w(b().default("mi")),
490
- value: t.number().default(0)
491
- }).refine(({ from: e, to: t }) => u[e.value].dimension === u[t.value].dimension, "Incompatible units.")
492
- }
493
- }, s = t.enum(/* @__PURE__ */ "checklist.timer.habit.goal.poll.event.reminder.trip.countdown.timeZone.colorPalette.billSplit.expense.unitConverter.calculator.randomPicker.contact.bookmark.note.budget.scoreboard.taskBoard.recipe.rotation.shoppingList.rating.ledger".split(".")), c = t.object({
494
- configuration: t.string().default(""),
495
- voter: t.string().min(1)
496
- }), l = {
497
- max_allowed_length: 2048,
498
- protocols: ["http", "https"],
499
- require_host: !0,
500
- require_protocol: !0,
501
- require_tld: !1,
502
- require_valid_protocol: !0
503
- }, u = {
504
- c: {
505
- dimension: "temperature",
506
- factor: 1,
507
- offset: 0
508
- },
509
- f: {
510
- dimension: "temperature",
511
- factor: 5 / 9,
512
- offset: -32
513
- },
514
- ft: {
515
- dimension: "length",
516
- factor: .3048,
517
- offset: 0
518
- },
519
- g: {
520
- dimension: "mass",
521
- factor: .001,
522
- offset: 0
523
- },
524
- k: {
525
- dimension: "temperature",
526
- factor: 1,
527
- offset: -273.15
528
- },
529
- kg: {
530
- dimension: "mass",
531
- factor: 1,
532
- offset: 0
533
- },
534
- km: {
535
- dimension: "length",
536
- factor: 1e3,
537
- offset: 0
538
- },
539
- lb: {
540
- dimension: "mass",
541
- factor: .45359237,
542
- offset: 0
543
- },
544
- m: {
545
- dimension: "length",
546
- factor: 1,
547
- offset: 0
548
- },
549
- mi: {
550
- dimension: "length",
551
- factor: 1609.344,
552
- offset: 0
814
+ props: Ge
553
815
  }
554
816
  };
555
- function d(e) {
556
- return t.strictObject({
557
- id: n,
558
- revision: t.number().int().min(0).default(0),
559
- scope: r,
560
- ...e
561
- });
562
- }
563
- function f() {
564
- return t.string().regex(/^[A-Z]{3}$/).default("USD");
565
- }
566
- function p(e, n, r) {
567
- let i = _(r), a = new Set(Object.keys(i.shape));
568
- return t.intersection(i.loose(), t.looseRecord(t.templateLiteral([e, t.string()]), n)).refine((t) => Object.keys(t).every((t) => a.has(t) || t.startsWith(e)), `Item fields must start with ${e}.`);
569
- }
570
- function m(e, n, r = 1) {
571
- return t.array(t.strictObject(e).extend({ id: h() })).min(r).max(n).refine(y, "IDs must be unique.");
572
- }
573
- function h() {
574
- return t.string().min(1).max(80).refine((e) => e !== "__proto__");
575
- }
576
- function g() {
577
- return t.union([
578
- t.strictObject({ mode: t.literal("coin") }),
579
- t.strictObject({ mode: t.literal("dice") }),
580
- t.strictObject({
581
- maximum: t.number().int(),
582
- minimum: t.number().int(),
583
- mode: t.literal("range")
584
- }),
585
- t.strictObject({
586
- mode: t.literal("list"),
587
- options: t.array(t.string().max(160)).max(100)
588
- })
589
- ]);
590
- }
591
- function _(e) {
592
- return t.object({
593
- configuration: t.record(t.string(), t.unknown()).nullable().default(null),
594
- configurationRevision: t.number().int().min(0).default(0),
595
- ...e
596
- });
597
- }
598
- function v(e) {
599
- let n = t.string().min(1).max(160);
600
- return e === void 0 ? n : n.default(e);
601
- }
602
- function y(e) {
603
- let t = e.map((e) => "id" in e ? e.id : void 0);
604
- return new Set(t).size === t.length;
605
- }
606
- function b() {
607
- return t.enum([
608
- "m",
609
- "km",
610
- "mi",
611
- "ft",
612
- "kg",
613
- "g",
614
- "lb",
615
- "c",
616
- "f",
617
- "k"
618
- ]);
619
- }
620
- function x() {
621
- return t.string().max(80).refine((e) => {
622
- try {
623
- return new Intl.DateTimeFormat("en", { timeZone: e }).format(0), !0;
624
- } catch {
625
- return !1;
626
- }
627
- }, "Use a valid IANA time zone.");
628
- }
629
- function S() {
630
- return t.array(t.enum(a)).max(7).default([...a]);
631
- }
632
- function C() {
633
- return t.string().max(2048).refine((t) => e(t, l), "Use a valid HTTP or HTTPS address.");
634
- }
635
- function w(e) {
636
- return t.object({ value: e }).default(() => ({ value: e.parse(void 0) }));
637
- }
638
- export { i as entryPrefixes, o as kowalskiCatalog, s as kowalskiComponentSchema, n as kowalskiFeatureId, r as kowalskiScope, c as pollVoterSchema, u as unitDefinitions, l as webAddressOptions, a as weekdayNames };
817
+ export { u as BillSplitData, f as BookmarkData, p as BudgetData, g as CalculatorData, v as ChecklistData, y as ColorPaletteData, b as ContactData, x as CountdownData, S as EventData, C as ExpenseData, J as FortuneData, T as GoalData, k as HabitData, M as LedgerData, X as LessonData, F as NoteData, I as PollData, L as RandomPickerData, R as RatingData, Q as RecipeData, z as ReminderData, B as RotationData, V as ScoreboardData, H as ShoppingListData, U as TaskBoardData, $ as TimeSinceData, W as TimeZoneData, G as TimerData, K as TripData, q as UnitConverterData, Qe as kowalskiCatalog, ee as kowalskiComponentSchema, i as kowalskiFeatureId, a as kowalskiScope, Se as pollVoterSchema, r as unitDefinitions, ne as webAddressOptions };