@umamichi-ui/common-components 0.1.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.
Files changed (98) hide show
  1. package/README.md +112 -0
  2. package/dist/dialog/AboutDialog.d.ts +27 -0
  3. package/dist/dialog/AboutDialog.d.ts.map +1 -0
  4. package/dist/dialog/AboutDialog.js +61 -0
  5. package/dist/dialog/AboutDialog.js.map +1 -0
  6. package/dist/dialog/ConfirmDialog.d.ts +17 -0
  7. package/dist/dialog/ConfirmDialog.d.ts.map +1 -0
  8. package/dist/dialog/ConfirmDialog.js +38 -0
  9. package/dist/dialog/ConfirmDialog.js.map +1 -0
  10. package/dist/dialog/ConfirmDialogOverlay.d.ts +13 -0
  11. package/dist/dialog/ConfirmDialogOverlay.d.ts.map +1 -0
  12. package/dist/dialog/ConfirmDialogOverlay.js +28 -0
  13. package/dist/dialog/ConfirmDialogOverlay.js.map +1 -0
  14. package/dist/dialog/index.d.ts +4 -0
  15. package/dist/dialog/index.d.ts.map +1 -0
  16. package/dist/dialog/index.js +9 -0
  17. package/dist/dialog/index.js.map +1 -0
  18. package/dist/icons/ChevronIcons.d.ts +6 -0
  19. package/dist/icons/ChevronIcons.d.ts.map +1 -0
  20. package/dist/icons/ChevronIcons.js +19 -0
  21. package/dist/icons/ChevronIcons.js.map +1 -0
  22. package/dist/icons/DropdownMenuChevron.d.ts +6 -0
  23. package/dist/icons/DropdownMenuChevron.d.ts.map +1 -0
  24. package/dist/icons/DropdownMenuChevron.js +20 -0
  25. package/dist/icons/DropdownMenuChevron.js.map +1 -0
  26. package/dist/icons/InfoCircleIcon.d.ts +5 -0
  27. package/dist/icons/InfoCircleIcon.d.ts.map +1 -0
  28. package/dist/icons/InfoCircleIcon.js +17 -0
  29. package/dist/icons/InfoCircleIcon.js.map +1 -0
  30. package/dist/icons/index.d.ts +4 -0
  31. package/dist/icons/index.d.ts.map +1 -0
  32. package/dist/icons/index.js +10 -0
  33. package/dist/icons/index.js.map +1 -0
  34. package/dist/index.d.ts +6 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +45 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/menu/FloatingMenu.d.ts +28 -0
  39. package/dist/menu/FloatingMenu.d.ts.map +1 -0
  40. package/dist/menu/FloatingMenu.js +125 -0
  41. package/dist/menu/FloatingMenu.js.map +1 -0
  42. package/dist/menu/MobileActionSheet.d.ts +9 -0
  43. package/dist/menu/MobileActionSheet.d.ts.map +1 -0
  44. package/dist/menu/MobileActionSheet.js +10 -0
  45. package/dist/menu/MobileActionSheet.js.map +1 -0
  46. package/dist/menu/MobileActionSheetContent.d.ts +31 -0
  47. package/dist/menu/MobileActionSheetContent.d.ts.map +1 -0
  48. package/dist/menu/MobileActionSheetContent.js +123 -0
  49. package/dist/menu/MobileActionSheetContent.js.map +1 -0
  50. package/dist/menu/computeFloatingMenuGeometry.d.ts +12 -0
  51. package/dist/menu/computeFloatingMenuGeometry.d.ts.map +1 -0
  52. package/dist/menu/computeFloatingMenuGeometry.js +30 -0
  53. package/dist/menu/computeFloatingMenuGeometry.js.map +1 -0
  54. package/dist/menu/index.d.ts +6 -0
  55. package/dist/menu/index.d.ts.map +1 -0
  56. package/dist/menu/index.js +13 -0
  57. package/dist/menu/index.js.map +1 -0
  58. package/dist/menu/useFloatingMenuGeometry.d.ts +13 -0
  59. package/dist/menu/useFloatingMenuGeometry.d.ts.map +1 -0
  60. package/dist/menu/useFloatingMenuGeometry.js +50 -0
  61. package/dist/menu/useFloatingMenuGeometry.js.map +1 -0
  62. package/dist/overlay/OverlayStackProvider.d.ts +17 -0
  63. package/dist/overlay/OverlayStackProvider.d.ts.map +1 -0
  64. package/dist/overlay/OverlayStackProvider.js +120 -0
  65. package/dist/overlay/OverlayStackProvider.js.map +1 -0
  66. package/dist/overlay/SiteOverlayBackdrop.d.ts +13 -0
  67. package/dist/overlay/SiteOverlayBackdrop.d.ts.map +1 -0
  68. package/dist/overlay/SiteOverlayBackdrop.js +62 -0
  69. package/dist/overlay/SiteOverlayBackdrop.js.map +1 -0
  70. package/dist/overlay/index.d.ts +6 -0
  71. package/dist/overlay/index.d.ts.map +1 -0
  72. package/dist/overlay/index.js +18 -0
  73. package/dist/overlay/index.js.map +1 -0
  74. package/dist/overlay/overlayHistory.d.ts +8 -0
  75. package/dist/overlay/overlayHistory.d.ts.map +1 -0
  76. package/dist/overlay/overlayHistory.js +14 -0
  77. package/dist/overlay/overlayHistory.js.map +1 -0
  78. package/dist/overlay/overlayStackTypes.d.ts +10 -0
  79. package/dist/overlay/overlayStackTypes.d.ts.map +1 -0
  80. package/dist/overlay/overlayStackTypes.js +9 -0
  81. package/dist/overlay/overlayStackTypes.js.map +1 -0
  82. package/dist/overlay/useOverlayStackEntry.d.ts +11 -0
  83. package/dist/overlay/useOverlayStackEntry.d.ts.map +1 -0
  84. package/dist/overlay/useOverlayStackEntry.js +55 -0
  85. package/dist/overlay/useOverlayStackEntry.js.map +1 -0
  86. package/dist/presence/index.d.ts +2 -0
  87. package/dist/presence/index.d.ts.map +1 -0
  88. package/dist/presence/index.js +7 -0
  89. package/dist/presence/index.js.map +1 -0
  90. package/dist/presence/useOverlayPresence.d.ts +10 -0
  91. package/dist/presence/useOverlayPresence.d.ts.map +1 -0
  92. package/dist/presence/useOverlayPresence.js +119 -0
  93. package/dist/presence/useOverlayPresence.js.map +1 -0
  94. package/package.json +81 -0
  95. package/src/styles/about-dialog.css +117 -0
  96. package/src/styles/index.css +3 -0
  97. package/src/styles/mobile-action-sheet.css +166 -0
  98. package/src/styles/overlay.css +61 -0
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # @umamichi-ui/common-components
2
+
3
+ > 以下内容为 LLM 生成,且未经人工检查,请谨慎对待
4
+
5
+ Umamichi 站点共用的 React UI 组件库,与 [@umamichi-ui/common-css](https://www.npmjs.com/package/@umamichi-ui/common-css) 配合使用。
6
+
7
+ 各子模块可单独引用,彼此尽量解耦:
8
+
9
+ | 子路径 | 内容 |
10
+ |--------|------|
11
+ | `@umamichi-ui/common-components/presence` | 进出场动画 hook(不依赖叠层栈) |
12
+ | `@umamichi-ui/common-components/overlay` | 叠层栈、`SiteOverlayBackdrop` |
13
+ | `@umamichi-ui/common-components/icons` | Chevron、下拉箭头、信息图标 |
14
+ | `@umamichi-ui/common-components/menu` | `FloatingMenu`、`MobileActionSheet` |
15
+ | `@umamichi-ui/common-components/dialog` | `ConfirmDialog`、`AboutDialog` |
16
+ | `@umamichi-ui/common-components/styles.css` | 本库补充样式(overlay、action sheet、about) |
17
+
18
+ ## 依赖图
19
+
20
+ 模块间**单向**依赖;`presence` 与 `icons` 为叶子模块,可被任意上层单独引用。
21
+
22
+ ```mermaid
23
+ flowchart TB
24
+ subgraph peer["Peer(消费方安装)"]
25
+ react["react / react-dom"]
26
+ commonCss["@umamichi-ui/common-css"]
27
+ end
28
+
29
+ subgraph pkg["@umamichi-ui/common-components"]
30
+ presence["presence<br/>useOverlayPresence"]
31
+ icons["icons<br/>Chevron · DropdownMenuChevron · InfoCircle"]
32
+ overlay["overlay<br/>OverlayStackProvider · SiteOverlayBackdrop"]
33
+ menu["menu<br/>FloatingMenu · MobileActionSheet"]
34
+ dialog["dialog<br/>ConfirmDialog · ConfirmDialogOverlay · AboutDialog"]
35
+ styles["styles.css"]
36
+ end
37
+
38
+ react --> presence
39
+ react --> icons
40
+ react --> overlay
41
+ react --> menu
42
+ react --> dialog
43
+
44
+ commonCss -.->|"class 名约定"| styles
45
+ styles -.-> overlay
46
+ styles -.-> menu
47
+ styles -.-> dialog
48
+
49
+ presence --> overlay
50
+ presence --> menu
51
+
52
+ icons --> menu
53
+
54
+ overlay --> menu
55
+ overlay --> dialog
56
+ ```
57
+
58
+ | 从 | 到 | 说明 |
59
+ |----|-----|------|
60
+ | `presence` | `overlay` | `SiteOverlayBackdrop` 进出场动画 |
61
+ | `presence` | `menu` | `FloatingMenu` 面板淡入(不进叠层栈) |
62
+ | `icons` | `menu` | 下拉箭头;ActionSheet 子菜单 Chevron |
63
+ | `overlay` | `menu` | `MobileActionSheet` 底部 backdrop |
64
+ | `overlay` | `dialog` | `ConfirmDialogOverlay` |
65
+ | `dialog`(内部) | — | `AboutDialog` → `ConfirmDialog` + `ConfirmDialogOverlay` |
66
+
67
+ **无库内依赖:** `ConfirmDialog`(纯 markup 壳)、`computeFloatingMenuGeometry`、`OverlayStackProvider` 自身逻辑。
68
+
69
+ `menu` 子模块内:`FloatingMenu` 只走 `presence`;`MobileActionSheet` 额外依赖 `overlay`。
70
+
71
+ ## 使用
72
+
73
+ ```tsx
74
+ import '@umamichi-ui/common-css';
75
+ import '@umamichi-ui/common-components/styles.css';
76
+ import { OverlayStackProvider } from '@umamichi-ui/common-components/overlay';
77
+
78
+ // 根组件
79
+ <OverlayStackProvider>
80
+ <App />
81
+ </OverlayStackProvider>
82
+ ```
83
+
84
+ `MobileActionSheet` 与 `ConfirmDialogOverlay` 需要外层已挂载 `OverlayStackProvider`。`FloatingMenu` 仅需 `presence` hook,不进入叠层栈。
85
+
86
+ ## 开发
87
+
88
+ ```bash
89
+ npm install
90
+ npm run build
91
+ ```
92
+
93
+ 安装(npm 发布后):
94
+
95
+ ```bash
96
+ npm install @umamichi-ui/common-components @umamichi-ui/common-css
97
+ ```
98
+
99
+ 本地联调可在消费项目中添加:
100
+
101
+ ```json
102
+ "@umamichi-ui/common-components": "file:../umamichi-ui/common-components"
103
+ ```
104
+
105
+ ## 发布
106
+
107
+ ```bash
108
+ npm run build
109
+ npm publish --access public
110
+ ```
111
+
112
+ 版本记录见 [CHANGELOG.md](./CHANGELOG.md)。
@@ -0,0 +1,27 @@
1
+ import type { ReactNode } from 'react';
2
+ export type AboutDialogLink = {
3
+ label: string;
4
+ href: string;
5
+ };
6
+ export type AboutDialogSection = {
7
+ id: string;
8
+ title: string;
9
+ content: ReactNode;
10
+ };
11
+ export type AboutDialogProps = {
12
+ open: boolean;
13
+ overlayId: string;
14
+ onClose: () => void;
15
+ appName: string;
16
+ version: string;
17
+ channelLabel?: ReactNode;
18
+ tagline?: ReactNode;
19
+ copyrightYear: number;
20
+ copyrightHolder?: string;
21
+ sections?: AboutDialogSection[];
22
+ links?: AboutDialogLink[];
23
+ dialogTitle?: string;
24
+ closeLabel?: string;
25
+ };
26
+ export declare function AboutDialog({ open, overlayId, onClose, appName, version, channelLabel, tagline, copyrightYear, copyrightHolder, sections, links, dialogTitle, closeLabel, }: AboutDialogProps): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=AboutDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AboutDialog.d.ts","sourceRoot":"","sources":["../../src/dialog/AboutDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,YAAY,EACZ,OAAO,EACP,aAAa,EACb,eAA4B,EAC5B,QAAa,EACb,KAAU,EACV,WAAkB,EAClB,UAAiB,GAClB,EAAE,gBAAgB,2CAyDlB"}
@@ -0,0 +1,61 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { ConfirmDialog } from "./ConfirmDialog.js";
3
+ import { ConfirmDialogOverlay } from "./ConfirmDialogOverlay.js";
4
+ function AboutDialog({
5
+ open,
6
+ overlayId,
7
+ onClose,
8
+ appName,
9
+ version,
10
+ channelLabel,
11
+ tagline,
12
+ copyrightYear,
13
+ copyrightHolder = "Umamichi",
14
+ sections = [],
15
+ links = [],
16
+ dialogTitle = "关于",
17
+ closeLabel = "确定"
18
+ }) {
19
+ return /* @__PURE__ */ jsx(ConfirmDialogOverlay, { open, overlayId, onDismiss: onClose, children: /* @__PURE__ */ jsxs(
20
+ ConfirmDialog,
21
+ {
22
+ title: dialogTitle,
23
+ titleId: "about-dialog-title",
24
+ className: "confirm-dialog about-dialog",
25
+ bodyClassName: "confirm-dialog-body about-dialog-body",
26
+ onClick: (event) => event.stopPropagation(),
27
+ actionsClassName: "confirm-dialog-actions about-dialog-actions",
28
+ actions: /* @__PURE__ */ jsx("button", { type: "button", className: "primary-button", onClick: onClose, children: closeLabel }),
29
+ children: [
30
+ /* @__PURE__ */ jsxs("div", { className: "about-dialog-product", children: [
31
+ /* @__PURE__ */ jsx("p", { className: "about-dialog-app-name", children: appName }),
32
+ /* @__PURE__ */ jsxs("p", { className: "about-dialog-version", children: [
33
+ "版本 ",
34
+ version,
35
+ channelLabel ? /* @__PURE__ */ jsx("span", { className: "about-dialog-channel", children: channelLabel }) : null
36
+ ] }),
37
+ tagline ? /* @__PURE__ */ jsx("p", { className: "about-dialog-tagline", children: tagline }) : null
38
+ ] }),
39
+ /* @__PURE__ */ jsxs("p", { className: "about-dialog-copyright", children: [
40
+ "© ",
41
+ copyrightYear,
42
+ " ",
43
+ copyrightHolder
44
+ ] }),
45
+ sections.length > 0 || links.length > 0 ? /* @__PURE__ */ jsx("hr", { className: "about-dialog-divider" }) : null,
46
+ sections.map((section) => /* @__PURE__ */ jsxs("section", { className: "about-dialog-section", "aria-labelledby": section.id, children: [
47
+ /* @__PURE__ */ jsx("h3", { id: section.id, className: "about-dialog-section-title", children: section.title }),
48
+ /* @__PURE__ */ jsx("div", { className: "about-dialog-section-text", children: section.content })
49
+ ] }, section.id)),
50
+ links.length > 0 ? /* @__PURE__ */ jsx("dl", { className: "about-dialog-meta", children: links.map((link) => /* @__PURE__ */ jsxs("div", { className: "about-dialog-meta-row", children: [
51
+ /* @__PURE__ */ jsx("dt", { children: link.label }),
52
+ /* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx("a", { href: link.href, target: "_blank", rel: "noreferrer", children: link.href }) })
53
+ ] }, link.label)) }) : null
54
+ ]
55
+ }
56
+ ) });
57
+ }
58
+ export {
59
+ AboutDialog
60
+ };
61
+ //# sourceMappingURL=AboutDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AboutDialog.js","sources":["../../src/dialog/AboutDialog.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { ConfirmDialog } from './ConfirmDialog';\nimport { ConfirmDialogOverlay } from './ConfirmDialogOverlay';\n\nexport type AboutDialogLink = {\n label: string;\n href: string;\n};\n\nexport type AboutDialogSection = {\n id: string;\n title: string;\n content: ReactNode;\n};\n\nexport type AboutDialogProps = {\n open: boolean;\n overlayId: string;\n onClose: () => void;\n appName: string;\n version: string;\n channelLabel?: ReactNode;\n tagline?: ReactNode;\n copyrightYear: number;\n copyrightHolder?: string;\n sections?: AboutDialogSection[];\n links?: AboutDialogLink[];\n dialogTitle?: string;\n closeLabel?: string;\n};\n\nexport function AboutDialog({\n open,\n overlayId,\n onClose,\n appName,\n version,\n channelLabel,\n tagline,\n copyrightYear,\n copyrightHolder = 'Umamichi',\n sections = [],\n links = [],\n dialogTitle = '关于',\n closeLabel = '确定',\n}: AboutDialogProps) {\n return (\n <ConfirmDialogOverlay open={open} overlayId={overlayId} onDismiss={onClose}>\n <ConfirmDialog\n title={dialogTitle}\n titleId=\"about-dialog-title\"\n className=\"confirm-dialog about-dialog\"\n bodyClassName=\"confirm-dialog-body about-dialog-body\"\n onClick={(event) => event.stopPropagation()}\n actionsClassName=\"confirm-dialog-actions about-dialog-actions\"\n actions={\n <button type=\"button\" className=\"primary-button\" onClick={onClose}>\n {closeLabel}\n </button>\n }\n >\n <div className=\"about-dialog-product\">\n <p className=\"about-dialog-app-name\">{appName}</p>\n <p className=\"about-dialog-version\">\n 版本 {version}\n {channelLabel ? <span className=\"about-dialog-channel\">{channelLabel}</span> : null}\n </p>\n {tagline ? <p className=\"about-dialog-tagline\">{tagline}</p> : null}\n </div>\n\n <p className=\"about-dialog-copyright\">\n © {copyrightYear} {copyrightHolder}\n </p>\n\n {sections.length > 0 || links.length > 0 ? <hr className=\"about-dialog-divider\" /> : null}\n\n {sections.map((section) => (\n <section key={section.id} className=\"about-dialog-section\" aria-labelledby={section.id}>\n <h3 id={section.id} className=\"about-dialog-section-title\">\n {section.title}\n </h3>\n <div className=\"about-dialog-section-text\">{section.content}</div>\n </section>\n ))}\n\n {links.length > 0 ? (\n <dl className=\"about-dialog-meta\">\n {links.map((link) => (\n <div key={link.label} className=\"about-dialog-meta-row\">\n <dt>{link.label}</dt>\n <dd>\n <a href={link.href} target=\"_blank\" rel=\"noreferrer\">\n {link.href}\n </a>\n </dd>\n </div>\n ))}\n </dl>\n ) : null}\n </ConfirmDialog>\n </ConfirmDialogOverlay>\n );\n}\n"],"names":[],"mappings":";;;AA+BO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,WAAW,CAAA;AAAA,EACX,QAAQ,CAAA;AAAA,EACR,cAAc;AAAA,EACd,aAAa;AACf,GAAqB;AACnB,SACE,oBAAC,sBAAA,EAAqB,MAAY,WAAsB,WAAW,SACjE,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,eAAc;AAAA,MACd,SAAS,CAAC,UAAU,MAAM,gBAAA;AAAA,MAC1B,kBAAiB;AAAA,MACjB,6BACG,UAAA,EAAO,MAAK,UAAS,WAAU,kBAAiB,SAAS,SACvD,UAAA,WAAA,CACH;AAAA,MAGF,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAA,oBAAC,KAAA,EAAE,WAAU,yBAAyB,UAAA,SAAQ;AAAA,UAC9C,qBAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA;AAAA,YAAA;AAAA,YAC9B;AAAA,YACH,eAAe,oBAAC,QAAA,EAAK,WAAU,wBAAwB,wBAAa,IAAU;AAAA,UAAA,GACjF;AAAA,UACC,UAAU,oBAAC,KAAA,EAAE,WAAU,wBAAwB,mBAAQ,IAAO;AAAA,QAAA,GACjE;AAAA,QAEA,qBAAC,KAAA,EAAE,WAAU,0BAAyB,UAAA;AAAA,UAAA;AAAA,UACjC;AAAA,UAAc;AAAA,UAAE;AAAA,QAAA,GACrB;AAAA,QAEC,SAAS,SAAS,KAAK,MAAM,SAAS,IAAI,oBAAC,MAAA,EAAG,WAAU,uBAAA,CAAuB,IAAK;AAAA,QAEpF,SAAS,IAAI,CAAC,YACb,qBAAC,aAAyB,WAAU,wBAAuB,mBAAiB,QAAQ,IAClF,UAAA;AAAA,UAAA,oBAAC,QAAG,IAAI,QAAQ,IAAI,WAAU,8BAC3B,kBAAQ,MAAA,CACX;AAAA,UACA,oBAAC,OAAA,EAAI,WAAU,6BAA6B,kBAAQ,QAAA,CAAQ;AAAA,QAAA,KAJhD,QAAQ,EAKtB,CACD;AAAA,QAEA,MAAM,SAAS,IACd,oBAAC,QAAG,WAAU,qBACX,UAAA,MAAM,IAAI,CAAC,SACV,qBAAC,OAAA,EAAqB,WAAU,yBAC9B,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAI,eAAK,MAAA,CAAM;AAAA,UAChB,oBAAC,MAAA,EACC,UAAA,oBAAC,KAAA,EAAE,MAAM,KAAK,MAAM,QAAO,UAAS,KAAI,cACrC,UAAA,KAAK,MACR,EAAA,CACF;AAAA,QAAA,EAAA,GANQ,KAAK,KAOf,CACD,EAAA,CACH,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;"}
@@ -0,0 +1,17 @@
1
+ import type { FormEventHandler, MouseEventHandler, ReactNode } from 'react';
2
+ export type ConfirmDialogProps = {
3
+ title: ReactNode;
4
+ titleId?: string;
5
+ children: ReactNode;
6
+ actions: ReactNode;
7
+ className?: string;
8
+ bodyClassName?: string;
9
+ actionsClassName?: string;
10
+ role?: 'dialog' | 'alertdialog';
11
+ ariaDescribedBy?: string;
12
+ onClick?: MouseEventHandler<HTMLElement>;
13
+ onSubmit?: FormEventHandler<HTMLFormElement>;
14
+ as?: 'div' | 'form';
15
+ };
16
+ export declare function ConfirmDialog({ title, titleId, children, actions, className, bodyClassName, actionsClassName, role, ariaDescribedBy, onClick, onSubmit, as, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/dialog/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC7C,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,OAAO,EACP,SAA4B,EAC5B,aAAqC,EACrC,gBAA2C,EAC3C,IAAe,EACf,eAAe,EACf,OAAO,EACP,QAAQ,EACR,EAAU,GACX,EAAE,kBAAkB,2CA8BpB"}
@@ -0,0 +1,38 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ function ConfirmDialog({
3
+ title,
4
+ titleId,
5
+ children,
6
+ actions,
7
+ className = "confirm-dialog",
8
+ bodyClassName = "confirm-dialog-body",
9
+ actionsClassName = "confirm-dialog-actions",
10
+ role = "dialog",
11
+ ariaDescribedBy,
12
+ onClick,
13
+ onSubmit,
14
+ as = "div"
15
+ }) {
16
+ const resolvedTitleId = titleId ?? "confirm-dialog-title";
17
+ const sharedProps = {
18
+ className,
19
+ role,
20
+ "aria-modal": true,
21
+ "aria-labelledby": resolvedTitleId,
22
+ ...ariaDescribedBy ? { "aria-describedby": ariaDescribedBy } : {},
23
+ onClick
24
+ };
25
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
26
+ /* @__PURE__ */ jsx("h2", { id: resolvedTitleId, className: "confirm-dialog-title", children: title }),
27
+ /* @__PURE__ */ jsx("div", { className: bodyClassName, children }),
28
+ /* @__PURE__ */ jsx("div", { className: actionsClassName, children: actions })
29
+ ] });
30
+ if (as === "form") {
31
+ return /* @__PURE__ */ jsx("form", { ...sharedProps, onSubmit, children: inner });
32
+ }
33
+ return /* @__PURE__ */ jsx("div", { ...sharedProps, children: inner });
34
+ }
35
+ export {
36
+ ConfirmDialog
37
+ };
38
+ //# sourceMappingURL=ConfirmDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.js","sources":["../../src/dialog/ConfirmDialog.tsx"],"sourcesContent":["import type { FormEventHandler, MouseEventHandler, ReactNode } from 'react';\n\nexport type ConfirmDialogProps = {\n title: ReactNode;\n titleId?: string;\n children: ReactNode;\n actions: ReactNode;\n className?: string;\n bodyClassName?: string;\n actionsClassName?: string;\n role?: 'dialog' | 'alertdialog';\n ariaDescribedBy?: string;\n onClick?: MouseEventHandler<HTMLElement>;\n onSubmit?: FormEventHandler<HTMLFormElement>;\n as?: 'div' | 'form';\n};\n\nexport function ConfirmDialog({\n title,\n titleId,\n children,\n actions,\n className = 'confirm-dialog',\n bodyClassName = 'confirm-dialog-body',\n actionsClassName = 'confirm-dialog-actions',\n role = 'dialog',\n ariaDescribedBy,\n onClick,\n onSubmit,\n as = 'div',\n}: ConfirmDialogProps) {\n const resolvedTitleId = titleId ?? 'confirm-dialog-title';\n const sharedProps = {\n className,\n role,\n 'aria-modal': true as const,\n 'aria-labelledby': resolvedTitleId,\n ...(ariaDescribedBy ? { 'aria-describedby': ariaDescribedBy } : {}),\n onClick,\n };\n\n const inner = (\n <>\n <h2 id={resolvedTitleId} className=\"confirm-dialog-title\">\n {title}\n </h2>\n <div className={bodyClassName}>{children}</div>\n <div className={actionsClassName}>{actions}</div>\n </>\n );\n\n if (as === 'form') {\n return (\n <form {...sharedProps} onSubmit={onSubmit}>\n {inner}\n </form>\n );\n }\n\n return <div {...sharedProps}>{inner}</div>;\n}\n"],"names":[],"mappings":";AAiBO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AACP,GAAuB;AACrB,QAAM,kBAAkB,WAAW;AACnC,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,GAAI,kBAAkB,EAAE,oBAAoB,gBAAA,IAAoB,CAAA;AAAA,IAChE;AAAA,EAAA;AAGF,QAAM,QACJ,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,MAAA,EAAG,IAAI,iBAAiB,WAAU,wBAChC,UAAA,OACH;AAAA,IACA,oBAAC,OAAA,EAAI,WAAW,eAAgB,SAAA,CAAS;AAAA,IACzC,oBAAC,OAAA,EAAI,WAAW,kBAAmB,UAAA,QAAA,CAAQ;AAAA,EAAA,GAC7C;AAGF,MAAI,OAAO,QAAQ;AACjB,WACE,oBAAC,QAAA,EAAM,GAAG,aAAa,UACpB,UAAA,OACH;AAAA,EAEJ;AAEA,SAAO,oBAAC,OAAA,EAAK,GAAG,aAAc,UAAA,OAAM;AACtC;"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type SiteOverlayAlign } from '../overlay/SiteOverlayBackdrop';
3
+ export type ConfirmDialogOverlayProps = {
4
+ open: boolean;
5
+ overlayId: string;
6
+ onDismiss: () => void;
7
+ onExited?: () => void;
8
+ children: ReactNode;
9
+ align?: SiteOverlayAlign;
10
+ dismissOnEscape?: boolean;
11
+ };
12
+ export declare function ConfirmDialogOverlay({ open, overlayId, onDismiss, onExited, children, align, dismissOnEscape, }: ConfirmDialogOverlayProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=ConfirmDialogOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialogOverlay.d.ts","sourceRoot":"","sources":["../../src/dialog/ConfirmDialogOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAE5F,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAkB,EAClB,eAAsB,GACvB,EAAE,yBAAyB,2CAa3B"}
@@ -0,0 +1,28 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SiteOverlayBackdrop } from "../overlay/SiteOverlayBackdrop.js";
3
+ function ConfirmDialogOverlay({
4
+ open,
5
+ overlayId,
6
+ onDismiss,
7
+ onExited,
8
+ children,
9
+ align = "centered",
10
+ dismissOnEscape = true
11
+ }) {
12
+ return /* @__PURE__ */ jsx(
13
+ SiteOverlayBackdrop,
14
+ {
15
+ open,
16
+ overlayId,
17
+ align,
18
+ onDismiss,
19
+ onExited,
20
+ dismissOnEscape,
21
+ children
22
+ }
23
+ );
24
+ }
25
+ export {
26
+ ConfirmDialogOverlay
27
+ };
28
+ //# sourceMappingURL=ConfirmDialogOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialogOverlay.js","sources":["../../src/dialog/ConfirmDialogOverlay.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { SiteOverlayBackdrop, type SiteOverlayAlign } from '../overlay/SiteOverlayBackdrop';\n\nexport type ConfirmDialogOverlayProps = {\n open: boolean;\n overlayId: string;\n onDismiss: () => void;\n onExited?: () => void;\n children: ReactNode;\n align?: SiteOverlayAlign;\n dismissOnEscape?: boolean;\n};\n\nexport function ConfirmDialogOverlay({\n open,\n overlayId,\n onDismiss,\n onExited,\n children,\n align = 'centered',\n dismissOnEscape = true,\n}: ConfirmDialogOverlayProps) {\n return (\n <SiteOverlayBackdrop\n open={open}\n overlayId={overlayId}\n align={align}\n onDismiss={onDismiss}\n onExited={onExited}\n dismissOnEscape={dismissOnEscape}\n >\n {children}\n </SiteOverlayBackdrop>\n );\n}\n"],"names":[],"mappings":";;AAaO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,kBAAkB;AACpB,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,4 @@
1
+ export { AboutDialog, type AboutDialogLink, type AboutDialogProps, type AboutDialogSection, } from './AboutDialog';
2
+ export { ConfirmDialog, type ConfirmDialogProps } from './ConfirmDialog';
3
+ export { ConfirmDialogOverlay, type ConfirmDialogOverlayProps } from './ConfirmDialogOverlay';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { AboutDialog } from "./AboutDialog.js";
2
+ import { ConfirmDialog } from "./ConfirmDialog.js";
3
+ import { ConfirmDialogOverlay } from "./ConfirmDialogOverlay.js";
4
+ export {
5
+ AboutDialog,
6
+ ConfirmDialog,
7
+ ConfirmDialogOverlay
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,6 @@
1
+ export type ChevronIconProps = {
2
+ className?: string;
3
+ };
4
+ export declare function ChevronRightIcon({ className }: ChevronIconProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function ChevronLeftIcon({ className }: ChevronIconProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=ChevronIcons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChevronIcons.d.ts","sourceRoot":"","sources":["../../src/icons/ChevronIcons.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,wBAAgB,gBAAgB,CAAC,EAAE,SAA0B,EAAE,EAAE,gBAAgB,2CAMhF;AAED,wBAAgB,eAAe,CAAC,EAAE,SAA0B,EAAE,EAAE,gBAAgB,2CAM/E"}
@@ -0,0 +1,19 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ const chevronPathProps = {
3
+ fill: "none",
4
+ stroke: "currentColor",
5
+ strokeWidth: 1.75,
6
+ strokeLinecap: "square",
7
+ strokeLinejoin: "miter"
8
+ };
9
+ function ChevronRightIcon({ className = "chevron-icon" }) {
10
+ return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 16 16", width: "20", height: "20", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M6 4 L10 8 L6 12", ...chevronPathProps }) });
11
+ }
12
+ function ChevronLeftIcon({ className = "chevron-icon" }) {
13
+ return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 16 16", width: "20", height: "20", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M10 4 L6 8 L10 12", ...chevronPathProps }) });
14
+ }
15
+ export {
16
+ ChevronLeftIcon,
17
+ ChevronRightIcon
18
+ };
19
+ //# sourceMappingURL=ChevronIcons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChevronIcons.js","sources":["../../src/icons/ChevronIcons.tsx"],"sourcesContent":["export type ChevronIconProps = {\n className?: string;\n};\n\nconst chevronPathProps = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.75,\n strokeLinecap: 'square' as const,\n strokeLinejoin: 'miter' as const,\n};\n\nexport function ChevronRightIcon({ className = 'chevron-icon' }: ChevronIconProps) {\n return (\n <svg className={className} viewBox=\"0 0 16 16\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n <path d=\"M6 4 L10 8 L6 12\" {...chevronPathProps} />\n </svg>\n );\n}\n\nexport function ChevronLeftIcon({ className = 'chevron-icon' }: ChevronIconProps) {\n return (\n <svg className={className} viewBox=\"0 0 16 16\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n <path d=\"M10 4 L6 8 L10 12\" {...chevronPathProps} />\n </svg>\n );\n}\n"],"names":[],"mappings":";AAIA,MAAM,mBAAmB;AAAA,EACvB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;AAEO,SAAS,iBAAiB,EAAE,YAAY,kBAAoC;AACjF,6BACG,OAAA,EAAI,WAAsB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,eAAY,QAChF,UAAA,oBAAC,QAAA,EAAK,GAAE,oBAAoB,GAAG,kBAAkB,GACnD;AAEJ;AAEO,SAAS,gBAAgB,EAAE,YAAY,kBAAoC;AAChF,6BACG,OAAA,EAAI,WAAsB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,eAAY,QAChF,UAAA,oBAAC,QAAA,EAAK,GAAE,qBAAqB,GAAG,kBAAkB,GACpD;AAEJ;"}
@@ -0,0 +1,6 @@
1
+ export type DropdownMenuChevronProps = {
2
+ className?: string;
3
+ size?: number;
4
+ };
5
+ export declare function DropdownMenuChevron({ className, size }: DropdownMenuChevronProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=DropdownMenuChevron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownMenuChevron.d.ts","sourceRoot":"","sources":["../../src/icons/DropdownMenuChevron.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAAE,SAAmC,EAAE,IAAI,EAAE,EAAE,wBAAwB,2CAgB1G"}
@@ -0,0 +1,20 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ function DropdownMenuChevron({ className = "dropdown-menu-chevron", size }) {
3
+ const width = size ?? "0.72em";
4
+ const height = size ?? "0.72em";
5
+ return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 16 16", width, height, "aria-hidden": "true", children: /* @__PURE__ */ jsx(
6
+ "path",
7
+ {
8
+ d: "M4 7 L8 11 L12 7",
9
+ fill: "none",
10
+ stroke: "currentColor",
11
+ strokeWidth: "1.75",
12
+ strokeLinecap: "square",
13
+ strokeLinejoin: "miter"
14
+ }
15
+ ) });
16
+ }
17
+ export {
18
+ DropdownMenuChevron
19
+ };
20
+ //# sourceMappingURL=DropdownMenuChevron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownMenuChevron.js","sources":["../../src/icons/DropdownMenuChevron.tsx"],"sourcesContent":["export type DropdownMenuChevronProps = {\n className?: string;\n size?: number;\n};\n\nexport function DropdownMenuChevron({ className = 'dropdown-menu-chevron', size }: DropdownMenuChevronProps) {\n const width = size ?? '0.72em';\n const height = size ?? '0.72em';\n\n return (\n <svg className={className} viewBox=\"0 0 16 16\" width={width} height={height} aria-hidden=\"true\">\n <path\n d=\"M4 7 L8 11 L12 7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n />\n </svg>\n );\n}\n"],"names":[],"mappings":";AAKO,SAAS,oBAAoB,EAAE,YAAY,yBAAyB,QAAkC;AAC3G,QAAM,QAAQ,QAAQ;AACtB,QAAM,SAAS,QAAQ;AAEvB,SACE,oBAAC,SAAI,WAAsB,SAAQ,aAAY,OAAc,QAAgB,eAAY,QACvF,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;"}
@@ -0,0 +1,5 @@
1
+ export type InfoCircleIconProps = {
2
+ className?: string;
3
+ };
4
+ export declare function InfoCircleIcon({ className }: InfoCircleIconProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=InfoCircleIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InfoCircleIcon.d.ts","sourceRoot":"","sources":["../../src/icons/InfoCircleIcon.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,SAAkC,EAAE,EAAE,mBAAmB,2CAUzF"}
@@ -0,0 +1,17 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ function InfoCircleIcon({ className = "app-info-circle-icon" }) {
3
+ return /* @__PURE__ */ jsxs("svg", { className, viewBox: "0 0 24 24", width: "20", height: "20", "aria-hidden": true, children: [
4
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9", fill: "none", stroke: "currentColor", strokeWidth: "2" }),
5
+ /* @__PURE__ */ jsx(
6
+ "path",
7
+ {
8
+ fill: "currentColor",
9
+ d: "M12 10.25a1.1 1.1 0 1 0 0-2.2 1.1 1.1 0 0 0 0 2.2Zm-.15 1.05c-.55 0-1 .35-1 .9v4.1c0 .55.45.9 1 .9h.3c.55 0 1-.35 1-.9v-4.1c0-.55-.45-.9-1-.9h-.3Z"
10
+ }
11
+ )
12
+ ] });
13
+ }
14
+ export {
15
+ InfoCircleIcon
16
+ };
17
+ //# sourceMappingURL=InfoCircleIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InfoCircleIcon.js","sources":["../../src/icons/InfoCircleIcon.tsx"],"sourcesContent":["export type InfoCircleIconProps = {\n className?: string;\n};\n\nexport function InfoCircleIcon({ className = 'app-info-circle-icon' }: InfoCircleIconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n fill=\"currentColor\"\n d=\"M12 10.25a1.1 1.1 0 1 0 0-2.2 1.1 1.1 0 0 0 0 2.2Zm-.15 1.05c-.55 0-1 .35-1 .9v4.1c0 .55.45.9 1 .9h.3c.55 0 1-.35 1-.9v-4.1c0-.55-.45-.9-1-.9h-.3Z\"\n />\n </svg>\n );\n}\n"],"names":[],"mappings":";AAIO,SAAS,eAAe,EAAE,YAAY,0BAA+C;AAC1F,SACE,qBAAC,OAAA,EAAI,WAAsB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,eAAW,MAC/E,UAAA;AAAA,IAAA,oBAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI;AAAA,IAChF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,GAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EACJ,GACF;AAEJ;"}
@@ -0,0 +1,4 @@
1
+ export { ChevronLeftIcon, ChevronRightIcon, type ChevronIconProps } from './ChevronIcons';
2
+ export { DropdownMenuChevron, type DropdownMenuChevronProps } from './DropdownMenuChevron';
3
+ export { InfoCircleIcon, type InfoCircleIconProps } from './InfoCircleIcon';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ChevronLeftIcon, ChevronRightIcon } from "./ChevronIcons.js";
2
+ import { DropdownMenuChevron } from "./DropdownMenuChevron.js";
3
+ import { InfoCircleIcon } from "./InfoCircleIcon.js";
4
+ export {
5
+ ChevronLeftIcon,
6
+ ChevronRightIcon,
7
+ DropdownMenuChevron,
8
+ InfoCircleIcon
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,6 @@
1
+ export * from './presence';
2
+ export * from './overlay';
3
+ export * from './icons';
4
+ export * from './menu';
5
+ export * from './dialog';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ import { AboutDialog } from "./dialog/AboutDialog.js";
2
+ import { ChevronLeftIcon, ChevronRightIcon } from "./icons/ChevronIcons.js";
3
+ import { ConfirmDialog } from "./dialog/ConfirmDialog.js";
4
+ import { ConfirmDialogOverlay } from "./dialog/ConfirmDialogOverlay.js";
5
+ import { DropdownMenuChevron } from "./icons/DropdownMenuChevron.js";
6
+ import { FloatingMenu } from "./menu/FloatingMenu.js";
7
+ import { InfoCircleIcon } from "./icons/InfoCircleIcon.js";
8
+ import { MobileActionSheet } from "./menu/MobileActionSheet.js";
9
+ import { MobileActionSheetContent } from "./menu/MobileActionSheetContent.js";
10
+ import { OVERLAY_HISTORY_STATE_KEY, isOverlayHistoryState, pushOverlayHistoryState } from "./overlay/overlayHistory.js";
11
+ import { OVERLAY_Z_BASE, OVERLAY_Z_STEP, computeOverlayZIndex } from "./overlay/overlayStackTypes.js";
12
+ import { OverlayStackProvider, useOverlayStack } from "./overlay/OverlayStackProvider.js";
13
+ import { SiteOverlayBackdrop } from "./overlay/SiteOverlayBackdrop.js";
14
+ import { computeFloatingMenuGeometry } from "./menu/computeFloatingMenuGeometry.js";
15
+ import { mergeOverlayRefs, useOverlayPresence, withOverlayOpen } from "./presence/useOverlayPresence.js";
16
+ import { useFloatingMenuGeometry } from "./menu/useFloatingMenuGeometry.js";
17
+ import { useOverlayStackEntry } from "./overlay/useOverlayStackEntry.js";
18
+ export {
19
+ AboutDialog,
20
+ ChevronLeftIcon,
21
+ ChevronRightIcon,
22
+ ConfirmDialog,
23
+ ConfirmDialogOverlay,
24
+ DropdownMenuChevron,
25
+ FloatingMenu,
26
+ InfoCircleIcon,
27
+ MobileActionSheet,
28
+ MobileActionSheetContent,
29
+ OVERLAY_HISTORY_STATE_KEY,
30
+ OVERLAY_Z_BASE,
31
+ OVERLAY_Z_STEP,
32
+ OverlayStackProvider,
33
+ SiteOverlayBackdrop,
34
+ computeFloatingMenuGeometry,
35
+ computeOverlayZIndex,
36
+ isOverlayHistoryState,
37
+ mergeOverlayRefs,
38
+ pushOverlayHistoryState,
39
+ useFloatingMenuGeometry,
40
+ useOverlayPresence,
41
+ useOverlayStack,
42
+ useOverlayStackEntry,
43
+ withOverlayOpen
44
+ };
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,28 @@
1
+ import { type ReactNode } from 'react';
2
+ export type FloatingMenuItem = {
3
+ kind: 'item';
4
+ id: string;
5
+ label: ReactNode;
6
+ disabled?: boolean;
7
+ title?: string;
8
+ onSelect: () => void;
9
+ };
10
+ export type FloatingMenuSeparator = {
11
+ kind: 'separator';
12
+ id: string;
13
+ };
14
+ export type FloatingMenuEntry = FloatingMenuItem | FloatingMenuSeparator;
15
+ export type FloatingMenuTriggerVariant = 'labeled' | 'icon';
16
+ export type FloatingMenuProps = {
17
+ menuAriaLabel: string;
18
+ items: FloatingMenuEntry[];
19
+ triggerLabel?: ReactNode;
20
+ triggerIcon?: ReactNode;
21
+ triggerVariant?: FloatingMenuTriggerVariant;
22
+ triggerClassName?: string;
23
+ triggerAriaLabel?: string;
24
+ scrollRootSelector?: string;
25
+ wrapClassName?: string;
26
+ };
27
+ export declare function FloatingMenu({ menuAriaLabel, items, triggerLabel, triggerIcon, triggerVariant, triggerClassName, triggerAriaLabel, scrollRootSelector, wrapClassName, }: FloatingMenuProps): import("react/jsx-runtime").JSX.Element;
28
+ //# sourceMappingURL=FloatingMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingMenu.d.ts","sourceRoot":"","sources":["../../src/menu/FloatingMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAM3E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;AAEzE,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,cAAc,CAAC,EAAE,0BAA0B,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAaF,wBAAgB,YAAY,CAAC,EAC3B,aAAa,EACb,KAAK,EACL,YAAY,EACZ,WAAW,EACX,cAA0B,EAC1B,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAA+B,GAChC,EAAE,iBAAiB,2CAqHnB"}