@openlearning/widget-framework 1.0.1 → 1.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 (62) hide show
  1. package/README.md +230 -0
  2. package/dist/DevApp.d.ts.map +1 -1
  3. package/dist/DevApp.js +6 -1
  4. package/dist/DevApp.js.map +1 -1
  5. package/dist/components/Button.d.ts +41 -0
  6. package/dist/components/Button.d.ts.map +1 -0
  7. package/dist/components/Button.js +47 -0
  8. package/dist/components/Button.js.map +1 -0
  9. package/dist/components/Checkbox.d.ts +19 -0
  10. package/dist/components/Checkbox.d.ts.map +1 -0
  11. package/dist/components/Checkbox.js +16 -0
  12. package/dist/components/Checkbox.js.map +1 -0
  13. package/dist/components/CheckboxGroup.d.ts +34 -0
  14. package/dist/components/CheckboxGroup.d.ts.map +1 -0
  15. package/dist/components/CheckboxGroup.js +18 -0
  16. package/dist/components/CheckboxGroup.js.map +1 -0
  17. package/dist/components/Menu.d.ts +45 -0
  18. package/dist/components/Menu.d.ts.map +1 -0
  19. package/dist/components/Menu.js +56 -0
  20. package/dist/components/Menu.js.map +1 -0
  21. package/dist/components/RadioGroup.d.ts +36 -0
  22. package/dist/components/RadioGroup.d.ts.map +1 -0
  23. package/dist/components/RadioGroup.js +18 -0
  24. package/dist/components/RadioGroup.js.map +1 -0
  25. package/dist/components/Spinner.d.ts +15 -0
  26. package/dist/components/Spinner.d.ts.map +1 -0
  27. package/dist/components/Spinner.js +10 -0
  28. package/dist/components/Spinner.js.map +1 -0
  29. package/dist/components/StatusTag.d.ts +16 -0
  30. package/dist/components/StatusTag.d.ts.map +1 -0
  31. package/dist/components/StatusTag.js +9 -0
  32. package/dist/components/StatusTag.js.map +1 -0
  33. package/dist/components/Switch.d.ts +22 -0
  34. package/dist/components/Switch.d.ts.map +1 -0
  35. package/dist/components/Switch.js +14 -0
  36. package/dist/components/Switch.js.map +1 -0
  37. package/dist/components/Tabs.d.ts +23 -0
  38. package/dist/components/Tabs.d.ts.map +1 -0
  39. package/dist/components/Tabs.js +27 -0
  40. package/dist/components/Tabs.js.map +1 -0
  41. package/dist/components/TextField.d.ts +19 -0
  42. package/dist/components/TextField.d.ts.map +1 -0
  43. package/dist/components/TextField.js +17 -0
  44. package/dist/components/TextField.js.map +1 -0
  45. package/dist/components/Textarea.d.ts +19 -0
  46. package/dist/components/Textarea.d.ts.map +1 -0
  47. package/dist/components/Textarea.js +17 -0
  48. package/dist/components/Textarea.js.map +1 -0
  49. package/dist/index.d.ts +11 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +13 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/styles/button.css +381 -0
  54. package/dist/styles/checkbox.css +105 -0
  55. package/dist/styles/checkboxgroup.css +42 -0
  56. package/dist/styles/radiogroup.css +135 -0
  57. package/dist/styles/spinner.css +22 -0
  58. package/dist/styles/statustag.css +35 -0
  59. package/dist/styles/switch.css +74 -0
  60. package/dist/styles/tabs.css +49 -0
  61. package/dist/styles/textfield.css +72 -0
  62. package/package.json +16 -7
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "../styles/radiogroup.css";
3
+ /**
4
+ * RadioGroup component matching OpenLearning UI design
5
+ */
6
+ export const RadioGroup = ({ options, value, onChange, label, name, error, description, required, disabled = false, layout = 'horizontal', className = "", }) => {
7
+ const handleChange = (optionValue) => {
8
+ if (!disabled && onChange) {
9
+ onChange(optionValue);
10
+ }
11
+ };
12
+ return (_jsxs("div", { className: `radiogroup-container ${className}`, children: [label && (_jsxs("div", { className: "radiogroup-label", children: [label, required && _jsx("span", { className: "radiogroup-required", children: " *" })] })), _jsx("div", { className: `radiogroup-options radiogroup-options--${layout}`, children: options.map((option, index) => {
13
+ const isDisabled = disabled || option.disabled;
14
+ const isChecked = value === option.value;
15
+ return (_jsxs("label", { className: `radiogroup-option ${isDisabled ? 'radiogroup-option--disabled' : ''} ${index > 0 ? 'radiogroup-option--spaced' : ''}`, children: [_jsx("input", { type: "radio", className: "radiogroup-input", name: name, value: option.value, checked: isChecked, disabled: isDisabled, onChange: () => handleChange(option.value) }), _jsx("div", { className: "radiogroup-radio-container", children: _jsx("div", { className: "radiogroup-radio" }) }), _jsx("span", { className: "radiogroup-option-label", children: option.label })] }, option.value));
16
+ }) }), description && !error && (_jsx("div", { className: "radiogroup-description", children: description })), error && _jsx("div", { className: "radiogroup-error", children: error })] }));
17
+ };
18
+ //# sourceMappingURL=RadioGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.js","sourceRoot":"","sources":["../../src/components/RadioGroup.tsx"],"names":[],"mappings":";AACA,OAAO,0BAA0B,CAAC;AAiClC;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EACpD,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,YAAY,EACrB,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,MAAM,YAAY,GAAG,CAAC,WAAmB,EAAE,EAAE;QAC3C,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAC1B,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,wBAAwB,SAAS,EAAE,aAChD,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,kBAAkB,aAC9B,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,qBAAqB,mBAAU,IACxD,CACP,EACD,cAAK,SAAS,EAAE,0CAA0C,MAAM,EAAE,YAC/D,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC7B,MAAM,UAAU,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;oBAC/C,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;oBAEzC,OAAO,CACL,iBAEE,SAAS,EAAE,qBAAqB,UAAU,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EAAE,aAEjI,gBACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,kBAAkB,EAC5B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAC1C,EACF,cAAK,SAAS,EAAC,4BAA4B,YACzC,cAAK,SAAS,EAAC,kBAAkB,GAAO,GACpC,EACN,eAAM,SAAS,EAAC,yBAAyB,YAAE,MAAM,CAAC,KAAK,GAAQ,KAf1D,MAAM,CAAC,KAAK,CAgBX,CACT,CAAC;gBACJ,CAAC,CAAC,GACE,EACL,WAAW,IAAI,CAAC,KAAK,IAAI,CACxB,cAAK,SAAS,EAAC,wBAAwB,YAAE,WAAW,GAAO,CAC5D,EACA,KAAK,IAAI,cAAK,SAAS,EAAC,kBAAkB,YAAE,KAAK,GAAO,IACrD,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import "../styles/spinner.css";
3
+ export interface SpinnerProps {
4
+ /** Optional label to show next to spinner */
5
+ label?: string;
6
+ /** Color of the spinner (defaults to currentColor) */
7
+ color?: string;
8
+ /** Font size of the spinner icon */
9
+ fontSize?: number;
10
+ }
11
+ /**
12
+ * Loading spinner component matching OpenLearning UI design
13
+ */
14
+ export declare const Spinner: React.FC<SpinnerProps>;
15
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAwB1C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "../styles/spinner.css";
3
+ /**
4
+ * Loading spinner component matching OpenLearning UI design
5
+ */
6
+ export const Spinner = ({ label, color, fontSize }) => (_jsxs("div", { className: "spinner-container", "aria-busy": "true", style: {
7
+ color: color || 'inherit',
8
+ fontSize: fontSize || 'inherit',
9
+ }, children: [_jsx("svg", { className: "spinner-icon", viewBox: "0 0 512 512", fill: "currentColor", stroke: "currentColor", strokeWidth: "40", children: _jsx("path", { d: "M460.115 373.846l-6.941-4.008c-5.546-3.202-7.564-10.177-4.661-15.886 32.971-64.838 31.167-142.731-5.415-205.954-36.504-63.356-103.118-103.876-175.8-107.701C260.952 39.963 256 34.676 256 28.321v-8.012c0-6.904 5.808-12.337 12.703-11.982 83.552 4.306 160.157 50.861 202.106 123.67 42.069 72.703 44.083 162.322 6.034 236.838-3.14 6.149-10.75 8.462-16.728 5.011z" }) }), label && _jsx("span", { children: label })] }));
10
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":";AACA,OAAO,uBAAuB,CAAC;AAW/B;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAA2B,CAAC,EAC9C,KAAK,EACL,KAAK,EACL,QAAQ,EACT,EAAE,EAAE,CAAC,CACJ,eACE,SAAS,EAAC,mBAAmB,eACnB,MAAM,EAChB,KAAK,EAAE;QACL,KAAK,EAAE,KAAK,IAAI,SAAS;QACzB,QAAQ,EAAE,QAAQ,IAAI,SAAS;KAChC,aAED,cACE,SAAS,EAAC,cAAc,EACxB,OAAO,EAAC,aAAa,EACrB,IAAI,EAAC,cAAc,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,IAAI,YAEhB,eAAM,CAAC,EAAC,uWAAuW,GAAE,GAC7W,EACL,KAAK,IAAI,yBAAO,KAAK,GAAQ,IAC1B,CACP,CAAC"}
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import "../styles/statustag.css";
3
+ export type StatusTagVariant = "success" | "warning" | "error" | "info" | "neutral";
4
+ export interface StatusTagProps {
5
+ /** The status label */
6
+ children: React.ReactNode;
7
+ /** Visual variant of the tag */
8
+ variant?: StatusTagVariant;
9
+ /** Additional class name */
10
+ className?: string;
11
+ }
12
+ /**
13
+ * StatusTag component for displaying status badges
14
+ */
15
+ export declare const StatusTag: React.FC<StatusTagProps>;
16
+ //# sourceMappingURL=StatusTag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusTag.d.ts","sourceRoot":"","sources":["../../src/components/StatusTag.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,yBAAyB,CAAC;AAEjC,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,gCAAgC;IAChC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAU9C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import "../styles/statustag.css";
3
+ /**
4
+ * StatusTag component for displaying status badges
5
+ */
6
+ export const StatusTag = ({ children, variant = "neutral", className = "", }) => {
7
+ return (_jsx("span", { className: `statustag statustag--${variant} ${className}`, children: children }));
8
+ };
9
+ //# sourceMappingURL=StatusTag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusTag.js","sourceRoot":"","sources":["../../src/components/StatusTag.tsx"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC;AAajC;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAClD,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,OAAO,CACL,eAAM,SAAS,EAAE,wBAAwB,OAAO,IAAI,SAAS,EAAE,YAC5D,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import "../styles/switch.css";
3
+ export interface SwitchProps {
4
+ /** Whether the switch is checked */
5
+ checked: boolean;
6
+ /** Called when checked state changes */
7
+ onChange: (checked: boolean) => void;
8
+ /** Whether the switch is disabled */
9
+ disabled?: boolean;
10
+ /** Optional labels for on/off states */
11
+ labels?: {
12
+ on: string;
13
+ off: string;
14
+ };
15
+ /** Additional class name */
16
+ className?: string;
17
+ }
18
+ /**
19
+ * Switch toggle component matching OpenLearning UI design
20
+ */
21
+ export declare const Switch: React.FC<SwitchProps>;
22
+ //# sourceMappingURL=Switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,sBAAsB,CAAC;AAE9B,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAkCxC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "../styles/switch.css";
3
+ /**
4
+ * Switch toggle component matching OpenLearning UI design
5
+ */
6
+ export const Switch = ({ checked, onChange, disabled = false, labels, className = "", }) => {
7
+ const handleChange = (event) => {
8
+ if (!disabled) {
9
+ onChange(event.target.checked);
10
+ }
11
+ };
12
+ return (_jsxs("div", { className: `switch-container ${className}`, children: [_jsxs("label", { className: `switch-label ${disabled ? 'switch-label--disabled' : ''}`, children: [_jsx("input", { type: "checkbox", className: "switch-input", checked: checked, onChange: handleChange, disabled: disabled }), _jsx("span", { className: "switch-track", children: _jsx("span", { className: "switch-thumb" }) })] }), labels && (_jsx("span", { className: `switch-text ${disabled ? 'switch-text--disabled' : ''}`, children: checked ? labels.on : labels.off }))] }));
13
+ };
14
+ //# sourceMappingURL=Switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.js","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":";AACA,OAAO,sBAAsB,CAAC;AAkB9B;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAC5C,OAAO,EACP,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,MAAM,EACN,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,MAAM,YAAY,GAAG,CAAC,KAA0C,EAAE,EAAE;QAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,oBAAoB,SAAS,EAAE,aAC7C,iBAAO,SAAS,EAAE,gBAAgB,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE,aAC1E,gBACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,cAAc,EACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,GAClB,EACF,eAAM,SAAS,EAAC,cAAc,YAC5B,eAAM,SAAS,EAAC,cAAc,GAAQ,GACjC,IACD,EACP,MAAM,IAAI,CACT,eAAM,SAAS,EAAE,eAAe,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,YACtE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAC5B,CACR,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import "../styles/tabs.css";
3
+ export interface Tab {
4
+ id: string;
5
+ label: React.ReactNode;
6
+ content: React.ReactNode;
7
+ disabled?: boolean;
8
+ }
9
+ export interface TabsProps {
10
+ /** Array of tab definitions */
11
+ tabs: Tab[];
12
+ /** Currently active tab id */
13
+ activeTabId?: string;
14
+ /** Called when tab changes */
15
+ onChange?: (tabId: string) => void;
16
+ /** Additional class name */
17
+ className?: string;
18
+ }
19
+ /**
20
+ * Tabs component for tabbed navigation
21
+ */
22
+ export declare const Tabs: React.FC<TabsProps>;
23
+ //# sourceMappingURL=Tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/components/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAC;AACtC,OAAO,oBAAoB,CAAC;AAE5B,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAmDpC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import "../styles/tabs.css";
4
+ /**
5
+ * Tabs component for tabbed navigation
6
+ */
7
+ export const Tabs = ({ tabs, activeTabId: controlledActiveTabId, onChange, className = "", }) => {
8
+ const [internalActiveTabId, setInternalActiveTabId] = useState(tabs[0]?.id);
9
+ const activeTabId = controlledActiveTabId !== undefined ? controlledActiveTabId : internalActiveTabId;
10
+ const handleTabClick = (tabId, disabled) => {
11
+ if (disabled)
12
+ return;
13
+ if (controlledActiveTabId === undefined) {
14
+ setInternalActiveTabId(tabId);
15
+ }
16
+ if (onChange) {
17
+ onChange(tabId);
18
+ }
19
+ };
20
+ const activeTab = tabs.find((tab) => tab.id === activeTabId);
21
+ return (_jsxs("div", { className: `tabs-container ${className}`, children: [_jsx("div", { className: "tabs-header", role: "tablist", children: tabs.map((tab) => {
22
+ const isActive = tab.id === activeTabId;
23
+ const isDisabled = tab.disabled;
24
+ return (_jsx("button", { role: "tab", "aria-selected": isActive, "aria-disabled": isDisabled, className: `tabs-tab ${isActive ? 'tabs-tab--active' : ''} ${isDisabled ? 'tabs-tab--disabled' : ''}`, onClick: () => handleTabClick(tab.id, isDisabled), disabled: isDisabled, children: tab.label }, tab.id));
25
+ }) }), _jsx("div", { className: "tabs-content", role: "tabpanel", children: activeTab?.content })] }));
26
+ };
27
+ //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../src/components/Tabs.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,oBAAoB,CAAC;AAoB5B;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EACxC,IAAI,EACJ,WAAW,EAAE,qBAAqB,EAClC,QAAQ,EACR,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE5E,MAAM,WAAW,GAAG,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAEtG,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,QAAkB,EAAE,EAAE;QAC3D,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;YACxC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;IAE7D,OAAO,CACL,eAAK,SAAS,EAAE,kBAAkB,SAAS,EAAE,aAC3C,cAAK,SAAS,EAAC,aAAa,EAAC,IAAI,EAAC,SAAS,YACxC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC;oBACxC,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;oBAEhC,OAAO,CACL,iBAEE,IAAI,EAAC,KAAK,mBACK,QAAQ,mBACR,UAAU,EACzB,SAAS,EAAE,YAAY,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAAE,EACrG,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,EACjD,QAAQ,EAAE,UAAU,YAEnB,GAAG,CAAC,KAAK,IARL,GAAG,CAAC,EAAE,CASJ,CACV,CAAC;gBACJ,CAAC,CAAC,GACE,EACN,cAAK,SAAS,EAAC,cAAc,EAAC,IAAI,EAAC,UAAU,YAC1C,SAAS,EAAE,OAAO,GACf,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import "../styles/textfield.css";
3
+ export interface TextFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {
4
+ /** Input label */
5
+ label?: React.ReactNode;
6
+ /** Error message to display */
7
+ error?: string | null;
8
+ /** Helper text that appears below the input */
9
+ description?: React.ReactNode;
10
+ /** Whether the field is required */
11
+ required?: boolean;
12
+ /** Called when value changes */
13
+ onValueChange?: (value: string) => void;
14
+ }
15
+ /**
16
+ * TextField component matching OpenLearning UI design
17
+ */
18
+ export declare const TextField: React.ForwardRefExoticComponent<TextFieldProps & React.RefAttributes<HTMLInputElement>>;
19
+ //# sourceMappingURL=TextField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/components/TextField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,yBAAyB,CAAC;AAEjC,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IACnG,kBAAkB;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,yFA4CrB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import "../styles/textfield.css";
4
+ /**
5
+ * TextField component matching OpenLearning UI design
6
+ */
7
+ export const TextField = React.forwardRef(({ label, error, description, required, className = "", onValueChange, disabled, ...rest }, ref) => {
8
+ const handleChange = (event) => {
9
+ if (onValueChange) {
10
+ onValueChange(event.target.value);
11
+ }
12
+ };
13
+ const hasError = !!error;
14
+ return (_jsxs("div", { className: `textfield-container ${className}`, children: [label && (_jsxs("label", { className: "textfield-label", children: [label, required && _jsx("span", { className: "textfield-required", children: " *" })] })), _jsx("input", { ref: ref, className: `textfield-input ${hasError ? 'textfield-input--error' : ''} ${disabled ? 'textfield-input--disabled' : ''}`, disabled: disabled, onChange: handleChange, ...rest }), description && !error && (_jsx("div", { className: "textfield-description", children: description })), error && _jsx("div", { className: "textfield-error", children: error })] }));
15
+ });
16
+ TextField.displayName = "TextField";
17
+ //# sourceMappingURL=TextField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextField.js","sourceRoot":"","sources":["../../src/components/TextField.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,yBAAyB,CAAC;AAejC;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CACvC,CACE,EACE,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,aAAa,EACb,QAAQ,EACR,GAAG,IAAI,EACR,EACD,GAAG,EACH,EAAE;IACF,MAAM,YAAY,GAAG,CAAC,KAA0C,EAAE,EAAE;QAClE,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC;IAEzB,OAAO,CACL,eAAK,SAAS,EAAE,uBAAuB,SAAS,EAAE,aAC/C,KAAK,IAAI,CACR,iBAAO,SAAS,EAAC,iBAAiB,aAC/B,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,oBAAoB,mBAAU,IACrD,CACT,EACD,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,mBAAmB,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EAAE,EACvH,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,KAClB,IAAI,GACR,EACD,WAAW,IAAI,CAAC,KAAK,IAAI,CACxB,cAAK,SAAS,EAAC,uBAAuB,YAAE,WAAW,GAAO,CAC3D,EACA,KAAK,IAAI,cAAK,SAAS,EAAC,iBAAiB,YAAE,KAAK,GAAO,IACpD,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC"}
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import "../styles/textfield.css";
3
+ export interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> {
4
+ /** Textarea label */
5
+ label?: React.ReactNode;
6
+ /** Error message to display */
7
+ error?: string | null;
8
+ /** Helper text that appears below the textarea */
9
+ description?: React.ReactNode;
10
+ /** Whether the field is required */
11
+ required?: boolean;
12
+ /** Called when value changes */
13
+ onValueChange?: (value: string) => void;
14
+ }
15
+ /**
16
+ * Textarea component matching OpenLearning UI design
17
+ */
18
+ export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
19
+ //# sourceMappingURL=Textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../src/components/Textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,yBAAyB,CAAC;AAEjC,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,UAAU,CAAC;IACxG,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kDAAkD;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,2FA8CpB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import "../styles/textfield.css";
4
+ /**
5
+ * Textarea component matching OpenLearning UI design
6
+ */
7
+ export const Textarea = React.forwardRef(({ label, error, description, required, className = "", onValueChange, disabled, rows = 4, ...rest }, ref) => {
8
+ const handleChange = (event) => {
9
+ if (onValueChange) {
10
+ onValueChange(event.target.value);
11
+ }
12
+ };
13
+ const hasError = !!error;
14
+ return (_jsxs("div", { className: `textfield-container ${className}`, children: [label && (_jsxs("label", { className: "textfield-label", children: [label, required && _jsx("span", { className: "textfield-required", children: " *" })] })), _jsx("textarea", { ref: ref, className: `textfield-input textfield-textarea ${hasError ? 'textfield-input--error' : ''} ${disabled ? 'textfield-input--disabled' : ''}`, disabled: disabled, rows: rows, onChange: handleChange, ...rest }), description && !error && (_jsx("div", { className: "textfield-description", children: description })), error && _jsx("div", { className: "textfield-error", children: error })] }));
15
+ });
16
+ Textarea.displayName = "Textarea";
17
+ //# sourceMappingURL=Textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Textarea.js","sourceRoot":"","sources":["../../src/components/Textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,yBAAyB,CAAC;AAejC;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CACtC,CACE,EACE,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,aAAa,EACb,QAAQ,EACR,IAAI,GAAG,CAAC,EACR,GAAG,IAAI,EACR,EACD,GAAG,EACH,EAAE;IACF,MAAM,YAAY,GAAG,CAAC,KAA6C,EAAE,EAAE;QACrE,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC;IAEzB,OAAO,CACL,eAAK,SAAS,EAAE,uBAAuB,SAAS,EAAE,aAC/C,KAAK,IAAI,CACR,iBAAO,SAAS,EAAC,iBAAiB,aAC/B,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,oBAAoB,mBAAU,IACrD,CACT,EACD,mBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,sCAAsC,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EAAE,EAC1I,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,YAAY,KAClB,IAAI,GACR,EACD,WAAW,IAAI,CAAC,KAAK,IAAI,CACxB,cAAK,SAAS,EAAC,uBAAuB,YAAE,WAAW,GAAO,CAC3D,EACA,KAAK,IAAI,cAAK,SAAS,EAAC,iBAAiB,YAAE,KAAK,GAAO,IACpD,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,4 +9,15 @@ export { defineWidgetProject, type WidgetProjectConfig, } from "./setupProject";
9
9
  export { useParentMessaging } from "./useParentMessaging";
