@qeetrix/react 0.0.1 → 0.0.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.
Files changed (263) hide show
  1. package/CHANGELOG.md +288 -0
  2. package/README.md +240 -4
  3. package/dist/accordion/accordion.d.ts +42 -0
  4. package/dist/accordion/accordion.js +72 -0
  5. package/dist/accordion/index.d.ts +2 -0
  6. package/dist/accordion/index.js +1 -0
  7. package/dist/avatar/avatar.d.ts +21 -0
  8. package/dist/avatar/avatar.js +43 -0
  9. package/dist/avatar/index.d.ts +2 -0
  10. package/dist/avatar/index.js +1 -0
  11. package/dist/badge/badge.d.ts +14 -0
  12. package/dist/badge/badge.js +25 -0
  13. package/dist/badge/index.d.ts +2 -0
  14. package/dist/badge/index.js +1 -0
  15. package/dist/box/box.d.ts +27 -0
  16. package/dist/box/box.js +21 -0
  17. package/dist/box/index.d.ts +2 -0
  18. package/dist/box/index.js +1 -0
  19. package/dist/button/button.d.ts +50 -0
  20. package/dist/button/button.js +78 -0
  21. package/dist/button/index.d.ts +2 -0
  22. package/dist/button/index.js +1 -0
  23. package/dist/card/card.d.ts +30 -0
  24. package/dist/card/card.js +56 -0
  25. package/dist/card/index.d.ts +2 -0
  26. package/dist/card/index.js +1 -0
  27. package/dist/checkbox/checkbox.d.ts +33 -0
  28. package/dist/checkbox/checkbox.js +61 -0
  29. package/dist/checkbox/index.d.ts +2 -0
  30. package/dist/checkbox/index.js +1 -0
  31. package/dist/css/accordion.css +73 -0
  32. package/dist/css/avatar.css +50 -0
  33. package/dist/css/badge.css +59 -0
  34. package/dist/css/box.css +163 -0
  35. package/dist/css/button.css +243 -0
  36. package/dist/css/card.css +75 -0
  37. package/dist/css/checkbox.css +67 -0
  38. package/dist/css/dialog.css +128 -0
  39. package/dist/css/drawer.css +129 -0
  40. package/dist/css/experimental/alert.css +89 -0
  41. package/dist/css/experimental/app-shell.css +258 -0
  42. package/dist/css/experimental/breadcrumb.css +67 -0
  43. package/dist/css/experimental/copy-button.css +13 -0
  44. package/dist/css/experimental/empty-state.css +63 -0
  45. package/dist/css/experimental/otp-input.css +84 -0
  46. package/dist/css/experimental/page-header.css +110 -0
  47. package/dist/css/experimental/password-input.css +21 -0
  48. package/dist/css/experimental/sidebar.css +234 -0
  49. package/dist/css/experimental/stat.css +115 -0
  50. package/dist/css/experimental/top-bar.css +299 -0
  51. package/dist/css/field.css +121 -0
  52. package/dist/css/fieldset.css +37 -0
  53. package/dist/css/grid.css +86 -0
  54. package/dist/css/heading.css +93 -0
  55. package/dist/css/inline.css +85 -0
  56. package/dist/css/input.css +108 -0
  57. package/dist/css/link.css +45 -0
  58. package/dist/css/menu.css +166 -0
  59. package/dist/css/popover.css +72 -0
  60. package/dist/css/progress.css +102 -0
  61. package/dist/css/radio.css +54 -0
  62. package/dist/css/scroll-area.css +70 -0
  63. package/dist/css/select.css +189 -0
  64. package/dist/css/separator.css +35 -0
  65. package/dist/css/skeleton.css +39 -0
  66. package/dist/css/skip-link.css +33 -0
  67. package/dist/css/slider.css +108 -0
  68. package/dist/css/spinner.css +55 -0
  69. package/dist/css/stack.css +76 -0
  70. package/dist/css/switch.css +112 -0
  71. package/dist/css/table.css +68 -0
  72. package/dist/css/tabs.css +123 -0
  73. package/dist/css/text-field.css +4 -0
  74. package/dist/css/text.css +106 -0
  75. package/dist/css/toast.css +115 -0
  76. package/dist/css/toggle.css +125 -0
  77. package/dist/css/tooltip.css +47 -0
  78. package/dist/css/visually-hidden.css +15 -0
  79. package/dist/dialog/dialog.d.ts +54 -0
  80. package/dist/dialog/dialog.js +121 -0
  81. package/dist/dialog/index.d.ts +2 -0
  82. package/dist/dialog/index.js +1 -0
  83. package/dist/drawer/drawer.d.ts +49 -0
  84. package/dist/drawer/drawer.js +102 -0
  85. package/dist/drawer/index.d.ts +2 -0
  86. package/dist/drawer/index.js +1 -0
  87. package/dist/experimental/alert/alert.d.ts +29 -0
  88. package/dist/experimental/alert/alert.js +72 -0
  89. package/dist/experimental/alert/index.d.ts +2 -0
  90. package/dist/experimental/app-shell/app-shell.d.ts +60 -0
  91. package/dist/experimental/app-shell/app-shell.js +224 -0
  92. package/dist/experimental/app-shell/index.d.ts +2 -0
  93. package/dist/experimental/breadcrumb/breadcrumb.d.ts +27 -0
  94. package/dist/experimental/breadcrumb/breadcrumb.js +48 -0
  95. package/dist/experimental/breadcrumb/index.d.ts +2 -0
  96. package/dist/experimental/copy-button/copy-button.d.ts +27 -0
  97. package/dist/experimental/copy-button/copy-button.js +61 -0
  98. package/dist/experimental/copy-button/index.d.ts +2 -0
  99. package/dist/experimental/empty-state/data-state.d.ts +23 -0
  100. package/dist/experimental/empty-state/data-state.js +40 -0
  101. package/dist/experimental/empty-state/empty-state.d.ts +26 -0
  102. package/dist/experimental/empty-state/empty-state.js +46 -0
  103. package/dist/experimental/empty-state/index.d.ts +3 -0
  104. package/dist/experimental/index.d.ts +24 -0
  105. package/dist/experimental/index.js +13 -0
  106. package/dist/experimental/otp-input/index.d.ts +2 -0
  107. package/dist/experimental/otp-input/otp-input.d.ts +27 -0
  108. package/dist/experimental/otp-input/otp-input.js +39 -0
  109. package/dist/experimental/page-header/index.d.ts +2 -0
  110. package/dist/experimental/page-header/page-header.d.ts +32 -0
  111. package/dist/experimental/page-header/page-header.js +73 -0
  112. package/dist/experimental/password-input/index.d.ts +2 -0
  113. package/dist/experimental/password-input/password-input.d.ts +26 -0
  114. package/dist/experimental/password-input/password-input.js +103 -0
  115. package/dist/experimental/sidebar/index.d.ts +2 -0
  116. package/dist/experimental/sidebar/sidebar.d.ts +64 -0
  117. package/dist/experimental/sidebar/sidebar.js +200 -0
  118. package/dist/experimental/stat/index.d.ts +2 -0
  119. package/dist/experimental/stat/stat.d.ts +31 -0
  120. package/dist/experimental/stat/stat.js +90 -0
  121. package/dist/experimental/top-bar/index.d.ts +2 -0
  122. package/dist/experimental/top-bar/top-bar.d.ts +60 -0
  123. package/dist/experimental/top-bar/top-bar.js +162 -0
  124. package/dist/field/choice.d.ts +21 -0
  125. package/dist/field/choice.js +67 -0
  126. package/dist/field/field.d.ts +31 -0
  127. package/dist/field/field.js +78 -0
  128. package/dist/field/index.d.ts +3 -0
  129. package/dist/field/index.js +1 -0
  130. package/dist/fieldset/fieldset.d.ts +19 -0
  131. package/dist/fieldset/fieldset.js +29 -0
  132. package/dist/fieldset/index.d.ts +2 -0
  133. package/dist/fieldset/index.js +1 -0
  134. package/dist/format/format.d.ts +12 -0
  135. package/dist/format/format.js +50 -0
  136. package/dist/format/index.d.ts +2 -0
  137. package/dist/format/index.js +1 -0
  138. package/dist/grid/grid.d.ts +30 -0
  139. package/dist/grid/grid.js +36 -0
  140. package/dist/grid/index.d.ts +2 -0
  141. package/dist/grid/index.js +1 -0
  142. package/dist/heading/heading.d.ts +23 -0
  143. package/dist/heading/heading.js +30 -0
  144. package/dist/heading/index.d.ts +2 -0
  145. package/dist/heading/index.js +1 -0
  146. package/dist/index.d.ts +84 -1
  147. package/dist/index.js +40 -0
  148. package/dist/inline/index.d.ts +2 -0
  149. package/dist/inline/index.js +1 -0
  150. package/dist/inline/inline.d.ts +19 -0
  151. package/dist/inline/inline.js +16 -0
  152. package/dist/input/index.d.ts +2 -0
  153. package/dist/input/index.js +1 -0
  154. package/dist/input/input.d.ts +37 -0
  155. package/dist/input/input.js +63 -0
  156. package/dist/internal/control.d.ts +9 -0
  157. package/dist/internal/control.js +4 -0
  158. package/dist/internal/cx.js +7 -0
  159. package/dist/internal/media.js +15 -0
  160. package/dist/internal/messages.d.ts +75 -0
  161. package/dist/internal/messages.js +61 -0
  162. package/dist/internal/refs.js +23 -0
  163. package/dist/internal/render.d.ts +6 -0
  164. package/dist/internal/render.js +22 -0
  165. package/dist/internal/space.d.ts +9 -0
  166. package/dist/internal/text.d.ts +5 -0
  167. package/dist/internal/text.js +18 -0
  168. package/dist/link/index.d.ts +2 -0
  169. package/dist/link/index.js +1 -0
  170. package/dist/link/link.d.ts +19 -0
  171. package/dist/link/link.js +32 -0
  172. package/dist/locales/hi.d.ts +8 -0
  173. package/dist/locales/hi.js +60 -0
  174. package/dist/menu/index.d.ts +2 -0
  175. package/dist/menu/index.js +1 -0
  176. package/dist/menu/menu.d.ts +76 -0
  177. package/dist/menu/menu.js +172 -0
  178. package/dist/popover/index.d.ts +2 -0
  179. package/dist/popover/index.js +1 -0
  180. package/dist/popover/popover.d.ts +33 -0
  181. package/dist/popover/popover.js +48 -0
  182. package/dist/progress/index.d.ts +2 -0
  183. package/dist/progress/index.js +1 -0
  184. package/dist/progress/progress.d.ts +26 -0
  185. package/dist/progress/progress.js +62 -0
  186. package/dist/provider/index.d.ts +3 -0
  187. package/dist/provider/index.js +1 -0
  188. package/dist/provider/provider.d.ts +46 -0
  189. package/dist/provider/provider.js +90 -0
  190. package/dist/radio/index.d.ts +2 -0
  191. package/dist/radio/index.js +1 -0
  192. package/dist/radio/radio.d.ts +31 -0
  193. package/dist/radio/radio.js +47 -0
  194. package/dist/scroll-area/index.d.ts +2 -0
  195. package/dist/scroll-area/index.js +1 -0
  196. package/dist/scroll-area/scroll-area.d.ts +18 -0
  197. package/dist/scroll-area/scroll-area.js +39 -0
  198. package/dist/select/index.d.ts +2 -0
  199. package/dist/select/index.js +1 -0
  200. package/dist/select/select.d.ts +36 -0
  201. package/dist/select/select.js +82 -0
  202. package/dist/separator/index.d.ts +2 -0
  203. package/dist/separator/index.js +1 -0
  204. package/dist/separator/separator.d.ts +16 -0
  205. package/dist/separator/separator.js +16 -0
  206. package/dist/skeleton/index.d.ts +2 -0
  207. package/dist/skeleton/index.js +1 -0
  208. package/dist/skeleton/skeleton.d.ts +12 -0
  209. package/dist/skeleton/skeleton.js +18 -0
  210. package/dist/skip-link/index.d.ts +2 -0
  211. package/dist/skip-link/index.js +1 -0
  212. package/dist/skip-link/skip-link.d.ts +13 -0
  213. package/dist/skip-link/skip-link.js +18 -0
  214. package/dist/slider/index.d.ts +2 -0
  215. package/dist/slider/index.js +1 -0
  216. package/dist/slider/slider.d.ts +20 -0
  217. package/dist/slider/slider.js +58 -0
  218. package/dist/spinner/index.d.ts +2 -0
  219. package/dist/spinner/index.js +1 -0
  220. package/dist/spinner/spinner.d.ts +15 -0
  221. package/dist/spinner/spinner.js +19 -0
  222. package/dist/stack/index.d.ts +2 -0
  223. package/dist/stack/index.js +1 -0
  224. package/dist/stack/stack.d.ts +17 -0
  225. package/dist/stack/stack.js +15 -0
  226. package/dist/styles.css +4548 -0
  227. package/dist/switch/index.d.ts +2 -0
  228. package/dist/switch/index.js +1 -0
  229. package/dist/switch/switch.d.ts +18 -0
  230. package/dist/switch/switch.js +31 -0
  231. package/dist/table/index.d.ts +2 -0
  232. package/dist/table/index.js +1 -0
  233. package/dist/table/table.d.ts +36 -0
  234. package/dist/table/table.js +69 -0
  235. package/dist/tabs/index.d.ts +2 -0
  236. package/dist/tabs/index.js +1 -0
  237. package/dist/tabs/tabs.d.ts +43 -0
  238. package/dist/tabs/tabs.js +66 -0
  239. package/dist/text/index.d.ts +3 -0
  240. package/dist/text/index.js +1 -0
  241. package/dist/text/text.d.ts +24 -0
  242. package/dist/text/text.js +24 -0
  243. package/dist/text-field/index.d.ts +2 -0
  244. package/dist/text-field/index.js +1 -0
  245. package/dist/text-field/text-field.d.ts +15 -0
  246. package/dist/text-field/text-field.js +43 -0
  247. package/dist/toast/index.d.ts +2 -0
  248. package/dist/toast/index.js +1 -0
  249. package/dist/toast/toast.d.ts +57 -0
  250. package/dist/toast/toast.js +124 -0
  251. package/dist/toggle/index.d.ts +2 -0
  252. package/dist/toggle/index.js +1 -0
  253. package/dist/toggle/toggle.d.ts +48 -0
  254. package/dist/toggle/toggle.js +54 -0
  255. package/dist/tooltip/index.d.ts +2 -0
  256. package/dist/tooltip/index.js +1 -0
  257. package/dist/tooltip/tooltip.d.ts +26 -0
  258. package/dist/tooltip/tooltip.js +39 -0
  259. package/dist/visually-hidden/index.d.ts +2 -0
  260. package/dist/visually-hidden/index.js +1 -0
  261. package/dist/visually-hidden/visually-hidden.d.ts +8 -0
  262. package/dist/visually-hidden/visually-hidden.js +12 -0
  263. package/package.json +170 -2
