@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
@@ -2,13 +2,7 @@
2
2
  import { Text } from '@flickfyi/core'
3
3
  import { Button } from '@flickfyi/core/atoms'
4
4
  import { theme as sharedTheme } from '@flickfyi/core/examples/parrott/theme'
5
- import {
6
- Card,
7
- Choice,
8
- completedTaskStyle,
9
- List,
10
- Stat,
11
- } from '@flickfyi/core/molecules'
5
+ import { Card, Choice, completedTaskStyle, List, Stat } from '@flickfyi/core/molecules'
12
6
  import * as stylex from '@stylexjs/stylex'
13
7
  import { useState } from 'react'
14
8
 
@@ -61,10 +55,12 @@ function GalleryCell({
61
55
  // One errand, each role saying something different: what to buy, what is left to spend.
62
56
  function GalleryCard() {
63
57
  const [bought, setBought] = useState<string[]>([])
64
- const left = budget - groceries.reduce(
65
- (total, item) => total + (bought.includes(item.name) ? item.price : 0),
66
- 0
67
- )
58
+ const left =
59
+ budget -
60
+ groceries.reduce(
61
+ (total, item) => total + (bought.includes(item.name) ? item.price : 0),
62
+ 0
63
+ )
68
64
  return (
69
65
  <Card>
70
66
  <Card.Header>
@@ -5,7 +5,7 @@
5
5
  "": {
6
6
  "name": "typescript-server-modules",
7
7
  "dependencies": {
8
- "@flickfyi/core": "0.0.69",
8
+ "@flickfyi/core": "0.0.72",
9
9
  "@flickfyi/lens": "0.0.7",
10
10
  "@flickfyi/photon": "0.0.36",
11
11
  "@formatjs/intl": "6.1.3",
@@ -45,7 +45,7 @@
45
45
  "sha512-3RQHgEtvL1Frl/d1cSreo7qhJ3Gk1OdNUai/CtZ8G+wYeRQnJih3s9xJ9/kgYekPQRdwgh0HXRPqMlzWGwivIQ=="
46
46
  ],
47
47
  "@flickfyi/core": [
48
- "@flickfyi/core@0.0.69",
48
+ "@flickfyi/core@0.0.72",
49
49
  "",
50
50
  {
51
51
  "dependencies": {
@@ -74,7 +74,7 @@
74
74
  },
75
75
  "hasInstallScript": true
76
76
  },
77
- "sha512-c+3Faaf/qRsrtfpginA9a38+k3ROp9cuv8tiH4lwa70JWgCuVobaF96t5KZmUMJMlg2LGZEwDadW+MEeqYEl6g=="
77
+ "sha512-HkM/Xoh4SH+RULhHRU+Rj98NYLPjZ2eJtNENx8DJJU2RU4SIiQt5M2sn5gDFBqCF7tdz1DOSnaNKxxQrXh5gnQ=="
78
78
  ],
79
79
  "@flickfyi/lens": [
80
80
  "@flickfyi/lens@0.0.7",
@@ -89,7 +89,7 @@
89
89
  "zod": "^3.25.0 || ^4.0.0"
90
90
  }
91
91
  },
92
- "sha512-uLm9ZhDO3MQx5yR2txwp/O9iZsG/uaxuWGP8NBQbqgtYpt5RjUgxBkVerNjimlI4YizNEu6vNycte3wbmonjmw=="
92
+ "sha512-qZbLDJAOgYsPIJ3Dd7oQjNsr22eaf03Jy8uDdqk9QEyQ3e6dLInmnSRP2JXmXhp+32GHOS8zw+1xSD6PmmtUAg=="
93
93
  ],
94
94
  "@flickfyi/photon": [
95
95
  "@flickfyi/photon@0.0.36",
@@ -102,7 +102,7 @@
102
102
  "zod": "4.6.7"
103
103
  }
104
104
  },
105
- "sha512-FCxHUqUHgWzaTF3KhuqgxisY6WxAr9Wn8B0ei/z0kaRA7H1w5F1UNIwWV3s9u0S5OVxRkfcQIDTtkmv9xusHug=="
105
+ "sha512-jBUmt1CehM0fcY/uBLt8J5DTUMApl73zSHy1m1J6GJl2jjNo968qoStA4ovYPuQZcJp9uBcBhG6zYoD9UrcoNg=="
106
106
  ],
107
107
  "@formatjs/fast-memoize": [
108
108
  "@formatjs/fast-memoize@3.1.7",
@@ -574,10 +574,10 @@
574
574
  "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="
575
575
  ],
576
576
  "tslib": [
577
- "tslib@2.8.1",
577
+ "tslib@2.9.1",
578
578
  "",
579
579
  {},
580
- "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
580
+ "sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA=="
581
581
  ],
582
582
  "type-fest": [
583
583
  "type-fest@5.10.0",
@@ -110,7 +110,7 @@
110
110
  "minifyIdentifiers": true
111
111
  },
112
112
  "dependencies": {
113
- "@flickfyi/core": "0.0.69",
113
+ "@flickfyi/core": "0.0.72",
114
114
  "@flickfyi/lens": "0.0.7",
115
115
  "@flickfyi/photon": "0.0.36",
116
116
  "@react-spring/core": "10.1.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flickfyi/flkr",
3
- "version": "0.0.182",
3
+ "version": "0.0.185",
4
4
  "description": "A tool for managing your Flicks",
5
5
  "homepage": "https://flick.fyi/docs/flkr/quick-start",
6
6
  "bugs": {
@@ -52,7 +52,7 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@flickfyi/biscuit": "0.0.2",
55
- "@flickfyi/core": "0.0.69",
55
+ "@flickfyi/core": "0.0.72",
56
56
  "@flickfyi/http-message-sig": "0.0.0",
57
57
  "@flickfyi/identity": "0.0.0",
58
58
  "@flickfyi/photon": "0.0.36",
@@ -1,4 +0,0 @@
1
- import { KowalskiInput } from './catalog.js';
2
- export declare function Timer(input: KowalskiInput<'timer'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
3
- export declare function Countdown(input: KowalskiInput<'countdown'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
4
- export declare function TimeZone(input: KowalskiInput<'timeZone'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
@@ -1,7 +0,0 @@
1
- import { KowalskiInput } from './catalog.js';
2
- export declare function Event(input: KowalskiInput<'event'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
3
- export declare function Reminder(input: KowalskiInput<'reminder'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
4
- export declare function Trip(input: KowalskiInput<'trip'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
5
- export declare function Contact(input: KowalskiInput<'contact'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
6
- export declare function Bookmark(input: KowalskiInput<'bookmark'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
7
- export declare function Note(input: KowalskiInput<'note'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
@@ -1,5 +0,0 @@
1
- import { KowalskiInput } from './catalog.js';
2
- export declare function Checklist(input: KowalskiInput<'checklist'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
3
- export declare function Goal(input: KowalskiInput<'goal'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
4
- export declare function Habit(input: KowalskiInput<'habit'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
5
- export declare function Poll(input: KowalskiInput<'poll'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
@@ -1,7 +0,0 @@
1
- import { KowalskiInput } from './catalog.js';
2
- export declare function BillSplit(input: KowalskiInput<'billSplit'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
3
- export declare function Expense(input: KowalskiInput<'expense'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
4
- export declare function UnitConverter(input: KowalskiInput<'unitConverter'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
5
- export declare function Calculator(input: KowalskiInput<'calculator'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
6
- export declare function RandomPicker(input: KowalskiInput<'randomPicker'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
7
- export declare function ColorPalette(input: KowalskiInput<'colorPalette'>): import('@flickfyi/photon/jsx-runtime').JSX.Element;
@@ -1,15 +0,0 @@
1
- import { z } from 'zod/v4';
2
- /** Wait for authoritative Quantum data; writes are optimistic only after hydration. */
3
- export declare function useFeatureStore<T extends object>({ initialState, name, schema, scope, }: {
4
- initialState: T;
5
- name: string;
6
- schema: z.ZodType<T>;
7
- scope?: 'private' | 'public';
8
- }): {
9
- error: string | undefined;
10
- ready: boolean;
11
- retry: (() => void) | undefined;
12
- saving: boolean;
13
- set: (update: Partial<T> | ((current: T) => Partial<T>), onSaved?: () => void) => boolean;
14
- value: T;
15
- };
@@ -1,464 +0,0 @@
1
- import { Flex, Text } from '@flickfyi/core'
2
- import * as stylex from '@stylexjs/stylex'
3
- import { DateTime, Duration } from 'luxon'
4
- import { useState } from 'react'
5
-
6
- import { space, text } from '~/themes/scale.stylex'
7
- import { appearance, roles } from '~/themes/shared'
8
- import { font } from '~/themes/tokens.stylex'
9
-
10
- import { elapsedSeconds } from './calculations'
11
- import { kowalskiCatalog, type KowalskiInput } from './catalog'
12
- import { FeatureDateTime } from './date-time'
13
- import { format } from './format'
14
- import {
15
- FeatureAction,
16
- FeatureFrame,
17
- FeatureProgress,
18
- FeatureWell,
19
- layout,
20
- } from './frame'
21
- import { useClock } from './use-clock'
22
- import { useConfiguredFeature } from './use-configured-feature'
23
-
24
- export function Timer(input: KowalskiInput<'timer'>) {
25
- const props = kowalskiCatalog.timer.props.parse(input)
26
- const schema = kowalskiCatalog.timer.storeSchema
27
- const store = useConfiguredFeature({
28
- name: props.id ?? 'KowalskiTimer',
29
- revision: props.revision,
30
- schema,
31
- scope: props.scope,
32
- seed: schema.parse({}),
33
- })
34
- const stopwatch = props.mode === 'stopwatch'
35
- const complete =
36
- !stopwatch && elapsedSeconds(store.value, Date.now()) >= props.durationSeconds
37
- const now = useClock(store.value.startedAt !== null && !complete)
38
- const elapsed = complete ? props.durationSeconds : elapsedSeconds(store.value, now)
39
- const remaining = Math.max(0, props.durationSeconds - elapsed)
40
- const running = store.value.startedAt !== null && !complete
41
- const clockSeconds = stopwatch ? Math.floor(elapsed) : Math.ceil(remaining)
42
- const showHours = (stopwatch ? clockSeconds : props.durationSeconds) >= 3600
43
- // Older JavaScriptCore versions misplace separators when Intl hides zero hours.
44
- const clockParts = format.formatDurationToParts(
45
- Duration.fromObject({ seconds: clockSeconds })
46
- .shiftTo('hours', 'minutes', 'seconds')
47
- .toObject(),
48
- {
49
- hours: '2-digit',
50
- hoursDisplay: 'always',
51
- minutes: '2-digit',
52
- minutesDisplay: 'always',
53
- seconds: '2-digit',
54
- secondsDisplay: 'always',
55
- style: 'digital',
56
- }
57
- )
58
- const clock = clockParts
59
- .slice(showHours ? 0 : clockParts.findIndex(part => part.unit === 'minute'))
60
- .map(part => part.value)
61
- .join('')
62
- const modeLabel =
63
- props.mode === 'focus'
64
- ? 'Focus session'
65
- : props.mode === 'break'
66
- ? 'Break time'
67
- : stopwatch
68
- ? 'Stopwatch'
69
- : 'Countdown timer'
70
- const status = store.saving
71
- ? 'Saving…'
72
- : !store.ready && !store.error
73
- ? 'Loading…'
74
- : complete
75
- ? 'Complete'
76
- : running
77
- ? 'Running'
78
- : elapsed > 0
79
- ? 'Paused'
80
- : 'Ready'
81
- return (
82
- <FeatureFrame
83
- onRetry={store.retry}
84
- notice={store.error}
85
- component="timer"
86
- title={props.title}
87
- detail={modeLabel}
88
- trailing={
89
- <Text {...stylex.props(roles.muted, (running || complete) && appearance.accent)}>
90
- {status}
91
- </Text>
92
- }
93
- >
94
- <FeatureWell style={timerStyles.clock}>
95
- <Text
96
- animated={running ? 'numeric' : undefined}
97
- {...stylex.props(roles.display, timerStyles.digits(clock.length))}
98
- >
99
- {clock}
100
- </Text>
101
- <Text {...stylex.props(roles.muted)}>
102
- {complete ? 'Time’s up' : stopwatch ? 'Time elapsed' : 'Time remaining'}
103
- </Text>
104
- {!stopwatch && (
105
- <FeatureProgress component="timer" value={elapsed / props.durationSeconds} />
106
- )}
107
- </FeatureWell>
108
- <Flex {...stylex.props(layout.actions)}>
109
- <Flex {...stylex.props(timerStyles.primary)}>
110
- <FeatureAction
111
- component="timer"
112
- icon={complete ? 'arrow.counterclockwise' : running ? 'pause' : 'play'}
113
- variant="primary"
114
- disabled={!store.ready}
115
- onClick={() =>
116
- store.set(current => {
117
- const instant = Date.now()
118
- if (complete) {
119
- return { elapsedSeconds: 0, startedAt: instant }
120
- }
121
- const currentElapsed = elapsedSeconds(current, instant)
122
- return current.startedAt === null
123
- ? { startedAt: instant }
124
- : {
125
- elapsedSeconds: stopwatch
126
- ? currentElapsed
127
- : Math.min(props.durationSeconds, currentElapsed),
128
- startedAt: null,
129
- }
130
- })
131
- }
132
- >
133
- {complete
134
- ? 'Start again'
135
- : running
136
- ? 'Pause'
137
- : elapsed > 0
138
- ? 'Resume'
139
- : 'Start'}
140
- </FeatureAction>
141
- </Flex>
142
- <FeatureAction
143
- component="timer"
144
- variant="quiet"
145
- disabled={!store.ready || (elapsed === 0 && store.value.startedAt === null)}
146
- onClick={() => store.set(() => ({ elapsedSeconds: 0, startedAt: null }))}
147
- >
148
- Reset
149
- </FeatureAction>
150
- </Flex>
151
- </FeatureFrame>
152
- )
153
- }
154
-
155
- export function Countdown(input: KowalskiInput<'countdown'>) {
156
- const props = kowalskiCatalog.countdown.props.parse(input)
157
- const schema = kowalskiCatalog.countdown.storeSchema
158
- const store = useConfiguredFeature({
159
- name: props.id ?? 'KowalskiCountdown',
160
- revision: props.revision,
161
- schema,
162
- scope: props.scope,
163
- seed: schema.parse({ target: { value: props.target } }),
164
- })
165
- const now = useClock()
166
- const target = store.value.target.value
167
- ? Date.parse(store.value.target.value)
168
- : undefined
169
- const seconds = target === undefined ? 0 : Math.max(0, Math.ceil((target - now) / 1000))
170
- const units = [
171
- { label: 'day', value: Math.floor(seconds / 86_400) },
172
- { label: 'hour', value: Math.floor((seconds % 86_400) / 3600) },
173
- { label: 'minute', value: Math.floor((seconds % 3600) / 60) },
174
- { label: 'second', value: seconds % 60 },
175
- ]
176
- const leadingIndex = seconds >= 86_400 ? 0 : seconds >= 3600 ? 1 : seconds >= 60 ? 2 : 3
177
- const leading = units[leadingIndex]
178
- const amount = format.formatNumber(leading.value)
179
- return (
180
- <FeatureFrame
181
- onRetry={store.retry}
182
- notice={store.error}
183
- component="countdown"
184
- title={props.title}
185
- >
186
- <FeatureWell style={countdownStyles.remaining}>
187
- <Text
188
- animated={seconds > 0 ? 'numeric' : undefined}
189
- {...stylex.props(
190
- roles.display,
191
- countdownStyles.amount(amount.length),
192
- seconds === 0 && countdownStyles.arrived
193
- )}
194
- >
195
- {target === undefined ? '—' : seconds === 0 ? 'It’s time' : amount}
196
- </Text>
197
- <Text {...stylex.props(roles.muted)}>
198
- {target === undefined
199
- ? 'Choose a target below'
200
- : seconds === 0
201
- ? 'Your countdown has arrived'
202
- : `${format.formatNumberToParts(leading.value, { style: 'unit', unit: leading.label, unitDisplay: 'long' }).find(part => part.type === 'unit')?.value} to go`}
203
- </Text>
204
- {seconds > 0 && leadingIndex < 3 && (
205
- <Flex {...stylex.props(countdownStyles.units)}>
206
- {units.slice(leadingIndex + 1).map(unit => (
207
- <Flex key={unit.label} {...stylex.props(countdownStyles.unit)}>
208
- <Text animated="numeric" {...stylex.props(roles.strong)}>
209
- {format.formatNumber(unit.value)}
210
- </Text>
211
- <Text {...stylex.props(roles.muted)}>
212
- {
213
- format
214
- .formatNumberToParts(unit.value, {
215
- style: 'unit',
216
- unit: unit.label,
217
- unitDisplay: 'long',
218
- })
219
- .find(part => part.type === 'unit')?.value
220
- }
221
- </Text>
222
- </Flex>
223
- ))}
224
- </Flex>
225
- )}
226
- </FeatureWell>
227
- <FeatureDateTime
228
- component="countdown"
229
- label="Target date & time"
230
- ready={store.ready}
231
- saving={store.saving}
232
- timeZone={props.timeZone}
233
- value={store.value.target.value || null}
234
- onChange={(target, onSaved) =>
235
- target === null
236
- ? false
237
- : store.set(() => ({ target: { value: target } }), onSaved)
238
- }
239
- />
240
- </FeatureFrame>
241
- )
242
- }
243
-
244
- export function TimeZone(input: KowalskiInput<'timeZone'>) {
245
- const props = kowalskiCatalog.timeZone.props.parse(input)
246
- const schema = kowalskiCatalog.timeZone.storeSchema
247
- const store = useConfiguredFeature({
248
- name: props.id ?? 'KowalskiTimeZone',
249
- revision: props.revision,
250
- schema,
251
- scope: props.scope,
252
- seed: schema.parse({ at: { value: props.at } }),
253
- })
254
- const [editing, setEditing] = useState(false)
255
- const live = store.value.at.value === null
256
- const now = useClock(live)
257
- const instant = store.value.at.value ? Date.parse(store.value.at.value) : now
258
- const referenceZone = props.zones[0]
259
- const referenceCity = referenceZone.split('/').at(-1)?.replaceAll('_', ' ')
260
- const reference = DateTime.fromMillis(instant, { locale: 'en', zone: referenceZone })
261
- const referenceDate = DateTime.utc(reference.year, reference.month, reference.day)
262
- return (
263
- <FeatureFrame
264
- onRetry={store.retry}
265
- notice={store.error}
266
- component="timeZone"
267
- title={props.title}
268
- detail={`Times relative to ${referenceCity}`}
269
- trailing={
270
- <Text {...stylex.props(roles.muted, live && appearance.accent)}>
271
- {store.saving
272
- ? 'Saving…'
273
- : !store.ready && !store.error
274
- ? 'Loading…'
275
- : live
276
- ? 'Live'
277
- : 'Fixed time'}
278
- </Text>
279
- }
280
- >
281
- <Flex {...stylex.props(timeZoneStyles.clocks)}>
282
- {props.zones.map((zone, index) => {
283
- const local = reference.setZone(zone)
284
- const days = DateTime.utc(local.year, local.month, local.day).diff(
285
- referenceDate,
286
- 'days'
287
- ).days
288
- const minutes = local.offset - reference.offset
289
- const difference = format.formatDuration(
290
- Duration.fromObject({ minutes: Math.abs(minutes) })
291
- .shiftTo('hours', 'minutes', 'seconds')
292
- .toObject(),
293
- { style: 'long' }
294
- )
295
- const clockParts = format.formatTimeToParts(instant, {
296
- fractionalSecondDigits: !live && local.millisecond !== 0 ? 3 : undefined,
297
- hour: 'numeric',
298
- hour12: true,
299
- minute: '2-digit',
300
- second:
301
- !live && (local.second !== 0 || local.millisecond !== 0)
302
- ? '2-digit'
303
- : undefined,
304
- timeZone: zone,
305
- })
306
- const clock = clockParts
307
- .filter(part => part.type !== 'dayPeriod')
308
- .map(part => part.value)
309
- .join('')
310
- .trim()
311
- return (
312
- <FeatureWell key={`${zone}:${index}`}>
313
- <Flex {...stylex.props(timeZoneStyles.zoneRow)}>
314
- <Flex {...stylex.props(timeZoneStyles.city)}>
315
- <Text {...stylex.props(roles.h2)}>
316
- {zone.split('/').at(-1)?.replaceAll('_', ' ')}
317
- </Text>
318
- <Text {...stylex.props(roles.muted)}>
319
- {index === 0
320
- ? 'Reference'
321
- : minutes === 0
322
- ? 'Same time'
323
- : `${difference} ${minutes > 0 ? 'ahead' : 'behind'}`}
324
- </Text>
325
- {days !== 0 && (
326
- <Text {...stylex.props(roles.muted, appearance.accent)}>
327
- {days === 1
328
- ? 'Next day'
329
- : days === -1
330
- ? 'Previous day'
331
- : `${format.formatNumber(Math.abs(days))} days ${days > 0 ? 'ahead' : 'behind'}`}
332
- </Text>
333
- )}
334
- </Flex>
335
- <Flex {...stylex.props(timeZoneStyles.local)}>
336
- <Flex {...stylex.props(timeZoneStyles.time)}>
337
- <Text
338
- animated={live ? 'numeric' : undefined}
339
- {...stylex.props(
340
- roles.display,
341
- timeZoneStyles.digits(clock.length)
342
- )}
343
- >
344
- {clock}
345
- </Text>
346
- <Text {...stylex.props(roles.muted, timeZoneStyles.period)}>
347
- {clockParts.find(part => part.type === 'dayPeriod')?.value}
348
- </Text>
349
- </Flex>
350
- <Text {...stylex.props(roles.muted)}>
351
- {format.formatDate(instant, {
352
- day: 'numeric',
353
- ...(local.year <= 0 ? { era: 'short', year: 'numeric' } : {}),
354
- month: 'short',
355
- weekday: 'short',
356
- timeZone: zone,
357
- })}
358
- </Text>
359
- </Flex>
360
- </Flex>
361
- </FeatureWell>
362
- )
363
- })}
364
- </Flex>
365
- <FeatureDateTime
366
- actionLabel="Compare another time"
367
- compact
368
- component="timeZone"
369
- label={`Comparison time · ${referenceCity}`}
370
- ready={store.ready}
371
- saving={store.saving}
372
- submitLabel="Compare this time"
373
- timeZone={referenceZone}
374
- value={store.value.at.value}
375
- onChange={(at, onSaved) => store.set(() => ({ at: { value: at } }), onSaved)}
376
- onEditingChange={setEditing}
377
- />
378
- {!live && (
379
- <FeatureAction
380
- component="timeZone"
381
- icon="clock"
382
- disabled={!store.ready || store.saving || editing}
383
- onClick={() => store.set(() => ({ at: { value: null } }))}
384
- >
385
- Return to live
386
- </FeatureAction>
387
- )}
388
- {!live && editing && !store.saving && (
389
- <Text {...stylex.props(roles.muted)}>
390
- Save or cancel your comparison before returning to live.
391
- </Text>
392
- )}
393
- </FeatureFrame>
394
- )
395
- }
396
-
397
- // Long readings step down the display scale so they never overflow their well.
398
- const timeZoneStyles = stylex.create({
399
- city: { flexBasis: space[24], flexGrow: 1, gap: space[1], minWidth: 0 },
400
- clocks: { gap: space[2] },
401
- digits: (length: number) => ({
402
- fontSize: length > 8 ? text['2xl'] : length > 5 ? text['3xl'] : text['4xl'],
403
- lineHeight:
404
- length > 8
405
- ? text['2xlLeading']
406
- : length > 5
407
- ? text['3xlLeading']
408
- : text['4xlLeading'],
409
- }),
410
- local: { alignItems: 'flex-end', flexGrow: 1, gap: space[1], textAlign: 'right' },
411
- period: { marginBottom: space[1] },
412
- time: { alignItems: 'flex-end', flexDirection: 'row', gap: space[1.5] },
413
- zoneRow: {
414
- alignItems: 'center',
415
- flexDirection: 'row',
416
- flexWrap: 'wrap',
417
- gap: space[3],
418
- },
419
- })
420
-
421
- const timerStyles = stylex.create({
422
- clock: { alignItems: 'stretch', gap: space[3], textAlign: 'center' },
423
- digits: (length: number) => ({
424
- fontSize:
425
- length > 11
426
- ? text['3xl']
427
- : length > 8
428
- ? text['4xl']
429
- : length > 5
430
- ? text['5xl']
431
- : font.displaySize,
432
- lineHeight:
433
- length > 11
434
- ? text['3xlLeading']
435
- : length > 8
436
- ? text['4xlLeading']
437
- : length > 5
438
- ? text['5xlLeading']
439
- : font.displayLeading,
440
- }),
441
- primary: { flexBasis: 0, flexGrow: 1, minWidth: 0 },
442
- })
443
-
444
- const countdownStyles = stylex.create({
445
- amount: (length: number) => ({
446
- fontSize: length > 6 ? text['4xl'] : length > 4 ? text['6xl'] : font.displaySize,
447
- lineHeight:
448
- length > 6
449
- ? text['4xlLeading']
450
- : length > 4
451
- ? text['6xlLeading']
452
- : font.displayLeading,
453
- }),
454
- arrived: { fontSize: text['4xl'], lineHeight: text['4xlLeading'] },
455
- remaining: { alignItems: 'stretch', gap: space[2], textAlign: 'center' },
456
- unit: { alignItems: 'baseline', flexDirection: 'row', gap: space[1] },
457
- units: {
458
- columnGap: space[3],
459
- flexDirection: 'row',
460
- flexWrap: 'wrap',
461
- justifyContent: 'center',
462
- rowGap: space[1],
463
- },
464
- })