akanjs 2.4.2-rc.3 → 3.0.0-alpha.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/base/baseEnv.ts +0 -6
- package/client/cn.ts +52 -0
- package/client/csrTypes.ts +2 -2
- package/client/frameConfig.ts +2 -2
- package/client/index.ts +1 -0
- package/client/types.ts +0 -4
- package/common/index.ts +1 -0
- package/common/isThenable.ts +12 -0
- package/package.json +4 -7
- package/server/akanApp.ts +2 -0
- package/server/systemPageDocument.tsx +12 -12
- package/store/baseSt.ts +2 -2
- package/test/signalTestRuntime.ts +0 -2
- package/types/base/baseEnv.d.ts +0 -2
- package/types/client/cn.d.ts +12 -0
- package/types/client/index.d.ts +1 -0
- package/types/client/types.d.ts +0 -3
- package/types/common/index.d.ts +1 -0
- package/types/common/isThenable.d.ts +9 -0
- package/types/ui/Badge.d.ts +6 -0
- package/types/ui/Button.d.ts +26 -6
- package/types/ui/RecentTime.d.ts +1 -1
- package/types/ui/Signal/Collapse.d.ts +12 -0
- package/types/ui/Signal/style.d.ts +5 -6
- package/types/ui/Switch.d.ts +14 -0
- package/types/ui/Tooltip.d.ts +11 -0
- package/types/ui/UiOverride/Provider.d.ts +6 -5
- package/types/ui/UiOverride/context.d.ts +22 -1
- package/types/ui/UiOverride/index.d.ts +2 -1
- package/types/ui/UiOverride/override.d.ts +7 -6
- package/types/ui/UiOverride/useUiRecipe.d.ts +8 -0
- package/types/ui/index.d.ts +5 -1
- package/types/ui/recipe/badgeRecipe.d.ts +13 -0
- package/types/ui/recipe/buttonRecipe.d.ts +15 -0
- package/types/ui/recipe/factory.d.ts +24 -0
- package/types/ui/recipe/index.d.ts +18 -0
- package/types/ui/recipe/inputRecipe.d.ts +13 -0
- package/types/ui/recipe.d.ts +1 -0
- package/ui/Badge.tsx +17 -0
- package/ui/BottomSheet.tsx +8 -10
- package/ui/Button.tsx +158 -48
- package/ui/Clipboard.tsx +3 -3
- package/ui/Constant/Doc.tsx +108 -65
- package/ui/Constant/Mermaid.tsx +9 -9
- package/ui/Data/CardList.tsx +3 -3
- package/ui/Data/Dashboard.tsx +22 -13
- package/ui/Data/Insight.tsx +6 -6
- package/ui/Data/Item.tsx +49 -34
- package/ui/Data/ListContainer.tsx +11 -7
- package/ui/Data/Pagination.tsx +2 -2
- package/ui/DatePicker.tsx +5 -5
- package/ui/Dialog/Content.tsx +2 -2
- package/ui/Dialog/Modal.tsx +12 -8
- package/ui/Dialog/Provider.tsx +2 -2
- package/ui/DragAction.tsx +2 -2
- package/ui/DraggableList.tsx +10 -5
- package/ui/Dropdown.tsx +33 -26
- package/ui/Empty.tsx +5 -5
- package/ui/Field.tsx +82 -70
- package/ui/Image.tsx +2 -2
- package/ui/Input.tsx +62 -60
- package/ui/Layout/BottomInset.tsx +2 -2
- package/ui/Layout/BottomTab.tsx +5 -5
- package/ui/Layout/Header.tsx +3 -3
- package/ui/Layout/LeftSider.tsx +6 -5
- package/ui/Layout/Navbar.tsx +2 -12
- package/ui/Layout/RightSider.tsx +10 -8
- package/ui/Layout/Sider.tsx +5 -4
- package/ui/Layout/Template.tsx +2 -2
- package/ui/Layout/TopInset.tsx +2 -2
- package/ui/Layout/Unit.tsx +2 -2
- package/ui/Layout/View.tsx +2 -2
- package/ui/Layout/Zone.tsx +2 -2
- package/ui/Link/Back.tsx +2 -2
- package/ui/Link/Close.tsx +2 -2
- package/ui/Link/CsrLink.tsx +6 -4
- package/ui/Link/Lang.tsx +2 -2
- package/ui/Link/SsrLink.tsx +6 -5
- package/ui/Load/Page.tsx +1 -1
- package/ui/Load/Pagination.tsx +2 -2
- package/ui/Load/Units.tsx +2 -4
- package/ui/Load/View.tsx +2 -2
- package/ui/Loading/Area.tsx +4 -2
- package/ui/Loading/Button.tsx +2 -2
- package/ui/Loading/Input.tsx +2 -2
- package/ui/Loading/ProgressBar.tsx +2 -2
- package/ui/Loading/Skeleton.tsx +6 -6
- package/ui/Loading/Spin.tsx +2 -2
- package/ui/Menu.tsx +29 -27
- package/ui/Model/Edit.tsx +3 -3
- package/ui/Model/EditModal.tsx +5 -5
- package/ui/Model/EditWrapper.tsx +2 -2
- package/ui/Model/New.tsx +3 -3
- package/ui/Model/NewWrapper_Client.tsx +2 -2
- package/ui/Model/Remove.tsx +5 -4
- package/ui/Model/RemoveWrapper.tsx +2 -2
- package/ui/Model/SureToRemove.tsx +7 -6
- package/ui/Model/View.tsx +2 -2
- package/ui/Model/ViewEditModal.tsx +20 -21
- package/ui/Model/ViewWrapper.tsx +2 -2
- package/ui/More.tsx +2 -2
- package/ui/ObjectId.tsx +9 -3
- package/ui/Pagination.tsx +14 -11
- package/ui/Popconfirm.tsx +20 -11
- package/ui/Radio.tsx +4 -4
- package/ui/RecentTime.tsx +30 -83
- package/ui/Refresh.tsx +1 -1
- package/ui/ScreenNavigator.tsx +2 -2
- package/ui/Select.tsx +21 -23
- package/ui/Signal/Arg.tsx +20 -17
- package/ui/Signal/Collapse.tsx +29 -0
- package/ui/Signal/Doc.tsx +27 -22
- package/ui/Signal/Listener.tsx +3 -3
- package/ui/Signal/Message.tsx +31 -17
- package/ui/Signal/Object.tsx +13 -8
- package/ui/Signal/PubSub.tsx +26 -16
- package/ui/Signal/Request.tsx +3 -2
- package/ui/Signal/Response.tsx +5 -4
- package/ui/Signal/RestApi.tsx +27 -17
- package/ui/Signal/style.ts +16 -16
- package/ui/Switch.tsx +62 -0
- package/ui/System/CSR.tsx +40 -35
- package/ui/System/Client.tsx +2 -2
- package/ui/System/DevModeToggle.tsx +10 -12
- package/ui/System/Messages.tsx +14 -16
- package/ui/System/Reconnect.tsx +7 -7
- package/ui/System/SSR.tsx +25 -21
- package/ui/System/SelectLanguage.tsx +24 -28
- package/ui/System/ThemeToggle.tsx +38 -45
- package/ui/Tab/Menu.tsx +20 -18
- package/ui/Tab/Panel.tsx +3 -3
- package/ui/Tab/Provider.tsx +2 -2
- package/ui/Table.tsx +11 -8
- package/ui/ToggleSelect.tsx +14 -18
- package/ui/Tooltip.tsx +55 -0
- package/ui/UiOverride/Provider.tsx +10 -6
- package/ui/UiOverride/context.ts +22 -2
- package/ui/UiOverride/index.ts +8 -1
- package/ui/UiOverride/override.ts +7 -6
- package/ui/UiOverride/useUiRecipe.ts +15 -0
- package/ui/Unauthorized.tsx +5 -5
- package/ui/index.ts +16 -0
- package/ui/recipe/badgeRecipe.ts +23 -0
- package/ui/recipe/buttonRecipe.ts +32 -0
- package/ui/recipe/factory.ts +32 -0
- package/ui/recipe/index.ts +18 -0
- package/ui/recipe/inputRecipe.ts +13 -0
- package/ui/styles.css +150 -21
package/base/baseEnv.ts
CHANGED
|
@@ -13,8 +13,6 @@ export interface BaseEnv {
|
|
|
13
13
|
appName: string;
|
|
14
14
|
environment: Environment;
|
|
15
15
|
operationMode: "local" | "edge" | "cloud" | "module";
|
|
16
|
-
tunnelUsername: string;
|
|
17
|
-
tunnelPassword: string;
|
|
18
16
|
databaseMode?: DatabaseMode;
|
|
19
17
|
}
|
|
20
18
|
export type BackendEnv = BaseEnv & {
|
|
@@ -87,16 +85,12 @@ export const getEnv = (): ClientEnv => {
|
|
|
87
85
|
const environment = (process.env.AKAN_PUBLIC_ENV ?? "debug") as BaseEnv["environment"];
|
|
88
86
|
const operationMode = (process.env.AKAN_PUBLIC_OPERATION_MODE ??
|
|
89
87
|
(environment === "local" ? "local" : "cloud")) as BaseEnv["operationMode"];
|
|
90
|
-
const tunnelUsername = process.env.SSH_TUNNEL_USERNAME ?? "root";
|
|
91
|
-
const tunnelPassword = process.env.SSH_TUNNEL_PASSWORD ?? repoName;
|
|
92
88
|
const baseEnv: BaseEnv = {
|
|
93
89
|
repoName,
|
|
94
90
|
serveDomain,
|
|
95
91
|
appName,
|
|
96
92
|
environment,
|
|
97
93
|
operationMode,
|
|
98
|
-
tunnelUsername,
|
|
99
|
-
tunnelPassword,
|
|
100
94
|
databaseMode: process.env.AKAN_DATABASE_MODE as DatabaseMode | undefined,
|
|
101
95
|
} as const;
|
|
102
96
|
const side = typeof window === "undefined" ? "server" : "client";
|
package/client/cn.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type ClassNameValue, extendTailwindMerge } from "tailwind-merge";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Akan's semantic color tokens beyond tailwind-merge's built-in Tailwind palette.
|
|
5
|
+
* Registering them under `theme.color` teaches tailwind-merge that `bg-*`/`text-*`/
|
|
6
|
+
* `border-*`/… built from these names belong to the same conflict group, so
|
|
7
|
+
* `cn("bg-primary", "bg-open")` correctly resolves to `"bg-open"` instead of keeping both.
|
|
8
|
+
*/
|
|
9
|
+
export const colorTokens = [
|
|
10
|
+
"background",
|
|
11
|
+
"foreground",
|
|
12
|
+
"primary",
|
|
13
|
+
"primary-foreground",
|
|
14
|
+
"secondary",
|
|
15
|
+
"secondary-foreground",
|
|
16
|
+
"accent",
|
|
17
|
+
"accent-foreground",
|
|
18
|
+
"muted",
|
|
19
|
+
"muted-foreground",
|
|
20
|
+
"destructive",
|
|
21
|
+
"destructive-foreground",
|
|
22
|
+
"card",
|
|
23
|
+
"card-foreground",
|
|
24
|
+
"popover",
|
|
25
|
+
"popover-foreground",
|
|
26
|
+
"info",
|
|
27
|
+
"info-foreground",
|
|
28
|
+
"success",
|
|
29
|
+
"success-foreground",
|
|
30
|
+
"warning",
|
|
31
|
+
"warning-foreground",
|
|
32
|
+
"neutral",
|
|
33
|
+
"neutral-foreground",
|
|
34
|
+
"open",
|
|
35
|
+
"open-foreground",
|
|
36
|
+
"border",
|
|
37
|
+
"input",
|
|
38
|
+
"ring",
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const twMerge = extendTailwindMerge({
|
|
42
|
+
extend: {
|
|
43
|
+
theme: {
|
|
44
|
+
color: colorTokens,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
/** The one class-combining function: joins strings/arrays/conditional parts (`cond && "x"`) and
|
|
50
|
+
* resolves Tailwind conflicts with a shared tailwind-merge instance that knows Akan's semantic
|
|
51
|
+
* color tokens. clsx-style object syntax (`{ x: cond }`) is not supported — write `cond && "x"`. */
|
|
52
|
+
export const cn = (...inputs: ClassNameValue[]) => twMerge(...inputs);
|
package/client/csrTypes.ts
CHANGED
|
@@ -270,8 +270,8 @@ export const defaultPageState: PageState = {
|
|
|
270
270
|
gesture: true,
|
|
271
271
|
cache: false,
|
|
272
272
|
ssr: "stream",
|
|
273
|
-
topSafeAreaColor: "var(--color-
|
|
274
|
-
bottomSafeAreaColor: "var(--color-
|
|
273
|
+
topSafeAreaColor: "var(--color-background, Canvas)",
|
|
274
|
+
bottomSafeAreaColor: "var(--color-background, Canvas)",
|
|
275
275
|
};
|
|
276
276
|
|
|
277
277
|
export interface Location {
|
package/client/frameConfig.ts
CHANGED
|
@@ -152,8 +152,8 @@ export function resolvePageState({
|
|
|
152
152
|
: (config.gesture ?? false),
|
|
153
153
|
cache: config.cache ?? false,
|
|
154
154
|
ssr: config.ssr ?? "stream",
|
|
155
|
-
topSafeAreaColor: config.topSafeAreaColor ?? "var(
|
|
156
|
-
bottomSafeAreaColor: config.bottomSafeAreaColor ?? "var(
|
|
155
|
+
topSafeAreaColor: config.topSafeAreaColor ?? "var(color-background, Canvas)",
|
|
156
|
+
bottomSafeAreaColor: config.bottomSafeAreaColor ?? "var(color-background, Canvas)",
|
|
157
157
|
};
|
|
158
158
|
}
|
|
159
159
|
|
package/client/index.ts
CHANGED
package/client/types.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import type { BaseInsight } from "akanjs/constant";
|
|
2
2
|
import type { FetchInitForm, SliceMeta } from "akanjs/fetch";
|
|
3
|
-
import { type ClassValue, clsx as clsxLib } from "clsx";
|
|
4
3
|
import type { ReactElement, ReactNode } from "react";
|
|
5
4
|
|
|
6
|
-
/** Composes class names with the shared clsx implementation. */
|
|
7
|
-
export const clsx = (...args: ClassValue[]) => clsxLib(...args);
|
|
8
|
-
|
|
9
5
|
export type ReactFontStyle = "normal" | "italic" | "oblique";
|
|
10
6
|
export type ReactFontDisplay = "auto" | "block" | "swap" | "fallback" | "optional";
|
|
11
7
|
export type ReactFontCategory = "monospace" | "sans-serif" | "serif" | "display";
|
package/common/index.ts
CHANGED
|
@@ -15,6 +15,7 @@ export { isDayjs } from "./isDayjs";
|
|
|
15
15
|
export { isEmail } from "./isEmail";
|
|
16
16
|
export { isPhoneNumber } from "./isPhoneNumber";
|
|
17
17
|
export { isQueryEqual } from "./isQueryEqual";
|
|
18
|
+
export { isThenable } from "./isThenable";
|
|
18
19
|
export { isValidDate } from "./isValidDate";
|
|
19
20
|
export { decodeJwtPayload } from "./jwtDecode";
|
|
20
21
|
export { Logger, type LoggerSink, type LoggerSinkEntry, type LogLevel } from "./Logger";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a value is awaitable. Duck-typed rather than `instanceof Promise` so a thenable produced by a
|
|
3
|
+
* different realm or promise implementation still counts — a same-realm check silently misses those.
|
|
4
|
+
*
|
|
5
|
+
* `<Button>` uses this to decide whether a click handler is asynchronous: a handler that returns a
|
|
6
|
+
* thenable gets the pending/success states, a plain one renders as an ordinary button. That makes the
|
|
7
|
+
* distinction impossible to forget, unlike an explicit flag.
|
|
8
|
+
*/
|
|
9
|
+
export const isThenable = (value: unknown): value is PromiseLike<unknown> =>
|
|
10
|
+
!!value &&
|
|
11
|
+
(typeof value === "object" || typeof value === "function") &&
|
|
12
|
+
typeof Reflect.get(value, "then") === "function";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "akanjs",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-alpha.0",
|
|
4
4
|
"sourceType": "module",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -178,10 +178,11 @@
|
|
|
178
178
|
}
|
|
179
179
|
},
|
|
180
180
|
"dependencies": {
|
|
181
|
-
"clsx": "^2.1.1",
|
|
182
181
|
"dayjs": "^1.11.20",
|
|
183
182
|
"immer": "^11.1.8",
|
|
184
|
-
"sharp": "^0.34.5"
|
|
183
|
+
"sharp": "^0.34.5",
|
|
184
|
+
"tailwind-merge": "^3.3.1",
|
|
185
|
+
"tailwind-variants": "^3.3.0"
|
|
185
186
|
},
|
|
186
187
|
"peerDependencies": {
|
|
187
188
|
"@capacitor-community/contacts": "^7.2.0",
|
|
@@ -210,7 +211,6 @@
|
|
|
210
211
|
"chance": "^1.1.13",
|
|
211
212
|
"cordova-plugin-purchase": "^13.16.0",
|
|
212
213
|
"croner": "^10.0.1",
|
|
213
|
-
"daisyui": "5.5.23",
|
|
214
214
|
"firebase": "^12.13.0",
|
|
215
215
|
"ioredis": "^5.10.1",
|
|
216
216
|
"mermaid": "^11.15.0",
|
|
@@ -308,9 +308,6 @@
|
|
|
308
308
|
"croner": {
|
|
309
309
|
"optional": true
|
|
310
310
|
},
|
|
311
|
-
"daisyui": {
|
|
312
|
-
"optional": true
|
|
313
|
-
},
|
|
314
311
|
"firebase": {
|
|
315
312
|
"optional": true
|
|
316
313
|
},
|
package/server/akanApp.ts
CHANGED
|
@@ -39,19 +39,19 @@ export const SYSTEM_PAGE_STATUS_COPY = {
|
|
|
39
39
|
} as const;
|
|
40
40
|
|
|
41
41
|
const FALLBACK_STYLE = `
|
|
42
|
-
:root { color-scheme: dark; --akan-primary: #ff493b; --akan-secondary: #2b2e33; --akan-accent: #d1a23b; --akan-
|
|
43
|
-
body { margin: 0; min-height: 100vh; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--akan-
|
|
42
|
+
:root { color-scheme: dark; --akan-primary: #ff493b; --akan-secondary: #2b2e33; --akan-accent: #d1a23b; --akan-foreground: #ffffff; --akan-background: #1a1a1a; --akan-base-200: #2a2a2a; --akan-error: #f02020; }
|
|
43
|
+
body { margin: 0; min-height: 100vh; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--akan-background); color: var(--akan-foreground); }
|
|
44
44
|
a { color: inherit; }
|
|
45
|
-
.akan-system-page { min-height: 100vh; display: grid; place-items: center; padding: 32px 18px; box-sizing: border-box; background: radial-gradient(circle at top left, rgba(255, 73, 59, 0.16), transparent 34%), linear-gradient(135deg, var(--akan-
|
|
45
|
+
.akan-system-page { min-height: 100vh; display: grid; place-items: center; padding: 32px 18px; box-sizing: border-box; background: radial-gradient(circle at top left, rgba(255, 73, 59, 0.16), transparent 34%), linear-gradient(135deg, var(--akan-background), #111); }
|
|
46
46
|
.akan-system-card { width: min(720px, 100%); border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 32px; background: linear-gradient(145deg, rgba(42, 42, 42, 0.96), rgba(43, 46, 51, 0.78)); box-shadow: 0 24px 80px rgba(0, 0, 0, 0.36); padding: clamp(28px, 6vw, 56px); }
|
|
47
47
|
.akan-system-status { margin: 0 0 18px; font-weight: 800; font-size: clamp(4rem, 18vw, 8rem); line-height: 0.85; letter-spacing: -0.08em; color: var(--akan-primary); }
|
|
48
48
|
.akan-system-eyebrow { margin: 0 0 10px; color: var(--akan-accent); font-size: 0.78rem; font-weight: 800; letter-spacing: 0.18em; text-transform: uppercase; }
|
|
49
|
-
.akan-system-title { margin: 0; max-width: 12ch; font-size: clamp(2rem, 7vw, 4rem); line-height: 0.95; letter-spacing: -0.055em; color: var(--akan-
|
|
49
|
+
.akan-system-title { margin: 0; max-width: 12ch; font-size: clamp(2rem, 7vw, 4rem); line-height: 0.95; letter-spacing: -0.055em; color: var(--akan-foreground); }
|
|
50
50
|
.akan-system-description { margin: 22px 0 0; max-width: 56ch; color: rgba(255, 255, 255, 0.76); font-size: 1.05rem; line-height: 1.75; }
|
|
51
51
|
.akan-system-path { margin: 22px 0 0; overflow-wrap: anywhere; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 16px; background: rgba(26, 26, 26, 0.72); padding: 12px 14px; color: rgba(255, 255, 255, 0.72); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.88rem; }
|
|
52
52
|
.akan-system-actions { margin-top: 30px; display: flex; flex-wrap: wrap; gap: 12px; }
|
|
53
|
-
.akan-system-action { display: inline-flex; min-height: 44px; align-items: center; justify-content: center; border: 1px solid var(--akan-primary); border-radius: 999px; background: var(--akan-primary); box-shadow: 0 12px 34px rgba(255, 73, 59, 0.26); color: var(--akan-
|
|
54
|
-
.akan-system-secondary { border: 1px solid rgba(255, 255, 255, 0.12); background: var(--akan-secondary); color: var(--akan-
|
|
53
|
+
.akan-system-action { display: inline-flex; min-height: 44px; align-items: center; justify-content: center; border: 1px solid var(--akan-primary); border-radius: 999px; background: var(--akan-primary); box-shadow: 0 12px 34px rgba(255, 73, 59, 0.26); color: var(--akan-foreground); padding: 0 18px; font-weight: 800; text-decoration: none; }
|
|
54
|
+
.akan-system-secondary { border: 1px solid rgba(255, 255, 255, 0.12); background: var(--akan-secondary); color: var(--akan-foreground); }
|
|
55
55
|
.akan-system-details { margin-top: 28px; max-height: 260px; overflow: auto; border-radius: 18px; background: rgba(26, 26, 26, 0.82); border: 1px solid rgba(240, 32, 32, 0.22); padding: 16px; color: rgba(255, 255, 255, 0.78); font-size: 0.82rem; line-height: 1.55; white-space: pre-wrap; }
|
|
56
56
|
`;
|
|
57
57
|
|
|
@@ -73,9 +73,9 @@ export function createSystemPageDocument(options: SystemPageOptions): ReactNode
|
|
|
73
73
|
<style data-akan-system-page>{FALLBACK_STYLE}</style>
|
|
74
74
|
</head>
|
|
75
75
|
<body>
|
|
76
|
-
<main className="akan-system-page min-h-screen bg-
|
|
76
|
+
<main className="akan-system-page min-h-screen bg-background text-foreground">
|
|
77
77
|
<section
|
|
78
|
-
className="akan-system-card rounded-3xl border border-
|
|
78
|
+
className="akan-system-card rounded-3xl border border-foreground/10 bg-foreground/4 p-8 shadow-2xl backdrop-blur-xl"
|
|
79
79
|
aria-labelledby="akan-system-title"
|
|
80
80
|
>
|
|
81
81
|
<p className="akan-system-status text-primary">{copy.status}</p>
|
|
@@ -83,15 +83,15 @@ export function createSystemPageDocument(options: SystemPageOptions): ReactNode
|
|
|
83
83
|
<h1 id="akan-system-title" className="akan-system-title font-black">
|
|
84
84
|
{copy.title}
|
|
85
85
|
</h1>
|
|
86
|
-
<p className="akan-system-description text-
|
|
87
|
-
<p className="akan-system-path border border-
|
|
86
|
+
<p className="akan-system-description text-foreground/70">{copy.description}</p>
|
|
87
|
+
<p className="akan-system-path border border-foreground/10 bg-muted/50" aria-label="Requested path">
|
|
88
88
|
{options.pathname}
|
|
89
89
|
</p>
|
|
90
90
|
<div className="akan-system-actions">
|
|
91
|
-
<a className="akan-system-action
|
|
91
|
+
<a className="akan-system-action" href={options.homeHref}>
|
|
92
92
|
{copy.actionLabel}
|
|
93
93
|
</a>
|
|
94
|
-
<a className="akan-system-action akan-system-secondary
|
|
94
|
+
<a className="akan-system-action akan-system-secondary" href={options.pathname}>
|
|
95
95
|
Try again
|
|
96
96
|
</a>
|
|
97
97
|
</div>
|
package/store/baseSt.ts
CHANGED
|
@@ -45,8 +45,8 @@ export class BaseStore extends store("base" as const, () => ({
|
|
|
45
45
|
gesture: true,
|
|
46
46
|
cache: false,
|
|
47
47
|
ssr: "stream",
|
|
48
|
-
topSafeAreaColor: "var(--color-
|
|
49
|
-
bottomSafeAreaColor: "var(--color-
|
|
48
|
+
topSafeAreaColor: "var(--color-background, Canvas)",
|
|
49
|
+
bottomSafeAreaColor: "var(--color-background, Canvas)",
|
|
50
50
|
} as PageState,
|
|
51
51
|
devMode: false,
|
|
52
52
|
deviceToken: "" as string,
|
|
@@ -93,8 +93,6 @@ export const setupSignalTestTarget = async <Fetch = FetchProxy>(
|
|
|
93
93
|
appName: name,
|
|
94
94
|
environment: "testing",
|
|
95
95
|
operationMode: "local",
|
|
96
|
-
tunnelUsername: process.env.SSH_TUNNEL_USERNAME ?? "username",
|
|
97
|
-
tunnelPassword: process.env.SSH_TUNNEL_PASSWORD ?? process.env.AKAN_PUBLIC_REPO_NAME ?? "password",
|
|
98
96
|
};
|
|
99
97
|
TestServer.applyProcessEnv(env, resolvedOptions);
|
|
100
98
|
|
package/types/base/baseEnv.d.ts
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ClassNameValue } from "tailwind-merge";
|
|
2
|
+
/**
|
|
3
|
+
* Akan's semantic color tokens beyond tailwind-merge's built-in Tailwind palette.
|
|
4
|
+
* Registering them under `theme.color` teaches tailwind-merge that `bg-*`/`text-*`/
|
|
5
|
+
* `border-*`/… built from these names belong to the same conflict group, so
|
|
6
|
+
* `cn("bg-primary", "bg-open")` correctly resolves to `"bg-open"` instead of keeping both.
|
|
7
|
+
*/
|
|
8
|
+
export declare const colorTokens: string[];
|
|
9
|
+
/** The one class-combining function: joins strings/arrays/conditional parts (`cond && "x"`) and
|
|
10
|
+
* resolves Tailwind conflicts with a shared tailwind-merge instance that knows Akan's semantic
|
|
11
|
+
* color tokens. clsx-style object syntax (`{ x: cond }`) is not supported — write `cond && "x"`. */
|
|
12
|
+
export declare const cn: (...inputs: ClassNameValue[]) => string;
|
package/types/client/index.d.ts
CHANGED
package/types/client/types.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { BaseInsight } from "akanjs/constant";
|
|
2
2
|
import type { FetchInitForm, SliceMeta } from "akanjs/fetch";
|
|
3
|
-
import { type ClassValue } from "clsx";
|
|
4
3
|
import type { ReactElement, ReactNode } from "react";
|
|
5
|
-
/** Composes class names with the shared clsx implementation. */
|
|
6
|
-
export declare const clsx: (...args: ClassValue[]) => string;
|
|
7
4
|
export type ReactFontStyle = "normal" | "italic" | "oblique";
|
|
8
5
|
export type ReactFontDisplay = "auto" | "block" | "swap" | "fallback" | "optional";
|
|
9
6
|
export type ReactFontCategory = "monospace" | "sans-serif" | "serif" | "display";
|
package/types/common/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export { isDayjs } from "./isDayjs.d.ts";
|
|
|
11
11
|
export { isEmail } from "./isEmail.d.ts";
|
|
12
12
|
export { isPhoneNumber } from "./isPhoneNumber.d.ts";
|
|
13
13
|
export { isQueryEqual } from "./isQueryEqual.d.ts";
|
|
14
|
+
export { isThenable } from "./isThenable.d.ts";
|
|
14
15
|
export { isValidDate } from "./isValidDate.d.ts";
|
|
15
16
|
export { decodeJwtPayload } from "./jwtDecode.d.ts";
|
|
16
17
|
export { Logger, type LoggerSink, type LoggerSinkEntry, type LogLevel } from "./Logger.d.ts";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a value is awaitable. Duck-typed rather than `instanceof Promise` so a thenable produced by a
|
|
3
|
+
* different realm or promise implementation still counts — a same-realm check silently misses those.
|
|
4
|
+
*
|
|
5
|
+
* `<Button>` uses this to decide whether a click handler is asynchronous: a handler that returns a
|
|
6
|
+
* thenable gets the pending/success states, a plain one renders as an ordinary button. That makes the
|
|
7
|
+
* distinction impossible to forget, unlike an explicit flag.
|
|
8
|
+
*/
|
|
9
|
+
export declare const isThenable: (value: unknown) => value is PromiseLike<unknown>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { HTMLAttributes } from "react";
|
|
2
|
+
import { type BadgeVariants, badgeRecipe } from "./recipe.d.ts";
|
|
3
|
+
export { badgeRecipe, type BadgeVariants };
|
|
4
|
+
export type BadgeProps = HTMLAttributes<HTMLSpanElement> & BadgeVariants;
|
|
5
|
+
/** Status/label pill. Route-overridable via `page/**\/_overrides.tsx` (slot `Badge`). */
|
|
6
|
+
export declare const Badge: import("react").ComponentType<BadgeProps>;
|
package/types/ui/Button.d.ts
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
1
|
import type React from "react";
|
|
2
2
|
import { type ButtonHTMLAttributes } from "react";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { type ButtonVariants, buttonRecipe } from "./recipe.d.ts";
|
|
4
|
+
export { buttonRecipe, type ButtonVariants };
|
|
5
|
+
export type ButtonProps<Result> = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onClick"> & ButtonVariants & {
|
|
6
|
+
/**
|
|
7
|
+
* Click handler. Returning a promise is what opts this button into the async states — a plain
|
|
8
|
+
* synchronous handler renders as an ordinary button with no spinner. Call onError to show the
|
|
9
|
+
* localized error state without throwing.
|
|
10
|
+
*/
|
|
11
|
+
onClick?: (e: React.MouseEvent<HTMLButtonElement>, { onError }: {
|
|
6
12
|
onError: (error: string) => void;
|
|
7
13
|
}) => Promise<Result> | Result;
|
|
8
14
|
/** Called after the button briefly enters success state. */
|
|
9
15
|
onSuccess?: (result: Result) => void;
|
|
16
|
+
/**
|
|
17
|
+
* How the pending/success indicator is drawn. Both modes keep the button's box fixed — CSS cannot
|
|
18
|
+
* animate an auto width, so a resizing button can only ever snap.
|
|
19
|
+
*
|
|
20
|
+
* `hold` (default) fades a bare indicator over the children, so the box stays exactly the children's
|
|
21
|
+
* size. `replace` cross-fades to a labelled indicator ("Processing…"); both labels stay stacked in the
|
|
22
|
+
* DOM, so the box is the wider of the two from the start and still never moves — at the cost of an idle
|
|
23
|
+
* button that is as wide as its longest state.
|
|
24
|
+
*/
|
|
25
|
+
loadingMode?: "hold" | "replace";
|
|
26
|
+
/** Whether a failed action renders its message under the button. Off leaves it to the framework toast. */
|
|
27
|
+
showError?: boolean;
|
|
10
28
|
};
|
|
11
29
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
30
|
+
* Button whose async states are driven by the handler's return value: return a promise and it shows a
|
|
31
|
+
* pending indicator, then a brief success state; return nothing and it behaves as a plain button. Resolves
|
|
32
|
+
* to a route-scoped override when a `page/**\/_overrides.tsx` in the route's ancestry declares one,
|
|
33
|
+
* otherwise renders {@link DefaultButton}. The public generic signature is preserved, so
|
|
34
|
+
* `<Button<Todo> onSuccess={(r: Todo) => …} />` still infers.
|
|
15
35
|
*/
|
|
16
36
|
export declare const Button: <Result = unknown>(props: ButtonProps<Result>) => React.ReactElement<ButtonProps<Result>, string | React.JSXElementConstructor<any>>;
|
package/types/ui/RecentTime.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface RecentTimeProps {
|
|
|
6
6
|
breakUnit?: Intl.RelativeTimeFormatUnit;
|
|
7
7
|
/** Use compact automatic formatting or always include date and time. */
|
|
8
8
|
format?: "full" | "auto";
|
|
9
|
-
/** Additional classes for the
|
|
9
|
+
/** Additional classes for the trigger span. */
|
|
10
10
|
className?: string;
|
|
11
11
|
}
|
|
12
12
|
export declare const RecentTime: ({ date, breakUnit, format, className }: RecentTimeProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Signal 도큐먼트/테스트 카드의 접이식 컨테이너.
|
|
4
|
+
* daisyui `collapse`(checkbox+CSS) → 네이티브 `<details>/<summary>`. 플러그인 의존 없음.
|
|
5
|
+
*/
|
|
6
|
+
export declare const SignalCollapse: ({ summary, children, open, className, contentClassName, }: {
|
|
7
|
+
summary: ReactNode;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
open?: boolean;
|
|
10
|
+
className?: string;
|
|
11
|
+
contentClassName?: string;
|
|
12
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -2,14 +2,13 @@ export declare const signalUi: {
|
|
|
2
2
|
sectionTitle: string;
|
|
3
3
|
sectionDescription: string;
|
|
4
4
|
sectionPanel: string;
|
|
5
|
-
endpointCard: string;
|
|
6
|
-
endpointContent: string;
|
|
7
5
|
tablePanel: string;
|
|
6
|
+
tableClass: string;
|
|
8
7
|
inputRow: string;
|
|
9
8
|
inputLabel: string;
|
|
10
9
|
codePanel: string;
|
|
11
10
|
};
|
|
12
|
-
export declare const getEndpointBadgeClassName: (type: string) =>
|
|
13
|
-
export declare const getGuardBadgeClassName: (guard: string) =>
|
|
14
|
-
export declare const getStatusBadgeClassName: (status: string) =>
|
|
15
|
-
export declare const getStatusTextareaClassName: (status: string) => "" | "
|
|
11
|
+
export declare const getEndpointBadgeClassName: (type: string) => string;
|
|
12
|
+
export declare const getGuardBadgeClassName: (guard: string) => string;
|
|
13
|
+
export declare const getStatusBadgeClassName: (status: string) => string;
|
|
14
|
+
export declare const getStatusTextareaClassName: (status: string) => "" | "pointer-events-none opacity-50" | "border-destructive text-destructive" | "border-primary";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SwitchProps {
|
|
2
|
+
checked?: boolean;
|
|
3
|
+
defaultChecked?: boolean;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
onChange?: (checked: boolean) => void;
|
|
6
|
+
className?: string;
|
|
7
|
+
/** 켜짐 상태 색. daisyui `toggle-accent/toggle-primary` 대체. */
|
|
8
|
+
variant?: "primary" | "accent" | "success";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 순수 Tailwind 스위치 (`<button role="switch">`). daisyui `toggle`/`swap` 대체.
|
|
12
|
+
* `<button>` 이라 포커스·Space/Enter 토글이 네이티브로 제공된다. controlled/uncontrolled 모두 지원.
|
|
13
|
+
*/
|
|
14
|
+
export declare const Switch: ({ checked, defaultChecked, disabled, onChange, className, variant, }: SwitchProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export interface TooltipProps {
|
|
3
|
+
/** 툴팁에 표시할 내용. 비어 있으면 트리거만 그대로 렌더한다. */
|
|
4
|
+
content?: ReactNode;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
side?: "top" | "right" | "bottom" | "left";
|
|
7
|
+
className?: string;
|
|
8
|
+
/** 색상 변형. daisyui `tooltip-primary/info` 대체. */
|
|
9
|
+
variant?: "default" | "primary" | "info";
|
|
10
|
+
}
|
|
11
|
+
export declare const Tooltip: import("react").ComponentType<TooltipProps>;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
-
import { type
|
|
2
|
+
import { type AkanUiOverrideManifest } from "./context.d.ts";
|
|
3
3
|
export interface UiOverrideProviderProps {
|
|
4
|
-
/** Override
|
|
5
|
-
value?:
|
|
4
|
+
/** Override manifest for this subtree; merged over any ancestor overrides. */
|
|
5
|
+
value?: AkanUiOverrideManifest;
|
|
6
6
|
children?: ReactNode;
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Supplies route-scoped UI overrides. Merges its own `value` over the overrides
|
|
10
10
|
* inherited from ancestors so the closest declaration wins, matching nested
|
|
11
|
-
* `_overrides.tsx` resolution. `
|
|
12
|
-
*
|
|
11
|
+
* `_overrides.tsx` resolution. The `recipes` map merges per-slot (a child that
|
|
12
|
+
* swaps only `button` keeps an ancestor's `badge` swap). `routeTreeBuilder`
|
|
13
|
+
* mounts one of these per route node once the `_overrides.tsx` convention is wired.
|
|
13
14
|
*/
|
|
14
15
|
export declare const UiOverrideProvider: ({ value, children }: UiOverrideProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type ComponentType } from "react";
|
|
2
|
+
import type { ClassNameValue as ClassValue } from "tailwind-merge";
|
|
3
|
+
import type { BadgeProps } from "../Badge.d.ts";
|
|
2
4
|
import type { ButtonProps } from "../Button.d.ts";
|
|
3
5
|
import type { DatePickerProps, RangePickerProps, TimePickerProps } from "../DatePicker.d.ts";
|
|
4
6
|
import type { DropdownProps } from "../Dropdown.d.ts";
|
|
@@ -14,9 +16,11 @@ import type { ModalProps } from "../Modal.d.ts";
|
|
|
14
16
|
import type { PaginationProps } from "../Pagination.d.ts";
|
|
15
17
|
import type { PopconfirmProps } from "../Popconfirm.d.ts";
|
|
16
18
|
import type { ItemProps as RadioItemProps, RadioProps } from "../Radio.d.ts";
|
|
19
|
+
import type { BadgeVariants, ButtonVariants } from "../recipe.d.ts";
|
|
17
20
|
import type { SelectProps } from "../Select.d.ts";
|
|
18
21
|
import type { TableProps } from "../Table.d.ts";
|
|
19
22
|
import type { MultiProps as ToggleSelectMultiProps, ToggleSelectProps } from "../ToggleSelect.d.ts";
|
|
23
|
+
import type { TooltipProps } from "../Tooltip.d.ts";
|
|
20
24
|
import type { UnauthorizedProps } from "../Unauthorized.d.ts";
|
|
21
25
|
/**
|
|
22
26
|
* Registry of framework UI components an app may replace per-route through a
|
|
@@ -31,6 +35,7 @@ import type { UnauthorizedProps } from "../Unauthorized.d.ts";
|
|
|
31
35
|
* before they can be listed here without losing call-site typing.
|
|
32
36
|
*/
|
|
33
37
|
export interface AkanUiOverrides {
|
|
38
|
+
Badge: ComponentType<BadgeProps>;
|
|
34
39
|
Modal: ComponentType<ModalProps>;
|
|
35
40
|
Empty: ComponentType<EmptyProps>;
|
|
36
41
|
Pagination: ComponentType<PaginationProps>;
|
|
@@ -38,6 +43,7 @@ export interface AkanUiOverrides {
|
|
|
38
43
|
Dropdown: ComponentType<DropdownProps>;
|
|
39
44
|
Table: ComponentType<TableProps>;
|
|
40
45
|
Menu: ComponentType<MenuProps>;
|
|
46
|
+
Tooltip: ComponentType<TooltipProps>;
|
|
41
47
|
Unauthorized: ComponentType<UnauthorizedProps>;
|
|
42
48
|
Button: ComponentType<ButtonProps<unknown>>;
|
|
43
49
|
Select: ComponentType<SelectProps<string | number | boolean | null | undefined>>;
|
|
@@ -64,9 +70,24 @@ export interface AkanUiOverrides {
|
|
|
64
70
|
export type AkanUiOverrideName = keyof AkanUiOverrides;
|
|
65
71
|
/** Prop contract an app-authored Modal override must satisfy. */
|
|
66
72
|
export type AkanModalComponent = AkanUiOverrides["Modal"];
|
|
73
|
+
/**
|
|
74
|
+
* Registry of framework recipe slots an app may swap through the same `_overrides.tsx`
|
|
75
|
+
* manifest: `override({ recipes: { button: neonButtonRecipe } })`. A recipe swap changes
|
|
76
|
+
* only the className factory — the component's structure/behavior (async states, focus,
|
|
77
|
+
* a11y) is untouched. Each replacement must accept the framework recipe's full variant
|
|
78
|
+
* contract, so every call site keeps working.
|
|
79
|
+
*/
|
|
80
|
+
export interface AkanUiRecipes {
|
|
81
|
+
button: (variants?: ButtonVariants, className?: ClassValue) => string;
|
|
82
|
+
badge: (variants?: BadgeVariants, className?: ClassValue) => string;
|
|
83
|
+
}
|
|
84
|
+
/** Shape of an `_overrides.tsx` manifest: component slots plus an optional recipe-slot map. */
|
|
85
|
+
export type AkanUiOverrideManifest = Partial<AkanUiOverrides> & {
|
|
86
|
+
recipes?: Partial<AkanUiRecipes>;
|
|
87
|
+
};
|
|
67
88
|
/**
|
|
68
89
|
* Holds the override map for the current route subtree. Empty at the root, then
|
|
69
90
|
* merged (child wins) by each nested `UiOverrideProvider`, mirroring how nested
|
|
70
91
|
* `_layout.tsx` / `_overrides.tsx` stack down the route tree.
|
|
71
92
|
*/
|
|
72
|
-
export declare const UiOverrideContext: import("react").Context<
|
|
93
|
+
export declare const UiOverrideContext: import("react").Context<AkanUiOverrideManifest>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export type { AkanModalComponent, AkanUiOverrideName, AkanUiOverrides } from "./context.d.ts";
|
|
1
|
+
export type { AkanModalComponent, AkanUiOverrideManifest, AkanUiOverrideName, AkanUiOverrides, AkanUiRecipes, } from "./context.d.ts";
|
|
2
2
|
export { createOverridable } from "./createOverridable.d.ts";
|
|
3
3
|
export { override } from "./override.d.ts";
|
|
4
4
|
export { UiOverrideProvider, type UiOverrideProviderProps } from "./Provider.d.ts";
|
|
5
5
|
export { useUiOverride } from "./useUiOverride.d.ts";
|
|
6
|
+
export { useUiRecipe } from "./useUiRecipe.d.ts";
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AkanUiOverrideManifest } from "./context.d.ts";
|
|
2
2
|
/**
|
|
3
3
|
* Typed manifest builder for a `page/_overrides.tsx` file:
|
|
4
4
|
*
|
|
5
5
|
* ```tsx
|
|
6
|
-
* export default override({ Modal: BrandModal });
|
|
6
|
+
* export default override({ Modal: BrandModal, recipes: { button: neonButtonRecipe } });
|
|
7
7
|
* ```
|
|
8
8
|
*
|
|
9
|
-
* It type-checks each binding against that slot's public
|
|
9
|
+
* It type-checks each binding against that slot's public contract and rejects unknown slot names as
|
|
10
10
|
* excess properties — so the manifest is validated at compile time and app components need no annotation of
|
|
11
|
-
* their own.
|
|
12
|
-
* sites
|
|
11
|
+
* their own. Component keys are the framework component names (`Modal`), matching `useUiOverride` and the
|
|
12
|
+
* `<Modal>` call sites; the optional `recipes` map swaps recipe slots (look only, behavior untouched),
|
|
13
|
+
* matching `useUiRecipe` and the recipe names in `AkanUiRecipes`.
|
|
13
14
|
*
|
|
14
15
|
* It is a pure, server-safe identity function (no React, no `createContext`), so the manifest needs no
|
|
15
16
|
* `"use client"` directive. The framework generates a `"use client"` wrapper layout that reads this map and
|
|
16
17
|
* mounts the override provider around the route subtree (see `writeGeneratedOverridesLayoutFile`).
|
|
17
18
|
*/
|
|
18
|
-
export declare const override: (overrides:
|
|
19
|
+
export declare const override: (overrides: AkanUiOverrideManifest) => AkanUiOverrideManifest;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AkanUiRecipes } from "./context.d.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the active recipe swap for a framework recipe slot in the current route
|
|
4
|
+
* subtree, or `undefined` when no `_overrides.tsx` in the ancestry declares one.
|
|
5
|
+
* Framework components consume it as `const recipe = useUiRecipe("button") ?? buttonRecipe;`
|
|
6
|
+
* so an app can restyle every instance app/route-wide without touching behavior.
|
|
7
|
+
*/
|
|
8
|
+
export declare const useUiRecipe: <K extends keyof AkanUiRecipes>(name: K) => AkanUiRecipes[K] | undefined;
|
package/types/ui/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { animated } from "./animated.d.ts";
|
|
2
|
+
export { Badge } from "./Badge.d.ts";
|
|
2
3
|
export { BottomSheet, type BottomSheetRef } from "./BottomSheet.d.ts";
|
|
3
4
|
export { Button } from "./Button.d.ts";
|
|
4
5
|
export { ClientSide } from "./ClientSide.d.ts";
|
|
@@ -34,12 +35,15 @@ export { Portal } from "./Portal.d.ts";
|
|
|
34
35
|
export { Radio } from "./Radio.d.ts";
|
|
35
36
|
export { RecentTime } from "./RecentTime.d.ts";
|
|
36
37
|
export { Refresh } from "./Refresh.d.ts";
|
|
38
|
+
export { type BadgeVariants, type ButtonVariants, badgeRecipe, buttonRecipe, type InputSurfaceVariants, inputRecipe, recipe, tv, } from "./recipe.d.ts";
|
|
37
39
|
export { ScreenNavigator } from "./ScreenNavigator.d.ts";
|
|
38
40
|
export { Select } from "./Select.d.ts";
|
|
39
41
|
export { Signal } from "./Signal.d.ts";
|
|
42
|
+
export { Switch, type SwitchProps } from "./Switch.d.ts";
|
|
40
43
|
export { System, type WebAppManifest } from "./System.d.ts";
|
|
41
44
|
export { Tab } from "./Tab.d.ts";
|
|
42
45
|
export { Table } from "./Table.d.ts";
|
|
43
46
|
export { ToggleSelect } from "./ToggleSelect.d.ts";
|
|
44
|
-
export {
|
|
47
|
+
export { Tooltip, type TooltipProps } from "./Tooltip.d.ts";
|
|
48
|
+
export { type AkanModalComponent, type AkanUiOverrideManifest, type AkanUiOverrideName, type AkanUiOverrides, type AkanUiRecipes, createOverridable, override, UiOverrideProvider, type UiOverrideProviderProps, useUiOverride, useUiRecipe, } from "./UiOverride.d.ts";
|
|
45
49
|
export { Unauthorized } from "./Unauthorized.d.ts";
|