@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,575 +0,0 @@
1
- import { Flex, Icon, Text } from '@flickfyi/core'
2
- import { Button } from '@flickfyi/core/atoms'
3
- import { Field } from '@flickfyi/core/molecules'
4
- import * as stylex from '@stylexjs/stylex'
5
- import { Decimal } from 'decimal.js'
6
- import { isEqual } from 'lodash'
7
- import { Info } from 'luxon'
8
- import { useMemo, useState } from 'react'
9
-
10
- import { radius, size, space, text } from '~/themes/scale.stylex'
11
- import { appearance, button, roles } from '~/themes/shared'
12
- import { colors, font, shape } from '~/themes/tokens.stylex'
13
-
14
- import { localDate } from './calculations'
15
- import {
16
- kowalskiCatalog,
17
- type KowalskiInput,
18
- pollVoterSchema,
19
- type Weekday,
20
- weekdayNames,
21
- } from './catalog'
22
- import { format } from './format'
23
- import {
24
- FeatureAction,
25
- FeatureChoice,
26
- FeatureFrame,
27
- FeatureProgress,
28
- FeatureWell,
29
- layout,
30
- } from './frame'
31
- import { useClock } from './use-clock'
32
- import { useConfiguredFeature } from './use-configured-feature'
33
- import { useFeatureStore } from './use-feature-store'
34
-
35
- export function Checklist(input: KowalskiInput<'checklist'>) {
36
- const props = kowalskiCatalog.checklist.props.parse(input)
37
- const items = props.items
38
- const schema = kowalskiCatalog.checklist.storeSchema
39
- const store = useConfiguredFeature({
40
- name: props.id ?? 'KowalskiChecklist',
41
- revision: props.revision,
42
- schema,
43
- scope: props.scope,
44
- seed: schema.parse({}),
45
- })
46
- const completed = (id: string) => store.value[`completed_${id}`] === true
47
- const count = items.filter(item => completed(item.id)).length
48
- const loading = !store.ready && !store.error
49
- const remaining = items.length - count
50
- return (
51
- <FeatureFrame
52
- onRetry={store.retry}
53
- notice={store.error}
54
- component="checklist"
55
- title={props.title}
56
- trailing={
57
- <Flex {...stylex.props(checklistStyles.status)}>
58
- {!loading && remaining === 0 && (
59
- <Icon name="checkmark.circle.fill" {...stylex.props(appearance.accent)} />
60
- )}
61
- <Text {...stylex.props(roles.muted)}>
62
- {loading
63
- ? 'Loading checklist…'
64
- : `${format.formatNumber(count)} of ${format.formatNumber(items.length)} complete`}
65
- </Text>
66
- </Flex>
67
- }
68
- >
69
- <Flex {...stylex.props(layout.list)}>
70
- {/* Completed items sink below open ones; each group keeps its authored order. */}
71
- {items
72
- .toSorted((a, b) => Number(completed(a.id)) - Number(completed(b.id)))
73
- .map(item => (
74
- <FeatureChoice
75
- key={item.id}
76
- component="checklist"
77
- label={item.label}
78
- ready={store.ready}
79
- selected={completed(item.id)}
80
- onClick={() => {
81
- store.set(current => ({
82
- [`completed_${item.id}`]: current[`completed_${item.id}`] !== true,
83
- }))
84
- }}
85
- />
86
- ))}
87
- </Flex>
88
- {store.saving && <Text {...stylex.props(roles.muted)}>Saving changes…</Text>}
89
- </FeatureFrame>
90
- )
91
- }
92
-
93
- export function Goal(input: KowalskiInput<'goal'>) {
94
- const props = kowalskiCatalog.goal.props.parse(input)
95
- const schema = kowalskiCatalog.goal.storeSchema
96
- const store = useConfiguredFeature({
97
- name: props.id ?? 'KowalskiGoal',
98
- revision: props.revision,
99
- schema,
100
- scope: props.scope,
101
- seed: schema.parse({ progress: props.progress }),
102
- })
103
- const progress = store.value.progress
104
- const loading = !store.ready && !store.error
105
- const reached = !loading && progress >= props.target
106
- const number = useMemo(
107
- () =>
108
- format.formatters.getNumberFormat(format.locale, { maximumSignificantDigits: 17 }),
109
- []
110
- )
111
- const distance = new Decimal(props.target).minus(progress).abs().toNumber()
112
- const progressLabel = loading ? '—' : number.format(progress)
113
- const targetLabel = number.format(props.target)
114
- const distanceLabel = number.format(distance)
115
- const stepLabel = number.format(props.step)
116
- const nextProgress = new Decimal(progress).plus(props.step).toNumber()
117
- const previousProgress = Decimal.max(
118
- 0,
119
- new Decimal(progress).minus(props.step)
120
- ).toNumber()
121
- const unit = props.unit ? ` ${props.unit}` : ''
122
- const change = (direction: -1 | 1) =>
123
- store.set(current => {
124
- const next = Decimal.max(
125
- 0,
126
- new Decimal(current.progress).plus(props.step * direction)
127
- ).toNumber()
128
- return { progress: Number.isFinite(next) ? next : current.progress }
129
- })
130
- return (
131
- <FeatureFrame
132
- onRetry={store.retry}
133
- notice={store.error}
134
- component="goal"
135
- title={props.title}
136
- >
137
- <FeatureWell>
138
- <Flex {...stylex.props(goalStyles.metric)}>
139
- <Text
140
- animated="numeric"
141
- {...stylex.props(roles.display, goalStyles.value(progressLabel.length))}
142
- >
143
- {progressLabel}
144
- </Text>
145
- <Text {...stylex.props(roles.muted)}>{`of ${targetLabel}${unit}`}</Text>
146
- </Flex>
147
- <FeatureProgress component="goal" value={loading ? 0 : progress / props.target} />
148
- {(loading || reached) && (
149
- <Flex {...stylex.props(goalStyles.status)}>
150
- {reached && (
151
- <Icon name="checkmark.circle.fill" {...stylex.props(appearance.accent)} />
152
- )}
153
- <Text {...stylex.props(roles.muted, reached && appearance.accent)}>
154
- {loading
155
- ? 'Loading saved progress…'
156
- : progress > props.target
157
- ? `Goal reached, ${distanceLabel}${unit} beyond your target`
158
- : 'Goal reached'}
159
- </Text>
160
- </Flex>
161
- )}
162
- </FeatureWell>
163
- <Flex {...stylex.props(goalStyles.controls)}>
164
- <Flex {...stylex.props(layout.actions)}>
165
- <FeatureAction
166
- component="goal"
167
- disabled={!store.ready || previousProgress === progress}
168
- onClick={() => change(-1)}
169
- >{`−${stepLabel}`}</FeatureAction>
170
- <FeatureAction
171
- component="goal"
172
- variant="primary"
173
- disabled={
174
- !store.ready || !Number.isFinite(nextProgress) || nextProgress === progress
175
- }
176
- onClick={() => change(1)}
177
- >{`+${stepLabel}`}</FeatureAction>
178
- </Flex>
179
- {store.saving && <Text {...stylex.props(roles.muted)}>Saving progress…</Text>}
180
- {store.ready && nextProgress === progress && previousProgress === progress && (
181
- <Text {...stylex.props(roles.muted)}>
182
- This increment is too small to change this total.
183
- </Text>
184
- )}
185
- </Flex>
186
- </FeatureFrame>
187
- )
188
- }
189
-
190
- export function Habit(input: KowalskiInput<'habit'>) {
191
- const props = kowalskiCatalog.habit.props.parse(input)
192
- const [editingSchedule, setEditingSchedule] = useState(false)
193
- const schema = kowalskiCatalog.habit.storeSchema
194
- const store = useConfiguredFeature({
195
- name: props.id ?? 'KowalskiHabit',
196
- revision: props.revision,
197
- schema,
198
- scope: props.scope,
199
- seed: schema.parse({ weekdays: props.weekdays }),
200
- })
201
- const now = useClock()
202
- const today = localDate(now, props.timeZone)
203
- const loading = !store.ready && !store.error
204
- const dayOf = (date: string) => weekdayNames[new Date(`${date}T00:00:00Z`).getUTCDay()]
205
- // Luxon lists weekdays Monday first; weekdayNames is Sunday first.
206
- const shortName = (day: Weekday) =>
207
- Info.weekdays('short', { locale: format.locale })[(weekdayNames.indexOf(day) + 6) % 7]
208
- const scheduled = store.value.weekdays.includes(dayOf(today))
209
- const done = store.value[`completed_${today}`] === true
210
- const mondayFirst = [...weekdayNames.slice(1), weekdayNames[0]]
211
- const selected = mondayFirst.filter(day => store.value.weekdays.includes(day))
212
- const schedule =
213
- selected.length === 7
214
- ? 'Every day'
215
- : selected.length === 0
216
- ? 'No scheduled days'
217
- : isEqual(selected, mondayFirst.slice(0, 5))
218
- ? 'Monday to Friday'
219
- : isEqual(selected, mondayFirst.slice(5))
220
- ? 'Saturday & Sunday'
221
- : format.formatList(selected.map(shortName), { type: 'unit' })
222
- const days = Array.from({ length: 7 }, (_, index) => {
223
- const date = new Date(`${today}T00:00:00Z`)
224
- date.setUTCDate(date.getUTCDate() - 6 + index)
225
- const key = date.toISOString().slice(0, 10)
226
- return {
227
- complete: store.value[`completed_${key}`] === true,
228
- date: key,
229
- label: shortName(dayOf(key)),
230
- number: date.getUTCDate(),
231
- scheduled: store.value.weekdays.includes(dayOf(key)),
232
- }
233
- })
234
- return (
235
- <FeatureFrame
236
- onRetry={store.retry}
237
- notice={store.error}
238
- component="habit"
239
- title={props.title}
240
- >
241
- <Field label="Schedule">
242
- <Flex {...stylex.props(habitStyles.row)}>
243
- <Text {...stylex.props(roles.text, layout.grow)}>
244
- {loading ? 'Loading saved schedule…' : schedule}
245
- </Text>
246
- <Button
247
- disabled={!store.ready}
248
- onClick={() => setEditingSchedule(current => !current)}
249
- style={[button.quiet, layout.trailingAction]}
250
- >
251
- <Text>{editingSchedule ? 'Done editing' : 'Edit schedule'}</Text>
252
- </Button>
253
- </Flex>
254
- {editingSchedule && (
255
- <>
256
- <Flex {...stylex.props(habitStyles.weekdays)}>
257
- {mondayFirst.map(day => (
258
- <Button
259
- key={day}
260
- selected={store.value.weekdays.includes(day)}
261
- disabled={!store.ready}
262
- onClick={() => {
263
- store.set(current => ({
264
- weekdays: current.weekdays.includes(day)
265
- ? current.weekdays.filter(value => value !== day)
266
- : [...current.weekdays, day],
267
- }))
268
- }}
269
- style={[button.secondary, habitStyles.weekday]}
270
- >
271
- <Text>{shortName(day)}</Text>
272
- </Button>
273
- ))}
274
- </Flex>
275
- <Text {...stylex.props(roles.muted)}>
276
- Changes save as you tap. Completed days stay saved when the schedule
277
- changes.
278
- </Text>
279
- </>
280
- )}
281
- </Field>
282
- <Field label="Last seven days">
283
- {loading ? (
284
- <Text {...stylex.props(roles.muted)}>Loading saved history…</Text>
285
- ) : (
286
- <Flex {...stylex.props(habitStyles.history)}>
287
- {days.map(day => (
288
- <Flex key={day.date} {...stylex.props(habitStyles.day)}>
289
- <Text
290
- {...stylex.props(roles.muted, day.date === today && appearance.accent)}
291
- >
292
- {day.date === today ? 'Today' : day.label}
293
- </Text>
294
- <Flex
295
- {...stylex.props(
296
- appearance.surface,
297
- habitStyles.date,
298
- day.date === today && appearance.selected,
299
- day.complete && habitStyles.completedDate,
300
- !day.scheduled && !day.complete && habitStyles.offDay
301
- )}
302
- >
303
- <Text>{day.number}</Text>
304
- </Flex>
305
- </Flex>
306
- ))}
307
- </Flex>
308
- )}
309
- </Field>
310
- <FeatureWell>
311
- <Flex {...stylex.props(habitStyles.row)}>
312
- <Text {...stylex.props(roles.h1)}>
313
- {loading ? 'Loading…' : done ? 'Complete' : scheduled ? 'Not yet' : 'Off day'}
314
- </Text>
315
- <Text {...stylex.props(roles.muted)}>
316
- {format.formatters
317
- .getDateTimeFormat(format.locale, {
318
- day: 'numeric',
319
- month: 'short',
320
- timeZone: 'UTC',
321
- weekday: 'short',
322
- })
323
- .format(new Date(`${today}T00:00:00Z`))}
324
- </Text>
325
- </Flex>
326
- <Text {...stylex.props(roles.muted)}>
327
- {loading
328
- ? 'Loading saved completions…'
329
- : scheduled
330
- ? 'Scheduled today'
331
- : done
332
- ? 'Completed on an off day'
333
- : 'No completion needed today'}
334
- </Text>
335
- </FeatureWell>
336
- {store.saving && <Text {...stylex.props(roles.muted)}>Saving changes…</Text>}
337
- <FeatureAction
338
- component="habit"
339
- variant={done || !scheduled ? 'secondary' : 'primary'}
340
- icon={done ? 'arrow.uturn.backward' : 'checkmark'}
341
- size="lg"
342
- disabled={!store.ready}
343
- onClick={() => {
344
- store.set(current => ({
345
- [`completed_${today}`]: current[`completed_${today}`] !== true,
346
- }))
347
- }}
348
- >
349
- {done ? 'Undo' : 'Complete today'}
350
- </FeatureAction>
351
- </FeatureFrame>
352
- )
353
- }
354
-
355
- export function Poll(input: KowalskiInput<'poll'>) {
356
- const props = kowalskiCatalog.poll.props.parse(input)
357
- const options = props.options
358
- const schema = kowalskiCatalog.poll.storeSchema
359
- const name = props.id ?? 'KowalskiPoll'
360
- const identity = useMemo(
361
- () =>
362
- `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`,
363
- [name]
364
- )
365
- const voter = useFeatureStore({
366
- initialState: { configuration: '', voter: identity },
367
- name: `${name}Voter`,
368
- schema: pollVoterSchema,
369
- scope: 'private',
370
- })
371
- const store = useConfiguredFeature({
372
- name,
373
- revision: props.revision,
374
- schema,
375
- scope: props.shared ? 'public' : 'private',
376
- seed: schema.parse({}),
377
- })
378
- const validIds = new Set(options.map(option => option.id))
379
- const ballotKey = `vote_${voter.value.voter}`
380
- const votes = Object.entries(store.value)
381
- .filter(
382
- ([key, id]) => key.startsWith('vote_') && typeof id === 'string' && validIds.has(id)
383
- )
384
- .map(([, id]) => id)
385
- const choice = options.find(option => option.id === store.value[ballotKey])
386
- const notice = store.error ?? voter.error
387
- const ready = store.ready && voter.ready
388
- const loading = !ready && !notice
389
- const percent = format.formatters.getNumberFormat(format.locale, {
390
- maximumFractionDigits: 1,
391
- style: 'percent',
392
- })
393
- return (
394
- <FeatureFrame
395
- onRetry={
396
- store.retry || voter.retry
397
- ? () => {
398
- store.retry?.()
399
- voter.retry?.()
400
- }
401
- : undefined
402
- }
403
- notice={notice}
404
- component="poll"
405
- title={props.question}
406
- trailing={
407
- <Text {...stylex.props(roles.muted)}>
408
- {loading
409
- ? 'Loading…'
410
- : format.formatMessage(
411
- {
412
- defaultMessage: '{count, plural, one {# vote} other {# votes}}',
413
- id: 'kowalski.poll.votes',
414
- },
415
- { count: votes.length }
416
- )}
417
- </Text>
418
- }
419
- >
420
- <Flex {...stylex.props(pollStyles.options)}>
421
- {options.map(option => {
422
- const count = votes.filter(id => id === option.id).length
423
- const selected = choice?.id === option.id
424
- const share = votes.length ? count / votes.length : 0
425
- const shareLabel =
426
- share > 0 && share < 0.001
427
- ? '<0.1%'
428
- : share < 1 && share > 0.999
429
- ? '>99.9%'
430
- : percent.format(share)
431
- return (
432
- <Button
433
- key={option.id}
434
- selected={selected}
435
- disabled={!ready}
436
- onClick={() => {
437
- store.set(() => ({ [ballotKey]: option.id }))
438
- }}
439
- style={[button.secondary, pollStyles.option, !ready && button.disabled]}
440
- >
441
- <Flex {...stylex.props(pollStyles.optionHeading)}>
442
- <Flex
443
- {...stylex.props(
444
- pollStyles.radio,
445
- selected && pollStyles.selectedRadio
446
- )}
447
- >
448
- {selected && <Flex {...stylex.props(pollStyles.dot)} />}
449
- </Flex>
450
- <Flex {...stylex.props(layout.grow, layout.choiceText)}>
451
- <Text>{option.label}</Text>
452
- {selected && (
453
- <Text {...stylex.props(roles.muted, appearance.accent)}>
454
- Your vote
455
- </Text>
456
- )}
457
- {votes.length > 0 && (
458
- <>
459
- <FeatureProgress component="poll" value={share} />
460
- <Text {...stylex.props(roles.muted)}>
461
- {format.formatMessage(
462
- {
463
- defaultMessage:
464
- '{count, plural, one {# vote} other {# votes}} · {share}',
465
- id: 'kowalski.poll.share',
466
- },
467
- { count, share: shareLabel }
468
- )}
469
- </Text>
470
- </>
471
- )}
472
- </Flex>
473
- </Flex>
474
- </Button>
475
- )
476
- })}
477
- </Flex>
478
- <Text {...stylex.props(roles.muted)}>
479
- {ready
480
- ? store.saving && choice
481
- ? 'Saving… You can still change your vote.'
482
- : notice
483
- ? 'Choose an option to try again.'
484
- : choice
485
- ? 'Tap another option to change your vote.'
486
- : votes.length === 0
487
- ? 'Be the first to vote. Choose one option.'
488
- : 'Choose one option to add your vote.'
489
- : notice
490
- ? 'Voting is unavailable.'
491
- : 'Loading your ballot…'}
492
- </Text>
493
- </FeatureFrame>
494
- )
495
- }
496
-
497
- const goalStyles = stylex.create({
498
- controls: { gap: space[2] },
499
- metric: {
500
- alignItems: 'baseline',
501
- flexDirection: 'row',
502
- flexWrap: 'wrap',
503
- gap: space[2],
504
- },
505
- status: { alignItems: 'center', flexDirection: 'row', gap: space[1.5] },
506
- value: (length: number) => ({
507
- fontSize: length > 12 ? text.xl : length > 7 ? text['4xl'] : font.displaySize,
508
- lineHeight:
509
- length > 12
510
- ? text.xlLeading
511
- : length > 7
512
- ? text['4xlLeading']
513
- : font.displayLeading,
514
- maxWidth: '100%',
515
- minWidth: 0,
516
- }),
517
- })
518
-
519
- const checklistStyles = stylex.create({
520
- status: { alignItems: 'center', flexDirection: 'row', gap: space[1.5] },
521
- })
522
-
523
- // A week strip: state reads from the date chip alone (filled, plain, or faded).
524
- const habitStyles = stylex.create({
525
- completedDate: {
526
- backgroundColor: colors.accent,
527
- borderColor: colors.accent,
528
- color: colors.onAccent,
529
- },
530
- date: {
531
- alignItems: 'center',
532
- borderRadius: radius.full,
533
- height: size[9],
534
- justifyContent: 'center',
535
- width: size[9],
536
- },
537
- day: { alignItems: 'center', flexBasis: '0%', flexGrow: 1, gap: space[2], minWidth: 0 },
538
- history: { flexDirection: 'row', gap: space[1] },
539
- offDay: { opacity: 0.5 },
540
- row: {
541
- alignItems: 'center',
542
- flexDirection: 'row',
543
- flexWrap: 'wrap',
544
- gap: space[3],
545
- justifyContent: 'space-between',
546
- },
547
- weekday: { flexBasis: '22%', flexGrow: 1, textAlign: 'center' },
548
- weekdays: { flexDirection: 'row', flexWrap: 'wrap', gap: space[2] },
549
- })
550
-
551
- // A real radio: a round size-6 ring, filled with a centred dot when chosen.
552
- const pollStyles = stylex.create({
553
- dot: {
554
- backgroundColor: colors.onAccent,
555
- borderRadius: radius.full,
556
- height: size[2],
557
- width: size[2],
558
- },
559
- option: { alignItems: 'stretch', padding: space[3] },
560
- optionHeading: { alignItems: 'flex-start', flexDirection: 'row', gap: space[3] },
561
- options: { gap: space[2] },
562
- radio: {
563
- alignItems: 'center',
564
- backgroundColor: colors.surface,
565
- borderColor: colors.border,
566
- borderRadius: radius.full,
567
- borderStyle: 'solid',
568
- borderWidth: shape.stroke,
569
- flexShrink: 0,
570
- height: size[6],
571
- justifyContent: 'center',
572
- width: size[6],
573
- },
574
- selectedRadio: { backgroundColor: colors.accent, borderColor: colors.accent },
575
- })