@kamod-ch/otok-kamod 1.0.0
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/LICENSE +21 -0
- package/README.md +139 -0
- package/dist/css.d.ts +7 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +39 -0
- package/dist/css.js.map +1 -0
- package/dist/forms/index.d.ts +31 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +23 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +87 -0
- package/dist/plugin.js.map +1 -0
- package/dist/setup.d.ts +3 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +19 -0
- package/dist/setup.js.map +1 -0
- package/dist/signals.d.ts +2 -0
- package/dist/signals.d.ts.map +1 -0
- package/dist/signals.js +2 -0
- package/dist/signals.js.map +1 -0
- package/dist/theme/index.d.ts +17 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +15 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/versions.d.ts +19 -0
- package/dist/versions.d.ts.map +1 -0
- package/dist/versions.js +76 -0
- package/dist/versions.js.map +1 -0
- package/dist/vite/tailwind.d.ts +3 -0
- package/dist/vite/tailwind.d.ts.map +1 -0
- package/dist/vite/tailwind.js +12 -0
- package/dist/vite/tailwind.js.map +1 -0
- package/package.json +101 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kamod
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# @kamod-ch/otok-kamod
|
|
2
|
+
|
|
3
|
+
Optional [Kamod](https://github.com/kamod-ch) integration for [Otok](https://github.com/kamod-ch/otok). Kamod is **not** part of Otok core — install this plugin when you want Kamod UI, Tailwind v4, themes, and form helpers.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm otok add kamod
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or manually:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add @kamod-ch/otok-kamod @kamod-ch/ui @preact/signals preact
|
|
15
|
+
pnpm add -D tailwindcss @tailwindcss/vite
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Configure
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { defineConfig } from "@kamod-ch/otok";
|
|
22
|
+
import kamod from "@kamod-ch/otok-kamod";
|
|
23
|
+
|
|
24
|
+
export default defineConfig({
|
|
25
|
+
plugins: [
|
|
26
|
+
kamod({
|
|
27
|
+
theme: "default",
|
|
28
|
+
icons: true,
|
|
29
|
+
forms: true,
|
|
30
|
+
}),
|
|
31
|
+
],
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The plugin:
|
|
36
|
+
|
|
37
|
+
- registers `@tailwindcss/vite` (remove duplicate `tailwindcss()` from `vite.config.ts` when using `kamod()`)
|
|
38
|
+
- sets Otok `theme: true` for SSR dark-mode bootstrap
|
|
39
|
+
- wires `devStylesheets` to your CSS entry (`src/style.css` by default)
|
|
40
|
+
- validates Kamod package versions at build time with actionable errors
|
|
41
|
+
|
|
42
|
+
## CSS
|
|
43
|
+
|
|
44
|
+
After `otok add kamod`, import the generated stylesheet or merge into `src/style.css`:
|
|
45
|
+
|
|
46
|
+
```css
|
|
47
|
+
@import "tailwindcss";
|
|
48
|
+
@import "@kamod-ch/ui/theme.css";
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
For brand presets (`theme: "kamod"`, `"ocean"`, …):
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pnpm add @kamod-ch/themes
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
@import "tailwindcss";
|
|
59
|
+
@import "@kamod-ch/themes/theme.css";
|
|
60
|
+
@import "@kamod-ch/themes/brands/kamod.css";
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Icons (tree-shaken)
|
|
64
|
+
|
|
65
|
+
Import icons by subpath — only used icons land in the client bundle:
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
import { SearchIcon } from "@kamod-ch/icons/shadcn";
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Forms + validation
|
|
72
|
+
|
|
73
|
+
Connect Otok validation field errors to Kamod UI:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import { FormField, FormAlert, FormActions, readFormFailure } from "@kamod-ch/otok-kamod/forms";
|
|
77
|
+
|
|
78
|
+
export default function NewItem({ actionData }: OtokPageProps) {
|
|
79
|
+
const failure = readFormFailure(actionData);
|
|
80
|
+
return (
|
|
81
|
+
<form method="post" class="grid max-w-md gap-4">
|
|
82
|
+
<FormAlert message={failure?.message} />
|
|
83
|
+
<FormField
|
|
84
|
+
name="title"
|
|
85
|
+
label="Title"
|
|
86
|
+
defaultValue={failure?.values?.title}
|
|
87
|
+
errors={failure?.fieldErrors?.title}
|
|
88
|
+
/>
|
|
89
|
+
<FormActions cancelHref="/items" />
|
|
90
|
+
</form>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Requires `@kamod-ch/otok-validation` in your app (optional peer).
|
|
96
|
+
|
|
97
|
+
## Signals & state (opt-in)
|
|
98
|
+
|
|
99
|
+
Optional peers are not pulled into the client bundle until you import them:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import { persistedSignal } from "@kamod-ch/otok-kamod/signals";
|
|
103
|
+
// When published: import { createStore } from "@kamod-ch/state";
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Or import directly from `@kamod-ch/signals` / `@kamod-ch/state`.
|
|
107
|
+
|
|
108
|
+
## Theme customization
|
|
109
|
+
|
|
110
|
+
| `theme` option | CSS |
|
|
111
|
+
| -------------- | ------------------------------------------ |
|
|
112
|
+
| `"default"` | `@kamod-ch/ui/theme.css` |
|
|
113
|
+
| brand preset | `@kamod-ch/themes` + `brands/{preset}.css` |
|
|
114
|
+
|
|
115
|
+
Use `KamodThemeHead` from `@kamod-ch/otok-kamod/theme` in layouts when brand presets need a no-flash bootstrap script.
|
|
116
|
+
|
|
117
|
+
## Bundle impact
|
|
118
|
+
|
|
119
|
+
| Import | Client impact |
|
|
120
|
+
| ------------------------------- | -------------------------------------- |
|
|
121
|
+
| `@kamod-ch/ui/button` (subpath) | Only that component |
|
|
122
|
+
| `@kamod-ch/icons/shadcn` | Only imported icons |
|
|
123
|
+
| `@kamod-ch/otok-kamod/signals` | Signals runtime when used |
|
|
124
|
+
| `@kamod-ch/otok-kamod` plugin | Build-time only (Tailwind Vite plugin) |
|
|
125
|
+
|
|
126
|
+
## Separation from Otok core
|
|
127
|
+
|
|
128
|
+
- Otok core has zero Kamod dependencies.
|
|
129
|
+
- Removing Kamod: delete `kamod()` from `otok.config.ts`, uninstall `@kamod-ch/otok-kamod` and UI packages, restore your CSS stack.
|
|
130
|
+
- Other `@kamod-ch/otok-*` plugins (auth, kysely, validation) work with or without `otok-kamod`.
|
|
131
|
+
|
|
132
|
+
## Starters
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
pnpm create otok my-app --template kamod
|
|
136
|
+
pnpm create otok my-saas --template saas
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
See `packages/create-otok/otok-starter-*` in the monorepo.
|
package/dist/css.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { KamodThemePreset } from "./types.js";
|
|
2
|
+
/** CSS `@import` lines for the selected Kamod theme preset. */
|
|
3
|
+
export declare function kamodCssImports(theme?: KamodThemePreset): string;
|
|
4
|
+
/** Minimal app styles layered on Kamod tokens. */
|
|
5
|
+
export declare function kamodBaseStyles(): string;
|
|
6
|
+
export declare function kamodStylesheetContent(theme?: KamodThemePreset): string;
|
|
7
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,KAAK,GAAE,gBAA4B,GAAG,MAAM,CAW3E;AAED,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,MAAM,CAsBxC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,gBAA4B,GAAG,MAAM,CAElF"}
|
package/dist/css.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** CSS `@import` lines for the selected Kamod theme preset. */
|
|
2
|
+
export function kamodCssImports(theme = "default") {
|
|
3
|
+
const lines = ['@import "tailwindcss";'];
|
|
4
|
+
if (theme === "default") {
|
|
5
|
+
lines.push('@import "@kamod-ch/ui/theme.css";');
|
|
6
|
+
return `${lines.join("\n")}\n`;
|
|
7
|
+
}
|
|
8
|
+
lines.push('@import "@kamod-ch/themes/theme.css";');
|
|
9
|
+
lines.push(`@import "@kamod-ch/themes/brands/${theme}.css";`);
|
|
10
|
+
return `${lines.join("\n")}\n`;
|
|
11
|
+
}
|
|
12
|
+
/** Minimal app styles layered on Kamod tokens. */
|
|
13
|
+
export function kamodBaseStyles() {
|
|
14
|
+
return `:root {
|
|
15
|
+
color-scheme: light;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.dark {
|
|
19
|
+
color-scheme: dark;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
body {
|
|
23
|
+
margin: 0;
|
|
24
|
+
min-height: 100vh;
|
|
25
|
+
background: hsl(var(--background));
|
|
26
|
+
color: hsl(var(--foreground));
|
|
27
|
+
font-family:
|
|
28
|
+
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
a {
|
|
32
|
+
color: inherit;
|
|
33
|
+
}
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
36
|
+
export function kamodStylesheetContent(theme = "default") {
|
|
37
|
+
return `${kamodCssImports(theme)}\n${kamodBaseStyles()}\n`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=css.js.map
|
package/dist/css.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,QAA0B,SAAS;IACjE,MAAM,KAAK,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,oCAAoC,KAAK,QAAQ,CAAC,CAAC;IAC9D,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;CAoBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA0B,SAAS;IACxE,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,eAAe,EAAE,IAAI,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ComponentChildren, JSX } from "preact";
|
|
2
|
+
export type FieldErrors = Record<string, string[] | undefined>;
|
|
3
|
+
export interface FormFieldProps {
|
|
4
|
+
name: string;
|
|
5
|
+
label: string;
|
|
6
|
+
type?: JSX.InputHTMLAttributes<HTMLInputElement>["type"];
|
|
7
|
+
defaultValue?: string;
|
|
8
|
+
errors?: string[];
|
|
9
|
+
description?: string;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Single field wired to Otok validation `fieldErrors`. */
|
|
13
|
+
export declare function FormField({ name, label, type, defaultValue, errors, description, required, }: FormFieldProps): JSX.Element;
|
|
14
|
+
export interface FormAlertProps {
|
|
15
|
+
message?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function FormAlert({ message }: FormAlertProps): JSX.Element | null;
|
|
18
|
+
export interface FormActionsProps {
|
|
19
|
+
children?: ComponentChildren;
|
|
20
|
+
submitLabel?: string;
|
|
21
|
+
cancelHref?: string;
|
|
22
|
+
pending?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function FormActions({ children, submitLabel, cancelHref, pending }: FormActionsProps): JSX.Element;
|
|
25
|
+
export interface OtokFormFailure {
|
|
26
|
+
message?: string;
|
|
27
|
+
fieldErrors?: FieldErrors;
|
|
28
|
+
values?: Record<string, string>;
|
|
29
|
+
}
|
|
30
|
+
export declare function readFormFailure(actionData: unknown): OtokFormFailure | undefined;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKrD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,KAAK,EACL,IAAa,EACb,YAAiB,EACjB,MAAM,EACN,WAAW,EACX,QAAQ,GACT,EAAE,cAAc,eAuBhB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,cAAc,sBAUpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAoB,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,gBAAgB,eAiBpG;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAGhF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "preact/jsx-runtime";
|
|
2
|
+
import { Input } from "@kamod-ch/ui/input";
|
|
3
|
+
import { Label } from "@kamod-ch/ui/label";
|
|
4
|
+
import { Button } from "@kamod-ch/ui/button";
|
|
5
|
+
/** Single field wired to Otok validation `fieldErrors`. */
|
|
6
|
+
export function FormField({ name, label, type = "text", defaultValue = "", errors, description, required, }) {
|
|
7
|
+
const invalid = Boolean(errors?.length);
|
|
8
|
+
return (_jsxs("div", { class: "grid gap-2", children: [_jsx(Label, { for: name, children: label }), description ? _jsx("p", { class: "text-sm text-muted-foreground", children: description }) : null, _jsx(Input, { id: name, name: name, type: type, defaultValue: defaultValue, required: required, "aria-invalid": invalid, "aria-describedby": invalid ? `${name}-error` : undefined }), errors?.map((error) => (_jsx("p", { id: `${name}-error`, role: "alert", class: "text-sm text-destructive", children: error }, error)))] }));
|
|
9
|
+
}
|
|
10
|
+
export function FormAlert({ message }) {
|
|
11
|
+
if (!message)
|
|
12
|
+
return null;
|
|
13
|
+
return (_jsx("p", { role: "alert", class: "rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive", children: message }));
|
|
14
|
+
}
|
|
15
|
+
export function FormActions({ children, submitLabel = "Save", cancelHref, pending }) {
|
|
16
|
+
return (_jsx("div", { class: "flex flex-wrap items-center gap-3", children: children ?? (_jsxs(_Fragment, { children: [_jsx(Button, { type: "submit", disabled: pending, "aria-busy": pending, children: pending ? "Saving…" : submitLabel }), cancelHref ? (_jsx("a", { href: cancelHref, class: "text-sm text-muted-foreground hover:text-foreground", children: "Cancel" })) : null] })) }));
|
|
17
|
+
}
|
|
18
|
+
export function readFormFailure(actionData) {
|
|
19
|
+
if (!actionData || typeof actionData !== "object")
|
|
20
|
+
return undefined;
|
|
21
|
+
return actionData;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forms/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAc7C,2DAA2D;AAC3D,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,EACJ,KAAK,EACL,IAAI,GAAG,MAAM,EACb,YAAY,GAAG,EAAE,EACjB,MAAM,EACN,WAAW,EACX,QAAQ,GACO;IACf,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,OAAO,CACL,eAAK,KAAK,EAAC,YAAY,aACrB,KAAC,KAAK,IAAC,GAAG,EAAE,IAAI,YAAG,KAAK,GAAS,EAChC,WAAW,CAAC,CAAC,CAAC,YAAG,KAAK,EAAC,+BAA+B,YAAE,WAAW,GAAK,CAAC,CAAC,CAAC,IAAI,EAChF,KAAC,KAAK,IACJ,EAAE,EAAE,IAAI,EACR,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,kBACJ,OAAO,sBACH,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,GACvD,EACD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACtB,YAAe,EAAE,EAAE,GAAG,IAAI,QAAQ,EAAE,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,0BAA0B,YAC9E,KAAK,IADA,KAAK,CAET,CACL,CAAC,IACE,CACP,CAAC;AACJ,CAAC;AAMD,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,EAAkB;IACnD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CACL,YACE,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,8FAA8F,YAEnG,OAAO,GACN,CACL,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAoB;IACnG,OAAO,CACL,cAAK,KAAK,EAAC,mCAAmC,YAC3C,QAAQ,IAAI,CACX,8BACE,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,OAAO,eAAa,OAAO,YACxD,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,GAC3B,EACR,UAAU,CAAC,CAAC,CAAC,CACZ,YAAG,IAAI,EAAE,UAAU,EAAE,KAAK,EAAC,qDAAqD,uBAE5E,CACL,CAAC,CAAC,CAAC,IAAI,IACP,CACJ,GACG,CACP,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,eAAe,CAAC,UAAmB;IACjD,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpE,OAAO,UAA6B,CAAC;AACvC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default, getKamodPluginOptions, kamodStylesheetContent, normalizeOptions } from "./plugin.js";
|
|
2
|
+
export type { KamodPluginOptions, KamodThemePreset } from "./types.js";
|
|
3
|
+
export { kamodCssImports, kamodBaseStyles, kamodStylesheetContent as buildKamodStylesheet } from "./css.js";
|
|
4
|
+
export { checkKamodVersions, formatVersionIssues, satisfiesMinimum } from "./versions.js";
|
|
5
|
+
export type { VersionIssue } from "./versions.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACvG,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,IAAI,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5G,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC1F,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { default, getKamodPluginOptions, kamodStylesheetContent, normalizeOptions } from "./plugin.js";
|
|
2
|
+
export { kamodCssImports, kamodBaseStyles, kamodStylesheetContent as buildKamodStylesheet } from "./css.js";
|
|
3
|
+
export { checkKamodVersions, formatVersionIssues, satisfiesMinimum } from "./versions.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvG,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,IAAI,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5G,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { kamodStylesheetContent } from "./css.js";
|
|
2
|
+
import { type KamodPluginOptions } from "./types.js";
|
|
3
|
+
declare function normalizeOptions(input: KamodPluginOptions | undefined): Required<KamodPluginOptions>;
|
|
4
|
+
export declare function getKamodPluginOptions(): Required<KamodPluginOptions> | null;
|
|
5
|
+
/**
|
|
6
|
+
* Optional Kamod ecosystem integration for Otok apps.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import kamod from "@kamod-ch/otok-kamod";
|
|
10
|
+
*
|
|
11
|
+
* export default defineConfig({
|
|
12
|
+
* plugins: [kamod({ theme: "default", icons: true, forms: true })],
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export default function kamod(options?: KamodPluginOptions): import("@kamod-ch/otok-config").OtokPlugin<unknown>;
|
|
17
|
+
export { kamodStylesheetContent, normalizeOptions };
|
|
18
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAyB,KAAK,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAenG,iBAAS,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAa7F;AAiBD,wBAAgB,qBAAqB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAE3E;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,uDAoCzD;AAED,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { definePlugin } from "@kamod-ch/otok";
|
|
2
|
+
import { kamodStylesheetContent } from "./css.js";
|
|
3
|
+
import { DEFAULT_KAMOD_OPTIONS } from "./types.js";
|
|
4
|
+
import { checkKamodVersions, formatVersionIssues, readInstalledVersion } from "./versions.js";
|
|
5
|
+
import { createKamodTailwindPlugin } from "./vite/tailwind.js";
|
|
6
|
+
const BRAND_PRESETS = new Set([
|
|
7
|
+
"kamod",
|
|
8
|
+
"shadcn",
|
|
9
|
+
"ocean",
|
|
10
|
+
"sunset",
|
|
11
|
+
"cursor-warm",
|
|
12
|
+
"voltage",
|
|
13
|
+
"watson",
|
|
14
|
+
"professional",
|
|
15
|
+
]);
|
|
16
|
+
function normalizeOptions(input) {
|
|
17
|
+
const theme = input?.theme ?? DEFAULT_KAMOD_OPTIONS.theme;
|
|
18
|
+
if (theme !== "default" && !BRAND_PRESETS.has(theme)) {
|
|
19
|
+
throw new Error(`kamod() theme "${theme}" is invalid. Use "default" or one of: ${[...BRAND_PRESETS].join(", ")}`);
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
theme,
|
|
23
|
+
icons: input?.icons ?? DEFAULT_KAMOD_OPTIONS.icons,
|
|
24
|
+
forms: input?.forms ?? DEFAULT_KAMOD_OPTIONS.forms,
|
|
25
|
+
css: input?.css ?? DEFAULT_KAMOD_OPTIONS.css,
|
|
26
|
+
darkMode: input?.darkMode ?? DEFAULT_KAMOD_OPTIONS.darkMode,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const kamodPluginFactory = definePlugin({
|
|
30
|
+
name: "@kamod-ch/otok-kamod",
|
|
31
|
+
version: "1.0.0",
|
|
32
|
+
schema: {
|
|
33
|
+
parse(input) {
|
|
34
|
+
if (input != null && typeof input !== "object") {
|
|
35
|
+
throw new Error("kamod() options must be an object");
|
|
36
|
+
}
|
|
37
|
+
return normalizeOptions(input);
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
let registeredOptions = null;
|
|
42
|
+
export function getKamodPluginOptions() {
|
|
43
|
+
return registeredOptions;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Optional Kamod ecosystem integration for Otok apps.
|
|
47
|
+
*
|
|
48
|
+
* ```ts
|
|
49
|
+
* import kamod from "@kamod-ch/otok-kamod";
|
|
50
|
+
*
|
|
51
|
+
* export default defineConfig({
|
|
52
|
+
* plugins: [kamod({ theme: "default", icons: true, forms: true })],
|
|
53
|
+
* });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export default function kamod(options) {
|
|
57
|
+
const normalized = normalizeOptions(options);
|
|
58
|
+
registeredOptions = normalized;
|
|
59
|
+
const plugin = kamodPluginFactory(normalized);
|
|
60
|
+
plugin.config = () => {
|
|
61
|
+
const stylesheet = normalized.css.startsWith("/") ? normalized.css : `/${normalized.css}`;
|
|
62
|
+
return {
|
|
63
|
+
theme: normalized.darkMode,
|
|
64
|
+
devStylesheets: [stylesheet],
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
plugin.buildStart = async ({ root }) => {
|
|
68
|
+
const issues = await checkKamodVersions(root);
|
|
69
|
+
if (issues.length > 0) {
|
|
70
|
+
throw new Error(`@kamod-ch/otok-kamod version check failed:\n${formatVersionIssues(issues)}`);
|
|
71
|
+
}
|
|
72
|
+
if (normalized.theme !== "default") {
|
|
73
|
+
const themesVersion = await readInstalledVersion(root, "@kamod-ch/themes");
|
|
74
|
+
if (!themesVersion) {
|
|
75
|
+
throw new Error("otok-kamod: theme preset requires @kamod-ch/themes. Install it:\n pnpm add @kamod-ch/themes");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
plugin.configureVite = async () => createKamodTailwindPlugin();
|
|
80
|
+
plugin.virtualModules = {
|
|
81
|
+
options: () => `export const kamodOptions = ${JSON.stringify(normalized)};`,
|
|
82
|
+
stylesheet: () => `export const kamodStylesheet = ${JSON.stringify(kamodStylesheetContent(normalized.theme))};`,
|
|
83
|
+
};
|
|
84
|
+
return plugin;
|
|
85
|
+
}
|
|
86
|
+
export { kamodStylesheetContent, normalizeOptions };
|
|
87
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAIA,wBAgBG"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defineSetup } from "@kamod-ch/otok";
|
|
2
|
+
import { kamodStylesheetContent } from "./css.js";
|
|
3
|
+
import { DEFAULT_KAMOD_OPTIONS } from "./types.js";
|
|
4
|
+
export default defineSetup(async ({ dryRun }) => {
|
|
5
|
+
const content = kamodStylesheetContent(DEFAULT_KAMOD_OPTIONS.theme);
|
|
6
|
+
if (!dryRun) {
|
|
7
|
+
// Validated path prefix: src/config/
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
changes: [
|
|
11
|
+
{
|
|
12
|
+
kind: "create-file",
|
|
13
|
+
path: "src/config/kamod.css",
|
|
14
|
+
content,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,eAAe,WAAW,CAAC,KAAK,EAAE,EAAE,MAAM,EAAsB,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,sBAAsB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEpE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,qCAAqC;IACvC,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,aAAsB;gBAC5B,IAAI,EAAE,sBAAsB;gBAC5B,OAAO;aACR;SACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
package/dist/signals.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ColorScheme, ThemePresetId } from "@kamod-ch/themes";
|
|
2
|
+
import { getThemeInitScript } from "@kamod-ch/themes";
|
|
3
|
+
export { ThemeProvider, useTheme } from "@kamod-ch/themes";
|
|
4
|
+
export { ThemeToggle } from "@kamod-ch/ui";
|
|
5
|
+
export { getThemeInitScript };
|
|
6
|
+
export type { ColorScheme, ThemePresetId };
|
|
7
|
+
export interface KamodThemeHeadProps {
|
|
8
|
+
defaultPreset?: ThemePresetId;
|
|
9
|
+
defaultScheme?: ColorScheme;
|
|
10
|
+
nonce?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* SSR-safe Kamod theme bootstrap for Otok route `head` exports or layouts.
|
|
14
|
+
* Use when `@kamod-ch/themes` brand presets are enabled (`theme` !== `"default"`).
|
|
15
|
+
*/
|
|
16
|
+
export declare function KamodThemeHead({ defaultPreset, defaultScheme, nonce }: KamodThemeHeadProps): import("preact").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,aAAuB,EAAE,aAAwB,EAAE,KAAK,EAAE,EAAE,mBAAmB,gCAS/G"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "preact/jsx-runtime";
|
|
2
|
+
import { getThemeInitScript } from "@kamod-ch/themes";
|
|
3
|
+
export { ThemeProvider, useTheme } from "@kamod-ch/themes";
|
|
4
|
+
export { ThemeToggle } from "@kamod-ch/ui";
|
|
5
|
+
export { getThemeInitScript };
|
|
6
|
+
/**
|
|
7
|
+
* SSR-safe Kamod theme bootstrap for Otok route `head` exports or layouts.
|
|
8
|
+
* Use when `@kamod-ch/themes` brand presets are enabled (`theme` !== `"default"`).
|
|
9
|
+
*/
|
|
10
|
+
export function KamodThemeHead({ defaultPreset = "kamod", defaultScheme = "system", nonce }) {
|
|
11
|
+
return (_jsx("script", { nonce: nonce, dangerouslySetInnerHTML: {
|
|
12
|
+
__html: getThemeInitScript({ defaultPreset, defaultScheme }),
|
|
13
|
+
} }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAS9B;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,aAAa,GAAG,OAAO,EAAE,aAAa,GAAG,QAAQ,EAAE,KAAK,EAAuB;IAC9G,OAAO,CACL,iBACE,KAAK,EAAE,KAAK,EACZ,uBAAuB,EAAE;YACvB,MAAM,EAAE,kBAAkB,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;SAC7D,GACD,CACH,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Kamod theme presets from `@kamod-ch/themes`. Use `"default"` for `@kamod-ch/ui/theme.css` only. */
|
|
2
|
+
export type KamodThemePreset = "default" | "kamod" | "shadcn" | "ocean" | "sunset" | "cursor-warm" | "voltage" | "watson" | "professional";
|
|
3
|
+
export interface KamodPluginOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Theme preset. `"default"` imports `@kamod-ch/ui/theme.css`.
|
|
6
|
+
* Any other value imports `@kamod-ch/themes` with the matching brand preset.
|
|
7
|
+
*/
|
|
8
|
+
theme?: KamodThemePreset;
|
|
9
|
+
/** Document icon subpath imports; icons stay tree-shaken when imported from `@kamod-ch/icons/*`. */
|
|
10
|
+
icons?: boolean;
|
|
11
|
+
/** Enable `@kamod-ch/otok-kamod/forms` helpers for Otok validation field errors. */
|
|
12
|
+
forms?: boolean;
|
|
13
|
+
/** Project-relative CSS entry. Defaults to `src/style.css`. */
|
|
14
|
+
css?: string;
|
|
15
|
+
/** Enable Otok theme bootstrap (dark mode). Defaults to true. */
|
|
16
|
+
darkMode?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const DEFAULT_KAMOD_OPTIONS: Required<Pick<KamodPluginOptions, "theme" | "icons" | "forms" | "css" | "darkMode">>;
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,aAAa,GACb,SAAS,GACT,QAAQ,GACR,cAAc,CAAC;AAEnB,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,oGAAoG;IACpG,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAC1C,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,CAAC,CAO3E,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAC,MAAM,qBAAqB,GAE9B;IACF,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,eAAe;IACpB,QAAQ,EAAE,IAAI;CACf,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface PackageRange {
|
|
2
|
+
name: string;
|
|
3
|
+
minimum: string;
|
|
4
|
+
optional?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface VersionIssue {
|
|
7
|
+
packageName: string;
|
|
8
|
+
installed?: string;
|
|
9
|
+
required: string;
|
|
10
|
+
message: string;
|
|
11
|
+
}
|
|
12
|
+
declare const CORE_PACKAGES: PackageRange[];
|
|
13
|
+
declare const OPTIONAL_PACKAGES: PackageRange[];
|
|
14
|
+
export declare function satisfiesMinimum(installed: string, minimum: string): boolean;
|
|
15
|
+
export declare function readInstalledVersion(root: string, packageName: string): Promise<string | undefined>;
|
|
16
|
+
export declare function checkKamodVersions(root: string, packages?: PackageRange[]): Promise<VersionIssue[]>;
|
|
17
|
+
export declare function formatVersionIssues(issues: VersionIssue[]): string;
|
|
18
|
+
export { CORE_PACKAGES, OPTIONAL_PACKAGES };
|
|
19
|
+
//# sourceMappingURL=versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../src/versions.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,QAAA,MAAM,aAAa,EAAE,YAAY,EAMhC,CAAC;AAEF,QAAA,MAAM,iBAAiB,EAAE,YAAY,EAKpC,CAAC;AAQF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAS5E;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CASzG;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,YAAY,EAA6C,GAClE,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BzB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAElE;AAED,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC"}
|
package/dist/versions.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const CORE_PACKAGES = [
|
|
4
|
+
{ name: "@kamod-ch/ui", minimum: "1.0.0" },
|
|
5
|
+
{ name: "preact", minimum: "10.26.0" },
|
|
6
|
+
{ name: "@preact/signals", minimum: "2.0.0" },
|
|
7
|
+
{ name: "tailwindcss", minimum: "4.0.0" },
|
|
8
|
+
{ name: "@tailwindcss/vite", minimum: "4.0.0" },
|
|
9
|
+
];
|
|
10
|
+
const OPTIONAL_PACKAGES = [
|
|
11
|
+
{ name: "@kamod-ch/themes", minimum: "0.2.0", optional: true },
|
|
12
|
+
{ name: "@kamod-ch/icons", minimum: "1.0.0", optional: true },
|
|
13
|
+
{ name: "@kamod-ch/signals", minimum: "1.0.0", optional: true },
|
|
14
|
+
{ name: "@kamod-ch/hooks", minimum: "1.0.0", optional: true },
|
|
15
|
+
];
|
|
16
|
+
function parseVersion(value) {
|
|
17
|
+
const match = value.trim().match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
18
|
+
if (!match)
|
|
19
|
+
return null;
|
|
20
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
21
|
+
}
|
|
22
|
+
export function satisfiesMinimum(installed, minimum) {
|
|
23
|
+
const left = parseVersion(installed);
|
|
24
|
+
const right = parseVersion(minimum);
|
|
25
|
+
if (!left || !right)
|
|
26
|
+
return true;
|
|
27
|
+
for (let index = 0; index < 3; index += 1) {
|
|
28
|
+
if (left[index] > right[index])
|
|
29
|
+
return true;
|
|
30
|
+
if (left[index] < right[index])
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
export async function readInstalledVersion(root, packageName) {
|
|
36
|
+
try {
|
|
37
|
+
const pkgPath = join(root, "node_modules", ...packageName.split("/"), "package.json");
|
|
38
|
+
const raw = await readFile(pkgPath, "utf8");
|
|
39
|
+
const pkg = JSON.parse(raw);
|
|
40
|
+
return pkg.version;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function checkKamodVersions(root, packages = [...CORE_PACKAGES, ...OPTIONAL_PACKAGES]) {
|
|
47
|
+
const issues = [];
|
|
48
|
+
for (const entry of packages) {
|
|
49
|
+
const installed = await readInstalledVersion(root, entry.name);
|
|
50
|
+
if (!installed) {
|
|
51
|
+
if (entry.optional)
|
|
52
|
+
continue;
|
|
53
|
+
issues.push({
|
|
54
|
+
packageName: entry.name,
|
|
55
|
+
required: `>=${entry.minimum}`,
|
|
56
|
+
message: `Missing required package "${entry.name}". Install it alongside @kamod-ch/otok-kamod.`,
|
|
57
|
+
});
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (!satisfiesMinimum(installed, entry.minimum)) {
|
|
61
|
+
issues.push({
|
|
62
|
+
packageName: entry.name,
|
|
63
|
+
installed,
|
|
64
|
+
required: `>=${entry.minimum}`,
|
|
65
|
+
message: `Incompatible ${entry.name}@${installed} — @kamod-ch/otok-kamod requires >=${entry.minimum}. ` +
|
|
66
|
+
`Upgrade with your package manager before building.`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return issues;
|
|
71
|
+
}
|
|
72
|
+
export function formatVersionIssues(issues) {
|
|
73
|
+
return issues.map((issue) => `- ${issue.message}`).join("\n");
|
|
74
|
+
}
|
|
75
|
+
export { CORE_PACKAGES, OPTIONAL_PACKAGES };
|
|
76
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../src/versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind.d.ts","sourceRoot":"","sources":["../../src/vite/tailwind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAW5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export async function createKamodTailwindPlugin() {
|
|
2
|
+
try {
|
|
3
|
+
const mod = await import("@tailwindcss/vite");
|
|
4
|
+
return mod.default();
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
throw new Error("otok-kamod: could not load @tailwindcss/vite. " +
|
|
8
|
+
"Install tailwindcss and @tailwindcss/vite in your app:\n" +
|
|
9
|
+
" pnpm add -D tailwindcss @tailwindcss/vite");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=tailwind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind.js","sourceRoot":"","sources":["../../src/vite/tailwind.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,gDAAgD;YAC9C,0DAA0D;YAC1D,6CAA6C,CAChD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kamod-ch/otok-kamod",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Optional Kamod UI integration for Otok — Tailwind, themes, forms, and ecosystem helpers.",
|
|
5
|
+
"homepage": "https://github.com/kamod-ch/otok/tree/main/packages/otok-kamod#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/kamod-ch/otok/issues"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/kamod-ch/otok.git",
|
|
13
|
+
"directory": "packages/otok-kamod"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"default": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./forms": {
|
|
27
|
+
"types": "./dist/forms/index.d.ts",
|
|
28
|
+
"default": "./dist/forms/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./theme": {
|
|
31
|
+
"types": "./dist/theme/index.d.ts",
|
|
32
|
+
"default": "./dist/theme/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./signals": {
|
|
35
|
+
"types": "./dist/signals.d.ts",
|
|
36
|
+
"default": "./dist/signals.js"
|
|
37
|
+
},
|
|
38
|
+
"./css": {
|
|
39
|
+
"types": "./dist/css.d.ts",
|
|
40
|
+
"default": "./dist/css.js"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@kamod-ch/otok": "1.0.0",
|
|
48
|
+
"@kamod-ch/otok-config": "1.0.0",
|
|
49
|
+
"@kamod-ch/otok-test": "1.0.0",
|
|
50
|
+
"@kamod-ch/signals": "^1.0.3",
|
|
51
|
+
"@kamod-ch/themes": "^0.2.1",
|
|
52
|
+
"@kamod-ch/ui": "^1.0.1",
|
|
53
|
+
"@preact/signals": "^2.0.0",
|
|
54
|
+
"@tailwindcss/vite": "^4.2.4",
|
|
55
|
+
"@types/node": "^24.12.2",
|
|
56
|
+
"hono": "^4.13.8",
|
|
57
|
+
"preact": "^10.28.2",
|
|
58
|
+
"tailwindcss": "^4.2.4",
|
|
59
|
+
"typescript": "~6.0.2",
|
|
60
|
+
"vite": "^8.0.10",
|
|
61
|
+
"vitest": "^4.1.2"
|
|
62
|
+
},
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"@kamod-ch/hooks": ">=1.0.0",
|
|
65
|
+
"@kamod-ch/icons": ">=1.0.0",
|
|
66
|
+
"@kamod-ch/otok": ">=0.6.1",
|
|
67
|
+
"@kamod-ch/signals": ">=1.0.0",
|
|
68
|
+
"@kamod-ch/themes": ">=0.2.0",
|
|
69
|
+
"@kamod-ch/ui": ">=1.0.0",
|
|
70
|
+
"@preact/signals": ">=2.0.0",
|
|
71
|
+
"@tailwindcss/vite": ">=4.0.0",
|
|
72
|
+
"hono": ">=4",
|
|
73
|
+
"preact": ">=10.26.0",
|
|
74
|
+
"tailwindcss": ">=4.0.0"
|
|
75
|
+
},
|
|
76
|
+
"peerDependenciesMeta": {
|
|
77
|
+
"@kamod-ch/hooks": {
|
|
78
|
+
"optional": true
|
|
79
|
+
},
|
|
80
|
+
"@kamod-ch/icons": {
|
|
81
|
+
"optional": true
|
|
82
|
+
},
|
|
83
|
+
"@kamod-ch/signals": {
|
|
84
|
+
"optional": true
|
|
85
|
+
},
|
|
86
|
+
"@kamod-ch/themes": {
|
|
87
|
+
"optional": true
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"engines": {
|
|
91
|
+
"node": ">=20"
|
|
92
|
+
},
|
|
93
|
+
"otok": {
|
|
94
|
+
"setup": "./dist/setup.js"
|
|
95
|
+
},
|
|
96
|
+
"scripts": {
|
|
97
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
98
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
99
|
+
"test": "vitest run"
|
|
100
|
+
}
|
|
101
|
+
}
|