@wellingtonhlc/shared-ui 0.27.1 → 0.29.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 (153) hide show
  1. package/README.md +20 -4
  2. package/dist/styles.css +612 -731
  3. package/package.json +14 -2
  4. package/dist/cli/check-page-actions.d.ts +0 -9
  5. package/dist/cli/check-page-actions.d.ts.map +0 -1
  6. package/dist/cli/check-page-actions.js +0 -108
  7. package/dist/components/ActionBar.d.ts +0 -26
  8. package/dist/components/ActionBar.d.ts.map +0 -1
  9. package/dist/components/ActionBar.js +0 -29
  10. package/dist/components/ActionPrimitives.d.ts +0 -31
  11. package/dist/components/ActionPrimitives.d.ts.map +0 -1
  12. package/dist/components/ActionPrimitives.js +0 -27
  13. package/dist/components/AppShell.d.ts +0 -65
  14. package/dist/components/AppShell.d.ts.map +0 -1
  15. package/dist/components/AppShell.js +0 -50
  16. package/dist/components/AppShellActions.d.ts +0 -24
  17. package/dist/components/AppShellActions.d.ts.map +0 -1
  18. package/dist/components/AppShellActions.js +0 -15
  19. package/dist/components/Badge.d.ts +0 -16
  20. package/dist/components/Badge.d.ts.map +0 -1
  21. package/dist/components/Badge.js +0 -36
  22. package/dist/components/Banner.d.ts +0 -13
  23. package/dist/components/Banner.d.ts.map +0 -1
  24. package/dist/components/Banner.js +0 -29
  25. package/dist/components/Button.d.ts +0 -14
  26. package/dist/components/Button.d.ts.map +0 -1
  27. package/dist/components/Button.js +0 -41
  28. package/dist/components/Card.d.ts +0 -36
  29. package/dist/components/Card.d.ts.map +0 -1
  30. package/dist/components/Card.js +0 -56
  31. package/dist/components/ConfirmationDialog.d.ts +0 -74
  32. package/dist/components/ConfirmationDialog.d.ts.map +0 -1
  33. package/dist/components/ConfirmationDialog.js +0 -234
  34. package/dist/components/CopyableField.d.ts +0 -10
  35. package/dist/components/CopyableField.d.ts.map +0 -1
  36. package/dist/components/CopyableField.js +0 -60
  37. package/dist/components/DateField.d.ts +0 -19
  38. package/dist/components/DateField.d.ts.map +0 -1
  39. package/dist/components/DateField.js +0 -172
  40. package/dist/components/DecimalField.d.ts +0 -21
  41. package/dist/components/DecimalField.d.ts.map +0 -1
  42. package/dist/components/DecimalField.js +0 -137
  43. package/dist/components/DismissiblePopover.d.ts +0 -14
  44. package/dist/components/DismissiblePopover.d.ts.map +0 -1
  45. package/dist/components/DismissiblePopover.js +0 -51
  46. package/dist/components/EmptyState.d.ts +0 -15
  47. package/dist/components/EmptyState.d.ts.map +0 -1
  48. package/dist/components/EmptyState.js +0 -32
  49. package/dist/components/FieldControl.d.ts +0 -20
  50. package/dist/components/FieldControl.d.ts.map +0 -1
  51. package/dist/components/FieldControl.js +0 -73
  52. package/dist/components/FieldGroup.d.ts +0 -11
  53. package/dist/components/FieldGroup.d.ts.map +0 -1
  54. package/dist/components/FieldGroup.js +0 -11
  55. package/dist/components/FieldSkeleton.d.ts +0 -14
  56. package/dist/components/FieldSkeleton.d.ts.map +0 -1
  57. package/dist/components/FieldSkeleton.js +0 -23
  58. package/dist/components/FieldValidationError.d.ts +0 -8
  59. package/dist/components/FieldValidationError.d.ts.map +0 -1
  60. package/dist/components/FieldValidationError.js +0 -7
  61. package/dist/components/Filter.d.ts +0 -51
  62. package/dist/components/Filter.d.ts.map +0 -1
  63. package/dist/components/Filter.js +0 -68
  64. package/dist/components/Loading.d.ts +0 -17
  65. package/dist/components/Loading.d.ts.map +0 -1
  66. package/dist/components/Loading.js +0 -15
  67. package/dist/components/LoadingOverlay.d.ts +0 -11
  68. package/dist/components/LoadingOverlay.d.ts.map +0 -1
  69. package/dist/components/LoadingOverlay.js +0 -8
  70. package/dist/components/Modal.d.ts +0 -49
  71. package/dist/components/Modal.d.ts.map +0 -1
  72. package/dist/components/Modal.js +0 -108
  73. package/dist/components/MultiSelectField.d.ts +0 -22
  74. package/dist/components/MultiSelectField.d.ts.map +0 -1
  75. package/dist/components/MultiSelectField.js +0 -84
  76. package/dist/components/NavCard.d.ts +0 -15
  77. package/dist/components/NavCard.d.ts.map +0 -1
  78. package/dist/components/NavCard.js +0 -13
  79. package/dist/components/Page.d.ts +0 -89
  80. package/dist/components/Page.d.ts.map +0 -1
  81. package/dist/components/Page.js +0 -347
  82. package/dist/components/PageMessage.d.ts +0 -12
  83. package/dist/components/PageMessage.d.ts.map +0 -1
  84. package/dist/components/PageMessage.js +0 -36
  85. package/dist/components/Pagination.d.ts +0 -15
  86. package/dist/components/Pagination.d.ts.map +0 -1
  87. package/dist/components/Pagination.js +0 -57
  88. package/dist/components/PasswordInput.d.ts +0 -8
  89. package/dist/components/PasswordInput.d.ts.map +0 -1
  90. package/dist/components/PasswordInput.js +0 -17
  91. package/dist/components/RadioGroup.d.ts +0 -32
  92. package/dist/components/RadioGroup.d.ts.map +0 -1
  93. package/dist/components/RadioGroup.js +0 -86
  94. package/dist/components/RenderCase.d.ts +0 -20
  95. package/dist/components/RenderCase.d.ts.map +0 -1
  96. package/dist/components/RenderCase.js +0 -31
  97. package/dist/components/RenderIf.d.ts +0 -10
  98. package/dist/components/RenderIf.d.ts.map +0 -1
  99. package/dist/components/RenderIf.js +0 -9
  100. package/dist/components/SearchField.d.ts +0 -22
  101. package/dist/components/SearchField.d.ts.map +0 -1
  102. package/dist/components/SearchField.js +0 -43
  103. package/dist/components/SelectField.d.ts +0 -31
  104. package/dist/components/SelectField.d.ts.map +0 -1
  105. package/dist/components/SelectField.js +0 -26
  106. package/dist/components/SelectionField.d.ts +0 -39
  107. package/dist/components/SelectionField.d.ts.map +0 -1
  108. package/dist/components/SelectionField.js +0 -105
  109. package/dist/components/Sidebar.d.ts +0 -104
  110. package/dist/components/Sidebar.d.ts.map +0 -1
  111. package/dist/components/Sidebar.js +0 -146
  112. package/dist/components/StatCard.d.ts +0 -16
  113. package/dist/components/StatCard.d.ts.map +0 -1
  114. package/dist/components/StatCard.js +0 -62
  115. package/dist/components/Switch.d.ts +0 -20
  116. package/dist/components/Switch.d.ts.map +0 -1
  117. package/dist/components/Switch.js +0 -63
  118. package/dist/components/Table.d.ts +0 -65
  119. package/dist/components/Table.d.ts.map +0 -1
  120. package/dist/components/Table.js +0 -120
  121. package/dist/components/TabsUnderlined.d.ts +0 -23
  122. package/dist/components/TabsUnderlined.d.ts.map +0 -1
  123. package/dist/components/TabsUnderlined.js +0 -29
  124. package/dist/components/TextField.d.ts +0 -25
  125. package/dist/components/TextField.d.ts.map +0 -1
  126. package/dist/components/TextField.js +0 -71
  127. package/dist/components/TextareaField.d.ts +0 -14
  128. package/dist/components/TextareaField.d.ts.map +0 -1
  129. package/dist/components/TextareaField.js +0 -34
  130. package/dist/components/ThemePreferencesSelector.d.ts +0 -29
  131. package/dist/components/ThemePreferencesSelector.d.ts.map +0 -1
  132. package/dist/components/ThemePreferencesSelector.js +0 -37
  133. package/dist/components/Tooltip.d.ts +0 -13
  134. package/dist/components/Tooltip.d.ts.map +0 -1
  135. package/dist/components/Tooltip.js +0 -40
  136. package/dist/components/Workspace.d.ts +0 -22
  137. package/dist/components/Workspace.d.ts.map +0 -1
  138. package/dist/components/Workspace.js +0 -33
  139. package/dist/components/WorkspaceContext.d.ts +0 -2
  140. package/dist/components/WorkspaceContext.d.ts.map +0 -1
  141. package/dist/components/WorkspaceContext.js +0 -2
  142. package/dist/components/form-control-helpers.d.ts +0 -24
  143. package/dist/components/form-control-helpers.d.ts.map +0 -1
  144. package/dist/components/form-control-helpers.js +0 -20
  145. package/dist/index.d.ts +0 -45
  146. package/dist/index.d.ts.map +0 -1
  147. package/dist/index.js +0 -44
  148. package/dist/tailwind-preset.d.ts +0 -23
  149. package/dist/tailwind-preset.d.ts.map +0 -1
  150. package/dist/tailwind-preset.js +0 -22
  151. package/dist/utils/cn.d.ts +0 -2
  152. package/dist/utils/cn.d.ts.map +0 -1
  153. package/dist/utils/cn.js +0 -33
