@atelier-ui/react 0.0.1

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 (97) hide show
  1. package/package.json +28 -0
  2. package/src/index.d.ts +24 -0
  3. package/src/index.d.ts.map +1 -0
  4. package/src/index.js +24 -0
  5. package/src/index.js.map +1 -0
  6. package/src/lib/accordion/llm-accordion.d.ts +59 -0
  7. package/src/lib/accordion/llm-accordion.d.ts.map +1 -0
  8. package/src/lib/accordion/llm-accordion.js +122 -0
  9. package/src/lib/accordion/llm-accordion.js.map +1 -0
  10. package/src/lib/alert/llm-alert.d.ts +29 -0
  11. package/src/lib/alert/llm-alert.d.ts.map +1 -0
  12. package/src/lib/alert/llm-alert.js +11 -0
  13. package/src/lib/alert/llm-alert.js.map +1 -0
  14. package/src/lib/avatar/llm-avatar.d.ts +58 -0
  15. package/src/lib/avatar/llm-avatar.d.ts.map +1 -0
  16. package/src/lib/avatar/llm-avatar.js +39 -0
  17. package/src/lib/avatar/llm-avatar.js.map +1 -0
  18. package/src/lib/badge/llm-badge.d.ts +25 -0
  19. package/src/lib/badge/llm-badge.d.ts.map +1 -0
  20. package/src/lib/badge/llm-badge.js +11 -0
  21. package/src/lib/badge/llm-badge.js.map +1 -0
  22. package/src/lib/breadcrumbs/llm-breadcrumbs.d.ts +38 -0
  23. package/src/lib/breadcrumbs/llm-breadcrumbs.d.ts.map +1 -0
  24. package/src/lib/breadcrumbs/llm-breadcrumbs.js +28 -0
  25. package/src/lib/breadcrumbs/llm-breadcrumbs.js.map +1 -0
  26. package/src/lib/button/llm-button.d.ts +17 -0
  27. package/src/lib/button/llm-button.d.ts.map +1 -0
  28. package/src/lib/button/llm-button.js +21 -0
  29. package/src/lib/button/llm-button.js.map +1 -0
  30. package/src/lib/card/llm-card.d.ts +52 -0
  31. package/src/lib/card/llm-card.d.ts.map +1 -0
  32. package/src/lib/card/llm-card.js +30 -0
  33. package/src/lib/card/llm-card.js.map +1 -0
  34. package/src/lib/checkbox/llm-checkbox.d.ts +41 -0
  35. package/src/lib/checkbox/llm-checkbox.d.ts.map +1 -0
  36. package/src/lib/checkbox/llm-checkbox.js +29 -0
  37. package/src/lib/checkbox/llm-checkbox.js.map +1 -0
  38. package/src/lib/dialog/llm-dialog.d.ts +68 -0
  39. package/src/lib/dialog/llm-dialog.d.ts.map +1 -0
  40. package/src/lib/dialog/llm-dialog.js +76 -0
  41. package/src/lib/dialog/llm-dialog.js.map +1 -0
  42. package/src/lib/drawer/llm-drawer.d.ts +64 -0
  43. package/src/lib/drawer/llm-drawer.d.ts.map +1 -0
  44. package/src/lib/drawer/llm-drawer.js +83 -0
  45. package/src/lib/drawer/llm-drawer.js.map +1 -0
  46. package/src/lib/input/llm-input.d.ts +41 -0
  47. package/src/lib/input/llm-input.d.ts.map +1 -0
  48. package/src/lib/input/llm-input.js +25 -0
  49. package/src/lib/input/llm-input.js.map +1 -0
  50. package/src/lib/menu/llm-menu.d.ts +66 -0
  51. package/src/lib/menu/llm-menu.d.ts.map +1 -0
  52. package/src/lib/menu/llm-menu.js +64 -0
  53. package/src/lib/menu/llm-menu.js.map +1 -0
  54. package/src/lib/pagination/llm-pagination.d.ts +33 -0
  55. package/src/lib/pagination/llm-pagination.d.ts.map +1 -0
  56. package/src/lib/pagination/llm-pagination.js +54 -0
  57. package/src/lib/pagination/llm-pagination.js.map +1 -0
  58. package/src/lib/progress/llm-progress.d.ts +33 -0
  59. package/src/lib/progress/llm-progress.d.ts.map +1 -0
  60. package/src/lib/progress/llm-progress.js +18 -0
  61. package/src/lib/progress/llm-progress.js.map +1 -0
  62. package/src/lib/radio/llm-radio.d.ts +25 -0
  63. package/src/lib/radio/llm-radio.d.ts.map +1 -0
  64. package/src/lib/radio/llm-radio.js +23 -0
  65. package/src/lib/radio/llm-radio.js.map +1 -0
  66. package/src/lib/radio-group/llm-radio-group.d.ts +84 -0
  67. package/src/lib/radio-group/llm-radio-group.d.ts.map +1 -0
  68. package/src/lib/radio-group/llm-radio-group.js +40 -0
  69. package/src/lib/radio-group/llm-radio-group.js.map +1 -0
  70. package/src/lib/select/llm-select.d.ts +58 -0
  71. package/src/lib/select/llm-select.d.ts.map +1 -0
  72. package/src/lib/select/llm-select.js +26 -0
  73. package/src/lib/select/llm-select.js.map +1 -0
  74. package/src/lib/skeleton/llm-skeleton.d.ts +29 -0
  75. package/src/lib/skeleton/llm-skeleton.d.ts.map +1 -0
  76. package/src/lib/skeleton/llm-skeleton.js +27 -0
  77. package/src/lib/skeleton/llm-skeleton.js.map +1 -0
  78. package/src/lib/tabs/llm-tabs.d.ts +53 -0
  79. package/src/lib/tabs/llm-tabs.d.ts.map +1 -0
  80. package/src/lib/tabs/llm-tabs.js +75 -0
  81. package/src/lib/tabs/llm-tabs.js.map +1 -0
  82. package/src/lib/textarea/llm-textarea.d.ts +33 -0
  83. package/src/lib/textarea/llm-textarea.d.ts.map +1 -0
  84. package/src/lib/textarea/llm-textarea.js +39 -0
  85. package/src/lib/textarea/llm-textarea.js.map +1 -0
  86. package/src/lib/toast/llm-toast.d.ts +54 -0
  87. package/src/lib/toast/llm-toast.d.ts.map +1 -0
  88. package/src/lib/toast/llm-toast.js +70 -0
  89. package/src/lib/toast/llm-toast.js.map +1 -0
  90. package/src/lib/toggle/llm-toggle.d.ts +29 -0
  91. package/src/lib/toggle/llm-toggle.d.ts.map +1 -0
  92. package/src/lib/toggle/llm-toggle.js +23 -0
  93. package/src/lib/toggle/llm-toggle.js.map +1 -0
  94. package/src/lib/tooltip/llm-tooltip.d.ts +17 -0
  95. package/src/lib/tooltip/llm-tooltip.d.ts.map +1 -0
  96. package/src/lib/tooltip/llm-tooltip.js +68 -0
  97. package/src/lib/tooltip/llm-tooltip.js.map +1 -0
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import './llm-input.css';
3
+ /**
4
+ * A versatile input component for text entry.
5
+ */
6
+ export function LlmInput({ type = 'text', value, onChange, onValueChange, invalid = false, errors = [], disabled = false, readOnly: reactReadOnly, readonly: specReadOnly, required = false, label, className, id, ...rest }) {
7
+ const readOnly = reactReadOnly ?? specReadOnly ?? false;
8
+ const inputId = id || (label ? `input-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
9
+ const classes = [
10
+ 'llm-input',
11
+ invalid && 'is-invalid',
12
+ disabled && 'is-disabled',
13
+ readOnly && 'is-readonly',
14
+ className,
15
+ ]
16
+ .filter(Boolean)
17
+ .join(' ');
18
+ const handleChange = (e) => {
19
+ onChange?.(e);
20
+ onValueChange?.(e.target.value);
21
+ };
22
+ const errorId = inputId ? `${inputId}-errors` : undefined;
23
+ return (_jsxs("div", { className: classes, children: [label && _jsx("label", { htmlFor: inputId, children: label }), _jsx("input", { id: inputId, type: type, value: value, onChange: handleChange, disabled: disabled, readOnly: readOnly, required: required, "aria-invalid": invalid || undefined, "aria-required": required || undefined, "aria-describedby": errors.length > 0 ? errorId : undefined, ...rest }), errors.length > 0 && (_jsx("div", { className: "errors", id: errorId, "aria-live": "polite", children: errors.map((err, i) => (_jsx("p", { className: "error-message", children: err }, i))) }))] }));
24
+ }
25
+ //# sourceMappingURL=llm-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-input.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/input/llm-input.tsx"],"names":[],"mappings":";AAEA,OAAO,iBAAiB,CAAC;AAsCzB;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,GAAG,MAAM,EACb,KAAK,EACL,QAAQ,EACR,aAAa,EACb,OAAO,GAAG,KAAK,EACf,MAAM,GAAG,EAAE,EACX,QAAQ,GAAG,KAAK,EAChB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAG,KAAK,EAChB,KAAK,EACL,SAAS,EACT,EAAE,EACF,GAAG,IAAI,EACO;IACd,MAAM,QAAQ,GAAG,aAAa,IAAI,YAAY,IAAI,KAAK,CAAC;IACxD,MAAM,OAAO,GACX,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG;QACd,WAAW;QACX,OAAO,IAAI,YAAY;QACvB,QAAQ,IAAI,aAAa;QACzB,QAAQ,IAAI,aAAa;QACzB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,YAAY,GAAG,CAAC,CAAsC,EAAE,EAAE;QAC9D,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACd,aAAa,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1D,OAAO,CACL,eAAK,SAAS,EAAE,OAAO,aACpB,KAAK,IAAI,gBAAO,OAAO,EAAE,OAAO,YAAG,KAAK,GAAS,EAClD,gBACE,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,kBACJ,OAAO,IAAI,SAAS,mBACnB,QAAQ,IAAI,SAAS,sBAClB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,KACrD,IAAI,GACR,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,cAAK,SAAS,EAAC,QAAQ,EAAC,EAAE,EAAE,OAAO,eAAY,QAAQ,YACpD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,YAAW,SAAS,EAAC,eAAe,YACjC,GAAG,IADE,CAAC,CAEL,CACL,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { InputHTMLAttributes } from 'react';\nimport type { LlmInputSpec } from '@atelier-ui/spec';\nimport './llm-input.css';\n\n/**\n * Properties for the LlmInput component.\n */\nexport interface LlmInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'readOnly'>,\n LlmInputSpec {\n /**\n * The type of input to render.\n */\n type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url';\n /**\n * The current value of the input.\n */\n value?: string;\n /**\n * Callback triggered when the value changes.\n */\n onValueChange?: (value: string) => void;\n /**\n * Whether the input is in an invalid state.\n */\n invalid?: boolean;\n /**\n * Array of error messages to display.\n */\n errors?: string[];\n /**\n * The label for the input.\n */\n label?: string;\n /**\n * Whether the input is read-only.\n */\n readOnly?: boolean;\n}\n\n/**\n * A versatile input component for text entry.\n */\nexport function LlmInput({\n type = 'text',\n value,\n onChange,\n onValueChange,\n invalid = false,\n errors = [],\n disabled = false,\n readOnly: reactReadOnly,\n readonly: specReadOnly,\n required = false,\n label,\n className,\n id,\n ...rest\n}: LlmInputProps) {\n const readOnly = reactReadOnly ?? specReadOnly ?? false;\n const inputId =\n id || (label ? `input-${label.toLowerCase().replace(/\\s+/g, '-')}` : undefined);\n const classes = [\n 'llm-input',\n invalid && 'is-invalid',\n disabled && 'is-disabled',\n readOnly && 'is-readonly',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n };\n\n const errorId = inputId ? `${inputId}-errors` : undefined;\n\n return (\n <div className={classes}>\n {label && <label htmlFor={inputId}>{label}</label>}\n <input\n id={inputId}\n type={type}\n value={value}\n onChange={handleChange}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n aria-describedby={errors.length > 0 ? errorId : undefined}\n {...rest}\n />\n {errors.length > 0 && (\n <div className=\"errors\" id={errorId} aria-live=\"polite\">\n {errors.map((err, i) => (\n <p key={i} className=\"error-message\">\n {err}\n </p>\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,66 @@
1
+ import { ReactNode, HTMLAttributes, RefObject } from 'react';
2
+ import type { LlmMenuSpec, LlmMenuItemSpec } from '@atelier-ui/spec';
3
+ import './llm-menu.css';
4
+ /**
5
+ * Properties for the LlmMenu component.
6
+ */
7
+ export interface LlmMenuProps extends HTMLAttributes<HTMLDivElement>, LlmMenuSpec {
8
+ /**
9
+ * The visual style variant of the menu.
10
+ */
11
+ variant?: 'default' | 'compact';
12
+ /**
13
+ * The menu items to be rendered.
14
+ */
15
+ children?: ReactNode;
16
+ }
17
+ /**
18
+ * A menu component for displaying a list of choices.
19
+ */
20
+ export declare function LlmMenu({ variant, children, className, ...rest }: LlmMenuProps): import("react/jsx-runtime").JSX.Element;
21
+ /**
22
+ * Properties for the LlmMenuItem component.
23
+ */
24
+ export interface LlmMenuItemProps extends HTMLAttributes<HTMLButtonElement>, LlmMenuItemSpec {
25
+ /**
26
+ * Whether the menu item is disabled.
27
+ */
28
+ disabled?: boolean;
29
+ /**
30
+ * Callback triggered when the item is selected.
31
+ */
32
+ onTriggered?: () => void;
33
+ /**
34
+ * The content of the menu item.
35
+ */
36
+ children?: ReactNode;
37
+ }
38
+ /**
39
+ * An individual item within a menu.
40
+ */
41
+ export declare function LlmMenuItem({ disabled, onTriggered, children, className, onClick, ...rest }: LlmMenuItemProps): import("react/jsx-runtime").JSX.Element;
42
+ /**
43
+ * A separator for dividing groups of menu items.
44
+ */
45
+ export declare function LlmMenuSeparator(): import("react/jsx-runtime").JSX.Element;
46
+ /**
47
+ * Properties for the LlmMenuTrigger component.
48
+ */
49
+ export interface LlmMenuTriggerProps {
50
+ /**
51
+ * The menu to be displayed.
52
+ */
53
+ menu: ReactNode;
54
+ /**
55
+ * Render prop that provides trigger functionality.
56
+ */
57
+ children: (props: {
58
+ onClick: () => void;
59
+ ref: RefObject<HTMLElement | null>;
60
+ }) => ReactNode;
61
+ }
62
+ /**
63
+ * A component that manages the state of a menu and its trigger.
64
+ */
65
+ export declare function LlmMenuTrigger({ menu, children }: LlmMenuTriggerProps): import("react/jsx-runtime").JSX.Element;
66
+ //# sourceMappingURL=llm-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-menu.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/menu/llm-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,SAAS,EACT,cAAc,EACd,SAAS,EACV,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,gBAAgB,CAAC;AAQxB;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW;IAC/E;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,OAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,2CAO1F;AAED;;GAEG;AACH,MAAM,WAAW,gBACf,SAAQ,cAAc,CAAC,iBAAiB,CAAC,EACvC,eAAe;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAgB,EAChB,WAAW,EACX,QAAQ,EACR,SAAS,EACT,OAAO,EACP,GAAG,IAAI,EACR,EAAE,gBAAgB,2CAyBlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,4CAE/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;KACpC,KAAK,SAAS,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CA4CrE"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext, useRef, useState, useEffect, } from 'react';
3
+ import './llm-menu.css';
4
+ const MenuContext = createContext({ close: () => undefined });
5
+ /**
6
+ * A menu component for displaying a list of choices.
7
+ */
8
+ export function LlmMenu({ variant = 'default', children, className, ...rest }) {
9
+ const classes = ['llm-menu', `variant-${variant}`, className].filter(Boolean).join(' ');
10
+ return (_jsx("div", { className: classes, role: "menu", ...rest, children: children }));
11
+ }
12
+ /**
13
+ * An individual item within a menu.
14
+ */
15
+ export function LlmMenuItem({ disabled = false, onTriggered, children, className, onClick, ...rest }) {
16
+ const ctx = useContext(MenuContext);
17
+ const classes = ['llm-menu-item', disabled && 'is-disabled', className]
18
+ .filter(Boolean)
19
+ .join(' ');
20
+ const handleClick = (e) => {
21
+ if (!disabled) {
22
+ onTriggered?.();
23
+ ctx.close();
24
+ onClick?.(e);
25
+ }
26
+ };
27
+ return (_jsx("button", { className: classes, role: "menuitem", disabled: disabled, onClick: handleClick, ...rest, children: children }));
28
+ }
29
+ /**
30
+ * A separator for dividing groups of menu items.
31
+ */
32
+ export function LlmMenuSeparator() {
33
+ return _jsx("hr", { className: "llm-menu-separator", role: "separator" });
34
+ }
35
+ /**
36
+ * A component that manages the state of a menu and its trigger.
37
+ */
38
+ export function LlmMenuTrigger({ menu, children }) {
39
+ const [open, setOpen] = useState(false);
40
+ const triggerRef = useRef(null);
41
+ const menuRef = useRef(null);
42
+ useEffect(() => {
43
+ if (!open)
44
+ return;
45
+ const handleOutsideClick = (e) => {
46
+ if (!menuRef.current?.contains(e.target) &&
47
+ !triggerRef.current?.contains(e.target)) {
48
+ setOpen(false);
49
+ }
50
+ };
51
+ const handleKeyDown = (e) => {
52
+ if (e.key === 'Escape')
53
+ setOpen(false);
54
+ };
55
+ document.addEventListener('mousedown', handleOutsideClick);
56
+ document.addEventListener('keydown', handleKeyDown);
57
+ return () => {
58
+ document.removeEventListener('mousedown', handleOutsideClick);
59
+ document.removeEventListener('keydown', handleKeyDown);
60
+ };
61
+ }, [open]);
62
+ return (_jsx(MenuContext.Provider, { value: { close: () => setOpen(false) }, children: _jsxs("div", { className: "llm-menu-trigger-wrapper", style: { position: 'relative', display: 'inline-block' }, children: [children({ onClick: () => setOpen((v) => !v), ref: triggerRef }), open && (_jsx("div", { ref: menuRef, className: "llm-menu-panel", children: menu }))] }) }));
63
+ }
64
+ //# sourceMappingURL=llm-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-menu.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/menu/llm-menu.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n useContext,\n useRef,\n useState,\n useEffect,\n ReactNode,\n HTMLAttributes,\n RefObject,\n} from 'react';\nimport type {\n LlmMenuSpec,\n LlmMenuItemSpec,\n} from '@atelier-ui/spec';\nimport './llm-menu.css';\n\ninterface MenuContextValue {\n close: () => void;\n}\n\nconst MenuContext = createContext<MenuContextValue>({ close: () => undefined });\n\n/**\n * Properties for the LlmMenu component.\n */\nexport interface LlmMenuProps extends HTMLAttributes<HTMLDivElement>, LlmMenuSpec {\n /**\n * The visual style variant of the menu.\n */\n variant?: 'default' | 'compact';\n /**\n * The menu items to be rendered.\n */\n children?: ReactNode;\n}\n\n/**\n * A menu component for displaying a list of choices.\n */\nexport function LlmMenu({ variant = 'default', children, className, ...rest }: LlmMenuProps) {\n const classes = ['llm-menu', `variant-${variant}`, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"menu\" {...rest}>\n {children}\n </div>\n );\n}\n\n/**\n * Properties for the LlmMenuItem component.\n */\nexport interface LlmMenuItemProps\n extends HTMLAttributes<HTMLButtonElement>,\n LlmMenuItemSpec {\n /**\n * Whether the menu item is disabled.\n */\n disabled?: boolean;\n /**\n * Callback triggered when the item is selected.\n */\n onTriggered?: () => void;\n /**\n * The content of the menu item.\n */\n children?: ReactNode;\n}\n\n/**\n * An individual item within a menu.\n */\nexport function LlmMenuItem({\n disabled = false,\n onTriggered,\n children,\n className,\n onClick,\n ...rest\n}: LlmMenuItemProps) {\n const ctx = useContext(MenuContext);\n const classes = ['llm-menu-item', disabled && 'is-disabled', className]\n .filter(Boolean)\n .join(' ');\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!disabled) {\n onTriggered?.();\n ctx.close();\n onClick?.(e);\n }\n };\n\n return (\n <button\n className={classes}\n role=\"menuitem\"\n disabled={disabled}\n onClick={handleClick}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\n/**\n * A separator for dividing groups of menu items.\n */\nexport function LlmMenuSeparator() {\n return <hr className=\"llm-menu-separator\" role=\"separator\" />;\n}\n\n/**\n * Properties for the LlmMenuTrigger component.\n */\nexport interface LlmMenuTriggerProps {\n /**\n * The menu to be displayed.\n */\n menu: ReactNode;\n /**\n * Render prop that provides trigger functionality.\n */\n children: (props: {\n onClick: () => void;\n ref: RefObject<HTMLElement | null>;\n }) => ReactNode;\n}\n\n/**\n * A component that manages the state of a menu and its trigger.\n */\nexport function LlmMenuTrigger({ menu, children }: LlmMenuTriggerProps) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n\n const handleOutsideClick = (e: MouseEvent) => {\n if (\n !menuRef.current?.contains(e.target as Node) &&\n !triggerRef.current?.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n\n const handleKeyDown = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n\n document.addEventListener('mousedown', handleOutsideClick);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handleOutsideClick);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <MenuContext.Provider value={{ close: () => setOpen(false) }}>\n <div\n className=\"llm-menu-trigger-wrapper\"\n style={{ position: 'relative', display: 'inline-block' }}\n >\n {children({ onClick: () => setOpen((v) => !v), ref: triggerRef })}\n {open && (\n <div ref={menuRef} className=\"llm-menu-panel\">\n {menu}\n </div>\n )}\n </div>\n </MenuContext.Provider>\n );\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import type { LlmPaginationSpec } from '@atelier-ui/spec';
3
+ import './llm-pagination.css';
4
+ /**
5
+ * Properties for the LlmPagination component.
6
+ */
7
+ export interface LlmPaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'>, LlmPaginationSpec {
8
+ /**
9
+ * The currently active page.
10
+ */
11
+ page?: number;
12
+ /**
13
+ * The total number of pages.
14
+ */
15
+ pageCount?: number;
16
+ /**
17
+ * The number of pages to show on either side of the current page.
18
+ */
19
+ siblingCount?: number;
20
+ /**
21
+ * Whether to show buttons for first and last pages.
22
+ */
23
+ showFirstLast?: boolean;
24
+ /**
25
+ * Callback triggered when the page changes.
26
+ */
27
+ onPageChange?: (page: number) => void;
28
+ }
29
+ /**
30
+ * A pagination component for navigating through paged content.
31
+ */
32
+ export declare function LlmPagination({ page, pageCount, siblingCount, showFirstLast, onPageChange, className, ...rest }: LlmPaginationProps): import("react/jsx-runtime").JSX.Element;
33
+ //# sourceMappingURL=llm-pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-pagination.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/pagination/llm-pagination.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAW,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,sBAAsB,CAAC;AAsC9B;;GAEG;AACH,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,EACnD,iBAAiB;IACnB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAQ,EACR,SAAa,EACb,YAAgB,EAChB,aAAoB,EACpB,YAAY,EACZ,SAAS,EACT,GAAG,IAAI,EACR,EAAE,kBAAkB,2CAmGpB"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import './llm-pagination.css';
4
+ function buildPageItems(page, pageCount, siblingCount) {
5
+ if (pageCount <= 1)
6
+ return [{ type: 'page', page: 1 }];
7
+ const items = [];
8
+ // Always include first page
9
+ items.push({ type: 'page', page: 1 });
10
+ const left = Math.max(2, page - siblingCount);
11
+ const right = Math.min(pageCount - 1, page + siblingCount);
12
+ // Left ellipsis
13
+ if (left > 2) {
14
+ items.push({ type: 'ellipsis', key: 'ellipsis-start' });
15
+ }
16
+ // Middle pages
17
+ for (let p = left; p <= right; p++) {
18
+ items.push({ type: 'page', page: p });
19
+ }
20
+ // Right ellipsis
21
+ if (right < pageCount - 1) {
22
+ items.push({ type: 'ellipsis', key: 'ellipsis-end' });
23
+ }
24
+ // Always include last page
25
+ items.push({ type: 'page', page: pageCount });
26
+ return items;
27
+ }
28
+ /**
29
+ * A pagination component for navigating through paged content.
30
+ */
31
+ export function LlmPagination({ page = 1, pageCount = 1, siblingCount = 1, showFirstLast = true, onPageChange, className, ...rest }) {
32
+ const classes = ['llm-pagination', className].filter(Boolean).join(' ');
33
+ const pageItems = useMemo(() => buildPageItems(page, pageCount, siblingCount), [page, pageCount, siblingCount]);
34
+ const goTo = (p) => {
35
+ const clamped = Math.min(Math.max(p, 1), pageCount);
36
+ if (clamped !== page) {
37
+ onPageChange?.(clamped);
38
+ }
39
+ };
40
+ return (_jsx("nav", { className: classes, "aria-label": "Pagination", ...rest, children: _jsxs("ul", { className: "page-list", children: [showFirstLast && (_jsx("li", { children: _jsx("button", { className: ['page-btn', page <= 1 ? 'is-disabled' : ''].filter(Boolean).join(' '), disabled: page <= 1, "aria-label": "First page", onClick: () => goTo(1), children: "\u00AB" }) })), _jsx("li", { children: _jsx("button", { className: ['page-btn', page <= 1 ? 'is-disabled' : ''].filter(Boolean).join(' '), disabled: page <= 1, "aria-label": "Previous page", onClick: () => goTo(page - 1), children: "\u2039" }) }), pageItems.map((item, index) => item.type === 'page' ? (_jsx("li", { children: _jsx("button", { className: ['page-btn', item.page === page ? 'is-active' : '']
41
+ .filter(Boolean)
42
+ .join(' '), "aria-current": item.page === page ? 'page' : undefined, "aria-label": `Page ${item.page}`, onClick: () => goTo(item.page), children: item.page }) }, item.page)) : (_jsx("li", { children: _jsx("span", { className: "ellipsis", "aria-hidden": "true", children: "\u2026" }) }, item.key))), _jsx("li", { children: _jsx("button", { className: [
43
+ 'page-btn',
44
+ page >= pageCount ? 'is-disabled' : '',
45
+ ]
46
+ .filter(Boolean)
47
+ .join(' '), disabled: page >= pageCount, "aria-label": "Next page", onClick: () => goTo(page + 1), children: "\u203A" }) }), showFirstLast && (_jsx("li", { children: _jsx("button", { className: [
48
+ 'page-btn',
49
+ page >= pageCount ? 'is-disabled' : '',
50
+ ]
51
+ .filter(Boolean)
52
+ .join(' '), disabled: page >= pageCount, "aria-label": "Last page", onClick: () => goTo(pageCount), children: "\u00BB" }) }))] }) }));
53
+ }
54
+ //# sourceMappingURL=llm-pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-pagination.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/pagination/llm-pagination.tsx"],"names":[],"mappings":"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","sourcesContent":["import { HTMLAttributes, useMemo } from 'react';\nimport type { LlmPaginationSpec } from '@atelier-ui/spec';\nimport './llm-pagination.css';\n\ntype PageItem =\n | { type: 'page'; page: number }\n | { type: 'ellipsis'; key: string };\n\nfunction buildPageItems(page: number, pageCount: number, siblingCount: number): PageItem[] {\n if (pageCount <= 1) return [{ type: 'page', page: 1 }];\n\n const items: PageItem[] = [];\n\n // Always include first page\n items.push({ type: 'page', page: 1 });\n\n const left = Math.max(2, page - siblingCount);\n const right = Math.min(pageCount - 1, page + siblingCount);\n\n // Left ellipsis\n if (left > 2) {\n items.push({ type: 'ellipsis', key: 'ellipsis-start' });\n }\n\n // Middle pages\n for (let p = left; p <= right; p++) {\n items.push({ type: 'page', page: p });\n }\n\n // Right ellipsis\n if (right < pageCount - 1) {\n items.push({ type: 'ellipsis', key: 'ellipsis-end' });\n }\n\n // Always include last page\n items.push({ type: 'page', page: pageCount });\n\n return items;\n}\n\n/**\n * Properties for the LlmPagination component.\n */\nexport interface LlmPaginationProps\n extends Omit<HTMLAttributes<HTMLElement>, 'onChange'>,\n LlmPaginationSpec {\n /**\n * The currently active page.\n */\n page?: number;\n /**\n * The total number of pages.\n */\n pageCount?: number;\n /**\n * The number of pages to show on either side of the current page.\n */\n siblingCount?: number;\n /**\n * Whether to show buttons for first and last pages.\n */\n showFirstLast?: boolean;\n /**\n * Callback triggered when the page changes.\n */\n onPageChange?: (page: number) => void;\n}\n\n/**\n * A pagination component for navigating through paged content.\n */\nexport function LlmPagination({\n page = 1,\n pageCount = 1,\n siblingCount = 1,\n showFirstLast = true,\n onPageChange,\n className,\n ...rest\n}: LlmPaginationProps) {\n const classes = ['llm-pagination', className].filter(Boolean).join(' ');\n\n const pageItems = useMemo(\n () => buildPageItems(page, pageCount, siblingCount),\n [page, pageCount, siblingCount]\n );\n\n const goTo = (p: number) => {\n const clamped = Math.min(Math.max(p, 1), pageCount);\n if (clamped !== page) {\n onPageChange?.(clamped);\n }\n };\n\n return (\n <nav className={classes} aria-label=\"Pagination\" {...rest}>\n <ul className=\"page-list\">\n {showFirstLast && (\n <li>\n <button\n className={['page-btn', page <= 1 ? 'is-disabled' : ''].filter(Boolean).join(' ')}\n disabled={page <= 1}\n aria-label=\"First page\"\n onClick={() => goTo(1)}\n >\n «\n </button>\n </li>\n )}\n <li>\n <button\n className={['page-btn', page <= 1 ? 'is-disabled' : ''].filter(Boolean).join(' ')}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n onClick={() => goTo(page - 1)}\n >\n ‹\n </button>\n </li>\n\n {pageItems.map((item, index) =>\n item.type === 'page' ? (\n <li key={item.page}>\n <button\n className={['page-btn', item.page === page ? 'is-active' : '']\n .filter(Boolean)\n .join(' ')}\n aria-current={item.page === page ? 'page' : undefined}\n aria-label={`Page ${item.page}`}\n onClick={() => goTo(item.page)}\n >\n {item.page}\n </button>\n </li>\n ) : (\n <li key={item.key}>\n <span className=\"ellipsis\" aria-hidden=\"true\">\n …\n </span>\n </li>\n )\n )}\n\n <li>\n <button\n className={[\n 'page-btn',\n page >= pageCount ? 'is-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n disabled={page >= pageCount}\n aria-label=\"Next page\"\n onClick={() => goTo(page + 1)}\n >\n ›\n </button>\n </li>\n {showFirstLast && (\n <li>\n <button\n className={[\n 'page-btn',\n page >= pageCount ? 'is-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n disabled={page >= pageCount}\n aria-label=\"Last page\"\n onClick={() => goTo(pageCount)}\n >\n »\n </button>\n </li>\n )}\n </ul>\n </nav>\n );\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import type { LlmProgressSpec } from '@atelier-ui/spec';
3
+ import './llm-progress.css';
4
+ /**
5
+ * Properties for the LlmProgress component.
6
+ */
7
+ export interface LlmProgressProps extends HTMLAttributes<HTMLDivElement>, LlmProgressSpec {
8
+ /**
9
+ * The current progress value.
10
+ */
11
+ value?: number;
12
+ /**
13
+ * The maximum progress value.
14
+ */
15
+ max?: number;
16
+ /**
17
+ * The visual style variant of the progress bar.
18
+ */
19
+ variant?: 'default' | 'success' | 'warning' | 'danger';
20
+ /**
21
+ * The size of the progress bar.
22
+ */
23
+ size?: 'sm' | 'md' | 'lg';
24
+ /**
25
+ * Whether the progress bar is in an indeterminate state.
26
+ */
27
+ indeterminate?: boolean;
28
+ }
29
+ /**
30
+ * A progress bar component for displaying task progress.
31
+ */
32
+ export declare function LlmProgress({ value, max, variant, size, indeterminate, className, ...rest }: LlmProgressProps): import("react/jsx-runtime").JSX.Element;
33
+ //# sourceMappingURL=llm-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-progress.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/progress/llm-progress.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,gBACf,SAAQ,cAAc,CAAC,cAAc,CAAC,EACpC,eAAe;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvD;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAS,EACT,GAAS,EACT,OAAmB,EACnB,IAAW,EACX,aAAqB,EACrB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,2CA0BlB"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import './llm-progress.css';
3
+ /**
4
+ * A progress bar component for displaying task progress.
5
+ */
6
+ export function LlmProgress({ value = 0, max = 100, variant = 'default', size = 'md', indeterminate = false, className, ...rest }) {
7
+ const clampedValue = Math.min(Math.max(value, 0), max);
8
+ const fillWidth = indeterminate ? '100%' : `${(clampedValue / max) * 100}%`;
9
+ const classes = [
10
+ 'llm-progress',
11
+ `variant-${variant}`,
12
+ `size-${size}`,
13
+ indeterminate && 'is-indeterminate',
14
+ className,
15
+ ].filter(Boolean).join(' ');
16
+ return (_jsx("div", { className: classes, role: "progressbar", "aria-valuemin": 0, "aria-valuenow": indeterminate ? undefined : clampedValue, "aria-valuemax": indeterminate ? undefined : max, ...rest, children: _jsx("div", { className: "track", children: _jsx("div", { className: "fill", style: { width: fillWidth } }) }) }));
17
+ }
18
+ //# sourceMappingURL=llm-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-progress.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/progress/llm-progress.tsx"],"names":[],"mappings":";AAEA,OAAO,oBAAoB,CAAC;AA8B5B;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,GAAG,CAAC,EACT,GAAG,GAAG,GAAG,EACT,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,aAAa,GAAG,KAAK,EACrB,SAAS,EACT,GAAG,IAAI,EACU;IACjB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IAE5E,MAAM,OAAO,GAAG;QACd,cAAc;QACd,WAAW,OAAO,EAAE;QACpB,QAAQ,IAAI,EAAE;QACd,aAAa,IAAI,kBAAkB;QACnC,SAAS;KACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5B,OAAO,CACL,cACE,SAAS,EAAE,OAAO,EAClB,IAAI,EAAC,aAAa,mBACH,CAAC,mBACD,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,mBACxC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAC1C,IAAI,YAER,cAAK,SAAS,EAAC,OAAO,YACpB,cAAK,SAAS,EAAC,MAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAI,GACjD,GACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { HTMLAttributes } from 'react';\nimport type { LlmProgressSpec } from '@atelier-ui/spec';\nimport './llm-progress.css';\n\n/**\n * Properties for the LlmProgress component.\n */\nexport interface LlmProgressProps\n extends HTMLAttributes<HTMLDivElement>,\n LlmProgressSpec {\n /**\n * The current progress value.\n */\n value?: number;\n /**\n * The maximum progress value.\n */\n max?: number;\n /**\n * The visual style variant of the progress bar.\n */\n variant?: 'default' | 'success' | 'warning' | 'danger';\n /**\n * The size of the progress bar.\n */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Whether the progress bar is in an indeterminate state.\n */\n indeterminate?: boolean;\n}\n\n/**\n * A progress bar component for displaying task progress.\n */\nexport function LlmProgress({\n value = 0,\n max = 100,\n variant = 'default',\n size = 'md',\n indeterminate = false,\n className,\n ...rest\n}: LlmProgressProps) {\n const clampedValue = Math.min(Math.max(value, 0), max);\n const fillWidth = indeterminate ? '100%' : `${(clampedValue / max) * 100}%`;\n\n const classes = [\n 'llm-progress',\n `variant-${variant}`,\n `size-${size}`,\n indeterminate && 'is-indeterminate',\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={classes}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuenow={indeterminate ? undefined : clampedValue}\n aria-valuemax={indeterminate ? undefined : max}\n {...rest}\n >\n <div className=\"track\">\n <div className=\"fill\" style={{ width: fillWidth }} />\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { ReactNode } from 'react';
2
+ import type { LlmRadioSpec } from '@atelier-ui/spec';
3
+ import './llm-radio.css';
4
+ /**
5
+ * Properties for the LlmRadio component.
6
+ */
7
+ export interface LlmRadioProps extends LlmRadioSpec {
8
+ /**
9
+ * The value of the radio button.
10
+ */
11
+ radioValue: string;
12
+ /**
13
+ * Whether the radio button is disabled.
14
+ */
15
+ disabled?: boolean;
16
+ /**
17
+ * The content to be rendered as the label for the radio button.
18
+ */
19
+ children?: ReactNode;
20
+ }
21
+ /**
22
+ * An individual radio button component, meant to be used within LlmRadioGroup.
23
+ */
24
+ export declare function LlmRadio({ radioValue, disabled, children }: LlmRadioProps): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=llm-radio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-radio.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/radio/llm-radio.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,UAAU,EAAE,QAAgB,EAAE,QAAQ,EAAE,EAAE,aAAa,2CA+BjF"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRadioGroup } from '../radio-group/llm-radio-group';
3
+ import './llm-radio.css';
4
+ /**
5
+ * An individual radio button component, meant to be used within LlmRadioGroup.
6
+ */
7
+ export function LlmRadio({ radioValue, disabled = false, children }) {
8
+ const ctx = useRadioGroup();
9
+ const isDisabled = disabled || ctx.disabled;
10
+ const isReadOnly = ctx.readOnly;
11
+ const isChecked = ctx.value === radioValue;
12
+ const classes = [
13
+ 'llm-radio',
14
+ isDisabled && 'is-disabled',
15
+ isReadOnly && 'is-readonly',
16
+ isChecked && 'is-checked',
17
+ ctx.invalid && 'is-invalid',
18
+ ]
19
+ .filter(Boolean)
20
+ .join(' ');
21
+ return (_jsxs("label", { className: classes, children: [_jsx("input", { type: "radio", name: ctx.name || undefined, value: radioValue, checked: isChecked, disabled: isDisabled, readOnly: isReadOnly, onChange: () => !isDisabled && !isReadOnly && ctx.onSelect(radioValue), onBlur: () => ctx.onBlur() }), children && _jsx("span", { className: "radio-text", children: children })] }));
22
+ }
23
+ //# sourceMappingURL=llm-radio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-radio.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/radio/llm-radio.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,iBAAiB,CAAC;AAoBzB;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,UAAU,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAiB;IAChF,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC;IAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,KAAK,UAAU,CAAC;IAE3C,MAAM,OAAO,GAAG;QACd,WAAW;QACX,UAAU,IAAI,aAAa;QAC3B,UAAU,IAAI,aAAa;QAC3B,SAAS,IAAI,YAAY;QACzB,GAAG,CAAC,OAAO,IAAI,YAAY;KAC5B;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,iBAAO,SAAS,EAAE,OAAO,aACvB,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS,EAC3B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EACtE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAC1B,EACD,QAAQ,IAAI,eAAM,SAAS,EAAC,YAAY,YAAE,QAAQ,GAAQ,IACrD,CACT,CAAC;AACJ,CAAC","sourcesContent":["import { ReactNode } from 'react';\nimport type { LlmRadioSpec } from '@atelier-ui/spec';\nimport { useRadioGroup } from '../radio-group/llm-radio-group';\nimport './llm-radio.css';\n\n/**\n * Properties for the LlmRadio component.\n */\nexport interface LlmRadioProps extends LlmRadioSpec {\n /**\n * The value of the radio button.\n */\n radioValue: string;\n /**\n * Whether the radio button is disabled.\n */\n disabled?: boolean;\n /**\n * The content to be rendered as the label for the radio button.\n */\n children?: ReactNode;\n}\n\n/**\n * An individual radio button component, meant to be used within LlmRadioGroup.\n */\nexport function LlmRadio({ radioValue, disabled = false, children }: LlmRadioProps) {\n const ctx = useRadioGroup();\n const isDisabled = disabled || ctx.disabled;\n const isReadOnly = ctx.readOnly;\n const isChecked = ctx.value === radioValue;\n\n const classes = [\n 'llm-radio',\n isDisabled && 'is-disabled',\n isReadOnly && 'is-readonly',\n isChecked && 'is-checked',\n ctx.invalid && 'is-invalid',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <label className={classes}>\n <input\n type=\"radio\"\n name={ctx.name || undefined}\n value={radioValue}\n checked={isChecked}\n disabled={isDisabled}\n readOnly={isReadOnly}\n onChange={() => !isDisabled && !isReadOnly && ctx.onSelect(radioValue)}\n onBlur={() => ctx.onBlur()}\n />\n {children && <span className=\"radio-text\">{children}</span>}\n </label>\n );\n}\n"]}
@@ -0,0 +1,84 @@
1
+ import { InputHTMLAttributes, ReactNode } from 'react';
2
+ import type { LlmRadioGroupSpec } from '@atelier-ui/spec';
3
+ import './llm-radio-group.css';
4
+ /**
5
+ * Interface for the RadioGroup context.
6
+ */
7
+ export interface RadioGroupContextValue {
8
+ /**
9
+ * The currently selected value.
10
+ */
11
+ value: string;
12
+ /**
13
+ * The name of the radio group.
14
+ */
15
+ name: string;
16
+ /**
17
+ * Whether the entire radio group is disabled.
18
+ */
19
+ disabled: boolean;
20
+ /**
21
+ * Whether the entire radio group is read-only.
22
+ */
23
+ readOnly: boolean;
24
+ /**
25
+ * Whether the radio group is in an invalid state.
26
+ */
27
+ invalid: boolean;
28
+ /**
29
+ * Callback to select a value.
30
+ */
31
+ onSelect: (value: string) => void;
32
+ /**
33
+ * Callback triggered on blur.
34
+ */
35
+ onBlur: () => void;
36
+ }
37
+ export declare const RadioGroupContext: import("react").Context<RadioGroupContextValue>;
38
+ /**
39
+ * Properties for the LlmRadioGroup component.
40
+ */
41
+ export interface LlmRadioGroupProps extends Omit<InputHTMLAttributes<HTMLDivElement>, 'onChange'>, LlmRadioGroupSpec {
42
+ /**
43
+ * The current value of the radio group.
44
+ */
45
+ value?: string;
46
+ /**
47
+ * Callback triggered when the value changes.
48
+ */
49
+ onValueChange?: (value: string) => void;
50
+ /**
51
+ * The name of the radio group, applied to all child radio buttons.
52
+ */
53
+ name?: string;
54
+ /**
55
+ * Whether the radio group is disabled.
56
+ */
57
+ disabled?: boolean;
58
+ /**
59
+ * Whether the radio group is read-only.
60
+ */
61
+ readOnly?: boolean;
62
+ /**
63
+ * Whether the radio group is in an invalid state.
64
+ */
65
+ invalid?: boolean;
66
+ /**
67
+ * Whether a value is required.
68
+ */
69
+ required?: boolean;
70
+ /**
71
+ * Array of error messages to display.
72
+ */
73
+ errors?: string[];
74
+ /**
75
+ * The radio buttons to be rendered.
76
+ */
77
+ children?: ReactNode;
78
+ }
79
+ /**
80
+ * A group of radio buttons.
81
+ */
82
+ export declare function LlmRadioGroup({ value, onValueChange, name, disabled, readOnly: reactReadOnly, readonly: specReadOnly, invalid, required, errors, children, className, ...rest }: LlmRadioGroupProps): import("react/jsx-runtime").JSX.Element;
83
+ export declare function useRadioGroup(): RadioGroupContextValue;
84
+ //# sourceMappingURL=llm-radio-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-radio-group.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/radio-group/llm-radio-group.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,mBAAmB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,iBAAiB,iDAQ5B,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAC3D,iBAAiB;IACnB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAU,EACV,aAAa,EACb,IAAS,EACT,QAAgB,EAChB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,OAAe,EACf,QAAgB,EAChB,MAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,kBAAkB,2CA4CpB;AAED,wBAAgB,aAAa,IAAI,sBAAsB,CAEtD"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext } from 'react';
3
+ import './llm-radio-group.css';
4
+ export const RadioGroupContext = createContext({
5
+ value: '',
6
+ name: '',
7
+ disabled: false,
8
+ readOnly: false,
9
+ invalid: false,
10
+ onSelect: () => undefined,
11
+ onBlur: () => undefined,
12
+ });
13
+ /**
14
+ * A group of radio buttons.
15
+ */
16
+ export function LlmRadioGroup({ value = '', onValueChange, name = '', disabled = false, readOnly: reactReadOnly, readonly: specReadOnly, invalid = false, required = false, errors = [], children, className, ...rest }) {
17
+ const readOnly = reactReadOnly ?? specReadOnly ?? false;
18
+ const classes = [
19
+ 'llm-radio-group',
20
+ invalid && 'is-invalid',
21
+ disabled && 'is-disabled',
22
+ readOnly && 'is-readonly',
23
+ className,
24
+ ]
25
+ .filter(Boolean)
26
+ .join(' ');
27
+ return (_jsx(RadioGroupContext.Provider, { value: {
28
+ value,
29
+ name,
30
+ disabled,
31
+ readOnly,
32
+ invalid,
33
+ onSelect: (v) => !disabled && !readOnly && onValueChange?.(v),
34
+ onBlur: () => undefined,
35
+ }, children: _jsxs("div", { className: classes, role: "radiogroup", "aria-invalid": invalid || undefined, "aria-required": required || undefined, ...rest, children: [children, errors.length > 0 && (_jsx("div", { className: "errors", role: "alert", "aria-live": "polite", children: errors.map((err, i) => (_jsx("p", { className: "error-message", children: err }, i))) }))] }) }));
36
+ }
37
+ export function useRadioGroup() {
38
+ return useContext(RadioGroupContext);
39
+ }
40
+ //# sourceMappingURL=llm-radio-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-radio-group.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/radio-group/llm-radio-group.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkC,MAAM,OAAO,CAAC;AAElF,OAAO,uBAAuB,CAAC;AAoC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAyB;IACrE,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;IACzB,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS;CACxB,CAAC,CAAC;AA8CH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,GAAG,EAAE,EACV,aAAa,EACb,IAAI,GAAG,EAAE,EACT,QAAQ,GAAG,KAAK,EAChB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,EAAE,EACX,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACY;IACnB,MAAM,QAAQ,GAAG,aAAa,IAAI,YAAY,IAAI,KAAK,CAAC;IACxD,MAAM,OAAO,GAAG;QACd,iBAAiB;QACjB,OAAO,IAAI,YAAY;QACvB,QAAQ,IAAI,aAAa;QACzB,QAAQ,IAAI,aAAa;QACzB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,KAAC,iBAAiB,CAAC,QAAQ,IACzB,KAAK,EAAE;YACL,KAAK;YACL,IAAI;YACJ,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;YAC7D,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS;SACxB,YAED,eACE,SAAS,EAAE,OAAO,EAClB,IAAI,EAAC,YAAY,kBACH,OAAO,IAAI,SAAS,mBACnB,QAAQ,IAAI,SAAS,KAChC,IAAI,aAEP,QAAQ,EACR,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,cAAK,SAAS,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,eAAW,QAAQ,YACpD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,YAAW,SAAS,EAAC,eAAe,YACjC,GAAG,IADE,CAAC,CAEL,CACL,CAAC,GACE,CACP,IACG,GACqB,CAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACvC,CAAC","sourcesContent":["import { createContext, useContext, InputHTMLAttributes, ReactNode } from 'react';\nimport type { LlmRadioGroupSpec } from '@atelier-ui/spec';\nimport './llm-radio-group.css';\n\n/**\n * Interface for the RadioGroup context.\n */\nexport interface RadioGroupContextValue {\n /**\n * The currently selected value.\n */\n value: string;\n /**\n * The name of the radio group.\n */\n name: string;\n /**\n * Whether the entire radio group is disabled.\n */\n disabled: boolean;\n /**\n * Whether the entire radio group is read-only.\n */\n readOnly: boolean;\n /**\n * Whether the radio group is in an invalid state.\n */\n invalid: boolean;\n /**\n * Callback to select a value.\n */\n onSelect: (value: string) => void;\n /**\n * Callback triggered on blur.\n */\n onBlur: () => void;\n}\n\nexport const RadioGroupContext = createContext<RadioGroupContextValue>({\n value: '',\n name: '',\n disabled: false,\n readOnly: false,\n invalid: false,\n onSelect: () => undefined,\n onBlur: () => undefined,\n});\n\n/**\n * Properties for the LlmRadioGroup component.\n */\nexport interface LlmRadioGroupProps\n extends Omit<InputHTMLAttributes<HTMLDivElement>, 'onChange'>,\n LlmRadioGroupSpec {\n /**\n * The current value of the radio group.\n */\n value?: string;\n /**\n * Callback triggered when the value changes.\n */\n onValueChange?: (value: string) => void;\n /**\n * The name of the radio group, applied to all child radio buttons.\n */\n name?: string;\n /**\n * Whether the radio group is disabled.\n */\n disabled?: boolean;\n /**\n * Whether the radio group is read-only.\n */\n readOnly?: boolean;\n /**\n * Whether the radio group is in an invalid state.\n */\n invalid?: boolean;\n /**\n * Whether a value is required.\n */\n required?: boolean;\n /**\n * Array of error messages to display.\n */\n errors?: string[];\n /**\n * The radio buttons to be rendered.\n */\n children?: ReactNode;\n}\n\n/**\n * A group of radio buttons.\n */\nexport function LlmRadioGroup({\n value = '',\n onValueChange,\n name = '',\n disabled = false,\n readOnly: reactReadOnly,\n readonly: specReadOnly,\n invalid = false,\n required = false,\n errors = [],\n children,\n className,\n ...rest\n}: LlmRadioGroupProps) {\n const readOnly = reactReadOnly ?? specReadOnly ?? false;\n const classes = [\n 'llm-radio-group',\n invalid && 'is-invalid',\n disabled && 'is-disabled',\n readOnly && 'is-readonly',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <RadioGroupContext.Provider\n value={{\n value,\n name,\n disabled,\n readOnly,\n invalid,\n onSelect: (v) => !disabled && !readOnly && onValueChange?.(v),\n onBlur: () => undefined,\n }}\n >\n <div\n className={classes}\n role=\"radiogroup\"\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n {...rest}\n >\n {children}\n {errors.length > 0 && (\n <div className=\"errors\" role=\"alert\" aria-live=\"polite\">\n {errors.map((err, i) => (\n <p key={i} className=\"error-message\">\n {err}\n </p>\n ))}\n </div>\n )}\n </div>\n </RadioGroupContext.Provider>\n );\n}\n\nexport function useRadioGroup(): RadioGroupContextValue {\n return useContext(RadioGroupContext);\n}\n"]}