@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
@@ -0,0 +1,169 @@
1
+ import { Text } from '@flickfyi/core'
2
+ import { Input, Picker } from '@flickfyi/core/atoms'
3
+ import { Field, List, Stat } from '@flickfyi/core/molecules'
4
+ import * as stylex from '@stylexjs/stylex'
5
+ import { useState } from 'react'
6
+ import { z } from 'zod/v4'
7
+
8
+ import { useConfiguredFeature } from '~/hooks/use-configured-feature'
9
+ import { formatCurrency } from '~/kowalski/calculations'
10
+ import type { CreateSchemas } from '~/kowalski/create-schemas'
11
+ import { entries, featureFields } from '~/kowalski/feature-schema'
12
+ import { parseNumberInput, resolveCurrency } from '~/kowalski/format'
13
+ import {
14
+ FeatureAction,
15
+ FeatureFacts,
16
+ FeatureFrame,
17
+ FeatureProgress,
18
+ FeatureWell,
19
+ layout,
20
+ } from '~/kowalski/frame'
21
+ import { roles } from '~/themes/shared'
22
+
23
+ const defaultId = 'KowalskiBudget'
24
+ const defaultScope = 'private'
25
+
26
+ export const BudgetData = /* @__PURE__ */ z
27
+ .strictObject({
28
+ categories: z
29
+ .array(
30
+ z.strictObject({
31
+ id: z.string().describe('A short ID, unique within this list, e.g. "tent".'),
32
+ label: z.string().describe('The category name, e.g. "Groceries".'),
33
+ limit: z.number().describe('The spending limit for the period, e.g. 400.'),
34
+ })
35
+ )
36
+ .describe('A few spending categories.'),
37
+ currency: z
38
+ .string()
39
+ .optional()
40
+ .describe('A three-letter ISO currency code, e.g. "USD" or "EUR". Omit for "USD".'),
41
+ title: z.string().optional().describe('A short heading. Omit for "Budget".'),
42
+ })
43
+ .describe(
44
+ 'Track spending against category limits for one budget period. No bank connection or payments.'
45
+ )
46
+
47
+ export type BudgetData = z.infer<typeof BudgetData>
48
+
49
+ export const BudgetProps = z.strictObject({
50
+ data: BudgetData,
51
+ ...featureFields,
52
+ scope: featureFields.scope.default(defaultScope),
53
+ })
54
+
55
+ export type BudgetProps = z.input<typeof BudgetProps> & {
56
+ style?: stylex.StyleXArray<stylex.StyleXStyles>
57
+ }
58
+
59
+ export const budgetStoreSchema = entries('spent_', z.number(), {})
60
+
61
+ export const createSchemas: CreateSchemas = ({
62
+ id = defaultId,
63
+ scope = defaultScope,
64
+ } = {}) => ({
65
+ [`stores/${scope}/${id}`]: budgetStoreSchema,
66
+ })
67
+
68
+ export function Budget({
69
+ data,
70
+ id,
71
+ revision = 0,
72
+ scope = defaultScope,
73
+ style,
74
+ }: BudgetProps) {
75
+ const categories =
76
+ data.categories.length > 0
77
+ ? data.categories
78
+ : [{ id: 'general', label: 'General', limit: 0 }]
79
+ const currency = resolveCurrency(data.currency)
80
+ const schema = budgetStoreSchema
81
+ const store = useConfiguredFeature({
82
+ name: id ?? defaultId,
83
+ revision,
84
+ schema,
85
+ scope,
86
+ seed: schema.parse({}),
87
+ })
88
+ const [categoryId, setCategoryId] = useState(categories[0].id)
89
+ const [amount, setAmount] = useState({ value: '' })
90
+ const money = (value: number) => formatCurrency(value, currency)
91
+ const spentOn = (id: string) => store.value[`spent_${id}`] ?? 0
92
+ const spent = categories.reduce((total, category) => total + spentOn(category.id), 0)
93
+ const limit = categories.reduce((total, category) => total + category.limit, 0)
94
+ const left = limit - spent
95
+ const category = categories.find(option => option.id === categoryId) ?? categories[0]
96
+ const parsed = parseNumberInput(amount.value, currency)
97
+ const valid = Number.isFinite(parsed) && parsed > 0
98
+ return (
99
+ <FeatureFrame
100
+ style={style}
101
+ onRetry={store.retry}
102
+ notice={store.error}
103
+ component="budget"
104
+ title={data.title ?? 'Budget'}
105
+ trailing={
106
+ <Text {...stylex.props(roles.muted, left < 0 && layout.notice)}>
107
+ {left < 0 ? `${money(-left)} over` : `${money(left)} left`}
108
+ </Text>
109
+ }
110
+ >
111
+ <FeatureWell>
112
+ <Stat>
113
+ <Stat.Value>{money(spent)}</Stat.Value>
114
+ <Stat.Caption>{`Spent of ${money(limit)}`}</Stat.Caption>
115
+ </Stat>
116
+ <FeatureProgress
117
+ component="budget"
118
+ value={limit > 0 ? Math.min(1, spent / limit) : 0}
119
+ />
120
+ </FeatureWell>
121
+ <FeatureFacts>
122
+ {categories.map(option => (
123
+ <List.Item
124
+ description={
125
+ spentOn(option.id) > option.limit
126
+ ? `${money(spentOn(option.id) - option.limit)} over`
127
+ : undefined
128
+ }
129
+ key={option.id}
130
+ label={option.label}
131
+ trailing={`${money(spentOn(option.id))} of ${money(option.limit)}`}
132
+ />
133
+ ))}
134
+ </FeatureFacts>
135
+ <Field error={amount.value && !valid && 'Enter an amount.'} label="Add spending">
136
+ <Picker label="Category" value={category.id} onChange={setCategoryId}>
137
+ {categories.map(option => (
138
+ <Text key={option.id} value={option.id}>
139
+ {option.label}
140
+ </Text>
141
+ ))}
142
+ </Picker>
143
+ <Input
144
+ placeholder="Amount"
145
+ value={amount.value}
146
+ onChange={value => setAmount({ value })}
147
+ style={[layout.input]}
148
+ />
149
+ </Field>
150
+ <FeatureAction
151
+ component="budget"
152
+ disabled={!valid || !store.ready || store.saving}
153
+ icon="plus"
154
+ size="lg"
155
+ variant="primary"
156
+ onClick={() =>
157
+ store.set(
158
+ current => ({
159
+ [`spent_${category.id}`]: (current[`spent_${category.id}`] ?? 0) + parsed,
160
+ }),
161
+ () => setAmount(current => (current === amount ? { value: '' } : current))
162
+ )
163
+ }
164
+ >
165
+ {`Add to ${category.label}`}
166
+ </FeatureAction>
167
+ </FeatureFrame>
168
+ )
169
+ }
@@ -0,0 +1,202 @@
1
+ import { Flex, Text } from '@flickfyi/core'
2
+ import { Button } from '@flickfyi/core/atoms'
3
+ import * as stylex from '@stylexjs/stylex'
4
+ import { z } from 'zod/v4'
5
+
6
+ import { buttonVars } from '~/atoms/button/button.stylex'
7
+ import { useConfiguredFeature } from '~/hooks/use-configured-feature'
8
+ import {
9
+ calculatorDisplay,
10
+ calculatorEquation,
11
+ calculatorKeyLabel,
12
+ calculatorKeys,
13
+ initialCalculator,
14
+ pressCalculatorKey,
15
+ } from '~/kowalski/calculator'
16
+ import type { CreateSchemas } from '~/kowalski/create-schemas'
17
+ import { featureFields, store } from '~/kowalski/feature-schema'
18
+ import { FeatureFrame, FeatureWell } from '~/kowalski/frame'
19
+ import { size, space, text } from '~/themes/scale.stylex'
20
+ import { button, roles } from '~/themes/shared'
21
+ import { colors, font } from '~/themes/tokens.stylex'
22
+
23
+ const defaultId = 'KowalskiCalculator'
24
+ const defaultScope = 'private'
25
+
26
+ export const CalculatorData = /* @__PURE__ */ z
27
+ .strictObject({
28
+ left: z.number().optional().describe('The starting number. Omit for 0.'),
29
+ operator: z
30
+ .enum(['+', '-', '*', '/'])
31
+ .optional()
32
+ .describe('The pending operator. Omit for "+".'),
33
+ right: z.number().optional().describe('The second operand. Omit for 0.'),
34
+ title: z.string().optional().describe('A short heading. Omit for "Calculate".'),
35
+ })
36
+ .describe(
37
+ 'A persistent keypad calculator with chained arithmetic, decimals, sign, percent, and repeated equals. Supports +, -, *, /. No executable expression strings.'
38
+ )
39
+
40
+ export type CalculatorData = z.infer<typeof CalculatorData>
41
+
42
+ export const CalculatorProps = z.strictObject({
43
+ data: CalculatorData,
44
+ ...featureFields,
45
+ scope: featureFields.scope.default(defaultScope),
46
+ })
47
+
48
+ export type CalculatorProps = z.input<typeof CalculatorProps> & {
49
+ style?: stylex.StyleXArray<stylex.StyleXStyles>
50
+ }
51
+
52
+ export const calculatorStoreSchema = store({
53
+ calculation: z
54
+ .object({
55
+ entry: z
56
+ .string()
57
+ .max(40)
58
+ .regex(/^(?:-?\d+(?:\.\d*)?(?:e[+-]?\d+)?|Error)$/),
59
+ left: z.number(),
60
+ operator: z.enum(['+', '-', '*', '/']),
61
+ overwrite: z.boolean(),
62
+ phase: z.enum(['left', 'operator', 'right', 'result', 'error']),
63
+ right: z.number(),
64
+ })
65
+ .refine(
66
+ calculation =>
67
+ calculation.phase === 'error'
68
+ ? calculation.entry === 'Error'
69
+ : calculation.entry !== 'Error' && Number.isFinite(Number(calculation.entry)),
70
+ 'Calculator entry must match its phase and represent a finite number.'
71
+ )
72
+ .default({
73
+ entry: '0',
74
+ left: 0,
75
+ operator: '+',
76
+ overwrite: false,
77
+ phase: 'left',
78
+ right: 0,
79
+ }),
80
+ })
81
+
82
+ export const createSchemas: CreateSchemas = ({
83
+ id = defaultId,
84
+ scope = defaultScope,
85
+ } = {}) => ({
86
+ [`stores/${scope}/${id}`]: calculatorStoreSchema,
87
+ })
88
+
89
+ export function Calculator({
90
+ data,
91
+ id,
92
+ revision = 0,
93
+ scope = defaultScope,
94
+ style,
95
+ }: CalculatorProps) {
96
+ const schema = calculatorStoreSchema
97
+ const store = useConfiguredFeature({
98
+ name: id ?? defaultId,
99
+ revision,
100
+ schema,
101
+ scope,
102
+ seed: schema.parse({ calculation: initialCalculator(data) }),
103
+ })
104
+ const calculation = store.value.calculation
105
+ const display = calculatorDisplay(calculation.entry)
106
+ return (
107
+ <FeatureFrame
108
+ style={style}
109
+ onRetry={store.retry}
110
+ notice={store.error}
111
+ component="calculator"
112
+ title={data.title ?? 'Calculate'}
113
+ >
114
+ <FeatureWell>
115
+ <Text {...stylex.props(roles.muted, calculatorStyles.equation)}>
116
+ {calculatorEquation(calculation)}
117
+ </Text>
118
+ <Text {...stylex.props(roles.display, calculatorStyles.value(display.length))}>
119
+ {display}
120
+ </Text>
121
+ {calculation.phase === 'error' && (
122
+ <Text {...stylex.props(roles.muted, calculatorStyles.error)}>
123
+ {calculation.operator === '/' && calculation.right === 0
124
+ ? 'Cannot divide by zero'
125
+ : 'Number out of range'}
126
+ </Text>
127
+ )}
128
+ </FeatureWell>
129
+ <Flex {...stylex.props(calculatorStyles.keypad)}>
130
+ {calculatorKeys.map(key => {
131
+ const operation = key === '+' || key === '-' || key === '*' || key === '/'
132
+ const utility =
133
+ key === 'backspace' || key === 'clear' || key === 'sign' || key === '%'
134
+ const selected =
135
+ operation && calculation.phase === 'operator' && calculation.operator === key
136
+ return (
137
+ <Button
138
+ accessibilityLabel={
139
+ key === 'backspace'
140
+ ? '⌫: delete last digit'
141
+ : calculatorKeyLabel(calculation, key)
142
+ }
143
+ key={key}
144
+ disabled={!store.ready}
145
+ selected={selected}
146
+ onClick={() => {
147
+ store.set(current => ({
148
+ calculation: pressCalculatorKey(current.calculation, key),
149
+ }))
150
+ }}
151
+ style={[
152
+ button.secondary,
153
+ (operation || utility) && calculatorStyles.operation,
154
+ key === '=' && button.primary,
155
+ calculatorStyles.key,
156
+ utility && calculatorStyles.utility,
157
+ operation && calculatorStyles.operator,
158
+ ]}
159
+ >
160
+ <Text {...stylex.props(roles.h2)}>
161
+ {calculatorKeyLabel(calculation, key)}
162
+ </Text>
163
+ </Button>
164
+ )
165
+ })}
166
+ </Flex>
167
+ </FeatureFrame>
168
+ )
169
+ }
170
+
171
+ // Keys sit directly in the tray at p-4, so their control radius stays concentric with it.
172
+ const calculatorStyles = /* @__PURE__ */ stylex.create({
173
+ equation: { textAlign: 'right' },
174
+ error: { textAlign: 'right' },
175
+ key: {
176
+ alignItems: 'center',
177
+ justifyContent: 'center',
178
+ minHeight: size[12],
179
+ minWidth: 0,
180
+ paddingLeft: 0,
181
+ paddingRight: 0,
182
+ textAlign: 'center',
183
+ },
184
+ keypad: {
185
+ display: 'grid',
186
+ gap: space[2],
187
+ gridTemplateColumns: 'repeat(4, minmax(0, 1fr))',
188
+ },
189
+ operation: { [buttonVars.background]: colors.tray },
190
+ operator: { [buttonVars.text]: colors.accentInk },
191
+ utility: { [buttonVars.text]: colors.muted },
192
+ value: (length: number) => ({
193
+ fontSize: length > 16 ? text.lg : length > 9 ? text['4xl'] : font.displaySize,
194
+ lineHeight:
195
+ length > 16
196
+ ? text.lgLeading
197
+ : length > 9
198
+ ? text['4xlLeading']
199
+ : font.displayLeading,
200
+ textAlign: 'right',
201
+ }),
202
+ })
@@ -0,0 +1,119 @@
1
+ import { Flex, Icon, Text } from '@flickfyi/core'
2
+ import * as stylex from '@stylexjs/stylex'
3
+ import { z } from 'zod/v4'
4
+
5
+ import { useConfiguredFeature } from '~/hooks/use-configured-feature'
6
+ import type { CreateSchemas } from '~/kowalski/create-schemas'
7
+ import { entries, featureFields } from '~/kowalski/feature-schema'
8
+ import { format } from '~/kowalski/format'
9
+ import { FeatureChoice, FeatureFrame, layout } from '~/kowalski/frame'
10
+ import { space } from '~/themes/scale.stylex'
11
+ import { appearance, roles } from '~/themes/shared'
12
+
13
+ const defaultId = 'KowalskiChecklist'
14
+ const defaultScope = 'private'
15
+
16
+ export const ChecklistData = /* @__PURE__ */ z
17
+ .strictObject({
18
+ items: z
19
+ .array(
20
+ z.strictObject({
21
+ id: z.string().describe('A short ID, unique within this list, e.g. "tent".'),
22
+ label: z.string().describe('One short task, e.g. "Pack tent".'),
23
+ })
24
+ )
25
+ .describe('The checklist items, in order.'),
26
+ title: z.string().describe('A short heading.'),
27
+ })
28
+ .describe(
29
+ 'A persistent checklist with independent completion and progress. No external actions.'
30
+ )
31
+
32
+ export type ChecklistData = z.infer<typeof ChecklistData>
33
+
34
+ export const ChecklistProps = z.strictObject({
35
+ data: ChecklistData,
36
+ ...featureFields,
37
+ scope: featureFields.scope.default(defaultScope),
38
+ })
39
+
40
+ export type ChecklistProps = z.input<typeof ChecklistProps> & {
41
+ style?: stylex.StyleXArray<stylex.StyleXStyles>
42
+ }
43
+
44
+ export const checklistStoreSchema = entries('completed_', z.boolean(), {})
45
+
46
+ export const createSchemas: CreateSchemas = ({
47
+ id = defaultId,
48
+ scope = defaultScope,
49
+ } = {}) => ({
50
+ [`stores/${scope}/${id}`]: checklistStoreSchema,
51
+ })
52
+
53
+ export function Checklist({
54
+ data,
55
+ id,
56
+ revision = 0,
57
+ scope = defaultScope,
58
+ style,
59
+ }: ChecklistProps) {
60
+ const items = data.items
61
+ const schema = checklistStoreSchema
62
+ const store = useConfiguredFeature({
63
+ name: id ?? defaultId,
64
+ revision,
65
+ schema,
66
+ scope,
67
+ seed: schema.parse({}),
68
+ })
69
+ const completed = (id: string) => store.value[`completed_${id}`] ?? false
70
+ const count = items.filter(item => completed(item.id)).length
71
+ const loading = !store.ready && !store.error
72
+ const remaining = items.length - count
73
+ return (
74
+ <FeatureFrame
75
+ style={style}
76
+ onRetry={store.retry}
77
+ notice={store.error}
78
+ component="checklist"
79
+ title={data.title}
80
+ trailing={
81
+ <Flex {...stylex.props(checklistStyles.status)}>
82
+ {!loading && remaining === 0 && (
83
+ <Icon name="checkmark.circle.fill" {...stylex.props(appearance.accent)} />
84
+ )}
85
+ <Text {...stylex.props(roles.muted)}>
86
+ {loading
87
+ ? 'Loading checklist…'
88
+ : `${format.formatNumber(count)} of ${format.formatNumber(items.length)} complete`}
89
+ </Text>
90
+ </Flex>
91
+ }
92
+ >
93
+ <Flex {...stylex.props(layout.list)}>
94
+ {/* Completed items sink below open ones; each group keeps its authored order. */}
95
+ {items
96
+ .toSorted((a, b) => Number(completed(a.id)) - Number(completed(b.id)))
97
+ .map(item => (
98
+ <FeatureChoice
99
+ key={item.id}
100
+ component="checklist"
101
+ label={item.label}
102
+ ready={store.ready}
103
+ selected={completed(item.id)}
104
+ onClick={() => {
105
+ store.set(current => ({
106
+ [`completed_${item.id}`]: !current[`completed_${item.id}`],
107
+ }))
108
+ }}
109
+ />
110
+ ))}
111
+ </Flex>
112
+ {store.saving && <Text {...stylex.props(roles.muted)}>Saving changes…</Text>}
113
+ </FeatureFrame>
114
+ )
115
+ }
116
+
117
+ const checklistStyles = /* @__PURE__ */ stylex.create({
118
+ status: { alignItems: 'center', flexDirection: 'row', gap: space[1.5] },
119
+ })