@@ -1,41 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef } from 'react';
3
- import { cn } from '../utils/cn';
4
- const variantClasses = {
5
- primary: 'border-transparent bg-[var(--brand)] text-[var(--primary-foreground,#ffffff)] shadow-[0_10px_22px_-16px_color-mix(in_srgb,var(--brand)_70%,#000)] hover:bg-[var(--brand-hover,var(--brand))] hover:shadow-[0_16px_28px_-18px_color-mix(in_srgb,var(--brand)_80%,#000)] dark:shadow-[0_14px_28px_-20px_color-mix(in_srgb,var(--brand)_86%,#000)]',
6
- secondary: 'border-[color-mix(in_srgb,var(--brand)_34%,var(--app-border))] bg-[color-mix(in_srgb,var(--brand)_12%,var(--surface))] text-[color-mix(in_srgb,var(--brand)_88%,var(--foreground))] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--brand)_8%,transparent)] hover:border-[color-mix(in_srgb,var(--brand)_48%,var(--app-border))] hover:bg-[color-mix(in_srgb,var(--brand)_18%,var(--surface))] dark:border-[color-mix(in_srgb,var(--brand)_42%,var(--app-border))] dark:bg-[color-mix(in_srgb,var(--brand)_18%,var(--surface))] dark:text-[color-mix(in_srgb,var(--brand)_42%,#fff)] dark:hover:bg-[color-mix(in_srgb,var(--brand)_24%,var(--surface))] dark:hover:text-[color-mix(in_srgb,var(--brand)_30%,#fff)]',
7
- ghost: 'border-transparent bg-transparent text-foreground-muted hover:bg-[color-mix(in_srgb,var(--brand)_10%,transparent)] hover:text-[color-mix(in_srgb,var(--brand)_86%,var(--foreground))] dark:hover:bg-[color-mix(in_srgb,var(--brand)_14%,transparent)] dark:hover:text-[color-mix(in_srgb,var(--brand)_78%,#fff)]',
8
- outline: 'border-app-border bg-transparent text-foreground hover:border-[color-mix(in_srgb,var(--brand)_46%,var(--app-border))] hover:bg-[color-mix(in_srgb,var(--brand)_8%,transparent)] hover:text-[color-mix(in_srgb,var(--brand)_86%,var(--foreground))] dark:hover:border-[color-mix(in_srgb,var(--brand)_54%,var(--app-border))] dark:hover:bg-[color-mix(in_srgb,var(--brand)_12%,transparent)] dark:hover:text-[color-mix(in_srgb,var(--brand)_78%,#fff)]',
9
- information: 'border-[var(--status-info-border,#93c5fd)] bg-[var(--status-info-bg,rgba(219,234,254,0.8))] text-[var(--status-info-text,#1d4ed8)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-info-border,#93c5fd)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-info-bg,rgba(219,234,254,0.8))_78%,var(--status-info-border,#93c5fd))]',
10
- success: 'border-[var(--status-success-border,#86efac)] bg-[var(--status-success-bg,rgba(220,252,231,0.8))] text-[var(--status-success-text,#15803d)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-success-border,#86efac)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-success-bg,rgba(220,252,231,0.8))_78%,var(--status-success-border,#86efac))]',
11
- warning: 'border-[var(--status-warning-border,#fcd34d)] bg-[var(--status-warning-bg,rgba(254,243,199,0.8))] text-[var(--status-warning-text,#92400e)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-warning-border,#fcd34d)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-warning-bg,rgba(254,243,199,0.8))_78%,var(--status-warning-border,#fcd34d))]',
12
- danger: 'border-[var(--status-danger-border,#fca5a5)] bg-[var(--status-danger-bg,rgba(254,202,202,0.8))] text-[var(--status-danger-text,#b91c1c)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-danger-border,#fca5a5)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-danger-bg,rgba(254,202,202,0.8))_78%,var(--status-danger-border,#fca5a5))]',
13
- destructive: 'border-transparent bg-[#dc2626] text-white hover:bg-[#b91c1c]',
14
- sidebar: 'border-transparent bg-transparent text-foreground-muted hover:bg-[color-mix(in_srgb,var(--brand)_10%,transparent)] hover:text-[var(--brand)]',
15
- };
16
- const sizeClasses = {
17
- xs: 'min-h-7 min-w-7 px-1.5 py-1 text-[0.625rem]',
18
- sm: 'min-h-9 min-w-9 px-2.5 py-2 text-xs',
19
- md: 'min-h-11 min-w-20 px-4 py-2.5 text-sm',
20
- lg: 'min-h-13 min-w-24 px-6 py-3 text-base',
21
- wide: 'min-h-11 min-w-20 w-full px-4 py-2.5 text-sm',
22
- };
23
- const roundedSizeClasses = {
24
- xs: 'size-7 min-h-7 min-w-7 p-1 text-[0.625rem]',
25
- sm: 'size-9 min-h-9 min-w-9 p-1.5 text-xs',
26
- md: 'size-12 min-h-12 min-w-12 p-2 text-sm',
27
- lg: 'size-14 min-h-14 min-w-14 p-3 text-base',
28
- wide: 'min-h-11 min-w-20 w-full px-4 py-2.5 text-sm',
29
- };
30
- export const Button = forwardRef(({ children, className, disabled, isLoading = false, isSubmitting = false, minWidth, rounded = false, size = 'md', style, title, tooltip, type = 'button', variant = 'primary', ...props }, ref) => {
31
- const busy = isLoading || isSubmitting;
32
- const resolvedSize = rounded ? roundedSizeClasses[size] : sizeClasses[size];
33
- const ariaBusy = props['aria-busy'] ?? (busy ? true : undefined);
34
- return (_jsx("button", { ref: ref, className: cn('inline-flex cursor-pointer items-center justify-center gap-2 rounded-[var(--radius)] border font-semibold leading-none no-underline transition-[background-color,border-color,color,opacity,box-shadow] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand/30 disabled:cursor-not-allowed disabled:opacity-55 disabled:saturate-50', variantClasses[variant], resolvedSize, rounded && 'rounded-full', busy && 'cursor-wait opacity-90', className), disabled: disabled || busy, style: {
35
- ...style,
36
- ...(minWidth !== undefined
37
- ? { minWidth: typeof minWidth === 'number' ? `${minWidth}px` : minWidth }
38
- : {}),
39
- }, "aria-busy": ariaBusy, title: tooltip ?? title, type: type, ...props, children: children }));
40
- });
41
- Button.displayName = 'Button';
@@ -1,36 +0,0 @@
1
- import { type HTMLAttributes, type ReactNode } from 'react';
2
- export type CardVariant = 'default' | 'subtle' | 'surface' | 'elevated';
3
- export type CardDensity = 'none' | 'compact' | 'default';
4
- export interface CardProps extends HTMLAttributes<HTMLDivElement> {
5
- children: ReactNode;
6
- className?: string;
7
- highlight?: boolean;
8
- variant?: CardVariant;
9
- }
10
- export interface CardBodyProps extends HTMLAttributes<HTMLDivElement> {
11
- density?: CardDensity;
12
- }
13
- export type CardHeaderProps = HTMLAttributes<HTMLDivElement>;
14
- export type CardDescriptionProps = HTMLAttributes<HTMLParagraphElement>;
15
- export type CardActionsProps = HTMLAttributes<HTMLDivElement>;
16
- export type CardToolbarProps = HTMLAttributes<HTMLDivElement>;
17
- declare function CardRoot({ className, children, highlight, variant, ...props }: CardProps): import("react").JSX.Element;
18
- declare function CardHeader({ className, children, ...props }: CardHeaderProps): import("react").JSX.Element;
19
- declare function CardTitle({ className, children, ...props }: HTMLAttributes<HTMLHeadingElement>): import("react").JSX.Element;
20
- declare function CardDescription({ className, children, ...props }: CardDescriptionProps): import("react").JSX.Element;
21
- declare function CardBody({ className, children, density, ...props }: CardBodyProps): import("react").JSX.Element;
22
- declare function CardActions({ className, children, ...props }: CardActionsProps): import("react").JSX.Element;
23
- declare function CardToolbar({ className, children, ...props }: CardToolbarProps): import("react").JSX.Element;
24
- declare function CardFooter({ className, children, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
25
- export declare const Card: {
26
- Root: typeof CardRoot;
27
- Header: typeof CardHeader;
28
- Title: typeof CardTitle;
29
- Description: typeof CardDescription;
30
- Body: typeof CardBody;
31
- Actions: typeof CardActions;
32
- Toolbar: typeof CardToolbar;
33
- Footer: typeof CardFooter;
34
- };
35
- export {};
36
- //# sourceMappingURL=Card.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI5D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AACxE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC/D,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,cAAc,CAAC;IACnE,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAC7D,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACxE,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAyB9D,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,QAAQ,EACR,SAAiB,EACjB,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,SAAS,+BAeX;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,+BAarE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,kBAAkB,CAAC,+BAavF;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,+BAM/E;AAED,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAmB,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BAMtF;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BAMvE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BASvE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BASpF;AAED,eAAO,MAAM,IAAI;;;;;;;;;CAShB,CAAC"}
@@ -1,56 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from '../utils/cn';
3
- function getCardVariantClass(variant) {
4
- if (variant === 'subtle') {
5
- return 'bg-[color-mix(in_srgb,var(--foreground-muted)_5%,var(--surface))] shadow-none';
6
- }
7
- if (variant === 'surface') {
8
- return 'bg-surface shadow-[inset_0_1px_0_color-mix(in_srgb,#fff_40%,transparent)]';
9
- }
10
- if (variant === 'elevated') {
11
- return 'bg-surface shadow-[0_16px_36px_-24px_color-mix(in_srgb,#000_50%,transparent)]';
12
- }
13
- return 'bg-background-secondary shadow-sm';
14
- }
15
- function getContentDensityClass(density) {
16
- if (density === 'none')
17
- return 'gap-0 p-0';
18
- if (density === 'compact')
19
- return 'gap-3 p-3';
20
- return 'gap-6 p-6';
21
- }
22
- function CardRoot({ className, children, highlight = false, variant = 'default', ...props }) {
23
- return (_jsx("div", { className: cn('border-app-border rounded-xl border', highlight
24
- && 'bg-[linear-gradient(135deg,color-mix(in_srgb,var(--color-surface,var(--surface))_92%,var(--color-primary,var(--brand))_8%),var(--color-surface,var(--surface)))] shadow-[0_12px_32px_rgba(15,23,42,0.06)]', !highlight && getCardVariantClass(variant), className), ...props, children: children }));
25
- }
26
- function CardHeader({ className, children, ...props }) {
27
- return (_jsx("div", { className: cn('border-app-border flex flex-col gap-1 border-b p-4', '[&>h2]:h-auto [&>h2]:rounded-none [&>h2]:border-0 [&>h2]:p-0', className), ...props, children: children }));
28
- }
29
- function CardTitle({ className, children, ...props }) {
30
- return (_jsx("h2", { className: cn('text-foreground col-span-12 flex h-10 items-center gap-2 rounded-t-xl px-4 text-sm font-semibold', 'border-app-border border-b', className), ...props, children: children }));
31
- }
32
- function CardDescription({ className, children, ...props }) {
33
- return (_jsx("p", { className: cn('text-foreground-muted text-sm leading-5', className), ...props, children: children }));
34
- }
35
- function CardBody({ className, children, density = 'default', ...props }) {
36
- return (_jsx("div", { className: cn('flex flex-col', getContentDensityClass(density), className), ...props, children: children }));
37
- }
38
- function CardActions({ className, children, ...props }) {
39
- return (_jsx("div", { className: cn('flex items-center justify-end gap-2', className), ...props, children: children }));
40
- }
41
- function CardToolbar({ className, children, ...props }) {
42
- return (_jsx("div", { className: cn('border-app-border flex flex-wrap items-end gap-3 border-b p-3', className), ...props, children: children }));
43
- }
44
- function CardFooter({ className, children, ...props }) {
45
- return (_jsx("div", { className: cn('border-app-border flex items-center gap-4 border-t p-4', className), ...props, children: children }));
46
- }
47
- export const Card = {
48
- Root: CardRoot,
49
- Header: CardHeader,
50
- Title: CardTitle,
51
- Description: CardDescription,
52
- Body: CardBody,
53
- Actions: CardActions,
54
- Toolbar: CardToolbar,
55
- Footer: CardFooter,
56
- };
@@ -1,74 +0,0 @@
1
- import React, { type ReactNode } from 'react';
2
- import { type ButtonProps } from './Button';
3
- export type ConfirmationDialogVariant = 'information' | 'question' | 'warning' | 'destructive';
4
- export type ConfirmationDialogVariantInput = ConfirmationDialogVariant | 'default';
5
- export type ConfirmationDialogButtonVariant = 'cancel' | 'confirm' | 'danger' | 'success';
6
- export interface ConfirmationDialogAction extends Omit<ButtonProps, 'children' | 'onClick'> {
7
- children?: ReactNode;
8
- label?: ReactNode;
9
- onSelect: () => Promise<void> | void;
10
- }
11
- export interface ConfirmationDialogProps {
12
- actions?: ConfirmationDialogAction[];
13
- cancelLabel?: ReactNode;
14
- children?: ReactNode;
15
- className?: string;
16
- confirmLabel?: ReactNode;
17
- description?: ReactNode;
18
- onClose: () => void;
19
- onConfirm?: () => Promise<void> | void;
20
- open: boolean;
21
- title?: ReactNode;
22
- variant?: ConfirmationDialogVariantInput;
23
- }
24
- export interface ConfirmationDialogRootProps {
25
- children: ReactNode;
26
- className?: string;
27
- closeOnEscape?: boolean;
28
- onOpenChange: (open: boolean) => void;
29
- open: boolean;
30
- overlayClassName?: string;
31
- variant?: ConfirmationDialogVariantInput;
32
- }
33
- export interface ConfirmationDialogButtonProps extends Omit<ButtonProps, 'children' | 'onClick' | 'variant'> {
34
- buttonVariant?: ButtonProps['variant'];
35
- children?: ReactNode;
36
- closeOnSuccess?: boolean;
37
- label?: ReactNode;
38
- onClick?: () => Promise<void> | void;
39
- submit?: boolean;
40
- variant?: ConfirmationDialogButtonVariant;
41
- }
42
- declare function Root({ children, className, closeOnEscape, onOpenChange, open, overlayClassName, variant, }: ConfirmationDialogRootProps): React.ReactPortal | null;
43
- declare function Icon({ className }: {
44
- className?: string;
45
- }): React.JSX.Element;
46
- declare function Title({ children, className }: {
47
- children: ReactNode;
48
- className?: string;
49
- }): React.JSX.Element;
50
- declare function Description({ children, className }: {
51
- children: ReactNode;
52
- className?: string;
53
- }): React.JSX.Element;
54
- declare function Body({ children, className }: {
55
- children: ReactNode;
56
- className?: string;
57
- }): React.JSX.Element;
58
- declare function Footer({ children, className }: {
59
- children: ReactNode;
60
- className?: string;
61
- }): React.JSX.Element;
62
- declare function Button({ children, closeOnSuccess, disabled, label, minWidth, onClick, size, submit, variant, ...props }: ConfirmationDialogButtonProps): React.JSX.Element;
63
- declare function ConfirmationDialogSimple({ actions, cancelLabel, children, className, confirmLabel, description, onClose, onConfirm, open, title, variant, }: ConfirmationDialogProps): React.JSX.Element;
64
- export declare const ConfirmationDialog: typeof ConfirmationDialogSimple & {
65
- Root: typeof Root;
66
- Icon: typeof Icon;
67
- Title: typeof Title;
68
- Description: typeof Description;
69
- Body: typeof Body;
70
- Footer: typeof Footer;
71
- Button: typeof Button;
72
- };
73
- export {};
74
- //# sourceMappingURL=ConfirmationDialog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConfirmationDialog.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmationDialog.tsx"],"names":[],"mappings":"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"}
@@ -1,234 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { createContext, useContext, useEffect, useId, useMemo, useRef, useState, } from 'react';
3
- import { createPortal } from 'react-dom';
4
- import { AlertCircleIcon, AlertTriangleIcon, HelpCircleIcon, InfoIcon, XIcon } from 'lucide-react';
5
- import { cn } from '../utils/cn';
6
- import { Button as BaseButton } from './Button';
7
- const ConfirmationDialogContext = createContext(null);
8
- function resolveVariant(variant) {
9
- return variant === 'default' ? 'information' : variant;
10
- }
11
- const dialogVariantStyles = {
12
- information: {
13
- icon: InfoIcon,
14
- iconClassName: 'text-[color-mix(in_srgb,var(--status-info-text,#2563eb)_76%,var(--foreground))]',
15
- titleClassName: 'text-[color-mix(in_srgb,var(--status-info-text,#2563eb)_76%,var(--foreground))]',
16
- },
17
- question: {
18
- icon: HelpCircleIcon,
19
- iconClassName: 'text-[color-mix(in_srgb,var(--brand)_82%,var(--foreground))]',
20
- titleClassName: 'text-[color-mix(in_srgb,var(--brand)_82%,var(--foreground))]',
21
- },
22
- warning: {
23
- icon: AlertTriangleIcon,
24
- iconClassName: 'text-[color-mix(in_srgb,var(--status-warning-text,#d97706)_76%,var(--foreground))]',
25
- titleClassName: 'text-[color-mix(in_srgb,var(--status-warning-text,#d97706)_76%,var(--foreground))]',
26
- },
27
- destructive: {
28
- icon: AlertCircleIcon,
29
- iconClassName: 'text-[color-mix(in_srgb,#dc2626_86%,var(--foreground))]',
30
- titleClassName: 'text-[color-mix(in_srgb,#dc2626_86%,var(--foreground))]',
31
- },
32
- };
33
- const buttonVariantDefaults = {
34
- cancel: { label: 'Cancelar', buttonVariant: 'outline' },
35
- confirm: { label: 'Confirmar', buttonVariant: 'primary' },
36
- danger: { label: 'Não', buttonVariant: 'outline' },
37
- success: { label: 'Sim', buttonVariant: 'primary' },
38
- };
39
- const confirmButtonVariantByDialog = {
40
- information: 'information',
41
- question: 'primary',
42
- warning: 'warning',
43
- destructive: 'destructive',
44
- };
45
- function useConfirmationDialog() {
46
- const context = useContext(ConfirmationDialogContext);
47
- if (!context) {
48
- throw new Error('ConfirmationDialog components must be used inside ConfirmationDialog.Root.');
49
- }
50
- return context;
51
- }
52
- function Root({ children, className, closeOnEscape = true, onOpenChange, open, overlayClassName, variant = 'information', }) {
53
- const titleId = useId();
54
- const descriptionId = useId();
55
- const resolvedVariant = resolveVariant(variant);
56
- const [submittingId, setSubmittingId] = useState(null);
57
- const [focusedId, setFocusedId] = useState(null);
58
- const buttonRefs = useRef({});
59
- const buttonOrder = useRef([]);
60
- const isBusy = submittingId !== null;
61
- function close() {
62
- if (!isBusy) {
63
- onOpenChange(false);
64
- }
65
- }
66
- function registerButton(id, element) {
67
- buttonRefs.current[id] = element;
68
- if (element && !buttonOrder.current.includes(id)) {
69
- buttonOrder.current.push(id);
70
- }
71
- if (!element) {
72
- buttonOrder.current = buttonOrder.current.filter((buttonId) => buttonId !== id);
73
- delete buttonRefs.current[id];
74
- }
75
- }
76
- function focusButton(direction) {
77
- const availableButtons = buttonOrder.current
78
- .map((id) => buttonRefs.current[id])
79
- .filter((button) => !!button && !button.disabled);
80
- if (!availableButtons.length)
81
- return;
82
- const currentIndex = availableButtons.findIndex((button) => button === document.activeElement);
83
- const nextIndex = currentIndex === -1
84
- ? 0
85
- : (currentIndex + direction + availableButtons.length) % availableButtons.length;
86
- availableButtons[nextIndex]?.focus();
87
- }
88
- async function runAction(id, action, submit = false, closeOnSuccess = true) {
89
- if (isBusy)
90
- return;
91
- if (submit) {
92
- setSubmittingId(id);
93
- }
94
- try {
95
- await action?.();
96
- if (closeOnSuccess) {
97
- onOpenChange(false);
98
- }
99
- }
100
- finally {
101
- if (submit) {
102
- setSubmittingId(null);
103
- }
104
- }
105
- }
106
- useEffect(() => {
107
- if (!open)
108
- return;
109
- function handleKeyDown(event) {
110
- if (event.key === 'Escape' && closeOnEscape && !isBusy) {
111
- event.preventDefault();
112
- onOpenChange(false);
113
- }
114
- if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {
115
- event.preventDefault();
116
- focusButton(1);
117
- }
118
- if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {
119
- event.preventDefault();
120
- focusButton(-1);
121
- }
122
- }
123
- window.addEventListener('keydown', handleKeyDown);
124
- return () => window.removeEventListener('keydown', handleKeyDown);
125
- }, [closeOnEscape, isBusy, onOpenChange, open]);
126
- useEffect(() => {
127
- if (!open)
128
- return;
129
- const timeoutId = window.setTimeout(() => {
130
- const firstButton = buttonOrder.current
131
- .map((id) => buttonRefs.current[id])
132
- .find((button) => !!button && !button.disabled);
133
- firstButton?.focus();
134
- }, 0);
135
- return () => window.clearTimeout(timeoutId);
136
- }, [open]);
137
- const value = useMemo(() => ({
138
- close,
139
- descriptionId,
140
- focusButton,
141
- focusedId,
142
- isBusy,
143
- registerButton,
144
- runAction,
145
- setFocusedId,
146
- submittingId,
147
- titleId,
148
- variant: resolvedVariant,
149
- }), [descriptionId, focusedId, isBusy, resolvedVariant, submittingId, titleId]);
150
- if (!open) {
151
- return null;
152
- }
153
- return createPortal(_jsx(ConfirmationDialogContext.Provider, { value: value, children: _jsx("div", { className: cn('fixed inset-0 z-[10000] flex items-center justify-center bg-black/50 p-4 backdrop-blur-[2px]', overlayClassName), role: "presentation", children: _jsxs("section", { "aria-describedby": descriptionId, "aria-labelledby": titleId, "aria-modal": "true", className: cn('border-app-border bg-background-secondary text-foreground relative grid gap-4 rounded-xl border p-6 shadow-2xl', className), role: "alertdialog", style: { width: 'min(29rem, calc(100vw - 2rem))' }, children: [_jsx("button", { "aria-label": "Fechar", className: cn('text-foreground-muted hover:bg-background hover:text-foreground absolute right-4 top-4 inline-flex size-7 cursor-pointer items-center justify-center rounded-md opacity-60 transition disabled:cursor-not-allowed disabled:opacity-30'), disabled: isBusy, onClick: close, type: "button", children: _jsx(XIcon, { className: "size-3.5" }) }), children] }) }) }), document.body);
154
- }
155
- function Icon({ className }) {
156
- const { variant } = useConfirmationDialog();
157
- const variantStyle = dialogVariantStyles[variant];
158
- const DialogIcon = variantStyle.icon;
159
- return _jsx(DialogIcon, { className: cn('size-4 shrink-0', variantStyle.iconClassName, className) });
160
- }
161
- function Title({ children, className }) {
162
- const { titleId, variant } = useConfirmationDialog();
163
- const variantStyle = dialogVariantStyles[variant];
164
- return (_jsxs("h2", { className: cn('flex items-center gap-2 text-base font-semibold leading-tight', variantStyle.titleClassName, className), id: titleId, children: [_jsx(Icon, {}), _jsx("span", { children: children })] }));
165
- }
166
- function Description({ children, className }) {
167
- const { descriptionId } = useConfirmationDialog();
168
- return (_jsx("p", { className: cn('text-foreground-muted min-h-[2.5rem] min-w-[18rem] text-sm leading-relaxed', className), id: descriptionId, children: children }));
169
- }
170
- function Body({ children, className }) {
171
- return _jsx("div", { className: cn('text-foreground-muted text-sm', className), children: children });
172
- }
173
- function Footer({ children, className }) {
174
- return (_jsx("footer", { className: cn('border-app-border mt-2 flex justify-end gap-2 border-t pt-4', className), children: children }));
175
- }
176
- function Button({ children, closeOnSuccess = true, disabled, label, minWidth = 100, onClick, size = 'sm', submit = false, variant = 'confirm', ...props }) {
177
- const id = useId();
178
- const { focusedId, isBusy, registerButton, runAction, setFocusedId, submittingId, variant: dialogVariant, } = useConfirmationDialog();
179
- const defaults = buttonVariantDefaults[variant];
180
- const { buttonVariant, className, onBlur, onFocus, style, ...buttonProps } = props;
181
- const isSubmitting = submittingId === id;
182
- const isFocused = focusedId === id;
183
- const isMainAction = variant === 'confirm' || variant === 'success';
184
- const resolvedButtonVariant = buttonVariant
185
- ?? (isMainAction ? confirmButtonVariantByDialog[dialogVariant] : defaults.buttonVariant);
186
- function handleClick() {
187
- void runAction(id, onClick, submit, closeOnSuccess);
188
- }
189
- function handleFocus(event) {
190
- setFocusedId(id);
191
- onFocus?.(event);
192
- }
193
- function handleBlur(event) {
194
- setFocusedId(null);
195
- onBlur?.(event);
196
- }
197
- return (_jsx(BaseButton, { ...buttonProps, ref: (element) => registerButton(id, element), disabled: disabled || (isBusy && !isSubmitting), isSubmitting: isSubmitting, minWidth: minWidth, onBlur: handleBlur, onClick: handleClick, onFocus: handleFocus, size: size, variant: resolvedButtonVariant, className: cn('h-9 min-h-9 rounded-md px-3 py-0 text-sm leading-none', 'focus:outline-none focus-visible:outline-none', className), style: {
198
- ...style,
199
- ...(isFocused
200
- ? {
201
- boxShadow: '0 0 0 2px var(--background-secondary), 0 0 0 4px rgba(245, 158, 11, 0.62)',
202
- }
203
- : {}),
204
- }, children: children ?? label ?? defaults.label }));
205
- }
206
- function ConfirmationDialogSimple({ actions, cancelLabel = 'Não', children, className, confirmLabel = 'Sim', description, onClose, onConfirm, open, title = 'Tem certeza?', variant = 'information', }) {
207
- function handleOpenChange(nextOpen) {
208
- if (!nextOpen) {
209
- onClose();
210
- }
211
- }
212
- function handleConfirm() {
213
- return onConfirm?.();
214
- }
215
- const resolvedActions = actions?.length
216
- ? actions.map((action, index) => {
217
- const { children: actionChildren, label: actionLabel, onSelect, variant: actionVariant, ...actionProps } = action;
218
- return (_jsx(Button, { ...actionProps, buttonVariant: actionVariant, closeOnSuccess: true, label: actionLabel, onClick: onSelect, submit: index === actions.length - 1, variant: index === actions.length - 1 ? 'success' : 'cancel', children: actionChildren }, index));
219
- })
220
- : [
221
- _jsx(Button, { label: cancelLabel, onClick: onClose, variant: "danger" }, "cancel"),
222
- _jsx(Button, { label: confirmLabel, onClick: handleConfirm, submit: true, variant: "success" }, "confirm"),
223
- ];
224
- return (_jsxs(Root, { className: className, onOpenChange: handleOpenChange, open: open, variant: variant, children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Title, { children: title }), description ? _jsx(Description, { children: description }) : null] }), children ? _jsx(Body, { children: children }) : null, _jsx(Footer, { children: resolvedActions })] }));
225
- }
226
- export const ConfirmationDialog = Object.assign(ConfirmationDialogSimple, {
227
- Root,
228
- Icon,
229
- Title,
230
- Description,
231
- Body,
232
- Footer,
233
- Button,
234
- });
@@ -1,10 +0,0 @@
1
- import React from "react";
2
- export interface CopyableFieldProps extends React.HTMLAttributes<HTMLElement> {
3
- value?: string | number | null;
4
- children: React.ReactNode;
5
- asChild?: boolean;
6
- successMessage?: string;
7
- errorMessage?: string;
8
- }
9
- export declare const CopyableField: React.ForwardRefExoticComponent<CopyableFieldProps & React.RefAttributes<HTMLElement>>;
10
- //# sourceMappingURL=CopyableField.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CopyableField.d.ts","sourceRoot":"","sources":["../../src/components/CopyableField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,WAAW,kBAAmB,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,aAAa,wFAuHzB,CAAC"}
@@ -1,60 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
3
- import { Slot } from "@radix-ui/react-slot";
4
- import { ClipboardCheckIcon, ClipboardIcon } from "lucide-react";
5
- import { toast } from "sonner";
6
- import { cn } from "../utils/cn";
7
- export const CopyableField = React.forwardRef(function CopyableField({ asChild = false, children, className, errorMessage = "Nao foi possivel copiar o valor.", onClick, onKeyDown, successMessage = "Valor copiado.", title = "Clique para copiar", value, ...props }, ref) {
8
- const Component = asChild ? Slot : "span";
9
- const copyValue = value === null || value === undefined ? "" : String(value);
10
- const canCopy = copyValue.trim().length > 0;
11
- const [copied, setCopied] = React.useState(false);
12
- const feedbackTimerRef = React.useRef(null);
13
- React.useEffect(() => {
14
- return () => {
15
- if (feedbackTimerRef.current) {
16
- clearTimeout(feedbackTimerRef.current);
17
- }
18
- };
19
- }, []);
20
- function showCopiedFeedback() {
21
- setCopied(true);
22
- if (feedbackTimerRef.current) {
23
- clearTimeout(feedbackTimerRef.current);
24
- }
25
- feedbackTimerRef.current = setTimeout(() => {
26
- setCopied(false);
27
- feedbackTimerRef.current = null;
28
- }, 1200);
29
- }
30
- async function copy() {
31
- if (!canCopy)
32
- return;
33
- try {
34
- await navigator.clipboard.writeText(copyValue);
35
- showCopiedFeedback();
36
- toast.success(successMessage);
37
- }
38
- catch {
39
- toast.error(errorMessage);
40
- }
41
- }
42
- function handleClick(event) {
43
- onClick?.(event);
44
- if (event.defaultPrevented)
45
- return;
46
- void copy();
47
- }
48
- function handleKeyDown(event) {
49
- onKeyDown?.(event);
50
- if (event.defaultPrevented)
51
- return;
52
- if (event.key === "Enter" || event.key === " ") {
53
- event.preventDefault();
54
- void copy();
55
- }
56
- }
57
- return (_jsx(Component, { ref: ref, role: canCopy ? "button" : undefined, tabIndex: canCopy ? 0 : -1, title: canCopy ? title : undefined, "aria-disabled": !canCopy, "aria-label": canCopy && copied ? "Copiado" : undefined, "data-copied": copied ? "true" : undefined, className: cn(canCopy &&
58
- "group/copyable relative cursor-pointer rounded-md border border-transparent focus-visible:outline-none", className), onClick: handleClick, onKeyDown: handleKeyDown, ...props, children: asChild ? (children) : (_jsxs(_Fragment, { children: [children, canCopy ? (_jsx("span", { "aria-hidden": "true", className: cn("border-app-border bg-[color-mix(in_srgb,var(--foreground-muted)_3%,var(--background-secondary))] text-foreground-muted pointer-events-none absolute top-1/2 right-0 inline-flex size-6 translate-x-[calc(100%+0.25rem)] -translate-y-1/2 items-center justify-center rounded-md border opacity-0 shadow-sm transition-[opacity,color,border-color,background-color] duration-150 group-hover/copyable:opacity-100 group-focus-visible/copyable:opacity-100", copied &&
59
- "bg-[color-mix(in_srgb,var(--brand)_9%,var(--background-secondary))] text-brand opacity-100"), children: copied ? (_jsx(ClipboardCheckIcon, { className: "size-3.5" })) : (_jsx(ClipboardIcon, { className: "size-3.5" })) })) : null] })) }));
60
- });
@@ -1,19 +0,0 @@
1
- import React from 'react';
2
- export type DateFieldMode = 'date' | 'dateTime' | 'time';
3
- export interface DateFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'value' | 'onChange'> {
4
- label?: string;
5
- value?: string | Date | null;
6
- onChange?: ((value: string) => void) | React.ChangeEventHandler<HTMLInputElement>;
7
- inputRef?: React.Ref<HTMLInputElement>;
8
- errorMessage?: string;
9
- wrapperClassName?: string;
10
- labelClassName?: string;
11
- size?: 'sm' | 'md' | 'lg';
12
- roundedFull?: boolean;
13
- mode?: DateFieldMode;
14
- enableTime?: boolean;
15
- timeIntervals?: number;
16
- noPortal?: boolean;
17
- }
18
- export declare const DateField: React.ForwardRefExoticComponent<DateFieldProps & React.RefAttributes<HTMLInputElement>>;
19
- //# sourceMappingURL=DateField.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DateField.d.ts","sourceRoot":"","sources":["../../src/components/DateField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AA6FzD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAC/H,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAClF,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,yFA6IrB,CAAC"}