@wellingtonhlc/shared-ui 0.24.3 → 0.24.5

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.
package/README.md CHANGED
@@ -64,6 +64,33 @@ Nao inclua:
64
64
  | `npm run storybook` | Sobe o Storybook local. |
65
65
  | `npm run build-storybook` | Gera build estatico do Storybook. |
66
66
 
67
+ ## Validadores para consumidores
68
+
69
+ O pacote publica o CLI `shared-ui-check-page-actions` para validar o contrato de actions em projetos consumidores.
70
+
71
+ Contrato esperado:
72
+
73
+ - `AppLayout.actions` e somente o slot de layout.
74
+ - `Page.Actions` e o root visual da barra.
75
+ - Props como `helpContent`, `helpLabel`, `position`, `align` e `size` pertencem ao `Page.Actions`.
76
+ - Nao usar `ActionBar.*`, `Page.Root actions=...` dentro de `AppLayout`, Fragment, `div` ou `Page.ActionButton` solto como root de `AppLayout.actions`.
77
+
78
+ Uso recomendado no consumidor:
79
+
80
+ ```json
81
+ {
82
+ "scripts": {
83
+ "check:page-actions": "shared-ui-check-page-actions"
84
+ }
85
+ }
86
+ ```
87
+
88
+ Tambem e possivel apontar um diretorio explicitamente:
89
+
90
+ ```bash
91
+ shared-ui-check-page-actions ./src
92
+ ```
93
+
67
94
  ## Storybook
68
95
 
