diff --git a/percentage-tracker/.env.example b/percentage-tracker/.env.example
new file mode 100644
index 0000000..96c70c7
--- /dev/null
+++ b/percentage-tracker/.env.example
@@ -0,0 +1 @@
+CODE_LIBRARIES="true"
\ No newline at end of file
diff --git a/percentage-tracker/.gitignore b/percentage-tracker/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/percentage-tracker/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/percentage-tracker/README.md b/percentage-tracker/README.md
new file mode 100644
index 0000000..6235a8d
--- /dev/null
+++ b/percentage-tracker/README.md
@@ -0,0 +1,19 @@
+# Percentage Tracker
+
+This code component example displays an animated percentage tracker that highlights completion progress for any goal from 0–100.
+
+## Features
+
+- Animated progress bar that transitions from 0 to the provided value on load
+- Props for customizing the displayed label, progress color, and animation delay within Webflow
+- Styled with [TailwindCSS](https://tailwindcss.com/) and [DaisyUI](https://daisyui.com/)
+- Vite project setup ready for local development and Webflow code component publishing
+
+## Getting started
+
+- Install dependencies: `npm i`
+- Run the project locally: `npm run dev`
+ - Visit `http://localhost:5173/`
+ - Ensure that the component loads as expected
+ - Any local code changes saved should reflect accordingly
+- Run `npx webflow library share` to create a code library for this example in your designated Webflow workspace
diff --git a/percentage-tracker/index.html b/percentage-tracker/index.html
new file mode 100644
index 0000000..d4506a3
--- /dev/null
+++ b/percentage-tracker/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Percentage Tracker
+
+
+
+
+
+
diff --git a/percentage-tracker/package.json b/percentage-tracker/package.json
new file mode 100644
index 0000000..f53d734
--- /dev/null
+++ b/percentage-tracker/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "percentage-tracker",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "devDependencies": {
+ "@types/react": "^19.1.12",
+ "@types/react-dom": "^19.1.9",
+ "@vitejs/plugin-react": "^4.3.3",
+ "@webflow/react": "^0.0.12",
+ "@webflow/webflow-cli": "^1.4.0",
+ "typescript": "^5.9.2",
+ "vite": "^7.1.2"
+ },
+ "dependencies": {
+ "@tailwindcss/postcss": "^4.1.13",
+ "@tailwindcss/vite": "^4.1.13",
+ "daisyui": "^5.1.8",
+ "postcss": "^8.5.6",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "tailwindcss": "^4.1.13"
+ }
+}
diff --git a/percentage-tracker/postcss.config.mjs b/percentage-tracker/postcss.config.mjs
new file mode 100644
index 0000000..54e8739
--- /dev/null
+++ b/percentage-tracker/postcss.config.mjs
@@ -0,0 +1,6 @@
+const config = {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
+};
+export default config;
\ No newline at end of file
diff --git a/percentage-tracker/public/vite.svg b/percentage-tracker/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/percentage-tracker/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/percentage-tracker/src/PercentageTracker.tsx b/percentage-tracker/src/PercentageTracker.tsx
new file mode 100644
index 0000000..44612a5
--- /dev/null
+++ b/percentage-tracker/src/PercentageTracker.tsx
@@ -0,0 +1,65 @@
+import { useEffect, useMemo, useState } from 'react'
+
+type PercentageTrackerProps = {
+ value: number
+ label?: string
+ color?: string
+ delay?: number
+}
+
+const clampValue = (input: number) => {
+ if (Number.isNaN(input)) {
+ return 0
+ }
+
+ return Math.min(100, Math.max(0, Math.round(input)))
+}
+
+const PercentageTracker = ({ value, label, color = '#16a34a', delay = 0 }: PercentageTrackerProps) => {
+ const normalizedValue = useMemo(() => clampValue(value), [value])
+ const animationDelay = Math.max(0, delay)
+ const [displayValue, setDisplayValue] = useState(0)
+
+ useEffect(() => {
+ const timeout = window.setTimeout(() => {
+ setDisplayValue(normalizedValue)
+ }, animationDelay)
+
+ return () => {
+ window.clearTimeout(timeout)
+ }
+ }, [normalizedValue, animationDelay])
+
+ return (
+
+
+
+
Progress
+
Tracking completion towards your goal
+
+
{displayValue}%
+
+
+ {label &&
{label}
}
+
+ )
+}
+
+export default PercentageTracker
diff --git a/percentage-tracker/src/PercentageTracker.webflow.tsx b/percentage-tracker/src/PercentageTracker.webflow.tsx
new file mode 100644
index 0000000..1309ec4
--- /dev/null
+++ b/percentage-tracker/src/PercentageTracker.webflow.tsx
@@ -0,0 +1,30 @@
+import { declareComponent } from '@webflow/react'
+import { props } from '@webflow/data-types'
+import PercentageTracker from './PercentageTracker'
+import './style.css'
+
+export default declareComponent(PercentageTracker, {
+ name: 'Percentage Tracker',
+ description: 'An animated progress tracker with customizable label, color, and delay.',
+ group: 'Feedback',
+ props: {
+ value: props.Number({
+ name: 'Value',
+ min: 0,
+ max: 100,
+ defaultValue: 50,
+ }),
+ label: props.Text({
+ name: 'Label',
+ }),
+ color: props.Text({
+ name: 'Color',
+ defaultValue: '#16a34a',
+ }),
+ delay: props.Number({
+ name: 'Delay (ms)',
+ min: 0,
+ defaultValue: 0,
+ }),
+ },
+})
diff --git a/percentage-tracker/src/main.tsx b/percentage-tracker/src/main.tsx
new file mode 100644
index 0000000..954701e
--- /dev/null
+++ b/percentage-tracker/src/main.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import PercentageTracker from './PercentageTracker'
+import './style.css'
+
+ReactDOM.createRoot(document.getElementById('app')!).render(
+
+
+ ,
+)
diff --git a/percentage-tracker/src/style.css b/percentage-tracker/src/style.css
new file mode 100644
index 0000000..4c1b0c2
--- /dev/null
+++ b/percentage-tracker/src/style.css
@@ -0,0 +1,2 @@
+@import "tailwindcss";
+@plugin "daisyui";
diff --git a/percentage-tracker/tsconfig.json b/percentage-tracker/tsconfig.json
new file mode 100644
index 0000000..a4c834a
--- /dev/null
+++ b/percentage-tracker/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/percentage-tracker/vite.config.js b/percentage-tracker/vite.config.js
new file mode 100644
index 0000000..4ba4f56
--- /dev/null
+++ b/percentage-tracker/vite.config.js
@@ -0,0 +1,17 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+import tailwindcss from '@tailwindcss/vite'
+
+export default defineConfig({
+ plugins: [
+ react({
+ include: '**/*.{jsx,tsx}',
+ }),
+ tailwindcss(),
+ ],
+ esbuild: {
+ loader: 'tsx',
+ include: /src\/.*\.[tj]sx?$/,
+ exclude: [],
+ },
+})
diff --git a/percentage-tracker/webflow.json b/percentage-tracker/webflow.json
new file mode 100644
index 0000000..46cf23b
--- /dev/null
+++ b/percentage-tracker/webflow.json
@@ -0,0 +1,16 @@
+{
+ "library": {
+ "name": "Webflow Code Import Examples - Percentage Tracker",
+ "components": [
+ "**/*.webflow.@(js|jsx|mjs|ts|tsx)"
+ ],
+ "id": "webflow-code-import-examples---percentage-tracker"
+ },
+ "telemetry": {
+ "global": {
+ "allowTelemetry": true,
+ "lastPrompted": 1757368712207,
+ "version": "1.8.40"
+ }
+ }
+}