@bysages/solid 0.2.1 → 0.2.3
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/dist/ai-response-B_586r27.mjs +139 -0
- package/dist/chevron-GWEoEYdO.mjs +9 -0
- package/dist/components/accordion/index.d.mts +7 -0
- package/dist/components/accordion/index.mjs +10 -0
- package/dist/components/affix/index.d.mts +20 -0
- package/dist/components/affix/index.mjs +35 -0
- package/dist/components/ai/index.d.mts +2 -0
- package/dist/components/ai/index.mjs +69 -0
- package/dist/components/ai-action/index.d.mts +13 -0
- package/dist/components/ai-action/index.mjs +27 -0
- package/dist/components/ai-attachments/index.d.mts +20 -0
- package/dist/components/ai-attachments/index.mjs +98 -0
- package/dist/components/ai-message/index.d.mts +13 -0
- package/dist/components/ai-message/index.mjs +24 -0
- package/dist/components/ai-prompt-input/index.d.mts +45 -0
- package/dist/components/ai-prompt-input/index.mjs +136 -0
- package/dist/components/ai-reasoning/index.d.mts +13 -0
- package/dist/components/ai-reasoning/index.mjs +34 -0
- package/dist/components/ai-response/index.d.mts +20 -0
- package/dist/components/ai-response/index.mjs +2 -0
- package/dist/components/ai-source/index.d.mts +13 -0
- package/dist/components/ai-source/index.mjs +36 -0
- package/dist/components/ai-suggestion/index.d.mts +13 -0
- package/dist/components/ai-suggestion/index.mjs +22 -0
- package/dist/components/ai-tool/index.d.mts +23 -0
- package/dist/components/ai-tool/index.mjs +78 -0
- package/dist/components/alert/index.d.mts +22 -0
- package/dist/components/alert/index.mjs +92 -0
- package/dist/components/angle-slider/index.d.mts +15 -0
- package/dist/components/angle-slider/index.mjs +18 -0
- package/dist/components/aspect-ratio/index.d.mts +10 -0
- package/dist/components/aspect-ratio/index.mjs +25 -0
- package/dist/components/autocomplete/index.d.mts +21 -0
- package/dist/components/autocomplete/index.mjs +75 -0
- package/dist/components/avatar/index.d.mts +20 -0
- package/dist/components/avatar/index.mjs +15 -0
- package/dist/components/avatar-group/index.d.mts +11 -0
- package/dist/components/avatar-group/index.mjs +22 -0
- package/dist/components/back-top/index.d.mts +29 -0
- package/dist/components/back-top/index.mjs +89 -0
- package/dist/components/badge/index.d.mts +10 -0
- package/dist/components/badge/index.mjs +25 -0
- package/dist/components/banner/index.d.mts +24 -0
- package/dist/components/banner/index.mjs +71 -0
- package/dist/components/breadcrumb/index.d.mts +11 -0
- package/dist/components/breadcrumb/index.mjs +43 -0
- package/dist/components/button/index.d.mts +15 -0
- package/dist/components/button/index.mjs +45 -0
- package/dist/components/button-group/index.d.mts +23 -0
- package/dist/components/button-group/index.mjs +40 -0
- package/dist/components/calendar/index.d.mts +17 -0
- package/dist/components/calendar/index.mjs +197 -0
- package/dist/components/card/index.d.mts +11 -0
- package/dist/components/card/index.mjs +33 -0
- package/dist/components/carousel/index.d.mts +9 -0
- package/dist/components/carousel/index.mjs +12 -0
- package/dist/components/cascade-select/index.d.mts +31 -0
- package/dist/components/cascade-select/index.mjs +265 -0
- package/dist/components/checkbox/index.d.mts +15 -0
- package/dist/components/checkbox/index.mjs +18 -0
- package/dist/components/checkbox-group/index.d.mts +28 -0
- package/dist/components/checkbox-group/index.mjs +99 -0
- package/dist/components/chip/index.d.mts +12 -0
- package/dist/components/chip/index.mjs +34 -0
- package/dist/components/client-only/index.d.mts +2 -0
- package/dist/components/client-only/index.mjs +2 -0
- package/dist/components/clipboard/index.d.mts +16 -0
- package/dist/components/clipboard/index.mjs +19 -0
- package/dist/components/collapsible/index.d.mts +7 -0
- package/dist/components/collapsible/index.mjs +10 -0
- package/dist/components/collection/index.d.mts +2 -0
- package/dist/components/collection/index.mjs +2 -0
- package/dist/components/color-picker/index.d.mts +19 -0
- package/dist/components/color-picker/index.mjs +18 -0
- package/dist/components/combobox/index.d.mts +17 -0
- package/dist/components/combobox/index.mjs +18 -0
- package/dist/components/command/index.d.mts +43 -0
- package/dist/components/command/index.mjs +237 -0
- package/dist/components/comment/index.d.mts +17 -0
- package/dist/components/comment/index.mjs +86 -0
- package/dist/components/config-provider/index.d.mts +48 -0
- package/dist/components/config-provider/index.mjs +65 -0
- package/dist/components/container/index.d.mts +13 -0
- package/dist/components/container/index.mjs +25 -0
- package/dist/components/date-input/index.d.mts +15 -0
- package/dist/components/date-input/index.mjs +18 -0
- package/dist/components/date-picker/index.d.mts +17 -0
- package/dist/components/date-picker/index.mjs +18 -0
- package/dist/components/descriptions/index.d.mts +18 -0
- package/dist/components/descriptions/index.mjs +42 -0
- package/dist/components/dialog/index.d.mts +9 -0
- package/dist/components/dialog/index.mjs +11 -0
- package/dist/components/download-trigger/index.d.mts +2 -0
- package/dist/components/download-trigger/index.mjs +2 -0
- package/dist/components/drawer/index.d.mts +9 -0
- package/dist/components/drawer/index.mjs +12 -0
- package/dist/components/dynamic-input/index.d.mts +30 -0
- package/dist/components/dynamic-input/index.mjs +116 -0
- package/dist/components/editable/index.d.mts +15 -0
- package/dist/components/editable/index.mjs +18 -0
- package/dist/components/ellipsis/index.d.mts +10 -0
- package/dist/components/ellipsis/index.mjs +29 -0
- package/dist/components/empty/index.d.mts +10 -0
- package/dist/components/empty/index.mjs +31 -0
- package/dist/components/field/index.d.mts +8 -0
- package/dist/components/field/index.mjs +11 -0
- package/dist/components/fieldset/index.d.mts +7 -0
- package/dist/components/fieldset/index.mjs +10 -0
- package/dist/components/file-upload/index.d.mts +17 -0
- package/dist/components/file-upload/index.mjs +18 -0
- package/dist/components/float-button/index.d.mts +61 -0
- package/dist/components/float-button/index.mjs +128 -0
- package/dist/components/floating-panel/index.d.mts +9 -0
- package/dist/components/floating-panel/index.mjs +12 -0
- package/dist/components/focus-trap/index.d.mts +2 -0
- package/dist/components/focus-trap/index.mjs +2 -0
- package/dist/components/form/index.d.mts +2 -0
- package/dist/components/form/index.mjs +110 -0
- package/dist/components/format/index.d.mts +9 -0
- package/dist/components/format/index.mjs +10 -0
- package/dist/components/frame/index.d.mts +10 -0
- package/dist/components/frame/index.mjs +12 -0
- package/dist/components/grid/index.d.mts +13 -0
- package/dist/components/grid/index.mjs +44 -0
- package/dist/components/highlight/index.d.mts +7 -0
- package/dist/components/highlight/index.mjs +11 -0
- package/dist/components/hover-card/index.d.mts +7 -0
- package/dist/components/hover-card/index.mjs +10 -0
- package/dist/components/icon/index.d.mts +19 -0
- package/dist/components/icon/index.mjs +53 -0
- package/dist/components/image/index.d.mts +17 -0
- package/dist/components/image/index.mjs +69 -0
- package/dist/components/image-cropper/index.d.mts +8 -0
- package/dist/components/image-cropper/index.mjs +11 -0
- package/dist/components/image-viewer/index.d.mts +19 -0
- package/dist/components/image-viewer/index.mjs +143 -0
- package/dist/components/input/index.d.mts +16 -0
- package/dist/components/input/index.mjs +42 -0
- package/dist/components/input-group/index.d.mts +18 -0
- package/dist/components/input-group/index.mjs +40 -0
- package/dist/components/json-tree-view/index.d.mts +7 -0
- package/dist/components/json-tree-view/index.mjs +10 -0
- package/dist/components/kbd/index.d.mts +6 -0
- package/dist/components/kbd/index.mjs +17 -0
- package/dist/components/layout/index.d.mts +60 -0
- package/dist/components/layout/index.mjs +192 -0
- package/dist/components/link/index.d.mts +10 -0
- package/dist/components/link/index.mjs +25 -0
- package/dist/components/list/index.d.mts +26 -0
- package/dist/components/list/index.mjs +92 -0
- package/dist/components/listbox/index.d.mts +17 -0
- package/dist/components/listbox/index.mjs +19 -0
- package/dist/components/marquee/index.d.mts +7 -0
- package/dist/components/marquee/index.mjs +10 -0
- package/dist/components/masonry/index.d.mts +11 -0
- package/dist/components/masonry/index.mjs +36 -0
- package/dist/components/mentions/index.d.mts +2 -0
- package/dist/components/mentions/index.mjs +3 -0
- package/dist/components/menu/index.d.mts +13 -0
- package/dist/components/menu/index.mjs +38 -0
- package/dist/components/menubar/index.d.mts +32 -0
- package/dist/components/menubar/index.mjs +82 -0
- package/dist/components/meter/index.d.mts +21 -0
- package/dist/components/meter/index.mjs +95 -0
- package/dist/components/navigation-menu/index.d.mts +8 -0
- package/dist/components/navigation-menu/index.mjs +11 -0
- package/dist/components/number-input/index.d.mts +15 -0
- package/dist/components/number-input/index.mjs +18 -0
- package/dist/components/page-header/index.d.mts +11 -0
- package/dist/components/page-header/index.mjs +34 -0
- package/dist/components/pagination/index.d.mts +17 -0
- package/dist/components/pagination/index.mjs +18 -0
- package/dist/components/password-input/index.d.mts +15 -0
- package/dist/components/password-input/index.mjs +18 -0
- package/dist/components/pin-input/index.d.mts +14 -0
- package/dist/components/pin-input/index.mjs +18 -0
- package/dist/components/popconfirm/index.d.mts +17 -0
- package/dist/components/popconfirm/index.mjs +78 -0
- package/dist/components/popover/index.d.mts +8 -0
- package/dist/components/popover/index.mjs +11 -0
- package/dist/components/presence/index.d.mts +2 -0
- package/dist/components/presence/index.mjs +2 -0
- package/dist/components/progress/index.d.mts +15 -0
- package/dist/components/progress/index.mjs +18 -0
- package/dist/components/progress-group/index.d.mts +22 -0
- package/dist/components/progress-group/index.mjs +77 -0
- package/dist/components/qr-code/index.d.mts +8 -0
- package/dist/components/qr-code/index.mjs +11 -0
- package/dist/components/radio-group/index.d.mts +15 -0
- package/dist/components/radio-group/index.mjs +18 -0
- package/dist/components/rating-group/index.d.mts +15 -0
- package/dist/components/rating-group/index.mjs +18 -0
- package/dist/components/scroll-area/index.d.mts +7 -0
- package/dist/components/scroll-area/index.mjs +10 -0
- package/dist/components/segment-group/index.d.mts +17 -0
- package/dist/components/segment-group/index.mjs +23 -0
- package/dist/components/select/index.d.mts +17 -0
- package/dist/components/select/index.mjs +18 -0
- package/dist/components/separator/index.d.mts +11 -0
- package/dist/components/separator/index.mjs +29 -0
- package/dist/components/signature-pad/index.d.mts +8 -0
- package/dist/components/signature-pad/index.mjs +11 -0
- package/dist/components/skeleton/index.d.mts +7 -0
- package/dist/components/skeleton/index.mjs +17 -0
- package/dist/components/slider/index.d.mts +15 -0
- package/dist/components/slider/index.mjs +18 -0
- package/dist/components/spinner/index.d.mts +9 -0
- package/dist/components/spinner/index.mjs +28 -0
- package/dist/components/split-button/index.d.mts +36 -0
- package/dist/components/split-button/index.mjs +123 -0
- package/dist/components/splitter/index.d.mts +7 -0
- package/dist/components/splitter/index.mjs +10 -0
- package/dist/components/stack/index.d.mts +11 -0
- package/dist/components/stack/index.mjs +47 -0
- package/dist/components/stat/index.d.mts +17 -0
- package/dist/components/stat/index.mjs +46 -0
- package/dist/components/steps/index.d.mts +18 -0
- package/dist/components/steps/index.mjs +18 -0
- package/dist/components/swap/index.d.mts +8 -0
- package/dist/components/swap/index.mjs +11 -0
- package/dist/components/switch/index.d.mts +15 -0
- package/dist/components/switch/index.mjs +18 -0
- package/dist/components/table/index.d.mts +77 -0
- package/dist/components/table/index.mjs +740 -0
- package/dist/components/tabs/index.d.mts +17 -0
- package/dist/components/tabs/index.mjs +18 -0
- package/dist/components/tags-input/index.d.mts +16 -0
- package/dist/components/tags-input/index.mjs +18 -0
- package/dist/components/textarea/index.d.mts +14 -0
- package/dist/components/textarea/index.mjs +37 -0
- package/dist/components/timeline/index.d.mts +9 -0
- package/dist/components/timeline/index.mjs +29 -0
- package/dist/components/timer/index.d.mts +8 -0
- package/dist/components/timer/index.mjs +11 -0
- package/dist/components/toast/index.d.mts +11 -0
- package/dist/components/toast/index.mjs +13 -0
- package/dist/components/toc/index.d.mts +7 -0
- package/dist/components/toc/index.mjs +10 -0
- package/dist/components/toggle/index.d.mts +7 -0
- package/dist/components/toggle/index.mjs +10 -0
- package/dist/components/toggle-group/index.d.mts +14 -0
- package/dist/components/toggle-group/index.mjs +18 -0
- package/dist/components/tooltip/index.d.mts +7 -0
- package/dist/components/tooltip/index.mjs +10 -0
- package/dist/components/tour/index.d.mts +11 -0
- package/dist/components/tour/index.mjs +13 -0
- package/dist/components/transfer/index.d.mts +24 -0
- package/dist/components/transfer/index.mjs +166 -0
- package/dist/components/tree-select/index.d.mts +28 -0
- package/dist/components/tree-select/index.mjs +245 -0
- package/dist/components/tree-view/index.d.mts +18 -0
- package/dist/components/tree-view/index.mjs +19 -0
- package/dist/components/typography/index.d.mts +11 -0
- package/dist/components/typography/index.mjs +34 -0
- package/dist/components/watermark/index.d.mts +17 -0
- package/dist/components/watermark/index.mjs +71 -0
- package/dist/index-B1xiJ5ki.d.mts +1811 -0
- package/dist/index-B4XS2n2y.d.mts +13411 -0
- package/dist/index-DDX7x8aT.d.mts +95 -0
- package/dist/index.d.mts +128 -15019
- package/dist/index.mjs +128 -5887
- package/dist/mentions-xbI6vJAP.mjs +257 -0
- package/package.json +77 -3
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
2
|
+
import { effect, insert, mergeProps, setAttribute, spread, template } from "solid-js/web";
|
|
3
|
+
import { splitProps } from "solid-js";
|
|
4
|
+
import { getIcon } from "@bysages/icons";
|
|
5
|
+
//#region src/components/icon/index.tsx
|
|
6
|
+
var _tmpl$ = /*#__PURE__*/ template(`<span>`);
|
|
7
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<svg fill=currentColor aria-hidden=true>`);
|
|
8
|
+
function Icon(props) {
|
|
9
|
+
injectComponentStyle("icon");
|
|
10
|
+
const [own, rest] = splitProps(props, [
|
|
11
|
+
"size",
|
|
12
|
+
"label",
|
|
13
|
+
"name",
|
|
14
|
+
"children"
|
|
15
|
+
]);
|
|
16
|
+
const glyph = own.name && own.children == null ? getIcon(own.name) : void 0;
|
|
17
|
+
if (own.name && own.children == null && !glyph) console.error(`[icons] unknown icon name "${own.name}" — extend packages/icons/icons.config.json and rerun the generator`);
|
|
18
|
+
return (() => {
|
|
19
|
+
var _el$ = _tmpl$();
|
|
20
|
+
spread(_el$, mergeProps(rest, {
|
|
21
|
+
get role() {
|
|
22
|
+
return own.label != null ? "img" : void 0;
|
|
23
|
+
},
|
|
24
|
+
get ["aria-label"]() {
|
|
25
|
+
return own.label;
|
|
26
|
+
},
|
|
27
|
+
get ["aria-hidden"]() {
|
|
28
|
+
return own.label != null ? void 0 : "true";
|
|
29
|
+
},
|
|
30
|
+
"data-scope": "icon",
|
|
31
|
+
"data-part": "root",
|
|
32
|
+
get ["data-size"]() {
|
|
33
|
+
return own.size ?? "inherit";
|
|
34
|
+
}
|
|
35
|
+
}), false, true);
|
|
36
|
+
insert(_el$, () => own.children ?? (glyph ? (() => {
|
|
37
|
+
var _el$2 = _tmpl$2();
|
|
38
|
+
effect((_p$) => {
|
|
39
|
+
var _v$ = `0 0 ${glyph.width ?? 24} ${glyph.height ?? 24}`, _v$2 = glyph.body;
|
|
40
|
+
_v$ !== _p$.e && setAttribute(_el$2, "viewBox", _p$.e = _v$);
|
|
41
|
+
_v$2 !== _p$.t && (_el$2.innerHTML = _p$.t = _v$2);
|
|
42
|
+
return _p$;
|
|
43
|
+
}, {
|
|
44
|
+
e: void 0,
|
|
45
|
+
t: void 0
|
|
46
|
+
});
|
|
47
|
+
return _el$2;
|
|
48
|
+
})() : null));
|
|
49
|
+
return _el$;
|
|
50
|
+
})();
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { Icon };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { JSX } from "solid-js";
|
|
2
|
+
//#region src/components/image/index.d.ts
|
|
3
|
+
/** A framed picture: while the source loads, the frame keeps the
|
|
4
|
+
* skeleton's breath; the picture dissolves in when it lands; a broken
|
|
5
|
+
* source leaves the `fallback` prop — or the placeholder glyph when the
|
|
6
|
+
* caller has nothing local to say. The frame's size is the consumer's
|
|
7
|
+
* to give. */
|
|
8
|
+
export interface ImageProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
9
|
+
src: string;
|
|
10
|
+
alt?: string;
|
|
11
|
+
fit?: "cover" | "contain" | "fill" | "none";
|
|
12
|
+
loading?: "lazy" | "eager";
|
|
13
|
+
/** What a broken source leaves instead of the picture. */
|
|
14
|
+
fallback?: JSX.Element;
|
|
15
|
+
}
|
|
16
|
+
export declare function Image(props: ImageProps): JSX.Element;
|
|
17
|
+
//#endregion
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
2
|
+
import { createComponent, effect, insert, mergeProps, setAttribute, spread, template } from "solid-js/web";
|
|
3
|
+
import { Show, createEffect, createSignal, on, splitProps } from "solid-js";
|
|
4
|
+
//#region src/components/image/index.tsx
|
|
5
|
+
var _tmpl$ = /*#__PURE__*/ template(`<svg><rect x=3 y=4 width=18 height=16 rx=1.5></svg>`, false, true, false);
|
|
6
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<svg><circle cx=9 cy=10 r=1.5></svg>`, false, true, false);
|
|
7
|
+
var _tmpl$3 = /*#__PURE__*/ template(`<svg><path d="m5.5 17.5 4.5-5 3 3.5 2.5-3 3 4.5"></svg>`, false, true, false);
|
|
8
|
+
var _tmpl$4 = /*#__PURE__*/ template(`<div data-scope=image data-part=fallback>`);
|
|
9
|
+
var _tmpl$5 = /*#__PURE__*/ template(`<figure><img data-scope=image data-part=img decoding=async>`, true, false, false);
|
|
10
|
+
/** The mark for a source that never arrived: a quiet mountain-and-sun,
|
|
11
|
+
* drawn in the stylesheet's stroke and hidden from the reader. */
|
|
12
|
+
function placeholderGlyph() {
|
|
13
|
+
return [
|
|
14
|
+
_tmpl$(),
|
|
15
|
+
_tmpl$2(),
|
|
16
|
+
_tmpl$3()
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
function Image(props) {
|
|
20
|
+
injectComponentStyle("image");
|
|
21
|
+
const [own, rest] = splitProps(props, [
|
|
22
|
+
"src",
|
|
23
|
+
"alt",
|
|
24
|
+
"fit",
|
|
25
|
+
"loading",
|
|
26
|
+
"fallback"
|
|
27
|
+
]);
|
|
28
|
+
const [state, setState] = createSignal("loading");
|
|
29
|
+
createEffect(on(() => own.src, () => setState("loading")));
|
|
30
|
+
return (() => {
|
|
31
|
+
var _el$4 = _tmpl$5(), _el$5 = _el$4.firstChild;
|
|
32
|
+
spread(_el$4, mergeProps(rest, {
|
|
33
|
+
"data-scope": "image",
|
|
34
|
+
"data-part": "root",
|
|
35
|
+
get ["data-state"]() {
|
|
36
|
+
return state();
|
|
37
|
+
},
|
|
38
|
+
get ["data-fit"]() {
|
|
39
|
+
return own.fit ?? "cover";
|
|
40
|
+
}
|
|
41
|
+
}), false, true);
|
|
42
|
+
_el$5.addEventListener("error", () => setState("error"));
|
|
43
|
+
_el$5.addEventListener("load", () => setState("loaded"));
|
|
44
|
+
insert(_el$4, createComponent(Show, {
|
|
45
|
+
get when() {
|
|
46
|
+
return state() === "error";
|
|
47
|
+
},
|
|
48
|
+
get children() {
|
|
49
|
+
var _el$6 = _tmpl$4();
|
|
50
|
+
insert(_el$6, () => own.fallback ?? placeholderGlyph());
|
|
51
|
+
return _el$6;
|
|
52
|
+
}
|
|
53
|
+
}), null);
|
|
54
|
+
effect((_p$) => {
|
|
55
|
+
var _v$ = own.src, _v$2 = own.alt ?? "", _v$3 = own.loading ?? "lazy";
|
|
56
|
+
_v$ !== _p$.e && setAttribute(_el$5, "src", _p$.e = _v$);
|
|
57
|
+
_v$2 !== _p$.t && setAttribute(_el$5, "alt", _p$.t = _v$2);
|
|
58
|
+
_v$3 !== _p$.a && setAttribute(_el$5, "loading", _p$.a = _v$3);
|
|
59
|
+
return _p$;
|
|
60
|
+
}, {
|
|
61
|
+
e: void 0,
|
|
62
|
+
t: void 0,
|
|
63
|
+
a: void 0
|
|
64
|
+
});
|
|
65
|
+
return _el$4;
|
|
66
|
+
})();
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { Image };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ImageCropper as ImageCropper$1 } from "@ark-ui/solid/image-cropper";
|
|
2
|
+
//#region src/components/image-cropper/index.d.ts
|
|
3
|
+
/** Ark's ImageCropper, dressed in the paper-and-ink system: a rounded vessel
|
|
4
|
+
* holding the photograph, one lit selection window framed by light hairlines.
|
|
5
|
+
* The API is Ark's own — Root, Viewport, Image, Selection, Handle, Grid,
|
|
6
|
+
* Context. */
|
|
7
|
+
export declare const ImageCropper: typeof ImageCropper$1;
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
2
|
+
import { ImageCropper as ImageCropper$1 } from "@ark-ui/solid/image-cropper";
|
|
3
|
+
//#region src/components/image-cropper/index.ts
|
|
4
|
+
/** Ark's ImageCropper, dressed in the paper-and-ink system: a rounded vessel
|
|
5
|
+
* holding the photograph, one lit selection window framed by light hairlines.
|
|
6
|
+
* The API is Ark's own — Root, Viewport, Image, Selection, Handle, Grid,
|
|
7
|
+
* Context. */
|
|
8
|
+
const ImageCropper = ImageCropper$1;
|
|
9
|
+
injectComponentStyle("image-cropper");
|
|
10
|
+
//#endregion
|
|
11
|
+
export { ImageCropper };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { JSX } from "solid-js";
|
|
2
|
+
//#region src/components/image-viewer/index.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* A lightbox: the picture over a dimmed page, with a small toolbar
|
|
5
|
+
* beneath it. Zoom is the reader's hand (half to three times, clamped),
|
|
6
|
+
* a quarter turn at a time rotates, Escape and the scrim close — the
|
|
7
|
+
* dialog machine carries the modal part. `open` may stay with the
|
|
8
|
+
* caller; left undefined the viewer keeps it to itself.
|
|
9
|
+
*/
|
|
10
|
+
export interface ImageViewerProps {
|
|
11
|
+
src: string;
|
|
12
|
+
alt?: string;
|
|
13
|
+
open?: boolean;
|
|
14
|
+
zoomable?: boolean;
|
|
15
|
+
/** The openness changed — from the scrim, Escape or the toolbar. */
|
|
16
|
+
onOpenChange?: (open: boolean) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function ImageViewer(props: ImageViewerProps): JSX.Element;
|
|
19
|
+
//#endregion
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Button } from "../button/index.mjs";
|
|
2
|
+
import { ButtonGroup } from "../button-group/index.mjs";
|
|
3
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
4
|
+
import { Portal, createComponent, effect, insert, memo, setAttribute, setStyleProperty, template } from "solid-js/web";
|
|
5
|
+
import { Show, createEffect, createSignal, splitProps } from "solid-js";
|
|
6
|
+
import { Dialog } from "@ark-ui/solid/dialog";
|
|
7
|
+
//#region src/components/image-viewer/index.tsx
|
|
8
|
+
var _tmpl$ = /*#__PURE__*/ template(`<svg><circle cx=11 cy=11 r=7></svg>`, false, true, false);
|
|
9
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<svg><path d="m16.2 16.2 4.8 4.8"></svg>`, false, true, false);
|
|
10
|
+
var _tmpl$3 = /*#__PURE__*/ template(`<svg><path d="M8 11h6"></svg>`, false, true, false);
|
|
11
|
+
var _tmpl$4 = /*#__PURE__*/ template(`<svg><path d="M11 8v6"></svg>`, false, true, false);
|
|
12
|
+
var _tmpl$5 = /*#__PURE__*/ template(`<svg><path d="M20.49 12A8.5 8.5 0 1 1 18 6.06"></svg>`, false, true, false);
|
|
13
|
+
var _tmpl$6 = /*#__PURE__*/ template(`<svg><path d="M20.5 3.5v4h-4"></svg>`, false, true, false);
|
|
14
|
+
var _tmpl$7 = /*#__PURE__*/ template(`<svg><path d="m6 6 12 12"></svg>`, false, true, false);
|
|
15
|
+
var _tmpl$8 = /*#__PURE__*/ template(`<svg><path d="M18 6 6 18"></svg>`, false, true, false);
|
|
16
|
+
var _tmpl$9 = /*#__PURE__*/ template(`<svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden=true>`);
|
|
17
|
+
var _tmpl$0 = /*#__PURE__*/ template(`<img data-scope=image-viewer data-part=viewport>`);
|
|
18
|
+
var _tmpl$1 = /*#__PURE__*/ template(`<div data-scope=image-viewer data-part=toolbar>`);
|
|
19
|
+
const MIN_SCALE = .5;
|
|
20
|
+
const MAX_SCALE = 3;
|
|
21
|
+
const SCALE_STEP = .25;
|
|
22
|
+
/** The toolbar's line-drawn glyphs, fresh per render. */
|
|
23
|
+
const TOOL_GLYPHS = {
|
|
24
|
+
zoomIn: () => [
|
|
25
|
+
_tmpl$(),
|
|
26
|
+
_tmpl$2(),
|
|
27
|
+
_tmpl$3(),
|
|
28
|
+
_tmpl$4()
|
|
29
|
+
],
|
|
30
|
+
zoomOut: () => [
|
|
31
|
+
_tmpl$(),
|
|
32
|
+
_tmpl$2(),
|
|
33
|
+
_tmpl$3()
|
|
34
|
+
],
|
|
35
|
+
rotate: () => [_tmpl$5(), _tmpl$6()],
|
|
36
|
+
close: () => [_tmpl$7(), _tmpl$8()]
|
|
37
|
+
};
|
|
38
|
+
function ImageViewer(props) {
|
|
39
|
+
injectComponentStyle("image-viewer");
|
|
40
|
+
const [own] = splitProps(props, [
|
|
41
|
+
"src",
|
|
42
|
+
"alt",
|
|
43
|
+
"open",
|
|
44
|
+
"zoomable",
|
|
45
|
+
"onOpenChange"
|
|
46
|
+
]);
|
|
47
|
+
const [localOpen, setLocalOpen] = createSignal(false);
|
|
48
|
+
const [scale, setScale] = createSignal(1);
|
|
49
|
+
const [rotation, setRotation] = createSignal(0);
|
|
50
|
+
const isOpen = () => own.open ?? localOpen();
|
|
51
|
+
const setOpen = (value) => {
|
|
52
|
+
if (own.open === void 0) setLocalOpen(value);
|
|
53
|
+
own.onOpenChange?.(value);
|
|
54
|
+
};
|
|
55
|
+
createEffect(() => {
|
|
56
|
+
if (isOpen()) {
|
|
57
|
+
setScale(1);
|
|
58
|
+
setRotation(0);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
function zoom(step) {
|
|
62
|
+
setScale(Math.min(MAX_SCALE, Math.max(MIN_SCALE, scale() + step)));
|
|
63
|
+
}
|
|
64
|
+
function rotate() {
|
|
65
|
+
setRotation((rotation() + 90) % 360);
|
|
66
|
+
}
|
|
67
|
+
function toolButton(label, glyph, onClick) {
|
|
68
|
+
return createComponent(Button, {
|
|
69
|
+
variant: "ghost",
|
|
70
|
+
square: true,
|
|
71
|
+
size: "lg",
|
|
72
|
+
"aria-label": label,
|
|
73
|
+
onClick,
|
|
74
|
+
get children() {
|
|
75
|
+
var _el$10 = _tmpl$9();
|
|
76
|
+
insert(_el$10, glyph);
|
|
77
|
+
return _el$10;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return createComponent(Dialog.Root, {
|
|
82
|
+
get open() {
|
|
83
|
+
return isOpen();
|
|
84
|
+
},
|
|
85
|
+
onOpenChange: (details) => setOpen(details.open),
|
|
86
|
+
lazyMount: true,
|
|
87
|
+
unmountOnExit: true,
|
|
88
|
+
get children() {
|
|
89
|
+
return createComponent(Portal, { get children() {
|
|
90
|
+
return [createComponent(Dialog.Backdrop, { "class": "bs-image-viewer-backdrop" }), createComponent(Dialog.Positioner, {
|
|
91
|
+
"class": "bs-image-viewer-positioner",
|
|
92
|
+
get children() {
|
|
93
|
+
return createComponent(Dialog.Content, {
|
|
94
|
+
"class": "bs-image-viewer-content",
|
|
95
|
+
get ["aria-label"]() {
|
|
96
|
+
return own.alt || "Image preview";
|
|
97
|
+
},
|
|
98
|
+
onClick: (event) => {
|
|
99
|
+
if (event.target === event.currentTarget) setOpen(false);
|
|
100
|
+
},
|
|
101
|
+
get children() {
|
|
102
|
+
return [(() => {
|
|
103
|
+
var _el$11 = _tmpl$0();
|
|
104
|
+
effect((_p$) => {
|
|
105
|
+
var _v$ = own.src, _v$2 = own.alt ?? "", _v$3 = `scale(${scale()}) rotate(${rotation()}deg)`;
|
|
106
|
+
_v$ !== _p$.e && setAttribute(_el$11, "src", _p$.e = _v$);
|
|
107
|
+
_v$2 !== _p$.t && setAttribute(_el$11, "alt", _p$.t = _v$2);
|
|
108
|
+
_v$3 !== _p$.a && setStyleProperty(_el$11, "transform", _p$.a = _v$3);
|
|
109
|
+
return _p$;
|
|
110
|
+
}, {
|
|
111
|
+
e: void 0,
|
|
112
|
+
t: void 0,
|
|
113
|
+
a: void 0
|
|
114
|
+
});
|
|
115
|
+
return _el$11;
|
|
116
|
+
})(), (() => {
|
|
117
|
+
var _el$12 = _tmpl$1();
|
|
118
|
+
insert(_el$12, createComponent(ButtonGroup, { get children() {
|
|
119
|
+
return [
|
|
120
|
+
createComponent(Show, {
|
|
121
|
+
get when() {
|
|
122
|
+
return own.zoomable ?? true;
|
|
123
|
+
},
|
|
124
|
+
get children() {
|
|
125
|
+
return [memo(() => toolButton("Zoom in", TOOL_GLYPHS.zoomIn, () => zoom(SCALE_STEP))), memo(() => toolButton("Zoom out", TOOL_GLYPHS.zoomOut, () => zoom(-.25)))];
|
|
126
|
+
}
|
|
127
|
+
}),
|
|
128
|
+
memo(() => toolButton("Rotate 90 degrees", TOOL_GLYPHS.rotate, rotate)),
|
|
129
|
+
memo(() => toolButton("Close", TOOL_GLYPHS.close, () => setOpen(false)))
|
|
130
|
+
];
|
|
131
|
+
} }));
|
|
132
|
+
return _el$12;
|
|
133
|
+
})()];
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
})];
|
|
138
|
+
} });
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//#endregion
|
|
143
|
+
export { ImageViewer };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { JSX } from "solid-js";
|
|
2
|
+
//#region src/components/input/index.d.ts
|
|
3
|
+
export interface InputProps extends JSX.InputHTMLAttributes<HTMLInputElement> {
|
|
4
|
+
value?: string | number;
|
|
5
|
+
onValueChange?: (value: string) => void;
|
|
6
|
+
size?: "sm" | "md" | "lg";
|
|
7
|
+
invalid?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** The bare text input: the field recipe — border, surface, focus halo —
|
|
10
|
+
* on a native control. Standing alone it styles itself from the `invalid`
|
|
11
|
+
* prop; inside a `Field.Root` it consumes the field context, picking up
|
|
12
|
+
* the label id, the described-by wiring and the invalid state for free,
|
|
13
|
+
* which is also the seam the Form validation layer will drive. Disabled
|
|
14
|
+
* rides the native attribute. */
|
|
15
|
+
export declare function Input(props: InputProps): JSX.Element;
|
|
16
|
+
//#endregion
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
2
|
+
import { mergeProps, spread, template } from "solid-js/web";
|
|
3
|
+
import { mergeProps as mergeProps$1, splitProps } from "solid-js";
|
|
4
|
+
import { useFieldContext } from "@ark-ui/solid/field";
|
|
5
|
+
//#region src/components/input/index.tsx
|
|
6
|
+
var _tmpl$ = /*#__PURE__*/ template(`<input>`);
|
|
7
|
+
/** The bare text input: the field recipe — border, surface, focus halo —
|
|
8
|
+
* on a native control. Standing alone it styles itself from the `invalid`
|
|
9
|
+
* prop; inside a `Field.Root` it consumes the field context, picking up
|
|
10
|
+
* the label id, the described-by wiring and the invalid state for free,
|
|
11
|
+
* which is also the seam the Form validation layer will drive. Disabled
|
|
12
|
+
* rides the native attribute. */
|
|
13
|
+
function Input(props) {
|
|
14
|
+
injectComponentStyle("input");
|
|
15
|
+
const field = useFieldContext();
|
|
16
|
+
const [own, rest] = splitProps(props, [
|
|
17
|
+
"value",
|
|
18
|
+
"size",
|
|
19
|
+
"invalid",
|
|
20
|
+
"onValueChange"
|
|
21
|
+
]);
|
|
22
|
+
return (() => {
|
|
23
|
+
var _el$ = _tmpl$();
|
|
24
|
+
spread(_el$, mergeProps(() => mergeProps$1(() => field?.().getInputProps() ?? {}, rest, {
|
|
25
|
+
get value() {
|
|
26
|
+
return own.value;
|
|
27
|
+
},
|
|
28
|
+
"data-scope": "input",
|
|
29
|
+
"data-part": "root",
|
|
30
|
+
get "data-size"() {
|
|
31
|
+
return own.size ?? "md";
|
|
32
|
+
},
|
|
33
|
+
get "data-invalid"() {
|
|
34
|
+
return own.invalid || field?.().getInputProps()["data-invalid"] != null ? "" : void 0;
|
|
35
|
+
},
|
|
36
|
+
onInput: (event) => own.onValueChange?.(event.currentTarget.value)
|
|
37
|
+
})), false, false);
|
|
38
|
+
return _el$;
|
|
39
|
+
})();
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { Input };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { JSX } from "solid-js";
|
|
2
|
+
//#region src/components/input-group/index.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Merged controls: attachments and the entry fused into one seal. The
|
|
5
|
+
* Root draws the single hairline and carries the group's focus halo;
|
|
6
|
+
* the Addon is a recessed cell for the reader's fixed words — a scheme,
|
|
7
|
+
* a unit, a quiet button — placed before or after the entry. Put our
|
|
8
|
+
* Input (or Textarea) inside and its own border and halo step aside in
|
|
9
|
+
* favor of the group's; the stylesheet does the merging, the wrapper
|
|
10
|
+
* adds no visuals of its own.
|
|
11
|
+
*/
|
|
12
|
+
declare function InputGroupRoot(props: JSX.HTMLAttributes<HTMLDivElement>): JSX.Element;
|
|
13
|
+
declare function InputGroupAddon(props: JSX.HTMLAttributes<HTMLDivElement>): JSX.Element;
|
|
14
|
+
export declare const InputGroup: typeof InputGroupRoot & {
|
|
15
|
+
Root: typeof InputGroupRoot;
|
|
16
|
+
Addon: typeof InputGroupAddon;
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
2
|
+
import { mergeProps, spread, template } from "solid-js/web";
|
|
3
|
+
//#region src/components/input-group/index.tsx
|
|
4
|
+
var _tmpl$ = /*#__PURE__*/ template(`<div>`);
|
|
5
|
+
/**
|
|
6
|
+
* Merged controls: attachments and the entry fused into one seal. The
|
|
7
|
+
* Root draws the single hairline and carries the group's focus halo;
|
|
8
|
+
* the Addon is a recessed cell for the reader's fixed words — a scheme,
|
|
9
|
+
* a unit, a quiet button — placed before or after the entry. Put our
|
|
10
|
+
* Input (or Textarea) inside and its own border and halo step aside in
|
|
11
|
+
* favor of the group's; the stylesheet does the merging, the wrapper
|
|
12
|
+
* adds no visuals of its own.
|
|
13
|
+
*/
|
|
14
|
+
function InputGroupRoot(props) {
|
|
15
|
+
return (() => {
|
|
16
|
+
var _el$ = _tmpl$();
|
|
17
|
+
spread(_el$, mergeProps(props, {
|
|
18
|
+
"data-scope": "input-group",
|
|
19
|
+
"data-part": "root"
|
|
20
|
+
}), false, false);
|
|
21
|
+
return _el$;
|
|
22
|
+
})();
|
|
23
|
+
}
|
|
24
|
+
function InputGroupAddon(props) {
|
|
25
|
+
return (() => {
|
|
26
|
+
var _el$2 = _tmpl$();
|
|
27
|
+
spread(_el$2, mergeProps(props, {
|
|
28
|
+
"data-scope": "input-group",
|
|
29
|
+
"data-part": "addon"
|
|
30
|
+
}), false, false);
|
|
31
|
+
return _el$2;
|
|
32
|
+
})();
|
|
33
|
+
}
|
|
34
|
+
const InputGroup = Object.assign(InputGroupRoot, {
|
|
35
|
+
Root: InputGroupRoot,
|
|
36
|
+
Addon: InputGroupAddon
|
|
37
|
+
});
|
|
38
|
+
injectComponentStyle("input-group");
|
|
39
|
+
//#endregion
|
|
40
|
+
export { InputGroup };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsonTreeView as JsonTreeView$1 } from "@ark-ui/solid/json-tree-view";
|
|
2
|
+
//#region src/components/json-tree-view/index.d.ts
|
|
3
|
+
/** Ark's JsonTreeView, dressed in the paper-and-ink system: the tree-view
|
|
4
|
+
* recipes re-scoped, with value nodes reading as tabular data. The API is
|
|
5
|
+
* Ark's own — Root, Tree, plus createJsonTreeCollection. */
|
|
6
|
+
export declare const JsonTreeView: typeof JsonTreeView$1;
|
|
7
|
+
//#endregion
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
2
|
+
import { JsonTreeView as JsonTreeView$1 } from "@ark-ui/solid/json-tree-view";
|
|
3
|
+
//#region src/components/json-tree-view/index.ts
|
|
4
|
+
/** Ark's JsonTreeView, dressed in the paper-and-ink system: the tree-view
|
|
5
|
+
* recipes re-scoped, with value nodes reading as tabular data. The API is
|
|
6
|
+
* Ark's own — Root, Tree, plus createJsonTreeCollection. */
|
|
7
|
+
const JsonTreeView = JsonTreeView$1;
|
|
8
|
+
injectComponentStyle("json-tree-view");
|
|
9
|
+
//#endregion
|
|
10
|
+
export { JsonTreeView };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { injectComponentStyle } from "@bysages/core";
|
|
2
|
+
import { mergeProps, spread, template } from "solid-js/web";
|
|
3
|
+
//#region src/components/kbd/index.tsx
|
|
4
|
+
var _tmpl$ = /*#__PURE__*/ template(`<kbd>`);
|
|
5
|
+
function Kbd(props) {
|
|
6
|
+
injectComponentStyle("kbd");
|
|
7
|
+
return (() => {
|
|
8
|
+
var _el$ = _tmpl$();
|
|
9
|
+
spread(_el$, mergeProps(props, {
|
|
10
|
+
"data-scope": "kbd",
|
|
11
|
+
"data-part": "root"
|
|
12
|
+
}), false, false);
|
|
13
|
+
return _el$;
|
|
14
|
+
})();
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Kbd };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { JSX } from "solid-js";
|
|
2
|
+
//#region src/components/layout/index.d.ts
|
|
3
|
+
export interface LayoutRootProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
/** Declare which edge the skeleton reserves for its sider — without
|
|
5
|
+
* it the root is a single column. */
|
|
6
|
+
sider?: "start" | "end";
|
|
7
|
+
}
|
|
8
|
+
/** Which edge the enclosing root reserves for its rail — shared so the
|
|
9
|
+
* sider's resize handle knows which way the hand pulls. */
|
|
10
|
+
export interface LayoutContextValue {
|
|
11
|
+
siderPlacement: () => "start" | "end" | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The application skeleton: Root, Header, Sider, Content, Footer —
|
|
15
|
+
* the admin arrangement dressed in the paper-and-ink surfaces. The
|
|
16
|
+
* root is a full-height grid; a declared `sider` turns the columns
|
|
17
|
+
* around to meet whichever edge the rail stands on.
|
|
18
|
+
*/
|
|
19
|
+
declare function LayoutRoot(props: LayoutRootProps): JSX.Element;
|
|
20
|
+
declare function LayoutHeader(props: JSX.HTMLAttributes<HTMLElement>): JSX.Element;
|
|
21
|
+
declare function LayoutContent(props: JSX.HTMLAttributes<HTMLElement>): JSX.Element;
|
|
22
|
+
declare function LayoutFooter(props: JSX.HTMLAttributes<HTMLElement>): JSX.Element;
|
|
23
|
+
export interface LayoutSiderProps extends Omit<JSX.HTMLAttributes<HTMLElement>, "children"> {
|
|
24
|
+
/** The caller drives the fold; the sider mirrors it and echoes every
|
|
25
|
+
* change back through `onCollapsedChange`. */
|
|
26
|
+
collapsed?: boolean;
|
|
27
|
+
/** The rail's resting inline size — a layout parameter, not a visual
|
|
28
|
+
* token, so it rides an inline variable. */
|
|
29
|
+
width?: string;
|
|
30
|
+
/** The inline size when folded. */
|
|
31
|
+
collapsedWidth?: string;
|
|
32
|
+
/** Offer the hairline at the flow edge: the rail's width follows the
|
|
33
|
+
* hand (and the arrow keys), clamped by `min-width`/`max-width`, and
|
|
34
|
+
* every change rides `onWidthChange`. */
|
|
35
|
+
resizable?: boolean;
|
|
36
|
+
/** The rail's narrowest inline size while resizing. */
|
|
37
|
+
minWidth?: string;
|
|
38
|
+
/** The rail's widest inline size while resizing. */
|
|
39
|
+
maxWidth?: string;
|
|
40
|
+
/** The fold flipped. */
|
|
41
|
+
onCollapsedChange?: (collapsed: boolean) => void;
|
|
42
|
+
/** The rail's inline size changed — the hand, the arrow keys, or the
|
|
43
|
+
* caller's own width prop moving. */
|
|
44
|
+
onWidthChange?: (width: string) => void;
|
|
45
|
+
/** The children, or a function of the fold state — a rail can swap
|
|
46
|
+
* its labels for icons instead of being clipped mid-word by the
|
|
47
|
+
* narrowing edge. */
|
|
48
|
+
children?: JSX.Element | ((state: {
|
|
49
|
+
collapsed: boolean;
|
|
50
|
+
}) => JSX.Element);
|
|
51
|
+
}
|
|
52
|
+
declare function LayoutSider(props: LayoutSiderProps): JSX.Element;
|
|
53
|
+
export declare const Layout: typeof LayoutRoot & {
|
|
54
|
+
Root: typeof LayoutRoot;
|
|
55
|
+
Header: typeof LayoutHeader;
|
|
56
|
+
Sider: typeof LayoutSider;
|
|
57
|
+
Content: typeof LayoutContent;
|
|
58
|
+
Footer: typeof LayoutFooter;
|
|
59
|
+
};
|
|
60
|
+
//#endregion
|