@hadoku/task-ui-components 0.0.0-stage → 4.20.4
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 +917 -2
- package/dist/app-header.css +288 -0
- package/dist/bento.css +143 -0
- package/dist/button.css +227 -0
- package/dist/components/AppHeader.d.ts +61 -0
- package/dist/components/AppHeader.d.ts.map +1 -0
- package/dist/components/AppHeader.js +23 -0
- package/dist/components/AppHeader.js.map +1 -0
- package/dist/components/BentoCard.d.ts +23 -0
- package/dist/components/BentoCard.d.ts.map +1 -0
- package/dist/components/BentoCard.js +49 -0
- package/dist/components/BentoCard.js.map +1 -0
- package/dist/components/BentoGrid.d.ts +24 -0
- package/dist/components/BentoGrid.d.ts.map +1 -0
- package/dist/components/BentoGrid.js +22 -0
- package/dist/components/BentoGrid.js.map +1 -0
- package/dist/components/Button.d.ts +28 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +51 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/ConnectedSettings.d.ts +53 -0
- package/dist/components/ConnectedSettings.d.ts.map +1 -0
- package/dist/components/ConnectedSettings.js +368 -0
- package/dist/components/ConnectedSettings.js.map +1 -0
- package/dist/components/ConnectedThemePicker.d.ts +52 -0
- package/dist/components/ConnectedThemePicker.d.ts.map +1 -0
- package/dist/components/ConnectedThemePicker.js +32 -0
- package/dist/components/ConnectedThemePicker.js.map +1 -0
- package/dist/components/ContextMenu.d.ts +22 -0
- package/dist/components/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu.js +23 -0
- package/dist/components/ContextMenu.js.map +1 -0
- package/dist/components/HadokuThemePicker.d.ts +27 -0
- package/dist/components/HadokuThemePicker.d.ts.map +1 -0
- package/dist/components/HadokuThemePicker.js +19 -0
- package/dist/components/HadokuThemePicker.js.map +1 -0
- package/dist/components/LoadingSkeleton.d.ts +14 -0
- package/dist/components/LoadingSkeleton.d.ts.map +1 -0
- package/dist/components/LoadingSkeleton.js +62 -0
- package/dist/components/LoadingSkeleton.js.map +1 -0
- package/dist/components/Modal.d.ts +39 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +106 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/NumberInput.d.ts +26 -0
- package/dist/components/NumberInput.d.ts.map +1 -0
- package/dist/components/NumberInput.js +131 -0
- package/dist/components/NumberInput.js.map +1 -0
- package/dist/components/Select.d.ts +52 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +281 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/SettingsModal.d.ts +69 -0
- package/dist/components/SettingsModal.d.ts.map +1 -0
- package/dist/components/SettingsModal.js +141 -0
- package/dist/components/SettingsModal.js.map +1 -0
- package/dist/components/ThemeIcons.d.ts +26 -0
- package/dist/components/ThemeIcons.d.ts.map +1 -0
- package/dist/components/ThemeIcons.js +74 -0
- package/dist/components/ThemeIcons.js.map +1 -0
- package/dist/components/ThemePicker.d.ts +28 -0
- package/dist/components/ThemePicker.d.ts.map +1 -0
- package/dist/components/ThemePicker.js +101 -0
- package/dist/components/ThemePicker.js.map +1 -0
- package/dist/components/Toast.d.ts +13 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +70 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Toaster.d.ts +19 -0
- package/dist/components/Toaster.d.ts.map +1 -0
- package/dist/components/Toaster.js +19 -0
- package/dist/components/Toaster.js.map +1 -0
- package/dist/components/Tooltip.d.ts +49 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +143 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/context-menu.css +11 -0
- package/dist/controls.css +137 -0
- package/dist/hooks/useReducedMotion.d.ts +7 -0
- package/dist/hooks/useReducedMotion.d.ts.map +1 -0
- package/dist/hooks/useReducedMotion.js +25 -0
- package/dist/hooks/useReducedMotion.js.map +1 -0
- package/dist/hooks/useToast.d.ts +18 -0
- package/dist/hooks/useToast.d.ts.map +1 -0
- package/dist/hooks/useToast.js +28 -0
- package/dist/hooks/useToast.js.map +1 -0
- package/dist/icon-btn.css +64 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/menuPlacement.d.ts +16 -0
- package/dist/lib/menuPlacement.d.ts.map +1 -0
- package/dist/lib/menuPlacement.js +19 -0
- package/dist/lib/menuPlacement.js.map +1 -0
- package/dist/lib/selectMenus.d.ts +30 -0
- package/dist/lib/selectMenus.d.ts.map +1 -0
- package/dist/lib/selectMenus.js +236 -0
- package/dist/lib/selectMenus.js.map +1 -0
- package/dist/lib/settingsClient.d.ts +144 -0
- package/dist/lib/settingsClient.d.ts.map +1 -0
- package/dist/lib/settingsClient.js +157 -0
- package/dist/lib/settingsClient.js.map +1 -0
- package/dist/lib/themeScope.d.ts +19 -0
- package/dist/lib/themeScope.d.ts.map +1 -0
- package/dist/lib/themeScope.js +10 -0
- package/dist/lib/themeScope.js.map +1 -0
- package/dist/lib/titleTooltips.d.ts +38 -0
- package/dist/lib/titleTooltips.d.ts.map +1 -0
- package/dist/lib/titleTooltips.js +166 -0
- package/dist/lib/titleTooltips.js.map +1 -0
- package/dist/lib/tooltipPlacement.d.ts +14 -0
- package/dist/lib/tooltipPlacement.d.ts.map +1 -0
- package/dist/lib/tooltipPlacement.js +34 -0
- package/dist/lib/tooltipPlacement.js.map +1 -0
- package/dist/modal.css +129 -0
- package/dist/number-input.css +131 -0
- package/dist/scrollbar.css +165 -0
- package/dist/select.css +251 -0
- package/dist/styles.css +1866 -0
- package/dist/task-ui-components.css +1866 -0
- package/dist/theme-picker.css +219 -0
- package/dist/toaster.css +159 -0
- package/dist/tooltip.css +103 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +60 -4
- package/src/app-header.css +288 -0
- package/src/bento.css +143 -0
- package/src/button.css +227 -0
- package/src/components/AppHeader.tsx +87 -0
- package/src/components/BentoCard.tsx +72 -0
- package/src/components/BentoGrid.tsx +48 -0
- package/src/components/Button.tsx +81 -0
- package/src/components/ConnectedSettings.tsx +545 -0
- package/src/components/ConnectedThemePicker.tsx +79 -0
- package/src/components/ContextMenu.tsx +48 -0
- package/src/components/HadokuThemePicker.tsx +39 -0
- package/src/components/LoadingSkeleton.tsx +84 -0
- package/src/components/Modal.tsx +171 -0
- package/src/components/NumberInput.tsx +161 -0
- package/src/components/Select.tsx +359 -0
- package/src/components/SettingsModal.tsx +235 -0
- package/src/components/ThemeIcons.tsx +127 -0
- package/src/components/ThemePicker.tsx +149 -0
- package/src/components/Toast.tsx +92 -0
- package/src/components/Toaster.tsx +43 -0
- package/src/components/Tooltip.tsx +212 -0
- package/src/context-menu.css +11 -0
- package/src/controls.css +137 -0
- package/src/hooks/useReducedMotion.ts +36 -0
- package/src/hooks/useToast.ts +57 -0
- package/src/icon-btn.css +64 -0
- package/src/index.ts +153 -0
- package/src/lib/menuPlacement.ts +31 -0
- package/src/lib/selectMenus.ts +303 -0
- package/src/lib/settingsClient.ts +425 -0
- package/src/lib/themeScope.ts +23 -0
- package/src/lib/titleTooltips.ts +236 -0
- package/src/lib/tooltipPlacement.ts +59 -0
- package/src/modal.css +129 -0
- package/src/number-input.css +131 -0
- package/src/scrollbar.css +165 -0
- package/src/select.css +251 -0
- package/src/theme-picker.css +219 -0
- package/src/toaster.css +159 -0
- package/src/tooltip.css +103 -0
- package/src/types/index.ts +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeader.d.ts","sourceRoot":"","sources":["../../src/components/AppHeader.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAqB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAGpF,MAAM,WAAW,cAAc;IAC7B;yDACqD;IACrD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB;gFAC4E;IAC5E,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB;;8EAE0E;IAC1E,aAAa,CAAC,EAAE,sBAAsB,CAAA;IACtC;;;oFAGgF;IAChF,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B;gDAC4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,MAAM,EACN,aAAa,EACb,QAAQ,EACR,SAAc,EACf,EAAE,cAAc,qBAkBhB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ConnectedSettings } from "./ConnectedSettings.js";
|
|
3
|
+
import { HadokuThemePicker } from "./HadokuThemePicker.js";
|
|
4
|
+
function AppHeader({
|
|
5
|
+
title,
|
|
6
|
+
status,
|
|
7
|
+
settingsProps,
|
|
8
|
+
children,
|
|
9
|
+
className = ""
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsxs("header", { className: `app-header ${className}`.trim(), children: [
|
|
12
|
+
typeof title === "string" ? /* @__PURE__ */ jsx("h1", { className: "app-header__title", children: title }) : /* @__PURE__ */ jsx("div", { className: "app-header__title", children: title }),
|
|
13
|
+
/* @__PURE__ */ jsxs("div", { className: "app-header__actions", children: [
|
|
14
|
+
status,
|
|
15
|
+
/* @__PURE__ */ jsx(HadokuThemePicker, {}),
|
|
16
|
+
/* @__PURE__ */ jsx(ConnectedSettings, { ...settingsProps, children })
|
|
17
|
+
] })
|
|
18
|
+
] });
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
AppHeader
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=AppHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppHeader.js","sources":["../../src/components/AppHeader.tsx"],"sourcesContent":["/**\n * AppHeader — the ecosystem-standard top bar for every hadoku.me app.\n *\n * Enforces the shared contract so child apps stop drifting:\n * [ title (left) ] ————— <space> ————— [ status? · ThemePicker · Settings gear ] (right)\n *\n * Everything BELOW the header is the app's own concern. The header owns the\n * title, and it OWNS both right-hand controls outright — it renders the theme\n * picker and the settings gear itself. Neither is a prop.\n *\n * WHY THEY ARE NOT PROPS ANY MORE\n * -------------------------------\n * `themePicker?: React.ReactNode` was an open hole: a slot that accepts a node\n * accepts ANY node, so \"every app uses the same picker\" was a convention, and\n * conventions drift. They did — one app passed a raw `<ThemePicker>` with its\n * own `isOpen` state and a debug logger wired into `getThemeIcon`, and eight\n * apps each kept a hand-copied `useTheme` hook to feed it. Those copies had\n * already diverged on real behaviour (only one wrote `localStorage`, so the\n * rest lost the theme on browser restart and flashed a default on next paint).\n *\n * The control is now rendered here, from `useHadokuTheme()`. An app cannot\n * substitute, restyle or omit it. What an app CAN do is inject its own\n * preferences — see `children`.\n *\n * @example\n * ```tsx\n * import { AppHeader } from '@wolffm/task-ui-components'\n * import { HadokuThemeRoot } from '@wolffm/themes'\n *\n * // once, at the app root:\n * <HadokuThemeRoot>\n * <AppHeader title=\"Print Tool\" status={<ApiStatus status={apiStatus} />}>\n * <MyAppPreferences /> // optional: appended AFTER the canonical rows\n * </AppHeader>\n * </HadokuThemeRoot>\n * ```\n */\nimport React from 'react'\nimport { ConnectedSettings, type ConnectedSettingsProps } from './ConnectedSettings'\nimport { HadokuThemePicker } from './HadokuThemePicker'\n\nexport interface AppHeaderProps {\n /** Left-aligned header title. A string is wrapped in an <h1>; pass a node for\n * custom markup (e.g. a clickable title button). */\n title: React.ReactNode\n /** Optional status/extra node shown left of the theme + settings controls\n * (e.g. an \"API Online\" indicator). Acceptable per the header contract. */\n status?: React.ReactNode\n /** Identity hints for the settings popout. Narrow on purpose: `userType` and\n * `name` exist because an app behind a path-prefixed shim may not be able to\n * reach `/session/whoami` (conjure), NOT as a styling or layout hook. */\n settingsProps?: ConnectedSettingsProps\n /** THE app-specific extension point. Rendered inside the settings popout as a\n * final section, under the four canonical rows. Put your app's own\n * preferences here — checkboxes, selects, whatever it needs; this slot is\n * deliberately unconstrained. What it cannot do is alter the rows above it. */\n children?: React.ReactNode\n /** Extra class on the <header> root. Layout only — it cannot reach the\n * controls, which own their own markup. */\n className?: string\n}\n\nexport function AppHeader({\n title,\n status,\n settingsProps,\n children,\n className = ''\n}: AppHeaderProps) {\n // No useHadokuTheme() call here: <HadokuThemePicker> reads the context and\n // throws its own actionable error when the app root was never wrapped, so a\n // second read would only duplicate that.\n return (\n <header className={`app-header ${className}`.trim()}>\n {typeof title === 'string' ? (\n <h1 className=\"app-header__title\">{title}</h1>\n ) : (\n <div className=\"app-header__title\">{title}</div>\n )}\n <div className=\"app-header__actions\">\n {status}\n <HadokuThemePicker />\n <ConnectedSettings {...settingsProps}>{children}</ConnectedSettings>\n </div>\n </header>\n )\n}\n"],"names":[],"mappings":";;;AA8DO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAmB;AAIjB,8BACG,UAAA,EAAO,WAAW,cAAc,SAAS,GAAG,QAC1C,UAAA;AAAA,IAAA,OAAO,UAAU,WAChB,oBAAC,MAAA,EAAG,WAAU,qBAAqB,UAAA,MAAA,CAAM,IAEzC,oBAAC,OAAA,EAAI,WAAU,qBAAqB,UAAA,OAAM;AAAA,IAE5C,qBAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,MAAA;AAAA,0BACA,mBAAA,EAAkB;AAAA,MACnB,oBAAC,mBAAA,EAAmB,GAAG,eAAgB,SAAA,CAAS;AAAA,IAAA,EAAA,CAClD;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BentoCard Component
|
|
3
|
+
* Base card component for bento grid layouts
|
|
4
|
+
* Supports various sizes and disabled state for preloading
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export type CardSize = 'default' | 'wide' | 'tall' | 'large' | 'hero';
|
|
8
|
+
export interface BentoCardProps {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
/** Card size affects grid span */
|
|
12
|
+
size?: CardSize;
|
|
13
|
+
/** Disable interactions (for preload state) */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/** Click handler */
|
|
16
|
+
onClick?: () => void;
|
|
17
|
+
/** Custom aria-label for accessibility */
|
|
18
|
+
ariaLabel?: string;
|
|
19
|
+
/** Optional data attributes for animation libraries */
|
|
20
|
+
'data-layout-id'?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function BentoCard({ children, className, size, disabled, onClick, ariaLabel, 'data-layout-id': layoutId, ...rest }: BentoCardProps): React.JSX.Element;
|
|
23
|
+
//# sourceMappingURL=BentoCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BentoCard.d.ts","sourceRoot":"","sources":["../../src/components/BentoCard.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAErE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAUD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAc,EACd,IAAgB,EAChB,QAAgB,EAChB,OAAO,EACP,SAAS,EACT,gBAAgB,EAAE,QAAQ,EAC1B,GAAG,IAAI,EACR,EAAE,cAAc,qBA6BhB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
const sizeClasses = {
|
|
3
|
+
default: "bento-card--default",
|
|
4
|
+
wide: "bento-card--wide",
|
|
5
|
+
tall: "bento-card--tall",
|
|
6
|
+
large: "bento-card--large",
|
|
7
|
+
hero: "bento-card--hero"
|
|
8
|
+
};
|
|
9
|
+
function BentoCard({
|
|
10
|
+
children,
|
|
11
|
+
className = "",
|
|
12
|
+
size = "default",
|
|
13
|
+
disabled = false,
|
|
14
|
+
onClick,
|
|
15
|
+
ariaLabel,
|
|
16
|
+
"data-layout-id": layoutId,
|
|
17
|
+
...rest
|
|
18
|
+
}) {
|
|
19
|
+
const handleClick = () => {
|
|
20
|
+
if (!disabled && onClick) {
|
|
21
|
+
onClick();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const handleKeyDown = (e) => {
|
|
25
|
+
if ((e.key === "Enter" || e.key === " ") && !disabled && onClick) {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
onClick();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return /* @__PURE__ */ jsx(
|
|
31
|
+
"article",
|
|
32
|
+
{
|
|
33
|
+
className: `bento-card ${sizeClasses[size]} ${disabled ? "bento-card--disabled" : ""} ${className}`,
|
|
34
|
+
onClick: handleClick,
|
|
35
|
+
onKeyDown: handleKeyDown,
|
|
36
|
+
role: onClick ? "button" : void 0,
|
|
37
|
+
tabIndex: onClick && !disabled ? 0 : void 0,
|
|
38
|
+
"aria-label": ariaLabel,
|
|
39
|
+
"aria-disabled": disabled,
|
|
40
|
+
"data-layout-id": layoutId,
|
|
41
|
+
...rest,
|
|
42
|
+
children
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
BentoCard
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=BentoCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BentoCard.js","sources":["../../src/components/BentoCard.tsx"],"sourcesContent":["/**\r\n * BentoCard Component\r\n * Base card component for bento grid layouts\r\n * Supports various sizes and disabled state for preloading\r\n */\r\n\r\nimport React from 'react'\r\n\r\nexport type CardSize = 'default' | 'wide' | 'tall' | 'large' | 'hero'\r\n\r\nexport interface BentoCardProps {\r\n children: React.ReactNode\r\n className?: string\r\n /** Card size affects grid span */\r\n size?: CardSize\r\n /** Disable interactions (for preload state) */\r\n disabled?: boolean\r\n /** Click handler */\r\n onClick?: () => void\r\n /** Custom aria-label for accessibility */\r\n ariaLabel?: string\r\n /** Optional data attributes for animation libraries */\r\n 'data-layout-id'?: string\r\n}\r\n\r\nconst sizeClasses: Record<CardSize, string> = {\r\n default: 'bento-card--default',\r\n wide: 'bento-card--wide',\r\n tall: 'bento-card--tall',\r\n large: 'bento-card--large',\r\n hero: 'bento-card--hero'\r\n}\r\n\r\nexport function BentoCard({\r\n children,\r\n className = '',\r\n size = 'default',\r\n disabled = false,\r\n onClick,\r\n ariaLabel,\r\n 'data-layout-id': layoutId,\r\n ...rest\r\n}: BentoCardProps) {\r\n const handleClick = () => {\r\n if (!disabled && onClick) {\r\n onClick()\r\n }\r\n }\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if ((e.key === 'Enter' || e.key === ' ') && !disabled && onClick) {\r\n e.preventDefault()\r\n onClick()\r\n }\r\n }\r\n\r\n return (\r\n <article\r\n className={`bento-card ${sizeClasses[size]} ${disabled ? 'bento-card--disabled' : ''} ${className}`}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n role={onClick ? 'button' : undefined}\r\n tabIndex={onClick && !disabled ? 0 : undefined}\r\n aria-label={ariaLabel}\r\n aria-disabled={disabled}\r\n data-layout-id={layoutId}\r\n {...rest}\r\n >\r\n {children}\r\n </article>\r\n )\r\n}\r\n"],"names":[],"mappings":";AAyBA,MAAM,cAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AACR;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,GAAG;AACL,GAAmB;AACjB,QAAM,cAAc,MAAM;AACxB,QAAI,CAAC,YAAY,SAAS;AACxB,cAAA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,SAAK,EAAE,QAAQ,WAAW,EAAE,QAAQ,QAAQ,CAAC,YAAY,SAAS;AAChE,QAAE,eAAA;AACF,cAAA;AAAA,IACF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,cAAc,YAAY,IAAI,CAAC,IAAI,WAAW,yBAAyB,EAAE,IAAI,SAAS;AAAA,MACjG,SAAS;AAAA,MACT,WAAW;AAAA,MACX,MAAM,UAAU,WAAW;AAAA,MAC3B,UAAU,WAAW,CAAC,WAAW,IAAI;AAAA,MACrC,cAAY;AAAA,MACZ,iBAAe;AAAA,MACf,kBAAgB;AAAA,MACf,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BentoGrid Component
|
|
3
|
+
* Responsive grid container for bento-style card layouts
|
|
4
|
+
* Automatically adjusts columns based on viewport size
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export type BentoColumns = 1 | 2 | 3 | 4 | 6;
|
|
8
|
+
export interface BentoGridProps {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
/** Column configuration at each breakpoint */
|
|
12
|
+
columns?: {
|
|
13
|
+
sm?: BentoColumns;
|
|
14
|
+
md?: BentoColumns;
|
|
15
|
+
lg?: BentoColumns;
|
|
16
|
+
xl?: BentoColumns;
|
|
17
|
+
};
|
|
18
|
+
/** Gap between cards in rem */
|
|
19
|
+
gap?: number;
|
|
20
|
+
/** Maximum width of the grid */
|
|
21
|
+
maxWidth?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function BentoGrid({ children, className, columns, gap, maxWidth }: BentoGridProps): React.JSX.Element;
|
|
24
|
+
//# sourceMappingURL=BentoGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BentoGrid.d.ts","sourceRoot":"","sources":["../../src/components/BentoGrid.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE5C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE;QACR,EAAE,CAAC,EAAE,YAAY,CAAA;QACjB,EAAE,CAAC,EAAE,YAAY,CAAA;QACjB,EAAE,CAAC,EAAE,YAAY,CAAA;QACjB,EAAE,CAAC,EAAE,YAAY,CAAA;KAClB,CAAA;IACD,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAc,EACd,OAAwC,EACxC,GAAO,EACP,QAAmB,EACpB,EAAE,cAAc,qBAehB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
function BentoGrid({
|
|
3
|
+
children,
|
|
4
|
+
className = "",
|
|
5
|
+
columns = { sm: 2, md: 3, lg: 4, xl: 6 },
|
|
6
|
+
gap = 1,
|
|
7
|
+
maxWidth = "1400px"
|
|
8
|
+
}) {
|
|
9
|
+
const gridStyle = {
|
|
10
|
+
"--bento-gap": `${gap}rem`,
|
|
11
|
+
"--bento-max-width": maxWidth,
|
|
12
|
+
"--bento-cols-sm": columns.sm ?? 2,
|
|
13
|
+
"--bento-cols-md": columns.md ?? 3,
|
|
14
|
+
"--bento-cols-lg": columns.lg ?? 4,
|
|
15
|
+
"--bento-cols-xl": columns.xl ?? 6
|
|
16
|
+
};
|
|
17
|
+
return /* @__PURE__ */ jsx("div", { className: `bento-grid ${className}`, style: gridStyle, children });
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
BentoGrid
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=BentoGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BentoGrid.js","sources":["../../src/components/BentoGrid.tsx"],"sourcesContent":["/**\r\n * BentoGrid Component\r\n * Responsive grid container for bento-style card layouts\r\n * Automatically adjusts columns based on viewport size\r\n */\r\n\r\nimport React from 'react'\r\n\r\nexport type BentoColumns = 1 | 2 | 3 | 4 | 6\r\n\r\nexport interface BentoGridProps {\r\n children: React.ReactNode\r\n className?: string\r\n /** Column configuration at each breakpoint */\r\n columns?: {\r\n sm?: BentoColumns\r\n md?: BentoColumns\r\n lg?: BentoColumns\r\n xl?: BentoColumns\r\n }\r\n /** Gap between cards in rem */\r\n gap?: number\r\n /** Maximum width of the grid */\r\n maxWidth?: string\r\n}\r\n\r\nexport function BentoGrid({\r\n children,\r\n className = '',\r\n columns = { sm: 2, md: 3, lg: 4, xl: 6 },\r\n gap = 1,\r\n maxWidth = '1400px'\r\n}: BentoGridProps) {\r\n const gridStyle: React.CSSProperties = {\r\n '--bento-gap': `${gap}rem`,\r\n '--bento-max-width': maxWidth,\r\n '--bento-cols-sm': columns.sm ?? 2,\r\n '--bento-cols-md': columns.md ?? 3,\r\n '--bento-cols-lg': columns.lg ?? 4,\r\n '--bento-cols-xl': columns.xl ?? 6\r\n } as React.CSSProperties\r\n\r\n return (\r\n <div className={`bento-grid ${className}`} style={gridStyle}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n"],"names":[],"mappings":";AA0BO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,YAAY;AAAA,EACZ,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAA;AAAA,EACrC,MAAM;AAAA,EACN,WAAW;AACb,GAAmB;AACjB,QAAM,YAAiC;AAAA,IACrC,eAAe,GAAG,GAAG;AAAA,IACrB,qBAAqB;AAAA,IACrB,mBAAmB,QAAQ,MAAM;AAAA,IACjC,mBAAmB,QAAQ,MAAM;AAAA,IACjC,mBAAmB,QAAQ,MAAM;AAAA,IACjC,mBAAmB,QAAQ,MAAM;AAAA,EAAA;AAGnC,SACE,oBAAC,SAAI,WAAW,cAAc,SAAS,IAAI,OAAO,WAC/C,SAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button Component
|
|
3
|
+
* Themed button in five treatments x five colour families, so an app never
|
|
4
|
+
* falls back to the browser's default button chrome.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { type IconName } from '@wolffm/themes';
|
|
8
|
+
import '../button.css';
|
|
9
|
+
export type ButtonVariant = 'solid' | 'gradient' | 'soft' | 'outline' | 'ghost';
|
|
10
|
+
export type ButtonFamily = 'primary' | 'success' | 'warning' | 'danger' | 'neutral';
|
|
11
|
+
export type ButtonSize = 'sm' | 'md' | 'lg';
|
|
12
|
+
export type ButtonShape = 'rounded' | 'pill' | 'square';
|
|
13
|
+
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
14
|
+
variant?: ButtonVariant;
|
|
15
|
+
family?: ButtonFamily;
|
|
16
|
+
size?: ButtonSize;
|
|
17
|
+
shape?: ButtonShape;
|
|
18
|
+
/** Registry icon before the label. */
|
|
19
|
+
icon?: IconName;
|
|
20
|
+
/** Registry icon after the label (e.g. `chevron-down` on a menu button). */
|
|
21
|
+
iconEnd?: IconName;
|
|
22
|
+
/** Shows a spinner, sets aria-busy and blocks clicks. */
|
|
23
|
+
loading?: boolean;
|
|
24
|
+
/** Stretch to the container width. */
|
|
25
|
+
block?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function Button({ variant, family, size, shape, icon, iconEnd, loading, block, disabled, type, className, children, ...rest }: ButtonProps): React.JSX.Element;
|
|
28
|
+
//# sourceMappingURL=Button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/components/Button.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,eAAe,CAAA;AAEtB,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAC/E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AACnF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC3C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEvD,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IAChF,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,sCAAsC;IACtC,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,4EAA4E;IAC5E,OAAO,CAAC,EAAE,QAAQ,CAAA;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID,wBAAgB,MAAM,CAAC,EACrB,OAAgB,EAChB,MAAkB,EAClB,IAAW,EACX,KAAiB,EACjB,IAAI,EACJ,OAAO,EACP,OAAe,EACf,KAAa,EACb,QAAQ,EACR,IAAe,EACf,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,WAAW,qBAkCb"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "@wolffm/themes";
|
|
3
|
+
/* empty css */
|
|
4
|
+
const ICON_SIZE = { sm: 14, md: 16, lg: 18 };
|
|
5
|
+
function Button({
|
|
6
|
+
variant = "soft",
|
|
7
|
+
family = "primary",
|
|
8
|
+
size = "md",
|
|
9
|
+
shape = "rounded",
|
|
10
|
+
icon,
|
|
11
|
+
iconEnd,
|
|
12
|
+
loading = false,
|
|
13
|
+
block = false,
|
|
14
|
+
disabled,
|
|
15
|
+
type = "button",
|
|
16
|
+
className,
|
|
17
|
+
children,
|
|
18
|
+
...rest
|
|
19
|
+
}) {
|
|
20
|
+
const iconOnly = !children && (icon || iconEnd);
|
|
21
|
+
const classes = [
|
|
22
|
+
"hdk-btn",
|
|
23
|
+
`hdk-btn--${variant}`,
|
|
24
|
+
`hdk-btn--${family}`,
|
|
25
|
+
`hdk-btn--${size}`,
|
|
26
|
+
`hdk-btn--${shape}`,
|
|
27
|
+
iconOnly && "hdk-btn--icon-only",
|
|
28
|
+
block && "hdk-btn--block",
|
|
29
|
+
loading && "hdk-btn--loading",
|
|
30
|
+
className
|
|
31
|
+
].filter(Boolean).join(" ");
|
|
32
|
+
return /* @__PURE__ */ jsxs(
|
|
33
|
+
"button",
|
|
34
|
+
{
|
|
35
|
+
type,
|
|
36
|
+
className: classes,
|
|
37
|
+
disabled: disabled || loading,
|
|
38
|
+
"aria-busy": loading || void 0,
|
|
39
|
+
...rest,
|
|
40
|
+
children: [
|
|
41
|
+
loading ? /* @__PURE__ */ jsx("span", { className: "hdk-btn__spinner", "aria-hidden": "true" }) : icon && /* @__PURE__ */ jsx(Icon, { name: icon, size: ICON_SIZE[size] }),
|
|
42
|
+
children,
|
|
43
|
+
iconEnd && /* @__PURE__ */ jsx(Icon, { name: iconEnd, size: ICON_SIZE[size] })
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
Button
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=Button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["/**\n * Button Component\n * Themed button in five treatments x five colour families, so an app never\n * falls back to the browser's default button chrome.\n */\n\nimport React from 'react'\nimport { Icon, type IconName } from '@wolffm/themes'\nimport '../button.css'\n\nexport type ButtonVariant = 'solid' | 'gradient' | 'soft' | 'outline' | 'ghost'\nexport type ButtonFamily = 'primary' | 'success' | 'warning' | 'danger' | 'neutral'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\nexport type ButtonShape = 'rounded' | 'pill' | 'square'\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n family?: ButtonFamily\n size?: ButtonSize\n shape?: ButtonShape\n /** Registry icon before the label. */\n icon?: IconName\n /** Registry icon after the label (e.g. `chevron-down` on a menu button). */\n iconEnd?: IconName\n /** Shows a spinner, sets aria-busy and blocks clicks. */\n loading?: boolean\n /** Stretch to the container width. */\n block?: boolean\n}\n\nconst ICON_SIZE: Record<ButtonSize, number> = { sm: 14, md: 16, lg: 18 }\n\nexport function Button({\n variant = 'soft',\n family = 'primary',\n size = 'md',\n shape = 'rounded',\n icon,\n iconEnd,\n loading = false,\n block = false,\n disabled,\n type = 'button',\n className,\n children,\n ...rest\n}: ButtonProps) {\n // An icon with no label is a square button; it still needs an aria-label.\n const iconOnly = !children && (icon || iconEnd)\n const classes = [\n 'hdk-btn',\n `hdk-btn--${variant}`,\n `hdk-btn--${family}`,\n `hdk-btn--${size}`,\n `hdk-btn--${shape}`,\n iconOnly && 'hdk-btn--icon-only',\n block && 'hdk-btn--block',\n loading && 'hdk-btn--loading',\n className\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <button\n type={type}\n className={classes}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n {...rest}\n >\n {loading ? (\n <span className=\"hdk-btn__spinner\" aria-hidden=\"true\" />\n ) : (\n icon && <Icon name={icon} size={ICON_SIZE[size]} />\n )}\n {children}\n {iconEnd && <Icon name={iconEnd} size={ICON_SIZE[size]} />}\n </button>\n )\n}\n"],"names":[],"mappings":";;;AA8BA,MAAM,YAAwC,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAA;AAE7D,SAAS,OAAO;AAAA,EACrB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AAEd,QAAM,WAAW,CAAC,aAAa,QAAQ;AACvC,QAAM,UAAU;AAAA,IACd;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,YAAY,MAAM;AAAA,IAClB,YAAY,IAAI;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,MACX,UAAU,YAAY;AAAA,MACtB,aAAW,WAAW;AAAA,MACrB,GAAG;AAAA,MAEH,UAAA;AAAA,QAAA,UACC,oBAAC,QAAA,EAAK,WAAU,oBAAmB,eAAY,QAAO,IAEtD,QAAQ,oBAAC,QAAK,MAAM,MAAM,MAAM,UAAU,IAAI,GAAG;AAAA,QAElD;AAAA,QACA,+BAAY,MAAA,EAAK,MAAM,SAAS,MAAM,UAAU,IAAI,EAAA,CAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG9D;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConnectedSettings — the unified per-user settings control for the hadoku
|
|
3
|
+
* ecosystem: a gear button that opens a popout housing everything that is a
|
|
4
|
+
* property of the PERSON (not the app):
|
|
5
|
+
* - current access tier (read-only, friendly label)
|
|
6
|
+
* - display name (inline edit → POST /session/name)
|
|
7
|
+
* - global content-visibility level (tiered pill → PUT /prefs/api/v1/content-level)
|
|
8
|
+
* - switch key (an inline sign-in form, on the site's own sign-in client)
|
|
9
|
+
*
|
|
10
|
+
* "Connected" (parallel to ConnectedThemePicker): it self-wires to the
|
|
11
|
+
* hadoku.me edge-router via same-origin fetches (see lib/settingsClient), so
|
|
12
|
+
* dropping `<ConnectedSettings />` into any app under hadoku.me needs zero
|
|
13
|
+
* props. Identity is resolved via whoami() unless the host passes `userType` /
|
|
14
|
+
* `name` (avoids a redundant fetch when the app already knows).
|
|
15
|
+
*
|
|
16
|
+
* All of that is resolved AT MOUNT via `prefetchSettings()`, never on
|
|
17
|
+
* gear-click — opening the popout must cost zero requests. See the effect
|
|
18
|
+
* below, and `e2e/settings-prefetch.spec.ts` in hadoku-task, which fails if the
|
|
19
|
+
* fetch moves back behind the click.
|
|
20
|
+
*
|
|
21
|
+
* Mirrors ThemePicker's controlled-popout pattern: owns its own `open` state +
|
|
22
|
+
* a full-viewport overlay for click-outside dismiss. The content pill renders
|
|
23
|
+
* `maxLevel` segments (friend ⇒ 3, admin ⇒ 4) and is hidden for public callers.
|
|
24
|
+
* maxLevel comes from the server so the tier ceiling is never trusted from the
|
|
25
|
+
* client.
|
|
26
|
+
*/
|
|
27
|
+
import React from 'react';
|
|
28
|
+
import { type Tier } from '../lib/settingsClient';
|
|
29
|
+
import '../app-header.css';
|
|
30
|
+
export interface ConnectedSettingsProps {
|
|
31
|
+
/** Caller's tier. Omit to self-resolve via whoami().
|
|
32
|
+
*
|
|
33
|
+
* This exists for apps that CANNOT reach `/session/whoami` — conjure sits
|
|
34
|
+
* behind a path-prefixed shim that serves nothing outside `/conjure`, so
|
|
35
|
+
* whoami 404s and the tier would fall back to guest. It is an identity
|
|
36
|
+
* hint, not a way to present a different tier than the edge assigns: every
|
|
37
|
+
* gate that matters is enforced server-side off the edge-stamped tier. */
|
|
38
|
+
userType?: Tier;
|
|
39
|
+
/** Display name. Omit to self-resolve via whoami(). Same rationale. */
|
|
40
|
+
name?: string | null;
|
|
41
|
+
/** Notify the host (e.g. a "Signed in as …" label) of a rename. */
|
|
42
|
+
onNameChange?: (name: string | null) => void;
|
|
43
|
+
/** App-specific settings rendered as a final section in the same popout, so
|
|
44
|
+
* an app with its own preferences keeps ONE unified gear instead of a second
|
|
45
|
+
* control. Shown under an "App preferences" divider.
|
|
46
|
+
*
|
|
47
|
+
* This slot is deliberately unconstrained — put whatever the app needs in
|
|
48
|
+
* it. The constraint is only that it lands AFTER the four canonical rows and
|
|
49
|
+
* cannot change them. */
|
|
50
|
+
children?: React.ReactNode;
|
|
51
|
+
}
|
|
52
|
+
export declare function ConnectedSettings({ userType: userTypeProp, name: nameProp, onNameChange, children }: ConnectedSettingsProps): React.JSX.Element;
|
|
53
|
+
//# sourceMappingURL=ConnectedSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectedSettings.d.ts","sourceRoot":"","sources":["../../src/components/ConnectedSettings.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAmD,MAAM,OAAO,CAAA;AAEvE,OAAO,EAUL,KAAK,IAAI,EACV,MAAM,uBAAuB,CAAA;AAC9B,OAAO,mBAAmB,CAAA;AAE1B,MAAM,WAAW,sBAAsB;IACrC;;;;;;+EAM2E;IAC3E,QAAQ,CAAC,EAAE,IAAI,CAAA;IACf,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,mEAAmE;IACnE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC5C;;;;;;8BAM0B;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAkBD,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,QAAQ,EACT,EAAE,sBAAsB,qBA0cxB"}
|