@@ -0,0 +1,32 @@
1
+ import { cx } from "../internal/cx.js";
2
+ import { renderElement } from "../internal/render.js";
3
+ import { messages } from "../internal/messages.js";
4
+ import { VisuallyHidden } from "../visually-hidden/visually-hidden.js";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { ArrowUpRightIcon } from "@qeetrix/icons/icons/arrow-up-right";
7
+ // src/link/link.tsx
8
+ /** Navigation to a page, a section, a file or a site. An action that changes data is a Button. */
9
+ function Link({ tone, external, render, rel, messages: messages$1, className, children, ...props }) {
10
+ const externalNote = messages$1?.external ?? messages.link.external;
11
+ return renderElement("a", render, {
12
+ ...external ? { target: "_blank" } : {},
13
+ ...props,
14
+ rel: external ? cx(rel, "noopener noreferrer") : rel,
15
+ className: cx("qx-link", className),
16
+ "data-slot": "link",
17
+ "data-tone": tone,
18
+ "data-external": external ? "" : void 0,
19
+ children: external ? /* @__PURE__ */ jsxs(Fragment, { children: [
20
+ children,
21
+ /* @__PURE__ */ jsx(ArrowUpRightIcon, {
22
+ shape: "sharp",
23
+ size: 12,
24
+ "aria-hidden": true,
25
+ className: "qx-link-icon",
26
+ "data-slot": "link-icon"
27
+ }),
28
+ /* @__PURE__ */ jsxs(VisuallyHidden, { children: [" ", externalNote] })
29
+ ] }) : children
30
+ });
31
+ }
32
+ export { Link };
@@ -0,0 +1,8 @@
1
+ import { QeetrixMessages } from "../internal/messages.js";
2
+ /**
3
+ * Hindi. The words match Qeet ID's own Hindi strings ("खारिज करें" for Dismiss, "लोड हो रहा है" for
4
+ * Loading), so a product and the library never disagree.
5
+ *
6
+ * `<QeetrixProvider locale="hi-IN" messages={hi}>`
7
+ */
8
+ export declare const hi: QeetrixMessages;
@@ -0,0 +1,60 @@
1
+ // src/locales/hi.ts
2
+ /**
3
+ * Hindi. The words match Qeet ID's own Hindi strings ("खारिज करें" for Dismiss, "लोड हो रहा है" for
4
+ * Loading), so a product and the library never disagree.
5
+ *
6
+ * `<QeetrixProvider locale="hi-IN" messages={hi}>`
7
+ */
8
+ const hi = {
9
+ skipLink: { label: "मुख्य सामग्री पर जाएँ" },
10
+ spinner: { label: "लोड हो रहा है" },
11
+ link: { external: "(नए टैब में खुलता है)" },
12
+ field: { optional: "(वैकल्पिक)" },
13
+ overlay: { close: "बंद करें" },
14
+ toast: {
15
+ close: "खारिज करें",
16
+ region: "सूचनाएँ"
17
+ },
18
+ slider: {
19
+ minimum: "न्यूनतम",
20
+ maximum: "अधिकतम"
21
+ },
22
+ appShell: {
23
+ collapse: "छोटा करें",
24
+ expand: "बड़ा करें",
25
+ open: "नेविगेशन खोलें",
26
+ navigation: "नेविगेशन",
27
+ tools: "टूल",
28
+ closePanel: "पैनल बंद करें"
29
+ },
30
+ sidebar: {
31
+ filter: "नेविगेशन में खोजें",
32
+ noMatches: "कोई पेज नहीं मिला"
33
+ },
34
+ breadcrumb: { label: "पेज का पथ" },
35
+ dataState: {
36
+ errorTitle: "यह लोड नहीं हो सका",
37
+ errorDescription: "फिर से कोशिश करें, या अपना कनेक्शन जाँचें।",
38
+ retry: "फिर से कोशिश करें"
39
+ },
40
+ copyButton: {
41
+ copy: "कॉपी करें",
42
+ copied: "कॉपी हो गया",
43
+ failed: "कॉपी नहीं हो सका"
44
+ },
45
+ alert: {
46
+ dismiss: "खारिज करें",
47
+ info: "जानकारी",
48
+ success: "सफल",
49
+ warning: "चेतावनी",
50
+ danger: "त्रुटि"
51
+ },
52
+ passwordInput: {
53
+ show: "पासवर्ड दिखाएँ",
54
+ shown: "पासवर्ड दिख रहा है",
55
+ hidden: "पासवर्ड छिपा है",
56
+ capsLock: "कैप्स लॉक चालू है"
57
+ },
58
+ otpInput: { character: "{length} में से अक्षर {index}" }
59
+ };
60
+ export { hi };
@@ -0,0 +1,2 @@
1
+ import { Menu, MenuCheckboxItem, MenuCheckboxItemProps, MenuContent, MenuContentProps, MenuGroup, MenuGroupLabel, MenuGroupLabelProps, MenuGroupProps, MenuItem, MenuItemProps, MenuItemTone, MenuProps, MenuRadioGroup, MenuRadioGroupProps, MenuRadioItem, MenuRadioItemProps, MenuSeparator, MenuSeparatorProps, MenuSubmenu, MenuSubmenuProps, MenuSubmenuTrigger, MenuSubmenuTriggerProps, MenuTrigger, MenuTriggerProps } from "./menu.js";
2
+ export { Menu, MenuCheckboxItem, type MenuCheckboxItemProps, MenuContent, type MenuContentProps, MenuGroup, MenuGroupLabel, type MenuGroupLabelProps, type MenuGroupProps, MenuItem, type MenuItemProps, type MenuItemTone, type MenuProps, MenuRadioGroup, type MenuRadioGroupProps, MenuRadioItem, type MenuRadioItemProps, MenuSeparator, type MenuSeparatorProps, MenuSubmenu, type MenuSubmenuProps, MenuSubmenuTrigger, type MenuSubmenuTriggerProps, MenuTrigger, type MenuTriggerProps };
@@ -0,0 +1 @@
1
+ export { Menu, MenuCheckboxItem, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger } from "./menu.js";
@@ -0,0 +1,76 @@
1
+ import { QeetrixIcon } from "../internal/control.js";
2
+ import { CSSProperties, ReactElement, ReactNode } from "react";
3
+ import { Menu } from "@base-ui/react/menu";
4
+ export type MenuProps = Menu.Root.Props;
5
+ export type MenuTriggerProps = Menu.Trigger.Props;
6
+ export type MenuSubmenuProps = Menu.SubmenuRoot.Props;
7
+ export type MenuItemTone = "default" | "danger";
8
+ export interface MenuContentProps extends Omit<Menu.Popup.Props, "className" | "style" | "children"> {
9
+ /** The side to open on. By default a menu opens below its trigger, a submenu at the inline end. */
10
+ side?: Menu.Positioner.Props["side"];
11
+ /** Alignment along that side. Default `start`. */
12
+ align?: Menu.Positioner.Props["align"];
13
+ /** Distance from the trigger, in pixels. Default 4 (0 for a submenu). */
14
+ sideOffset?: number;
15
+ /** Placement and sizing only. */
16
+ className?: string;
17
+ style?: CSSProperties;
18
+ children?: ReactNode;
19
+ }
20
+ interface ItemLookProps {
21
+ /** Text at the end, such as a keyboard shortcut ("Ctrl+D"). Hidden from assistive technology. */
22
+ shortcut?: ReactNode;
23
+ /** Placement only. */
24
+ className?: string;
25
+ style?: CSSProperties;
26
+ }
27
+ export interface MenuItemProps extends Omit<Menu.Item.Props, "className" | "style">, ItemLookProps {
28
+ /** A leading icon from `@qeetrix/icons`: sharp, 16px. */
29
+ icon?: QeetrixIcon;
30
+ /** `danger` for a destructive action; put it last, after a separator. */
31
+ tone?: MenuItemTone;
32
+ }
33
+ export interface MenuCheckboxItemProps extends Omit<Menu.CheckboxItem.Props, "className" | "style">, ItemLookProps {}
34
+ export interface MenuRadioItemProps extends Omit<Menu.RadioItem.Props, "className" | "style">, ItemLookProps {}
35
+ export interface MenuSubmenuTriggerProps extends Omit<Menu.SubmenuTrigger.Props, "className" | "style"> {
36
+ /** A leading icon from `@qeetrix/icons`: sharp, 16px. */
37
+ icon?: QeetrixIcon;
38
+ className?: string;
39
+ style?: CSSProperties;
40
+ }
41
+ export type MenuGroupProps = Menu.Group.Props;
42
+ export interface MenuGroupLabelProps extends Omit<Menu.GroupLabel.Props, "className"> {
43
+ className?: string;
44
+ }
45
+ export type MenuRadioGroupProps = Menu.RadioGroup.Props;
46
+ export interface MenuSeparatorProps extends Omit<Menu.Separator.Props, "className"> {
47
+ className?: string;
48
+ }
49
+ /** Holds a menu's open state: `open` / `defaultOpen` / `onOpenChange(open, details)`. */
50
+ declare function Menu$1(props: MenuProps): ReactElement;
51
+ /** Opens the menu. Render your own control: `render={<IconButton aria-label="More" … />}`. */
52
+ export declare function MenuTrigger(props: MenuTriggerProps): ReactElement;
53
+ /**
54
+ * The list of actions (06-component-specs.md §5): arrow keys move, typing jumps to a match, Escape
55
+ * closes and returns focus to the trigger. It never traps Tab.
56
+ */
57
+ export declare function MenuContent({ side, align, sideOffset, className, children, ...props }: MenuContentProps): ReactElement;
58
+ /** An action. */
59
+ export declare function MenuItem({ icon: Icon, shortcut, tone, className, children, ...props }: MenuItemProps): ReactElement;
60
+ /** An option that turns on or off; a sharp check marks it. */
61
+ export declare function MenuCheckboxItem({ shortcut, className, children, ...props }: MenuCheckboxItemProps): ReactElement;
62
+ /** One choice of a MenuRadioGroup; a 6px dot marks it. */
63
+ export declare function MenuRadioItem({ shortcut, className, children, ...props }: MenuRadioItemProps): ReactElement;
64
+ /** Radio items sharing one value: `value` / `defaultValue` / `onValueChange(value, details)`. */
65
+ export declare function MenuRadioGroup(props: MenuRadioGroupProps): ReactElement;
66
+ /** Items under one label. */
67
+ export declare function MenuGroup(props: MenuGroupProps): ReactElement;
68
+ /** A group's label. */
69
+ export declare function MenuGroupLabel({ className, ...props }: MenuGroupLabelProps): ReactElement;
70
+ /** A 1px rule between groups, edge to edge. */
71
+ export declare function MenuSeparator({ className, ...props }: MenuSeparatorProps): ReactElement;
72
+ /** A nested menu: a MenuSubmenuTrigger and its own MenuContent. */
73
+ export declare function MenuSubmenu(props: MenuSubmenuProps): ReactElement;
74
+ /** The item that opens a submenu, with a trailing chevron that mirrors in right-to-left text. */
75
+ export declare function MenuSubmenuTrigger({ icon: Icon, className, children, ...props }: MenuSubmenuTriggerProps): ReactElement;
76
+ export { Menu$1 as Menu };
@@ -0,0 +1,172 @@
1
+ "use client";
2
+ import { cx } from "../internal/cx.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { createContext, use } from "react";
5
+ import { CheckIcon } from "@qeetrix/icons/icons/check";
6
+ import { Menu } from "@base-ui/react/menu";
7
+ import { ChevronRightIcon } from "@qeetrix/icons/icons/chevron-right";
8
+ // src/menu/menu.tsx
9
+ /** True inside a submenu, whose content lines its first item up with the trigger item. */
10
+ const InSubmenu = createContext(false);
11
+ /** Holds a menu's open state: `open` / `defaultOpen` / `onOpenChange(open, details)`. */
12
+ function Menu$1(props) {
13
+ return /* @__PURE__ */ jsx(Menu.Root, { ...props });
14
+ }
15
+ /** Opens the menu. Render your own control: `render={<IconButton aria-label="More" … />}`. */
16
+ function MenuTrigger(props) {
17
+ return /* @__PURE__ */ jsx(Menu.Trigger, { ...props });
18
+ }
19
+ /**
20
+ * The list of actions (06-component-specs.md §5): arrow keys move, typing jumps to a match, Escape
21
+ * closes and returns focus to the trigger. It never traps Tab.
22
+ */
23
+ function MenuContent({ side, align = "start", sideOffset, className, children, ...props }) {
24
+ const inSubmenu = use(InSubmenu);
25
+ return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, {
26
+ side,
27
+ align,
28
+ sideOffset: sideOffset ?? (inSubmenu ? 0 : 4),
29
+ alignOffset: inSubmenu ? -5 : 0,
30
+ className: "qx-menu-positioner",
31
+ children: /* @__PURE__ */ jsx(Menu.Popup, {
32
+ ...props,
33
+ className: cx("qx-menu", className),
34
+ "data-slot": "menu-popup",
35
+ children
36
+ })
37
+ }) });
38
+ }
39
+ function Shortcut({ children }) {
40
+ if (children == null) return null;
41
+ return /* @__PURE__ */ jsx("span", {
42
+ className: "qx-menu-shortcut",
43
+ "data-slot": "menu-shortcut",
44
+ "aria-hidden": true,
45
+ children
46
+ });
47
+ }
48
+ /** An action. */
49
+ function MenuItem({ icon: Icon, shortcut, tone, className, children, ...props }) {
50
+ return /* @__PURE__ */ jsxs(Menu.Item, {
51
+ ...props,
52
+ className: cx("qx-menu-item", className),
53
+ "data-slot": "menu-item",
54
+ "data-tone": tone,
55
+ children: [
56
+ Icon && /* @__PURE__ */ jsx(Icon, {
57
+ shape: "sharp",
58
+ size: 16,
59
+ "aria-hidden": true,
60
+ className: "qx-menu-item-icon"
61
+ }),
62
+ /* @__PURE__ */ jsx("span", {
63
+ className: "qx-menu-item-label",
64
+ children
65
+ }),
66
+ /* @__PURE__ */ jsx(Shortcut, { children: shortcut })
67
+ ]
68
+ });
69
+ }
70
+ /** An option that turns on or off; a sharp check marks it. */
71
+ function MenuCheckboxItem({ shortcut, className, children, ...props }) {
72
+ return /* @__PURE__ */ jsxs(Menu.CheckboxItem, {
73
+ ...props,
74
+ className: cx("qx-menu-item", className),
75
+ "data-slot": "menu-checkbox-item",
76
+ children: [
77
+ /* @__PURE__ */ jsx("span", {
78
+ className: "qx-menu-mark",
79
+ children: /* @__PURE__ */ jsx(Menu.CheckboxItemIndicator, {
80
+ className: "qx-menu-mark-indicator",
81
+ children: /* @__PURE__ */ jsx(CheckIcon, {
82
+ shape: "sharp",
83
+ size: 16,
84
+ "aria-hidden": true
85
+ })
86
+ })
87
+ }),
88
+ /* @__PURE__ */ jsx("span", {
89
+ className: "qx-menu-item-label",
90
+ children
91
+ }),
92
+ /* @__PURE__ */ jsx(Shortcut, { children: shortcut })
93
+ ]
94
+ });
95
+ }
96
+ /** One choice of a MenuRadioGroup; a 6px dot marks it. */
97
+ function MenuRadioItem({ shortcut, className, children, ...props }) {
98
+ return /* @__PURE__ */ jsxs(Menu.RadioItem, {
99
+ ...props,
100
+ className: cx("qx-menu-item", className),
101
+ "data-slot": "menu-radio-item",
102
+ children: [
103
+ /* @__PURE__ */ jsx("span", {
104
+ className: "qx-menu-mark",
105
+ children: /* @__PURE__ */ jsx(Menu.RadioItemIndicator, { className: "qx-menu-mark-indicator qx-menu-dot" })
106
+ }),
107
+ /* @__PURE__ */ jsx("span", {
108
+ className: "qx-menu-item-label",
109
+ children
110
+ }),
111
+ /* @__PURE__ */ jsx(Shortcut, { children: shortcut })
112
+ ]
113
+ });
114
+ }
115
+ /** Radio items sharing one value: `value` / `defaultValue` / `onValueChange(value, details)`. */
116
+ function MenuRadioGroup(props) {
117
+ return /* @__PURE__ */ jsx(Menu.RadioGroup, { ...props });
118
+ }
119
+ /** Items under one label. */
120
+ function MenuGroup(props) {
121
+ return /* @__PURE__ */ jsx(Menu.Group, { ...props });
122
+ }
123
+ /** A group's label. */
124
+ function MenuGroupLabel({ className, ...props }) {
125
+ return /* @__PURE__ */ jsx(Menu.GroupLabel, {
126
+ ...props,
127
+ className: cx("qx-menu-group-label", className),
128
+ "data-slot": "menu-group-label"
129
+ });
130
+ }
131
+ /** A 1px rule between groups, edge to edge. */
132
+ function MenuSeparator({ className, ...props }) {
133
+ return /* @__PURE__ */ jsx(Menu.Separator, {
134
+ ...props,
135
+ className: cx("qx-menu-separator", className),
136
+ "data-slot": "menu-separator"
137
+ });
138
+ }
139
+ /** A nested menu: a MenuSubmenuTrigger and its own MenuContent. */
140
+ function MenuSubmenu(props) {
141
+ return /* @__PURE__ */ jsx(InSubmenu, {
142
+ value: true,
143
+ children: /* @__PURE__ */ jsx(Menu.SubmenuRoot, { ...props })
144
+ });
145
+ }
146
+ /** The item that opens a submenu, with a trailing chevron that mirrors in right-to-left text. */
147
+ function MenuSubmenuTrigger({ icon: Icon, className, children, ...props }) {
148
+ return /* @__PURE__ */ jsxs(Menu.SubmenuTrigger, {
149
+ ...props,
150
+ className: cx("qx-menu-item", className),
151
+ "data-slot": "menu-submenu-trigger",
152
+ children: [
153
+ Icon && /* @__PURE__ */ jsx(Icon, {
154
+ shape: "sharp",
155
+ size: 16,
156
+ "aria-hidden": true,
157
+ className: "qx-menu-item-icon"
158
+ }),
159
+ /* @__PURE__ */ jsx("span", {
160
+ className: "qx-menu-item-label",
161
+ children
162
+ }),
163
+ /* @__PURE__ */ jsx(ChevronRightIcon, {
164
+ shape: "sharp",
165
+ size: 16,
166
+ "aria-hidden": true,
167
+ className: "qx-menu-submenu-icon"
168
+ })
169
+ ]
170
+ });
171
+ }
172
+ export { Menu$1 as Menu, MenuCheckboxItem, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger };
@@ -0,0 +1,2 @@
1
+ import { Popover, PopoverClose, PopoverCloseProps, PopoverContent, PopoverContentProps, PopoverProps, PopoverTrigger, PopoverTriggerProps } from "./popover.js";
2
+ export { Popover, PopoverClose, type PopoverCloseProps, PopoverContent, type PopoverContentProps, type PopoverProps, PopoverTrigger, type PopoverTriggerProps };
@@ -0,0 +1 @@
1
+ export { Popover, PopoverClose, PopoverContent, PopoverTrigger } from "./popover.js";
@@ -0,0 +1,33 @@
1
+ import { CSSProperties, ReactElement, ReactNode } from "react";
2
+ import { Popover } from "@base-ui/react/popover";
3
+ export type PopoverProps = Popover.Root.Props;
4
+ export type PopoverTriggerProps = Popover.Trigger.Props;
5
+ export type PopoverCloseProps = Popover.Close.Props;
6
+ export interface PopoverContentProps extends Omit<Popover.Popup.Props, "className" | "style" | "title" | "children"> {
7
+ /** A heading; when set, the popover is labelled by it. */
8
+ title?: ReactNode;
9
+ /** A line under the title. */
10
+ description?: ReactNode;
11
+ /** The trigger's side to open on. Default `bottom`; it flips when there is no room. */
12
+ side?: Popover.Positioner.Props["side"];
13
+ /** Alignment along that side. Default `center`. */
14
+ align?: Popover.Positioner.Props["align"];
15
+ /** Distance from the trigger, in pixels. Default 6. */
16
+ sideOffset?: number;
17
+ /** Placement and sizing only. */
18
+ className?: string;
19
+ style?: CSSProperties;
20
+ children?: ReactNode;
21
+ }
22
+ /** Holds a popover's open state: `open` / `defaultOpen` / `onOpenChange(open, details)`. */
23
+ declare function Popover$1(props: PopoverProps): ReactElement;
24
+ /** Opens the popover. Render your own control: `render={<Button variant="soft">Filter</Button>}`. */
25
+ export declare function PopoverTrigger(props: PopoverTriggerProps): ReactElement;
26
+ /** Closes the popover, e.g. a footer action: `render={<Button>Apply</Button>}`. */
27
+ export declare function PopoverClose(props: PopoverCloseProps): ReactElement;
28
+ /**
29
+ * Non-modal content anchored to its trigger (06-component-specs.md, increment 4). Focus moves in on
30
+ * open and back to the trigger on close; Escape and an outside click close it.
31
+ */
32
+ export declare function PopoverContent({ title, description, side, align, sideOffset, className, children, ...props }: PopoverContentProps): ReactElement;
33
+ export { Popover$1 as Popover };
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import { cx } from "../internal/cx.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Popover } from "@base-ui/react/popover";
5
+ // src/popover/popover.tsx
6
+ /** Holds a popover's open state: `open` / `defaultOpen` / `onOpenChange(open, details)`. */
7
+ function Popover$1(props) {
8
+ return /* @__PURE__ */ jsx(Popover.Root, { ...props });
9
+ }
10
+ /** Opens the popover. Render your own control: `render={<Button variant="soft">Filter</Button>}`. */
11
+ function PopoverTrigger(props) {
12
+ return /* @__PURE__ */ jsx(Popover.Trigger, { ...props });
13
+ }
14
+ /** Closes the popover, e.g. a footer action: `render={<Button>Apply</Button>}`. */
15
+ function PopoverClose(props) {
16
+ return /* @__PURE__ */ jsx(Popover.Close, { ...props });
17
+ }
18
+ /**
19
+ * Non-modal content anchored to its trigger (06-component-specs.md, increment 4). Focus moves in on
20
+ * open and back to the trigger on close; Escape and an outside click close it.
21
+ */
22
+ function PopoverContent({ title, description, side, align, sideOffset = 6, className, children, ...props }) {
23
+ return /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(Popover.Positioner, {
24
+ side,
25
+ align,
26
+ sideOffset,
27
+ className: "qx-popover-positioner",
28
+ children: /* @__PURE__ */ jsxs(Popover.Popup, {
29
+ ...props,
30
+ className: cx("qx-popover", className),
31
+ "data-slot": "popover-popup",
32
+ children: [(title != null || description != null) && /* @__PURE__ */ jsxs("div", {
33
+ className: "qx-popover-header",
34
+ "data-slot": "popover-header",
35
+ children: [title != null && /* @__PURE__ */ jsx(Popover.Title, {
36
+ className: "qx-popover-title",
37
+ "data-slot": "popover-title",
38
+ children: title
39
+ }), description != null && /* @__PURE__ */ jsx(Popover.Description, {
40
+ className: "qx-popover-description",
41
+ "data-slot": "popover-description",
42
+ children: description
43
+ })]
44
+ }), children]
45
+ })
46
+ }) });
47
+ }
48
+ export { Popover$1 as Popover, PopoverClose, PopoverContent, PopoverTrigger };
@@ -0,0 +1,2 @@
1
+ import { Meter, MeterProps, MeterTone, Progress, ProgressProps } from "./progress.js";
2
+ export { Meter, type MeterProps, type MeterTone, Progress, type ProgressProps };
@@ -0,0 +1 @@
1
+ export { Meter, Progress } from "./progress.js";
@@ -0,0 +1,26 @@
1
+ import { CSSProperties, ReactElement, ReactNode } from "react";
2
+ import { Meter } from "@base-ui/react/meter";
3
+ import { Progress } from "@base-ui/react/progress";
4
+ interface BarLook {
5
+ /** The visible label. Without one, give it an `aria-label`. */
6
+ label?: ReactNode;
7
+ /** Show the formatted value at the end of the header. */
8
+ showValue?: boolean;
9
+ /** Placement only. */
10
+ className?: string;
11
+ style?: CSSProperties;
12
+ }
13
+ export interface ProgressProps extends Omit<Progress.Root.Props, "className" | "style" | "children">, BarLook {}
14
+ export type MeterTone = "brand" | "success" | "warning" | "danger";
15
+ export interface MeterProps extends Omit<Meter.Root.Props, "className" | "style" | "children">, BarLook {
16
+ /** The indicator's colour. Default `brand`. */
17
+ tone?: MeterTone;
18
+ }
19
+ /**
20
+ * A task advancing, such as an upload (06-component-specs.md, increment 6). `value={null}` is
21
+ * indeterminate: a segment slides along the track, and fades instead under reduced motion.
22
+ */
23
+ declare function Progress$1({ label, showValue, locale, className, ...props }: ProgressProps): ReactElement;
24
+ /** A measurement within a range, such as storage used. It looks like Progress; it isn't a task. */
25
+ declare function Meter$1({ label, showValue, tone, locale, className, ...props }: MeterProps): ReactElement;
26
+ export { Meter$1 as Meter, Progress$1 as Progress };
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { cx } from "../internal/cx.js";
3
+ import { useLocale } from "../provider/provider.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Meter } from "@base-ui/react/meter";
6
+ import { Progress } from "@base-ui/react/progress";
7
+ // src/progress/progress.tsx
8
+ /**
9
+ * A task advancing, such as an upload (06-component-specs.md, increment 6). `value={null}` is
10
+ * indeterminate: a segment slides along the track, and fades instead under reduced motion.
11
+ */
12
+ function Progress$1({ label, showValue, locale, className, ...props }) {
13
+ const providerLocale = useLocale();
14
+ return /* @__PURE__ */ jsxs(Progress.Root, {
15
+ ...props,
16
+ locale: locale ?? providerLocale,
17
+ className: cx("qx-progress", className),
18
+ "data-slot": "progress",
19
+ children: [(label != null || showValue) && /* @__PURE__ */ jsxs("div", {
20
+ className: "qx-progress-header",
21
+ "data-slot": "progress-header",
22
+ children: [label != null && /* @__PURE__ */ jsx(Progress.Label, {
23
+ className: "qx-progress-label",
24
+ children: label
25
+ }), showValue && /* @__PURE__ */ jsx(Progress.Value, { className: "qx-progress-value" })]
26
+ }), /* @__PURE__ */ jsx(Progress.Track, {
27
+ className: "qx-progress-track",
28
+ "data-slot": "progress-track",
29
+ children: /* @__PURE__ */ jsx(Progress.Indicator, {
30
+ className: "qx-progress-indicator",
31
+ "data-slot": "progress-indicator"
32
+ })
33
+ })]
34
+ });
35
+ }
36
+ /** A measurement within a range, such as storage used. It looks like Progress; it isn't a task. */
37
+ function Meter$1({ label, showValue, tone = "brand", locale, className, ...props }) {
38
+ const providerLocale = useLocale();
39
+ return /* @__PURE__ */ jsxs(Meter.Root, {
40
+ ...props,
41
+ locale: locale ?? providerLocale,
42
+ className: cx("qx-progress", className),
43
+ "data-slot": "meter",
44
+ "data-tone": tone,
45
+ children: [(label != null || showValue) && /* @__PURE__ */ jsxs("div", {
46
+ className: "qx-progress-header",
47
+ "data-slot": "meter-header",
48
+ children: [label != null && /* @__PURE__ */ jsx(Meter.Label, {
49
+ className: "qx-progress-label",
50
+ children: label
51
+ }), showValue && /* @__PURE__ */ jsx(Meter.Value, { className: "qx-progress-value" })]
52
+ }), /* @__PURE__ */ jsx(Meter.Track, {
53
+ className: "qx-progress-track",
54
+ "data-slot": "meter-track",
55
+ children: /* @__PURE__ */ jsx(Meter.Indicator, {
56
+ className: "qx-progress-indicator",
57
+ "data-slot": "meter-indicator"
58
+ })
59
+ })]
60
+ });
61
+ }
62
+ export { Meter$1 as Meter, Progress$1 as Progress };
@@ -0,0 +1,3 @@
1
+ import { QeetrixMessages, QeetrixMessagesInput } from "../internal/messages.js";
2
+ import { ColorScheme, ColorSchemeState, Direction, QeetrixProvider, QeetrixProviderProps, ResolvedColorScheme, useColorScheme, useLocale } from "./provider.js";
3
+ export { type ColorScheme, type ColorSchemeState, type Direction, type QeetrixMessages, type QeetrixMessagesInput, QeetrixProvider, type QeetrixProviderProps, type ResolvedColorScheme, useColorScheme, useLocale };
@@ -0,0 +1 @@
1
+ export { QeetrixProvider, useColorScheme, useLocale } from "./provider.js";
@@ -0,0 +1,46 @@
1
+ import { QeetrixMessagesInput } from "../internal/messages.js";
2
+ import { ReactElement, ReactNode } from "react";
3
+ export type Direction = "ltr" | "rtl";
4
+ export type ColorScheme = "light" | "dark" | "system";
5
+ export type ResolvedColorScheme = "light" | "dark";
6
+ export interface QeetrixProviderProps {
7
+ /** A BCP 47 locale for formatting, e.g. `hi-IN`. Default `en-IN`, or the enclosing provider's. */
8
+ locale?: string;
9
+ /**
10
+ * The reading direction, for arrow keys, submenus, sliders and drawers. Default `ltr`, or the
11
+ * enclosing provider's. Set `dir` on `<html>` too: this doesn't render an element.
12
+ */
13
+ direction?: Direction;
14
+ /** A locale pack (`@qeetrix/react/locales/hi`) or any subset of the strings. */
15
+ messages?: QeetrixMessagesInput;
16
+ /**
17
+ * The colour scheme, controlled. With this or `defaultColorScheme`, the provider sets
18
+ * `data-qx-color-scheme` on `<html>`, following the operating system while it's `system`.
19
+ */
20
+ colorScheme?: ColorScheme;
21
+ /** The colour scheme when uncontrolled. */
22
+ defaultColorScheme?: ColorScheme;
23
+ /** Called when `setColorScheme` asks for a change: persist it, e.g. in a cookie. */
24
+ onColorSchemeChange?: (colorScheme: ColorScheme) => void;
25
+ children?: ReactNode;
26
+ }
27
+ export interface ColorSchemeState {
28
+ /** The chosen scheme, `system` included. */
29
+ colorScheme: ColorScheme;
30
+ /** What's showing: `light` or `dark`. */
31
+ resolvedColorScheme: ResolvedColorScheme;
32
+ /** Choose a scheme. */
33
+ setColorScheme: (colorScheme: ColorScheme) => void;
34
+ }
35
+ /**
36
+ * App-wide settings for Qeetrix components: locale, direction and strings. Nest one to change a
37
+ * section; it inherits whatever it doesn't set.
38
+ */
39
+ export declare function QeetrixProvider({ locale, direction, messages: strings, colorScheme, defaultColorScheme, onColorSchemeChange, children }: QeetrixProviderProps): ReactElement;
40
+ /**
41
+ * The colour scheme, and a way to change it, from the QeetrixProvider that manages it (one with
42
+ * `colorScheme` or `defaultColorScheme`).
43
+ */
44
+ export declare function useColorScheme(): ColorSchemeState;
45
+ /** The locale set by the nearest QeetrixProvider; `en-IN` without one. */
46
+ export declare function useLocale(): string;