@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.
- package/dist/{api-client-CAg1b8Bh.js → api-client-nn4U_Vfn.js} +1 -1
- package/dist/{app-DpM5nhb9.js → app-COXGJhrt.js} +3 -3
- package/dist/{bundler-DNrDcqyk.js → bundler-CW4YC73e.js} +4 -2
- package/dist/cli.js +11 -11
- package/dist/{delegate-DcVye0KE.js → delegate-aUVluBjB.js} +2 -2
- package/dist/{generate-B1l1z_FZ.js → generate-BeL1QPDi.js} +1 -1
- package/dist/{preview-Dqn_Tq6K.js → preview-DTVM8Csb.js} +2 -2
- package/dist/{publish-BmDqO1xU.js → publish-BJG-s-w5.js} +4 -4
- package/dist/{pull-CO80DMn8.js → pull-B_Yfjpi2.js} +1 -1
- package/dist/{save-8crfOeo1.js → save-UrfgmK2-.js} +2 -2
- package/dist/{sdk-app-BXWrf_pf.js → sdk-app-BAxznAf9.js} +3 -3
- package/dist/{sdk-deploy-CaEonlvx.js → sdk-deploy-D1wgQxse.js} +3 -3
- package/dist/{sdk-generation-CF8ATbrL.js → sdk-generation-CLQ-QrVM.js} +1 -1
- package/dist/{sdk-project-CKV3U3u9.js → sdk-project-BaO0fqhW.js} +1 -1
- package/dist/{use-auth-B6nwU2rp.js → use-auth-CtM4_BAY.js} +1 -1
- package/node_modules/@flickfyi/biscuit/.turbo/turbo-build.log +4 -4
- package/node_modules/@flickfyi/core/README.md +19 -9
- package/node_modules/@flickfyi/core/dist/chunks/{default-CuxDsQoM.js → default-BTmKidHV.js} +1 -1
- package/node_modules/@flickfyi/core/dist/chunks/{default-BB6YexEH.cjs → default-JhTq5I_y.cjs} +1 -1
- package/node_modules/@flickfyi/core/dist/chunks/{define-CUJRqVKY.cjs → define-BKCRhpuY.cjs} +1 -1
- package/node_modules/@flickfyi/core/dist/chunks/{define-e_VqSs4M.js → define-DZXgUsy7.js} +5 -5
- package/node_modules/@flickfyi/core/dist/kowalski/catalog.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/kowalski/catalog.js +728 -549
- package/node_modules/@flickfyi/core/dist/kowalski/index.cjs +5 -5
- package/node_modules/@flickfyi/core/dist/kowalski/index.js +4297 -3700
- package/node_modules/@flickfyi/core/dist/kowalski/schemas.cjs +1 -0
- package/node_modules/@flickfyi/core/dist/kowalski/schemas.js +637 -0
- package/node_modules/@flickfyi/core/dist/kowalski-catalog.css +516 -0
- package/node_modules/@flickfyi/core/dist/kowalski.css +10 -0
- package/node_modules/@flickfyi/core/dist/themes/athletic/athletic.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/athletic/athletic.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/compact/compact.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/compact/compact.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/default/default.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/default/default.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/editorial/editorial.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/editorial/editorial.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/handwritten/handwritten.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/handwritten/handwritten.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/index.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/index.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/kids/kids.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/kids/kids.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/rounded/rounded.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/rounded/rounded.js +1 -1
- package/node_modules/@flickfyi/core/dist/themes/technical/technical.cjs +1 -1
- package/node_modules/@flickfyi/core/dist/themes/technical/technical.js +1 -1
- package/node_modules/@flickfyi/core/dist-types/hooks/use-feature-store/index.d.ts +43 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/calculations.d.ts +57 -3
- package/node_modules/@flickfyi/core/dist-types/kowalski/calculator.d.ts +7 -6
- package/node_modules/@flickfyi/core/dist-types/kowalski/catalog.d.cts +524 -809
- package/node_modules/@flickfyi/core/dist-types/kowalski/catalog.d.ts +524 -809
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/bill-split.d.ts +38 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/bookmark.d.ts +48 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/budget.d.ts +39 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/calculator.d.ts +62 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/checklist.d.ts +35 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/color-palette.d.ts +32 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/contact.d.ts +41 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/countdown.d.ts +34 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/event.d.ts +43 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/expense.d.ts +40 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/goal.d.ts +36 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/habit.d.ts +57 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/ledger.d.ts +43 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/note.d.ts +35 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/poll.d.ts +41 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/random-picker.d.ts +69 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/rating.d.ts +33 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/reminder.d.ts +48 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/rotation.d.ts +39 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/scoreboard.d.ts +37 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/shopping-list.d.ts +41 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/task-board.d.ts +39 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/time-zone.d.ts +34 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/timer.d.ts +43 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/trip.d.ts +61 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/components/unit-converter.d.ts +106 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/create-schemas.d.ts +6 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/date-time.d.ts +1 -1
- package/node_modules/@flickfyi/core/dist-types/kowalski/everyday.d.ts +28 -8
- package/node_modules/@flickfyi/core/dist-types/kowalski/feature-schema.d.ts +65 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/format.d.ts +4 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/fortune.d.ts +21 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/frame.d.ts +4 -4
- package/node_modules/@flickfyi/core/dist-types/kowalski/index.d.cts +31 -7
- package/node_modules/@flickfyi/core/dist-types/kowalski/index.d.ts +31 -7
- package/node_modules/@flickfyi/core/dist-types/kowalski/lesson.d.ts +89 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/recipe.d.ts +129 -8
- package/node_modules/@flickfyi/core/dist-types/kowalski/schemas.d.cts +4 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/schemas.d.ts +4 -0
- package/node_modules/@flickfyi/core/dist-types/kowalski/time-since.d.ts +34 -0
- package/node_modules/@flickfyi/core/examples/example-metadata.ts +19 -2
- package/node_modules/@flickfyi/core/examples/kowalski/bill-split/bill-split.stories.tsx +25 -6
- package/node_modules/@flickfyi/core/examples/kowalski/bill-split/bill-split.tsx +6 -12
- package/node_modules/@flickfyi/core/examples/kowalski/bookmark/bookmark.stories.tsx +22 -5
- package/node_modules/@flickfyi/core/examples/kowalski/bookmark/bookmark.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/budget/budget.stories.tsx +26 -5
- package/node_modules/@flickfyi/core/examples/kowalski/budget/budget.tsx +6 -21
- package/node_modules/@flickfyi/core/examples/kowalski/calculator/calculator.stories.tsx +18 -5
- package/node_modules/@flickfyi/core/examples/kowalski/calculator/calculator.tsx +6 -19
- package/node_modules/@flickfyi/core/examples/kowalski/checklist/checklist.stories.tsx +25 -5
- package/node_modules/@flickfyi/core/examples/kowalski/checklist/checklist.tsx +6 -21
- package/node_modules/@flickfyi/core/examples/kowalski/color-palette/color-palette.stories.tsx +19 -6
- package/node_modules/@flickfyi/core/examples/kowalski/color-palette/color-palette.tsx +6 -17
- package/node_modules/@flickfyi/core/examples/kowalski/contact/contact.stories.tsx +30 -5
- package/node_modules/@flickfyi/core/examples/kowalski/contact/contact.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/countdown/countdown.stories.tsx +22 -5
- package/node_modules/@flickfyi/core/examples/kowalski/countdown/countdown.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/event/event.stories.tsx +23 -5
- package/node_modules/@flickfyi/core/examples/kowalski/event/event.tsx +6 -19
- package/node_modules/@flickfyi/core/examples/kowalski/expense/expense.stories.tsx +23 -5
- package/node_modules/@flickfyi/core/examples/kowalski/expense/expense.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/fortune/fortune.stories.tsx +61 -0
- package/node_modules/@flickfyi/core/examples/kowalski/fortune/fortune.tsx +11 -0
- package/node_modules/@flickfyi/core/examples/kowalski/goal/goal.stories.tsx +18 -5
- package/node_modules/@flickfyi/core/examples/kowalski/goal/goal.tsx +3 -19
- package/node_modules/@flickfyi/core/examples/kowalski/habit/habit.stories.tsx +22 -5
- package/node_modules/@flickfyi/core/examples/kowalski/habit/habit.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/ledger/ledger.stories.tsx +25 -5
- package/node_modules/@flickfyi/core/examples/kowalski/ledger/ledger.tsx +6 -20
- package/node_modules/@flickfyi/core/examples/kowalski/lesson/lesson.stories.tsx +99 -0
- package/node_modules/@flickfyi/core/examples/kowalski/lesson/lesson.tsx +11 -0
- package/node_modules/@flickfyi/core/examples/kowalski/note/note.stories.tsx +21 -5
- package/node_modules/@flickfyi/core/examples/kowalski/note/note.tsx +3 -17
- package/node_modules/@flickfyi/core/examples/kowalski/poll/poll.stories.tsx +26 -5
- package/node_modules/@flickfyi/core/examples/kowalski/poll/poll.tsx +3 -21
- package/node_modules/@flickfyi/core/examples/kowalski/random-picker/random-picker.stories.tsx +37 -6
- package/node_modules/@flickfyi/core/examples/kowalski/random-picker/random-picker.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/rating/rating.stories.tsx +18 -5
- package/node_modules/@flickfyi/core/examples/kowalski/rating/rating.tsx +6 -14
- package/node_modules/@flickfyi/core/examples/kowalski/recipe/recipe.stories.tsx +117 -5
- package/node_modules/@flickfyi/core/examples/kowalski/recipe/recipe.tsx +6 -115
- package/node_modules/@flickfyi/core/examples/kowalski/reminder/reminder.stories.tsx +22 -5
- package/node_modules/@flickfyi/core/examples/kowalski/reminder/reminder.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/rotation/rotation.stories.tsx +26 -5
- package/node_modules/@flickfyi/core/examples/kowalski/rotation/rotation.tsx +6 -22
- package/node_modules/@flickfyi/core/examples/kowalski/scoreboard/scoreboard.stories.tsx +26 -5
- package/node_modules/@flickfyi/core/examples/kowalski/scoreboard/scoreboard.tsx +6 -21
- package/node_modules/@flickfyi/core/examples/kowalski/shopping-list/shopping-list.stories.tsx +28 -6
- package/node_modules/@flickfyi/core/examples/kowalski/shopping-list/shopping-list.tsx +6 -22
- package/node_modules/@flickfyi/core/examples/kowalski/task-board/task-board.stories.tsx +27 -6
- package/node_modules/@flickfyi/core/examples/kowalski/task-board/task-board.tsx +6 -22
- package/node_modules/@flickfyi/core/examples/kowalski/time-since/time-since.stories.tsx +33 -0
- package/node_modules/@flickfyi/core/examples/kowalski/time-since/time-since.tsx +12 -0
- package/node_modules/@flickfyi/core/examples/kowalski/time-zone/time-zone.stories.tsx +22 -6
- package/node_modules/@flickfyi/core/examples/kowalski/time-zone/time-zone.tsx +6 -17
- package/node_modules/@flickfyi/core/examples/kowalski/timer/timer.stories.tsx +18 -5
- package/node_modules/@flickfyi/core/examples/kowalski/timer/timer.tsx +6 -18
- package/node_modules/@flickfyi/core/examples/kowalski/trip/trip.stories.tsx +25 -5
- package/node_modules/@flickfyi/core/examples/kowalski/trip/trip.tsx +3 -21
- package/node_modules/@flickfyi/core/examples/kowalski/unit-converter/unit-converter.stories.tsx +19 -6
- package/node_modules/@flickfyi/core/examples/kowalski/unit-converter/unit-converter.tsx +6 -19
- package/node_modules/@flickfyi/core/examples/parrott/calculator/calculator.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/calculator/calculator.tsx +2 -13
- package/node_modules/@flickfyi/core/examples/parrott/checklist/checklist.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/checklist/checklist.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/countdown/countdown.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/countdown/countdown.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/counter/counter.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/counter/counter.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/fortune/fortune.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/fortune/fortune.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/grid/grid.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/grid/grid.tsx +4 -9
- package/node_modules/@flickfyi/core/examples/parrott/kale-smoothie/kale-smoothie.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/kale-smoothie/kale-smoothie.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/list/list.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/list/list.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/log/log.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/log/log.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/timed-task/timed-task.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/timed-task/timed-task.tsx +0 -8
- package/node_modules/@flickfyi/core/examples/parrott/timer/timer.stories.tsx +10 -3
- package/node_modules/@flickfyi/core/examples/parrott/timer/timer.tsx +0 -8
- package/node_modules/@flickfyi/core/package.json +16 -3
- package/node_modules/@flickfyi/core/src/{kowalski/use-configured-feature.ts → hooks/use-configured-feature/index.ts} +1 -1
- package/node_modules/@flickfyi/core/src/{kowalski/use-feature-store.ts → hooks/use-feature-store/index.ts} +37 -12
- package/node_modules/@flickfyi/core/src/kowalski/README.md +13 -0
- package/node_modules/@flickfyi/core/src/kowalski/calculations.ts +36 -8
- package/node_modules/@flickfyi/core/src/kowalski/calculator.ts +15 -7
- package/node_modules/@flickfyi/core/src/kowalski/catalog.ts +110 -704
- package/node_modules/@flickfyi/core/src/kowalski/components/bill-split.tsx +284 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/bookmark.tsx +347 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/budget.tsx +169 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/calculator.tsx +202 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/checklist.tsx +119 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/color-palette.tsx +302 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/contact.tsx +247 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/countdown.tsx +173 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/event.tsx +260 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/expense.tsx +257 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/goal.tsx +182 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/habit.tsx +272 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/ledger.tsx +211 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/note.tsx +188 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/poll.tsx +242 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/random-picker.tsx +308 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/rating.tsx +112 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/reminder.tsx +298 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/rotation.tsx +146 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/scoreboard.tsx +139 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/shopping-list.tsx +144 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/task-board.tsx +146 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/time-zone.tsx +240 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/timer.tsx +225 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/trip.tsx +338 -0
- package/node_modules/@flickfyi/core/src/kowalski/components/unit-converter.tsx +285 -0
- package/node_modules/@flickfyi/core/src/kowalski/create-schemas.ts +8 -0
- package/node_modules/@flickfyi/core/src/kowalski/date-time.tsx +1 -1
- package/node_modules/@flickfyi/core/src/kowalski/everyday.tsx +1 -640
- package/node_modules/@flickfyi/core/src/kowalski/feature-schema.ts +84 -0
- package/node_modules/@flickfyi/core/src/kowalski/format.ts +29 -3
- package/node_modules/@flickfyi/core/src/kowalski/fortune.tsx +67 -0
- package/node_modules/@flickfyi/core/src/kowalski/frame.tsx +5 -6
- package/node_modules/@flickfyi/core/src/kowalski/index.ts +31 -22
- package/node_modules/@flickfyi/core/src/kowalski/lesson.tsx +564 -0
- package/node_modules/@flickfyi/core/src/kowalski/recipe.tsx +78 -37
- package/node_modules/@flickfyi/core/src/kowalski/schemas.ts +67 -0
- package/node_modules/@flickfyi/core/src/kowalski/stories/composition.tsx +22 -20
- package/node_modules/@flickfyi/core/src/kowalski/time-since.tsx +145 -0
- package/node_modules/@flickfyi/core/src/molecules/progress/progress.tsx +4 -1
- package/node_modules/@flickfyi/core/src/oklch.ts +1 -6
- package/node_modules/@flickfyi/core/src/parrott/theme.ts +3 -1
- package/node_modules/@flickfyi/core/src/themes/editorial/editorial.ts +6 -1
- package/node_modules/@flickfyi/core/src/themes/palette.ts +5 -5
- package/node_modules/@flickfyi/core/src/themes/stories/composition.tsx +11 -9
- package/node_modules/@flickfyi/core/src/themes/stories/gallery.tsx +7 -11
- package/node_modules/@flickfyi/core/tsgo.bun.lock +7 -7
- package/node_modules/@flickfyi/core/tsgo.package.json +1 -1
- package/package.json +2 -2
- package/node_modules/@flickfyi/core/dist-types/kowalski/clocks.d.ts +0 -4
- package/node_modules/@flickfyi/core/dist-types/kowalski/details.d.ts +0 -7
- package/node_modules/@flickfyi/core/dist-types/kowalski/productivity.d.ts +0 -5
- package/node_modules/@flickfyi/core/dist-types/kowalski/tools.d.ts +0 -7
- package/node_modules/@flickfyi/core/dist-types/kowalski/use-feature-store.d.ts +0 -15
- package/node_modules/@flickfyi/core/src/kowalski/clocks.tsx +0 -464
- package/node_modules/@flickfyi/core/src/kowalski/details.tsx +0 -1387
- package/node_modules/@flickfyi/core/src/kowalski/productivity.tsx +0 -575
- package/node_modules/@flickfyi/core/src/kowalski/tools.tsx +0 -1213
- /package/node_modules/@flickfyi/core/dist-types/{kowalski/use-clock.d.ts → hooks/use-clock/index.d.ts} +0 -0
- /package/node_modules/@flickfyi/core/dist-types/{kowalski/use-configured-feature.d.ts → hooks/use-configured-feature/index.d.ts} +0 -0
- /package/node_modules/@flickfyi/core/src/{kowalski/use-clock.ts → hooks/use-clock/index.ts} +0 -0
|
@@ -2,8 +2,6 @@ import { useTheme } from '@flickfyi/core'
|
|
|
2
2
|
import { Card, List, QuantityGroup, Stat } from '@flickfyi/core/molecules'
|
|
3
3
|
import { useState } from 'react'
|
|
4
4
|
|
|
5
|
-
import type { ExampleMetadata } from '@flickfyi/core/examples/metadata'
|
|
6
|
-
|
|
7
5
|
import { theme } from './theme'
|
|
8
6
|
|
|
9
7
|
// Nutrition data per unit
|
|
@@ -101,9 +99,3 @@ export default function KaleSmoothieMacroCalculator() {
|
|
|
101
99
|
</Card>
|
|
102
100
|
)
|
|
103
101
|
}
|
|
104
|
-
|
|
105
|
-
export const exampleMetadata = {
|
|
106
|
-
description:
|
|
107
|
-
'Weighted totals from several independently adjustable quantities and per-unit factors, such as calories and nutrients across ingredients. Shows per-item quantity controls and recomputes aggregate measures.',
|
|
108
|
-
name: 'Quantity totals',
|
|
109
|
-
} satisfies ExampleMetadata
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { Meta
|
|
1
|
+
import type { Meta } from '@storybook/react-vite'
|
|
2
|
+
|
|
3
|
+
import type { ExampleStory } from '@flickfyi/core/examples/metadata'
|
|
2
4
|
|
|
3
5
|
import { List } from './list'
|
|
4
6
|
import exampleSource from './list.tsx?raw'
|
|
@@ -10,6 +12,11 @@ const meta = {
|
|
|
10
12
|
} satisfies Meta<typeof List>
|
|
11
13
|
|
|
12
14
|
export default meta
|
|
13
|
-
export const Example:
|
|
14
|
-
args: {
|
|
15
|
+
export const Example: ExampleStory<typeof meta> = {
|
|
16
|
+
args: {
|
|
17
|
+
description:
|
|
18
|
+
'Sortable rows with primary and secondary labels, relative timestamps, a per-row action, useful for schedules and recurring follow-ups.',
|
|
19
|
+
enabled: true,
|
|
20
|
+
name: 'Actionable list',
|
|
21
|
+
},
|
|
15
22
|
}
|
|
@@ -3,8 +3,6 @@ import { Card, List as ItemList } from '@flickfyi/core/molecules'
|
|
|
3
3
|
import * as stylex from '@flickfyi/core/stylex'
|
|
4
4
|
import { useEffect, useState } from 'react'
|
|
5
5
|
|
|
6
|
-
import type { ExampleMetadata } from '@flickfyi/core/examples/metadata'
|
|
7
|
-
|
|
8
6
|
import { theme } from './theme'
|
|
9
7
|
|
|
10
8
|
type Contact = { id: string; lastCalled: number | undefined; name: string }
|
|
@@ -88,12 +86,6 @@ export const evalMetadata = {
|
|
|
88
86
|
prompt: 'Make a weekly call sheet for family',
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
export const exampleMetadata = {
|
|
92
|
-
description:
|
|
93
|
-
'Sortable rows with primary and secondary labels, relative timestamps, a per-row action, useful for schedules and recurring follow-ups.',
|
|
94
|
-
name: 'Actionable list',
|
|
95
|
-
} satisfies ExampleMetadata
|
|
96
|
-
|
|
97
89
|
function daysSince(ts: number | undefined, now: number): number {
|
|
98
90
|
if (ts === undefined) {
|
|
99
91
|
return Infinity
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { Meta
|
|
1
|
+
import type { Meta } from '@storybook/react-vite'
|
|
2
|
+
|
|
3
|
+
import type { ExampleStory } from '@flickfyi/core/examples/metadata'
|
|
2
4
|
|
|
3
5
|
import { Log } from './log'
|
|
4
6
|
import exampleSource from './log.tsx?raw'
|
|
@@ -10,6 +12,11 @@ const meta = {
|
|
|
10
12
|
} satisfies Meta<typeof Log>
|
|
11
13
|
|
|
12
14
|
export default meta
|
|
13
|
-
export const Example:
|
|
14
|
-
args: {
|
|
15
|
+
export const Example: ExampleStory<typeof meta> = {
|
|
16
|
+
args: {
|
|
17
|
+
description:
|
|
18
|
+
'Appending timestamped outcomes to an event history, newest first, with totals and a success percentage derived from recorded events. For recording occurrences rather than updating the current value of an existing item.',
|
|
19
|
+
enabled: true,
|
|
20
|
+
name: 'Event log',
|
|
21
|
+
},
|
|
15
22
|
}
|
|
@@ -4,8 +4,6 @@ import { Card, List, Progress } from '@flickfyi/core/molecules'
|
|
|
4
4
|
import * as stylex from '@flickfyi/core/stylex'
|
|
5
5
|
import { useState } from 'react'
|
|
6
6
|
|
|
7
|
-
import type { ExampleMetadata } from '@flickfyi/core/examples/metadata'
|
|
8
|
-
|
|
9
7
|
import { theme } from './theme'
|
|
10
8
|
|
|
11
9
|
type Shot = { id: string; made: boolean; time: string }
|
|
@@ -79,12 +77,6 @@ export const evalMetadata = {
|
|
|
79
77
|
prompt: 'Make a free throw tracker',
|
|
80
78
|
}
|
|
81
79
|
|
|
82
|
-
export const exampleMetadata = {
|
|
83
|
-
description:
|
|
84
|
-
'Appending timestamped outcomes to an event history, newest first, with totals and a success percentage derived from recorded events. For recording occurrences rather than updating the current value of an existing item.',
|
|
85
|
-
name: 'Event log',
|
|
86
|
-
} satisfies ExampleMetadata
|
|
87
|
-
|
|
88
80
|
const formatTime = () => {
|
|
89
81
|
const d = new Date()
|
|
90
82
|
const h = d.getHours()
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { Meta
|
|
1
|
+
import type { Meta } from '@storybook/react-vite'
|
|
2
|
+
|
|
3
|
+
import type { ExampleStory } from '@flickfyi/core/examples/metadata'
|
|
2
4
|
|
|
3
5
|
import TimedTask from './timed-task'
|
|
4
6
|
import exampleSource from './timed-task.tsx?raw'
|
|
@@ -10,6 +12,11 @@ const meta = {
|
|
|
10
12
|
} satisfies Meta<typeof TimedTask>
|
|
11
13
|
|
|
12
14
|
export default meta
|
|
13
|
-
export const Example:
|
|
14
|
-
args: {
|
|
15
|
+
export const Example: ExampleStory<typeof meta> = {
|
|
16
|
+
args: {
|
|
17
|
+
description:
|
|
18
|
+
'A preparation checklist with preparation-only progress, followed by a separately started countdown with pause/resume, then finishing actions and completion. For multi-stage timed workflows.',
|
|
19
|
+
enabled: true,
|
|
20
|
+
name: 'Prepare, time, finish',
|
|
21
|
+
},
|
|
15
22
|
}
|
|
@@ -4,8 +4,6 @@ import { Card, Choice, List, Progress, Stat } from '@flickfyi/core/molecules'
|
|
|
4
4
|
import * as stylex from '@flickfyi/core/stylex'
|
|
5
5
|
import { useEffect, useState } from 'react'
|
|
6
6
|
|
|
7
|
-
import type { ExampleMetadata } from '@flickfyi/core/examples/metadata'
|
|
8
|
-
|
|
9
7
|
import { theme } from './theme'
|
|
10
8
|
|
|
11
9
|
const duration = 2 * 60 * 1000
|
|
@@ -150,9 +148,3 @@ export default function TimedTask() {
|
|
|
150
148
|
</Card>
|
|
151
149
|
)
|
|
152
150
|
}
|
|
153
|
-
|
|
154
|
-
export const exampleMetadata = {
|
|
155
|
-
description:
|
|
156
|
-
'A preparation checklist with preparation-only progress, followed by a separately started countdown with pause/resume, then finishing actions and completion. For multi-stage timed workflows.',
|
|
157
|
-
name: 'Prepare, time, finish',
|
|
158
|
-
} satisfies ExampleMetadata
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { Meta
|
|
1
|
+
import type { Meta } from '@storybook/react-vite'
|
|
2
|
+
|
|
3
|
+
import type { ExampleStory } from '@flickfyi/core/examples/metadata'
|
|
2
4
|
|
|
3
5
|
import Timer from './timer'
|
|
4
6
|
import exampleSource from './timer.tsx?raw'
|
|
@@ -10,6 +12,11 @@ const meta = {
|
|
|
10
12
|
} satisfies Meta<typeof Timer>
|
|
11
13
|
|
|
12
14
|
export default meta
|
|
13
|
-
export const Example:
|
|
14
|
-
args: {
|
|
15
|
+
export const Example: ExampleStory<typeof meta> = {
|
|
16
|
+
args: {
|
|
17
|
+
description:
|
|
18
|
+
'A user-started countdown with pause, resume, reset, and stable completion, useful for cooking, brewing, and timed activities.',
|
|
19
|
+
enabled: true,
|
|
20
|
+
name: 'Countdown timer',
|
|
21
|
+
},
|
|
15
22
|
}
|
|
@@ -3,8 +3,6 @@ import { Button } from '@flickfyi/core/atoms'
|
|
|
3
3
|
import { Card, Stat } from '@flickfyi/core/molecules'
|
|
4
4
|
import { useEffect, useState } from 'react'
|
|
5
5
|
|
|
6
|
-
import type { ExampleMetadata } from '@flickfyi/core/examples/metadata'
|
|
7
|
-
|
|
8
6
|
import { theme } from './theme'
|
|
9
7
|
|
|
10
8
|
const duration = 90 * 1000
|
|
@@ -74,9 +72,3 @@ export default function Timer() {
|
|
|
74
72
|
</Card>
|
|
75
73
|
)
|
|
76
74
|
}
|
|
77
|
-
|
|
78
|
-
export const exampleMetadata = {
|
|
79
|
-
description:
|
|
80
|
-
'A user-started countdown with pause, resume, reset, and stable completion, useful for cooking, brewing, and timed activities.',
|
|
81
|
-
name: 'Countdown timer',
|
|
82
|
-
} satisfies ExampleMetadata
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flickfyi/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.72",
|
|
4
4
|
"description": "Core type definitions and runtime environment for JavaScriptCore",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -180,6 +180,16 @@
|
|
|
180
180
|
"default": "./dist/kowalski/catalog.cjs"
|
|
181
181
|
}
|
|
182
182
|
},
|
|
183
|
+
"./kowalski/schemas": {
|
|
184
|
+
"import": {
|
|
185
|
+
"types": "./dist-types/kowalski/schemas.d.ts",
|
|
186
|
+
"default": "./dist/kowalski/schemas.js"
|
|
187
|
+
},
|
|
188
|
+
"require": {
|
|
189
|
+
"types": "./dist-types/kowalski/schemas.d.cts",
|
|
190
|
+
"default": "./dist/kowalski/schemas.cjs"
|
|
191
|
+
}
|
|
192
|
+
},
|
|
183
193
|
"./examples/kowalski/theme": "./examples/kowalski/theme.ts",
|
|
184
194
|
"./examples/kowalski/*": "./examples/kowalski/*/*.tsx",
|
|
185
195
|
"./examples/kowalski/*.tsx": "./examples/kowalski/*.tsx"
|
|
@@ -197,7 +207,7 @@
|
|
|
197
207
|
"deploy": "npm run verify:tsgo && npm run deploy:tsgo-deps && op run --env-file=\".env.op\" -- bun x --no-install fly-tsgo publish",
|
|
198
208
|
"deploy:tsgo-deps": "tsx scripts/deploy-tsgo-workspace-deps.ts",
|
|
199
209
|
"prepack": "npm run verify:tsgo",
|
|
200
|
-
"typecheck": "tsrs --noEmit -p ./tsconfig.json && tsrs --noEmit -p ./tsconfig.examples.json",
|
|
210
|
+
"typecheck": "bun ./build-entries.ts && tsrs --noEmit -p ./tsconfig.json && tsrs --noEmit -p ./tsconfig.examples.json",
|
|
201
211
|
"prebuild:types": "npm run verify:generated-types",
|
|
202
212
|
"generate:types": "bun run --filter @flickfyi/photon generate-types",
|
|
203
213
|
"generate:fonts": "tsx ./scripts/generate-google-fonts.ts",
|
|
@@ -281,6 +291,9 @@
|
|
|
281
291
|
"vite": "8.3.5",
|
|
282
292
|
"vite-plugin-dts": "5.1.2",
|
|
283
293
|
"vitest": "5.0.5",
|
|
284
|
-
"zx": "8.8.5"
|
|
294
|
+
"zx": "8.8.5",
|
|
295
|
+
"@flickfyi/schemas": "0.0.0",
|
|
296
|
+
"eslint": "10.14.0",
|
|
297
|
+
"@typescript-eslint/parser": "8.72.1"
|
|
285
298
|
}
|
|
286
299
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useEffect, useMemo } from 'react'
|
|
2
2
|
import type { z } from 'zod/v4'
|
|
3
3
|
|
|
4
|
-
import { useFeatureStore } from '
|
|
4
|
+
import { useFeatureStore } from '~/hooks/use-feature-store'
|
|
5
5
|
|
|
6
6
|
/** Authored seeds change only at a newer manifest revision; live values otherwise win. */
|
|
7
7
|
export function useConfiguredFeature<
|
|
@@ -4,18 +4,23 @@ import { z } from 'zod/v4'
|
|
|
4
4
|
|
|
5
5
|
import { createQuantumStoreAdapter } from '~/quantum/use-store'
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Subscribes to a Quantum store and exposes optimistic writes after hydration.
|
|
9
|
+
*
|
|
10
|
+
* @typeParam T - The state validated by the store schema.
|
|
11
|
+
* @param options - The store identity, schema, initial state, and sharing scope.
|
|
12
|
+
* @returns The visible state and save status. `set` accepts a partial update or an
|
|
13
|
+
* updater function and returns whether the write was queued; its optional callback
|
|
14
|
+
* runs after persistence succeeds. `ready` means the store is hydrated and writable.
|
|
15
|
+
* `retry` is available after a load failure. Failed writes roll back and set `error`.
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* Public stores share state between users of the same flick. Pass `scope: 'private'`
|
|
19
|
+
* for separate state per user. Changing the name or scope opens a different store;
|
|
20
|
+
* it does not migrate existing data.
|
|
21
|
+
*/
|
|
22
|
+
export function useFeatureStore<T extends object>(options: UseFeatureStoreOptions<T>) {
|
|
23
|
+
const { initialState, name, schema, scope = 'public' } = options
|
|
19
24
|
const lens = useMemo(() => makeLens({ schema }), [schema])
|
|
20
25
|
const writes = useMemo<{ pending: Set<Partial<T>>; error?: string }>(
|
|
21
26
|
() => ({ pending: new Set() }),
|
|
@@ -105,6 +110,26 @@ export function useFeatureStore<T extends object>({
|
|
|
105
110
|
}
|
|
106
111
|
}
|
|
107
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Options for {@link useFeatureStore}.
|
|
115
|
+
*
|
|
116
|
+
* @typeParam T - The state validated by `schema`.
|
|
117
|
+
*/
|
|
118
|
+
export type UseFeatureStoreOptions<T extends object> = {
|
|
119
|
+
/** Seeds a new store and supplies the value before hydration; never replaces saved state. */
|
|
120
|
+
initialState: T
|
|
121
|
+
/** Stable store name within the flick. Reuse it to reopen the same store and scope. */
|
|
122
|
+
name: string
|
|
123
|
+
/** Validates snapshots and updates and determines the store version. Keep its reference stable. */
|
|
124
|
+
schema: z.ZodType<T>
|
|
125
|
+
/**
|
|
126
|
+
* Whether state is shared between users of the flick or kept separately per user.
|
|
127
|
+
*
|
|
128
|
+
* @defaultValue `'public'`
|
|
129
|
+
*/
|
|
130
|
+
scope?: 'private' | 'public'
|
|
131
|
+
}
|
|
132
|
+
|
|
108
133
|
type FeatureSnapshot<T> = {
|
|
109
134
|
loadFailed?: boolean
|
|
110
135
|
ready: boolean
|
|
@@ -7,3 +7,16 @@
|
|
|
7
7
|
5. Minimize the setup interface once the activity has begun.
|
|
8
8
|
6. Items waiting on something else stay grey, deferred until it completes.
|
|
9
9
|
7. Ideally it should fit on the screen, but don't be excessively dogmatic.
|
|
10
|
+
|
|
11
|
+
## Props
|
|
12
|
+
|
|
13
|
+
Props are typed by TypeScript. Components destructure them with defaults and never parse
|
|
14
|
+
or validate their own props at runtime (no `Props.parse(input)` in a component).
|
|
15
|
+
|
|
16
|
+
Each component's `data` schema lives in that component's file; helpers shared across features
|
|
17
|
+
live in `feature-schema.ts`. Content schemas are what the content model reads, so they describe
|
|
18
|
+
each field and nothing else: no `.min()`, `.max()`, `.int()`, `.regex()`, `.refine()`,
|
|
19
|
+
`.default()`, or `z.iso` formats. Say "short" or "Omit for 300" in `.describe()` instead, and
|
|
20
|
+
apply the fallback in the component. Components render whatever content they receive, including
|
|
21
|
+
empty strings, empty arrays, and unparseable dates, time zones, or currency codes, without
|
|
22
|
+
throwing. `tests/kowalski-contracts.test.ts` checks the content schemas for these keywords.
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import { Decimal } from 'decimal.js'
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import type { PickerDomain } from '~/kowalski/components/random-picker'
|
|
4
|
+
|
|
5
|
+
import { format, resolveCurrency } from './format'
|
|
6
|
+
|
|
7
|
+
export const unitDefinitions = {
|
|
8
|
+
c: { dimension: 'temperature', factor: 1, offset: 0 },
|
|
9
|
+
f: { dimension: 'temperature', factor: 5 / 9, offset: -32 },
|
|
10
|
+
ft: { dimension: 'length', factor: 0.3048, offset: 0 },
|
|
11
|
+
g: { dimension: 'mass', factor: 0.001, offset: 0 },
|
|
12
|
+
k: { dimension: 'temperature', factor: 1, offset: -273.15 },
|
|
13
|
+
kg: { dimension: 'mass', factor: 1, offset: 0 },
|
|
14
|
+
km: { dimension: 'length', factor: 1000, offset: 0 },
|
|
15
|
+
lb: { dimension: 'mass', factor: 0.45359237, offset: 0 },
|
|
16
|
+
m: { dimension: 'length', factor: 1, offset: 0 },
|
|
17
|
+
mi: { dimension: 'length', factor: 1609.344, offset: 0 },
|
|
18
|
+
}
|
|
5
19
|
|
|
6
20
|
const Money = Decimal.clone({ precision: 40, rounding: Decimal.ROUND_HALF_UP })
|
|
7
21
|
|
|
@@ -19,21 +33,26 @@ export function billShares(
|
|
|
19
33
|
total: number,
|
|
20
34
|
people: number,
|
|
21
35
|
tipPercent: number,
|
|
22
|
-
currency: string
|
|
36
|
+
currency: string | undefined
|
|
23
37
|
) {
|
|
24
38
|
const digits =
|
|
25
39
|
format.formatters
|
|
26
|
-
.getNumberFormat(format.locale, {
|
|
40
|
+
.getNumberFormat(format.locale, {
|
|
41
|
+
currency: resolveCurrency(currency),
|
|
42
|
+
style: 'currency',
|
|
43
|
+
})
|
|
27
44
|
.resolvedOptions().maximumFractionDigits ?? 2
|
|
28
45
|
const scale = 10 ** digits
|
|
29
46
|
const minor = new Money(total)
|
|
30
47
|
.times(new Money(tipPercent).div(100).plus(1))
|
|
31
48
|
.times(scale)
|
|
32
49
|
.toDecimalPlaces(0)
|
|
33
|
-
|
|
50
|
+
// Authored and stored counts are unvalidated; split between at least one whole person.
|
|
51
|
+
const count = Number.isFinite(people) ? Math.max(1, Math.round(people)) : 1
|
|
52
|
+
const share = minor.dividedToIntegerBy(count)
|
|
34
53
|
return {
|
|
35
54
|
perPerson: share.div(scale).toNumber(),
|
|
36
|
-
remainder: minor.minus(share.times(
|
|
55
|
+
remainder: minor.minus(share.times(count)).div(scale).toNumber(),
|
|
37
56
|
total: minor.div(scale).toNumber(),
|
|
38
57
|
}
|
|
39
58
|
}
|
|
@@ -77,11 +96,20 @@ export function nextReminder(
|
|
|
77
96
|
}
|
|
78
97
|
const interval = (recurrence === 'daily' ? 1 : 7) * 86_400_000
|
|
79
98
|
const due = Date.parse(dueAt)
|
|
99
|
+
if (!Number.isFinite(due)) {
|
|
100
|
+
return null
|
|
101
|
+
}
|
|
80
102
|
return new Date(
|
|
81
103
|
due + Math.max(1, Math.floor((now - due) / interval) + 1) * interval
|
|
82
104
|
).toISOString()
|
|
83
105
|
}
|
|
84
106
|
|
|
107
|
+
/** Stored and authored instants are unvalidated text; anything unparseable reads as unset. */
|
|
108
|
+
export function parseInstant(value: string | null | undefined) {
|
|
109
|
+
const instant = value ? Date.parse(value) : Number.NaN
|
|
110
|
+
return Number.isFinite(instant) ? instant : null
|
|
111
|
+
}
|
|
112
|
+
|
|
85
113
|
export function pickResult(domain: PickerDomain, sample: number) {
|
|
86
114
|
if (!(sample >= 0 && sample < 1)) {
|
|
87
115
|
throw new Error('Random sample must be in [0, 1)')
|
|
@@ -97,9 +125,9 @@ export function pickResult(domain: PickerDomain, sample: number) {
|
|
|
97
125
|
}
|
|
98
126
|
|
|
99
127
|
/** Currency padding and grouping stay identical in the saved card and its editor. */
|
|
100
|
-
export function formatCurrency(value: number, currency: string) {
|
|
128
|
+
export function formatCurrency(value: number, currency: string | undefined) {
|
|
101
129
|
return format.formatNumber(value, {
|
|
102
|
-
currency,
|
|
130
|
+
currency: resolveCurrency(currency),
|
|
103
131
|
format: 'decimal',
|
|
104
132
|
style: 'currency',
|
|
105
133
|
})
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { Decimal } from 'decimal.js'
|
|
2
|
+
import type { z } from 'zod/v4'
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
CalculatorData,
|
|
6
|
+
calculatorStoreSchema,
|
|
7
|
+
} from '~/kowalski/components/calculator'
|
|
2
8
|
|
|
3
|
-
import type { KowalskiProps, KowalskiState } from './catalog'
|
|
4
9
|
import { format } from './format'
|
|
5
10
|
|
|
6
|
-
type CalculatorState =
|
|
7
|
-
type CalculatorOperator =
|
|
11
|
+
type CalculatorState = z.output<typeof calculatorStoreSchema>['calculation']
|
|
12
|
+
type CalculatorOperator = NonNullable<z.output<typeof CalculatorData>['operator']>
|
|
8
13
|
export type CalculatorKey =
|
|
9
14
|
| '0'
|
|
10
15
|
| '1'
|
|
@@ -50,10 +55,13 @@ export const calculatorKeys = [
|
|
|
50
55
|
] satisfies CalculatorKey[]
|
|
51
56
|
|
|
52
57
|
export function initialCalculator({
|
|
53
|
-
left,
|
|
54
|
-
operator,
|
|
55
|
-
right,
|
|
56
|
-
}: Pick<
|
|
58
|
+
left = 0,
|
|
59
|
+
operator = '+',
|
|
60
|
+
right = 0,
|
|
61
|
+
}: Pick<
|
|
62
|
+
z.output<typeof CalculatorData>,
|
|
63
|
+
'left' | 'operator' | 'right'
|
|
64
|
+
>): CalculatorState {
|
|
57
65
|
const result = calculate(left, operator, right)
|
|
58
66
|
return {
|
|
59
67
|
entry: result === null ? 'Error' : new CalculatorNumber(result).toString(),
|