69
96
  O Storybook esta na linha `10.4.6` (`storybook`, `@storybook/react-vite`, `@storybook/addon-docs` e `@storybook/addon-a11y`).
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ export interface PageActionsCheckResult {
3
+ errors: string[];
4
+ scannedFiles: number;
5
+ sourceRoot: string;
6
+ }
7
+ export declare function checkPageActionsContract(rootDir?: string): PageActionsCheckResult;
8
+ export declare function runPageActionsContractCli(args?: string[]): PageActionsCheckResult;
9
+ //# sourceMappingURL=check-page-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-page-actions.d.ts","sourceRoot":"","sources":["../../src/cli/check-page-actions.ts"],"names":[],"mappings":";AAQA,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAqCD,wBAAgB,wBAAwB,CAAC,OAAO,SAAgB,GAAG,sBAAsB,CAyDxF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,WAAwB,0BAerE"}
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const extensions = new Set(['.ts', '.tsx']);
6
+ const ignoredDirectories = new Set(['node_modules', 'dist', 'build', 'coverage']);
7
+ function normalizePath(root, filePath) {
8
+ return path.relative(root, filePath).split(path.sep).join('/');
9
+ }
10
+ function* walk(directory) {
11
+ if (!fs.existsSync(directory))
12
+ return;
13
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
14
+ if (ignoredDirectories.has(entry.name))
15
+ continue;
16
+ const fullPath = path.join(directory, entry.name);
17
+ if (entry.isDirectory()) {
18
+ yield* walk(fullPath);
19
+ continue;
20
+ }
21
+ if (extensions.has(path.extname(entry.name))) {
22
+ yield fullPath;
23
+ }
24
+ }
25
+ }
26
+ function collectMatches(text, pattern, message, root, filePath, errors) {
27
+ for (const match of text.matchAll(pattern)) {
28
+ const before = text.slice(0, match.index);
29
+ const line = before.split(/\r?\n/).length;
30
+ errors.push(`${normalizePath(root, filePath)}:${line}: ${message}`);
31
+ }
32
+ }
33
+ export function checkPageActionsContract(rootDir = process.cwd()) {
34
+ const root = path.resolve(rootDir);
35
+ const sourceRoot = fs.existsSync(path.join(root, 'src')) ? path.join(root, 'src') : root;
36
+ const errors = [];
37
+ let scannedFiles = 0;
38
+ for (const filePath of walk(sourceRoot)) {
39
+ scannedFiles += 1;
40
+ const text = fs.readFileSync(filePath, 'utf8');
41
+ collectMatches(text, /ActionBar\./g, 'use Page.Actions, Page.ActionButton e Page.ActionsSeparator no lugar de ActionBar.*', root, filePath, errors);
42
+ collectMatches(text, /<Page\.Root\b[^>]*\bactions\s*=/gs, 'nao aninhe Page.Root actions dentro de AppLayout; use AppLayout.actions com Page.Actions', root, filePath, errors);
43
+ collectMatches(text, /<AppLayout\b[\s\S]*?\bactions\s*=\s*{\s*<>/g, 'AppLayout.actions nao deve receber Fragment como root; use Page.Actions ou componente *Actions', root, filePath, errors);
44
+ collectMatches(text, /<AppLayout\b[\s\S]*?\bactions\s*=\s*{\s*<div\b/g, 'AppLayout.actions nao deve receber div como root; use Page.Actions ou componente *Actions', root, filePath, errors);
45
+ collectMatches(text, /<AppLayout\b[\s\S]*?\bactions\s*=\s*{\s*<Page\.ActionButton\b/g, 'AppLayout.actions nao deve receber Page.ActionButton solto; envolva em Page.Actions', root, filePath, errors);
46
+ }
47
+ return { errors, scannedFiles, sourceRoot };
48
+ }
49
+ export function runPageActionsContractCli(args = process.argv.slice(2)) {
50
+ const rootDir = args[0] ?? process.cwd();
51
+ const result = checkPageActionsContract(rootDir);
52
+ if (result.errors.length > 0) {
53
+ console.error('Falha na verificacao de Page Actions:');
54
+ for (const error of result.errors)
55
+ console.error('- ' + error);
56
+ process.exitCode = 1;
57
+ return result;
58
+ }
59
+ console.log(`Page Actions OK: ${result.scannedFiles} arquivo(s) verificado(s); AppLayout.actions usa Page.Actions direta ou indiretamente.`);
60
+ return result;
61
+ }
62
+ const currentFilePath = fileURLToPath(import.meta.url);
63
+ const entryFilePath = process.argv[1] ? path.resolve(process.argv[1]) : '';
64
+ if (entryFilePath === currentFilePath) {
65
+ runPageActionsContractCli();
66
+ }
@@ -9,11 +9,21 @@ export interface PageActionsProps {
9
9
  position?: PageActionsPosition;
10
10
  align?: PageActionsAlign;
11
11
  size?: PageActionsSize;
12
+ helpContent?: ReactNode;
13
+ helpLabel?: string;
14
+ helpClassName?: string;
12
15
  }
13
16
  export type PageActionsElement = ReactElement<PageActionsProps, typeof Actions>;
14
17
  export type PageActionsSeparatorProps = ActionSeparatorPrimitiveProps;
15
18
  export type PageActionButtonProps = ActionButtonPrimitiveProps;
16
- declare function Actions({ align, children, className, position, size }: PageActionsProps): import("react").JSX.Element;
19
+ export interface PageActionsHelpContentProps {
20
+ children?: ReactNode;
21
+ className?: string;
22
+ items?: ReactNode[];
23
+ title?: ReactNode;
24
+ }
25
+ declare function ActionsHelpContent({ children, className, items, title }: PageActionsHelpContentProps): import("react").JSX.Element;
26
+ declare function Actions({ align, children, className, helpClassName, helpContent, helpLabel, position, size, }: PageActionsProps): import("react").JSX.Element;
17
27
  declare function ActionsSeparator(props: PageActionsSeparatorProps): import("react").JSX.Element;
18
28
  interface PageRootProps extends HTMLAttributes<HTMLElement> {
19
29
  children: ReactNode;
@@ -46,6 +56,7 @@ export declare const Page: {
46
56
  Title: typeof Title;
47
57
  Description: typeof Description;
48
58
  Actions: typeof Actions;
59
+ ActionsHelpContent: typeof ActionsHelpContent;
49
60
  ActionButton: import("react").ForwardRefExoticComponent<ActionButtonPrimitiveProps & import("react").RefAttributes<HTMLButtonElement>>;
50
61
  ActionsSeparator: typeof ActionsSeparator;
51
62
  ActionsProvider: typeof ActionsProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"Page.d.ts","sourceRoot":"","sources":["../../src/components/Page.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAIL,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,6BAA6B,EACnC,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,OAAO,CAAC,CAAC;AAChF,MAAM,MAAM,yBAAyB,GAAG,6BAA6B,CAAC;AACtE,MAAM,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAS/D,iBAAS,OAAO,CAAC,EAAE,KAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAgB,EAAE,IAAW,EAAE,EAAE,gBAAgB,+BAsBzG;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,yBAAyB,+BAEzD;AAID,UAAU,aAAc,SAAQ,cAAc,CAAC,WAAW,CAAC;IACzD,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,iBAAS,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BA+CtE;AAED,UAAU,wBAAwB;IAChC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,iBAAS,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,wBAAwB,+BAK9D;AAED,UAAU,oBAAoB;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,oBAAoB,sCAmBjE;AAED,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAExE,iBAAS,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,+BAM/D;AAED,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,+BAM3E;AAED,iBAAS,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,eAAe,+BAexE;AAED,eAAO,MAAM,IAAI;;;;;;;;;;CAUhB,CAAC"}
1
+ {"version":3,"file":"Page.d.ts","sourceRoot":"","sources":["../../src/components/Page.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,26 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { createContext, useContext, useLayoutEffect, useMemo, useState, } from 'react';
3
+ import { CircleHelpIcon } from 'lucide-react';
3
4
  import { ActionButtonPrimitive, ActionGroupPrimitive, ActionSeparatorPrimitive, } from './ActionPrimitives';
5
+ import { Tooltip } from './Tooltip';
4
6
  import { cn } from '../utils/cn';
5
7
  const PageActionsContext = createContext(null);
6
- function Actions({ align = 'start', children, className, position = 'top', size = 'md' }) {
8
+ function ActionsHelpContent({ children, className, items, title }) {
9
+ return (_jsxs("div", { className: cn('max-w-[22rem] space-y-2 text-xs leading-5 [overflow-wrap:anywhere]', className), children: [title && _jsx("p", { className: "font-semibold text-foreground", children: title }), children && _jsx("div", { className: "text-foreground-muted", children: children }), items?.length ? (_jsx("ul", { className: "list-disc space-y-1 pl-4 text-foreground-muted", children: items.map((item, index) => (_jsx("li", { children: item }, index))) })) : null] }));
10
+ }
11
+ function getHelpSide(position) {
12
+ const sideByPosition = {
13
+ top: 'bottom',
14
+ bottom: 'top',
15
+ left: 'right',
16
+ right: 'left',
17
+ };
18
+ return sideByPosition[position];
19
+ }
20
+ function hasHelpContent(helpContent) {
21
+ return helpContent !== null && helpContent !== undefined && helpContent !== false && helpContent !== '';
22
+ }
23
+ function Actions({ align = 'start', children, className, helpClassName, helpContent, helpLabel = 'Ajuda da tela', position = 'top', size = 'md', }) {
7
24
  const positionClasses = {
8
25
  top: 'w-full max-w-full self-stretch border-b border-app-border bg-background-secondary p-1',
9
26
  bottom: 'w-full border-t border-app-border bg-background-secondary p-1',
@@ -14,6 +31,13 @@ function Actions({ align = 'start', children, className, position = 'top', size
14
31
  start: position === 'left' || position === 'right' ? 'justify-start' : 'justify-start',
15
32
  end: position === 'left' || position === 'right' ? 'justify-end' : 'ml-auto justify-end self-end',
16
33
  };
34
+ const helpVisible = hasHelpContent(helpContent);
35
+ if (helpVisible) {
36
+ const isVertical = position === 'left' || position === 'right';
37
+ const actions = (_jsx(ActionGroupPrimitive, { align: align, size: size, className: cn('min-w-0', isVertical ? 'w-full flex-col items-stretch' : 'min-w-0 flex-1 overflow-x-auto overflow-y-hidden', alignClasses[align]), children: children }));
38
+ const helpButton = (_jsx("div", { className: cn('flex shrink-0', isVertical && 'mt-auto w-full justify-center pt-2', !isVertical && align === 'start' && 'ml-auto pl-2', !isVertical && align === 'end' && 'mr-auto pr-2'), children: _jsx(Tooltip, { className: cn('max-w-[22rem] px-3 py-2', helpClassName), content: helpContent, delayDuration: 120, openOnClick: true, side: getHelpSide(position), children: _jsx(ActionButtonPrimitive, { "aria-label": helpLabel, icon: _jsx(CircleHelpIcon, { "aria-hidden": "true" }), tooltip: helpLabel }) }) }));
39
+ return (_jsxs("div", { className: cn('flex min-w-0', positionClasses[position], isVertical ? 'flex-col' : 'items-center', className), children: [align === 'end' && !isVertical ? helpButton : null, actions, align === 'start' || isVertical ? helpButton : null] }));
40
+ }
17
41
  return (_jsx(ActionGroupPrimitive, { align: align, size: size, className: cn('min-w-0', positionClasses[position], alignClasses[align], className), children: children }));
18
42
  }
19
43
  function ActionsSeparator(props) {
@@ -74,6 +98,7 @@ export const Page = {
74
98
  Title,
75
99
  Description,
76
100
  Actions,
101
+ ActionsHelpContent,
77
102
  ActionButton,
78
103
  ActionsSeparator,
79
104
  ActionsProvider,
@@ -5,8 +5,9 @@ export interface TooltipProps {
5
5
  className?: string;
6
6
  content: ReactNode;
7
7
  delayDuration?: number;
8
+ openOnClick?: boolean;
8
9
  side?: TooltipSide;
9
10
  sideOffset?: number;
10
11
  }
11
- export declare function Tooltip({ children, className, content, delayDuration, side, sideOffset, }: TooltipProps): React.JSX.Element;
12
+ export declare function Tooltip({ children, className, content, delayDuration, openOnClick, side, sideOffset, }: TooltipProps): React.JSX.Element;
12
13
  //# sourceMappingURL=Tooltip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK9C,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,aAAmB,EACnB,IAAe,EACf,UAAc,GACf,EAAE,YAAY,qBAsBd"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK3E,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,aAAmB,EACnB,WAAmB,EACnB,IAAe,EACf,UAAc,GACf,EAAE,YAAY,qBA+Dd"}
@@ -1,6 +1,40 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
2
3
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
3
4
  import { cn } from '../utils/cn';
4
- export function Tooltip({ children, className, content, delayDuration = 300, side = 'bottom', sideOffset = 6, }) {
5
- return (_jsx(TooltipPrimitive.Provider, { delayDuration: delayDuration, children: _jsxs(TooltipPrimitive.Root, { children: [_jsx(TooltipPrimitive.Trigger, { asChild: true, children: children }), _jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { className: cn('border-app-border bg-surface text-foreground z-50 rounded-md border px-3 py-1.5 text-xs shadow-lg', 'data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0', className), side: side, sideOffset: sideOffset, children: [content, _jsx(TooltipPrimitive.Arrow, { className: "fill-surface" })] }) })] }) }));
5
+ export function Tooltip({ children, className, content, delayDuration = 300, openOnClick = false, side = 'bottom', sideOffset = 6, }) {
6
+ const [open, setOpen] = useState(false);
7
+ const triggerRef = useRef(null);
8
+ const contentRef = useRef(null);
9
+ useEffect(() => {
10
+ if (!openOnClick || !open)
11
+ return undefined;
12
+ function handlePointerDown(event) {
13
+ const target = event.target;
14
+ if (!target)
15
+ return;
16
+ if (triggerRef.current?.contains(target) || contentRef.current?.contains(target))
17
+ return;
18
+ setOpen(false);
19
+ }
20
+ function handleKeyDown(event) {
21
+ if (event.key === 'Escape')
22
+ setOpen(false);
23
+ }
24
+ document.addEventListener('pointerdown', handlePointerDown);
25
+ document.addEventListener('keydown', handleKeyDown);
26
+ return () => {
27
+ document.removeEventListener('pointerdown', handlePointerDown);
28
+ document.removeEventListener('keydown', handleKeyDown);
29
+ };
30
+ }, [open, openOnClick]);
31
+ function handleOpenChange(nextOpen) {
32
+ setOpen(nextOpen);
33
+ }
34
+ function handleTriggerClick() {
35
+ if (!openOnClick)
36
+ return;
37
+ setOpen((current) => !current);
38
+ }
39
+ return (_jsx(TooltipPrimitive.Provider, { delayDuration: delayDuration, children: _jsxs(TooltipPrimitive.Root, { open: openOnClick ? open : undefined, onOpenChange: openOnClick ? handleOpenChange : undefined, children: [_jsx(TooltipPrimitive.Trigger, { asChild: true, ref: triggerRef, onClick: handleTriggerClick, children: children }), _jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { ref: contentRef, className: cn('border-app-border bg-surface text-foreground z-50 rounded-md border px-3 py-1.5 text-xs shadow-lg', 'data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0', className), side: side, sideOffset: sideOffset, children: [content, _jsx(TooltipPrimitive.Arrow, { className: "fill-surface" })] }) })] }) }));
6
40
  }
package/dist/index.d.ts CHANGED
@@ -23,7 +23,7 @@ export { TextareaField, type TextareaFieldProps } from './components/TextareaFie
23
23
  export { DateField, type DateFieldProps } from './components/DateField';
24
24
  export { DecimalField, type DecimalFieldProps } from './components/DecimalField';
25
25
  export { Pagination, type PaginationProps, type PaginationSize } from './components/Pagination';
26
- export { Page, type PageActionButtonProps, type PageActionsAlign, type PageActionsElement, type PageActionsPosition, type PageActionsProps, type PageActionsSeparatorProps, type PageActionsSize, type PageDescriptionProps, type PageTitleProps, } from './components/Page';
26
+ export { Page, type PageActionButtonProps, type PageActionsAlign, type PageActionsElement, type PageActionsHelpContentProps, type PageActionsPosition, type PageActionsProps, type PageActionsSeparatorProps, type PageActionsSize, type PageDescriptionProps, type PageTitleProps, } from './components/Page';
27
27
  export { PageMessage, type PageMessageProps, type PageMessageVariant } from './components/PageMessage';
28
28
  export { PasswordInput, type PasswordInputProps } from './components/PasswordInput';
29
29
  export { Filter, type FilterFooterProps, type FilterRootProps } from './components/Filter';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EACL,QAAQ,EACR,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,GACnC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EACL,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,GACpC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnK,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACrH,OAAO,EAAE,SAAS,EAAE,KAAK,qBAAqB,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC3H,OAAO,EAAE,UAAU,EAAE,KAAK,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,UAAU,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC1G,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,EACL,IAAI,EACJ,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC/G,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EACL,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,GAC3B,MAAM,uCAAuC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EACL,IAAI,EACJ,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9G,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -990,6 +990,9 @@ h2.react-datepicker__current-month {
990
990
  .mt-3 {
991
991
  margin-top: calc(var(--spacing) * 3);
992
992
  }
993
+ .mt-auto {
994
+ margin-top: auto;
995
+ }
993
996
  .mt-px {
994
997
  margin-top: 1px;
995
998
  }
@@ -1147,6 +1150,9 @@ h2.react-datepicker__current-month {
1147
1150
  .h-72 {
1148
1151
  height: calc(var(--spacing) * 72);
1149
1152
  }
1153
+ .h-80 {
1154
+ height: calc(var(--spacing) * 80);
1155
+ }
1150
1156
  .h-96 {
1151
1157
  height: calc(var(--spacing) * 96);
1152
1158
  }
@@ -1336,6 +1342,9 @@ h2.react-datepicker__current-month {
1336
1342
  .max-w-40 {
1337
1343
  max-width: calc(var(--spacing) * 40);
1338
1344
  }
1345
+ .max-w-\[22rem\] {
1346
+ max-width: 22rem;
1347
+ }
1339
1348
  .max-w-\[120px\] {
1340
1349
  max-width: 120px;
1341
1350
  }
@@ -1460,6 +1469,9 @@ h2.react-datepicker__current-month {
1460
1469
  .cursor-wait {
1461
1470
  cursor: wait;
1462
1471
  }
1472
+ .list-disc {
1473
+ list-style-type: disc;
1474
+ }
1463
1475
  .appearance-none {
1464
1476
  appearance: none;
1465
1477
  }
@@ -2017,6 +2029,9 @@ h2.react-datepicker__current-month {
2017
2029
  .pr-1 {
2018
2030
  padding-right: calc(var(--spacing) * 1);
2019
2031
  }
2032
+ .pr-2 {
2033
+ padding-right: calc(var(--spacing) * 2);
2034
+ }
2020
2035
  .pr-4 {
2021
2036
  padding-right: calc(var(--spacing) * 4);
2022
2037
  }
@@ -2038,6 +2053,12 @@ h2.react-datepicker__current-month {
2038
2053
  .pb-4 {
2039
2054
  padding-bottom: calc(var(--spacing) * 4);
2040
2055
  }
2056
+ .pl-2 {
2057
+ padding-left: calc(var(--spacing) * 2);
2058
+ }
2059
+ .pl-4 {
2060
+ padding-left: calc(var(--spacing) * 4);
2061
+ }
2041
2062
  .pl-8 {
2042
2063
  padding-left: calc(var(--spacing) * 8);
2043
2064
  }
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@wellingtonhlc/shared-ui",
3
- "version": "0.24.3",
3
+ "version": "0.24.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "shared-ui-check-page-actions": "dist/cli/check-page-actions.js"
10
+ },
8
11
  "files": [
9
12
  "dist",
10
13
  "README.md"
@@ -41,8 +44,8 @@
41
44
  "typecheck": "tsc -p tsconfig.json --noEmit",
42
45
  "test": "vitest run",
43
46
  "test:watch": "vitest",
44
- "check:storybook-static": "node scripts/check-storybook-static.mjs",
45
- "check": "npm run typecheck && npm run test && npm run build && npm run build-storybook && npm run check:storybook-static && npm pack --dry-run",
47
+ "check:storybook-static": "node scripts/check-storybook-static.mjs",
48
+ "check": "npm run typecheck && npm run test && npm run build && npm run build-storybook && npm run check:storybook-static && npm pack --dry-run",
46
49
  "storybook": "storybook dev -p 6006",
47
50
  "build-storybook": "storybook build"
48
51
  },
@@ -58,6 +61,7 @@
58
61
  "@testing-library/jest-dom": "^6.9.1",
59
62
  "@testing-library/react": "^16.3.2",
60
63
  "@testing-library/user-event": "^14.6.1",
64
+ "@types/node": "^26.0.0",
61
65
  "@types/react": "^19.1.2",
62
66
  "@types/react-dom": "^19.1.2",
63
67
  "autoprefixer": "^10.5.0",