+
);
}
+// The warning about 'Empty components are self-closing' for SelectValue is handled
+// by ensuring it's self-closed within the JSX: `
`.
+// The innerHTML warning is acknowledged as intentional for this demo's purpose.
diff --git a/dev/pages/demo/demos.ts b/dev/pages/demo/demos.ts
new file mode 100644
index 0000000..f4c6f3b
--- /dev/null
+++ b/dev/pages/demo/demos.ts
@@ -0,0 +1,91 @@
+export type Demo = {
+ id: string;
+ name: string;
+ template: string;
+ data: string;
+ description: string;
+};
+
+export const demos: Demo[] = [
+ {
+ id: "basic-interpolation",
+ name: "Basic Interpolation",
+ description: "Demonstrates basic interpolation with `{{=it.property}}`.",
+ template: `
Hello, \{\{=it.name}}!
+
You have \{\{=it.messages}} new messages.
`,
+ data: `{ "name": "John Doe", "messages": 5 }`,
+ },
+ // encode example does not work.
+ // {
+ // id: "interpolation-with-encoding",
+ // name: "Interpolation with Encoding",
+ // description: "Shows interpolation with HTML encoding using `{{!it.property}}` to prevent XSS.",
+ // template: `
User Input (Encoded):
+ //
\{\{!it.userInput\}}
+
+ //
User Input (Unencoded - Dangerous!):
+ //
\{\{=it.userInput\}}
`,
+ // data: `{ "userInput": "
Malicious Content " }`,
+ // },
+ {
+ id: "conditionals",
+ name: "Conditionals (`{{? ... }}`)",
+ description: "Uses `{{? ... }}` for conditional rendering based on data properties.",
+ template: `
User Profile:
+
Name: {{=it.user.name}}
+{{? it.user.isAdmin }}
+
Status: Administrator
+{{??}}
+
Status: Regular User
+{{?}}
+
+{{? it.notifications > 0 }}
+
You have {{=it.notifications}} unread notifications.
+{{?}}`,
+ data: `{ "user": { "name": "Alice", "isAdmin": true }, "notifications": 3 }`,
+ },
+ {
+ id: "array-iteration",
+ name: "Array Iteration (`{{~ ... }}`)",
+ description: "Demonstrates iterating over an array using `{{~ it.items :value:index }}`.",
+ template: `
Shopping List:
+
+{{~ it.items :item:index}}
+ {{=index + 1}}. {{=item.name}} (Quantity: {{=item.quantity}})
+{{~}}
+
+
+
Users:
+
+{{~ it.users :user}}
+ {{=user.name}} - {{=user.email}}
+{{~}}
+ `,
+ data: `{
+ "items": [
+ { "name": "Milk", "quantity": 1 },
+ { "name": "Eggs", "quantity": 12 },
+ { "name": "Bread", "quantity": 2 }
+ ],
+ "users": [
+ { "name": "Bob", "email": "bob@example.com" },
+ { "name": "Charlie", "email": "charlie@example.com" }
+ ]
+}`,
+ },
+ {
+ id: "string-comparison-conditionals",
+ name: "String Comparison Conditionals",
+ description:
+ "Demonstrates conditional rendering based on string value comparisons (e.g., `it.framework === 'react'`).",
+ template: `
Your Favorite Framework:
+{{? it.framework === "react" }}
+
You are a React enthusiast!
+{{?? it.framework === "solid" }}
+
SolidJS is your go-to!
+{{??}}
+
You prefer {{=it.framework || "an unknown framework"}}.
+{{?}}`,
+ data: `{ "framework": "angular" }`,
+ },
+];
diff --git a/dev/pages/index/+Page.tsx b/dev/pages/index/+Page.tsx
index e0f994d..11f1f57 100644
--- a/dev/pages/index/+Page.tsx
+++ b/dev/pages/index/+Page.tsx
@@ -1,3 +1,8 @@
+import { IconCheck, IconCopy } from "@/assets/icons";
+import { Button } from "@/components/ui/button";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { getRoute } from "@/route-tree.gen";
+import { useClipboard } from "bagon-hooks";
import { useMetadata } from "vike-metadata-solid";
import getTitle from "../../utils/get-title";
@@ -5,11 +10,66 @@ export default function Page() {
useMetadata({
title: getTitle("Home"),
});
+
+ const { copy, copied } = useClipboard();
+
return (
<>
-
-
My Vike + Solid app
- This page is:
+
+
+
+
+
+ The fastest + concise javascript template engine for Node.js and browsers. Just a
+ minor fork of doT.js
+
+
+
+ Try Demo
+
+
+ Learn More
+
+
+
+
+
+
+
+ ⚡️ Blazing Fast
+
+ Compile-time optimizations for performance
+
+
+
+ 🧑💻 Typescript
+
+ Full TypeScript support for a robust development experience
+
+
+
+ 🧑💻 Easy to Learn
+
+ Revamped the docs so you can learn it!
+
+
+
+
+ Add to your project
+
+ npm install tsdot
+ copy("npm install tsdot")}>
+ {copied() ? : }
+
+
+
+
>
);
diff --git a/dev/route-tree.gen.ts b/dev/route-tree.gen.ts
new file mode 100644
index 0000000..c299d09
--- /dev/null
+++ b/dev/route-tree.gen.ts
@@ -0,0 +1,151 @@
+// /* eslint-disable */
+// @ts-nocheck
+
+// noinspection JSUnusedGlobalSymbols
+
+//// Automatically generated by Vike (routegen).
+//// - Used for typesafe routing.
+//// - DO NOT make any changes.
+//// - Make sure to exclude from linter/formatter.
+
+export { pageRoutes, getRoute, useParams };
+export type { PageRoute, UseParamsResult };
+
+const pageRoutes = [
+ "/",
+ "/demo"
+] as const;
+
+type PageRoute = typeof pageRoutes[number];
+
+/* For regular routes with named parameters. But it has a minor issue, it gets "" as a property, so this is prefixed with '_' */
+type _ExtractNamedParams
= T extends `${string}@${infer Param}/${infer Rest}`
+? { [K in Param | keyof ExtractNamedParams]: string }
+: T extends `${string}@${infer Param}`
+? { [K in Param]: string }
+: {};
+
+/** Minor utility to prevent typescript from wrapping types. */
+type Prettify = {
+ [K in keyof T]: T[K];
+} & {};
+
+/* For regular routes with named parameters */
+type ExtractNamedParams = Prettify, "">>;
+
+/* Helper to determine if a route ends with a catch-all segment */
+type EndsWithCatchall = T extends `${string}/@` ? true : false;
+
+/* Conditional type helper for determining if a route is a catchall/splat route */
+type IsCatchallRoute = EndsWithCatchall;
+
+/* Return type for UseParams */
+type UseParamsResult =
+IsCatchallRoute extends true
+? ExtractNamedParams & { '@': string[], '_@': string }
+: ExtractNamedParams;
+
+/* Conditional type helper for determining if a route has parameters */
+type HasParams =
+IsCatchallRoute extends true
+? true
+: T extends `${string}@${string}`
+? true
+: false;
+
+/* Type for the options of the getRoute function. */
+type GetRouteOptions = HasParams extends true
+? IsCatchallRoute extends true
+? {
+params: ExtractNamedParams & { '@': string[] | string };
+search?: Record;
+}
+: {
+params: ExtractNamedParams;
+search?: Record;
+}
+: {
+params?: never;
+search?: Record;
+};
+
+/* Typesafe helper to generate a route URL based on Vike pages folder. */
+function getRoute(
+route: T,
+...args: HasParams extends true
+? [options: GetRouteOptions]
+: [options?: GetRouteOptions]
+): string {
+const options = args[0] || {};
+
+// Handle both regular named parameters and catchall routes
+let result: string = route;
+
+if (options.params) {
+// Handle named parameters first
+const params = { ...options.params };
+Object.entries(params).forEach(([key, value]) => {
+if (key !== '@') {
+result = result.replace(`@${key}`, String(value));
+}
+});
+
+// Then handle catchall if present
+if (route.endsWith('/@') && '@' in params) {
+const catchallValue = params['@'];
+// Remove the trailing /@ from the result
+result = result.substring(0, result.length - 2);
+
+if (Array.isArray(catchallValue)) {
+// If array, join with slashes
+result += `/${catchallValue.join('/')}`;
+} else if (typeof catchallValue === 'string') {
+// If string, add directly (with leading slash if needed)
+const prefix = catchallValue.startsWith('/') ? '' : '/';
+result += `${prefix}${catchallValue}`;
+}
+}
+}
+
+if (options.search) {
+const searchParams = new URLSearchParams(options.search);
+result += `?${searchParams.toString()}`;
+}
+
+return result;
+}
+
+import { usePageContext } from 'vike-solid/usePageContext'
+function useParams(params: { from: T }): UseParamsResult {
+const pageContext = usePageContext();
+const routeParams = pageContext.routeParams as Record;
+
+// Check if this is a catch-all route
+if (params.from.endsWith("/@") && routeParams && "*" in routeParams) {
+const catchAllPath = routeParams["*"] as string;
+const segments = catchAllPath.split("/").filter(Boolean);
+
+// Extract named parameters from the route
+const namedParams: Record = {};
+const routeParts = params.from.split("/");
+const urlParts = pageContext.urlPathname.split("/");
+
+for (let i = 0; i < routeParts.length - 1; i++) {
+const routePart = routeParts[i];
+if (routePart.startsWith("@")) {
+const paramName = routePart.slice(1);
+namedParams[paramName] = urlParts[i];
+}
+}
+
+// Combine named parameters with catch-all segments
+return {
+...namedParams,
+"@": segments,
+"_@": catchAllPath.startsWith("/") ? catchAllPath : `/${catchAllPath}`,
+} as unknown as UseParamsResult;
+}
+
+// Handle regular dynamic routes without catch-all
+return routeParams as UseParamsResult;
+}
\ No newline at end of file
diff --git a/dev/styles/app.css b/dev/styles/app.css
index b5c61c9..21d158b 100644
--- a/dev/styles/app.css
+++ b/dev/styles/app.css
@@ -1,3 +1,311 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
+@import url("https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap");
+
+@import "tailwindcss";
+
+/* HTML Defaults */
+body {
+ font-family: Manrope, Arial, Helvetica, sans-serif;
+}
+
+/* Tailwind Defaults */
+@layer base {
+ button:not(:disabled),
+ [role="button"]:not(:disabled) {
+ cursor: pointer;
+ }
+}
+
+@layer base {
+ *,
+ ::after,
+ ::before,
+ ::backdrop,
+ ::file-selector-button {
+ border-color: var(--color-gray-200, currentColor);
+ }
+}
+
+/** Theming */
+@layer base {
+ /* color: var(--foreground); */
+
+ :root {
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.27 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.27 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.27 0 0);
+ --primary: #9c25e1;
+ --primary-foreground: white;
+ --secondary: oklch(0.97 0 264.54);
+ --secondary-foreground: oklch(0.45 0.03 256.8);
+ --muted: oklch(0.98 0 247.84);
+ --muted-foreground: oklch(0.55 0.02 264.36);
+ --accent: oklch(0.99 0.02 95.28);
+ --accent-foreground: oklch(0.47 0.12 46.2);
+ --destructive: oklch(0.64 0.21 25.33);
+ --destructive-foreground: oklch(1 0 0);
+ --border: oklch(0.93 0.01 264.53);
+ --input: oklch(0.93 0.01 264.53);
+ --ring: oklch(0.77 0.16 70.08);
+ --chart-1: oklch(0.77 0.16 70.08);
+ --chart-2: oklch(0.67 0.16 58.32);
+ --chart-3: oklch(0.56 0.15 49);
+ --chart-4: oklch(0.47 0.12 46.2);
+ --chart-5: oklch(0.41 0.11 45.9);
+ --sidebar: oklch(0.98 0 247.84);
+ --sidebar-foreground: oklch(0.27 0 0);
+ --sidebar-primary: oklch(0.77 0.16 70.08);
+ --sidebar-primary-foreground: oklch(1 0 0);
+ --sidebar-accent: oklch(0.99 0.02 95.28);
+ --sidebar-accent-foreground: oklch(0.47 0.12 46.2);
+ --sidebar-border: oklch(0.93 0.01 264.53);
+ --sidebar-ring: oklch(0.77 0.16 70.08);
+ --radius: 0.375rem;
+ --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
+ --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
+ --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 1px 2px -2px hsl(0 0% 0% / 0.1);
+ --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 1px 2px -2px hsl(0 0% 0% / 0.1);
+ --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 2px 4px -2px hsl(0 0% 0% / 0.1);
+ --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 4px 6px -2px hsl(0 0% 0% / 0.1);
+ --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 8px 10px -2px hsl(0 0% 0% / 0.1);
+ --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
+ }
+
+ .dark {
+ --background: oklch(0.2 0 0);
+ --foreground: oklch(0.92 0 0);
+ --card: oklch(0.27 0 0);
+ --card-foreground: oklch(0.92 0 0);
+ --popover: oklch(0.27 0 0);
+ --popover-foreground: oklch(0.92 0 0);
+ --primary: #9c25e1;
+ --primary-foreground: white;
+ --secondary: oklch(0.27 0 0);
+ --secondary-foreground: oklch(0.92 0 0);
+ --muted: oklch(0.27 0 0);
+ --muted-foreground: oklch(0.72 0 0);
+ --accent: oklch(0.47 0.12 46.2);
+ --accent-foreground: oklch(0.92 0.12 95.75);
+ --destructive: oklch(0.64 0.21 25.33);
+ --destructive-foreground: oklch(1 0 0);
+ --border: oklch(0.37 0 0);
+ --input: oklch(0.37 0 0);
+ --ring: oklch(0.77 0.16 70.08);
+ --chart-1: oklch(0.84 0.16 84.43);
+ --chart-2: oklch(0.67 0.16 58.32);
+ --chart-3: oklch(0.47 0.12 46.2);
+ --chart-4: oklch(0.56 0.15 49);
+ --chart-5: oklch(0.47 0.12 46.2);
+ --sidebar: oklch(0.17 0 0);
+ --sidebar-foreground: oklch(0.92 0 0);
+ --sidebar-primary: oklch(0.77 0.16 70.08);
+ --sidebar-primary-foreground: oklch(1 0 0);
+ --sidebar-accent: oklch(0.47 0.12 46.2);
+ --sidebar-accent-foreground: oklch(0.92 0.12 95.75);
+ --sidebar-border: oklch(0.37 0 0);
+ --sidebar-ring: oklch(0.77 0.16 70.08);
+ --font-sans: Inter, sans-serif;
+ --font-serif: Source Serif 4, serif;
+ --font-mono: JetBrains Mono, monospace;
+ --radius: 0.375rem;
+ --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
+ --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
+ --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 1px 2px -2px hsl(0 0% 0% / 0.1);
+ --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 1px 2px -2px hsl(0 0% 0% / 0.1);
+ --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 2px 4px -2px hsl(0 0% 0% / 0.1);
+ --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 4px 6px -2px hsl(0 0% 0% / 0.1);
+ --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.1), 0px 8px 10px -2px hsl(0 0% 0% / 0.1);
+ --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
+ }
+}
+
+@theme {
+ --font-manrope: "Manrope", "sans-serif";
+ /* --font-sans: Inter, sans-serif; */
+ /* --font-serif: Source Serif 4, serif; */
+ /* --font-mono: JetBrains Mono, monospace; */
+
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-destructive-foreground: var(--destructive-foreground);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --color-chart-1: var(--chart-1);
+ --color-chart-2: var(--chart-2);
+ --color-chart-3: var(--chart-3);
+ --color-chart-4: var(--chart-4);
+ --color-chart-5: var(--chart-5);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+
+ --font-sans: var(--font-sans);
+ --font-mono: var(--font-mono);
+ --font-serif: var(--font-serif);
+
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+
+ --shadow-2xs: var(--shadow-2xs);
+ --shadow-xs: var(--shadow-xs);
+ --shadow-sm: var(--shadow-sm);
+ --shadow: var(--shadow);
+ --shadow-md: var(--shadow-md);
+ --shadow-lg: var(--shadow-lg);
+ --shadow-xl: var(--shadow-xl);
+ --shadow-2xl: var(--shadow-2xl);
+
+ --animate-fadeIn: fadeIn 200ms ease-out forwards;
+ --animate-fadeOut: fadeOut 200ms ease-in forwards;
+ --animate-flyUp: flyUp 200ms ease-out forwards;
+ --animate-flyUpExit: flyUpExit 200ms ease-in forwards;
+
+ --animate-flyUpAndScale: flyUpAndScale 200ms ease-out forwards;
+ --animate-flyUpAndScaleExit: flyUpAndScaleExit 200ms ease-in forwards;
+
+ --animate-flyRight: flyRight 200ms ease-out forwards;
+ --animate-flyRightExit: flyRightExit 200ms ease-in forwards;
+
+ --animate-flyLeft: flyLeft 200ms ease-out forwards;
+ --animate-flyLeftExit: flyLeftExit 200ms ease-in forwards;
+
+ /* --- Animations --- */
+ @keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+ }
+
+ @keyframes fadeOut {
+ from {
+ opacity: 1;
+ }
+ to {
+ opacity: 0;
+ }
+ }
+
+ @keyframes flyUp {
+ from {
+ opacity: 0;
+ transform: translate(0px, 15px);
+ }
+ to {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+ }
+
+ @keyframes flyUpAndScale {
+ from {
+ opacity: 0;
+ transform: translate(0px, 15px) scale(0.98);
+ }
+ to {
+ opacity: 1;
+ transform: translate(0px, 0px) scale(1);
+ }
+ }
+
+ @keyframes flyUpAndScaleExit {
+ from {
+ opacity: 1;
+ transform: translate(0px, 0px) scale(1);
+ }
+ to {
+ opacity: 0;
+ transform: translate(0px, 15px) scale(0.98);
+ }
+ }
+
+ @keyframes flyUpExit {
+ from {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+ to {
+ opacity: 0;
+ transform: translate(0px, 15px);
+ }
+ }
+
+ @keyframes flyRight {
+ from {
+ opacity: 0;
+ transform: translate(-15px, 0px);
+ }
+ to {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+ }
+
+ @keyframes flyRightExit {
+ from {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+ to {
+ opacity: 0;
+ transform: translate(-15px, 0px);
+ }
+ }
+
+ @keyframes flyLeft {
+ from {
+ opacity: 0;
+ transform: translate(15px, 0px);
+ }
+ to {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+ }
+
+ @keyframes flyLeftExit {
+ from {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+ to {
+ opacity: 0;
+ transform: translate(15px, 0px);
+ }
+ }
+}
+
+/* https://github.com/tailwindlabs/tailwindcss-intellisense/issues/227#issuecomment-1221083129 */
+@utility no-scrollbar {
+ /* Hide scrollbar for Chrome, Safari and Opera */
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
diff --git a/dev/utils/cn.ts b/dev/utils/cn.ts
new file mode 100644
index 0000000..9d621bc
--- /dev/null
+++ b/dev/utils/cn.ts
@@ -0,0 +1,6 @@
+import type { ClassValue } from "clsx";
+import clsx from "clsx";
+import { twMerge } from "tailwind-merge";
+
+/** Utility for merging class names + managing tailwind class conflicts. */
+export const cn = (...classes: ClassValue[]) => twMerge(clsx(...classes));
diff --git a/dev/utils/get-title.ts b/dev/utils/get-title.ts
index a5d9707..1302f9a 100644
--- a/dev/utils/get-title.ts
+++ b/dev/utils/get-title.ts
@@ -1,4 +1,4 @@
-const TITLE_TEMPLATE = "%s | Dot.js";
+const TITLE_TEMPLATE = "%s | TSDot";
export default function getTitle(title: string = "Home") {
return TITLE_TEMPLATE.replace("%s", title);
diff --git a/dev/vite.config.ts b/dev/vite.config.ts
index 145669e..c664463 100644
--- a/dev/vite.config.ts
+++ b/dev/vite.config.ts
@@ -8,8 +8,15 @@ import vike from "vike/plugin";
import { resolve } from "node:path";
import { defineConfig } from "vite";
+// Tailwind
+import tailwindcss from "@tailwindcss/vite";
+
+import solidSvg from "vite-plugin-solid-svg";
+
+import vikeRoutegen from "@blankeos/vike-routegen";
+
export default defineConfig({
- plugins: [vike({ prerender: true }), vikeSolid()],
+ plugins: [vike({ prerender: true }), vikeSolid(), tailwindcss(), solidSvg(), vikeRoutegen()],
resolve: {
alias: {
"@": resolve(__dirname, "./"),
diff --git a/package.json b/package.json
index fcdde0b..d547e36 100644
--- a/package.json
+++ b/package.json
@@ -40,35 +40,39 @@
"parser"
],
"devDependencies": {
- "@changesets/changelog-github": "^0.5.0",
- "@changesets/cli": "^2.27.10",
+ "@blankeos/vike-routegen": "^0.0.2",
+ "@changesets/changelog-github": "^0.5.1",
+ "@changesets/cli": "^2.29.5",
"@happy-dom/global-registrator": "^15.11.7",
- "@hono/vite-dev-server": "^0.17.0",
- "@kobalte/core": "^0.13.7",
- "@playwright/test": "^1.49.1",
+ "@hono/vite-dev-server": "^0.20.0",
+ "@kobalte/core": "^0.13.10",
+ "@playwright/test": "^1.54.1",
+ "@tailwindcss/vite": "^4.1.11",
"@testing-library/dom": "^10.4.0",
- "@types/bun": "^1.1.14",
- "@typescript-eslint/eslint-plugin": "^8.17.0",
- "@typescript-eslint/parser": "^8.17.0",
- "autoprefixer": "^10.4.20",
+ "@types/bun": "^1.2.18",
+ "@typescript-eslint/eslint-plugin": "^8.37.0",
+ "@typescript-eslint/parser": "^8.37.0",
+ "autoprefixer": "^10.4.21",
+ "bagon-hooks": "^0.0.5",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
- "eslint": "^9.16.0",
- "eslint-plugin-solid": "^0.14.4",
+ "eslint": "^9.31.0",
+ "eslint-plugin-solid": "^0.14.5",
"happy-dom": "^15.11.7",
- "hono": "^4.6.12",
- "postcss": "^8.4.49",
- "prettier": "^3.4.2",
- "prettier-plugin-tailwindcss": "^0.6.9",
- "solid-js": "^1.9.3",
- "tailwind-merge": "^2.5.5",
- "tailwindcss": "^3.4.16",
- "tsup": "^8.3.5",
- "typescript": "^5.7.2",
- "vike": "^0.4.206",
+ "hono": "^4.8.5",
+ "postcss": "^8.5.6",
+ "prettier": "^3.6.2",
+ "prettier-plugin-tailwindcss": "^0.6.14",
+ "solid-js": "^1.9.7",
+ "tailwind-merge": "^3.3.1",
+ "tailwindcss": "^4.1.11",
+ "tsup": "^8.5.0",
+ "typescript": "^5.8.3",
+ "vike": "^0.4.235",
"vike-metadata-solid": "^1.0.4",
- "vike-solid": "^0.7.6",
- "vite": "^5.4.11"
+ "vike-solid": "^0.7.11",
+ "vite": "^5.4.11",
+ "vite-plugin-solid-svg": "^0.8.1"
},
"dependencies": {}
}
diff --git a/postcss.config.js b/postcss.config.js
deleted file mode 100644
index 2e7af2b..0000000
--- a/postcss.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-}
diff --git a/tailwind.config.js b/tailwind.config.js
deleted file mode 100644
index ff0b867..0000000
--- a/tailwind.config.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/** @type {import('tailwindcss').Config} */
-export default {
- content: ["./dev/**/*.{html,js,jsx,ts,tsx}"],
- theme: {
- extend: {},
- },
- plugins: [],
-};
diff --git a/test-browser.html b/test-browser.html
index 14f9af7..7a2a823 100644
--- a/test-browser.html
+++ b/test-browser.html
@@ -23,7 +23,7 @@ Here is the page with customized header template
{{#def.customheader}}
{{=it.name}}
-
+
@@ -33,7 +33,7 @@ Caro