10
10
  export { useWidgetConfig } from "./useWidgetConfig";
11
11
  export type { JSONValue, Attachment, WidgetConfigBase, LearnerViewProps, SetupViewProps, ParentMessage, ParentMessagingCallbacks, } from "./types";
12
+ export { Button, type ButtonProps, type ButtonVariant, type ButtonSize, } from "./components/Button";
13
+ export { Menu, type MenuProps, type MenuItem, } from "./components/Menu";
14
+ export { Spinner, type SpinnerProps, } from "./components/Spinner";
15
+ export { Checkbox, type CheckboxProps, } from "./components/Checkbox";
16
+ export { CheckboxGroup, type CheckboxGroupProps, type CheckboxGroupOption, } from "./components/CheckboxGroup";
17
+ export { RadioGroup, type RadioGroupProps, type RadioOption, } from "./components/RadioGroup";
18
+ export { Switch, type SwitchProps, } from "./components/Switch";
19
+ export { TextField, type TextFieldProps, } from "./components/TextField";
20
+ export { Textarea, type TextareaProps, } from "./components/Textarea";
21
+ export { StatusTag, type StatusTagProps, type StatusTagVariant, } from "./components/StatusTag";
22
+ export { Tabs, type TabsProps, type Tab, } from "./components/Tabs";
12
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,wBAAwB,GACzB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,kBAAkB,EAClB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,wBAAwB,GACzB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,IAAI,EACJ,KAAK,SAAS,EACd,KAAK,QAAQ,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,OAAO,EACP,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,WAAW,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,MAAM,EACN,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,KAAK,SAAS,EACd,KAAK,GAAG,GACT,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -2,10 +2,23 @@
2
2
  * Widget Framework
