diff --git a/demo/package-lock.json b/demo/package-lock.json
index 4c4b6ba..90a9127 100644
--- a/demo/package-lock.json
+++ b/demo/package-lock.json
@@ -8,6 +8,7 @@
"name": "demo",
"version": "0.0.1",
"dependencies": {
+ "@fortawesome/fontawesome-free": "^7.1.0",
"@wjfe/n-savant": "^0.12.0",
"@wjfe/n-savant-sk": "file:../wjfe-n-savant-sk-0.1.0.tgz"
},
@@ -438,6 +439,15 @@
"node": ">=18"
}
},
+ "node_modules/@fortawesome/fontawesome-free": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.1.0.tgz",
+ "integrity": "sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA==",
+ "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
diff --git a/demo/package.json b/demo/package.json
index 4431e23..113acab 100644
--- a/demo/package.json
+++ b/demo/package.json
@@ -22,6 +22,7 @@
"vite": "^7.0.4"
},
"dependencies": {
+ "@fortawesome/fontawesome-free": "^7.1.0",
"@wjfe/n-savant": "^0.12.0",
"@wjfe/n-savant-sk": "file:../wjfe-n-savant-sk-0.1.0.tgz"
}
diff --git a/demo/src/lib/NavBar.svelte b/demo/src/lib/NavBar.svelte
index 780c4d1..9eb3e82 100644
--- a/demo/src/lib/NavBar.svelte
+++ b/demo/src/lib/NavBar.svelte
@@ -1,37 +1,68 @@
-
-
-
+
+
+
+
+
+
+ @wjfe/n-savant-sk Demo
+
+
+
+
+ Home
+ Start Demo
+ {#snippet end()}
+
+ Sveltekit Path: {location.url.pathname}
+
+
+
+
+
+
+
+ {/snippet}
+
+
diff --git a/demo/src/lib/ThemePicker.svelte b/demo/src/lib/ThemePicker.svelte
new file mode 100644
index 0000000..3e3987c
--- /dev/null
+++ b/demo/src/lib/ThemePicker.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/src/lib/bulma/NavBar/Brand.svelte b/demo/src/lib/bulma/NavBar/Brand.svelte
new file mode 100644
index 0000000..61d9d08
--- /dev/null
+++ b/demo/src/lib/bulma/NavBar/Brand.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children?.()}
+
diff --git a/demo/src/lib/bulma/NavBar/Burger.svelte b/demo/src/lib/bulma/NavBar/Burger.svelte
new file mode 100644
index 0000000..39c1c34
--- /dev/null
+++ b/demo/src/lib/bulma/NavBar/Burger.svelte
@@ -0,0 +1,24 @@
+
+
+
diff --git a/demo/src/lib/bulma/NavBar/Item.svelte b/demo/src/lib/bulma/NavBar/Item.svelte
new file mode 100644
index 0000000..7591f51
--- /dev/null
+++ b/demo/src/lib/bulma/NavBar/Item.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children?.()}
+
diff --git a/demo/src/lib/bulma/NavBar/Link.svelte b/demo/src/lib/bulma/NavBar/Link.svelte
new file mode 100644
index 0000000..ecdfbb8
--- /dev/null
+++ b/demo/src/lib/bulma/NavBar/Link.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {@render children?.()}
+
diff --git a/demo/src/lib/bulma/NavBar/Menu.svelte b/demo/src/lib/bulma/NavBar/Menu.svelte
new file mode 100644
index 0000000..eda8122
--- /dev/null
+++ b/demo/src/lib/bulma/NavBar/Menu.svelte
@@ -0,0 +1,26 @@
+
+
+
diff --git a/demo/src/lib/bulma/NavBar/Root.svelte b/demo/src/lib/bulma/NavBar/Root.svelte
new file mode 100644
index 0000000..e4f4653
--- /dev/null
+++ b/demo/src/lib/bulma/NavBar/Root.svelte
@@ -0,0 +1,28 @@
+
+
+
diff --git a/demo/src/lib/bulma/NavBar/index.ts b/demo/src/lib/bulma/NavBar/index.ts
new file mode 100644
index 0000000..f7802b8
--- /dev/null
+++ b/demo/src/lib/bulma/NavBar/index.ts
@@ -0,0 +1,15 @@
+import Root from "./Root.svelte"
+import Brand from "./Brand.svelte"
+import Burger from "./Burger.svelte"
+import Item from "./Item.svelte"
+import Menu from "./Menu.svelte"
+import Link from "./Link.svelte"
+
+export const NavBar = {
+ Root,
+ Brand,
+ Burger,
+ Menu,
+ Item,
+ Link
+};
diff --git a/demo/src/lib/demo/Demo.svelte b/demo/src/lib/demo/Demo.svelte
index 2385b38..7e6f34e 100644
--- a/demo/src/lib/demo/Demo.svelte
+++ b/demo/src/lib/demo/Demo.svelte
@@ -19,8 +19,11 @@
- Path (Sveltekit): {location.url.pathname}
- Hash path: {hashPath}
+
+
+ Hash path:
+ {typeof hash === 'string' ? `${hash}=` : ''}{hashPath || '/'}
+
diff --git a/demo/src/lib/isSkRouteActive.ts b/demo/src/lib/isSkRouteActive.ts
new file mode 100644
index 0000000..c70a652
--- /dev/null
+++ b/demo/src/lib/isSkRouteActive.ts
@@ -0,0 +1,5 @@
+import { page } from "$app/state";
+
+export function isSkRouteActive(route: string): boolean {
+ return page.url.pathname === route;
+}
diff --git a/demo/src/lib/state/theme.svelte.ts b/demo/src/lib/state/theme.svelte.ts
index c6785ae..9c1b773 100644
--- a/demo/src/lib/state/theme.svelte.ts
+++ b/demo/src/lib/state/theme.svelte.ts
@@ -1,5 +1,38 @@
+const themeOptions = ['system', 'light', 'dark'] as const;
+
+type ThemeIndex = 0 | 1 | 2;
+
+function indexOfTheme(theme: 'system' | 'light' | 'dark'): ThemeIndex {
+ const index = themeOptions.indexOf(theme);
+ if (index === -1) {
+ throw new Error(`Invalid theme: ${theme}`);
+ }
+ return index as ThemeIndex;
+}
+
export class ThemeState {
- current: 'light' | 'dark' | 'system' = $state('system');
+ #current: ThemeIndex = $state(0);
+
+ get current() {
+ return themeOptions[this.#current];
+ }
+ set current(value: 'light' | 'dark' | 'system') {
+ this.#current = indexOfTheme(value);
+ this.#updateTheme();
+ }
+
+ #updateTheme() {
+ if (this.#current === 0) {
+ document.documentElement.removeAttribute('data-theme');
+ return;
+ }
+ document.documentElement.setAttribute('data-theme', themeOptions[this.#current]);
+ }
+
+ nextTheme() {
+ this.#current = (this.#current + 1) % themeOptions.length as ThemeIndex;
+ this.#updateTheme();
+ }
}
export default new ThemeState();
diff --git a/demo/src/routes/+layout.svelte b/demo/src/routes/+layout.svelte
index 0a73d1f..6e62504 100644
--- a/demo/src/routes/+layout.svelte
+++ b/demo/src/routes/+layout.svelte
@@ -1,8 +1,8 @@