create-nuclo 0.1.1
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/README.md +60 -0
- package/package.json +35 -0
- package/src/create-nuclo.mjs +193 -0
- package/templates/basic/README.md +16 -0
- package/templates/basic/_gitignore +5 -0
- package/templates/basic/index.html +26 -0
- package/templates/basic/node_modules/.package-lock.json +348 -0
- package/templates/basic/node_modules/.vite/deps/_metadata.json +15 -0
- package/templates/basic/node_modules/.vite/deps/nuclo.js +1665 -0
- package/templates/basic/node_modules/.vite/deps/nuclo.js.map +1 -0
- package/templates/basic/node_modules/.vite/deps/package.json +3 -0
- package/templates/basic/node_modules/@oxc-project/types/LICENSE +22 -0
- package/templates/basic/node_modules/@oxc-project/types/README.md +3 -0
- package/templates/basic/node_modules/@oxc-project/types/package.json +26 -0
- package/templates/basic/node_modules/@oxc-project/types/types.d.ts +1912 -0
- package/templates/basic/node_modules/@rolldown/binding-darwin-arm64/README.md +3 -0
- package/templates/basic/node_modules/@rolldown/binding-darwin-arm64/package.json +37 -0
- package/templates/basic/node_modules/@rolldown/binding-darwin-arm64/rolldown-binding.darwin-arm64.node +0 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/LICENSE +21 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/README.md +145 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/dist/filter/index.d.mts +194 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/dist/filter/index.mjs +2 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/dist/filter-B_mD-HGz.mjs +323 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/dist/index.d.mts +2 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/dist/index.mjs +2 -0
- package/templates/basic/node_modules/@rolldown/pluginutils/package.json +40 -0
- package/templates/basic/node_modules/detect-libc/LICENSE +201 -0
- package/templates/basic/node_modules/detect-libc/README.md +163 -0
- package/templates/basic/node_modules/detect-libc/index.d.ts +14 -0
- package/templates/basic/node_modules/detect-libc/lib/detect-libc.js +313 -0
- package/templates/basic/node_modules/detect-libc/lib/elf.js +39 -0
- package/templates/basic/node_modules/detect-libc/lib/filesystem.js +51 -0
- package/templates/basic/node_modules/detect-libc/lib/process.js +24 -0
- package/templates/basic/node_modules/detect-libc/package.json +44 -0
- package/templates/basic/node_modules/fdir/LICENSE +7 -0
- package/templates/basic/node_modules/fdir/README.md +91 -0
- package/templates/basic/node_modules/fdir/dist/index.cjs +588 -0
- package/templates/basic/node_modules/fdir/dist/index.d.cts +155 -0
- package/templates/basic/node_modules/fdir/dist/index.d.mts +155 -0
- package/templates/basic/node_modules/fdir/dist/index.mjs +570 -0
- package/templates/basic/node_modules/fdir/package.json +103 -0
- package/templates/basic/node_modules/lightningcss/LICENSE +373 -0
- package/templates/basic/node_modules/lightningcss/README.md +105 -0
- package/templates/basic/node_modules/lightningcss/node/ast.d.ts +9892 -0
- package/templates/basic/node_modules/lightningcss/node/ast.js.flow +10539 -0
- package/templates/basic/node_modules/lightningcss/node/browserslistToTargets.js +48 -0
- package/templates/basic/node_modules/lightningcss/node/composeVisitors.js +450 -0
- package/templates/basic/node_modules/lightningcss/node/flags.js +28 -0
- package/templates/basic/node_modules/lightningcss/node/index.d.ts +494 -0
- package/templates/basic/node_modules/lightningcss/node/index.js +59 -0
- package/templates/basic/node_modules/lightningcss/node/index.js.flow +843 -0
- package/templates/basic/node_modules/lightningcss/node/index.mjs +4 -0
- package/templates/basic/node_modules/lightningcss/node/targets.d.ts +40 -0
- package/templates/basic/node_modules/lightningcss/node/targets.js.flow +39 -0
- package/templates/basic/node_modules/lightningcss/package.json +110 -0
- package/templates/basic/node_modules/lightningcss-darwin-arm64/LICENSE +373 -0
- package/templates/basic/node_modules/lightningcss-darwin-arm64/README.md +1 -0
- package/templates/basic/node_modules/lightningcss-darwin-arm64/lightningcss.darwin-arm64.node +0 -0
- package/templates/basic/node_modules/lightningcss-darwin-arm64/package.json +34 -0
- package/templates/basic/node_modules/nanoid/LICENSE +20 -0
- package/templates/basic/node_modules/nanoid/README.md +36 -0
- package/templates/basic/node_modules/nanoid/async/index.browser.cjs +42 -0
- package/templates/basic/node_modules/nanoid/async/index.browser.js +42 -0
- package/templates/basic/node_modules/nanoid/async/index.cjs +44 -0
- package/templates/basic/node_modules/nanoid/async/index.d.ts +56 -0
- package/templates/basic/node_modules/nanoid/async/index.js +44 -0
- package/templates/basic/node_modules/nanoid/async/index.native.js +35 -0
- package/templates/basic/node_modules/nanoid/async/package.json +12 -0
- package/templates/basic/node_modules/nanoid/bin/nanoid.cjs +55 -0
- package/templates/basic/node_modules/nanoid/index.browser.cjs +44 -0
- package/templates/basic/node_modules/nanoid/index.browser.js +44 -0
- package/templates/basic/node_modules/nanoid/index.cjs +57 -0
- package/templates/basic/node_modules/nanoid/index.d.cts +91 -0
- package/templates/basic/node_modules/nanoid/index.d.ts +91 -0
- package/templates/basic/node_modules/nanoid/index.js +62 -0
- package/templates/basic/node_modules/nanoid/nanoid.js +1 -0
- package/templates/basic/node_modules/nanoid/non-secure/index.cjs +24 -0
- package/templates/basic/node_modules/nanoid/non-secure/index.d.ts +33 -0
- package/templates/basic/node_modules/nanoid/non-secure/index.js +24 -0
- package/templates/basic/node_modules/nanoid/non-secure/package.json +6 -0
- package/templates/basic/node_modules/nanoid/package.json +89 -0
- package/templates/basic/node_modules/nanoid/url-alphabet/index.cjs +4 -0
- package/templates/basic/node_modules/nanoid/url-alphabet/index.js +4 -0
- package/templates/basic/node_modules/nanoid/url-alphabet/package.json +6 -0
- package/templates/basic/node_modules/nuclo/LICENSE.md +45 -0
- package/templates/basic/node_modules/nuclo/README.md +727 -0
- package/templates/basic/node_modules/nuclo/dist/bootstrap.d.ts +5 -0
- package/templates/basic/node_modules/nuclo/dist/bootstrap.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/element/attributes.d.ts +3 -0
- package/templates/basic/node_modules/nuclo/dist/element/attributes.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/element/class-name.d.ts +6 -0
- package/templates/basic/node_modules/nuclo/dist/element/class-name.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/element/events.d.ts +35 -0
- package/templates/basic/node_modules/nuclo/dist/element/events.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/element/factory.d.ts +32 -0
- package/templates/basic/node_modules/nuclo/dist/element/factory.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/element/inline-style.d.ts +9 -0
- package/templates/basic/node_modules/nuclo/dist/element/inline-style.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/element/modifiers.d.ts +11 -0
- package/templates/basic/node_modules/nuclo/dist/element/modifiers.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/element/tags.d.ts +5 -0
- package/templates/basic/node_modules/nuclo/dist/element/tags.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/hydration.d.ts +73 -0
- package/templates/basic/node_modules/nuclo/dist/hydration.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/index.d.ts +17 -0
- package/templates/basic/node_modules/nuclo/dist/index.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/list/index.d.ts +7 -0
- package/templates/basic/node_modules/nuclo/dist/list/index.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/list/runtime.d.ts +6 -0
- package/templates/basic/node_modules/nuclo/dist/list/runtime.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/list/types.d.ts +18 -0
- package/templates/basic/node_modules/nuclo/dist/list/types.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/nuclo.cjs +2 -0
- package/templates/basic/node_modules/nuclo/dist/nuclo.cjs.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/nuclo.mjs +2 -0
- package/templates/basic/node_modules/nuclo/dist/nuclo.mjs.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/nuclo.umd.js +2 -0
- package/templates/basic/node_modules/nuclo/dist/nuclo.umd.js.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Document.d.ts +19 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Document.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Element.d.ts +48 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Element.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Event.d.ts +43 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Event.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Node.d.ts +13 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Node.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Text.d.ts +11 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/Text.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/index.d.ts +24 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/index.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/nuclo.polyfill.cjs +2 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/nuclo.polyfill.cjs.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/nuclo.polyfill.mjs +2 -0
- package/templates/basic/node_modules/nuclo/dist/polyfill/nuclo.polyfill.mjs.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/render.d.ts +33 -0
- package/templates/basic/node_modules/nuclo/dist/render.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/shared/conditions.d.ts +4 -0
- package/templates/basic/node_modules/nuclo/dist/shared/conditions.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/shared/dom.d.ts +69 -0
- package/templates/basic/node_modules/nuclo/dist/shared/dom.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/shared/environment.d.ts +5 -0
- package/templates/basic/node_modules/nuclo/dist/shared/environment.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/shared/errors.d.ts +2 -0
- package/templates/basic/node_modules/nuclo/dist/shared/errors.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/shared/renderables.d.ts +4 -0
- package/templates/basic/node_modules/nuclo/dist/shared/renderables.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/shared/strings.d.ts +19 -0
- package/templates/basic/node_modules/nuclo/dist/shared/strings.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/shared/type-guards.d.ts +16 -0
- package/templates/basic/node_modules/nuclo/dist/shared/type-guards.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/index.d.ts +19 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/index.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/nuclo.ssr.cjs +2 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/nuclo.ssr.cjs.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/nuclo.ssr.mjs +2 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/nuclo.ssr.mjs.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/render-to-string.d.ts +41 -0
- package/templates/basic/node_modules/nuclo/dist/ssr/render-to-string.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/style/css.d.ts +19 -0
- package/templates/basic/node_modules/nuclo/dist/style/css.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/style/engine.d.ts +34 -0
- package/templates/basic/node_modules/nuclo/dist/style/engine.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/style/index.d.ts +3 -0
- package/templates/basic/node_modules/nuclo/dist/style/index.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/update/conditional.d.ts +3 -0
- package/templates/basic/node_modules/nuclo/dist/update/conditional.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/update/reactive-attributes.d.ts +45 -0
- package/templates/basic/node_modules/nuclo/dist/update/reactive-attributes.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/update/reactive-text.d.ts +38 -0
- package/templates/basic/node_modules/nuclo/dist/update/reactive-text.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/update/registry.d.ts +97 -0
- package/templates/basic/node_modules/nuclo/dist/update/registry.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/update/scope.d.ts +7 -0
- package/templates/basic/node_modules/nuclo/dist/update/scope.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/update/update.d.ts +4 -0
- package/templates/basic/node_modules/nuclo/dist/update/update.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/when/builder.d.ts +16 -0
- package/templates/basic/node_modules/nuclo/dist/when/builder.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/when/index.d.ts +44 -0
- package/templates/basic/node_modules/nuclo/dist/when/index.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/dist/when/runtime.d.ts +59 -0
- package/templates/basic/node_modules/nuclo/dist/when/runtime.d.ts.map +1 -0
- package/templates/basic/node_modules/nuclo/package.json +88 -0
- package/templates/basic/node_modules/nuclo/types/core/base.d.ts +113 -0
- package/templates/basic/node_modules/nuclo/types/features/list.d.ts +38 -0
- package/templates/basic/node_modules/nuclo/types/features/on.d.ts +59 -0
- package/templates/basic/node_modules/nuclo/types/features/render.d.ts +49 -0
- package/templates/basic/node_modules/nuclo/types/features/scope.d.ts +6 -0
- package/templates/basic/node_modules/nuclo/types/features/style.d.ts +77 -0
- package/templates/basic/node_modules/nuclo/types/features/update.d.ts +6 -0
- package/templates/basic/node_modules/nuclo/types/features/when.d.ts +18 -0
- package/templates/basic/node_modules/nuclo/types/html/tags.d.ts +119 -0
- package/templates/basic/node_modules/nuclo/types/index.d.ts +137 -0
- package/templates/basic/node_modules/nuclo/types/polyfill.d.ts +131 -0
- package/templates/basic/node_modules/nuclo/types/ssr.d.ts +45 -0
- package/templates/basic/node_modules/nuclo/types/style.d.ts +404 -0
- package/templates/basic/node_modules/nuclo/types/svg/base.d.ts +118 -0
- package/templates/basic/node_modules/nuclo/types/svg/tags.d.ts +68 -0
- package/templates/basic/node_modules/picocolors/LICENSE +15 -0
- package/templates/basic/node_modules/picocolors/README.md +21 -0
- package/templates/basic/node_modules/picocolors/package.json +25 -0
- package/templates/basic/node_modules/picocolors/picocolors.browser.js +4 -0
- package/templates/basic/node_modules/picocolors/picocolors.d.ts +5 -0
- package/templates/basic/node_modules/picocolors/picocolors.js +75 -0
- package/templates/basic/node_modules/picocolors/types.d.ts +51 -0
- package/templates/basic/node_modules/picomatch/LICENSE +21 -0
- package/templates/basic/node_modules/picomatch/README.md +743 -0
- package/templates/basic/node_modules/picomatch/index.js +17 -0
- package/templates/basic/node_modules/picomatch/lib/constants.js +184 -0
- package/templates/basic/node_modules/picomatch/lib/parse.js +1416 -0
- package/templates/basic/node_modules/picomatch/lib/picomatch.js +361 -0
- package/templates/basic/node_modules/picomatch/lib/scan.js +391 -0
- package/templates/basic/node_modules/picomatch/lib/utils.js +72 -0
- package/templates/basic/node_modules/picomatch/package.json +83 -0
- package/templates/basic/node_modules/picomatch/posix.js +3 -0
- package/templates/basic/node_modules/postcss/LICENSE +20 -0
- package/templates/basic/node_modules/postcss/README.md +25 -0
- package/templates/basic/node_modules/postcss/lib/at-rule.d.ts +139 -0
- package/templates/basic/node_modules/postcss/lib/at-rule.js +25 -0
- package/templates/basic/node_modules/postcss/lib/comment.d.ts +67 -0
- package/templates/basic/node_modules/postcss/lib/comment.js +13 -0
- package/templates/basic/node_modules/postcss/lib/container.d.ts +478 -0
- package/templates/basic/node_modules/postcss/lib/container.js +447 -0
- package/templates/basic/node_modules/postcss/lib/css-syntax-error.d.ts +247 -0
- package/templates/basic/node_modules/postcss/lib/css-syntax-error.js +133 -0
- package/templates/basic/node_modules/postcss/lib/declaration.d.ts +150 -0
- package/templates/basic/node_modules/postcss/lib/declaration.js +24 -0
- package/templates/basic/node_modules/postcss/lib/document.d.ts +68 -0
- package/templates/basic/node_modules/postcss/lib/document.js +33 -0
- package/templates/basic/node_modules/postcss/lib/fromJSON.d.ts +9 -0
- package/templates/basic/node_modules/postcss/lib/fromJSON.js +68 -0
- package/templates/basic/node_modules/postcss/lib/input.d.ts +226 -0
- package/templates/basic/node_modules/postcss/lib/input.js +276 -0
- package/templates/basic/node_modules/postcss/lib/lazy-result.d.ts +189 -0
- package/templates/basic/node_modules/postcss/lib/lazy-result.js +563 -0
- package/templates/basic/node_modules/postcss/lib/list.d.ts +60 -0
- package/templates/basic/node_modules/postcss/lib/list.js +58 -0
- package/templates/basic/node_modules/postcss/lib/map-generator.js +376 -0
- package/templates/basic/node_modules/postcss/lib/no-work-result.d.ts +45 -0
- package/templates/basic/node_modules/postcss/lib/no-work-result.js +137 -0
- package/templates/basic/node_modules/postcss/lib/node.d.ts +555 -0
- package/templates/basic/node_modules/postcss/lib/node.js +456 -0
- package/templates/basic/node_modules/postcss/lib/parse.d.ts +9 -0
- package/templates/basic/node_modules/postcss/lib/parse.js +42 -0
- package/templates/basic/node_modules/postcss/lib/parser.js +618 -0
- package/templates/basic/node_modules/postcss/lib/postcss.d.mts +66 -0
- package/templates/basic/node_modules/postcss/lib/postcss.d.ts +461 -0
- package/templates/basic/node_modules/postcss/lib/postcss.js +101 -0
- package/templates/basic/node_modules/postcss/lib/postcss.mjs +30 -0
- package/templates/basic/node_modules/postcss/lib/previous-map.d.ts +80 -0
- package/templates/basic/node_modules/postcss/lib/previous-map.js +161 -0
- package/templates/basic/node_modules/postcss/lib/processor.d.ts +114 -0
- package/templates/basic/node_modules/postcss/lib/processor.js +67 -0
- package/templates/basic/node_modules/postcss/lib/result.d.ts +204 -0
- package/templates/basic/node_modules/postcss/lib/result.js +42 -0
- package/templates/basic/node_modules/postcss/lib/root.d.ts +86 -0
- package/templates/basic/node_modules/postcss/lib/root.js +61 -0
- package/templates/basic/node_modules/postcss/lib/rule.d.ts +126 -0
- package/templates/basic/node_modules/postcss/lib/rule.js +27 -0
- package/templates/basic/node_modules/postcss/lib/stringifier.d.ts +45 -0
- package/templates/basic/node_modules/postcss/lib/stringifier.js +374 -0
- package/templates/basic/node_modules/postcss/lib/stringify.d.ts +9 -0
- package/templates/basic/node_modules/postcss/lib/stringify.js +11 -0
- package/templates/basic/node_modules/postcss/lib/symbols.js +5 -0
- package/templates/basic/node_modules/postcss/lib/terminal-highlight.js +70 -0
- package/templates/basic/node_modules/postcss/lib/tokenize.js +270 -0
- package/templates/basic/node_modules/postcss/lib/warn-once.js +13 -0
- package/templates/basic/node_modules/postcss/lib/warning.d.ts +146 -0
- package/templates/basic/node_modules/postcss/lib/warning.js +37 -0
- package/templates/basic/node_modules/postcss/package.json +88 -0
- package/templates/basic/node_modules/rolldown/LICENSE +25 -0
- package/templates/basic/node_modules/rolldown/README.md +11 -0
- package/templates/basic/node_modules/rolldown/bin/cli.mjs +2 -0
- package/templates/basic/node_modules/rolldown/dist/cli.d.mts +1 -0
- package/templates/basic/node_modules/rolldown/dist/cli.mjs +1202 -0
- package/templates/basic/node_modules/rolldown/dist/config.d.mts +14 -0
- package/templates/basic/node_modules/rolldown/dist/config.mjs +4 -0
- package/templates/basic/node_modules/rolldown/dist/experimental-index.d.mts +280 -0
- package/templates/basic/node_modules/rolldown/dist/experimental-index.mjs +331 -0
- package/templates/basic/node_modules/rolldown/dist/experimental-runtime-types.d.ts +107 -0
- package/templates/basic/node_modules/rolldown/dist/filter-index.d.mts +195 -0
- package/templates/basic/node_modules/rolldown/dist/filter-index.mjs +380 -0
- package/templates/basic/node_modules/rolldown/dist/get-log-filter.d.mts +3 -0
- package/templates/basic/node_modules/rolldown/dist/get-log-filter.mjs +68 -0
- package/templates/basic/node_modules/rolldown/dist/index.d.mts +4 -0
- package/templates/basic/node_modules/rolldown/dist/index.mjs +50 -0
- package/templates/basic/node_modules/rolldown/dist/parallel-plugin-worker.d.mts +1 -0
- package/templates/basic/node_modules/rolldown/dist/parallel-plugin-worker.mjs +29 -0
- package/templates/basic/node_modules/rolldown/dist/parallel-plugin.d.mts +13 -0
- package/templates/basic/node_modules/rolldown/dist/parallel-plugin.mjs +6 -0
- package/templates/basic/node_modules/rolldown/dist/parse-ast-index.d.mts +32 -0
- package/templates/basic/node_modules/rolldown/dist/parse-ast-index.mjs +60 -0
- package/templates/basic/node_modules/rolldown/dist/plugins-index.d.mts +33 -0
- package/templates/basic/node_modules/rolldown/dist/plugins-index.mjs +40 -0
- package/templates/basic/node_modules/rolldown/dist/shared/binding-B1q9aYT-.d.mts +1947 -0
- package/templates/basic/node_modules/rolldown/dist/shared/binding-BmkJW3Wy.mjs +588 -0
- package/templates/basic/node_modules/rolldown/dist/shared/bindingify-input-options-BsDhfYrS.mjs +2240 -0
- package/templates/basic/node_modules/rolldown/dist/shared/constructors-2i1T9YcF.d.mts +36 -0
- package/templates/basic/node_modules/rolldown/dist/shared/constructors-CE6zZSUt.mjs +65 -0
- package/templates/basic/node_modules/rolldown/dist/shared/define-config-BBz954-q.d.mts +3901 -0
- package/templates/basic/node_modules/rolldown/dist/shared/define-config-Demdg3_4.mjs +6 -0
- package/templates/basic/node_modules/rolldown/dist/shared/error-BlQ0-ek7.mjs +85 -0
- package/templates/basic/node_modules/rolldown/dist/shared/get-log-filter-BpNVNJ5-.d.mts +35 -0
- package/templates/basic/node_modules/rolldown/dist/shared/load-config-FRmAU9xl.mjs +120 -0
- package/templates/basic/node_modules/rolldown/dist/shared/logging-BSNejiLS.d.mts +50 -0
- package/templates/basic/node_modules/rolldown/dist/shared/logs-aMKUxRpj.mjs +180 -0
- package/templates/basic/node_modules/rolldown/dist/shared/misc-CoQm4NHO.mjs +21 -0
- package/templates/basic/node_modules/rolldown/dist/shared/normalize-string-or-regex-BYkbbGqQ.mjs +68 -0
- package/templates/basic/node_modules/rolldown/dist/shared/parse-DVMnkavl.mjs +74 -0
- package/templates/basic/node_modules/rolldown/dist/shared/prompt-B1Yc1NPt.mjs +847 -0
- package/templates/basic/node_modules/rolldown/dist/shared/resolve-tsconfig-CdIAR1Eb.mjs +124 -0
- package/templates/basic/node_modules/rolldown/dist/shared/rolldown-build-aV0QeeTW.mjs +3264 -0
- package/templates/basic/node_modules/rolldown/dist/shared/rolldown-tbHvKzVl.mjs +40 -0
- package/templates/basic/node_modules/rolldown/dist/shared/transform-CEmFsvJW.d.mts +149 -0
- package/templates/basic/node_modules/rolldown/dist/shared/watch-DIhJ-T1s.mjs +374 -0
- package/templates/basic/node_modules/rolldown/dist/utils-index.d.mts +376 -0
- package/templates/basic/node_modules/rolldown/dist/utils-index.mjs +2414 -0
- package/templates/basic/node_modules/rolldown/package.json +153 -0
- package/templates/basic/node_modules/source-map-js/LICENSE +28 -0
- package/templates/basic/node_modules/source-map-js/README.md +765 -0
- package/templates/basic/node_modules/source-map-js/lib/array-set.js +121 -0
- package/templates/basic/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/templates/basic/node_modules/source-map-js/lib/base64.js +67 -0
- package/templates/basic/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/templates/basic/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/templates/basic/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/templates/basic/node_modules/source-map-js/lib/source-map-consumer.d.ts +1 -0
- package/templates/basic/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/templates/basic/node_modules/source-map-js/lib/source-map-generator.d.ts +1 -0
- package/templates/basic/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/templates/basic/node_modules/source-map-js/lib/source-node.d.ts +1 -0
- package/templates/basic/node_modules/source-map-js/lib/source-node.js +413 -0
- package/templates/basic/node_modules/source-map-js/lib/util.js +594 -0
- package/templates/basic/node_modules/source-map-js/package.json +71 -0
- package/templates/basic/node_modules/source-map-js/source-map.d.ts +104 -0
- package/templates/basic/node_modules/source-map-js/source-map.js +8 -0
- package/templates/basic/node_modules/tinyglobby/LICENSE +21 -0
- package/templates/basic/node_modules/tinyglobby/README.md +25 -0
- package/templates/basic/node_modules/tinyglobby/dist/index.cjs +335 -0
- package/templates/basic/node_modules/tinyglobby/dist/index.d.cts +148 -0
- package/templates/basic/node_modules/tinyglobby/dist/index.d.mts +148 -0
- package/templates/basic/node_modules/tinyglobby/dist/index.mjs +307 -0
- package/templates/basic/node_modules/tinyglobby/package.json +70 -0
- package/templates/basic/node_modules/typescript/LICENSE.txt +55 -0
- package/templates/basic/node_modules/typescript/README.md +50 -0
- package/templates/basic/node_modules/typescript/SECURITY.md +39 -0
- package/templates/basic/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
- package/templates/basic/node_modules/typescript/bin/tsc +2 -0
- package/templates/basic/node_modules/typescript/bin/tsserver +2 -0
- package/templates/basic/node_modules/typescript/lib/_tsc.js +134465 -0
- package/templates/basic/node_modules/typescript/lib/_tsserver.js +659 -0
- package/templates/basic/node_modules/typescript/lib/_typingsInstaller.js +222 -0
- package/templates/basic/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2125 -0
- package/templates/basic/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2125 -0
- package/templates/basic/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/lib.d.ts +20 -0
- package/templates/basic/node_modules/typescript/lib/lib.decorators.d.ts +382 -0
- package/templates/basic/node_modules/typescript/lib/lib.decorators.legacy.d.ts +20 -0
- package/templates/basic/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +18 -0
- package/templates/basic/node_modules/typescript/lib/lib.dom.d.ts +45125 -0
- package/templates/basic/node_modules/typescript/lib/lib.dom.iterable.d.ts +18 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.collection.d.ts +150 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.core.d.ts +595 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.d.ts +26 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.generator.d.ts +75 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.iterable.d.ts +603 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.promise.d.ts +79 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.proxy.d.ts +126 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.reflect.d.ts +142 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.symbol.d.ts +44 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +324 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2016.array.include.d.ts +114 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2016.d.ts +19 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2016.full.d.ts +21 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2016.intl.d.ts +29 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +19 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.d.ts +24 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.date.d.ts +29 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.full.d.ts +21 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.intl.d.ts +42 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.object.d.ts +47 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +133 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.string.d.ts +43 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +51 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +75 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +51 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2018.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2018.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2018.intl.d.ts +81 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2018.promise.d.ts +28 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2018.regexp.d.ts +35 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2019.array.d.ts +77 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2019.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2019.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2019.intl.d.ts +21 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2019.object.d.ts +31 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2019.string.d.ts +35 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2019.symbol.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.bigint.d.ts +763 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.d.ts +25 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.date.d.ts +40 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.intl.d.ts +472 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.number.d.ts +26 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.promise.d.ts +45 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +97 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.string.d.ts +42 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +39 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2021.d.ts +21 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2021.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2021.intl.d.ts +164 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2021.promise.d.ts +46 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2021.string.d.ts +31 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2021.weakref.d.ts +76 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.array.d.ts +119 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.d.ts +23 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.error.d.ts +73 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.intl.d.ts +143 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.object.d.ts +24 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.regexp.d.ts +37 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2022.string.d.ts +23 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2023.array.d.ts +922 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2023.collection.d.ts +19 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2023.d.ts +20 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2023.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2023.intl.d.ts +62 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +63 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.collection.d.ts +27 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.d.ts +24 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.object.d.ts +27 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.promise.d.ts +33 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.regexp.d.ts +23 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +66 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2024.string.d.ts +27 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.collection.d.ts +94 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.d.ts +23 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.float16.d.ts +443 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.intl.d.ts +200 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.iterator.d.ts +146 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.promise.d.ts +32 -0
- package/templates/basic/node_modules/typescript/lib/lib.es2025.regexp.d.ts +30 -0
- package/templates/basic/node_modules/typescript/lib/lib.es5.d.ts +4599 -0
- package/templates/basic/node_modules/typescript/lib/lib.es6.d.ts +21 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.array.d.ts +33 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.collection.d.ts +47 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.d.ts +27 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.date.d.ts +21 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.decorators.d.ts +26 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.disposable.d.ts +191 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.error.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.full.d.ts +22 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.intl.d.ts +107 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +23 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.temporal.d.ts +485 -0
- package/templates/basic/node_modules/typescript/lib/lib.esnext.typedarrays.d.ts +90 -0
- package/templates/basic/node_modules/typescript/lib/lib.scripthost.d.ts +320 -0
- package/templates/basic/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +18 -0
- package/templates/basic/node_modules/typescript/lib/lib.webworker.d.ts +15606 -0
- package/templates/basic/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +21 -0
- package/templates/basic/node_modules/typescript/lib/lib.webworker.iterable.d.ts +18 -0
- package/templates/basic/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2125 -0
- package/templates/basic/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/tsc.js +8 -0
- package/templates/basic/node_modules/typescript/lib/tsserver.js +8 -0
- package/templates/basic/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
- package/templates/basic/node_modules/typescript/lib/tsserverlibrary.js +21 -0
- package/templates/basic/node_modules/typescript/lib/typesMap.json +497 -0
- package/templates/basic/node_modules/typescript/lib/typescript.d.ts +11448 -0
- package/templates/basic/node_modules/typescript/lib/typescript.js +201039 -0
- package/templates/basic/node_modules/typescript/lib/typingsInstaller.js +8 -0
- package/templates/basic/node_modules/typescript/lib/watchGuard.js +53 -0
- package/templates/basic/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2129 -0
- package/templates/basic/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2125 -0
- package/templates/basic/node_modules/typescript/package.json +118 -0
- package/templates/basic/node_modules/vite/LICENSE.md +2287 -0
- package/templates/basic/node_modules/vite/README.md +20 -0
- package/templates/basic/node_modules/vite/bin/openChrome.js +68 -0
- package/templates/basic/node_modules/vite/bin/vite.js +79 -0
- package/templates/basic/node_modules/vite/client.d.ts +285 -0
- package/templates/basic/node_modules/vite/dist/client/client.mjs +1269 -0
- package/templates/basic/node_modules/vite/dist/client/env.mjs +18 -0
- package/templates/basic/node_modules/vite/dist/node/chunks/build.js +5371 -0
- package/templates/basic/node_modules/vite/dist/node/chunks/dist.js +6784 -0
- package/templates/basic/node_modules/vite/dist/node/chunks/lib.js +371 -0
- package/templates/basic/node_modules/vite/dist/node/chunks/logger.js +364 -0
- package/templates/basic/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts +96 -0
- package/templates/basic/node_modules/vite/dist/node/chunks/node.js +35836 -0
- package/templates/basic/node_modules/vite/dist/node/chunks/postcss-import.js +467 -0
- package/templates/basic/node_modules/vite/dist/node/cli.js +836 -0
- package/templates/basic/node_modules/vite/dist/node/index.d.ts +4011 -0
- package/templates/basic/node_modules/vite/dist/node/index.js +3 -0
- package/templates/basic/node_modules/vite/dist/node/internal.d.ts +2 -0
- package/templates/basic/node_modules/vite/dist/node/internal.js +2 -0
- package/templates/basic/node_modules/vite/dist/node/module-runner.d.ts +314 -0
- package/templates/basic/node_modules/vite/dist/node/module-runner.js +1274 -0
- package/templates/basic/node_modules/vite/misc/false.js +1 -0
- package/templates/basic/node_modules/vite/misc/true.js +1 -0
- package/templates/basic/node_modules/vite/package.json +194 -0
- package/templates/basic/node_modules/vite/types/customEvent.d.ts +79 -0
- package/templates/basic/node_modules/vite/types/hmrPayload.d.ts +80 -0
- package/templates/basic/node_modules/vite/types/hot.d.ts +39 -0
- package/templates/basic/node_modules/vite/types/import-meta.d.ts +5 -0
- package/templates/basic/node_modules/vite/types/importGlob.d.ts +131 -0
- package/templates/basic/node_modules/vite/types/importMeta.d.ts +30 -0
- package/templates/basic/node_modules/vite/types/internal/cssPreprocessorOptions.d.ts +44 -0
- package/templates/basic/node_modules/vite/types/internal/esbuildOptions.d.ts +28 -0
- package/templates/basic/node_modules/vite/types/internal/lightningcssOptions.d.ts +18 -0
- package/templates/basic/node_modules/vite/types/internal/rollupTypeCompat.d.ts +24 -0
- package/templates/basic/node_modules/vite/types/internal/terserOptions.d.ts +11 -0
- package/templates/basic/node_modules/vite/types/metadata.d.ts +47 -0
- package/templates/basic/package-lock.json +926 -0
- package/templates/basic/package.json +18 -0
- package/templates/basic/public/apple-touch-icon.png +0 -0
- package/templates/basic/public/favicon-16x16.png +0 -0
- package/templates/basic/public/favicon-32x32.png +0 -0
- package/templates/basic/public/favicon.ico +0 -0
- package/templates/basic/public/icon-192.png +0 -0
- package/templates/basic/public/icon-512.png +0 -0
- package/templates/basic/public/nuclo-logo.svg +24 -0
- package/templates/basic/public/site.webmanifest +23 -0
- package/templates/basic/src/app.ts +37 -0
- package/templates/basic/src/main.ts +5 -0
- package/templates/basic/src/styles.ts +85 -0
- package/templates/basic/tsconfig.json +23 -0
- package/templates/basic/vite.config.ts +3 -0
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
# nuclo
|
|
2
|
+
|
|
3
|
+
**A lightweight, imperative DOM framework with explicit updates.**
|
|
4
|
+
|
|
5
|
+
Build interactive UIs with plain functions, mutable JavaScript objects, and explicit `update()` calls. Nuclo is imperative: nothing re-renders until you call `update()`. No virtual DOM, no proxies, and no hidden state tracking.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import 'nuclo';
|
|
9
|
+
|
|
10
|
+
let count = 0;
|
|
11
|
+
|
|
12
|
+
const counter = div(
|
|
13
|
+
h1(() => `Count: ${count}`),
|
|
14
|
+
button('Increment', on('click', () => {
|
|
15
|
+
count++;
|
|
16
|
+
update();
|
|
17
|
+
}))
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
render(counter, document.body);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Why nuclo?
|
|
24
|
+
|
|
25
|
+
- **Explicit and Predictable** – You control when updates happen with a simple `update()` call
|
|
26
|
+
- **Direct DOM Manipulation** – Work directly with the DOM, no virtual layer in between
|
|
27
|
+
- **Tiny Footprint** – ~10 KB gzipped, zero dependencies
|
|
28
|
+
- **Global Tag Builders** – Natural API with global functions for all HTML and SVG elements
|
|
29
|
+
- **TypeScript-First** – Full type definitions for all 175 HTML and SVG builders
|
|
30
|
+
- **Targeted DOM Updates** – `update()` re-runs dynamic bindings and only touches DOM where values changed
|
|
31
|
+
- **Atomic Styling** – Built-in `css()` / `createCss()` with TypeScript autocomplete, theming, and SSR CSS collection
|
|
32
|
+
- **Server-Side Rendering** – `renderToString()` + `hydrate()` with a lightweight DOM polyfill
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Installation
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install nuclo
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Usage
|
|
43
|
+
|
|
44
|
+
Simply import once to register all global functions:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import 'nuclo';
|
|
48
|
+
|
|
49
|
+
// Now use div(), update(), on(), list(), when(), render(), etc. globally
|
|
50
|
+
let count = 0;
|
|
51
|
+
const app = div(
|
|
52
|
+
h1(() => `Count: ${count}`),
|
|
53
|
+
button('Click', on('click', () => { count++; update(); }))
|
|
54
|
+
);
|
|
55
|
+
render(app, document.body);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### TypeScript Setup
|
|
59
|
+
|
|
60
|
+
Add to your `tsconfig.json`:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"compilerOptions": {
|
|
65
|
+
"types": ["nuclo/types"]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Or in your `vite-env.d.ts`:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
/// <reference types="nuclo/types" />
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Quick Examples
|
|
79
|
+
|
|
80
|
+
### Counter
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
import 'nuclo';
|
|
84
|
+
|
|
85
|
+
let count = 0;
|
|
86
|
+
|
|
87
|
+
const app = div(
|
|
88
|
+
h1(() => `Count: ${count}`),
|
|
89
|
+
button('Increment', on('click', () => { count++; update(); })),
|
|
90
|
+
button('Reset', on('click', () => { count = 0; update(); }))
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
render(app, document.body);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Todo List
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
import 'nuclo';
|
|
100
|
+
|
|
101
|
+
type Todo = { id: number; text: string; done: boolean };
|
|
102
|
+
|
|
103
|
+
let todos: Todo[] = [];
|
|
104
|
+
let nextId = 1;
|
|
105
|
+
let inputValue = '';
|
|
106
|
+
|
|
107
|
+
function addTodo() {
|
|
108
|
+
if (!inputValue.trim()) return;
|
|
109
|
+
todos.push({ id: nextId++, text: inputValue, done: false });
|
|
110
|
+
inputValue = '';
|
|
111
|
+
update();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const app = div(
|
|
115
|
+
{ className: 'todo-app' },
|
|
116
|
+
|
|
117
|
+
// Input
|
|
118
|
+
div(
|
|
119
|
+
input({ value: () => inputValue },
|
|
120
|
+
on('input', e => { inputValue = e.target.value; update(); }),
|
|
121
|
+
on('keydown', e => e.key === 'Enter' && addTodo())
|
|
122
|
+
),
|
|
123
|
+
button('Add', on('click', addTodo))
|
|
124
|
+
),
|
|
125
|
+
|
|
126
|
+
// List
|
|
127
|
+
when(() => todos.length > 0,
|
|
128
|
+
list(() => todos, (todo) =>
|
|
129
|
+
div(
|
|
130
|
+
{ className: () => todo.done ? 'done' : '' },
|
|
131
|
+
input({ type: 'checkbox', checked: () => todo.done },
|
|
132
|
+
on('change', () => { todo.done = !todo.done; update(); })
|
|
133
|
+
),
|
|
134
|
+
span(() => todo.text),
|
|
135
|
+
button('×', on('click', () => {
|
|
136
|
+
todos = todos.filter(t => t.id !== todo.id);
|
|
137
|
+
update();
|
|
138
|
+
}))
|
|
139
|
+
)
|
|
140
|
+
)
|
|
141
|
+
).else(
|
|
142
|
+
p('No todos yet!')
|
|
143
|
+
)
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
render(app, document.body);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Real-time Search Filter
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import 'nuclo';
|
|
153
|
+
|
|
154
|
+
const users = [
|
|
155
|
+
{ id: 1, name: 'Alice Johnson', email: 'alice@example.com' },
|
|
156
|
+
{ id: 2, name: 'Bob Smith', email: 'bob@example.com' },
|
|
157
|
+
{ id: 3, name: 'Charlie Brown', email: 'charlie@example.com' }
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
let searchQuery = '';
|
|
161
|
+
|
|
162
|
+
function filteredUsers() {
|
|
163
|
+
const q = searchQuery.toLowerCase();
|
|
164
|
+
return users.filter(u =>
|
|
165
|
+
u.name.toLowerCase().includes(q) ||
|
|
166
|
+
u.email.toLowerCase().includes(q)
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const app = div(
|
|
171
|
+
h1('User Directory'),
|
|
172
|
+
|
|
173
|
+
input(
|
|
174
|
+
{
|
|
175
|
+
type: 'search',
|
|
176
|
+
placeholder: 'Search users...',
|
|
177
|
+
value: () => searchQuery
|
|
178
|
+
},
|
|
179
|
+
on('input', e => {
|
|
180
|
+
searchQuery = e.target.value;
|
|
181
|
+
update();
|
|
182
|
+
})
|
|
183
|
+
),
|
|
184
|
+
|
|
185
|
+
when(() => filteredUsers().length > 0,
|
|
186
|
+
list(() => filteredUsers(), user =>
|
|
187
|
+
div(
|
|
188
|
+
{ className: 'user-card' },
|
|
189
|
+
h3(user.name),
|
|
190
|
+
p(user.email)
|
|
191
|
+
)
|
|
192
|
+
)
|
|
193
|
+
).else(
|
|
194
|
+
p(() => `No users found for "${searchQuery}"`)
|
|
195
|
+
)
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
render(app, document.body);
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Loading States & Async
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
import 'nuclo';
|
|
205
|
+
|
|
206
|
+
type Product = { id: number; title: string; category: string };
|
|
207
|
+
type State = { status: 'idle' | 'loading' | 'error'; products: Product[]; error?: string };
|
|
208
|
+
|
|
209
|
+
const state: State = { status: 'idle', products: [] };
|
|
210
|
+
let searchQuery = 'phone';
|
|
211
|
+
|
|
212
|
+
async function fetchProducts() {
|
|
213
|
+
if (!searchQuery.trim()) return;
|
|
214
|
+
|
|
215
|
+
state.status = 'loading';
|
|
216
|
+
update();
|
|
217
|
+
|
|
218
|
+
try {
|
|
219
|
+
const response = await fetch(`https://dummyjson.com/products/search?q=${searchQuery}`);
|
|
220
|
+
const data = await response.json();
|
|
221
|
+
state.products = data.products;
|
|
222
|
+
state.status = 'idle';
|
|
223
|
+
} catch (err) {
|
|
224
|
+
state.status = 'error';
|
|
225
|
+
state.error = err.message;
|
|
226
|
+
}
|
|
227
|
+
update();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const app = div(
|
|
231
|
+
div(
|
|
232
|
+
input(
|
|
233
|
+
{
|
|
234
|
+
type: 'search',
|
|
235
|
+
placeholder: 'Search products...',
|
|
236
|
+
value: () => searchQuery
|
|
237
|
+
},
|
|
238
|
+
on('input', e => {
|
|
239
|
+
searchQuery = e.target.value;
|
|
240
|
+
update();
|
|
241
|
+
}),
|
|
242
|
+
on('keydown', e => e.key === 'Enter' && fetchProducts())
|
|
243
|
+
),
|
|
244
|
+
button('Search', on('click', fetchProducts))
|
|
245
|
+
),
|
|
246
|
+
|
|
247
|
+
when(() => state.status === 'loading',
|
|
248
|
+
div('Loading...')
|
|
249
|
+
).when(() => state.status === 'error',
|
|
250
|
+
div({ className: 'error' }, () => `Error: ${state.error}`)
|
|
251
|
+
).when(() => state.products.length > 0,
|
|
252
|
+
list(() => state.products, product =>
|
|
253
|
+
div(
|
|
254
|
+
{ className: 'product-card' },
|
|
255
|
+
h3(product.title),
|
|
256
|
+
p(() => `Category: ${product.category}`)
|
|
257
|
+
)
|
|
258
|
+
)
|
|
259
|
+
).else(
|
|
260
|
+
div('Click search to load products')
|
|
261
|
+
)
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
render(app, document.body);
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Core Concepts
|
|
270
|
+
|
|
271
|
+
### 1. **Explicit Updates**
|
|
272
|
+
|
|
273
|
+
nuclo doesn't auto-detect changes. You call `update()` when ready:
|
|
274
|
+
|
|
275
|
+
```ts
|
|
276
|
+
let name = 'World';
|
|
277
|
+
|
|
278
|
+
// Mutate freely
|
|
279
|
+
name = 'Alice';
|
|
280
|
+
name = name.toUpperCase();
|
|
281
|
+
|
|
282
|
+
// Update once when ready
|
|
283
|
+
update();
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Advantages of explicit `update()`:**
|
|
287
|
+
|
|
288
|
+
- **Performance**: Batch multiple mutations into a single update cycle
|
|
289
|
+
- **Control**: You decide exactly when the UI should refresh
|
|
290
|
+
- **Predictability**: Zero surprise re-renders, explicit update flow
|
|
291
|
+
- **Simplicity**: No proxies, no dependency graphs, just objects and functions
|
|
292
|
+
- **Debugging**: Set a breakpoint at `update()` to trace all state changes
|
|
293
|
+
|
|
294
|
+
```ts
|
|
295
|
+
// Example: Batch updates for better performance
|
|
296
|
+
items.push(item1);
|
|
297
|
+
items.push(item2);
|
|
298
|
+
items.sort();
|
|
299
|
+
user.name = 'Alice';
|
|
300
|
+
update(); // One update for all changes
|
|
301
|
+
|
|
302
|
+
// vs. automatic tracking (hypothetical)
|
|
303
|
+
items.push(item1); // triggers update
|
|
304
|
+
items.push(item2); // triggers update
|
|
305
|
+
items.sort(); // triggers update
|
|
306
|
+
user.name = 'Alice'; // triggers update
|
|
307
|
+
// 4 updates instead of 1!
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### 2. **Dynamic Functions**
|
|
311
|
+
|
|
312
|
+
Zero-arg functions become dynamic bindings that re-run when you call `update()`:
|
|
313
|
+
|
|
314
|
+
```ts
|
|
315
|
+
let count = 0;
|
|
316
|
+
|
|
317
|
+
div(
|
|
318
|
+
() => `Count: ${count}`, // Updates when update() is called
|
|
319
|
+
{ title: () => `Current: ${count}` } // Attributes too
|
|
320
|
+
)
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 3. **Conditional Rendering with `when`**
|
|
324
|
+
|
|
325
|
+
First matching condition wins:
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
when(() => user.isAdmin,
|
|
329
|
+
div('Admin Panel')
|
|
330
|
+
).when(() => user.isLoggedIn,
|
|
331
|
+
div('User Dashboard')
|
|
332
|
+
).else(
|
|
333
|
+
div('Please log in')
|
|
334
|
+
)
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
DOM is preserved if the active branch doesn't change.
|
|
338
|
+
|
|
339
|
+
### 4. **List Synchronization**
|
|
340
|
+
|
|
341
|
+
Lists use object identity (not keys) to track items:
|
|
342
|
+
|
|
343
|
+
```ts
|
|
344
|
+
list(() => items, (item, index) =>
|
|
345
|
+
div(() => `${index}: ${item.name}`)
|
|
346
|
+
)
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Mutate the array (push, splice, reverse), then call `update()`. Elements are reused if the item reference is the same.
|
|
350
|
+
|
|
351
|
+
## API Reference
|
|
352
|
+
|
|
353
|
+
### Core Functions
|
|
354
|
+
|
|
355
|
+
#### `update()`
|
|
356
|
+
|
|
357
|
+
Runs one synchronous update pass across every dynamic binding. Call this after mutating state:
|
|
358
|
+
|
|
359
|
+
```ts
|
|
360
|
+
count++;
|
|
361
|
+
items.push(newItem);
|
|
362
|
+
update();
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
#### `list(provider, renderer)`
|
|
366
|
+
|
|
367
|
+
Synchronizes an array to DOM elements:
|
|
368
|
+
|
|
369
|
+
```ts
|
|
370
|
+
list(
|
|
371
|
+
() => items, // Provider function
|
|
372
|
+
(item, index) => div( // Renderer
|
|
373
|
+
() => `${index}: ${item.name}`
|
|
374
|
+
)
|
|
375
|
+
)
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
Items are tracked by object identity. Mutate the array and call `update()` to sync.
|
|
379
|
+
|
|
380
|
+
#### `when(condition, ...content)`
|
|
381
|
+
|
|
382
|
+
Conditional rendering with chaining:
|
|
383
|
+
|
|
384
|
+
```ts
|
|
385
|
+
when(() => count > 10,
|
|
386
|
+
div('High')
|
|
387
|
+
).when(() => count > 0,
|
|
388
|
+
div('Low')
|
|
389
|
+
).else(
|
|
390
|
+
div('Zero')
|
|
391
|
+
)
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
First matching condition wins. DOM is preserved if the active branch doesn't change.
|
|
395
|
+
|
|
396
|
+
#### `on(event, handler, options?)`
|
|
397
|
+
|
|
398
|
+
Attach event listeners:
|
|
399
|
+
|
|
400
|
+
```ts
|
|
401
|
+
button('Click me',
|
|
402
|
+
on('click', () => console.log('clicked')),
|
|
403
|
+
on('mouseenter', handleHover, { passive: true })
|
|
404
|
+
)
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
#### `scope(...ids)`
|
|
408
|
+
|
|
409
|
+
Registers an element as a named update root, so `update("id")` re-runs only the dynamic bindings contained within it instead of the whole page:
|
|
410
|
+
|
|
411
|
+
```ts
|
|
412
|
+
div(
|
|
413
|
+
scope('cart'),
|
|
414
|
+
span(() => `Items: ${cartItems.length}`)
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
cartItems.push(nextItem);
|
|
418
|
+
update('cart'); // only updates runtimes inside the "cart" scope
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Tag Builders
|
|
422
|
+
|
|
423
|
+
All HTML and SVG tags are available globally:
|
|
424
|
+
|
|
425
|
+
```ts
|
|
426
|
+
div(), span(), button(), input(), h1(), p(), ul(), li()
|
|
427
|
+
svgSvg(), circleSvg(), pathSvg(), rectSvg(), gSvg()
|
|
428
|
+
// ... 175 HTML and SVG builders total
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Attributes
|
|
432
|
+
|
|
433
|
+
Pass attributes as objects:
|
|
434
|
+
|
|
435
|
+
```ts
|
|
436
|
+
div('Hello', {
|
|
437
|
+
className: 'container',
|
|
438
|
+
id: 'main',
|
|
439
|
+
'data-test': 'value',
|
|
440
|
+
style: { color: 'red', fontSize: '16px' }
|
|
441
|
+
})
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
Dynamic attributes use functions:
|
|
445
|
+
|
|
446
|
+
```ts
|
|
447
|
+
div({
|
|
448
|
+
className: () => isActive ? 'active' : '',
|
|
449
|
+
disabled: () => !isValid,
|
|
450
|
+
style: () => ({ opacity: isVisible ? 1 : 0 })
|
|
451
|
+
})
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### Styling
|
|
455
|
+
|
|
456
|
+
Nuclo includes an atomic CSS-in-TS engine. `css()` is available globally after `import 'nuclo'`. For theming and responsive breakpoints use `createCss()`:
|
|
457
|
+
|
|
458
|
+
```ts
|
|
459
|
+
import 'nuclo';
|
|
460
|
+
|
|
461
|
+
const { css } = createCss({
|
|
462
|
+
colors: { primary: '#14b8a6' },
|
|
463
|
+
screens: { md: '(min-width: 768px)' },
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
const card = css({
|
|
467
|
+
p: 16,
|
|
468
|
+
rounded: 8,
|
|
469
|
+
md: { p: 24 },
|
|
470
|
+
hover: { borderColor: 'primary' },
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
const el = div(card, 'Hello');
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
`css()` returns an object with a `className` key that can be passed directly to any tag builder. Global styles and keyframe animations use `globalStyle()` and `keyframes()`.
|
|
477
|
+
|
|
478
|
+
#### Composing with `cx()`
|
|
479
|
+
|
|
480
|
+
`cx()` composes styles with exact, last-wins conflict resolution — because the engine knows which declaration every class it minted represents, a later `color` atom drops the earlier one (no tailwind-merge guessing). It accepts results, raw class strings, falsy values, and nested arrays:
|
|
481
|
+
|
|
482
|
+
```ts
|
|
483
|
+
cx(base, isActive && activeStyle); // conditional
|
|
484
|
+
cx([base, isActive && activeStyle], extra); // arrays are flattened
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
#### Typed variants with `variants()`
|
|
488
|
+
|
|
489
|
+
`variants()` turns a base style plus named variant groups into a strongly-typed recipe. Variant names and values are inferred, so selecting an unknown one is a compile error, and `true`/`false` value groups are selected with real booleans. Every variant compiles to atomic classes once at definition time; a call is a cached lookup plus a `cx()` merge.
|
|
490
|
+
|
|
491
|
+
```ts
|
|
492
|
+
import 'nuclo';
|
|
493
|
+
|
|
494
|
+
const { variants } = createCss({
|
|
495
|
+
colors: { primary: '#6366f1', danger: '#ef4444' },
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
const button = variants({
|
|
499
|
+
base: { rounded: 8, weight: 600, cursor: 'pointer' },
|
|
500
|
+
variants: {
|
|
501
|
+
intent: {
|
|
502
|
+
primary: { bg: 'primary', color: '#fff' },
|
|
503
|
+
danger: { bg: 'danger', color: '#fff' },
|
|
504
|
+
},
|
|
505
|
+
size: {
|
|
506
|
+
sm: { px: 10, py: 6, text: 14 },
|
|
507
|
+
lg: { px: 18, py: 12, text: 16 },
|
|
508
|
+
},
|
|
509
|
+
block: { true: { display: 'block', w: '100%' } },
|
|
510
|
+
},
|
|
511
|
+
defaultVariants: { intent: 'primary', size: 'sm' },
|
|
512
|
+
compoundVariants: [
|
|
513
|
+
{ intent: 'danger', size: 'lg', css: { weight: 700 } },
|
|
514
|
+
],
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
div(button({ intent: 'danger', size: 'lg' }), 'Delete'); // StyleResult — drop-in attributes
|
|
518
|
+
div(button(), 'Save'); // uses defaultVariants
|
|
519
|
+
|
|
520
|
+
button({ intent: 'ghost' }); // ✗ compile error: "ghost" is not a defined intent
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
The result is a `StyleResult`, so it drops straight into any tag builder or composes further with `cx(button({ size: 'lg' }), extraClass)`.
|
|
524
|
+
|
|
525
|
+
### Server-Side Rendering
|
|
526
|
+
|
|
527
|
+
Import `nuclo/polyfill` before `nuclo` in your Node.js server entry, then use `renderToString()` and `getCssText()` from `nuclo/ssr`:
|
|
528
|
+
|
|
529
|
+
```ts
|
|
530
|
+
import 'nuclo/polyfill';
|
|
531
|
+
import 'nuclo';
|
|
532
|
+
import { renderToString, getCssText } from 'nuclo/ssr';
|
|
533
|
+
import { App } from './app.ts';
|
|
534
|
+
|
|
535
|
+
const html = renderToString(App());
|
|
536
|
+
const styles = getCssText();
|
|
537
|
+
|
|
538
|
+
const page = `<!doctype html><html><head><style>${styles}</style></head>
|
|
539
|
+
<body><div id="app">${html}</div></body></html>`;
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
On the client, call `hydrate()` instead of `render()` to attach Nuclo runtimes to the existing markup without re-creating DOM nodes.
|
|
543
|
+
|
|
544
|
+
`nuclo/ssr` also exports `renderManyToString(inputs)` for rendering a batch of trees at once, and `renderToStringWithContainer(input, containerTag?, containerAttrs?)` to wrap the output in a container element without a second serialization pass.
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## Best Practices
|
|
549
|
+
|
|
550
|
+
### Batch Updates
|
|
551
|
+
|
|
552
|
+
Make multiple changes, then update once:
|
|
553
|
+
|
|
554
|
+
```ts
|
|
555
|
+
// Efficient: One update for all changes
|
|
556
|
+
items.push(item1);
|
|
557
|
+
items.push(item2);
|
|
558
|
+
items.sort();
|
|
559
|
+
update();
|
|
560
|
+
|
|
561
|
+
// Works but inefficient: Multiple updates
|
|
562
|
+
items.push(item1);
|
|
563
|
+
update();
|
|
564
|
+
items.push(item2);
|
|
565
|
+
update();
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Object Identity for Lists
|
|
569
|
+
|
|
570
|
+
Lists track items by reference. Mutate objects in place:
|
|
571
|
+
|
|
572
|
+
```ts
|
|
573
|
+
// Good: Mutate the object
|
|
574
|
+
todos[0].done = true;
|
|
575
|
+
update();
|
|
576
|
+
|
|
577
|
+
// Avoid: Creates new object, DOM element recreated
|
|
578
|
+
todos[0] = { ...todos[0], done: true };
|
|
579
|
+
update();
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
### Use `.else()` for Clarity
|
|
583
|
+
|
|
584
|
+
Even if not initially needed:
|
|
585
|
+
|
|
586
|
+
```ts
|
|
587
|
+
when(() => isLoading,
|
|
588
|
+
div('Loading...')
|
|
589
|
+
).else(
|
|
590
|
+
div('Ready') // Clear intent
|
|
591
|
+
)
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## Advanced Patterns
|
|
597
|
+
|
|
598
|
+
### Nested Structures
|
|
599
|
+
|
|
600
|
+
Combine `when` and `list`:
|
|
601
|
+
|
|
602
|
+
```ts
|
|
603
|
+
when(() => user.isLoggedIn,
|
|
604
|
+
div(
|
|
605
|
+
h1(() => `Welcome, ${user.name}`),
|
|
606
|
+
list(() => user.notifications, n =>
|
|
607
|
+
div(n.message, { className: () => n.read ? 'read' : 'unread' })
|
|
608
|
+
)
|
|
609
|
+
)
|
|
610
|
+
).else(
|
|
611
|
+
div('Please log in')
|
|
612
|
+
)
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
### Component-like Functions
|
|
616
|
+
|
|
617
|
+
```ts
|
|
618
|
+
function UserCard(user: User) {
|
|
619
|
+
return div(
|
|
620
|
+
{ className: 'user-card' },
|
|
621
|
+
img({ src: user.avatar }),
|
|
622
|
+
h3(user.name),
|
|
623
|
+
p(user.bio)
|
|
624
|
+
);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
list(() => users, user => UserCard(user))
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### Computed Values
|
|
631
|
+
|
|
632
|
+
```ts
|
|
633
|
+
function activeCount() {
|
|
634
|
+
return todos.filter(t => !t.done).length;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
div(
|
|
638
|
+
() => `${activeCount()} remaining`
|
|
639
|
+
)
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## Performance
|
|
645
|
+
|
|
646
|
+
- **No virtual DOM diffing** – Direct DOM manipulation for maximum efficiency
|
|
647
|
+
- **Fine-grained updates** – Only updates what changed, nothing more
|
|
648
|
+
- **Element reuse** – Lists intelligently reuse DOM elements when items move
|
|
649
|
+
- **Branch preservation** – Conditional branches persist until conditions change
|
|
650
|
+
|
|
651
|
+
For high-frequency updates (animations, game loops), batch mutations before calling `update()`.
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
## Debugging
|
|
656
|
+
|
|
657
|
+
### Inspect Markers
|
|
658
|
+
|
|
659
|
+
Open DevTools to see comment markers that help you understand the structure:
|
|
660
|
+
|
|
661
|
+
```html
|
|
662
|
+
<!-- when-start-1 -->
|
|
663
|
+
<div>Content</div>
|
|
664
|
+
<!-- when-end -->
|
|
665
|
+
|
|
666
|
+
<!-- list-start-2 -->
|
|
667
|
+
<div>Item 1</div>
|
|
668
|
+
<div>Item 2</div>
|
|
669
|
+
<!-- list-end -->
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
These markers identify conditional and list boundaries in the DOM.
|
|
673
|
+
|
|
674
|
+
### Common Issues
|
|
675
|
+
|
|
676
|
+
**Content not updating?**
|
|
677
|
+
- Ensure you're calling `update()` after state changes
|
|
678
|
+
- Verify your dynamic functions are returning the expected values — functions that return `null`/`undefined` render as empty text and fill in on the next `update()`
|
|
679
|
+
|
|
680
|
+
**List items not reusing elements?**
|
|
681
|
+
- Keep object references stable (mutate instead of replacing)
|
|
682
|
+
- Avoid creating new objects when updating properties
|
|
683
|
+
|
|
684
|
+
### Gotchas
|
|
685
|
+
|
|
686
|
+
**Parameter count decides what a function modifier means.**
|
|
687
|
+
A modifier with **zero declared parameters** is treated as reactive text (or a reactive `cn()` className) and is called with no arguments. A modifier with **one or more declared parameters** is a node-modifier function receiving `(element, index)`. Default and rest parameters don't count as declared parameters (`fn.length` is 0), so these are all treated as *reactive text*, not node modifiers:
|
|
688
|
+
|
|
689
|
+
```ts
|
|
690
|
+
div((el = fallback) => el.id); // reactive text — el is undefined!
|
|
691
|
+
div((...args) => args[0]); // reactive text — args is empty!
|
|
692
|
+
div((el) => el.id = "x"); // node modifier — el is the element ✓
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
If a modifier needs the element, declare it as a plain required parameter.
|
|
696
|
+
|
|
697
|
+
**Detached nodes lose reactivity.**
|
|
698
|
+
Reactive registrations (text, attributes, `list()`, `when()`) are pruned for any node that is disconnected from the DOM when `update()` runs. Re-attaching the node later does **not** restore them. Keep-alive and portal-style patterns should re-render content after re-attaching instead of moving live subtrees between updates.
|
|
699
|
+
|
|
700
|
+
---
|
|
701
|
+
|
|
702
|
+
## Documentation
|
|
703
|
+
|
|
704
|
+
Full documentation is available at [https://nuclo.dev/](https://nuclo.dev/)
|
|
705
|
+
|
|
706
|
+
- [Getting Started](https://nuclo.dev/getting-started)
|
|
707
|
+
- [API Reference](https://nuclo.dev/core-api)
|
|
708
|
+
- [Examples](https://nuclo.dev/examples)
|
|
709
|
+
|
|
710
|
+
---
|
|
711
|
+
|
|
712
|
+
## Author
|
|
713
|
+
|
|
714
|
+
Created by **Danilo Celestino de Castro**
|
|
715
|
+
|
|
716
|
+
- GitHub: [@dan2dev](https://github.com/dan2dev)
|
|
717
|
+
- Twitter: [@dan2dev](https://twitter.com/dan2dev)
|
|
718
|
+
|
|
719
|
+
---
|
|
720
|
+
|
|
721
|
+
## License
|
|
722
|
+
|
|
723
|
+
MIT License - see [LICENSE.md](LICENSE.md) for details.
|
|
724
|
+
|
|
725
|
+
This library is free and open source. When using nuclo, please include attribution in your documentation or application.
|
|
726
|
+
|
|
727
|
+
**TL;DR:** Use it freely, give credit where it's due!
|