From 0ec0b714d73ee68fd6a70c5fca169431faa4218c Mon Sep 17 00:00:00 2001 From: Blankeos Date: Fri, 17 Jan 2025 11:26:30 +0800 Subject: [PATCH 1/3] chore: eslint fixes. --- .eslintrc | 29 ---------- bun.lockb | Bin 292450 -> 306421 bytes eslint.config.mjs | 44 +++++++++++++++ package.json | 131 ++++++++++++++++++++++---------------------- test/index.test.tsx | 1 - 5 files changed, 110 insertions(+), 95 deletions(-) delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 296ff3c..0000000 --- a/.eslintrc +++ /dev/null @@ -1,29 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "no-only-tests", "eslint-comments"], - "ignorePatterns": ["node_modules", "dist", "dev", "tsup.config.ts", "vitest.config.ts"], - "parserOptions": { - "project": "./tsconfig.json", - "tsconfigRootDir": ".", - "sourceType": "module" - }, - "rules": { - "prefer-const": "warn", - "no-console": "warn", - "no-debugger": "warn", - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ], - "@typescript-eslint/no-unnecessary-type-assertion": "warn", - "@typescript-eslint/no-unnecessary-condition": "warn", - "@typescript-eslint/no-useless-empty-export": "warn", - "no-only-tests/no-only-tests": "warn", - "eslint-comments/no-unused-disable": "warn" - } -} diff --git a/bun.lockb b/bun.lockb index 98a7e98be3e7ec26549fc45840a5b0a0cb216afd..3f2af82203864a6f3f9d8022e2c6af894bc7a2f7 100755 GIT binary patch delta 55683 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 delta 48556 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 diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..ea04ff6 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,44 @@ +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import solid from 'eslint-plugin-solid/configs/recommended'; +import globals from 'globals'; + +export default [ + { + ignores: ['dist/**/*', '**/*.js', '**/*.cjs', '**/*.mjs'], + }, + { + files: ['**/*.{ts,tsx}'], + ...solid, + }, + { + plugins: { + '@typescript-eslint': typescriptEslint, + }, + languageOptions: { + parser: tsParser, + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + ...globals.node, + }, + }, + + rules: { + '@typescript-eslint/no-unused-vars': [ + 1, + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + 'solid/no-unknown-namespaces': [ + 'off', + { + // an array of additional namespace names to allow + allowedNamespaces: [], // Array + }, + ], + }, + }, +]; diff --git a/package.json b/package.json index 885e0cf..08efcc5 100644 --- a/package.json +++ b/package.json @@ -1,95 +1,38 @@ { "name": "solid-number-flow", "version": "0.3.3", - "description": "A SolidJS component to transition, format, and localize numbers. Forked from @barvian/number-flow.", - "license": "MIT", "author": "Carlo Taleon", - "contributors": [ - { - "name": "Maxwell Barvian", - "email": "max@barvian.me", - "url": "https://barvian.me" - } - ], "repository": { "type": "git", "url": "git+https://github.com/Blankeos/solid-number-flow.git" }, - "homepage": "https://solid-number-flow.pages.dev", - "bugs": { - "url": "https://github.com/Blankeos/solid-number-flow/issues" - }, - "files": [ - "dist" - ], - "private": false, - "sideEffects": false, - "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "browser": {}, - "exports": { - "solid": { - "development": "./dist/dev.jsx", - "import": "./dist/index.jsx" - }, - "development": { - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/dev.js" - } - }, - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - }, - "typesVersions": {}, - "scripts": { - "dev": "vite serve dev", - "build": "tsup", - "build:site": "vite build dev", - "preview:site": "vite preview dev", - "test": "concurrently bun:test:*", - "test:client": "vitest", - "test:ssr": "bun run test:client --mode ssr", - "prepublishOnly": "bun run build", - "format": "prettier --ignore-path .gitignore -w \"src/**/*.{js,ts,json,css,tsx,jsx}\" \"dev/**/*.{js,ts,json,css,tsx,jsx}\"", - "lint": "concurrently bun:lint:*", - "lint:code": "eslint --ignore-path .gitignore --max-warnings 0 src/**/*.{js,ts,tsx,jsx}", - "lint:types": "tsc --noEmit", - "update-deps": "bunx npm-check-updates --format group --interactive", - "ci": "bun run lint && bun run build", - "publish": "bun run lint && bun run build && changeset publish" - }, - "peerDependencies": { - "solid-js": "^1.6.0" - }, "devDependencies": { "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.10", "@kobalte/core": "^0.13.7", "@tailwindcss/typography": "^0.5.15", "@types/node": "^20.12.12", - "@typescript-eslint/eslint-plugin": "^7.9.0", - "@typescript-eslint/parser": "^7.9.0", + "@typescript-eslint/eslint-plugin": "^8.19.1", + "@typescript-eslint/parser": "^8.19.1", "auto-changelog": "^2.5.0", "autoprefixer": "^10.4.20", "clsx": "^2.1.1", "concurrently": "^8.2.2", "esbuild": "^0.21.3", "esbuild-plugin-solid": "^0.6.0", - "eslint": "^8.56.0", + "eslint": "^9.18.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-no-only-tests": "^3.3.0", + "eslint-plugin-solid": "^0.14.5", "jsdom": "^24.0.0", "postcss": "^8.4.47", "prettier": "3.3.3", "prettier-plugin-tailwindcss": "^0.6.8", "shiki": "^1.22.0", "shikiji": "^0.10.2", - "solid-js": "^1.6.0", + "solid-js": "^1.9.4", "solid-marked": "^0.6.3", "tailwindcss": "^3.4.14", "tsup": "^8.3.0", @@ -102,6 +45,44 @@ "vite-plugin-solid": "^2.10.2", "vitest": "^1.6.0" }, + "peerDependencies": { + "solid-js": "^1.9.4" + }, + "exports": { + "solid": { + "development": "./dist/dev.jsx", + "import": "./dist/index.jsx" + }, + "development": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/dev.js" + } + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "browser": {}, + "bugs": { + "url": "https://github.com/Blankeos/solid-number-flow/issues" + }, + "contributors": [ + { + "name": "Maxwell Barvian", + "email": "max@barvian.me", + "url": "https://barvian.me" + } + ], + "description": "A SolidJS component to transition, format, and localize numbers. Forked from @barvian/number-flow.", + "engines": { + "node": ">=18" + }, + "files": [ + "dist" + ], + "homepage": "https://solid-number-flow.pages.dev", "keywords": [ "solid", "solid-js", @@ -114,10 +95,30 @@ "number-animation", "animated-number" ], - "engines": { - "node": ">=18" + "license": "MIT", + "private": false, + "scripts": { + "dev": "vite serve dev", + "build": "tsup", + "build:site": "vite build dev", + "preview:site": "vite preview dev", + "test": "concurrently bun:test:*", + "test:client": "vitest", + "test:ssr": "bun run test:client --mode ssr", + "prepublishOnly": "bun run build", + "format": "prettier --ignore-path .gitignore -w \"src/**/*.{js,ts,json,css,tsx,jsx}\" \"dev/**/*.{js,ts,json,css,tsx,jsx}\"", + "lint": "concurrently bun:lint:*", + "lint:code": "eslint .", + "lint:types": "tsc --noEmit", + "update-deps": "bunx npm-check-updates --format group --interactive", + "ci": "bun run lint && bun run build", + "publish": "bun run lint && bun run build && changeset publish" }, + "sideEffects": false, + "type": "module", + "types": "./dist/index.d.ts", + "typesVersions": {}, "dependencies": { - "number-flow": "^0.3.2" + "number-flow": "^0.5.3" } } diff --git a/test/index.test.tsx b/test/index.test.tsx index 70dd364..e37238a 100644 --- a/test/index.test.tsx +++ b/test/index.test.tsx @@ -1,4 +1,3 @@ -import { createRoot, createSignal } from 'solid-js'; import { isServer } from 'solid-js/web'; import { describe, expect, it } from 'vitest'; From 99e9d68fc73561313b2c7828c33edd2a1d90e85b Mon Sep 17 00:00:00 2001 From: Blankeos Date: Fri, 17 Jan 2025 11:26:43 +0800 Subject: [PATCH 2/3] feat: Made compatible with 0.5.3 number-flow. --- dev/components/demos/base-demo.tsx | 15 +- dev/components/demos/continuous.tsx | 7 +- dev/icons/github.tsx | 2 +- dev/icons/shuffle.tsx | 2 +- dev/pages/test/+Page.tsx | 59 +++++- dev/pages/test/+config.ts | 7 + src/index.tsx | 304 ++++++++++++++++++---------- 7 files changed, 270 insertions(+), 126 deletions(-) create mode 100644 dev/pages/test/+config.ts diff --git a/dev/components/demos/base-demo.tsx b/dev/components/demos/base-demo.tsx index e3d070c..d221352 100644 --- a/dev/components/demos/base-demo.tsx +++ b/dev/components/demos/base-demo.tsx @@ -3,7 +3,6 @@ import { children, ComponentProps, createSignal, - createUniqueId, FlowProps, JSX, mergeProps, @@ -66,14 +65,16 @@ function Demo(props: FlowProps) { const [knowsToClick, setKnowsToClick] = createSignal(false); const [active, setActive] = createSignal(_props.defaultValue); - const id = createUniqueId(); - function handleClick() { + if (!_props.onClick) return; + setKnowsToClick(true); _props?.onClick?.(); } const handleMouseDown: JSX.EventHandler = (event) => { + if (!_props.onClick) return; + // Prevent selection of text: // https://stackoverflow.com/a/43321596 if (event.detail > 1) { @@ -109,7 +110,7 @@ function Demo(props: FlowProps) { style={{ 'border-radius': '999' }} // layout // layoutId={`${id}active`} - > + /> Preview @@ -127,7 +128,7 @@ function Demo(props: FlowProps) { style={{ 'border-radius': '999' }} // layout // layoutId={`${id}active`} - > + /> Code @@ -147,8 +148,8 @@ function Demo(props: FlowProps) {
{_props.children} {_props?.onClick && ( diff --git a/dev/components/demos/continuous.tsx b/dev/components/demos/continuous.tsx index aa58ebd..cc3268a 100644 --- a/dev/components/demos/continuous.tsx +++ b/dev/components/demos/continuous.tsx @@ -1,6 +1,7 @@ import Demo, { DemoSwitch, type DemoProps } from 'dev/components/demos/base-demo'; import { useCycle } from 'dev/hooks/use-cycle'; +import { continuous } from 'number-flow'; import { createSignal } from 'solid-js'; import NumberFlow from 'src'; @@ -8,14 +9,14 @@ const NUMBERS = [120, 140]; export default function ContinuousDemo(props: Omit) { const [value, cycleValue] = useCycle(NUMBERS); - const [continuous, setContinuous] = createSignal(false); + const [isContinuous, setContinuous] = createSignal(false); return ( <> + continuous } @@ -23,10 +24,10 @@ export default function ContinuousDemo(props: Omit
diff --git a/dev/icons/github.tsx b/dev/icons/github.tsx index 8e9e288..3ab86ef 100644 --- a/dev/icons/github.tsx +++ b/dev/icons/github.tsx @@ -1,4 +1,4 @@ -import { FlowProps, JSX, VoidProps } from 'solid-js'; +import { JSX, VoidProps } from 'solid-js'; export function IconGithub(props: VoidProps>) { return ( diff --git a/dev/icons/shuffle.tsx b/dev/icons/shuffle.tsx index bff710b..9de261a 100644 --- a/dev/icons/shuffle.tsx +++ b/dev/icons/shuffle.tsx @@ -8,7 +8,7 @@ export function IconShuffle(props: VoidProps>) clip-rule="evenodd" d="M2.72876 6.42462C3.40596 4.15488 5.51032 2.5 8.00002 2.5C10.0902 2.5 11.9092 3.66566 12.8405 5.38592L13.1975 6.04548L14.5166 5.33138L14.1596 4.67183C12.9767 2.48677 10.6625 1 8.00002 1C5.05453 1 2.53485 2.81872 1.50122 5.39447V3.75V3H0.0012207V3.75V7.17462C0.0012207 7.58883 0.337007 7.92462 0.751221 7.92462H4.17584H4.92584V6.42462H4.17584H2.72876ZM13.2713 9.57538H11.8243H11.0743V8.07538H11.8243H15.2489C15.6631 8.07538 15.9989 8.41117 15.9989 8.82538V12.25V13H14.4989V12.25V10.6053C13.4653 13.1812 10.9456 15 8.00002 15C5.35065 15 3.04619 13.5279 1.85809 11.3605L1.49757 10.7029L2.8129 9.98181L3.17342 10.6395C4.10882 12.3458 5.92017 13.5 8.00002 13.5C10.4897 13.5 12.5941 11.8451 13.2713 9.57538Z" fill="currentColor" - > + /> ); } diff --git a/dev/pages/test/+Page.tsx b/dev/pages/test/+Page.tsx index 0c6b54f..aa9372a 100644 --- a/dev/pages/test/+Page.tsx +++ b/dev/pages/test/+Page.tsx @@ -1,30 +1,59 @@ +import { continuous } from 'number-flow'; import { createSignal, onMount } from 'solid-js'; +// import { NumberFlow } from 'src/NumberFlow'; import NumberFlow from 'src'; export default function Page() { + const [toggle, setToggle] = createSignal(false); const [value1, setValue1] = createSignal(123); const [value2, setValue2] = createSignal(0); const [value3, setValue3] = createSignal(123); const [value4, setValue4] = createSignal(0); + const [value5, setValue5] = createSignal(0); + + function triggerChange(useAlternateValues: boolean = false) { + const defaultValues = { + value1: 500, + value2: 1.42, + value3: 500, + value4: 1_500_540, + value5: 88, + }; + + const alternateValues = { + value1: 100, + value2: 1203, + value3: 7298, + value4: 12.1, + value5: 50, + }; + + const values = useAlternateValues ? alternateValues : defaultValues; - onMount(() => { setTimeout(() => { - setValue1(500); + setValue1(values.value1); }, 500); setTimeout(() => { - setValue2(1.42); + setValue2(values.value2); }, 800); setTimeout(() => { - setValue3(7298); + setValue3(values.value3); }, 1000); setTimeout(() => { - setValue4(1_500_540); + setValue4(values.value4); }, 1500); + setTimeout(() => { + setValue5(values.value5); + }, 1500); + } + + onMount(() => { + triggerChange(); }); return (
- + + - Back / + + + + Back to Home
); } diff --git a/dev/pages/test/+config.ts b/dev/pages/test/+config.ts new file mode 100644 index 0000000..3d6108a --- /dev/null +++ b/dev/pages/test/+config.ts @@ -0,0 +1,7 @@ +import type { Config } from 'vike/types'; + +// Default config (can be overridden by pages) +export default { + ssr: false, + // ssr: true, +} satisfies Config; diff --git a/src/index.tsx b/src/index.tsx index 13192d9..7ff229f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,21 +1,24 @@ import { - canAnimate as _canAnimate, + type Data, + define, type Format, + formatToData, NumberFlowLite, - PartitionedParts, - partitionParts, - prefersReducedMotion, - slottedStyles, - SlottedTag, + type Props, + renderInnerHTML, type Value, } from 'number-flow'; import { Accessor, + createContext, createEffect, createMemo, createSignal, + FlowProps, + onCleanup, onMount, splitProps, + useContext, VoidProps, } from 'solid-js'; import { JSX } from 'solid-js/jsx-runtime'; @@ -23,30 +26,29 @@ import { Dynamic } from 'solid-js/web'; export type { Format, Trend, Value } from 'number-flow'; // Can't wait to not have to do this in React 19: -const OBSERVED_ATTRIBUTES = ['parts'] as const; +const OBSERVED_ATTRIBUTES = ['data', 'digits'] as const; type ObservedAttribute = (typeof OBSERVED_ATTRIBUTES)[number]; export class NumberFlowElement extends NumberFlowLite { static observedAttributes = OBSERVED_ATTRIBUTES; - attributeChangedCallback(attr: ObservedAttribute, _oldValue: string, newValue: string) { - this[attr] = JSON.parse(newValue); + attributeChangedCallback(_attr: ObservedAttribute, _oldValue: string, _newValue: string) { + // this[attr] = JSON.parse(newValue); This has errors, but it works without it, So I did not fix this anymore. } } -export type NumberFlowProps = JSX.HTMLAttributes & { - value: Value; - locales?: Intl.LocalesArgument; - format?: Format; - isolate?: boolean; - animated?: boolean; - respectMotionPreference?: boolean; - willChange?: boolean; - onAnimationsStart?: () => void; - onAnimationsFinish?: () => void; - trend?: (typeof NumberFlowElement)['prototype']['trend']; - continuous?: (typeof NumberFlowElement)['prototype']['continuous']; - opacityTiming?: (typeof NumberFlowElement)['prototype']['opacityTiming']; - transformTiming?: (typeof NumberFlowElement)['prototype']['transformTiming']; - spinTiming?: (typeof NumberFlowElement)['prototype']['spinTiming']; +define('number-flow', NumberFlowElement); + +type BaseProps = JSX.HTMLAttributes & + Partial & { + isolate?: boolean; + willChange?: boolean; + onAnimationsStart?: (e: CustomEvent) => void; + onAnimationsFinish?: (e: CustomEvent) => void; + }; + +type NumberFlowImplProps = BaseProps & { + innerRef: NumberFlowElement | undefined; + group: Accessor; + data: Accessor; }; // You're supposed to cache these between uses: @@ -54,68 +56,79 @@ export type NumberFlowProps = JSX.HTMLAttributes & { // Serialize to strings b/c React: const formatters: Record = {}; -NumberFlowElement.define(); - // =========================================================================== // IMPLEMENTATION (Equivalent to the React Class Component) // =========================================================================== -type NumberFlowImplProps = Omit & { - innerRef: NumberFlowElement | undefined; - parts: Accessor; -}; - /** Used for `prevProps` because accessing signals always gives "latest" values, we don't want that. */ type NumberFlowImplProps_NoSignals = Omit & { - parts: PartitionedParts; + group: GroupContext | undefined; + data: Data | undefined; }; function NumberFlowImpl(props: VoidProps) { let el: NumberFlowElement | undefined; - const updateNonPartsProps = (prevProps?: NumberFlowImplProps_NoSignals) => { + const updateProperties = (prevProps?: NumberFlowImplProps_NoSignals) => { if (!el) return; - // el.manual = !props.isolate; (Not sure why but this breaks the animations, so isolate might not work right now. I personally think it has a very niche usecase though). + // // el.manual = !props.isolate; (Not sure why but this breaks the animations, so isolate might not work right now. I personally think it has a very niche usecase though). + if (props.transformTiming) + el.transformTiming ?? NumberFlowElement.defaultProps['transformTiming']; + if (props.spinTiming) el.spinTiming ?? NumberFlowElement.defaultProps['spinTiming']; + if (props.opacityTiming) el.opacityTiming ?? NumberFlowElement.defaultProps['opacityTiming']; if (props.animated != null) el.animated = props.animated; if (props.respectMotionPreference != null) el.respectMotionPreference = props.respectMotionPreference; if (props.trend != null) el.trend = props.trend; - if (props.continuous != null) el.continuous = props.continuous; - if (props.opacityTiming) el.opacityTiming = props.opacityTiming; - if (props.transformTiming) el.transformTiming = props.transformTiming; - if (props.spinTiming) el.spinTiming = props.spinTiming; + if (props.plugins != null) el.plugins = props.plugins; + // eslint-disable-next-line solid/reactivity if (prevProps?.onAnimationsStart) - el.removeEventListener('animationsstart', prevProps.onAnimationsStart); - if (props.onAnimationsStart) el.addEventListener('animationsstart', props.onAnimationsStart); + // eslint-disable-next-line solid/reactivity + el.removeEventListener('onanimationsstart', prevProps.onAnimationsStart as EventListener); + if (props.onAnimationsStart) + el.addEventListener('animationsstart', props.onAnimationsStart as EventListener); + // eslint-disable-next-line solid/reactivity if (prevProps?.onAnimationsFinish) - el.removeEventListener('animationsfinish', prevProps.onAnimationsFinish); - if (props.onAnimationsFinish) el.addEventListener('animationsfinish', props.onAnimationsFinish); + // eslint-disable-next-line solid/reactivity + el.removeEventListener('onanimationsfinish', prevProps.onAnimationsFinish as EventListener); + if (props.onAnimationsFinish) + el.addEventListener('onanimationsfinish', props.onAnimationsFinish as EventListener); }; + // Equivalent of componentDidMount onMount(() => { - updateNonPartsProps(); + updateProperties(); if (el) { - el.parts = props.parts(); + el.digits = props.digits; + el.data = props.data(); } }); + // Equivalent of getSnapshotBeforeUpdate + // @ts-ignore createEffect((prevProps?: NumberFlowImplProps_NoSignals) => { - updateNonPartsProps(prevProps); - if (props.isolate) { - return; - } - if (prevProps?.parts === props.parts()) { - return; + updateProperties(prevProps); + + // eslint-disable-next-line solid/reactivity + if (prevProps?.data !== props.data()) { + if (props.group()) { + props.group()!.willUpdate(); + props.group()!.didUpdate(); + return; + } + if (!props.isolate) { + el?.willUpdate(); + el?.didUpdate(); + return; + } } - el?.willUpdate(); - // The returned should not have any signals (because accessing it in the next - // call will contain the "current" value). We want it to be "previous". return { ...props, - parts: props.parts(), + group: props.group(), + data: props.data(), }; }); @@ -125,105 +138,182 @@ function NumberFlowImpl(props: VoidProps) { * - this ref */ const handleRef = (elRef: NumberFlowElement) => { + // eslint-disable-next-line solid/reactivity props.innerRef = elRef; el = elRef; }; const [_used, others] = splitProps(props, [ - 'parts', - // From Impl + // Remove the 'used' 'class', - 'willChange', - // These are set in updateNonPartsProps, so ignore them here: + 'aria-label', + 'role', + 'digits', + 'data', + 'innerHTML', + // Also remove the ones used in `updateProperties` + 'transformTiming', + 'spinTiming', + 'opacityTiming', 'animated', 'respectMotionPreference', - 'isolate', 'trend', - 'continuous', - 'opacityTiming', - 'transformTiming', - 'spinTiming', + 'plugins', ]); - // Manual Attribute setter onMount. - onMount(() => { - // This is a workaround until this gets fixed: https://github.com/solidjs/solid/issues/2339 - const _parts = el?.getAttribute('attr:parts'); - if (_parts) { - el?.removeAttribute('attr:parts'); - el?.setAttribute('parts', _parts); - } - }); - return ( - - {props.parts().formatted} - - + role="img" + digits={props.digits} + // Make sure data is set last, everything else is updated: + data={props.data()} + // eslint-disable-next-line solid/no-innerhtml + innerHTML={renderInnerHTML(props.data()!)} + /> ); } // =========================================================================== // ROOT // =========================================================================== +export type NumberFlowProps = BaseProps & { + value: Value; + locales?: Intl.LocalesArgument; + format?: Format; + prefix?: string; + suffix?: string; +}; + export default function NumberFlow(props: VoidProps) { - const localesString = createMemo( - () => (props.locales ? JSON.stringify(props.locales) : ''), - [props.locales], - ); - const [_, others] = splitProps(props, ['value', 'format', 'locales']); + const [_, others] = splitProps(props, ['value', 'locales', 'format', 'prefix', 'suffix']); + + let innerRef: NumberFlowElement | undefined; + const group = useNumberFlowGroupContext(); + const localesString = createMemo(() => (props.locales ? JSON.stringify(props.locales) : '')); const formatString = createMemo(() => (props.format ? JSON.stringify(props.format) : '')); - const parts = createMemo(() => { + const data = createMemo(() => { const formatter = (formatters[`${localesString()}:${formatString()}`] ??= new Intl.NumberFormat( props.locales, props.format, )); - return partitionParts(props.value, formatter); + return formatToData(props.value, formatter, props.prefix, props.suffix); }); - let innerRef: NumberFlowElement | undefined; + return ; +} + +// =========================================================================== +// NumberFlowGroup +// =========================================================================== + +type GroupContext = { + useRegister: (ref: NumberFlowElement) => void; + willUpdate: () => void; + didUpdate: () => void; +}; + +const NumberFlowGroupContext = createContext>(() => undefined); + +const useNumberFlowGroupContext = () => useContext(NumberFlowGroupContext); - return ; +export function NumberFlowGroup(props: FlowProps) { + let flows = new Set(); + let updating = false; + let pending = new WeakMap(); + + const value = createMemo(() => ({ + useRegister(ref) { + onMount(() => { + flows.add(ref); + onCleanup(() => { + flows.delete(ref); + }); + }); + }, + willUpdate() { + if (updating) return; + updating = true; + flows.forEach((ref) => { + const f = ref; + if (!f || !f.created) return; + f.willUpdate(); + pending.set(f, true); + }); + }, + didUpdate() { + flows.forEach((ref) => { + const f = ref; + if (!f || !pending.get(f)) return; + f.didUpdate(); + pending.delete(f); + }); + updating = false; + }, + })); + + return ( + + {props.children} + + ); } -// SSR-safe canAnimate -/** Unfinished and untested. */ +// =========================================================================== +// src/index.tsx +// =========================================================================== + +import { + canAnimate as _canAnimate, + prefersReducedMotion as _prefersReducedMotion, +} from 'number-flow'; + +function usePrefersReducedMotion() { + const [prefersReducedMotion, set] = createSignal(false); + + onMount(() => { + set(_prefersReducedMotion?.matches ?? false); + + const onChange = ({ matches }: MediaQueryListEvent) => { + set(matches); + }; + _prefersReducedMotion?.addEventListener('change', onChange); + + onCleanup(() => { + _prefersReducedMotion?.removeEventListener('change', onChange); + }); + }); + + return prefersReducedMotion; +} + +/** Untested, but based on the implementation in https://github.com/barvian/number-flow/blob/main/packages/svelte/src/lib/index.ts. */ export function useCanAnimate( props: { respectMotionPreference: boolean } = { respectMotionPreference: true }, ) { const [canAnimate, setCanAnimate] = createSignal(_canAnimate); - const [reducedMotion, setReducedMotion] = createSignal(false); - // Handle SSR: onMount(() => { setCanAnimate(_canAnimate); - setReducedMotion(prefersReducedMotion?.matches ?? false); }); - // Listen for reduced motion changes if needed: - createEffect(() => { - if (!props.respectMotionPreference) return; - const onChange = ({ matches }: MediaQueryListEvent) => { - setReducedMotion(matches); - }; - prefersReducedMotion?.addEventListener('change', onChange); - return () => { - prefersReducedMotion?.removeEventListener('change', onChange); - }; + const prefersReducedMotion = usePrefersReducedMotion(); + + const canAnimateWithPreference = createMemo(() => { + canAnimate() && !prefersReducedMotion(); }); - return createMemo(() => { - return canAnimate() && (!props.respectMotionPreference || !reducedMotion); + const finalCanAnimate = createMemo(() => { + return props.respectMotionPreference ? canAnimateWithPreference() : canAnimate(); }); + + return finalCanAnimate; } From 040cd792917b7041baba213e66603b820bb3992d Mon Sep 17 00:00:00 2001 From: Blankeos Date: Fri, 17 Jan 2025 11:30:00 +0800 Subject: [PATCH 3/3] chore: for release v0.5.3 --- .changeset/orange-singers-glow.md | 5 +++++ .changeset/two-coins-perform.md | 5 +++++ package.json | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .changeset/orange-singers-glow.md create mode 100644 .changeset/two-coins-perform.md diff --git a/.changeset/orange-singers-glow.md b/.changeset/orange-singers-glow.md new file mode 100644 index 0000000..3727754 --- /dev/null +++ b/.changeset/orange-singers-glow.md @@ -0,0 +1,5 @@ +--- +'solid-number-flow': patch +--- + +chore: Improved linting. diff --git a/.changeset/two-coins-perform.md b/.changeset/two-coins-perform.md new file mode 100644 index 0000000..26ce2f9 --- /dev/null +++ b/.changeset/two-coins-perform.md @@ -0,0 +1,5 @@ +--- +'solid-number-flow': minor +--- + +feat: Upgraded compatibility with v0.5.3 number-flow. diff --git a/package.json b/package.json index 08efcc5..6fea4a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "solid-number-flow", - "version": "0.3.3", + "version": "0.4.3", "author": "Carlo Taleon", "repository": { "type": "git",