3
3
  * Shared utilities for building OpenLearning widgets
4
4
  */
5
+ // Framework utilities
5
6
  export { createLearnerEntry, } from "./createLearnerEntry";
6
7
  export { createSetupEntry, } from "./createSetupEntry";
7
8
  export { DevApp } from "./DevApp";
8
9
  export { defineWidgetProject, } from "./setupProject";
9
10
  export { useParentMessaging } from "./useParentMessaging";
10
11
  export { useWidgetConfig } from "./useWidgetConfig";
12
+ // UI Components
13
+ export { Button, } from "./components/Button";
14
+ export { Menu, } from "./components/Menu";
15
+ export { Spinner, } from "./components/Spinner";
16
+ export { Checkbox, } from "./components/Checkbox";
17
+ export { CheckboxGroup, } from "./components/CheckboxGroup";
18
+ export { RadioGroup, } from "./components/RadioGroup";
19
+ export { Switch, } from "./components/Switch";
20
+ export { TextField, } from "./components/TextField";
21
+ export { Textarea, } from "./components/Textarea";
22
+ export { StatusTag, } from "./components/StatusTag";
23
+ export { Tabs, } from "./components/Tabs";
11
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,GAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAoB,MAAM,UAAU,CAAC;AACpD,OAAO,EACL,mBAAmB,GAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sBAAsB;AACtB,OAAO,EACL,kBAAkB,GAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAoB,MAAM,UAAU,CAAC;AACpD,OAAO,EACL,mBAAmB,GAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAWpD,gBAAgB;AAChB,OAAO,EACL,MAAM,GAIP,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,IAAI,GAGL,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,OAAO,GAER,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,QAAQ,GAET,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,GAGd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,GAGX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,MAAM,GAEP,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,SAAS,GAEV,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,QAAQ,GAET,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,SAAS,GAGV,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,GAGL,MAAM,mBAAmB,CAAC"}