{"id":13950,"library":"ripple","title":"Ripple UI Framework","description":"Ripple is an elegant TypeScript UI framework, currently at version 0.3.19, designed to facilitate the creation of user interfaces with a strong emphasis on type safety and developer experience. It leverages TypeScript extensively, allowing developers to define components as functions returning JSX elements and manage state reactively. While a precise release cadence isn't explicitly detailed, the frequent patch updates across its comprehensive ecosystem (including a CLI, Vite, Rollup, ESLint, and Prettier plugins, plus a language server) indicate active and ongoing development. Ripple differentiates itself through its integrated, TypeScript-first approach, offering a cohesive environment for modern frontend development that covers everything from component authoring to tooling integration.","status":"active","version":"0.3.19","language":"javascript","source_language":"en","source_url":"https://github.com/Ripple-TS/ripple","tags":["javascript","ripple","UI","framework"],"install":[{"cmd":"npm install ripple","lang":"bash","label":"npm"},{"cmd":"yarn add ripple","lang":"bash","label":"yarn"},{"cmd":"pnpm add ripple","lang":"bash","label":"pnpm"}],"dependencies":[],"imports":[{"note":"Ripple is primarily consumed via ESM imports in modern TypeScript projects. CommonJS 'require' syntax is not officially supported for the core package and is explicitly broken for some associated tooling since v0.3.19.","wrong":"const createComponent = require('ripple').createComponent;","symbol":"createComponent","correct":"import { createComponent } from 'ripple';"},{"note":"The `html` tag function is essential for defining JSX elements within Ripple components and for accessing state management utilities like `html.state`.","wrong":"const html = require('ripple').html;","symbol":"html","correct":"import { html } from 'ripple';"},{"note":"State management within Ripple components is handled via `html.state`, which is accessed as a property of the imported `html` object. It's not a direct top-level import.","symbol":"html.state","correct":"import { html } from 'ripple'; const count = html.state(0);"}],"quickstart":{"code":"import { createComponent, html } from 'ripple';\n\nconst CounterComponent = createComponent(() => {\n  // Define reactive state using html.state\n  const count = html.state(0);\n\n  // Return JSX using the html tag function\n  return html`\n    <div>\n      <h1>Counter: ${count.value}</h1>\n      <button onclick=${() => count.value++}>\n        Increment\n      </button>\n      <button onclick=${() => count.value--}>\n        Decrement\n      </button>\n    </div>\n  `;\n});\n\n// Mount the component to an element in the DOM\n// Ensure a target element exists in your HTML, e.g., <div id=\"app\"></div>\nconst appRoot = document.getElementById('app');\nif (appRoot) {\n  CounterComponent.mount(appRoot);\n} else {\n  console.error('Target element #app not found in the DOM.');\n}\n","lang":"typescript","description":"Demonstrates defining a reactive counter component and mounting it to the DOM using Ripple's `createComponent`, `html`, and `html.state`."},"warnings":[{"fix":"Update your project's build system and import statements to use ESM syntax (e.g., `import ... from '...'`) for Ripple-TS tooling packages. Ensure your `tsconfig.json` and build configurations are set for ESM output where appropriate.","message":"Several associated Ripple-TS tooling packages, including `@ripple-ts/typescript-plugin` and `@ripple-ts/language-server`, converted their source files and distribution entrypoints from CommonJS to ESM (`type: module`). This change may break existing builds or setups that rely on CommonJS `require()` syntax for these specific packages, necessitating an update to ESM-compatible import statements and build configurations.","severity":"breaking","affected_versions":">=0.3.19"},{"fix":"Utilize TypeScript for your Ripple projects to fully leverage the framework's type safety and integrated development tools. Ensure you have `typescript` installed and configured correctly.","message":"Ripple is a TypeScript-first framework. While JavaScript usage is technically possible, many examples and best practices assume a TypeScript environment. Using plain JavaScript might lead to a loss of type-checking benefits and a less robust development experience.","severity":"gotcha","affected_versions":">=0.1.0"},{"fix":"Verify that the DOM element you intend to mount your Ripple component to exists before calling `.mount()`. This often involves waiting for `DOMContentLoaded` or ensuring your script runs after the target element is rendered in HTML.","message":"Ripple components are designed to be mounted to an existing DOM element. Attempting to mount a component to a non-existent or null target element will result in runtime errors or the component not appearing. Always ensure your target element is available when `component.mount()` is called.","severity":"gotcha","affected_versions":">=0.1.0"}],"env_vars":null,"search_vec":"'0.3.19':14 'across':64 'activ':82 'allow':37 'approach':95 'author':109 'cadenc':55 'cli':70 'cohes':98 'compon':41,108 'comprehens':66 'cover':105 'creation':19 'current':11 'defin':40 'design':15 'detail':59 'develop':31,38,85,103 'differenti':87 'ecosystem':67 'eleg':7 'element':46 'emphasi':26 'environ':99 'eslint':73 'everyth':106 'experi':32 'explicit':58 'extens':36 'facilit':17 'first':94 'framework':3,10,116 'frequent':61 'frontend':102 'function':43 'includ':68 'indic':81 'integr':91,112 'interfac':22 'isn':56 'javascript':113 'jsx':45 'languag':79 'leverag':34 'manag':48 'modern':101 'offer':96 'ongo':84 'patch':62 'plugin':76 'plus':77 'precis':53 'prettier':75 'reactiv':50 'releas':54 'return':44 'rippl':1,4,86,114 'rollup':72 'safeti':29 'server':80 'state':49 'strong':25 'tool':111 'type':28 'typescript':8,35,93 'typescript-first':92 'ui':2,9,115 'updat':63 'user':21 'version':13 'vite':71","created_at":"2026-04-20T01:57:09.077100+00:00","updated_at":"2026-04-20T01:57:09.077100+00:00","problems":[{"fix":"Run `npm install ripple` or `yarn add ripple`. Ensure your import statements are using ESM syntax (e.g., `import { createComponent } from 'ripple';`) and your environment supports ESM.","cause":"The 'ripple' package is not installed or the import path is incorrect. This can also happen if attempting to use CommonJS `require()` syntax in an ESM-only context.","error":"Error: Cannot find module 'ripple'"},{"fix":"Verify that `createComponent` is correctly imported and that your component function is structured properly, returning valid JSX. Ensure you're calling `.mount()` on the component instance (e.g., `MyComponent.mount(document.body)`), not directly on `createComponent`.","cause":"This usually indicates that `createComponent` did not return a valid component object, or you are trying to call `mount` on something that isn't a Ripple component instance. This can happen if the component definition is malformed or if `createComponent` was not correctly imported.","error":"TypeError: Cannot read properties of undefined (reading 'mount')"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":"0.0.1","cli_name":"ripple","cli_version":null,"type":"library","homepage":"https://ripple.solidn.xyz","github":"https://github.com/Ripple-TS/ripple","docs":null,"changelog":null,"pypi":null,"npm":"https://www.npmjs.com/package/ripple","openapi_spec":null,"status_page":null,"smithery":null,"categories":["web-framework","testing"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-17","next_check":"2026-07-18","install_tag":null}}