@fpkit/acss 0.5.11 → 0.5.13
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 +514 -18
- package/libs/chunk-23ANBDCR.js +8 -0
- package/libs/chunk-23ANBDCR.js.map +1 -0
- package/libs/chunk-2LTJ7HHX.cjs +18 -0
- package/libs/chunk-2LTJ7HHX.cjs.map +1 -0
- package/libs/chunk-2Y7W75TT.js +9 -0
- package/libs/chunk-2Y7W75TT.js.map +1 -0
- package/libs/chunk-3MKLDCKQ.cjs +31 -0
- package/libs/chunk-3MKLDCKQ.cjs.map +1 -0
- package/libs/chunk-5M57K4SW.js +8 -0
- package/libs/chunk-5M57K4SW.js.map +1 -0
- package/libs/chunk-5S4ORA4C.cjs +15 -0
- package/libs/chunk-5S4ORA4C.cjs.map +1 -0
- package/libs/chunk-772NRB75.js +9 -0
- package/libs/chunk-772NRB75.js.map +1 -0
- package/libs/chunk-AHDJGCG5.cjs +15 -0
- package/libs/chunk-AHDJGCG5.cjs.map +1 -0
- package/libs/chunk-B7F5FS6D.cjs +16 -0
- package/libs/chunk-B7F5FS6D.cjs.map +1 -0
- package/libs/chunk-BHRQBJRY.js +8 -0
- package/libs/chunk-BHRQBJRY.js.map +1 -0
- package/libs/chunk-D4YLRWAO.cjs +18 -0
- package/libs/chunk-D4YLRWAO.cjs.map +1 -0
- package/libs/chunk-ETFLFC2S.js +10 -0
- package/libs/chunk-ETFLFC2S.js.map +1 -0
- package/libs/chunk-G55UJ53G.cjs +16 -0
- package/libs/chunk-G55UJ53G.cjs.map +1 -0
- package/libs/chunk-GZ4QFPRY.js +9 -0
- package/libs/chunk-GZ4QFPRY.js.map +1 -0
- package/libs/chunk-IYUN2EW3.cjs +15 -0
- package/libs/chunk-IYUN2EW3.cjs.map +1 -0
- package/libs/chunk-J32EZPYD.cjs +15 -0
- package/libs/chunk-J32EZPYD.cjs.map +1 -0
- package/libs/chunk-JJ43O4Y5.js +8 -0
- package/libs/chunk-JJ43O4Y5.js.map +1 -0
- package/libs/chunk-KUKIVRC2.js +7 -0
- package/libs/chunk-KUKIVRC2.js.map +1 -0
- package/libs/chunk-L75OQKEI.cjs +13 -0
- package/libs/chunk-L75OQKEI.cjs.map +1 -0
- package/libs/chunk-LT5KZ2QW.cjs +22 -0
- package/libs/chunk-LT5KZ2QW.cjs.map +1 -0
- package/libs/chunk-M5RRNTVX.cjs +15 -0
- package/libs/chunk-M5RRNTVX.cjs.map +1 -0
- package/libs/chunk-NGTJDDFO.js +8 -0
- package/libs/chunk-NGTJDDFO.js.map +1 -0
- package/libs/chunk-OK5QEIMD.cjs +17 -0
- package/libs/chunk-OK5QEIMD.cjs.map +1 -0
- package/libs/chunk-P2DC76ZZ.cjs +18 -0
- package/libs/chunk-P2DC76ZZ.cjs.map +1 -0
- package/libs/chunk-P7TTEYCD.js +7 -0
- package/libs/chunk-P7TTEYCD.js.map +1 -0
- package/libs/chunk-PQ2K3BM6.cjs +17 -0
- package/libs/chunk-PQ2K3BM6.cjs.map +1 -0
- package/libs/chunk-QLZWHAMK.js +8 -0
- package/libs/chunk-QLZWHAMK.js.map +1 -0
- package/libs/chunk-RIVUMPOG.js +8 -0
- package/libs/chunk-RIVUMPOG.js.map +1 -0
- package/libs/chunk-ROZI23GS.cjs +15 -0
- package/libs/chunk-ROZI23GS.cjs.map +1 -0
- package/libs/chunk-S7BABR7Z.cjs +13 -0
- package/libs/chunk-S7BABR7Z.cjs.map +1 -0
- package/libs/chunk-SMYRLO3E.js +8 -0
- package/libs/chunk-SMYRLO3E.js.map +1 -0
- package/libs/chunk-TYRCEX2L.js +8 -0
- package/libs/chunk-TYRCEX2L.js.map +1 -0
- package/libs/chunk-VUH3FXGJ.js +11 -0
- package/libs/chunk-VUH3FXGJ.js.map +1 -0
- package/libs/chunk-XBA562WW.js +8 -0
- package/libs/chunk-XBA562WW.js.map +1 -0
- package/libs/chunk-XTQKWY7W.cjs +32 -0
- package/libs/chunk-XTQKWY7W.cjs.map +1 -0
- package/libs/chunk-ZANSFMTD.js +9 -0
- package/libs/chunk-ZANSFMTD.js.map +1 -0
- package/libs/component-props-a8a2f97e.d.ts +38 -0
- package/libs/components/alert/alert.css +1 -1
- package/libs/components/alert/alert.css.map +1 -1
- package/libs/components/alert/alert.min.css +2 -2
- package/libs/components/badge/badge.css +1 -1
- package/libs/components/badge/badge.css.map +1 -1
- package/libs/components/badge/badge.min.css +2 -2
- package/libs/components/breadcrumbs/breadcrumb.cjs +24 -0
- package/libs/components/breadcrumbs/breadcrumb.cjs.map +1 -0
- package/libs/components/breadcrumbs/breadcrumb.d.cts +290 -0
- package/libs/components/breadcrumbs/breadcrumb.d.ts +290 -0
- package/libs/components/breadcrumbs/breadcrumb.js +5 -0
- package/libs/components/breadcrumbs/breadcrumb.js.map +1 -0
- package/libs/components/button.cjs +19 -0
- package/libs/components/button.cjs.map +1 -0
- package/libs/components/button.d.cts +16 -0
- package/libs/components/button.d.ts +16 -0
- package/libs/components/button.js +4 -0
- package/libs/components/button.js.map +1 -0
- package/libs/components/buttons/button.css +1 -1
- package/libs/components/buttons/button.css.map +1 -1
- package/libs/components/buttons/button.min.css +2 -2
- package/libs/components/card.cjs +31 -0
- package/libs/components/card.cjs.map +1 -0
- package/libs/components/card.d.cts +302 -0
- package/libs/components/card.d.ts +302 -0
- package/libs/components/card.js +4 -0
- package/libs/components/card.js.map +1 -0
- package/libs/components/cards/card.css +1 -1
- package/libs/components/cards/card.css.map +1 -1
- package/libs/components/cards/card.min.css +2 -2
- package/libs/components/details/details.css +1 -1
- package/libs/components/details/details.css.map +1 -1
- package/libs/components/details/details.min.css +2 -2
- package/libs/components/dialog/dialog.cjs +22 -0
- package/libs/components/dialog/dialog.cjs.map +1 -0
- package/libs/components/dialog/dialog.css +1 -1
- package/libs/components/dialog/dialog.css.map +1 -1
- package/libs/components/dialog/dialog.d.cts +105 -0
- package/libs/components/dialog/dialog.d.ts +105 -0
- package/libs/components/dialog/dialog.js +7 -0
- package/libs/components/dialog/dialog.js.map +1 -0
- package/libs/components/dialog/dialog.min.css +2 -2
- package/libs/components/form/fields.cjs +19 -0
- package/libs/components/form/fields.cjs.map +1 -0
- package/libs/components/form/fields.d.cts +24 -0
- package/libs/components/form/fields.d.ts +24 -0
- package/libs/components/form/fields.js +4 -0
- package/libs/components/form/fields.js.map +1 -0
- package/libs/components/form/inputs.cjs +19 -0
- package/libs/components/form/inputs.cjs.map +1 -0
- package/libs/components/form/inputs.d.cts +2 -0
- package/libs/components/form/inputs.d.ts +2 -0
- package/libs/components/form/inputs.js +4 -0
- package/libs/components/form/inputs.js.map +1 -0
- package/libs/components/form/textarea.cjs +19 -0
- package/libs/components/form/textarea.cjs.map +1 -0
- package/libs/components/form/textarea.d.cts +29 -0
- package/libs/components/form/textarea.d.ts +29 -0
- package/libs/components/form/textarea.js +4 -0
- package/libs/components/form/textarea.js.map +1 -0
- package/libs/components/heading/heading.cjs +10 -0
- package/libs/components/heading/heading.cjs.map +1 -0
- package/libs/components/heading/heading.d.cts +3 -0
- package/libs/components/heading/heading.d.ts +3 -0
- package/libs/components/heading/heading.js +4 -0
- package/libs/components/heading/heading.js.map +1 -0
- package/libs/components/icons/icon.cjs +19 -0
- package/libs/components/icons/icon.cjs.map +1 -0
- package/libs/{icons-31ace3de.d.ts → components/icons/icon.d.cts} +151 -61
- package/libs/components/icons/icon.d.ts +445 -0
- package/libs/components/icons/icon.js +4 -0
- package/libs/components/icons/icon.js.map +1 -0
- package/libs/components/images/img.css +1 -1
- package/libs/components/images/img.css.map +1 -1
- package/libs/components/images/img.min.css +2 -2
- package/libs/components/link/link.cjs +19 -0
- package/libs/components/link/link.cjs.map +1 -0
- package/libs/components/link/link.d.cts +19 -0
- package/libs/components/link/link.d.ts +19 -0
- package/libs/components/link/link.js +4 -0
- package/libs/components/link/link.js.map +1 -0
- package/libs/components/list/list.cjs +23 -0
- package/libs/components/list/list.cjs.map +1 -0
- package/libs/components/list/list.d.cts +39 -0
- package/libs/components/list/list.d.ts +39 -0
- package/libs/components/list/list.js +4 -0
- package/libs/components/list/list.js.map +1 -0
- package/libs/components/modal.cjs +14 -0
- package/libs/components/modal.cjs.map +1 -0
- package/libs/components/modal.d.cts +35 -0
- package/libs/components/modal.d.ts +35 -0
- package/libs/components/modal.js +5 -0
- package/libs/components/modal.js.map +1 -0
- package/libs/components/nav/nav.cjs +28 -0
- package/libs/components/nav/nav.cjs.map +1 -0
- package/libs/components/nav/nav.d.cts +44 -0
- package/libs/components/nav/nav.d.ts +44 -0
- package/libs/components/nav/nav.js +5 -0
- package/libs/components/nav/nav.js.map +1 -0
- package/libs/components/popover/popover.cjs +23 -0
- package/libs/components/popover/popover.cjs.map +1 -0
- package/libs/components/popover/popover.d.cts +40 -0
- package/libs/components/popover/popover.d.ts +40 -0
- package/libs/components/popover/popover.js +4 -0
- package/libs/components/popover/popover.js.map +1 -0
- package/libs/components/tables/table.cjs +21 -0
- package/libs/components/tables/table.cjs.map +1 -0
- package/libs/components/tables/table.d.cts +36 -0
- package/libs/components/tables/table.d.ts +36 -0
- package/libs/components/tables/table.js +4 -0
- package/libs/components/tables/table.js.map +1 -0
- package/libs/components/text/text.cjs +23 -0
- package/libs/components/text/text.cjs.map +1 -0
- package/libs/components/text/text.d.cts +30 -0
- package/libs/components/text/text.d.ts +30 -0
- package/libs/components/text/text.js +4 -0
- package/libs/components/text/text.js.map +1 -0
- package/libs/heading-3648c538.d.ts +250 -0
- package/libs/hooks.cjs +7 -0
- package/libs/hooks.d.cts +5 -0
- package/libs/hooks.d.ts +5 -0
- package/libs/hooks.js +3 -0
- package/libs/icons.cjs +3 -2
- package/libs/icons.d.cts +3 -1
- package/libs/icons.d.ts +3 -1
- package/libs/icons.js +2 -1
- package/libs/index.cjs +174 -62
- package/libs/index.cjs.map +1 -1
- package/libs/index.css +1 -1
- package/libs/index.css.map +1 -1
- package/libs/index.d.cts +529 -446
- package/libs/index.d.ts +529 -446
- package/libs/index.js +36 -7
- package/libs/index.js.map +1 -1
- package/libs/inputs-f3a216db.d.ts +45 -0
- package/libs/ui-645f95b5.d.ts +285 -0
- package/package.json +2 -2
- package/src/components/README-UI.mdx +416 -0
- package/src/components/alert/ACCESSIBILITY.md +319 -0
- package/src/components/alert/README.mdx +475 -19
- package/src/components/alert/alert.scss +113 -6
- package/src/components/alert/alert.stories.tsx +372 -0
- package/src/components/alert/alert.test.tsx +762 -0
- package/src/components/alert/alert.tsx +331 -66
- package/src/components/alert/views/alert-actions.tsx +13 -0
- package/src/components/alert/views/alert-content.tsx +17 -0
- package/src/components/alert/views/alert-icon.tsx +53 -0
- package/src/components/alert/views/alert-screen-reader-text.tsx +30 -0
- package/src/components/alert/views/alert-title.tsx +23 -0
- package/src/components/alert/views/alert-view.tsx +158 -0
- package/src/components/alert/views/index.ts +12 -0
- package/src/components/badge/badge.mdx +186 -49
- package/src/components/badge/badge.scss +20 -2
- package/src/components/badge/badge.stories.tsx +160 -14
- package/src/components/badge/badge.test.tsx +179 -0
- package/src/components/badge/badge.tsx +97 -4
- package/src/components/breadcrumbs/README.mdx +364 -45
- package/src/components/breadcrumbs/__snapshots__/breadcrumb.test.tsx.snap +152 -0
- package/src/components/breadcrumbs/breadcrumb.stories.tsx +7 -3
- package/src/components/breadcrumbs/breadcrumb.test.tsx +490 -0
- package/src/components/breadcrumbs/breadcrumb.tsx +427 -170
- package/src/components/button.ts +2 -0
- package/src/components/buttons/button.scss +34 -31
- package/src/components/buttons/button.stories.tsx +35 -0
- package/src/components/card.ts +2 -0
- package/src/components/cards/README.mdx +657 -0
- package/src/components/cards/card.scss +22 -0
- package/src/components/cards/card.stories.tsx +167 -5
- package/src/components/cards/card.test.tsx +360 -20
- package/src/components/cards/card.tsx +200 -79
- package/src/components/cards/card.types.ts +135 -0
- package/src/components/cards/card.utils.ts +79 -0
- package/src/components/details/ACCESSIBILITY-REVIEW-LIVE.md +1050 -0
- package/src/components/details/ACCESSIBILITY-REVIEW.md +502 -0
- package/src/components/details/README.mdx +437 -69
- package/src/components/details/details.scss +16 -0
- package/src/components/details/details.test.tsx +385 -0
- package/src/components/details/details.tsx +101 -69
- package/src/components/details/details.types.ts +76 -0
- package/src/components/dialog/README.mdx +513 -110
- package/src/components/dialog/dialog-modal.tsx +79 -56
- package/src/components/dialog/dialog.scss +53 -3
- package/src/components/dialog/dialog.stories.tsx +10 -7
- package/src/components/dialog/dialog.test.tsx +450 -0
- package/src/components/dialog/dialog.tsx +69 -59
- package/src/components/dialog/dialog.types.ts +133 -0
- package/src/components/dialog/views/dialog-footer.tsx +54 -11
- package/src/components/dialog/views/dialog-header.tsx +20 -15
- package/src/components/heading/heading.stories.tsx +44 -4
- package/src/components/heading/heading.tsx +89 -23
- package/src/components/icons/README.mdx +332 -0
- package/src/components/icons/icon.stories.tsx +74 -1
- package/src/components/icons/icon.tsx +89 -1
- package/src/components/icons/types.ts +47 -0
- package/src/components/images/README.mdx +340 -24
- package/src/components/images/img.scss +19 -3
- package/src/components/images/img.stories.tsx +424 -15
- package/src/components/images/img.test.tsx +354 -25
- package/src/components/images/img.tsx +186 -63
- package/src/components/images/img.types.ts +211 -0
- package/src/components/modal.ts +1 -0
- package/src/components/title/MIGRATION.md +199 -0
- package/src/components/title/README.md +326 -0
- package/src/components/title/README.mdx +452 -0
- package/src/components/title/title.stories.tsx +393 -0
- package/src/components/title/title.test.tsx +251 -0
- package/src/components/title/title.tsx +219 -0
- package/src/components/ui.stories.tsx +894 -0
- package/src/components/ui.test.tsx +559 -0
- package/src/components/ui.tsx +266 -15
- package/src/components/word-count/README.md +240 -0
- package/src/hooks.ts +1 -0
- package/src/index.ts +51 -19
- package/src/sass/_properties.scss +1 -0
- package/src/styles/alert/alert.css +94 -4
- package/src/styles/alert/alert.css.map +1 -1
- package/src/styles/badge/badge.css +20 -2
- package/src/styles/badge/badge.css.map +1 -1
- package/src/styles/buttons/button.css +31 -31
- package/src/styles/buttons/button.css.map +1 -1
- package/src/styles/cards/card.css +16 -0
- package/src/styles/cards/card.css.map +1 -1
- package/src/styles/details/details.css +19 -0
- package/src/styles/details/details.css.map +1 -1
- package/src/styles/dialog/dialog.css +43 -2
- package/src/styles/dialog/dialog.css.map +1 -1
- package/src/styles/images/img.css +15 -3
- package/src/styles/images/img.css.map +1 -1
- package/src/styles/index.css +240 -43
- package/src/styles/index.css.map +1 -1
- package/src/test/setup.d.ts +9 -0
- package/src/test/setup.ts +53 -1
- package/libs/chunk-PWVRDQ3R.js +0 -8
- package/libs/chunk-PWVRDQ3R.js.map +0 -1
- package/libs/chunk-SVS4MX3U.cjs +0 -31
- package/libs/chunk-SVS4MX3U.cjs.map +0 -1
- package/src/components/cards/README.md +0 -80
- package/src/components/dialog/hooks/useClickOutside.ts +0 -33
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { CSSProperties, ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base properties shared by all dialog variants.
|
|
5
|
+
*
|
|
6
|
+
* @property {string} dialogTitle - The title displayed in the dialog header
|
|
7
|
+
* @property {string} [dialogLabel] - Optional accessible label for the dialog (aria-label)
|
|
8
|
+
* @property {ReactNode} children - Content to be displayed inside the dialog body
|
|
9
|
+
* @property {string} [className] - Additional CSS classes to apply to the dialog
|
|
10
|
+
* @property {CSSProperties} [styles] - Inline styles to apply to the dialog element
|
|
11
|
+
*/
|
|
12
|
+
export interface BaseDialogProps {
|
|
13
|
+
/** The title displayed in the dialog header */
|
|
14
|
+
dialogTitle: string;
|
|
15
|
+
/** Optional accessible label for the dialog (aria-label) */
|
|
16
|
+
dialogLabel?: string;
|
|
17
|
+
/** Content to be displayed inside the dialog body */
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
/** Additional CSS classes to apply to the dialog */
|
|
20
|
+
className?: string;
|
|
21
|
+
/** Inline styles to apply to the dialog element */
|
|
22
|
+
styles?: CSSProperties;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Props for the controlled Dialog component.
|
|
27
|
+
* Use this when you want to manage dialog state externally.
|
|
28
|
+
*
|
|
29
|
+
* @extends BaseDialogProps
|
|
30
|
+
* @property {boolean} isOpen - Controls whether the dialog is currently open
|
|
31
|
+
* @property {(open: boolean) => void} onOpenChange - Callback fired when dialog open state should change
|
|
32
|
+
* @property {boolean} [isAlertDialog=false] - If true, renders as non-modal inline alert using dialog.show()
|
|
33
|
+
* @property {() => void} [onClose] - Deprecated: Use onOpenChange instead. Called when dialog closes.
|
|
34
|
+
* @property {() => void | Promise<void>} [onConfirm] - Callback fired when confirm button is clicked
|
|
35
|
+
* @property {string} [confirmLabel="Confirm"] - Text label for the confirm button
|
|
36
|
+
* @property {string} [cancelLabel="Cancel"] - Text label for the cancel button
|
|
37
|
+
* @property {boolean} [hideFooter=false] - If true, hides the dialog footer with action buttons
|
|
38
|
+
*/
|
|
39
|
+
export interface DialogProps extends BaseDialogProps {
|
|
40
|
+
/** Controls whether the dialog is currently open (controlled component) */
|
|
41
|
+
isOpen: boolean;
|
|
42
|
+
/** Callback fired when dialog open state should change */
|
|
43
|
+
onOpenChange: (open: boolean) => void;
|
|
44
|
+
/** If true, renders as non-modal inline alert using dialog.show() instead of dialog.showModal() */
|
|
45
|
+
isAlertDialog?: boolean;
|
|
46
|
+
/** @deprecated Use onOpenChange instead. Called when dialog closes. */
|
|
47
|
+
onClose?: () => void;
|
|
48
|
+
/** Callback fired when confirm button is clicked */
|
|
49
|
+
onConfirm?: () => void | Promise<void>;
|
|
50
|
+
/** Text label for the confirm button */
|
|
51
|
+
confirmLabel?: string;
|
|
52
|
+
/** Text label for the cancel button */
|
|
53
|
+
cancelLabel?: string;
|
|
54
|
+
/** If true, hides the dialog footer with action buttons */
|
|
55
|
+
hideFooter?: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Props for the DialogModal wrapper component.
|
|
60
|
+
* This component manages dialog state internally and provides a trigger button.
|
|
61
|
+
* Use this for simple cases where you don't need external state management.
|
|
62
|
+
*
|
|
63
|
+
* @extends BaseDialogProps
|
|
64
|
+
* @property {boolean} [isAlertDialog=false] - If true, renders as non-modal inline alert
|
|
65
|
+
* @property {() => void} [onClose] - Callback fired when dialog is closed
|
|
66
|
+
* @property {() => void | Promise<void>} [onConfirm] - Callback fired when confirm button is clicked
|
|
67
|
+
* @property {string} [confirmLabel="Confirm"] - Text label for the confirm button
|
|
68
|
+
* @property {string} [cancelLabel="Cancel"] - Text label for the cancel button
|
|
69
|
+
* @property {boolean} [hideFooter=false] - If true, hides the dialog footer
|
|
70
|
+
* @property {string} [btnLabel="Open Dialog"] - Text label for the trigger button
|
|
71
|
+
* @property {"sm" | "md" | "lg"} [btnSize="sm"] - Size variant for the trigger button
|
|
72
|
+
* @property {() => void} [btnOnClick] - Callback fired when trigger button is clicked (before opening)
|
|
73
|
+
*/
|
|
74
|
+
export interface DialogModalProps extends BaseDialogProps {
|
|
75
|
+
/** If true, renders as non-modal inline alert using dialog.show() */
|
|
76
|
+
isAlertDialog?: boolean;
|
|
77
|
+
/** Callback fired when dialog is closed */
|
|
78
|
+
onClose?: () => void;
|
|
79
|
+
/** Callback fired when confirm button is clicked */
|
|
80
|
+
onConfirm?: () => void | Promise<void>;
|
|
81
|
+
/** Text label for the confirm button */
|
|
82
|
+
confirmLabel?: string;
|
|
83
|
+
/** Text label for the cancel button */
|
|
84
|
+
cancelLabel?: string;
|
|
85
|
+
/** If true, hides the dialog footer with action buttons */
|
|
86
|
+
hideFooter?: boolean;
|
|
87
|
+
/** Text label for the trigger button that opens the dialog */
|
|
88
|
+
btnLabel?: string;
|
|
89
|
+
/** Size variant for the trigger button */
|
|
90
|
+
btnSize?: "sm" | "md" | "lg";
|
|
91
|
+
/** Callback fired when trigger button is clicked (before opening dialog) */
|
|
92
|
+
btnOnClick?: () => void;
|
|
93
|
+
/** Additional props to pass to the trigger button component */
|
|
94
|
+
btnProps?: Record<string, unknown>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Props for the DialogHeader component.
|
|
99
|
+
*
|
|
100
|
+
* @property {string} dialogTitle - The title text to display in the header
|
|
101
|
+
* @property {() => void} onClick - Callback fired when the close button is clicked
|
|
102
|
+
* @property {string} [id] - Optional ID for aria-labelledby linking. Auto-generated if not provided.
|
|
103
|
+
* @property {"h1" | "h2" | "h3" | "h4" | "h5" | "h6"} [type="h3"] - Heading level for the title
|
|
104
|
+
*/
|
|
105
|
+
export interface DialogHeaderProps {
|
|
106
|
+
/** The title text to display in the header */
|
|
107
|
+
dialogTitle: string;
|
|
108
|
+
/** Callback fired when the close button is clicked */
|
|
109
|
+
onClick: () => void;
|
|
110
|
+
/** Optional ID for aria-labelledby linking. Auto-generated if not provided. */
|
|
111
|
+
id?: string;
|
|
112
|
+
/** Heading level for the title */
|
|
113
|
+
type?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Props for the DialogFooter component.
|
|
118
|
+
*
|
|
119
|
+
* @property {() => void} onClose - Callback fired when cancel button is clicked
|
|
120
|
+
* @property {() => void | Promise<void>} [onConfirm] - Callback fired when confirm button is clicked
|
|
121
|
+
* @property {string} confirmLabel - Text label for the confirm button
|
|
122
|
+
* @property {string} cancelLabel - Text label for the cancel button
|
|
123
|
+
*/
|
|
124
|
+
export interface DialogFooterProps {
|
|
125
|
+
/** Callback fired when cancel button is clicked */
|
|
126
|
+
onClose: () => void;
|
|
127
|
+
/** Callback fired when confirm button is clicked */
|
|
128
|
+
onConfirm?: () => void | Promise<void>;
|
|
129
|
+
/** Text label for the confirm button */
|
|
130
|
+
confirmLabel: string;
|
|
131
|
+
/** Text label for the cancel button */
|
|
132
|
+
cancelLabel: string;
|
|
133
|
+
}
|
|
@@ -1,26 +1,67 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useCallback } from "react";
|
|
2
2
|
import UI from "#components/ui";
|
|
3
3
|
import Button from "#components/buttons/button";
|
|
4
|
+
import type { DialogFooterProps } from "../dialog.types";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
/**
|
|
7
|
+
* DialogFooter component renders action buttons for dialog confirmation/cancellation.
|
|
8
|
+
*
|
|
9
|
+
* This component provides a consistent footer layout with:
|
|
10
|
+
* - Cancel button (secondary style) - Always shown if cancelLabel provided
|
|
11
|
+
* - Confirm button (primary style) - Only shown if onConfirm callback provided
|
|
12
|
+
* - Proper semantic button types
|
|
13
|
+
* - Accessible button sizing and spacing
|
|
14
|
+
* - Memoized to prevent unnecessary re-renders
|
|
15
|
+
*
|
|
16
|
+
* @component
|
|
17
|
+
* @param {DialogFooterProps} props - Component props
|
|
18
|
+
* @param {() => void} props.onClose - Callback fired when cancel button is clicked
|
|
19
|
+
* @param {() => void | Promise<void>} [props.onConfirm] - Optional callback for confirm action. If omitted, confirm button is hidden.
|
|
20
|
+
* @param {string} props.confirmLabel - Text label for the confirm button
|
|
21
|
+
* @param {string} props.cancelLabel - Text label for the cancel button
|
|
22
|
+
* @returns {JSX.Element} A footer section with action buttons
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* // Simple close-only footer
|
|
27
|
+
* <DialogFooter
|
|
28
|
+
* onClose={() => setOpen(false)}
|
|
29
|
+
* cancelLabel="Close"
|
|
30
|
+
* confirmLabel="OK"
|
|
31
|
+
* />
|
|
32
|
+
*
|
|
33
|
+
* // Confirmation dialog with both actions
|
|
34
|
+
* <DialogFooter
|
|
35
|
+
* onClose={() => setOpen(false)}
|
|
36
|
+
* onConfirm={async () => await deleteItem()}
|
|
37
|
+
* confirmLabel="Delete"
|
|
38
|
+
* cancelLabel="Cancel"
|
|
39
|
+
* />
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
12
42
|
const DialogFooter: React.FC<DialogFooterProps> = ({
|
|
13
43
|
onClose,
|
|
14
44
|
onConfirm,
|
|
15
45
|
confirmLabel,
|
|
16
46
|
cancelLabel,
|
|
17
47
|
}) => {
|
|
48
|
+
// Memoize handlers to prevent unnecessary re-renders
|
|
49
|
+
const handleCancel = useCallback(() => {
|
|
50
|
+
onClose();
|
|
51
|
+
}, [onClose]);
|
|
52
|
+
|
|
53
|
+
const handleConfirm = useCallback(() => {
|
|
54
|
+
if (onConfirm) {
|
|
55
|
+
onConfirm();
|
|
56
|
+
}
|
|
57
|
+
}, [onConfirm]);
|
|
58
|
+
|
|
18
59
|
return (
|
|
19
60
|
<UI as="section" className="dialog-footer">
|
|
20
61
|
{cancelLabel && (
|
|
21
62
|
<Button
|
|
22
63
|
type="button"
|
|
23
|
-
onClick={
|
|
64
|
+
onClick={handleCancel}
|
|
24
65
|
className="dialog-button button-secondary"
|
|
25
66
|
data-btn="sm"
|
|
26
67
|
>
|
|
@@ -31,7 +72,7 @@ const DialogFooter: React.FC<DialogFooterProps> = ({
|
|
|
31
72
|
{onConfirm && (
|
|
32
73
|
<Button
|
|
33
74
|
type="button"
|
|
34
|
-
onClick={
|
|
75
|
+
onClick={handleConfirm}
|
|
35
76
|
className="dialog-button button-primary"
|
|
36
77
|
data-btn="sm"
|
|
37
78
|
>
|
|
@@ -42,4 +83,6 @@ const DialogFooter: React.FC<DialogFooterProps> = ({
|
|
|
42
83
|
);
|
|
43
84
|
};
|
|
44
85
|
|
|
45
|
-
|
|
86
|
+
DialogFooter.displayName = "DialogFooter";
|
|
87
|
+
|
|
88
|
+
export default React.memo(DialogFooter);
|
|
@@ -1,45 +1,50 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useCallback } from "react";
|
|
2
2
|
import UI from "#components/ui";
|
|
3
3
|
import Heading from "#components/heading/heading";
|
|
4
4
|
import Button from "#components/buttons/button";
|
|
5
5
|
import Icon from "#components/icons/icon";
|
|
6
|
-
|
|
7
|
-
export type DialogHeaderProps = {
|
|
8
|
-
dialogTitle: string;
|
|
9
|
-
onClick: () => void;
|
|
10
|
-
} & React.ComponentProps<typeof Heading>;
|
|
6
|
+
import type { DialogHeaderProps } from "../dialog.types";
|
|
11
7
|
|
|
12
8
|
/**
|
|
13
9
|
* DialogHeader component displays the header section of a dialog with a title and close button.
|
|
14
10
|
*
|
|
11
|
+
* This component is optimized for accessibility with:
|
|
12
|
+
* - Unique ID for `aria-labelledby` linking to parent dialog
|
|
13
|
+
* - Semantic heading structure for screen readers
|
|
14
|
+
* - Clear close button with accessible label
|
|
15
|
+
* - Memoized to prevent unnecessary re-renders
|
|
16
|
+
*
|
|
15
17
|
* @component
|
|
16
|
-
* @param {
|
|
18
|
+
* @param {DialogHeaderProps} props - Component props
|
|
17
19
|
* @param {string} props.dialogTitle - The title text to display in the dialog header
|
|
18
20
|
* @param {() => void} props.onClick - Callback function triggered when close button is clicked
|
|
19
|
-
* @param {string} [props.
|
|
21
|
+
* @param {string} [props.id] - Optional ID for aria-labelledby linking. Auto-generated if not provided.
|
|
22
|
+
* @param {"h1" | "h2" | "h3" | "h4" | "h5" | "h6"} [props.type="h3"] - Heading level for semantic structure
|
|
20
23
|
* @returns {JSX.Element} A dialog header with title and close button
|
|
21
24
|
*
|
|
22
25
|
* @example
|
|
23
|
-
* ```
|
|
26
|
+
* ```tsx
|
|
24
27
|
* <DialogHeader
|
|
28
|
+
* id="dialog-title-1"
|
|
25
29
|
* dialogTitle="Confirm Action"
|
|
26
30
|
* onClick={() => setIsOpen(false)}
|
|
27
31
|
* type="h2"
|
|
28
32
|
* />
|
|
29
33
|
* ```
|
|
30
34
|
*/
|
|
31
|
-
|
|
32
|
-
const DialogHeader = ({
|
|
35
|
+
const DialogHeader: React.FC<DialogHeaderProps> = ({
|
|
33
36
|
dialogTitle,
|
|
34
37
|
onClick,
|
|
38
|
+
id,
|
|
35
39
|
type = "h3",
|
|
36
|
-
}
|
|
37
|
-
const handleClose = () => {
|
|
40
|
+
}) => {
|
|
41
|
+
const handleClose = useCallback(() => {
|
|
38
42
|
onClick();
|
|
39
|
-
};
|
|
43
|
+
}, [onClick]);
|
|
44
|
+
|
|
40
45
|
return (
|
|
41
46
|
<UI as="div" classes="dialog-header">
|
|
42
|
-
<Heading type={type} className="dialog-title">
|
|
47
|
+
<Heading type={type} className="dialog-title" id={id}>
|
|
43
48
|
{dialogTitle || "Dialog"}
|
|
44
49
|
</Heading>
|
|
45
50
|
<Button
|
|
@@ -3,22 +3,62 @@ import { within, expect } from "storybook/test";
|
|
|
3
3
|
|
|
4
4
|
import Heading from "./heading";
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* @deprecated This component is deprecated. Use Title component instead.
|
|
8
|
+
*/
|
|
6
9
|
const meta: Meta<typeof Heading> = {
|
|
7
|
-
title: "FP.REACT Components/Heading",
|
|
10
|
+
title: "FP.REACT Components/Heading (Deprecated)",
|
|
8
11
|
component: Heading,
|
|
9
|
-
tags: ["version:1.0.0"],
|
|
12
|
+
tags: ["version:1.0.0", "deprecated"],
|
|
10
13
|
parameters: {
|
|
11
14
|
actions: { argTypesRegex: "^on.*" },
|
|
12
15
|
docs: {
|
|
13
16
|
description: {
|
|
14
|
-
component:
|
|
17
|
+
component: `
|
|
18
|
+
# ⚠️ DEPRECATED: Use Title Component Instead
|
|
19
|
+
|
|
20
|
+
The \`Heading\` component is **deprecated** and will be removed in **v3.0.0**.
|
|
21
|
+
|
|
22
|
+
Please migrate to the new [\`Title\`](?path=/docs/fp-react-components-title--docs) component.
|
|
23
|
+
|
|
24
|
+
## Migration Guide
|
|
25
|
+
|
|
26
|
+
\`\`\`tsx
|
|
27
|
+
// ❌ Old API (deprecated):
|
|
28
|
+
import { Heading } from '@fpkit/acss';
|
|
29
|
+
<Heading type="h2">Section Title</Heading>
|
|
30
|
+
|
|
31
|
+
// ✅ New API:
|
|
32
|
+
import { Title } from '@fpkit/acss';
|
|
33
|
+
<Title level="h2">Section Title</Title>
|
|
34
|
+
\`\`\`
|
|
35
|
+
|
|
36
|
+
### Key Changes
|
|
37
|
+
|
|
38
|
+
1. **Component Name**: \`Heading\` → \`Title\`
|
|
39
|
+
2. **Prop Name**: \`type\` → \`level\`
|
|
40
|
+
3. **Default Level**: Changed from \`h3\` to \`h2\` (update if you relied on the default)
|
|
41
|
+
|
|
42
|
+
### Why the Change?
|
|
43
|
+
|
|
44
|
+
- **Better API**: \`level\` is more semantic than \`type\`
|
|
45
|
+
- **Improved Accessibility**: Enhanced WCAG 2.1 compliance
|
|
46
|
+
- **Better Documentation**: Comprehensive JSDoc comments
|
|
47
|
+
- **Performance**: Memoization to prevent unnecessary re-renders
|
|
48
|
+
|
|
49
|
+
## Current Behavior
|
|
50
|
+
|
|
51
|
+
This component still works for backwards compatibility but will log deprecation warnings in development mode.
|
|
52
|
+
|
|
53
|
+
**Removal Timeline**: v3.0.0 (TBD)
|
|
54
|
+
`,
|
|
15
55
|
},
|
|
16
56
|
},
|
|
17
57
|
},
|
|
18
58
|
args: {
|
|
19
59
|
children: "Default title",
|
|
20
60
|
},
|
|
21
|
-
}
|
|
61
|
+
} satisfies Meta<typeof Heading>;
|
|
22
62
|
|
|
23
63
|
export default meta;
|
|
24
64
|
type Story = StoryObj<typeof Heading>;
|
|
@@ -1,27 +1,93 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
import
|
|
3
|
-
import { type } from 'os'
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Title from "#components/title/title";
|
|
4
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Use `Title` component instead. This component will be removed in v3.0.0.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* The `Heading` component has been deprecated in favor of the new `Title` component
|
|
9
|
+
* which offers improved API design and better accessibility features.
|
|
10
|
+
*
|
|
11
|
+
* **Migration Guide:**
|
|
12
|
+
* - Rename `Heading` → `Title`
|
|
13
|
+
* - Rename prop `type` → `level`
|
|
14
|
+
* - Default level changed from `h3` → `h2` (update if you relied on the default)
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Before (deprecated):
|
|
18
|
+
* <Heading type="h2">Section Title</Heading>
|
|
19
|
+
*
|
|
20
|
+
* // After:
|
|
21
|
+
* <Title level="h2">Section Title</Title>
|
|
22
|
+
*
|
|
23
|
+
* @see {@link Title} for the new component
|
|
24
|
+
*/
|
|
5
25
|
export type TitleProps = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated Use `level` prop on the `Title` component instead.
|
|
28
|
+
*/
|
|
29
|
+
children: React.ReactNode;
|
|
10
30
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
ui,
|
|
16
|
-
children,
|
|
17
|
-
...props
|
|
18
|
-
}: TitleProps) => {
|
|
19
|
-
return (
|
|
20
|
-
<UI as={type} id={id} styles={styles} data-ui={ui} {...props}>
|
|
21
|
-
{children}
|
|
22
|
-
</UI>
|
|
23
|
-
)
|
|
24
|
-
}
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated Use `level` prop on the `Title` component instead.
|
|
33
|
+
*/
|
|
34
|
+
type?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
25
35
|
|
|
26
|
-
|
|
27
|
-
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated Use `ui` prop on the `Title` component.
|
|
38
|
+
*/
|
|
39
|
+
ui?: string;
|
|
40
|
+
} & Omit<React.ComponentPropsWithoutRef<typeof Title>, 'level'>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Heading - Deprecated component wrapper for Title.
|
|
44
|
+
*
|
|
45
|
+
* @deprecated Use {@link Title} component instead. Will be removed in v3.0.0.
|
|
46
|
+
*
|
|
47
|
+
* This component provides backwards compatibility for existing code using
|
|
48
|
+
* the old `Heading` component API. It forwards all props to the new `Title`
|
|
49
|
+
* component with appropriate prop name mapping.
|
|
50
|
+
*
|
|
51
|
+
* **Breaking Changes in v3.0.0:**
|
|
52
|
+
* - This component will be removed
|
|
53
|
+
* - Migrate to `Title` component before upgrading
|
|
54
|
+
*
|
|
55
|
+
* **Migration Steps:**
|
|
56
|
+
* 1. Replace all `<Heading>` imports with `<Title>`
|
|
57
|
+
* 2. Rename `type` prop to `level`
|
|
58
|
+
* 3. Review default behavior (default changed from h3 to h2)
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // Old API (still works but deprecated):
|
|
62
|
+
* import { Heading } from '@fpkit/acss';
|
|
63
|
+
* <Heading type="h2">Section</Heading>
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* // New API (recommended):
|
|
67
|
+
* import { Title } from '@fpkit/acss';
|
|
68
|
+
* <Title level="h2">Section</Title>
|
|
69
|
+
*
|
|
70
|
+
* @param {TitleProps} props - Component props (maps old API to new)
|
|
71
|
+
* @returns {React.ReactElement} The rendered Title component
|
|
72
|
+
*/
|
|
73
|
+
const Heading = React.forwardRef<HTMLHeadingElement, TitleProps>(
|
|
74
|
+
({ type = "h3", ...props }, ref) => {
|
|
75
|
+
// Development warning for deprecated usage
|
|
76
|
+
if (process.env.NODE_ENV === "development") {
|
|
77
|
+
// eslint-disable-next-line no-console
|
|
78
|
+
console.warn(
|
|
79
|
+
`[@fpkit/acss] Heading component is deprecated and will be removed in v3.0.0. ` +
|
|
80
|
+
`Please use the Title component instead.\n` +
|
|
81
|
+
`Migration: <Heading type="${type}"> → <Title level="${type}">\n` +
|
|
82
|
+
`See documentation: https://fpkit.dev/components/title`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Map old 'type' prop to new 'level' prop
|
|
87
|
+
return <Title level={type} ref={ref} {...props} />;
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
Heading.displayName = "Heading (Deprecated)";
|
|
92
|
+
|
|
93
|
+
export default Heading;
|