@lindle/linoardo 1.0.29 → 1.0.31
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/dist/card.cjs +1 -1
- package/dist/card.cjs.map +1 -1
- package/dist/card.js +1 -1
- package/dist/chip.d.cts +3 -3
- package/dist/chip.d.ts +3 -3
- package/dist/{chunk-MDCLAX6S.js → chunk-GSYVZCP3.js} +3 -3
- package/dist/{chunk-MDCLAX6S.js.map → chunk-GSYVZCP3.js.map} +1 -1
- package/dist/{chunk-LIEBZOLG.js → chunk-NJU7XT54.js} +57 -43
- package/dist/chunk-NJU7XT54.js.map +1 -0
- package/dist/{chunk-DDQ7ICWD.js → chunk-ZTP2JSQ6.js} +12 -9
- package/dist/{chunk-DDQ7ICWD.js.map → chunk-ZTP2JSQ6.js.map} +1 -1
- package/dist/dialog.cjs +55 -41
- package/dist/dialog.cjs.map +1 -1
- package/dist/dialog.d.cts +3 -0
- package/dist/dialog.d.ts +3 -0
- package/dist/dialog.js +1 -1
- package/dist/index.cjs +66 -49
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/menu.cjs +10 -7
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.js +1 -1
- package/dist/styles.css +12 -0
- package/package.json +1 -1
- package/dist/chunk-LIEBZOLG.js.map +0 -1
package/dist/card.cjs
CHANGED
|
@@ -39,7 +39,7 @@ var CardRoot = react.forwardRef(function Card({
|
|
|
39
39
|
const variantClass = variantClasses[variant] ?? variantClasses.solid;
|
|
40
40
|
const paddingClass = paddingClasses[padding] ?? paddingClasses.md;
|
|
41
41
|
const overflowClass = overflowClasses[overflow] ?? overflowClasses.hidden;
|
|
42
|
-
const interactiveClass = interactive ? "transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900" : void 0;
|
|
42
|
+
const interactiveClass = interactive ? "transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl hover:z-10 focus-within:z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900" : void 0;
|
|
43
43
|
const tabIndexValue = interactive && rest.tabIndex === void 0 ? 0 : rest.tabIndex;
|
|
44
44
|
const content = applyDividers(children, dividers);
|
|
45
45
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
package/dist/card.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Blocks/Card/index.tsx"],"names":["forwardRef","jsx","twMerge","Card","Children","isValidElement","cloneElement"],"mappings":"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","file":"card.cjs","sourcesContent":["import { Children, cloneElement, forwardRef, isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\nimport type { GlobalVariant } from '@lindle/linoardo/global.types';\nimport { twMerge } from 'tailwind-merge';\nimport type {\n CardMediaProps,\n CardOverflow,\n CardProps,\n CardSectionProps,\n CardTextProps\n} from './types.card';\n\nconst paddingClasses: Record<Exclude<CardProps['padding'], undefined>, string> = {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6'\n};\n\nconst overflowClasses: Record<Exclude<CardProps['overflow'], undefined>, string> = {\n hidden: 'overflow-hidden',\n visible: 'overflow-visible'\n};\n\nconst cardBase =\n 'card-base relative w-full bg-white text-gray-900 transition-colors dark:bg-slate-900 dark:text-slate-100';\n\nconst variantClasses: Record<GlobalVariant, string> = {\n solid:\n 'rounded-2xl border border-gray-200 bg-white shadow-lg shadow-gray-200/55 dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/30',\n outline:\n 'rounded-2xl border-2 border-black bg-white shadow-none dark:border-black dark:bg-slate-900',\n text: 'rounded-2xl border border-transparent bg-transparent shadow-none dark:border-transparent dark:bg-transparent',\n ghost:\n 'rounded-2xl border border-transparent bg-gray-50 shadow-none dark:border-transparent dark:bg-slate-800',\n filled:\n 'rounded-2xl border border-gray-200 bg-gray-50 shadow-sm dark:border-slate-800 dark:bg-slate-800 dark:shadow-black/20',\n underlined:\n 'rounded-2xl border border-transparent border-b border-b-gray-200 shadow-none dark:border-transparent dark:border-b-slate-700 dark:bg-transparent',\n rounded:\n 'rounded-3xl border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25',\n sharp:\n 'rounded-none border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25'\n};\n\n/**\n * Card container with optional padding, variants and interactive focus/hover styles.\n */\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n className,\n children,\n variant = 'solid',\n padding = 'md',\n overflow = 'hidden',\n interactive = false,\n dividers = true,\n ...rest\n },\n ref\n) {\n const variantClass = variantClasses[variant as GlobalVariant] ?? variantClasses.solid;\n const paddingClass = paddingClasses[padding] ?? paddingClasses.md;\n const overflowClass = overflowClasses[overflow] ?? overflowClasses.hidden;\n const interactiveClass = interactive\n ? 'transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900'\n : undefined;\n const tabIndexValue = interactive && rest.tabIndex === undefined ? 0 : rest.tabIndex;\n const content = applyDividers(children, dividers);\n\n return (\n <div\n {...rest}\n ref={ref}\n tabIndex={tabIndexValue}\n className={twMerge(\n cardBase,\n variantClass,\n paddingClass,\n overflowClass,\n interactiveClass,\n className\n )}\n >\n {content}\n </div>\n );\n});\n\n/**\n * Section for placing the card title, subtitle or actions at the top of the card.\n */\nconst CardHeader: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-header mb-2 flex flex-col gap-1 pb-3',\n dividers ? 'border-b border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Primary content area of the card.\n */\nconst CardBody: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-body flex flex-col gap-3', className)} />\n);\n\n/**\n * Footer area for actions or supplemental information.\n */\nconst CardFooter: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-footer mt-3 flex flex-wrap items-center gap-3 pt-3',\n dividers ? 'border-t border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Stylized heading for the card.\n */\nconst CardTitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <h3\n {...rest}\n className={twMerge(\n 'card-title text-lg font-semibold text-gray-900 dark:text-slate-50',\n className\n )}\n />\n);\n\n/**\n * Subtitle text for secondary information under the title.\n */\nconst CardSubtitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge(\n 'card-subtitle text-sm font-medium text-gray-600 dark:text-slate-300',\n className\n )}\n />\n);\n\n/**\n * Body text with default card typography.\n */\nconst CardText: React.FC<CardTextProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge('card-text text-sm text-gray-700 dark:text-slate-200', className)}\n />\n);\n\n/**\n * Media region for images, retaining card spacing and optional rounded corners.\n */\nconst CardMedia: React.FC<CardMediaProps> = ({ className, rounded = false, ...rest }) => (\n <img\n {...rest}\n className={twMerge(\n 'card-media w-full object-cover',\n rounded ? 'rounded-xl' : 'rounded-none',\n rest.height || rest.style ? 'block' : 'block max-h-60',\n className\n )}\n loading={rest.loading ?? 'lazy'}\n />\n);\n\n/**\n * Container for action buttons inside the card.\n */\nconst CardActions: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-actions flex flex-wrap gap-2', className)} />\n);\n\nexport type { CardOverflow, CardProps, CardSectionProps, CardMediaProps, CardTextProps };\n\nconst Card = Object.assign(CardRoot, {\n Header: CardHeader,\n Body: CardBody,\n Footer: CardFooter,\n Title: CardTitle,\n Subtitle: CardSubtitle,\n Text: CardText,\n Media: CardMedia,\n Actions: CardActions\n});\n\nexport default Card;\n\nfunction applyDividers(children: ReactNode, dividers: boolean): ReactNode {\n return Children.map(children, child => {\n if (!isValidElement(child)) return child;\n\n if (isDividerSection(child)) {\n return cloneElement<CardSectionProps>(child, { dividers: child.props.dividers ?? dividers });\n }\n\n if (hasNestedChildren(child)) {\n return cloneElement<{ children?: ReactNode }>(child, {\n children: applyDividers(child.props.children, dividers)\n });\n }\n\n return child;\n });\n}\n\nfunction isDividerSection(element: ReactElement): element is ReactElement<CardSectionProps> {\n return element.type === CardHeader || element.type === CardFooter;\n}\n\nfunction hasNestedChildren(\n element: ReactElement\n): element is ReactElement<{ children?: ReactNode }> {\n const props = element.props as Record<string, unknown>;\n return 'children' in props;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Blocks/Card/index.tsx"],"names":["forwardRef","jsx","twMerge","Card","Children","isValidElement","cloneElement"],"mappings":"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","file":"card.cjs","sourcesContent":["import { Children, cloneElement, forwardRef, isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\nimport type { GlobalVariant } from '@lindle/linoardo/global.types';\nimport { twMerge } from 'tailwind-merge';\nimport type {\n CardMediaProps,\n CardOverflow,\n CardProps,\n CardSectionProps,\n CardTextProps\n} from './types.card';\n\nconst paddingClasses: Record<Exclude<CardProps['padding'], undefined>, string> = {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6'\n};\n\nconst overflowClasses: Record<Exclude<CardProps['overflow'], undefined>, string> = {\n hidden: 'overflow-hidden',\n visible: 'overflow-visible'\n};\n\nconst cardBase =\n 'card-base relative w-full bg-white text-gray-900 transition-colors dark:bg-slate-900 dark:text-slate-100';\n\nconst variantClasses: Record<GlobalVariant, string> = {\n solid:\n 'rounded-2xl border border-gray-200 bg-white shadow-lg shadow-gray-200/55 dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/30',\n outline:\n 'rounded-2xl border-2 border-black bg-white shadow-none dark:border-black dark:bg-slate-900',\n text: 'rounded-2xl border border-transparent bg-transparent shadow-none dark:border-transparent dark:bg-transparent',\n ghost:\n 'rounded-2xl border border-transparent bg-gray-50 shadow-none dark:border-transparent dark:bg-slate-800',\n filled:\n 'rounded-2xl border border-gray-200 bg-gray-50 shadow-sm dark:border-slate-800 dark:bg-slate-800 dark:shadow-black/20',\n underlined:\n 'rounded-2xl border border-transparent border-b border-b-gray-200 shadow-none dark:border-transparent dark:border-b-slate-700 dark:bg-transparent',\n rounded:\n 'rounded-3xl border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25',\n sharp:\n 'rounded-none border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25'\n};\n\n/**\n * Card container with optional padding, variants and interactive focus/hover styles.\n */\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n className,\n children,\n variant = 'solid',\n padding = 'md',\n overflow = 'hidden',\n interactive = false,\n dividers = true,\n ...rest\n },\n ref\n) {\n const variantClass = variantClasses[variant as GlobalVariant] ?? variantClasses.solid;\n const paddingClass = paddingClasses[padding] ?? paddingClasses.md;\n const overflowClass = overflowClasses[overflow] ?? overflowClasses.hidden;\n const interactiveClass = interactive\n ? 'transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl hover:z-10 focus-within:z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900'\n : undefined;\n const tabIndexValue = interactive && rest.tabIndex === undefined ? 0 : rest.tabIndex;\n const content = applyDividers(children, dividers);\n\n return (\n <div\n {...rest}\n ref={ref}\n tabIndex={tabIndexValue}\n className={twMerge(\n cardBase,\n variantClass,\n paddingClass,\n overflowClass,\n interactiveClass,\n className\n )}\n >\n {content}\n </div>\n );\n});\n\n/**\n * Section for placing the card title, subtitle or actions at the top of the card.\n */\nconst CardHeader: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-header mb-2 flex flex-col gap-1 pb-3',\n dividers ? 'border-b border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Primary content area of the card.\n */\nconst CardBody: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-body flex flex-col gap-3', className)} />\n);\n\n/**\n * Footer area for actions or supplemental information.\n */\nconst CardFooter: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-footer mt-3 flex flex-wrap items-center gap-3 pt-3',\n dividers ? 'border-t border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Stylized heading for the card.\n */\nconst CardTitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <h3\n {...rest}\n className={twMerge(\n 'card-title text-lg font-semibold text-gray-900 dark:text-slate-50',\n className\n )}\n />\n);\n\n/**\n * Subtitle text for secondary information under the title.\n */\nconst CardSubtitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge(\n 'card-subtitle text-sm font-medium text-gray-600 dark:text-slate-300',\n className\n )}\n />\n);\n\n/**\n * Body text with default card typography.\n */\nconst CardText: React.FC<CardTextProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge('card-text text-sm text-gray-700 dark:text-slate-200', className)}\n />\n);\n\n/**\n * Media region for images, retaining card spacing and optional rounded corners.\n */\nconst CardMedia: React.FC<CardMediaProps> = ({ className, rounded = false, ...rest }) => (\n <img\n {...rest}\n className={twMerge(\n 'card-media w-full object-cover',\n rounded ? 'rounded-xl' : 'rounded-none',\n rest.height || rest.style ? 'block' : 'block max-h-60',\n className\n )}\n loading={rest.loading ?? 'lazy'}\n />\n);\n\n/**\n * Container for action buttons inside the card.\n */\nconst CardActions: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-actions flex flex-wrap gap-2', className)} />\n);\n\nexport type { CardOverflow, CardProps, CardSectionProps, CardMediaProps, CardTextProps };\n\nconst Card = Object.assign(CardRoot, {\n Header: CardHeader,\n Body: CardBody,\n Footer: CardFooter,\n Title: CardTitle,\n Subtitle: CardSubtitle,\n Text: CardText,\n Media: CardMedia,\n Actions: CardActions\n});\n\nexport default Card;\n\nfunction applyDividers(children: ReactNode, dividers: boolean): ReactNode {\n return Children.map(children, child => {\n if (!isValidElement(child)) return child;\n\n if (isDividerSection(child)) {\n return cloneElement<CardSectionProps>(child, { dividers: child.props.dividers ?? dividers });\n }\n\n if (hasNestedChildren(child)) {\n return cloneElement<{ children?: ReactNode }>(child, {\n children: applyDividers(child.props.children, dividers)\n });\n }\n\n return child;\n });\n}\n\nfunction isDividerSection(element: ReactElement): element is ReactElement<CardSectionProps> {\n return element.type === CardHeader || element.type === CardFooter;\n}\n\nfunction hasNestedChildren(\n element: ReactElement\n): element is ReactElement<{ children?: ReactNode }> {\n const props = element.props as Record<string, unknown>;\n return 'children' in props;\n}\n"]}
|
package/dist/card.js
CHANGED
package/dist/chip.d.cts
CHANGED
|
@@ -76,6 +76,9 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
76
76
|
slot?: string | undefined | undefined;
|
|
77
77
|
style?: react.CSSProperties | undefined;
|
|
78
78
|
title?: string | undefined | undefined;
|
|
79
|
+
className?: string | undefined | undefined;
|
|
80
|
+
children?: react.ReactNode;
|
|
81
|
+
onClick?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
79
82
|
defaultChecked?: boolean | undefined | undefined;
|
|
80
83
|
defaultValue?: string | number | readonly string[] | undefined;
|
|
81
84
|
suppressContentEditableWarning?: boolean | undefined | undefined;
|
|
@@ -83,7 +86,6 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
83
86
|
accessKey?: string | undefined | undefined;
|
|
84
87
|
autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
|
|
85
88
|
autoFocus?: boolean | undefined | undefined;
|
|
86
|
-
className?: string | undefined | undefined;
|
|
87
89
|
contentEditable?: "inherit" | (boolean | "true" | "false") | "plaintext-only" | undefined;
|
|
88
90
|
contextMenu?: string | undefined | undefined;
|
|
89
91
|
dir?: string | undefined | undefined;
|
|
@@ -180,7 +182,6 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
180
182
|
"aria-valuemin"?: number | undefined | undefined;
|
|
181
183
|
"aria-valuenow"?: number | undefined | undefined;
|
|
182
184
|
"aria-valuetext"?: string | undefined | undefined;
|
|
183
|
-
children?: react.ReactNode;
|
|
184
185
|
dangerouslySetInnerHTML?: {
|
|
185
186
|
__html: string | TrustedHTML;
|
|
186
187
|
} | undefined | undefined;
|
|
@@ -268,7 +269,6 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
268
269
|
onWaitingCapture?: react.ReactEventHandler<HTMLSpanElement> | undefined;
|
|
269
270
|
onAuxClick?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
270
271
|
onAuxClickCapture?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
271
|
-
onClick?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
272
272
|
onClickCapture?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
273
273
|
onContextMenu?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
274
274
|
onContextMenuCapture?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
package/dist/chip.d.ts
CHANGED
|
@@ -76,6 +76,9 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
76
76
|
slot?: string | undefined | undefined;
|
|
77
77
|
style?: react.CSSProperties | undefined;
|
|
78
78
|
title?: string | undefined | undefined;
|
|
79
|
+
className?: string | undefined | undefined;
|
|
80
|
+
children?: react.ReactNode;
|
|
81
|
+
onClick?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
79
82
|
defaultChecked?: boolean | undefined | undefined;
|
|
80
83
|
defaultValue?: string | number | readonly string[] | undefined;
|
|
81
84
|
suppressContentEditableWarning?: boolean | undefined | undefined;
|
|
@@ -83,7 +86,6 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
83
86
|
accessKey?: string | undefined | undefined;
|
|
84
87
|
autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
|
|
85
88
|
autoFocus?: boolean | undefined | undefined;
|
|
86
|
-
className?: string | undefined | undefined;
|
|
87
89
|
contentEditable?: "inherit" | (boolean | "true" | "false") | "plaintext-only" | undefined;
|
|
88
90
|
contextMenu?: string | undefined | undefined;
|
|
89
91
|
dir?: string | undefined | undefined;
|
|
@@ -180,7 +182,6 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
180
182
|
"aria-valuemin"?: number | undefined | undefined;
|
|
181
183
|
"aria-valuenow"?: number | undefined | undefined;
|
|
182
184
|
"aria-valuetext"?: string | undefined | undefined;
|
|
183
|
-
children?: react.ReactNode;
|
|
184
185
|
dangerouslySetInnerHTML?: {
|
|
185
186
|
__html: string | TrustedHTML;
|
|
186
187
|
} | undefined | undefined;
|
|
@@ -268,7 +269,6 @@ declare const Chip: react.ForwardRefExoticComponent<{
|
|
|
268
269
|
onWaitingCapture?: react.ReactEventHandler<HTMLSpanElement> | undefined;
|
|
269
270
|
onAuxClick?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
270
271
|
onAuxClickCapture?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
271
|
-
onClick?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
272
272
|
onClickCapture?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
273
273
|
onContextMenu?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
274
274
|
onContextMenuCapture?: react.MouseEventHandler<HTMLSpanElement> | undefined;
|
|
@@ -37,7 +37,7 @@ var CardRoot = forwardRef(function Card({
|
|
|
37
37
|
const variantClass = variantClasses[variant] ?? variantClasses.solid;
|
|
38
38
|
const paddingClass = paddingClasses[padding] ?? paddingClasses.md;
|
|
39
39
|
const overflowClass = overflowClasses[overflow] ?? overflowClasses.hidden;
|
|
40
|
-
const interactiveClass = interactive ? "transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900" : void 0;
|
|
40
|
+
const interactiveClass = interactive ? "transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl hover:z-10 focus-within:z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900" : void 0;
|
|
41
41
|
const tabIndexValue = interactive && rest.tabIndex === void 0 ? 0 : rest.tabIndex;
|
|
42
42
|
const content = applyDividers(children, dividers);
|
|
43
43
|
return /* @__PURE__ */ jsx(
|
|
@@ -156,5 +156,5 @@ function hasNestedChildren(element) {
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
export { Card_default };
|
|
159
|
-
//# sourceMappingURL=chunk-
|
|
160
|
-
//# sourceMappingURL=chunk-
|
|
159
|
+
//# sourceMappingURL=chunk-GSYVZCP3.js.map
|
|
160
|
+
//# sourceMappingURL=chunk-GSYVZCP3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Blocks/Card/index.tsx"],"names":["Card"],"mappings":"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","file":"chunk-MDCLAX6S.js","sourcesContent":["import { Children, cloneElement, forwardRef, isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\nimport type { GlobalVariant } from '@lindle/linoardo/global.types';\nimport { twMerge } from 'tailwind-merge';\nimport type {\n CardMediaProps,\n CardOverflow,\n CardProps,\n CardSectionProps,\n CardTextProps\n} from './types.card';\n\nconst paddingClasses: Record<Exclude<CardProps['padding'], undefined>, string> = {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6'\n};\n\nconst overflowClasses: Record<Exclude<CardProps['overflow'], undefined>, string> = {\n hidden: 'overflow-hidden',\n visible: 'overflow-visible'\n};\n\nconst cardBase =\n 'card-base relative w-full bg-white text-gray-900 transition-colors dark:bg-slate-900 dark:text-slate-100';\n\nconst variantClasses: Record<GlobalVariant, string> = {\n solid:\n 'rounded-2xl border border-gray-200 bg-white shadow-lg shadow-gray-200/55 dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/30',\n outline:\n 'rounded-2xl border-2 border-black bg-white shadow-none dark:border-black dark:bg-slate-900',\n text: 'rounded-2xl border border-transparent bg-transparent shadow-none dark:border-transparent dark:bg-transparent',\n ghost:\n 'rounded-2xl border border-transparent bg-gray-50 shadow-none dark:border-transparent dark:bg-slate-800',\n filled:\n 'rounded-2xl border border-gray-200 bg-gray-50 shadow-sm dark:border-slate-800 dark:bg-slate-800 dark:shadow-black/20',\n underlined:\n 'rounded-2xl border border-transparent border-b border-b-gray-200 shadow-none dark:border-transparent dark:border-b-slate-700 dark:bg-transparent',\n rounded:\n 'rounded-3xl border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25',\n sharp:\n 'rounded-none border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25'\n};\n\n/**\n * Card container with optional padding, variants and interactive focus/hover styles.\n */\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n className,\n children,\n variant = 'solid',\n padding = 'md',\n overflow = 'hidden',\n interactive = false,\n dividers = true,\n ...rest\n },\n ref\n) {\n const variantClass = variantClasses[variant as GlobalVariant] ?? variantClasses.solid;\n const paddingClass = paddingClasses[padding] ?? paddingClasses.md;\n const overflowClass = overflowClasses[overflow] ?? overflowClasses.hidden;\n const interactiveClass = interactive\n ? 'transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900'\n : undefined;\n const tabIndexValue = interactive && rest.tabIndex === undefined ? 0 : rest.tabIndex;\n const content = applyDividers(children, dividers);\n\n return (\n <div\n {...rest}\n ref={ref}\n tabIndex={tabIndexValue}\n className={twMerge(\n cardBase,\n variantClass,\n paddingClass,\n overflowClass,\n interactiveClass,\n className\n )}\n >\n {content}\n </div>\n );\n});\n\n/**\n * Section for placing the card title, subtitle or actions at the top of the card.\n */\nconst CardHeader: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-header mb-2 flex flex-col gap-1 pb-3',\n dividers ? 'border-b border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Primary content area of the card.\n */\nconst CardBody: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-body flex flex-col gap-3', className)} />\n);\n\n/**\n * Footer area for actions or supplemental information.\n */\nconst CardFooter: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-footer mt-3 flex flex-wrap items-center gap-3 pt-3',\n dividers ? 'border-t border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Stylized heading for the card.\n */\nconst CardTitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <h3\n {...rest}\n className={twMerge(\n 'card-title text-lg font-semibold text-gray-900 dark:text-slate-50',\n className\n )}\n />\n);\n\n/**\n * Subtitle text for secondary information under the title.\n */\nconst CardSubtitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge(\n 'card-subtitle text-sm font-medium text-gray-600 dark:text-slate-300',\n className\n )}\n />\n);\n\n/**\n * Body text with default card typography.\n */\nconst CardText: React.FC<CardTextProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge('card-text text-sm text-gray-700 dark:text-slate-200', className)}\n />\n);\n\n/**\n * Media region for images, retaining card spacing and optional rounded corners.\n */\nconst CardMedia: React.FC<CardMediaProps> = ({ className, rounded = false, ...rest }) => (\n <img\n {...rest}\n className={twMerge(\n 'card-media w-full object-cover',\n rounded ? 'rounded-xl' : 'rounded-none',\n rest.height || rest.style ? 'block' : 'block max-h-60',\n className\n )}\n loading={rest.loading ?? 'lazy'}\n />\n);\n\n/**\n * Container for action buttons inside the card.\n */\nconst CardActions: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-actions flex flex-wrap gap-2', className)} />\n);\n\nexport type { CardOverflow, CardProps, CardSectionProps, CardMediaProps, CardTextProps };\n\nconst Card = Object.assign(CardRoot, {\n Header: CardHeader,\n Body: CardBody,\n Footer: CardFooter,\n Title: CardTitle,\n Subtitle: CardSubtitle,\n Text: CardText,\n Media: CardMedia,\n Actions: CardActions\n});\n\nexport default Card;\n\nfunction applyDividers(children: ReactNode, dividers: boolean): ReactNode {\n return Children.map(children, child => {\n if (!isValidElement(child)) return child;\n\n if (isDividerSection(child)) {\n return cloneElement<CardSectionProps>(child, { dividers: child.props.dividers ?? dividers });\n }\n\n if (hasNestedChildren(child)) {\n return cloneElement<{ children?: ReactNode }>(child, {\n children: applyDividers(child.props.children, dividers)\n });\n }\n\n return child;\n });\n}\n\nfunction isDividerSection(element: ReactElement): element is ReactElement<CardSectionProps> {\n return element.type === CardHeader || element.type === CardFooter;\n}\n\nfunction hasNestedChildren(\n element: ReactElement\n): element is ReactElement<{ children?: ReactNode }> {\n const props = element.props as Record<string, unknown>;\n return 'children' in props;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Blocks/Card/index.tsx"],"names":["Card"],"mappings":"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","file":"chunk-GSYVZCP3.js","sourcesContent":["import { Children, cloneElement, forwardRef, isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\nimport type { GlobalVariant } from '@lindle/linoardo/global.types';\nimport { twMerge } from 'tailwind-merge';\nimport type {\n CardMediaProps,\n CardOverflow,\n CardProps,\n CardSectionProps,\n CardTextProps\n} from './types.card';\n\nconst paddingClasses: Record<Exclude<CardProps['padding'], undefined>, string> = {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6'\n};\n\nconst overflowClasses: Record<Exclude<CardProps['overflow'], undefined>, string> = {\n hidden: 'overflow-hidden',\n visible: 'overflow-visible'\n};\n\nconst cardBase =\n 'card-base relative w-full bg-white text-gray-900 transition-colors dark:bg-slate-900 dark:text-slate-100';\n\nconst variantClasses: Record<GlobalVariant, string> = {\n solid:\n 'rounded-2xl border border-gray-200 bg-white shadow-lg shadow-gray-200/55 dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/30',\n outline:\n 'rounded-2xl border-2 border-black bg-white shadow-none dark:border-black dark:bg-slate-900',\n text: 'rounded-2xl border border-transparent bg-transparent shadow-none dark:border-transparent dark:bg-transparent',\n ghost:\n 'rounded-2xl border border-transparent bg-gray-50 shadow-none dark:border-transparent dark:bg-slate-800',\n filled:\n 'rounded-2xl border border-gray-200 bg-gray-50 shadow-sm dark:border-slate-800 dark:bg-slate-800 dark:shadow-black/20',\n underlined:\n 'rounded-2xl border border-transparent border-b border-b-gray-200 shadow-none dark:border-transparent dark:border-b-slate-700 dark:bg-transparent',\n rounded:\n 'rounded-3xl border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25',\n sharp:\n 'rounded-none border border-gray-200 bg-white shadow-md dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/25'\n};\n\n/**\n * Card container with optional padding, variants and interactive focus/hover styles.\n */\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n className,\n children,\n variant = 'solid',\n padding = 'md',\n overflow = 'hidden',\n interactive = false,\n dividers = true,\n ...rest\n },\n ref\n) {\n const variantClass = variantClasses[variant as GlobalVariant] ?? variantClasses.solid;\n const paddingClass = paddingClasses[padding] ?? paddingClasses.md;\n const overflowClass = overflowClasses[overflow] ?? overflowClasses.hidden;\n const interactiveClass = interactive\n ? 'transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl hover:z-10 focus-within:z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-slate-900'\n : undefined;\n const tabIndexValue = interactive && rest.tabIndex === undefined ? 0 : rest.tabIndex;\n const content = applyDividers(children, dividers);\n\n return (\n <div\n {...rest}\n ref={ref}\n tabIndex={tabIndexValue}\n className={twMerge(\n cardBase,\n variantClass,\n paddingClass,\n overflowClass,\n interactiveClass,\n className\n )}\n >\n {content}\n </div>\n );\n});\n\n/**\n * Section for placing the card title, subtitle or actions at the top of the card.\n */\nconst CardHeader: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-header mb-2 flex flex-col gap-1 pb-3',\n dividers ? 'border-b border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Primary content area of the card.\n */\nconst CardBody: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-body flex flex-col gap-3', className)} />\n);\n\n/**\n * Footer area for actions or supplemental information.\n */\nconst CardFooter: React.FC<CardSectionProps> = ({ className, dividers = true, ...rest }) => (\n <div\n {...rest}\n className={twMerge(\n 'card-footer mt-3 flex flex-wrap items-center gap-3 pt-3',\n dividers ? 'border-t border-gray-100 dark:border-slate-800' : undefined,\n className\n )}\n />\n);\n\n/**\n * Stylized heading for the card.\n */\nconst CardTitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <h3\n {...rest}\n className={twMerge(\n 'card-title text-lg font-semibold text-gray-900 dark:text-slate-50',\n className\n )}\n />\n);\n\n/**\n * Subtitle text for secondary information under the title.\n */\nconst CardSubtitle: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge(\n 'card-subtitle text-sm font-medium text-gray-600 dark:text-slate-300',\n className\n )}\n />\n);\n\n/**\n * Body text with default card typography.\n */\nconst CardText: React.FC<CardTextProps> = ({ className, ...rest }) => (\n <p\n {...rest}\n className={twMerge('card-text text-sm text-gray-700 dark:text-slate-200', className)}\n />\n);\n\n/**\n * Media region for images, retaining card spacing and optional rounded corners.\n */\nconst CardMedia: React.FC<CardMediaProps> = ({ className, rounded = false, ...rest }) => (\n <img\n {...rest}\n className={twMerge(\n 'card-media w-full object-cover',\n rounded ? 'rounded-xl' : 'rounded-none',\n rest.height || rest.style ? 'block' : 'block max-h-60',\n className\n )}\n loading={rest.loading ?? 'lazy'}\n />\n);\n\n/**\n * Container for action buttons inside the card.\n */\nconst CardActions: React.FC<CardSectionProps> = ({ className, ...rest }) => (\n <div {...rest} className={twMerge('card-actions flex flex-wrap gap-2', className)} />\n);\n\nexport type { CardOverflow, CardProps, CardSectionProps, CardMediaProps, CardTextProps };\n\nconst Card = Object.assign(CardRoot, {\n Header: CardHeader,\n Body: CardBody,\n Footer: CardFooter,\n Title: CardTitle,\n Subtitle: CardSubtitle,\n Text: CardText,\n Media: CardMedia,\n Actions: CardActions\n});\n\nexport default Card;\n\nfunction applyDividers(children: ReactNode, dividers: boolean): ReactNode {\n return Children.map(children, child => {\n if (!isValidElement(child)) return child;\n\n if (isDividerSection(child)) {\n return cloneElement<CardSectionProps>(child, { dividers: child.props.dividers ?? dividers });\n }\n\n if (hasNestedChildren(child)) {\n return cloneElement<{ children?: ReactNode }>(child, {\n children: applyDividers(child.props.children, dividers)\n });\n }\n\n return child;\n });\n}\n\nfunction isDividerSection(element: ReactElement): element is ReactElement<CardSectionProps> {\n return element.type === CardHeader || element.type === CardFooter;\n}\n\nfunction hasNestedChildren(\n element: ReactElement\n): element is ReactElement<{ children?: ReactNode }> {\n const props = element.props as Record<string, unknown>;\n return 'children' in props;\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { createPortal } from 'react-dom';
|
|
2
3
|
import { twMerge } from 'tailwind-merge';
|
|
3
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
5
|
|
|
@@ -23,9 +24,12 @@ var Dialog = React.forwardRef((props, forwardedRef) => {
|
|
|
23
24
|
fullscreen = false,
|
|
24
25
|
maxWidth = "32rem",
|
|
25
26
|
width,
|
|
27
|
+
onClose,
|
|
26
28
|
containerClassName,
|
|
27
29
|
overlayClassName,
|
|
28
30
|
overlayProps,
|
|
31
|
+
portal = true,
|
|
32
|
+
portalContainer,
|
|
29
33
|
className,
|
|
30
34
|
style,
|
|
31
35
|
role: roleProp = "dialog",
|
|
@@ -36,6 +40,7 @@ var Dialog = React.forwardRef((props, forwardedRef) => {
|
|
|
36
40
|
} = props;
|
|
37
41
|
const state = open ? "open" : "closed";
|
|
38
42
|
const shouldRenderDialog = keepMounted || open;
|
|
43
|
+
const resolvedPortalContainer = portalContainer ?? (typeof document !== "undefined" ? document.body : null);
|
|
39
44
|
const resolvedStyle = { ...style };
|
|
40
45
|
if (fullscreen) {
|
|
41
46
|
if (resolvedStyle.maxWidth === void 0) {
|
|
@@ -59,63 +64,72 @@ var Dialog = React.forwardRef((props, forwardedRef) => {
|
|
|
59
64
|
}
|
|
60
65
|
}
|
|
61
66
|
const ariaModal = ariaModalProp ?? (roleProp === "dialog" || roleProp === "alertdialog" ? true : void 0);
|
|
62
|
-
const {
|
|
67
|
+
const {
|
|
68
|
+
className: overlayExtraClassName,
|
|
69
|
+
onClick: overlayOnClick,
|
|
70
|
+
...restOverlayProps
|
|
71
|
+
} = overlayProps ?? {};
|
|
63
72
|
const overlayNode = shouldRenderDialog && scrim ? /* @__PURE__ */ jsx(
|
|
64
73
|
"div",
|
|
65
74
|
{
|
|
66
75
|
...restOverlayProps,
|
|
67
76
|
className: twMerge(overlayBaseClasses, overlayClassName, overlayExtraClassName),
|
|
77
|
+
onClick: (event) => {
|
|
78
|
+
overlayOnClick?.(event);
|
|
79
|
+
if (!event.defaultPrevented) {
|
|
80
|
+
onClose?.();
|
|
81
|
+
}
|
|
82
|
+
},
|
|
68
83
|
"data-state": state,
|
|
69
84
|
"aria-hidden": true
|
|
70
85
|
}
|
|
71
86
|
) : null;
|
|
87
|
+
const dialogNode = shouldRenderDialog ? /* @__PURE__ */ jsxs(
|
|
88
|
+
"div",
|
|
89
|
+
{
|
|
90
|
+
className: twMerge(containerBaseClasses, containerClassName),
|
|
91
|
+
"data-state": state,
|
|
92
|
+
"aria-hidden": !open,
|
|
93
|
+
children: [
|
|
94
|
+
overlayNode,
|
|
95
|
+
/* @__PURE__ */ jsx(
|
|
96
|
+
"div",
|
|
97
|
+
{
|
|
98
|
+
className: twMerge(panelWrapperClasses, fullscreen ? "h-full items-stretch" : "mx-auto"),
|
|
99
|
+
"data-state": state,
|
|
100
|
+
children: /* @__PURE__ */ jsx(
|
|
101
|
+
"div",
|
|
102
|
+
{
|
|
103
|
+
...rest,
|
|
104
|
+
ref: forwardedRef,
|
|
105
|
+
id,
|
|
106
|
+
role: roleProp,
|
|
107
|
+
tabIndex,
|
|
108
|
+
"aria-modal": ariaModal,
|
|
109
|
+
className: twMerge(
|
|
110
|
+
panelBaseClasses,
|
|
111
|
+
fullscreen ? "h-full w-full max-w-none rounded-none" : void 0,
|
|
112
|
+
className
|
|
113
|
+
),
|
|
114
|
+
style: resolvedStyle,
|
|
115
|
+
"data-state": state,
|
|
116
|
+
children
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
) : null;
|
|
124
|
+
const outputNode = portal && resolvedPortalContainer && dialogNode ? createPortal(dialogNode, resolvedPortalContainer) : dialogNode;
|
|
72
125
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
73
126
|
activator ? /* @__PURE__ */ jsx("div", { className: "inline-flex", children: activator }) : null,
|
|
74
|
-
|
|
75
|
-
"div",
|
|
76
|
-
{
|
|
77
|
-
className: twMerge(containerBaseClasses, containerClassName),
|
|
78
|
-
"data-state": state,
|
|
79
|
-
"aria-hidden": !open,
|
|
80
|
-
children: [
|
|
81
|
-
overlayNode,
|
|
82
|
-
/* @__PURE__ */ jsx(
|
|
83
|
-
"div",
|
|
84
|
-
{
|
|
85
|
-
className: twMerge(
|
|
86
|
-
panelWrapperClasses,
|
|
87
|
-
fullscreen ? "h-full items-stretch" : "mx-auto"
|
|
88
|
-
),
|
|
89
|
-
"data-state": state,
|
|
90
|
-
children: /* @__PURE__ */ jsx(
|
|
91
|
-
"div",
|
|
92
|
-
{
|
|
93
|
-
...rest,
|
|
94
|
-
ref: forwardedRef,
|
|
95
|
-
id,
|
|
96
|
-
role: roleProp,
|
|
97
|
-
tabIndex,
|
|
98
|
-
"aria-modal": ariaModal,
|
|
99
|
-
className: twMerge(
|
|
100
|
-
panelBaseClasses,
|
|
101
|
-
fullscreen ? "h-full w-full max-w-none rounded-none" : void 0,
|
|
102
|
-
className
|
|
103
|
-
),
|
|
104
|
-
style: resolvedStyle,
|
|
105
|
-
"data-state": state,
|
|
106
|
-
children
|
|
107
|
-
}
|
|
108
|
-
)
|
|
109
|
-
}
|
|
110
|
-
)
|
|
111
|
-
]
|
|
112
|
-
}
|
|
113
|
-
) : null
|
|
127
|
+
outputNode
|
|
114
128
|
] });
|
|
115
129
|
});
|
|
116
130
|
Dialog.displayName = "Dialog";
|
|
117
131
|
var Dialog_default = Dialog;
|
|
118
132
|
|
|
119
133
|
export { Dialog_default };
|
|
120
|
-
//# sourceMappingURL=chunk-
|
|
121
|
-
//# sourceMappingURL=chunk-
|
|
134
|
+
//# sourceMappingURL=chunk-NJU7XT54.js.map
|
|
135
|
+
//# sourceMappingURL=chunk-NJU7XT54.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Containment/Dialog/index.tsx"],"names":[],"mappings":"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","file":"chunk-NJU7XT54.js","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { twMerge } from 'tailwind-merge';\n\nconst containerBaseClasses =\n 'fixed inset-0 z-[70] flex items-center justify-center p-4 sm:p-8 data-[state=closed]:pointer-events-none';\nconst overlayBaseClasses =\n 'absolute inset-0 bg-gray-900/55 backdrop-blur-[2px] transition-opacity duration-200 data-[state=closed]:opacity-0 data-[state=open]:opacity-100';\nconst panelWrapperClasses =\n 'relative z-10 flex w-full max-h-[95vh] justify-center transition-transform transition-opacity duration-200 data-[state=closed]:translate-y-4 data-[state=closed]:opacity-0 data-[state=open]:translate-y-0 data-[state=open]:opacity-100';\nconst panelBaseClasses =\n 'pointer-events-auto w-full max-h-[90vh] overflow-auto rounded-2xl bg-white p-6 text-gray-900 shadow-2xl shadow-black/20 ring-1 ring-black/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40';\n\nconst resolveSizeValue = (value?: string | number) => {\n if (value === undefined) {\n return undefined;\n }\n return typeof value === 'number' ? `${value}px` : value;\n};\n\nexport interface DialogProps extends React.HTMLAttributes<HTMLDivElement> {\n activator?: React.ReactNode;\n open?: boolean;\n keepMounted?: boolean;\n scrim?: boolean;\n fullscreen?: boolean;\n maxWidth?: string | number;\n width?: string | number;\n onClose?: () => void;\n containerClassName?: string;\n overlayClassName?: string;\n overlayProps?: React.HTMLAttributes<HTMLDivElement>;\n portal?: boolean;\n portalContainer?: Element | null;\n}\n\n/**\n * Layered dialog container supporting scrim, fullscreen mode and controlled open state.\n */\nconst Dialog = React.forwardRef<HTMLDivElement, DialogProps>((props, forwardedRef) => {\n const {\n activator,\n children,\n open = false,\n keepMounted = false,\n scrim = true,\n fullscreen = false,\n maxWidth = '32rem',\n width,\n onClose,\n containerClassName,\n overlayClassName,\n overlayProps,\n portal = true,\n portalContainer,\n className,\n style,\n role: roleProp = 'dialog',\n tabIndex = -1,\n id,\n ['aria-modal']: ariaModalProp,\n ...rest\n } = props;\n\n const state = open ? 'open' : 'closed';\n const shouldRenderDialog = keepMounted || open;\n const resolvedPortalContainer =\n portalContainer ?? (typeof document !== 'undefined' ? document.body : null);\n\n const resolvedStyle: React.CSSProperties = { ...style };\n if (fullscreen) {\n if (resolvedStyle.maxWidth === undefined) {\n resolvedStyle.maxWidth = 'none';\n }\n if (resolvedStyle.width === undefined) {\n resolvedStyle.width = '100%';\n }\n if (resolvedStyle.height === undefined) {\n resolvedStyle.height = '100%';\n }\n if (resolvedStyle.maxHeight === undefined) {\n resolvedStyle.maxHeight = '100%';\n }\n } else {\n if (resolvedStyle.maxWidth === undefined) {\n resolvedStyle.maxWidth = resolveSizeValue(maxWidth);\n }\n if (width !== undefined && resolvedStyle.width === undefined) {\n resolvedStyle.width = resolveSizeValue(width);\n }\n }\n\n const ariaModal =\n ariaModalProp ?? (roleProp === 'dialog' || roleProp === 'alertdialog' ? true : undefined);\n\n const {\n className: overlayExtraClassName,\n onClick: overlayOnClick,\n ...restOverlayProps\n } = overlayProps ?? {};\n\n const overlayNode =\n shouldRenderDialog && scrim ? (\n <div\n {...restOverlayProps}\n className={twMerge(overlayBaseClasses, overlayClassName, overlayExtraClassName)}\n onClick={event => {\n overlayOnClick?.(event);\n if (!event.defaultPrevented) {\n onClose?.();\n }\n }}\n data-state={state}\n aria-hidden\n />\n ) : null;\n\n const dialogNode = shouldRenderDialog ? (\n <div\n className={twMerge(containerBaseClasses, containerClassName)}\n data-state={state}\n aria-hidden={!open}\n >\n {overlayNode}\n <div\n className={twMerge(panelWrapperClasses, fullscreen ? 'h-full items-stretch' : 'mx-auto')}\n data-state={state}\n >\n <div\n {...rest}\n ref={forwardedRef}\n id={id}\n role={roleProp}\n tabIndex={tabIndex}\n aria-modal={ariaModal}\n className={twMerge(\n panelBaseClasses,\n fullscreen ? 'h-full w-full max-w-none rounded-none' : undefined,\n className\n )}\n style={resolvedStyle}\n data-state={state}\n >\n {children}\n </div>\n </div>\n </div>\n ) : null;\n\n const outputNode =\n portal && resolvedPortalContainer && dialogNode\n ? createPortal(dialogNode, resolvedPortalContainer)\n : dialogNode;\n\n return (\n <>\n {activator ? <div className='inline-flex'>{activator}</div> : null}\n {outputNode}\n </>\n );\n});\n\nDialog.displayName = 'Dialog';\n\nexport default Dialog;\n"]}
|
|
@@ -35,20 +35,23 @@ var Menu = React.forwardRef((props, ref) => {
|
|
|
35
35
|
...rest
|
|
36
36
|
} = props;
|
|
37
37
|
const hasContent = children !== void 0 && children !== null;
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
38
|
+
const isControlled = open !== void 0;
|
|
39
|
+
const isOpen = open === true;
|
|
40
|
+
const allowHoverTrigger = openOnHover && !isControlled;
|
|
41
|
+
const allowFocusTrigger = openOnFocus && !isControlled;
|
|
42
|
+
const shouldRenderContent = hasContent && (keepMounted || isOpen || allowHoverTrigger || allowFocusTrigger);
|
|
43
|
+
const shouldRenderOverlay = scrim && hasContent && (isOpen || allowHoverTrigger || allowFocusTrigger);
|
|
41
44
|
const verticalPlacement = placement.startsWith("top") ? "top" : "bottom";
|
|
42
45
|
const visibilityClasses = twMerge(
|
|
43
46
|
"pointer-events-none opacity-0 scale-95",
|
|
44
47
|
isOpen ? "pointer-events-auto opacity-100 scale-100" : void 0,
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
allowHoverTrigger ? "group-hover/menu:pointer-events-auto group-hover/menu:opacity-100 group-hover/menu:scale-100" : void 0,
|
|
49
|
+
allowFocusTrigger ? "group-focus-within/menu:pointer-events-auto group-focus-within/menu:opacity-100 group-focus-within/menu:scale-100" : void 0
|
|
47
50
|
);
|
|
48
51
|
const overlayVisibilityClasses = twMerge(
|
|
49
52
|
"pointer-events-none opacity-0 transition-opacity duration-150",
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
allowHoverTrigger ? "group-hover/menu:opacity-100" : void 0,
|
|
54
|
+
allowFocusTrigger ? "group-focus-within/menu:opacity-100" : void 0,
|
|
52
55
|
isOpen ? "pointer-events-auto opacity-100" : void 0
|
|
53
56
|
);
|
|
54
57
|
const {
|
|
@@ -103,5 +106,5 @@ Menu.displayName = "Menu";
|
|
|
103
106
|
var Menu_default = Menu;
|
|
104
107
|
|
|
105
108
|
export { Menu_default };
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-ZTP2JSQ6.js.map
|
|
110
|
+
//# sourceMappingURL=chunk-ZTP2JSQ6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Containment/Menu/index.tsx"],"names":[],"mappings":";;;;;AA0BA,IAAM,gBAAA,GAAkD;AAAA,EACtD,cAAA,EAAgB,iCAAA;AAAA,EAChB,MAAA,EAAQ,+CAAA;AAAA,EACR,YAAA,EAAc,mCAAA;AAAA,EACd,WAAA,EAAa,uCAAA;AAAA,EACb,GAAA,EAAK,qDAAA;AAAA,EACL,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,aAAA,GAAkD;AAAA,EACtD,GAAA,EAAK,MAAA;AAAA,EACL,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,eAAA,GACJ,gTAAA;AAEF,IAAM,kBAAA,GAAqB,uDAAA;AAK3B,IAAM,IAAA,GAAa,KAAA,CAAA,UAAA,CAAsC,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvE,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,GAAY,cAAA;AAAA,IACZ,IAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,WAAA,GAAc,IAAA;AAAA,IACd,mBAAA,GAAsB,KAAA;AAAA,IACtB,WAAA,GAAc,KAAA;AAAA,IACd,KAAA,GAAQ,KAAA;AAAA,IACR,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA;AAC1D,EAAA,MAAM,MAAA,
|
|
1
|
+
{"version":3,"sources":["../src/Containment/Menu/index.tsx"],"names":[],"mappings":"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","file":"chunk-ZTP2JSQ6.js","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport type MenuPlacement =\n | 'bottom-start'\n | 'bottom'\n | 'bottom-end'\n | 'top-start'\n | 'top'\n | 'top-end';\n\nexport interface MenuProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n activator: React.ReactNode;\n children: React.ReactNode;\n placement?: MenuPlacement;\n open?: boolean;\n openOnHover?: boolean;\n openOnFocus?: boolean;\n matchActivatorWidth?: boolean;\n keepMounted?: boolean;\n scrim?: boolean;\n contentClassName?: string;\n contentProps?: React.HTMLAttributes<HTMLDivElement>;\n overlayClassName?: string;\n}\n\nconst placementClasses: Record<MenuPlacement, string> = {\n 'bottom-start': 'left-0 top-full origin-top-left',\n bottom: 'left-1/2 top-full -translate-x-1/2 origin-top',\n 'bottom-end': 'right-0 top-full origin-top-right',\n 'top-start': 'left-0 bottom-full origin-bottom-left',\n top: 'left-1/2 bottom-full -translate-x-1/2 origin-bottom',\n 'top-end': 'right-0 bottom-full origin-bottom-right'\n};\n\nconst offsetClasses: Record<'top' | 'bottom', string> = {\n top: 'mb-2',\n bottom: 'mt-2'\n};\n\nconst menuBaseClasses =\n 'absolute z-50 min-w-[10rem] rounded-xl border border-gray-200/80 bg-white/95 p-2 text-sm text-gray-700 shadow-lg shadow-gray-900/10 ring-1 ring-black/5 backdrop-blur-md transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2';\n\nconst overlayBaseClasses = 'fixed inset-0 z-40 bg-gray-900/30 backdrop-blur-[1px]';\n\n/**\n * Contextual menu that opens relative to an activator with optional hover/focus behavior and scrim.\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>((props, ref) => {\n const {\n activator,\n children,\n placement = 'bottom-start',\n open,\n openOnHover = true,\n openOnFocus = true,\n matchActivatorWidth = false,\n keepMounted = false,\n scrim = false,\n contentClassName,\n contentProps,\n overlayClassName,\n className,\n ...rest\n } = props;\n\n const hasContent = children !== undefined && children !== null;\n const isControlled = open !== undefined;\n const isOpen = open === true;\n const allowHoverTrigger = openOnHover && !isControlled;\n const allowFocusTrigger = openOnFocus && !isControlled;\n const shouldRenderContent =\n hasContent && (keepMounted || isOpen || allowHoverTrigger || allowFocusTrigger);\n const shouldRenderOverlay =\n scrim && hasContent && (isOpen || allowHoverTrigger || allowFocusTrigger);\n const verticalPlacement = placement.startsWith('top') ? 'top' : 'bottom';\n\n const visibilityClasses = twMerge(\n 'pointer-events-none opacity-0 scale-95',\n isOpen ? 'pointer-events-auto opacity-100 scale-100' : undefined,\n allowHoverTrigger\n ? 'group-hover/menu:pointer-events-auto group-hover/menu:opacity-100 group-hover/menu:scale-100'\n : undefined,\n allowFocusTrigger\n ? 'group-focus-within/menu:pointer-events-auto group-focus-within/menu:opacity-100 group-focus-within/menu:scale-100'\n : undefined\n );\n\n const overlayVisibilityClasses = twMerge(\n 'pointer-events-none opacity-0 transition-opacity duration-150',\n allowHoverTrigger ? 'group-hover/menu:opacity-100' : undefined,\n allowFocusTrigger ? 'group-focus-within/menu:opacity-100' : undefined,\n isOpen ? 'pointer-events-auto opacity-100' : undefined\n );\n\n const {\n className: contentExtraClassName,\n style: contentStyle,\n role: contentRole,\n tabIndex: contentTabIndex,\n ...restContentProps\n } = contentProps ?? {};\n\n const overlayNode = shouldRenderOverlay ? (\n <div\n className={twMerge(overlayBaseClasses, overlayVisibilityClasses, overlayClassName)}\n aria-hidden\n />\n ) : null;\n\n return (\n <div\n {...rest}\n ref={ref}\n className={twMerge('relative inline-flex min-w-0 group/menu', className)}\n data-open={isOpen || undefined}\n >\n {overlayNode}\n <div className='inline-flex w-full min-w-0'>{activator}</div>\n {shouldRenderContent ? (\n <div\n {...restContentProps}\n className={twMerge(\n menuBaseClasses,\n placementClasses[placement],\n offsetClasses[verticalPlacement],\n matchActivatorWidth ? 'min-w-full' : undefined,\n visibilityClasses,\n contentClassName,\n contentExtraClassName\n )}\n data-state={isOpen ? 'open' : 'closed'}\n role={contentRole ?? 'menu'}\n tabIndex={contentTabIndex ?? -1}\n style={contentStyle}\n >\n {children}\n </div>\n ) : null}\n </div>\n );\n});\n\nMenu.displayName = 'Menu';\n\nexport default Menu;\n"]}
|
package/dist/dialog.cjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
+
var reactDom = require('react-dom');
|
|
4
5
|
var tailwindMerge = require('tailwind-merge');
|
|
5
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
7
|
|
|
@@ -45,9 +46,12 @@ var Dialog = React__namespace.forwardRef((props, forwardedRef) => {
|
|
|
45
46
|
fullscreen = false,
|
|
46
47
|
maxWidth = "32rem",
|
|
47
48
|
width,
|
|
49
|
+
onClose,
|
|
48
50
|
containerClassName,
|
|
49
51
|
overlayClassName,
|
|
50
52
|
overlayProps,
|
|
53
|
+
portal = true,
|
|
54
|
+
portalContainer,
|
|
51
55
|
className,
|
|
52
56
|
style,
|
|
53
57
|
role: roleProp = "dialog",
|
|
@@ -58,6 +62,7 @@ var Dialog = React__namespace.forwardRef((props, forwardedRef) => {
|
|
|
58
62
|
} = props;
|
|
59
63
|
const state = open ? "open" : "closed";
|
|
60
64
|
const shouldRenderDialog = keepMounted || open;
|
|
65
|
+
const resolvedPortalContainer = portalContainer ?? (typeof document !== "undefined" ? document.body : null);
|
|
61
66
|
const resolvedStyle = { ...style };
|
|
62
67
|
if (fullscreen) {
|
|
63
68
|
if (resolvedStyle.maxWidth === void 0) {
|
|
@@ -81,58 +86,67 @@ var Dialog = React__namespace.forwardRef((props, forwardedRef) => {
|
|
|
81
86
|
}
|
|
82
87
|
}
|
|
83
88
|
const ariaModal = ariaModalProp ?? (roleProp === "dialog" || roleProp === "alertdialog" ? true : void 0);
|
|
84
|
-
const {
|
|
89
|
+
const {
|
|
90
|
+
className: overlayExtraClassName,
|
|
91
|
+
onClick: overlayOnClick,
|
|
92
|
+
...restOverlayProps
|
|
93
|
+
} = overlayProps ?? {};
|
|
85
94
|
const overlayNode = shouldRenderDialog && scrim ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
86
95
|
"div",
|
|
87
96
|
{
|
|
88
97
|
...restOverlayProps,
|
|
89
98
|
className: tailwindMerge.twMerge(overlayBaseClasses, overlayClassName, overlayExtraClassName),
|
|
99
|
+
onClick: (event) => {
|
|
100
|
+
overlayOnClick?.(event);
|
|
101
|
+
if (!event.defaultPrevented) {
|
|
102
|
+
onClose?.();
|
|
103
|
+
}
|
|
104
|
+
},
|
|
90
105
|
"data-state": state,
|
|
91
106
|
"aria-hidden": true
|
|
92
107
|
}
|
|
93
108
|
) : null;
|
|
109
|
+
const dialogNode = shouldRenderDialog ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
110
|
+
"div",
|
|
111
|
+
{
|
|
112
|
+
className: tailwindMerge.twMerge(containerBaseClasses, containerClassName),
|
|
113
|
+
"data-state": state,
|
|
114
|
+
"aria-hidden": !open,
|
|
115
|
+
children: [
|
|
116
|
+
overlayNode,
|
|
117
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
118
|
+
"div",
|
|
119
|
+
{
|
|
120
|
+
className: tailwindMerge.twMerge(panelWrapperClasses, fullscreen ? "h-full items-stretch" : "mx-auto"),
|
|
121
|
+
"data-state": state,
|
|
122
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
123
|
+
"div",
|
|
124
|
+
{
|
|
125
|
+
...rest,
|
|
126
|
+
ref: forwardedRef,
|
|
127
|
+
id,
|
|
128
|
+
role: roleProp,
|
|
129
|
+
tabIndex,
|
|
130
|
+
"aria-modal": ariaModal,
|
|
131
|
+
className: tailwindMerge.twMerge(
|
|
132
|
+
panelBaseClasses,
|
|
133
|
+
fullscreen ? "h-full w-full max-w-none rounded-none" : void 0,
|
|
134
|
+
className
|
|
135
|
+
),
|
|
136
|
+
style: resolvedStyle,
|
|
137
|
+
"data-state": state,
|
|
138
|
+
children
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
)
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
) : null;
|
|
146
|
+
const outputNode = portal && resolvedPortalContainer && dialogNode ? reactDom.createPortal(dialogNode, resolvedPortalContainer) : dialogNode;
|
|
94
147
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
95
148
|
activator ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex", children: activator }) : null,
|
|
96
|
-
|
|
97
|
-
"div",
|
|
98
|
-
{
|
|
99
|
-
className: tailwindMerge.twMerge(containerBaseClasses, containerClassName),
|
|
100
|
-
"data-state": state,
|
|
101
|
-
"aria-hidden": !open,
|
|
102
|
-
children: [
|
|
103
|
-
overlayNode,
|
|
104
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
105
|
-
"div",
|
|
106
|
-
{
|
|
107
|
-
className: tailwindMerge.twMerge(
|
|
108
|
-
panelWrapperClasses,
|
|
109
|
-
fullscreen ? "h-full items-stretch" : "mx-auto"
|
|
110
|
-
),
|
|
111
|
-
"data-state": state,
|
|
112
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
113
|
-
"div",
|
|
114
|
-
{
|
|
115
|
-
...rest,
|
|
116
|
-
ref: forwardedRef,
|
|
117
|
-
id,
|
|
118
|
-
role: roleProp,
|
|
119
|
-
tabIndex,
|
|
120
|
-
"aria-modal": ariaModal,
|
|
121
|
-
className: tailwindMerge.twMerge(
|
|
122
|
-
panelBaseClasses,
|
|
123
|
-
fullscreen ? "h-full w-full max-w-none rounded-none" : void 0,
|
|
124
|
-
className
|
|
125
|
-
),
|
|
126
|
-
style: resolvedStyle,
|
|
127
|
-
"data-state": state,
|
|
128
|
-
children
|
|
129
|
-
}
|
|
130
|
-
)
|
|
131
|
-
}
|
|
132
|
-
)
|
|
133
|
-
]
|
|
134
|
-
}
|
|
135
|
-
) : null
|
|
149
|
+
outputNode
|
|
136
150
|
] });
|
|
137
151
|
});
|
|
138
152
|
Dialog.displayName = "Dialog";
|