@arqel-dev/ui 0.17.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ArqelCreatePage-SUQTG7LF.js +9 -0
- package/dist/{ArqelCreatePage-UZAHV4DK.js.map → ArqelCreatePage-SUQTG7LF.js.map} +1 -1
- package/dist/ArqelEditPage-TC6CY66H.js +13 -0
- package/dist/{ArqelEditPage-7OFWPULE.js.map → ArqelEditPage-TC6CY66H.js.map} +1 -1
- package/dist/ArqelIndexPage-3DPWRK2Q.js +15 -0
- package/dist/{ArqelIndexPage-ZAVCCM6V.js.map → ArqelIndexPage-3DPWRK2Q.js.map} +1 -1
- package/dist/ArqelNotificationsPage-VCNRIN6A.js +7 -0
- package/dist/ArqelNotificationsPage-VCNRIN6A.js.map +1 -0
- package/dist/{UserMenu-B5XbC_Gy.d.ts → UserMenu-QlwvvZRU.d.ts} +2 -1
- package/dist/action.js +5 -4
- package/dist/{chunk-7NGUPQON.js → chunk-4XV35QZA.js} +5 -5
- package/dist/{chunk-7NGUPQON.js.map → chunk-4XV35QZA.js.map} +1 -1
- package/dist/{chunk-GJ2FKAOM.js → chunk-5ETNGNVM.js} +17 -4
- package/dist/chunk-5ETNGNVM.js.map +1 -0
- package/dist/chunk-6YGRTXEL.js +87 -0
- package/dist/chunk-6YGRTXEL.js.map +1 -0
- package/dist/chunk-CZUV5WCY.js +3 -0
- package/dist/chunk-CZUV5WCY.js.map +1 -0
- package/dist/{chunk-K7QY56XN.js → chunk-D2MUCHFN.js} +5 -119
- package/dist/chunk-D2MUCHFN.js.map +1 -0
- package/dist/{chunk-DO3PRGVV.js → chunk-FVKM6FDW.js} +3 -3
- package/dist/{chunk-DO3PRGVV.js.map → chunk-FVKM6FDW.js.map} +1 -1
- package/dist/{chunk-KGAY2AZH.js → chunk-HOJEO5LX.js} +3 -3
- package/dist/{chunk-KGAY2AZH.js.map → chunk-HOJEO5LX.js.map} +1 -1
- package/dist/chunk-NFP2EB7Y.js +137 -0
- package/dist/chunk-NFP2EB7Y.js.map +1 -0
- package/dist/{chunk-DOQUHQND.js → chunk-P64TZA7T.js} +4 -4
- package/dist/{chunk-DOQUHQND.js.map → chunk-P64TZA7T.js.map} +1 -1
- package/dist/{chunk-WKIYS2FQ.js → chunk-RKWHRD75.js} +53 -10
- package/dist/chunk-RKWHRD75.js.map +1 -0
- package/dist/{chunk-MZMYV43C.js → chunk-SVCWLDZ4.js} +3 -3
- package/dist/{chunk-MZMYV43C.js.map → chunk-SVCWLDZ4.js.map} +1 -1
- package/dist/{chunk-YEPQWAD6.js → chunk-TBDWW6L5.js} +3 -3
- package/dist/{chunk-YEPQWAD6.js.map → chunk-TBDWW6L5.js.map} +1 -1
- package/dist/chunk-U4MPY2XT.js +91 -0
- package/dist/chunk-U4MPY2XT.js.map +1 -0
- package/dist/{chunk-3E66JNQO.js → chunk-VO5KYIHC.js} +3 -30
- package/dist/chunk-VO5KYIHC.js.map +1 -0
- package/dist/{chunk-IO6RMVUF.js → chunk-WXPBHB7R.js} +3 -3
- package/dist/{chunk-IO6RMVUF.js.map → chunk-WXPBHB7R.js.map} +1 -1
- package/dist/chunk-XK2P6CSK.js +8 -0
- package/dist/chunk-XK2P6CSK.js.map +1 -0
- package/dist/{chunk-X2X6YDOX.js → chunk-YDUL7HFU.js} +16 -4
- package/dist/chunk-YDUL7HFU.js.map +1 -0
- package/dist/{chunk-H23VX3RR.js → chunk-YF2RINPG.js} +2 -2
- package/dist/{chunk-H23VX3RR.js.map → chunk-YF2RINPG.js.map} +1 -1
- package/dist/{chunk-53J74IYR.js → chunk-ZZKWQO3W.js} +30 -3
- package/dist/chunk-ZZKWQO3W.js.map +1 -0
- package/dist/flash.d.ts +2 -1
- package/dist/flash.js +2 -1
- package/dist/form.js +3 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +14 -12
- package/dist/pages.d.ts +26 -1
- package/dist/pages.js +18 -14
- package/dist/pages.js.map +1 -1
- package/dist/primitives.js +3 -2
- package/dist/resource.js +4 -3
- package/dist/shell.d.ts +37 -3
- package/dist/shell.js +169 -8
- package/dist/shell.js.map +1 -1
- package/dist/table.js +3 -2
- package/dist/utility.js +2 -2
- package/dist/utils.d.ts +16 -1
- package/dist/utils.js +1 -0
- package/package.json +6 -6
- package/dist/ArqelCreatePage-UZAHV4DK.js +0 -8
- package/dist/ArqelEditPage-7OFWPULE.js +0 -12
- package/dist/ArqelIndexPage-ZAVCCM6V.js +0 -14
- package/dist/chunk-3E66JNQO.js.map +0 -1
- package/dist/chunk-53J74IYR.js.map +0 -1
- package/dist/chunk-GJ2FKAOM.js.map +0 -1
- package/dist/chunk-K7QY56XN.js.map +0 -1
- package/dist/chunk-R4BOUU6Y.js +0 -55
- package/dist/chunk-R4BOUU6Y.js.map +0 -1
- package/dist/chunk-WKIYS2FQ.js.map +0 -1
- package/dist/chunk-X2X6YDOX.js.map +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { ArqelCreatePage as default } from './chunk-WXPBHB7R.js';
|
|
2
|
+
import './chunk-MXUXMHOK.js';
|
|
3
|
+
import './chunk-SVCWLDZ4.js';
|
|
4
|
+
import './chunk-CMNZLA32.js';
|
|
5
|
+
import './chunk-CZUV5WCY.js';
|
|
6
|
+
import './chunk-YF2RINPG.js';
|
|
7
|
+
import './chunk-B7ULUJVO.js';
|
|
8
|
+
//# sourceMappingURL=ArqelCreatePage-SUQTG7LF.js.map
|
|
9
|
+
//# sourceMappingURL=ArqelCreatePage-SUQTG7LF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelCreatePage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelCreatePage-SUQTG7LF.js"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { ArqelEditPage as default } from './chunk-RKWHRD75.js';
|
|
2
|
+
import './chunk-ZZKWQO3W.js';
|
|
3
|
+
import './chunk-MXUXMHOK.js';
|
|
4
|
+
import './chunk-JKD6SE75.js';
|
|
5
|
+
import './chunk-RMPOR2YZ.js';
|
|
6
|
+
import './chunk-FVKM6FDW.js';
|
|
7
|
+
import './chunk-SVCWLDZ4.js';
|
|
8
|
+
import './chunk-CMNZLA32.js';
|
|
9
|
+
import './chunk-CZUV5WCY.js';
|
|
10
|
+
import './chunk-YF2RINPG.js';
|
|
11
|
+
import './chunk-B7ULUJVO.js';
|
|
12
|
+
//# sourceMappingURL=ArqelEditPage-TC6CY66H.js.map
|
|
13
|
+
//# sourceMappingURL=ArqelEditPage-TC6CY66H.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelEditPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelEditPage-TC6CY66H.js"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { ArqelIndexPage as default } from './chunk-P64TZA7T.js';
|
|
2
|
+
import './chunk-HOJEO5LX.js';
|
|
3
|
+
import './chunk-TBDWW6L5.js';
|
|
4
|
+
import './chunk-JKD6SE75.js';
|
|
5
|
+
import './chunk-RMPOR2YZ.js';
|
|
6
|
+
import './chunk-4XV35QZA.js';
|
|
7
|
+
import './chunk-FVKM6FDW.js';
|
|
8
|
+
import './chunk-VKZY6J6G.js';
|
|
9
|
+
import './chunk-SVCWLDZ4.js';
|
|
10
|
+
import './chunk-CMNZLA32.js';
|
|
11
|
+
import './chunk-CZUV5WCY.js';
|
|
12
|
+
import './chunk-YF2RINPG.js';
|
|
13
|
+
import './chunk-B7ULUJVO.js';
|
|
14
|
+
//# sourceMappingURL=ArqelIndexPage-3DPWRK2Q.js.map
|
|
15
|
+
//# sourceMappingURL=ArqelIndexPage-3DPWRK2Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelIndexPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelIndexPage-3DPWRK2Q.js"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ArqelNotificationsPage as default } from './chunk-NFP2EB7Y.js';
|
|
2
|
+
import './chunk-6YGRTXEL.js';
|
|
3
|
+
import './chunk-CZUV5WCY.js';
|
|
4
|
+
import './chunk-YF2RINPG.js';
|
|
5
|
+
import './chunk-B7ULUJVO.js';
|
|
6
|
+
//# sourceMappingURL=ArqelNotificationsPage-VCNRIN6A.js.map
|
|
7
|
+
//# sourceMappingURL=ArqelNotificationsPage-VCNRIN6A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelNotificationsPage-VCNRIN6A.js"}
|
|
@@ -40,11 +40,12 @@ declare function Sidebar({ items: itemsProp, brand, footer, className }: Sidebar
|
|
|
40
40
|
interface TopbarProps {
|
|
41
41
|
brand?: ReactNode;
|
|
42
42
|
search?: ReactNode;
|
|
43
|
+
notifications?: ReactNode;
|
|
43
44
|
userMenu?: ReactNode;
|
|
44
45
|
tenantSwitcher?: ReactNode;
|
|
45
46
|
className?: string;
|
|
46
47
|
}
|
|
47
|
-
declare function Topbar({ brand, search, userMenu, tenantSwitcher, className }: TopbarProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
declare function Topbar({ brand, search, notifications, userMenu, tenantSwitcher, className, }: TopbarProps): react_jsx_runtime.JSX.Element;
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
51
|
* `<UserMenu>` — authenticated-user dropdown for the Topbar `userMenu` slot.
|
package/dist/action.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
export { ActionButton, ActionFormModal, ActionMenu } from './chunk-
|
|
2
|
-
export { ConfirmDialog } from './chunk-
|
|
1
|
+
export { ActionButton, ActionFormModal, ActionMenu } from './chunk-4XV35QZA.js';
|
|
2
|
+
export { ConfirmDialog } from './chunk-FVKM6FDW.js';
|
|
3
3
|
import './chunk-VKZY6J6G.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-SVCWLDZ4.js';
|
|
5
5
|
import './chunk-CMNZLA32.js';
|
|
6
|
-
|
|
6
|
+
import './chunk-CZUV5WCY.js';
|
|
7
|
+
export { Button, buttonVariants } from './chunk-YF2RINPG.js';
|
|
7
8
|
import './chunk-B7ULUJVO.js';
|
|
8
9
|
//# sourceMappingURL=action.js.map
|
|
9
10
|
//# sourceMappingURL=action.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogClose, ConfirmDialog } from './chunk-
|
|
1
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogClose, ConfirmDialog } from './chunk-FVKM6FDW.js';
|
|
2
2
|
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Sheet, SheetContent, SheetHeader, SheetTitle } from './chunk-VKZY6J6G.js';
|
|
3
|
-
import { FormActions } from './chunk-
|
|
3
|
+
import { FormActions } from './chunk-SVCWLDZ4.js';
|
|
4
4
|
import { FormRenderer } from './chunk-CMNZLA32.js';
|
|
5
|
-
import { Button } from './chunk-
|
|
5
|
+
import { Button } from './chunk-YF2RINPG.js';
|
|
6
6
|
import { cn } from './chunk-B7ULUJVO.js';
|
|
7
7
|
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
8
8
|
import { useState, useMemo } from 'react';
|
|
@@ -310,5 +310,5 @@ function ActionMenu({
|
|
|
310
310
|
}
|
|
311
311
|
|
|
312
312
|
export { ActionButton, ActionFormModal, ActionMenu };
|
|
313
|
-
//# sourceMappingURL=chunk-
|
|
314
|
-
//# sourceMappingURL=chunk-
|
|
313
|
+
//# sourceMappingURL=chunk-4XV35QZA.js.map
|
|
314
|
+
//# sourceMappingURL=chunk-4XV35QZA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/action/ActionFormModal.tsx","../src/action/ActionButton.tsx","../src/action/ActionMenu.tsx"],"names":["useState","jsxs","jsx","useArqelTranslations","Fragment"],"mappings":"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","file":"chunk-7NGUPQON.js","sourcesContent":["/**\n * `<ActionFormModal>` — modal hosting a `<FormRenderer>` for an Action's\n * companion form (see `arqel-dev/actions` `HasForm`).\n *\n * Action form fields are a flat list — Action FormSchema is built\n * inline from the `ActionFormField[]` since layout components don't\n * apply at this scale. Submit fires `onSubmit(values)`; the parent\n * (typically `useAction`) handles invocation + loading.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema, ModalSize } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport { useMemo, useState } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '../shadcn/ui/dialog.js';\nimport { cn } from '../utils/cn.js';\nimport { Button } from './Button.js';\n\nexport interface ActionFormModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n action: ActionSchema;\n fields: FieldSchema[];\n onSubmit: (values: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]> | undefined;\n initialValues?: Record<string, unknown>;\n}\n\nconst SIZE_CLASSES: Record<ModalSize, string> = {\n sm: 'sm:max-w-[24rem]',\n md: 'sm:max-w-[32rem]',\n lg: 'sm:max-w-[44rem]',\n xl: 'sm:max-w-[56rem]',\n full: 'sm:max-w-[90vw] h-[90vh]',\n};\n\nexport function ActionFormModal({\n open,\n onOpenChange,\n action,\n fields,\n onSubmit,\n processing = false,\n errors = {},\n initialValues = {},\n}: ActionFormModalProps) {\n const t = useArqelTranslations();\n const [values, setValues] = useState<Record<string, unknown>>(initialValues);\n const size = action.modalSize ?? 'md';\n\n const schema: FormSchema = useMemo(\n () => ({\n schema: (action.form ?? []).map((entry) => ({\n kind: 'field' as const,\n name: entry.name,\n type: entry.type,\n })),\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n }),\n [action.form],\n );\n\n return (\n <Dialog open={open} onOpenChange={(next) => onOpenChange(next)}>\n <DialogContent className={cn('overflow-auto', SIZE_CLASSES[size])}>\n <DialogHeader>\n <DialogTitle>{action.label}</DialogTitle>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit(values);\n }}\n >\n <FormRenderer\n schema={schema}\n fields={fields}\n values={values}\n errors={errors}\n onChange={(name, value) => setValues((prev) => ({ ...prev, [name]: value }))}\n disabled={processing}\n />\n <FormActions\n processing={processing}\n submitLabel={action.label}\n extra={\n <DialogClose asChild>\n <Button type=\"button\" variant=\"ghost\" disabled={processing}>\n {t('form.cancel', 'Cancel')}\n </Button>\n </DialogClose>\n }\n />\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * `<ActionButton>` — renders an `ActionSchema` as a button.\n *\n * Behaviour matrix:\n * - `requiresConfirmation` only → opens ConfirmDialog\n * - `form` only → opens ActionFormModal\n * - both → ConfirmDialog first, then form\n * - neither → fires `onInvoke` immediately\n *\n * `onInvoke` receives optional form data so parents (typically using\n * `useAction()` from @arqel-dev/hooks) can dispatch the underlying request.\n */\n\nimport type { ActionColor, ActionSchema, ActionVariant } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { useState } from 'react';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button, type ButtonProps } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\nexport interface ActionButtonProps {\n action: ActionSchema;\n /**\n * Field schemas for the form modal (resolved server-side from\n * `Action::form` via `FieldSchemaSerializer`). Optional override — when\n * omitted the component reads `action.formFields`, the canonical payload\n * shipped by `Action::toArray()` (#213).\n */\n formFields?: FieldSchema[] | undefined;\n onInvoke: (formValues?: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]>;\n size?: ButtonProps['size'];\n className?: string;\n}\n\nconst COLOR_TO_VARIANT: Record<ActionColor, ButtonProps['variant']> = {\n primary: 'default',\n secondary: 'outline',\n destructive: 'destructive',\n success: 'default',\n warning: 'default',\n info: 'default',\n};\n\nconst VARIANT_OVERRIDE: Partial<Record<ActionVariant, ButtonProps['variant']>> = {\n default: 'default',\n outline: 'outline',\n ghost: 'ghost',\n destructive: 'destructive',\n};\n\nexport function ActionButton({\n action,\n formFields,\n onInvoke,\n processing = false,\n errors,\n size = 'default',\n className,\n}: ActionButtonProps) {\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [formOpen, setFormOpen] = useState(false);\n\n // Prefer an explicit prop; otherwise read the schema shipped by\n // `Action::toArray()` so the modal renders real inputs (#213).\n const resolvedFormFields = formFields ?? action.formFields ?? [];\n\n const variant: ButtonProps['variant'] =\n VARIANT_OVERRIDE[action.variant] ?? COLOR_TO_VARIANT[action.color];\n\n const handleClick = () => {\n if (action.disabled) return;\n if (action.requiresConfirmation) {\n setConfirmOpen(true);\n } else if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleConfirm = () => {\n setConfirmOpen(false);\n if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleFormSubmit = (values: Record<string, unknown>) => {\n onInvoke(values);\n setFormOpen(false);\n };\n\n return (\n <>\n <Button\n variant={variant}\n size={size}\n disabled={action.disabled === true || processing}\n title={action.tooltip}\n onClick={handleClick}\n className={className}\n >\n {action.label}\n </Button>\n {action.requiresConfirmation && (\n <ConfirmDialog\n open={confirmOpen}\n onOpenChange={setConfirmOpen}\n config={action.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {action.form && action.form.length > 0 && (\n <ActionFormModal\n open={formOpen}\n onOpenChange={setFormOpen}\n action={action}\n fields={resolvedFormFields}\n onSubmit={handleFormSubmit}\n processing={processing}\n errors={errors}\n />\n )}\n </>\n );\n}\n","/**\n * `<ActionMenu>` — renders a list of actions inline (≤ `inlineThreshold`)\n * or collapses them into a shadcn (Radix) dropdown menu when the list grows.\n *\n * Each menu item delegates to `<ActionButton>` so confirmation /\n * form-modal behaviour is consistent across surfaces. The dropdown\n * trigger is rendered as a ghost icon button by default; callers can\n * supply a custom `trigger` slot.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { type ReactNode, useState } from 'react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../shadcn/ui/dropdown-menu.js';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../shadcn/ui/sheet.js';\nimport { cn } from '../utils/cn.js';\nimport { ActionButton } from './ActionButton.js';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\n/** Does this action need a gate (confirm/form) before invoking? */\nfunction actionHasForm(action: ActionSchema): boolean {\n return Array.isArray(action.form) && action.form.length > 0;\n}\n\nexport interface ActionMenuProps {\n actions: ActionSchema[];\n /**\n * Optional per-action override map keyed by action name. When an action\n * is absent here, `<ActionButton>` falls back to the action's own\n * `formFields` payload shipped by `Action::toArray()` (#213).\n */\n formFieldsByAction?: Record<string, FieldSchema[]>;\n onInvoke: (action: ActionSchema, formValues?: Record<string, unknown>) => void;\n inlineThreshold?: number;\n processing?: boolean;\n trigger?: ReactNode;\n className?: string;\n}\n\nexport function ActionMenu({\n actions,\n formFieldsByAction = {},\n onInvoke,\n inlineThreshold = 3,\n processing = false,\n trigger,\n className,\n}: ActionMenuProps) {\n const t = useArqelTranslations();\n // Which dropdown action (if any) is currently driving a confirm dialog /\n // form modal. The modals are mounted as siblings of the menu so they\n // survive the menu closing on `onSelect`.\n const [confirmAction, setConfirmAction] = useState<ActionSchema | null>(null);\n const [formAction, setFormAction] = useState<ActionSchema | null>(null);\n // The mobile bottom-sheet is controlled so selecting an item can close it\n // (mirroring the Dropdown's onSelect auto-close).\n const [sheetOpen, setSheetOpen] = useState(false);\n\n if (actions.length === 0) return null;\n\n if (actions.length <= inlineThreshold) {\n return (\n <div className={cn('flex flex-wrap items-center gap-1', className)}>\n {actions.map((action) => (\n <ActionButton\n key={action.name}\n action={action}\n formFields={formFieldsByAction[action.name]}\n onInvoke={(values) => onInvoke(action, values)}\n processing={processing}\n size=\"sm\"\n // 44px touch target on mobile (WCAG 2.5.5); dense 32px on >=md.\n className=\"h-11 md:h-8\"\n />\n ))}\n </div>\n );\n }\n\n const handleSelect = (action: ActionSchema) => {\n if (action.disabled) return;\n // Mirror ActionButton's gating: confirmation first, then form, else\n // invoke directly. The modals open as siblings of the (now closing)\n // menu so destructive/form actions never fire without a gate (#229,\n // #231).\n if (action.requiresConfirmation) {\n setConfirmAction(action);\n } else if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n const handleConfirm = () => {\n const action = confirmAction;\n setConfirmAction(null);\n if (!action) return;\n if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n // One visual trigger shared by both presentation surfaces. The Dropdown\n // wraps it via DropdownMenuTrigger (asChild); the Sheet opens it on click.\n const triggerNode = trigger ?? (\n <Button variant=\"ghost\" size=\"icon-touch\" aria-label={t('arqel.actions.menu', 'Actions')}>\n ⋯\n </Button>\n );\n\n return (\n <>\n {/* Desktop (>=md): the Radix dropdown popper, unchanged. */}\n <div data-arqel-action-dropdown=\"\" className=\"hidden md:contents\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>{triggerNode}</DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={6}\n className={cn('min-w-[12rem]', className)}\n >\n {actions.map((action) => (\n <DropdownMenuItem\n key={action.name}\n disabled={action.disabled === true}\n variant={action.color === 'destructive' ? 'destructive' : 'default'}\n onSelect={() => handleSelect(action)}\n >\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Mobile (<md): a full-width bottom sheet with >=44px items. */}\n <div className=\"md:hidden\">\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <button\n type=\"button\"\n aria-label={t('arqel.actions.menu', 'Actions')}\n className=\"inline-flex size-11 items-center justify-center rounded-md text-lg hover:bg-accent\"\n onClick={() => setSheetOpen(true)}\n >\n ⋯\n </button>\n <SheetContent\n side=\"bottom\"\n className=\"max-h-[80vh] gap-0 overflow-y-auto pb-[env(safe-area-inset-bottom)]\"\n >\n <SheetHeader className=\"px-4 pt-4 pb-2\">\n <SheetTitle>{t('arqel.actions.menu', 'Actions')}</SheetTitle>\n </SheetHeader>\n <div className=\"flex flex-col px-2 pb-2\">\n {actions.map((action) => (\n <button\n key={action.name}\n type=\"button\"\n data-arqel-sheet-action=\"\"\n disabled={action.disabled === true}\n className={cn(\n 'flex min-h-11 w-full items-center rounded-md px-3 text-left text-sm hover:bg-accent disabled:pointer-events-none disabled:opacity-50',\n action.color === 'destructive' && 'text-destructive',\n )}\n onClick={() => {\n setSheetOpen(false);\n handleSelect(action);\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n </SheetContent>\n </Sheet>\n </div>\n\n {confirmAction && (\n <ConfirmDialog\n open\n onOpenChange={(next) => {\n if (!next) setConfirmAction(null);\n }}\n config={confirmAction.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {formAction && (\n <ActionFormModal\n open\n onOpenChange={(next) => {\n if (!next) setFormAction(null);\n }}\n action={formAction}\n fields={formFieldsByAction[formAction.name] ?? formAction.formFields ?? []}\n onSubmit={(values) => {\n const action = formAction;\n setFormAction(null);\n onInvoke(action, values);\n }}\n processing={processing}\n />\n )}\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/action/ActionFormModal.tsx","../src/action/ActionButton.tsx","../src/action/ActionMenu.tsx"],"names":["useState","jsxs","jsx","useArqelTranslations","Fragment"],"mappings":"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","file":"chunk-4XV35QZA.js","sourcesContent":["/**\n * `<ActionFormModal>` — modal hosting a `<FormRenderer>` for an Action's\n * companion form (see `arqel-dev/actions` `HasForm`).\n *\n * Action form fields are a flat list — Action FormSchema is built\n * inline from the `ActionFormField[]` since layout components don't\n * apply at this scale. Submit fires `onSubmit(values)`; the parent\n * (typically `useAction`) handles invocation + loading.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema, ModalSize } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport { useMemo, useState } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '../shadcn/ui/dialog.js';\nimport { cn } from '../utils/cn.js';\nimport { Button } from './Button.js';\n\nexport interface ActionFormModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n action: ActionSchema;\n fields: FieldSchema[];\n onSubmit: (values: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]> | undefined;\n initialValues?: Record<string, unknown>;\n}\n\nconst SIZE_CLASSES: Record<ModalSize, string> = {\n sm: 'sm:max-w-[24rem]',\n md: 'sm:max-w-[32rem]',\n lg: 'sm:max-w-[44rem]',\n xl: 'sm:max-w-[56rem]',\n full: 'sm:max-w-[90vw] h-[90vh]',\n};\n\nexport function ActionFormModal({\n open,\n onOpenChange,\n action,\n fields,\n onSubmit,\n processing = false,\n errors = {},\n initialValues = {},\n}: ActionFormModalProps) {\n const t = useArqelTranslations();\n const [values, setValues] = useState<Record<string, unknown>>(initialValues);\n const size = action.modalSize ?? 'md';\n\n const schema: FormSchema = useMemo(\n () => ({\n schema: (action.form ?? []).map((entry) => ({\n kind: 'field' as const,\n name: entry.name,\n type: entry.type,\n })),\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n }),\n [action.form],\n );\n\n return (\n <Dialog open={open} onOpenChange={(next) => onOpenChange(next)}>\n <DialogContent className={cn('overflow-auto', SIZE_CLASSES[size])}>\n <DialogHeader>\n <DialogTitle>{action.label}</DialogTitle>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit(values);\n }}\n >\n <FormRenderer\n schema={schema}\n fields={fields}\n values={values}\n errors={errors}\n onChange={(name, value) => setValues((prev) => ({ ...prev, [name]: value }))}\n disabled={processing}\n />\n <FormActions\n processing={processing}\n submitLabel={action.label}\n extra={\n <DialogClose asChild>\n <Button type=\"button\" variant=\"ghost\" disabled={processing}>\n {t('form.cancel', 'Cancel')}\n </Button>\n </DialogClose>\n }\n />\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * `<ActionButton>` — renders an `ActionSchema` as a button.\n *\n * Behaviour matrix:\n * - `requiresConfirmation` only → opens ConfirmDialog\n * - `form` only → opens ActionFormModal\n * - both → ConfirmDialog first, then form\n * - neither → fires `onInvoke` immediately\n *\n * `onInvoke` receives optional form data so parents (typically using\n * `useAction()` from @arqel-dev/hooks) can dispatch the underlying request.\n */\n\nimport type { ActionColor, ActionSchema, ActionVariant } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { useState } from 'react';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button, type ButtonProps } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\nexport interface ActionButtonProps {\n action: ActionSchema;\n /**\n * Field schemas for the form modal (resolved server-side from\n * `Action::form` via `FieldSchemaSerializer`). Optional override — when\n * omitted the component reads `action.formFields`, the canonical payload\n * shipped by `Action::toArray()` (#213).\n */\n formFields?: FieldSchema[] | undefined;\n onInvoke: (formValues?: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]>;\n size?: ButtonProps['size'];\n className?: string;\n}\n\nconst COLOR_TO_VARIANT: Record<ActionColor, ButtonProps['variant']> = {\n primary: 'default',\n secondary: 'outline',\n destructive: 'destructive',\n success: 'default',\n warning: 'default',\n info: 'default',\n};\n\nconst VARIANT_OVERRIDE: Partial<Record<ActionVariant, ButtonProps['variant']>> = {\n default: 'default',\n outline: 'outline',\n ghost: 'ghost',\n destructive: 'destructive',\n};\n\nexport function ActionButton({\n action,\n formFields,\n onInvoke,\n processing = false,\n errors,\n size = 'default',\n className,\n}: ActionButtonProps) {\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [formOpen, setFormOpen] = useState(false);\n\n // Prefer an explicit prop; otherwise read the schema shipped by\n // `Action::toArray()` so the modal renders real inputs (#213).\n const resolvedFormFields = formFields ?? action.formFields ?? [];\n\n const variant: ButtonProps['variant'] =\n VARIANT_OVERRIDE[action.variant] ?? COLOR_TO_VARIANT[action.color];\n\n const handleClick = () => {\n if (action.disabled) return;\n if (action.requiresConfirmation) {\n setConfirmOpen(true);\n } else if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleConfirm = () => {\n setConfirmOpen(false);\n if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleFormSubmit = (values: Record<string, unknown>) => {\n onInvoke(values);\n setFormOpen(false);\n };\n\n return (\n <>\n <Button\n variant={variant}\n size={size}\n disabled={action.disabled === true || processing}\n title={action.tooltip}\n onClick={handleClick}\n className={className}\n >\n {action.label}\n </Button>\n {action.requiresConfirmation && (\n <ConfirmDialog\n open={confirmOpen}\n onOpenChange={setConfirmOpen}\n config={action.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {action.form && action.form.length > 0 && (\n <ActionFormModal\n open={formOpen}\n onOpenChange={setFormOpen}\n action={action}\n fields={resolvedFormFields}\n onSubmit={handleFormSubmit}\n processing={processing}\n errors={errors}\n />\n )}\n </>\n );\n}\n","/**\n * `<ActionMenu>` — renders a list of actions inline (≤ `inlineThreshold`)\n * or collapses them into a shadcn (Radix) dropdown menu when the list grows.\n *\n * Each menu item delegates to `<ActionButton>` so confirmation /\n * form-modal behaviour is consistent across surfaces. The dropdown\n * trigger is rendered as a ghost icon button by default; callers can\n * supply a custom `trigger` slot.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { type ReactNode, useState } from 'react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../shadcn/ui/dropdown-menu.js';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../shadcn/ui/sheet.js';\nimport { cn } from '../utils/cn.js';\nimport { ActionButton } from './ActionButton.js';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\n/** Does this action need a gate (confirm/form) before invoking? */\nfunction actionHasForm(action: ActionSchema): boolean {\n return Array.isArray(action.form) && action.form.length > 0;\n}\n\nexport interface ActionMenuProps {\n actions: ActionSchema[];\n /**\n * Optional per-action override map keyed by action name. When an action\n * is absent here, `<ActionButton>` falls back to the action's own\n * `formFields` payload shipped by `Action::toArray()` (#213).\n */\n formFieldsByAction?: Record<string, FieldSchema[]>;\n onInvoke: (action: ActionSchema, formValues?: Record<string, unknown>) => void;\n inlineThreshold?: number;\n processing?: boolean;\n trigger?: ReactNode;\n className?: string;\n}\n\nexport function ActionMenu({\n actions,\n formFieldsByAction = {},\n onInvoke,\n inlineThreshold = 3,\n processing = false,\n trigger,\n className,\n}: ActionMenuProps) {\n const t = useArqelTranslations();\n // Which dropdown action (if any) is currently driving a confirm dialog /\n // form modal. The modals are mounted as siblings of the menu so they\n // survive the menu closing on `onSelect`.\n const [confirmAction, setConfirmAction] = useState<ActionSchema | null>(null);\n const [formAction, setFormAction] = useState<ActionSchema | null>(null);\n // The mobile bottom-sheet is controlled so selecting an item can close it\n // (mirroring the Dropdown's onSelect auto-close).\n const [sheetOpen, setSheetOpen] = useState(false);\n\n if (actions.length === 0) return null;\n\n if (actions.length <= inlineThreshold) {\n return (\n <div className={cn('flex flex-wrap items-center gap-1', className)}>\n {actions.map((action) => (\n <ActionButton\n key={action.name}\n action={action}\n formFields={formFieldsByAction[action.name]}\n onInvoke={(values) => onInvoke(action, values)}\n processing={processing}\n size=\"sm\"\n // 44px touch target on mobile (WCAG 2.5.5); dense 32px on >=md.\n className=\"h-11 md:h-8\"\n />\n ))}\n </div>\n );\n }\n\n const handleSelect = (action: ActionSchema) => {\n if (action.disabled) return;\n // Mirror ActionButton's gating: confirmation first, then form, else\n // invoke directly. The modals open as siblings of the (now closing)\n // menu so destructive/form actions never fire without a gate (#229,\n // #231).\n if (action.requiresConfirmation) {\n setConfirmAction(action);\n } else if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n const handleConfirm = () => {\n const action = confirmAction;\n setConfirmAction(null);\n if (!action) return;\n if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n // One visual trigger shared by both presentation surfaces. The Dropdown\n // wraps it via DropdownMenuTrigger (asChild); the Sheet opens it on click.\n const triggerNode = trigger ?? (\n <Button variant=\"ghost\" size=\"icon-touch\" aria-label={t('arqel.actions.menu', 'Actions')}>\n ⋯\n </Button>\n );\n\n return (\n <>\n {/* Desktop (>=md): the Radix dropdown popper, unchanged. */}\n <div data-arqel-action-dropdown=\"\" className=\"hidden md:contents\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>{triggerNode}</DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={6}\n className={cn('min-w-[12rem]', className)}\n >\n {actions.map((action) => (\n <DropdownMenuItem\n key={action.name}\n disabled={action.disabled === true}\n variant={action.color === 'destructive' ? 'destructive' : 'default'}\n onSelect={() => handleSelect(action)}\n >\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Mobile (<md): a full-width bottom sheet with >=44px items. */}\n <div className=\"md:hidden\">\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <button\n type=\"button\"\n aria-label={t('arqel.actions.menu', 'Actions')}\n className=\"inline-flex size-11 items-center justify-center rounded-md text-lg hover:bg-accent\"\n onClick={() => setSheetOpen(true)}\n >\n ⋯\n </button>\n <SheetContent\n side=\"bottom\"\n className=\"max-h-[80vh] gap-0 overflow-y-auto pb-[env(safe-area-inset-bottom)]\"\n >\n <SheetHeader className=\"px-4 pt-4 pb-2\">\n <SheetTitle>{t('arqel.actions.menu', 'Actions')}</SheetTitle>\n </SheetHeader>\n <div className=\"flex flex-col px-2 pb-2\">\n {actions.map((action) => (\n <button\n key={action.name}\n type=\"button\"\n data-arqel-sheet-action=\"\"\n disabled={action.disabled === true}\n className={cn(\n 'flex min-h-11 w-full items-center rounded-md px-3 text-left text-sm hover:bg-accent disabled:pointer-events-none disabled:opacity-50',\n action.color === 'destructive' && 'text-destructive',\n )}\n onClick={() => {\n setSheetOpen(false);\n handleSelect(action);\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n </SheetContent>\n </Sheet>\n </div>\n\n {confirmAction && (\n <ConfirmDialog\n open\n onOpenChange={(next) => {\n if (!next) setConfirmAction(null);\n }}\n config={confirmAction.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {formAction && (\n <ActionFormModal\n open\n onOpenChange={(next) => {\n if (!next) setFormAction(null);\n }}\n action={formAction}\n fields={formFieldsByAction[formAction.name] ?? formAction.formFields ?? []}\n onSubmit={(values) => {\n const action = formAction;\n setFormAction(null);\n onInvoke(action, values);\n }}\n processing={processing}\n />\n )}\n </>\n );\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buttonVariants } from './chunk-YF2RINPG.js';
|
|
1
2
|
import { cn } from './chunk-B7ULUJVO.js';
|
|
2
3
|
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
3
4
|
import { useEffect, useState, useCallback } from 'react';
|
|
@@ -21,7 +22,8 @@ function FlashToast({
|
|
|
21
22
|
message,
|
|
22
23
|
onDismiss,
|
|
23
24
|
durationMs = 5e3,
|
|
24
|
-
className
|
|
25
|
+
className,
|
|
26
|
+
downloadUrl
|
|
25
27
|
}) {
|
|
26
28
|
const t = useArqelTranslations();
|
|
27
29
|
useEffect(() => {
|
|
@@ -43,6 +45,16 @@ function FlashToast({
|
|
|
43
45
|
children: [
|
|
44
46
|
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "font-bold leading-5", children: KIND_GLYPH[kind] }),
|
|
45
47
|
/* @__PURE__ */ jsx("span", { className: "flex-1", children: message }),
|
|
48
|
+
typeof downloadUrl === "string" && downloadUrl !== "" && /* @__PURE__ */ jsx(
|
|
49
|
+
"a",
|
|
50
|
+
{
|
|
51
|
+
href: downloadUrl,
|
|
52
|
+
download: true,
|
|
53
|
+
"data-testid": "flash-download-link",
|
|
54
|
+
className: cn(buttonVariants({ variant: "link", size: "xs" }), "h-auto p-0"),
|
|
55
|
+
children: t("arqel.flash.download", "Baixar")
|
|
56
|
+
}
|
|
57
|
+
),
|
|
46
58
|
/* @__PURE__ */ jsx(
|
|
47
59
|
"button",
|
|
48
60
|
{
|
|
@@ -73,7 +85,7 @@ function FlashContainer({
|
|
|
73
85
|
const handleMessage = useCallback((kind, message) => {
|
|
74
86
|
setToasts((prev) => [...prev, { id: ++nextId, kind, message }]);
|
|
75
87
|
}, []);
|
|
76
|
-
useFlash({ onMessage: handleMessage });
|
|
88
|
+
const flash = useFlash({ onMessage: handleMessage });
|
|
77
89
|
const dismiss = (id) => setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
78
90
|
return /* @__PURE__ */ jsx(
|
|
79
91
|
"div",
|
|
@@ -90,6 +102,7 @@ function FlashContainer({
|
|
|
90
102
|
kind: toast.kind,
|
|
91
103
|
message: toast.message,
|
|
92
104
|
durationMs,
|
|
105
|
+
downloadUrl: toast.kind === "success" ? flash.download_url : void 0,
|
|
93
106
|
onDismiss: () => dismiss(toast.id)
|
|
94
107
|
},
|
|
95
108
|
toast.id
|
|
@@ -99,5 +112,5 @@ function FlashContainer({
|
|
|
99
112
|
}
|
|
100
113
|
|
|
101
114
|
export { FlashContainer, FlashToast };
|
|
102
|
-
//# sourceMappingURL=chunk-
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
115
|
+
//# sourceMappingURL=chunk-5ETNGNVM.js.map
|
|
116
|
+
//# sourceMappingURL=chunk-5ETNGNVM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/flash/FlashToast.tsx","../src/flash/FlashContainer.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-5ETNGNVM.js","sourcesContent":["/**\n * `<FlashToast>` — single auto-dismissing toast.\n *\n * Self-rendered (no `sonner` dep) so apps with strict bundle budgets\n * stay lean. Replaceable via FlashContainer's `renderToast` prop when\n * a richer library is preferred.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport { useEffect } from 'react';\nimport { buttonVariants } from '../shadcn/ui/button.js';\nimport { cn } from '../utils/cn.js';\n\nexport type FlashKind = 'success' | 'error' | 'info' | 'warning';\n\nexport interface FlashToastProps {\n kind: FlashKind;\n message: string;\n onDismiss: () => void;\n durationMs?: number;\n className?: string;\n // Accepts `undefined` explicitly (not just an absent key) because\n // FlashContainer passes `download_url` conditionally as\n // `... : undefined` — required under `exactOptionalPropertyTypes`.\n downloadUrl?: string | null | undefined;\n}\n\nconst KIND_CLASSES: Record<FlashKind, string> = {\n success: 'border-[var(--chart-2)]/60 bg-[var(--chart-2)]/15 text-foreground',\n error: 'border-destructive/60 bg-destructive/15 text-foreground',\n warning: 'border-[var(--chart-4)]/60 bg-[var(--chart-4)]/15 text-foreground',\n info: 'border-border bg-muted text-foreground',\n};\n\nconst KIND_GLYPH: Record<FlashKind, string> = {\n success: '✓',\n error: '✗',\n warning: '!',\n info: 'i',\n};\n\nexport function FlashToast({\n kind,\n message,\n onDismiss,\n durationMs = 5000,\n className,\n downloadUrl,\n}: FlashToastProps) {\n const t = useArqelTranslations();\n useEffect(() => {\n if (durationMs <= 0) return undefined;\n const id = window.setTimeout(onDismiss, durationMs);\n return () => window.clearTimeout(id);\n }, [durationMs, onDismiss]);\n\n return (\n <div\n role={kind === 'error' ? 'alert' : 'status'}\n aria-live={kind === 'error' ? 'assertive' : 'polite'}\n className={cn(\n 'pointer-events-auto flex items-start gap-3 rounded-md border px-4 py-3 shadow-md',\n 'min-w-[18rem] max-w-md text-sm',\n KIND_CLASSES[kind],\n className,\n )}\n >\n <span aria-hidden=\"true\" className=\"font-bold leading-5\">\n {KIND_GLYPH[kind]}\n </span>\n <span className=\"flex-1\">{message}</span>\n {typeof downloadUrl === 'string' && downloadUrl !== '' && (\n <a\n href={downloadUrl}\n download\n data-testid=\"flash-download-link\"\n className={cn(buttonVariants({ variant: 'link', size: 'xs' }), 'h-auto p-0')}\n >\n {t('arqel.flash.download', 'Baixar')}\n </a>\n )}\n <button\n type=\"button\"\n aria-label={t('arqel.aria.flash_dismiss', 'Dismiss')}\n onClick={onDismiss}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n </div>\n );\n}\n","/**\n * `<FlashContainer>` — bridges `useFlash()` to a stack of toasts.\n *\n * Subscribes to Inertia shared `flash` and pushes a toast each time a\n * new message of any kind arrives. Toast key is the (kind, message)\n * pair; identical repeats inside the same shared-props snapshot don't\n * duplicate. Defaults to fixed-positioning at top-right; pass `position`\n * to relocate.\n */\n\nimport { type FlashKind, useFlash } from '@arqel-dev/hooks';\nimport { useCallback, useState } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { FlashToast } from './FlashToast.js';\n\ninterface ToastEntry {\n id: number;\n kind: FlashKind;\n message: string;\n}\n\nexport type FlashPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\n\nexport interface FlashContainerProps {\n position?: FlashPosition;\n durationMs?: number;\n className?: string;\n}\n\nconst POSITION_CLASSES: Record<FlashPosition, string> = {\n 'top-right': 'top-4 right-4 items-end',\n 'top-left': 'top-4 left-4 items-start',\n 'bottom-right': 'bottom-4 right-4 items-end',\n 'bottom-left': 'bottom-4 left-4 items-start',\n};\n\nlet nextId = 0;\n\nexport function FlashContainer({\n position = 'top-right',\n durationMs = 5000,\n className,\n}: FlashContainerProps) {\n const [toasts, setToasts] = useState<ToastEntry[]>([]);\n\n const handleMessage = useCallback((kind: FlashKind, message: string) => {\n setToasts((prev) => [...prev, { id: ++nextId, kind, message }]);\n }, []);\n\n const flash = useFlash({ onMessage: handleMessage });\n\n const dismiss = (id: number) => setToasts((prev) => prev.filter((t) => t.id !== id));\n\n return (\n <div\n data-arqel-flash=\"\"\n className={cn(\n 'pointer-events-none fixed z-50 flex flex-col gap-2',\n POSITION_CLASSES[position],\n className,\n )}\n >\n {toasts.map((toast) => (\n <FlashToast\n key={toast.id}\n kind={toast.kind}\n message={toast.message}\n durationMs={durationMs}\n downloadUrl={toast.kind === 'success' ? flash.download_url : undefined}\n onDismiss={() => dismiss(toast.id)}\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { cn } from './chunk-B7ULUJVO.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function Card({ className, ...props }) {
|
|
6
|
+
return /* @__PURE__ */ jsx(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
"data-slot": "card",
|
|
10
|
+
className: cn(
|
|
11
|
+
"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm",
|
|
12
|
+
className
|
|
13
|
+
),
|
|
14
|
+
...props
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
function CardHeader({ className, ...props }) {
|
|
19
|
+
return /* @__PURE__ */ jsx(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
"data-slot": "card-header",
|
|
23
|
+
className: cn(
|
|
24
|
+
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
|
|
25
|
+
className
|
|
26
|
+
),
|
|
27
|
+
...props
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function CardTitle({ className, ...props }) {
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
"data-slot": "card-title",
|
|
36
|
+
className: cn("leading-none font-semibold", className),
|
|
37
|
+
...props
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function CardDescription({ className, ...props }) {
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
"div",
|
|
44
|
+
{
|
|
45
|
+
"data-slot": "card-description",
|
|
46
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
47
|
+
...props
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
function CardAction({ className, ...props }) {
|
|
52
|
+
return /* @__PURE__ */ jsx(
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
"data-slot": "card-action",
|
|
56
|
+
className: cn(
|
|
57
|
+
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
58
|
+
className
|
|
59
|
+
),
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
function CardContent({ className, ...props }) {
|
|
65
|
+
return /* @__PURE__ */ jsx(
|
|
66
|
+
"div",
|
|
67
|
+
{
|
|
68
|
+
"data-slot": "card-content",
|
|
69
|
+
className: cn("px-6", className),
|
|
70
|
+
...props
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
function CardFooter({ className, ...props }) {
|
|
75
|
+
return /* @__PURE__ */ jsx(
|
|
76
|
+
"div",
|
|
77
|
+
{
|
|
78
|
+
"data-slot": "card-footer",
|
|
79
|
+
className: cn("flex items-center px-6 [.border-t]:pt-6", className),
|
|
80
|
+
...props
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
|
|
86
|
+
//# sourceMappingURL=chunk-6YGRTXEL.js.map
|
|
87
|
+
//# sourceMappingURL=chunk-6YGRTXEL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shadcn/ui/card.tsx"],"names":[],"mappings":";;;;AAIA,SAAS,IAAA,CAAK,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAClE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,mFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,0JAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACvE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,MACpD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,gEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC9B,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MACjE,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-6YGRTXEL.js","sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CZUV5WCY.js"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Separator } from './chunk-
|
|
1
|
+
import { Separator } from './chunk-U4MPY2XT.js';
|
|
2
2
|
import { cn } from './chunk-B7ULUJVO.js';
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
-
import { Slot, Checkbox as Checkbox$1, Label as Label$1, Select as Select$1 } from 'radix-ui';
|
|
7
6
|
import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';
|
|
7
|
+
import { Checkbox as Checkbox$1, Label as Label$1, Select as Select$1 } from 'radix-ui';
|
|
8
8
|
|
|
9
9
|
var alertVariants = cva(
|
|
10
10
|
"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
|
|
@@ -64,120 +64,6 @@ function AlertDescription({
|
|
|
64
64
|
}
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
|
-
var badgeVariants = cva(
|
|
68
|
-
"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",
|
|
69
|
-
{
|
|
70
|
-
variants: {
|
|
71
|
-
variant: {
|
|
72
|
-
default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
|
|
73
|
-
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
|
|
74
|
-
destructive: "bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",
|
|
75
|
-
outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
|
76
|
-
ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
|
77
|
-
link: "text-primary underline-offset-4 [a&]:hover:underline"
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
defaultVariants: {
|
|
81
|
-
variant: "default"
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
);
|
|
85
|
-
function Badge({
|
|
86
|
-
className,
|
|
87
|
-
variant = "default",
|
|
88
|
-
asChild = false,
|
|
89
|
-
...props
|
|
90
|
-
}) {
|
|
91
|
-
const Comp = asChild ? Slot.Root : "span";
|
|
92
|
-
return /* @__PURE__ */ jsx(
|
|
93
|
-
Comp,
|
|
94
|
-
{
|
|
95
|
-
"data-slot": "badge",
|
|
96
|
-
"data-variant": variant,
|
|
97
|
-
className: cn(badgeVariants({ variant }), className),
|
|
98
|
-
...props
|
|
99
|
-
}
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
function Card({ className, ...props }) {
|
|
103
|
-
return /* @__PURE__ */ jsx(
|
|
104
|
-
"div",
|
|
105
|
-
{
|
|
106
|
-
"data-slot": "card",
|
|
107
|
-
className: cn(
|
|
108
|
-
"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm",
|
|
109
|
-
className
|
|
110
|
-
),
|
|
111
|
-
...props
|
|
112
|
-
}
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
function CardHeader({ className, ...props }) {
|
|
116
|
-
return /* @__PURE__ */ jsx(
|
|
117
|
-
"div",
|
|
118
|
-
{
|
|
119
|
-
"data-slot": "card-header",
|
|
120
|
-
className: cn(
|
|
121
|
-
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
|
|
122
|
-
className
|
|
123
|
-
),
|
|
124
|
-
...props
|
|
125
|
-
}
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
function CardTitle({ className, ...props }) {
|
|
129
|
-
return /* @__PURE__ */ jsx(
|
|
130
|
-
"div",
|
|
131
|
-
{
|
|
132
|
-
"data-slot": "card-title",
|
|
133
|
-
className: cn("leading-none font-semibold", className),
|
|
134
|
-
...props
|
|
135
|
-
}
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
function CardDescription({ className, ...props }) {
|
|
139
|
-
return /* @__PURE__ */ jsx(
|
|
140
|
-
"div",
|
|
141
|
-
{
|
|
142
|
-
"data-slot": "card-description",
|
|
143
|
-
className: cn("text-sm text-muted-foreground", className),
|
|
144
|
-
...props
|
|
145
|
-
}
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
function CardAction({ className, ...props }) {
|
|
149
|
-
return /* @__PURE__ */ jsx(
|
|
150
|
-
"div",
|
|
151
|
-
{
|
|
152
|
-
"data-slot": "card-action",
|
|
153
|
-
className: cn(
|
|
154
|
-
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
155
|
-
className
|
|
156
|
-
),
|
|
157
|
-
...props
|
|
158
|
-
}
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
function CardContent({ className, ...props }) {
|
|
162
|
-
return /* @__PURE__ */ jsx(
|
|
163
|
-
"div",
|
|
164
|
-
{
|
|
165
|
-
"data-slot": "card-content",
|
|
166
|
-
className: cn("px-6", className),
|
|
167
|
-
...props
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
function CardFooter({ className, ...props }) {
|
|
172
|
-
return /* @__PURE__ */ jsx(
|
|
173
|
-
"div",
|
|
174
|
-
{
|
|
175
|
-
"data-slot": "card-footer",
|
|
176
|
-
className: cn("flex items-center px-6 [.border-t]:pt-6", className),
|
|
177
|
-
...props
|
|
178
|
-
}
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
67
|
function Checkbox({
|
|
182
68
|
className,
|
|
183
69
|
...props
|
|
@@ -605,6 +491,6 @@ function Textarea({ className, ...props }) {
|
|
|
605
491
|
);
|
|
606
492
|
}
|
|
607
493
|
|
|
608
|
-
export { Alert, AlertDescription, AlertTitle,
|
|
609
|
-
//# sourceMappingURL=chunk-
|
|
610
|
-
//# sourceMappingURL=chunk-
|
|
494
|
+
export { Alert, AlertDescription, AlertTitle, Checkbox, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Textarea };
|
|
495
|
+
//# sourceMappingURL=chunk-D2MUCHFN.js.map
|
|
496
|
+
//# sourceMappingURL=chunk-D2MUCHFN.js.map
|