@etus/ui 0.4.0-beta.3 → 0.4.0-beta.4
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/chunk-2HM5Z2YP.js +834 -0
- package/dist/chunk-2HM5Z2YP.js.map +1 -0
- package/dist/{chunk-LMTNDUIP.js → chunk-2Y7PQ6ZL.js} +4 -4
- package/dist/{chunk-LMTNDUIP.js.map → chunk-2Y7PQ6ZL.js.map} +1 -1
- package/dist/{chunk-SAKW2OKH.js → chunk-32IJQOUV.js} +15 -26
- package/dist/chunk-32IJQOUV.js.map +1 -0
- package/dist/{chunk-CXHA5D3I.js → chunk-33JGPMUW.js} +4 -4
- package/dist/{chunk-CXHA5D3I.js.map → chunk-33JGPMUW.js.map} +1 -1
- package/dist/{chunk-JLVL76SW.js → chunk-36XTKR3B.js} +4 -4
- package/dist/{chunk-JLVL76SW.js.map → chunk-36XTKR3B.js.map} +1 -1
- package/dist/{chunk-CUWQUGGB.js → chunk-4GQN76L7.js} +3 -3
- package/dist/{chunk-CUWQUGGB.js.map → chunk-4GQN76L7.js.map} +1 -1
- package/dist/{chunk-7BAL24EU.js → chunk-5XQIH6WM.js} +4 -4
- package/dist/{chunk-7BAL24EU.js.map → chunk-5XQIH6WM.js.map} +1 -1
- package/dist/chunk-5ZWFIDO2.js +3 -0
- package/dist/{chunk-NNOGFX66.js.map → chunk-5ZWFIDO2.js.map} +1 -1
- package/dist/{chunk-CCUCWL6M.js → chunk-AB3S55W5.js} +11 -6
- package/dist/chunk-AB3S55W5.js.map +1 -0
- package/dist/{chunk-43SINRHH.js → chunk-AUCDXPWH.js} +5 -5
- package/dist/{chunk-43SINRHH.js.map → chunk-AUCDXPWH.js.map} +1 -1
- package/dist/{chunk-4HRQX2IA.js → chunk-AWYOWR5N.js} +3 -3
- package/dist/{chunk-4HRQX2IA.js.map → chunk-AWYOWR5N.js.map} +1 -1
- package/dist/{chunk-YTGYSNFR.js → chunk-B4ETIQOO.js} +4 -4
- package/dist/{chunk-YTGYSNFR.js.map → chunk-B4ETIQOO.js.map} +1 -1
- package/dist/{chunk-D5DM6GZB.js → chunk-D6TH3EGA.js} +12 -12
- package/dist/chunk-D6TH3EGA.js.map +1 -0
- package/dist/{chunk-ZJVZ3LQS.js → chunk-DDM2I5C6.js} +3 -3
- package/dist/{chunk-ZJVZ3LQS.js.map → chunk-DDM2I5C6.js.map} +1 -1
- package/dist/{chunk-3JIXCWJO.js → chunk-DDR24GOP.js} +3 -3
- package/dist/{chunk-3JIXCWJO.js.map → chunk-DDR24GOP.js.map} +1 -1
- package/dist/{chunk-GBTVAO4V.js → chunk-EGYWK2XX.js} +3 -3
- package/dist/{chunk-GBTVAO4V.js.map → chunk-EGYWK2XX.js.map} +1 -1
- package/dist/{chunk-KNH7JW6E.js → chunk-IBVCSZCH.js} +3 -3
- package/dist/{chunk-KNH7JW6E.js.map → chunk-IBVCSZCH.js.map} +1 -1
- package/dist/{chunk-VJITPUUS.js → chunk-ICM45N2K.js} +4 -4
- package/dist/{chunk-VJITPUUS.js.map → chunk-ICM45N2K.js.map} +1 -1
- package/dist/{chunk-GLEKBJLR.js → chunk-ILAV2AZ4.js} +3 -3
- package/dist/{chunk-GLEKBJLR.js.map → chunk-ILAV2AZ4.js.map} +1 -1
- package/dist/{chunk-MDQFZEIC.js → chunk-J62TFQHR.js} +6 -6
- package/dist/chunk-J62TFQHR.js.map +1 -0
- package/dist/{chunk-AWWBBMMY.js → chunk-JKYB5QAP.js} +5 -5
- package/dist/{chunk-AWWBBMMY.js.map → chunk-JKYB5QAP.js.map} +1 -1
- package/dist/{chunk-UKC3Q6OA.js → chunk-JMZ4CO6R.js} +3 -3
- package/dist/{chunk-UKC3Q6OA.js.map → chunk-JMZ4CO6R.js.map} +1 -1
- package/dist/{chunk-POZNQWZE.js → chunk-KC6CHPT3.js} +4 -4
- package/dist/{chunk-POZNQWZE.js.map → chunk-KC6CHPT3.js.map} +1 -1
- package/dist/{chunk-4J6DHPYY.js → chunk-KPNNSUXM.js} +3 -3
- package/dist/{chunk-4J6DHPYY.js.map → chunk-KPNNSUXM.js.map} +1 -1
- package/dist/{chunk-RPV77BCQ.js → chunk-ONQCNOLU.js} +4 -9
- package/dist/chunk-ONQCNOLU.js.map +1 -0
- package/dist/{chunk-QSY52N3A.js → chunk-OWOVCGUZ.js} +3 -3
- package/dist/{chunk-QSY52N3A.js.map → chunk-OWOVCGUZ.js.map} +1 -1
- package/dist/{chunk-QWRHPNBY.js → chunk-QIETN4UU.js} +4 -4
- package/dist/{chunk-QWRHPNBY.js.map → chunk-QIETN4UU.js.map} +1 -1
- package/dist/{chunk-NWFRMVI2.js → chunk-QZWKXUZP.js} +3 -3
- package/dist/{chunk-NWFRMVI2.js.map → chunk-QZWKXUZP.js.map} +1 -1
- package/dist/{chunk-7QDWREVG.js → chunk-R4UOT76L.js} +3 -3
- package/dist/{chunk-7QDWREVG.js.map → chunk-R4UOT76L.js.map} +1 -1
- package/dist/{chunk-HIEOL77G.js → chunk-RVUO7SDG.js} +4 -4
- package/dist/{chunk-HIEOL77G.js.map → chunk-RVUO7SDG.js.map} +1 -1
- package/dist/{chunk-XPVKJIWY.js → chunk-SCGKQ5RE.js} +3 -3
- package/dist/{chunk-XPVKJIWY.js.map → chunk-SCGKQ5RE.js.map} +1 -1
- package/dist/{chunk-UCGT2IR4.js → chunk-SJSYKUCL.js} +3 -3
- package/dist/{chunk-UCGT2IR4.js.map → chunk-SJSYKUCL.js.map} +1 -1
- package/dist/{chunk-KOTCWE7V.js → chunk-TNROOKX3.js} +11 -4
- package/dist/chunk-TNROOKX3.js.map +1 -0
- package/dist/{chunk-PGTCXLGY.js → chunk-U6EOAIPK.js} +3 -3
- package/dist/chunk-U6EOAIPK.js.map +1 -0
- package/dist/{chunk-KXSJSLPJ.js → chunk-V7XHE25E.js} +4 -4
- package/dist/{chunk-KXSJSLPJ.js.map → chunk-V7XHE25E.js.map} +1 -1
- package/dist/{chunk-FUCQNVJL.js → chunk-XLTSCY22.js} +10 -7
- package/dist/chunk-XLTSCY22.js.map +1 -0
- package/dist/{chunk-K3J7YLL4.js → chunk-XOGMDABS.js} +5 -6
- package/dist/chunk-XOGMDABS.js.map +1 -0
- package/dist/{chunk-53RWD44Z.js → chunk-XRMKL43Y.js} +3 -3
- package/dist/{chunk-53RWD44Z.js.map → chunk-XRMKL43Y.js.map} +1 -1
- package/dist/{chunk-DZALMUQD.js → chunk-Y3BOERVB.js} +3 -3
- package/dist/{chunk-DZALMUQD.js.map → chunk-Y3BOERVB.js.map} +1 -1
- package/dist/{chunk-AV5YQ2Z4.js → chunk-Y7UFBSAD.js} +3 -3
- package/dist/{chunk-AV5YQ2Z4.js.map → chunk-Y7UFBSAD.js.map} +1 -1
- package/dist/{chunk-HNYBLROK.js → chunk-YP2ATSXP.js} +11 -28
- package/dist/chunk-YP2ATSXP.js.map +1 -0
- package/dist/{chunk-75QBUI2P.js → chunk-ZO2EKJZM.js} +16 -8
- package/dist/chunk-ZO2EKJZM.js.map +1 -0
- package/dist/{chunk-VOCA4KZB.js → chunk-ZS2WS5NJ.js} +4 -4
- package/dist/{chunk-VOCA4KZB.js.map → chunk-ZS2WS5NJ.js.map} +1 -1
- package/dist/components/advanced/Calendar/index.js +3 -3
- package/dist/components/advanced/EventCalendar/index.js +3 -3
- package/dist/components/advanced/FilterBuilder/index.js +3 -3
- package/dist/components/advanced/ReportBuilder/index.js +11 -0
- package/dist/components/advanced/ReportBuilder/index.js.map +1 -0
- package/dist/components/advanced/index.js +12 -8
- package/dist/components/data-display/Callout/index.js +1 -1
- package/dist/components/data-display/Carousel/index.js +3 -3
- package/dist/components/data-display/ChartCard/index.js +2 -2
- package/dist/components/data-display/DashboardFilterbar/index.js +5 -5
- package/dist/components/data-display/DataTable/FilterBuilder/index.js +3 -3
- package/dist/components/data-display/DataTable/index.js +5 -5
- package/dist/components/data-display/KPICard/index.js +3 -2
- package/dist/components/data-display/List/index.js +3 -3
- package/dist/components/data-display/SingleStat/index.js +1 -1
- package/dist/components/data-display/VirtualTable/index.js +2 -2
- package/dist/components/data-display/index.js +30 -30
- package/dist/components/feedback/AlertDialog/index.js +3 -3
- package/dist/components/feedback/ConfirmModal/index.js +4 -4
- package/dist/components/feedback/Notification/index.js +2 -2
- package/dist/components/feedback/index.js +8 -8
- package/dist/components/forms/DatePicker/index.js +4 -4
- package/dist/components/forms/DateRangePicker/index.js +4 -4
- package/dist/components/forms/Field/index.js +2 -2
- package/dist/components/forms/Form/index.js +2 -2
- package/dist/components/forms/InputGroup/index.js +4 -4
- package/dist/components/forms/InputOTPField/index.js +3 -3
- package/dist/components/forms/NativeSelect/index.js +1 -1
- package/dist/components/forms/TagsInput/index.js +2 -2
- package/dist/components/forms/Textarea/index.js +1 -1
- package/dist/components/forms/TextareaField/index.js +4 -4
- package/dist/components/forms/index.js +28 -28
- package/dist/components/index.js +97 -96
- package/dist/components/layout/index.js +2 -2
- package/dist/components/navigation/AccountSwitch/index.js +3 -3
- package/dist/components/navigation/MobileSidebar/index.js +2 -2
- package/dist/components/navigation/Pagination/index.js +3 -3
- package/dist/components/navigation/Sidebar/index.js +4 -4
- package/dist/components/navigation/index.js +11 -11
- package/dist/components/primitives/Avatar/index.js +1 -1
- package/dist/components/primitives/Badge/index.js +1 -1
- package/dist/components/primitives/Button/index.js +2 -2
- package/dist/components/primitives/ConfirmButton/index.js +4 -4
- package/dist/components/primitives/Label/index.js +1 -1
- package/dist/components/primitives/SplitButton/index.js +1 -1
- package/dist/components/primitives/index.js +13 -13
- package/dist/components/workflow/ApprovalFlow/index.js +4 -4
- package/dist/components/workflow/CommentSystem/index.js +5 -5
- package/dist/components/workflow/Dashboard/index.js +3 -3
- package/dist/components/workflow/DashboardBuilder/index.js +4 -4
- package/dist/components/workflow/KanbanBoard/index.js +4 -4
- package/dist/components/workflow/ReportGenerator/index.js +4 -4
- package/dist/components/workflow/Wizard/index.js +3 -3
- package/dist/components/workflow/index.js +14 -14
- package/dist/fonts/inter-OFL.txt +92 -0
- package/dist/fonts/inter-latin-400-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-500-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-600-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-700-normal.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-OFL.txt +93 -0
- package/dist/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
- package/dist/index.d.ts +114 -27
- package/dist/index.js +97 -96
- package/dist/styles.css +284 -7
- package/package.json +2 -2
- package/dist/chunk-75QBUI2P.js.map +0 -1
- package/dist/chunk-CCUCWL6M.js.map +0 -1
- package/dist/chunk-D5DM6GZB.js.map +0 -1
- package/dist/chunk-FUCQNVJL.js.map +0 -1
- package/dist/chunk-HNYBLROK.js.map +0 -1
- package/dist/chunk-K3J7YLL4.js.map +0 -1
- package/dist/chunk-KOTCWE7V.js.map +0 -1
- package/dist/chunk-MDQFZEIC.js.map +0 -1
- package/dist/chunk-NNOGFX66.js +0 -3
- package/dist/chunk-PGTCXLGY.js.map +0 -1
- package/dist/chunk-RPV77BCQ.js.map +0 -1
- package/dist/chunk-SAKW2OKH.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/advanced/FilterBuilder/FilterBuilder.types.ts","../src/components/advanced/FilterBuilder/FilterBuilder.variants.ts","../src/components/advanced/FilterBuilder/FilterBuilder.tsx"],"names":["rulesCount"],"mappings":"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","file":"chunk-4HRQX2IA.js","sourcesContent":["// FilterBuilder/FilterBuilder.types.ts\n\nimport type { filterBuilderVariants } from \"./FilterBuilder.variants\"\nimport type { VariantProps } from \"class-variance-authority\"\n\n// ============================================\n// OPERATOR TYPES\n// ============================================\n\n/**\n * Available operator types for filter rules\n */\nexport type OperatorType =\n | \"between\"\n | \"contains\"\n | \"ends_with\"\n | \"equals\"\n | \"greater_than\"\n | \"greater_than_or_equal\"\n | \"in\"\n | \"is_empty\"\n | \"is_not_empty\"\n | \"less_than\"\n | \"less_than_or_equal\"\n | \"not_equals\"\n | \"not_in\"\n | \"starts_with\"\n\n/**\n * Field types that determine available operators\n */\nexport type FieldType = \"boolean\" | \"date\" | \"number\" | \"select\" | \"string\"\n\n// ============================================\n// DATA STRUCTURES\n// ============================================\n\n/**\n * Option for select-type fields\n */\nexport interface FieldOption {\n /** Display label */\n label: string\n /** Option value */\n value: string\n}\n\n/**\n * Field definition for available filter fields\n */\nexport interface FieldDefinition {\n /** Display label */\n label: string\n /** Unique field identifier */\n name: string\n /** Override default operators for this field */\n operators?: OperatorType[]\n /** Options for select-type fields */\n options?: FieldOption[]\n /** Field data type */\n type: FieldType\n}\n\n/**\n * Individual filter rule\n */\nexport interface FilterRule {\n /** Field name to filter */\n field: string\n /** Unique rule identifier */\n id: string\n /** Operator to apply */\n operator: \"\" | OperatorType\n /** Filter value(s) */\n value: unknown\n}\n\n/**\n * Group of rules with logical combinator\n */\nexport interface FilterGroup {\n /** Logical combinator (and/or) */\n combinator: \"and\" | \"or\"\n /** Unique group identifier */\n id: string\n /** Rules and/or nested groups */\n rules: (FilterGroup | FilterRule)[]\n}\n\n// ============================================\n// EVENT PAYLOADS\n// ============================================\n\n/**\n * Event payload for filter changes\n */\nexport interface FilterBuilderEventPayload {\n /** The updated filter structure */\n filter: FilterGroup\n /** Timestamp of the event */\n timestamp: number\n}\n\n/**\n * Event payload for rule changes\n */\nexport interface FilterRuleEventPayload {\n /** Path to the rule in the filter structure */\n path: string[]\n /** The rule that changed */\n rule: FilterRule\n /** Timestamp of the event */\n timestamp: number\n}\n\n// ============================================\n// COMPONENT PROPS\n// ============================================\n\n/**\n * Props for the FilterBuilder root component\n */\nexport interface FilterBuilderProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\">,\n VariantProps<typeof filterBuilderVariants> {\n /** Additional CSS classes */\n className?: string\n /** Available fields for filtering */\n fields: FieldDefinition[]\n /** Maximum nesting depth for groups */\n maxDepth?: number\n /** Maximum number of rules allowed */\n maxRules?: number\n /** Callback when filters are applied */\n onApply?: (filter: FilterGroup) => void\n /** Callback when filter changes */\n onChange?: (filter: FilterGroup) => void\n /** Callback when filters are cleared */\n onClear?: () => void\n /** Show preview of the resulting query */\n showPreview?: boolean\n /** Current filter value (controlled) */\n value?: FilterGroup\n}\n\n/**\n * Props for FilterGroup component\n */\nexport interface FilterGroupProps {\n /** Current nesting depth */\n depth: number\n /** Available fields */\n fields: FieldDefinition[]\n /** The group data */\n group: FilterGroup\n /** Whether this is the root group */\n isRoot?: boolean\n /** Maximum nesting depth */\n maxDepth: number\n /** Maximum number of rules */\n maxRules: number\n /** Callback when group changes */\n onChange: (group: FilterGroup) => void\n /** Callback when group is removed */\n onRemove?: () => void\n /** Current total rules count */\n rulesCount: number\n}\n\n/**\n * Props for FilterRule component\n */\nexport interface FilterRuleProps {\n /** Available fields */\n fields: FieldDefinition[]\n /** Callback when rule changes */\n onChange: (rule: FilterRule) => void\n /** Callback when rule is removed */\n onRemove: () => void\n /** The rule data */\n rule: FilterRule\n}\n\n/**\n * Props for FilterToolbar component\n */\nexport interface FilterToolbarProps {\n /** Whether adding groups is disabled (max depth reached) */\n canAddGroup: boolean\n /** Whether adding rules is disabled (max reached) */\n canAddRule: boolean\n /** Whether there are rules to clear */\n hasRules: boolean\n /** Callback to add a new group */\n onAddGroup: () => void\n /** Callback to add a new rule */\n onAddRule: () => void\n /** Callback to apply filters */\n onApply?: () => void\n /** Callback to clear all rules */\n onClear?: () => void\n}\n\n/**\n * Props for FilterPreview component\n */\nexport interface FilterPreviewProps {\n /** Available fields (for label lookup) */\n fields: FieldDefinition[]\n /** The filter to preview */\n filter: FilterGroup\n}\n\n// ============================================\n// UTILITY TYPES\n// ============================================\n\n/**\n * Default operators by field type\n */\nexport type OperatorsByType = Record<FieldType, OperatorType[]>\n\n/**\n * Operator display info\n */\nexport interface OperatorInfo {\n /** Display label */\n label: string\n /** Operator value */\n value: OperatorType\n}\n\n/**\n * Check if an item is a FilterGroup\n */\nexport function isFilterGroup(\n item: FilterGroup | FilterRule\n): item is FilterGroup {\n return \"combinator\" in item && \"rules\" in item\n}\n\n/**\n * Check if an item is a FilterRule\n */\nexport function isFilterRule(\n item: FilterGroup | FilterRule\n): item is FilterRule {\n return \"field\" in item && \"operator\" in item\n}\n","// FilterBuilder/FilterBuilder.variants.ts\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\n// Common style constants\nconst ROUNDED_MD = \"rounded-md\"\n\n/**\n * FilterBuilder root container variants\n */\nexport const filterBuilderVariants = cva(\n [\n \"w-full\",\n \"rounded-lg\",\n \"border border-border\",\n \"bg-background\",\n ],\n {\n variants: {\n size: {\n sm: \"p-3 text-sm\",\n default: \"p-4 text-sm\",\n lg: \"p-6 text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * FilterGroup container variants\n */\nexport const filterGroupVariants = cva(\n [\n \"relative\",\n ROUNDED_MD,\n \"border border-border\",\n \"bg-muted/30\",\n ],\n {\n variants: {\n size: {\n sm: \"p-2 gap-2\",\n default: \"p-4 gap-3\",\n lg: \"p-5 gap-4\",\n },\n isRoot: {\n true: \"border-0 bg-transparent p-0\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isRoot: false,\n },\n }\n)\n\n/**\n * FilterGroup header (combinator toggle) variants\n */\nexport const filterGroupHeaderVariants = cva(\n [\n \"flex items-center\",\n \"font-medium\",\n ],\n {\n variants: {\n size: {\n sm: \"gap-1.5 text-xs mb-2\",\n default: \"gap-2 text-sm mb-3\",\n lg: \"gap-3 text-base mb-4\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Combinator toggle button variants\n */\nexport const combinatorToggleVariants = cva(\n [\n \"inline-flex items-center justify-center\",\n ROUNDED_MD,\n \"font-semibold uppercase tracking-wide\",\n \"transition-colors duration-200\",\n \"cursor-pointer\",\n \"select-none\",\n ],\n {\n variants: {\n size: {\n sm: \"px-2 py-0.5 text-xs min-w-9\",\n default: \"px-2.5 py-1 text-xs min-w-11\",\n lg: \"px-3 py-1.5 text-sm min-w-14\",\n },\n active: {\n true: \"bg-primary text-primary-foreground\",\n false: \"bg-muted text-muted-foreground hover:bg-muted/80\",\n },\n },\n defaultVariants: {\n size: \"default\",\n active: false,\n },\n }\n)\n\n/**\n * FilterRule container variants\n */\nexport const filterRuleVariants = cva(\n [\n \"flex items-start\",\n ROUNDED_MD,\n \"bg-background\",\n \"border border-border\",\n \"transition-all duration-200\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-1\",\n ],\n {\n variants: {\n size: {\n sm: \"p-2 gap-1.5\",\n default: \"p-3 gap-2\",\n lg: \"p-4 gap-3\",\n },\n invalid: {\n true: \"border-destructive\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n invalid: false,\n },\n }\n)\n\n/**\n * Rule field select variants\n */\nexport const ruleFieldVariants = cva(\n [\n \"flex-shrink-0\",\n ],\n {\n variants: {\n size: {\n sm: \"w-32\",\n default: \"w-40\",\n lg: \"w-52\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Rule operator select variants\n */\nexport const ruleOperatorVariants = cva(\n [\n \"flex-shrink-0\",\n ],\n {\n variants: {\n size: {\n sm: \"w-24\",\n default: \"w-36\",\n lg: \"w-44\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Rule value input variants\n */\nexport const ruleValueVariants = cva(\n [\n \"flex-1 min-w-0\",\n ],\n {\n variants: {\n size: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Rules container variants\n */\nexport const rulesContainerVariants = cva(\n [\n \"flex flex-col\",\n ],\n {\n variants: {\n size: {\n sm: \"gap-2\",\n default: \"gap-3\",\n lg: \"gap-4\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * FilterToolbar variants\n */\nexport const filterToolbarVariants = cva(\n [\n \"flex items-center justify-between\",\n \"pt-3 mt-3\",\n \"border-t border-border\",\n ],\n {\n variants: {\n size: {\n sm: \"gap-2\",\n default: \"gap-3\",\n lg: \"gap-4\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * FilterPreview variants\n */\nexport const filterPreviewVariants = cva(\n [\n ROUNDED_MD,\n \"bg-muted/50\",\n \"font-mono\",\n \"overflow-x-auto\",\n ],\n {\n variants: {\n size: {\n sm: \"p-2 text-xs mt-3\",\n default: \"p-3 text-xs mt-4\",\n lg: \"p-4 text-sm mt-5\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Empty state variants\n */\nexport const emptyStateVariants = cva(\n [\n \"flex flex-col items-center justify-center\",\n \"text-muted-foreground\",\n \"border border-dashed border-border\",\n ROUNDED_MD,\n ],\n {\n variants: {\n size: {\n sm: \"py-4 px-3 text-xs gap-1\",\n default: \"py-6 px-4 text-sm gap-2\",\n lg: \"py-8 px-6 text-base gap-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n// ============================================\n// VARIANT PROP TYPES\n// ============================================\n\nexport type FilterBuilderVariantProps = VariantProps<typeof filterBuilderVariants>\nexport type FilterGroupVariantProps = VariantProps<typeof filterGroupVariants>\nexport type FilterRuleVariantProps = VariantProps<typeof filterRuleVariants>\nexport type CombinatorToggleVariantProps = VariantProps<typeof combinatorToggleVariants>\n","// FilterBuilder/FilterBuilder.tsx\n\"use client\"\n\nimport type {\n FieldDefinition,\n FilterBuilderProps,\n FilterGroup,\n FilterGroupProps,\n FilterPreviewProps,\n FilterRule,\n FilterRuleProps,\n FilterToolbarProps,\n OperatorInfo,\n OperatorsByType,\n OperatorType,\n} from \"./FilterBuilder.types\"\n\nimport { PlusIcon, TrashIcon, XIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../forms/Select\"\nimport { TextInput } from \"../../forms/TextInput\"\nimport { Button } from \"../../primitives/Button\"\nimport { isFilterGroup } from \"./FilterBuilder.types\"\nimport {\n combinatorToggleVariants,\n emptyStateVariants,\n filterBuilderVariants,\n filterGroupHeaderVariants,\n filterGroupVariants,\n filterPreviewVariants,\n filterRuleVariants,\n filterToolbarVariants,\n ruleFieldVariants,\n ruleOperatorVariants,\n rulesContainerVariants,\n ruleValueVariants,\n} from \"./FilterBuilder.variants\"\n\n// ============================================\n// CONSTANTS\n// ============================================\n\n/**\n * Default operators available for each field type\n */\nconst DEFAULT_OPERATORS_BY_TYPE: OperatorsByType = {\n boolean: [\"equals\", \"not_equals\"],\n date: [\n \"equals\",\n \"not_equals\",\n \"greater_than\",\n \"less_than\",\n \"between\",\n ],\n number: [\n \"equals\",\n \"not_equals\",\n \"greater_than\",\n \"greater_than_or_equal\",\n \"less_than\",\n \"less_than_or_equal\",\n \"between\",\n ],\n select: [\"equals\", \"not_equals\", \"in\", \"not_in\"],\n string: [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n ],\n}\n\n/**\n * Operator display labels\n */\nconst OPERATOR_LABELS: Record<OperatorType, string> = {\n between: \"between\",\n contains: \"contains\",\n ends_with: \"ends with\",\n equals: \"equals\",\n greater_than: \"greater than\",\n greater_than_or_equal: \"greater than or equal\",\n in: \"is any of\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n less_than: \"less than\",\n less_than_or_equal: \"less than or equal\",\n not_equals: \"does not equal\",\n not_in: \"is none of\",\n starts_with: \"starts with\",\n}\n\n/**\n * Generate a unique ID for rules and groups\n */\nfunction generateId(): string {\n return Math.random().toString(36).slice(2, 11)\n}\n\n/**\n * Create an empty rule\n */\nfunction createEmptyRule(): FilterRule {\n return {\n field: \"\",\n id: generateId(),\n operator: \"\",\n value: \"\",\n }\n}\n\n/**\n * Create an empty group\n */\nfunction createEmptyGroup(): FilterGroup {\n return {\n combinator: \"and\",\n id: generateId(),\n rules: [],\n }\n}\n\n/**\n * Get operators for a field\n */\nfunction getOperatorsForField(\n field: FieldDefinition | undefined\n): OperatorInfo[] {\n if (!field) return []\n\n const operators = field.operators ?? DEFAULT_OPERATORS_BY_TYPE[field.type]\n return operators.map((op) => ({\n label: OPERATOR_LABELS[op],\n value: op,\n }))\n}\n\n/**\n * Count total rules in a filter group (including nested)\n */\nfunction countRules(group: FilterGroup): number {\n return group.rules.reduce((count, item) => {\n if (isFilterGroup(item)) {\n return count + countRules(item)\n }\n return count + 1\n }, 0)\n}\n\n/**\n * Get size for input components\n */\nfunction getInputSize(size: \"default\" | \"lg\" | \"sm\"): \"lg\" | \"md\" | \"sm\" {\n if (size === \"lg\") return \"lg\"\n if (size === \"sm\") return \"sm\"\n return \"md\"\n}\n\n// ============================================\n// CONTEXT\n// ============================================\n\ninterface FilterBuilderContextValue {\n fields: FieldDefinition[]\n size: \"default\" | \"lg\" | \"sm\"\n}\n\nconst FilterBuilderContext = React.createContext<FilterBuilderContextValue>({\n fields: [],\n size: \"default\",\n})\n\nfunction useFilterBuilderContext() {\n return React.use(FilterBuilderContext)\n}\n\n// ============================================\n// VALUE INPUT COMPONENT (extracted to reduce complexity)\n// ============================================\n\ninterface ValueInputProps {\n needsSecondValue: boolean\n onChange: (value: string) => void\n selectedField: FieldDefinition | undefined\n size: \"default\" | \"lg\" | \"sm\"\n value: unknown\n}\n\nfunction ValueInput({\n needsSecondValue,\n onChange,\n selectedField,\n size,\n value,\n}: ValueInputProps) {\n const inputSize = getInputSize(size)\n\n // Select field type\n if (selectedField?.type === \"select\" && selectedField.options) {\n return (\n <Select\n value={value as string}\n onValueChange={onChange}\n >\n <SelectTrigger\n aria-label=\"Select value\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n {selectedField.options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n\n // Boolean field type\n if (selectedField?.type === \"boolean\") {\n return (\n <Select\n value={String(value)}\n onValueChange={onChange}\n >\n <SelectTrigger\n aria-label=\"Select value\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n </SelectContent>\n </Select>\n )\n }\n\n // Between operator (two inputs)\n if (needsSecondValue) {\n const rawArray = Array.isArray(value) ? value : [\"\", \"\"]\n const fromValue = String(rawArray[0] ?? \"\")\n const toValue = String(rawArray[1] ?? \"\")\n return (\n <div className=\"flex items-center gap-2\">\n <TextInput\n aria-label=\"From value\"\n placeholder=\"From\"\n size={inputSize}\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={fromValue}\n onChange={(e) =>\n { onChange(JSON.stringify([e.target.value, toValue])); }\n }\n />\n <span className=\"text-sm text-muted-foreground\">and</span>\n <TextInput\n aria-label=\"To value\"\n placeholder=\"To\"\n size={inputSize}\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={toValue}\n onChange={(e) =>\n { onChange(JSON.stringify([fromValue, e.target.value])); }\n }\n />\n </div>\n )\n }\n\n // Default text/number/date input\n const inputType =\n selectedField?.type === \"number\"\n ? \"number\"\n : selectedField?.type === \"date\"\n ? \"date\"\n : \"text\"\n\n return (\n <TextInput\n aria-label=\"Filter value\"\n placeholder=\"Enter value\"\n size={inputSize}\n type={inputType}\n value={value as string}\n onChange={(e) => { onChange(e.target.value); }}\n />\n )\n}\n\n// ============================================\n// FILTER RULE COMPONENT\n// ============================================\n\nfunction FilterRuleComponent({\n fields,\n onChange,\n onRemove,\n rule,\n}: FilterRuleProps) {\n const { size } = useFilterBuilderContext()\n\n const selectedField = fields.find((f) => f.name === rule.field)\n const operators = getOperatorsForField(selectedField)\n const isInvalid = Boolean(rule.field && !rule.operator)\n const inputSize = getInputSize(size)\n\n const handleFieldChange = (fieldName: string) => {\n const newField = fields.find((f) => f.name === fieldName)\n const newOperators = getOperatorsForField(newField)\n\n onChange({\n ...rule,\n field: fieldName,\n operator: newOperators[0]?.value ?? \"\",\n value: \"\",\n })\n }\n\n const handleOperatorChange = (operator: string) => {\n onChange({\n ...rule,\n operator: operator as OperatorType,\n value: [\"is_empty\", \"is_not_empty\"].includes(operator) ? \"\" : rule.value,\n })\n }\n\n const handleValueChange = (value: string) => {\n onChange({ ...rule, value })\n }\n\n const needsValue = rule.operator && ![\"is_empty\", \"is_not_empty\"].includes(rule.operator)\n const needsSecondValue = rule.operator === \"between\"\n\n return (\n <div\n aria-label={`Filter rule: ${selectedField?.label ?? \"Select field\"}`}\n className={cn(filterRuleVariants({ invalid: isInvalid, size }))}\n data-slot=\"filter-rule\"\n role=\"group\"\n >\n {/* Field Select */}\n <div className={cn(ruleFieldVariants({ size }))}>\n <Select\n value={rule.field}\n onValueChange={handleFieldChange}\n >\n <SelectTrigger\n aria-label=\"Select field\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent>\n {fields.map((field) => (\n <SelectItem key={field.name} value={field.name}>\n {field.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Operator Select */}\n {rule.field && (\n <div className={cn(ruleOperatorVariants({ size }))}>\n <Select\n value={rule.operator}\n onValueChange={handleOperatorChange}\n >\n <SelectTrigger\n aria-label=\"Select operator\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Operator\" />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Value Input */}\n {needsValue && (\n <div className={cn(ruleValueVariants({ size }))}>\n <ValueInput\n needsSecondValue={needsSecondValue}\n selectedField={selectedField}\n size={size}\n value={rule.value}\n onChange={handleValueChange}\n />\n </div>\n )}\n\n {/* Remove Button */}\n <Button\n aria-label=\"Remove rule\"\n className=\"flex-shrink-0 text-muted-foreground hover:text-destructive\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <XIcon className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\n// ============================================\n// FILTER GROUP COMPONENT\n// ============================================\n\nfunction FilterGroupComponent({\n depth,\n fields,\n group,\n isRoot = false,\n maxDepth,\n maxRules,\n onChange,\n onRemove,\n rulesCount,\n}: FilterGroupProps) {\n const { size } = useFilterBuilderContext()\n\n const handleCombinatorChange = (combinator: \"and\" | \"or\") => {\n onChange({ ...group, combinator })\n }\n\n const handleAddRule = () => {\n if (rulesCount >= maxRules) return\n onChange({ ...group, rules: [...group.rules, createEmptyRule()] })\n }\n\n const handleAddGroup = () => {\n if (depth >= maxDepth || rulesCount >= maxRules) return\n onChange({ ...group, rules: [...group.rules, createEmptyGroup()] })\n }\n\n const handleRuleChange = (index: number, updatedItem: FilterGroup | FilterRule) => {\n const newRules = [...group.rules]\n newRules[index] = updatedItem\n onChange({ ...group, rules: newRules })\n }\n\n const handleRemoveItem = (index: number) => {\n onChange({ ...group, rules: group.rules.filter((_, i) => i !== index) })\n }\n\n const canAddRule = rulesCount < maxRules\n const canAddGroup = depth < maxDepth && rulesCount < maxRules\n const buttonSize = size === \"lg\" ? \"default\" : \"sm\"\n\n return (\n <div\n aria-label={`Filter group with ${group.combinator.toUpperCase()} combinator`}\n className={cn(filterGroupVariants({ isRoot, size }))}\n data-slot=\"filter-group\"\n role=\"group\"\n >\n {/* Group Header - Combinator Toggle */}\n {!isRoot && (\n <div className={cn(filterGroupHeaderVariants({ size }))}>\n <div className=\"flex items-center gap-1\">\n <button\n className={cn(\n combinatorToggleVariants({\n active: group.combinator === \"and\",\n size,\n })\n )}\n aria-pressed={group.combinator === \"and\"}\n type=\"button\"\n onClick={() => { handleCombinatorChange(\"and\"); }}\n >\n AND\n </button>\n <button\n className={cn(\n combinatorToggleVariants({\n active: group.combinator === \"or\",\n size,\n })\n )}\n aria-pressed={group.combinator === \"or\"}\n type=\"button\"\n onClick={() => { handleCombinatorChange(\"or\"); }}\n >\n OR\n </button>\n </div>\n\n {onRemove && (\n <Button\n aria-label=\"Remove group\"\n className=\"ml-auto text-muted-foreground hover:text-destructive\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <TrashIcon className=\"size-4\" />\n </Button>\n )}\n </div>\n )}\n\n {/* Rules Container */}\n <div className={cn(rulesContainerVariants({ size }))}>\n {group.rules.length === 0 ? (\n <div className={cn(emptyStateVariants({ size }))}>\n <span>No filters added</span>\n <span className=\"text-xs\">Click "Add Rule" to create a filter</span>\n </div>\n ) : (\n group.rules.map((item, index) => (\n <React.Fragment key={item.id}>\n {/* Combinator Label between rules (not for first item) */}\n {index > 0 && (\n <div className=\"flex items-center gap-2 pl-2\">\n <span className=\"text-xs font-medium uppercase text-muted-foreground\">\n {group.combinator}\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n )}\n\n {isFilterGroup(item) ? (\n <FilterGroupComponent\n depth={depth + 1}\n fields={fields}\n group={item}\n maxDepth={maxDepth}\n maxRules={maxRules}\n rulesCount={rulesCount}\n onChange={(updated) => { handleRuleChange(index, updated); }}\n onRemove={() => { handleRemoveItem(index); }}\n />\n ) : (\n <FilterRuleComponent\n fields={fields}\n rule={item}\n onChange={(updated) => { handleRuleChange(index, updated); }}\n onRemove={() => { handleRemoveItem(index); }}\n />\n )}\n </React.Fragment>\n ))\n )}\n </div>\n\n {/* Add Buttons */}\n <div className=\"mt-2 flex items-center gap-2\">\n <Button\n className=\"gap-1\"\n disabled={!canAddRule}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddRule}\n >\n <PlusIcon className=\"size-3\" />\n Add Rule\n </Button>\n\n {!isRoot && (\n <Button\n className=\"gap-1\"\n disabled={!canAddGroup}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddGroup}\n >\n <PlusIcon className=\"size-3\" />\n Add Group\n </Button>\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// FILTER TOOLBAR COMPONENT\n// ============================================\n\nfunction FilterToolbar({\n canAddGroup,\n canAddRule,\n hasRules,\n onAddGroup,\n onAddRule,\n onApply,\n onClear,\n}: FilterToolbarProps) {\n const { size } = useFilterBuilderContext()\n const buttonSize = size === \"lg\" ? \"default\" : \"sm\"\n\n return (\n <div\n className={cn(filterToolbarVariants({ size }))}\n data-slot=\"filter-toolbar\"\n >\n <div className=\"flex items-center gap-2\">\n <Button\n className=\"gap-1\"\n disabled={!canAddRule}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={onAddRule}\n >\n <PlusIcon className=\"size-3\" />\n Add Rule\n </Button>\n\n <Button\n className=\"gap-1\"\n disabled={!canAddGroup}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={onAddGroup}\n >\n <PlusIcon className=\"size-3\" />\n Add Group\n </Button>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {onClear && hasRules && (\n <Button\n size={buttonSize}\n type=\"button\"\n variant=\"ghost\"\n onClick={onClear}\n >\n Clear All\n </Button>\n )}\n\n {onApply && (\n <Button\n size={buttonSize}\n type=\"button\"\n variant=\"default\"\n onClick={onApply}\n >\n Apply Filters\n </Button>\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// FILTER PREVIEW COMPONENT\n// ============================================\n\nfunction FilterPreview({ fields, filter }: FilterPreviewProps) {\n const { size } = useFilterBuilderContext()\n\n const getFieldLabel = (fieldName: string): string => {\n const field = fields.find((f) => f.name === fieldName)\n return field?.label ?? fieldName\n }\n\n const formatValue = (value: unknown): string => {\n if (Array.isArray(value)) {\n return value.join(\" and \")\n }\n return String(value)\n }\n\n const renderRule = (rule: FilterRule): string => {\n if (!rule.field || !rule.operator) return \"\"\n\n const fieldLabel = getFieldLabel(rule.field)\n // After the check above, rule.operator is guaranteed to be a valid OperatorType\n const operatorLabel = OPERATOR_LABELS[rule.operator]\n\n if ([\"is_empty\", \"is_not_empty\"].includes(rule.operator)) {\n return `${fieldLabel} ${operatorLabel}`\n }\n\n return `${fieldLabel} ${operatorLabel} \"${formatValue(rule.value)}\"`\n }\n\n const renderGroup = (group: FilterGroup): string => {\n const parts = group.rules\n .map((item) => {\n if (isFilterGroup(item)) {\n return `(${renderGroup(item)})`\n }\n return renderRule(item)\n })\n .filter(Boolean)\n\n return parts.join(` ${group.combinator.toUpperCase()} `)\n }\n\n const preview = renderGroup(filter)\n\n if (!preview) {\n return (\n <div\n className={cn(filterPreviewVariants({ size }), \"italic text-muted-foreground\")}\n data-slot=\"filter-preview\"\n >\n No filters defined\n </div>\n )\n }\n\n return (\n <div\n className={cn(filterPreviewVariants({ size }))}\n data-slot=\"filter-preview\"\n >\n <code>{preview}</code>\n </div>\n )\n}\n\n// ============================================\n// MAIN FILTER BUILDER COMPONENT\n// ============================================\n\n/**\n * FilterBuilder - Advanced visual query builder component\n *\n * Allows creating complex filters with multiple conditions,\n * logical operators (AND/OR), nested groups, and various field types.\n *\n * @example\n * ```tsx\n * const fields = [\n * { name: \"name\", label: \"Name\", type: \"string\" },\n * { name: \"age\", label: \"Age\", type: \"number\" },\n * { name: \"status\", label: \"Status\", type: \"select\", options: [\n * { value: \"active\", label: \"Active\" },\n * { value: \"inactive\", label: \"Inactive\" },\n * ]},\n * ]\n *\n * <FilterBuilder\n * fields={fields}\n * value={filter}\n * onChange={setFilter}\n * onApply={(f) => console.log(\"Apply:\", f)}\n * />\n * ```\n */\nfunction FilterBuilder({\n className,\n fields,\n maxDepth = 3,\n maxRules = 20,\n onApply,\n onChange,\n onClear,\n showPreview = false,\n size = \"default\",\n value,\n ...props\n}: FilterBuilderProps) {\n const filter = value ?? createEmptyGroup()\n\n const handleChange = (updatedFilter: FilterGroup) => {\n onChange?.(updatedFilter)\n }\n\n const handleAddRule = () => {\n const rulesCount = countRules(filter)\n if (rulesCount >= maxRules) return\n handleChange({ ...filter, rules: [...filter.rules, createEmptyRule()] })\n }\n\n const handleAddGroup = () => {\n const rulesCount = countRules(filter)\n if (rulesCount >= maxRules) return\n handleChange({ ...filter, rules: [...filter.rules, createEmptyGroup()] })\n }\n\n const handleClear = () => {\n handleChange(createEmptyGroup())\n onClear?.()\n }\n\n const handleApply = () => {\n onApply?.(filter)\n }\n\n const rulesCount = countRules(filter)\n const hasRules = rulesCount > 0\n const canAddRule = rulesCount < maxRules\n const canAddGroup = rulesCount < maxRules\n\n return (\n <FilterBuilderContext value={{ fields, size: size ?? \"default\" }}>\n <div\n aria-label=\"Filter builder\"\n className={cn(filterBuilderVariants({ size }), className)}\n data-slot=\"filter-builder\"\n role=\"region\"\n {...props}\n >\n {/* Main Filter Group */}\n <FilterGroupComponent\n isRoot\n depth={0}\n fields={fields}\n group={filter}\n maxDepth={maxDepth}\n maxRules={maxRules}\n rulesCount={rulesCount}\n onChange={handleChange}\n />\n\n {/* Toolbar */}\n <FilterToolbar\n canAddGroup={canAddGroup}\n canAddRule={canAddRule}\n hasRules={hasRules}\n onAddGroup={handleAddGroup}\n onAddRule={handleAddRule}\n onApply={onApply ? handleApply : undefined}\n onClear={onClear ? handleClear : undefined}\n />\n\n {/* Preview */}\n {showPreview && (\n <FilterPreview fields={fields} filter={filter} />\n )}\n </div>\n </FilterBuilderContext>\n )\n}\n\nFilterBuilder.displayName = \"FilterBuilder\"\n\n// ============================================\n// EXPORTS\n// ============================================\n\nexport {\n FilterBuilder,\n type FilterBuilderProps,\n FilterGroupComponent as FilterGroup,\n type FilterGroupProps,\n FilterPreview,\n type FilterPreviewProps,\n FilterRuleComponent as FilterRule,\n type FilterRuleProps,\n FilterToolbar,\n type FilterToolbarProps,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/advanced/FilterBuilder/FilterBuilder.types.ts","../src/components/advanced/FilterBuilder/FilterBuilder.variants.ts","../src/components/advanced/FilterBuilder/FilterBuilder.tsx"],"names":["rulesCount"],"mappings":"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","file":"chunk-AWYOWR5N.js","sourcesContent":["// FilterBuilder/FilterBuilder.types.ts\n\nimport type { filterBuilderVariants } from \"./FilterBuilder.variants\"\nimport type { VariantProps } from \"class-variance-authority\"\n\n// ============================================\n// OPERATOR TYPES\n// ============================================\n\n/**\n * Available operator types for filter rules\n */\nexport type OperatorType =\n | \"between\"\n | \"contains\"\n | \"ends_with\"\n | \"equals\"\n | \"greater_than\"\n | \"greater_than_or_equal\"\n | \"in\"\n | \"is_empty\"\n | \"is_not_empty\"\n | \"less_than\"\n | \"less_than_or_equal\"\n | \"not_equals\"\n | \"not_in\"\n | \"starts_with\"\n\n/**\n * Field types that determine available operators\n */\nexport type FieldType = \"boolean\" | \"date\" | \"number\" | \"select\" | \"string\"\n\n// ============================================\n// DATA STRUCTURES\n// ============================================\n\n/**\n * Option for select-type fields\n */\nexport interface FieldOption {\n /** Display label */\n label: string\n /** Option value */\n value: string\n}\n\n/**\n * Field definition for available filter fields\n */\nexport interface FieldDefinition {\n /** Display label */\n label: string\n /** Unique field identifier */\n name: string\n /** Override default operators for this field */\n operators?: OperatorType[]\n /** Options for select-type fields */\n options?: FieldOption[]\n /** Field data type */\n type: FieldType\n}\n\n/**\n * Individual filter rule\n */\nexport interface FilterRule {\n /** Field name to filter */\n field: string\n /** Unique rule identifier */\n id: string\n /** Operator to apply */\n operator: \"\" | OperatorType\n /** Filter value(s) */\n value: unknown\n}\n\n/**\n * Group of rules with logical combinator\n */\nexport interface FilterGroup {\n /** Logical combinator (and/or) */\n combinator: \"and\" | \"or\"\n /** Unique group identifier */\n id: string\n /** Rules and/or nested groups */\n rules: (FilterGroup | FilterRule)[]\n}\n\n// ============================================\n// EVENT PAYLOADS\n// ============================================\n\n/**\n * Event payload for filter changes\n */\nexport interface FilterBuilderEventPayload {\n /** The updated filter structure */\n filter: FilterGroup\n /** Timestamp of the event */\n timestamp: number\n}\n\n/**\n * Event payload for rule changes\n */\nexport interface FilterRuleEventPayload {\n /** Path to the rule in the filter structure */\n path: string[]\n /** The rule that changed */\n rule: FilterRule\n /** Timestamp of the event */\n timestamp: number\n}\n\n// ============================================\n// COMPONENT PROPS\n// ============================================\n\n/**\n * Props for the FilterBuilder root component\n */\nexport interface FilterBuilderProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\">,\n VariantProps<typeof filterBuilderVariants> {\n /** Additional CSS classes */\n className?: string\n /** Available fields for filtering */\n fields: FieldDefinition[]\n /** Maximum nesting depth for groups */\n maxDepth?: number\n /** Maximum number of rules allowed */\n maxRules?: number\n /** Callback when filters are applied */\n onApply?: (filter: FilterGroup) => void\n /** Callback when filter changes */\n onChange?: (filter: FilterGroup) => void\n /** Callback when filters are cleared */\n onClear?: () => void\n /** Show preview of the resulting query */\n showPreview?: boolean\n /** Current filter value (controlled) */\n value?: FilterGroup\n}\n\n/**\n * Props for FilterGroup component\n */\nexport interface FilterGroupProps {\n /** Current nesting depth */\n depth: number\n /** Available fields */\n fields: FieldDefinition[]\n /** The group data */\n group: FilterGroup\n /** Whether this is the root group */\n isRoot?: boolean\n /** Maximum nesting depth */\n maxDepth: number\n /** Maximum number of rules */\n maxRules: number\n /** Callback when group changes */\n onChange: (group: FilterGroup) => void\n /** Callback when group is removed */\n onRemove?: () => void\n /** Current total rules count */\n rulesCount: number\n}\n\n/**\n * Props for FilterRule component\n */\nexport interface FilterRuleProps {\n /** Available fields */\n fields: FieldDefinition[]\n /** Callback when rule changes */\n onChange: (rule: FilterRule) => void\n /** Callback when rule is removed */\n onRemove: () => void\n /** The rule data */\n rule: FilterRule\n}\n\n/**\n * Props for FilterToolbar component\n */\nexport interface FilterToolbarProps {\n /** Whether adding groups is disabled (max depth reached) */\n canAddGroup: boolean\n /** Whether adding rules is disabled (max reached) */\n canAddRule: boolean\n /** Whether there are rules to clear */\n hasRules: boolean\n /** Callback to add a new group */\n onAddGroup: () => void\n /** Callback to add a new rule */\n onAddRule: () => void\n /** Callback to apply filters */\n onApply?: () => void\n /** Callback to clear all rules */\n onClear?: () => void\n}\n\n/**\n * Props for FilterPreview component\n */\nexport interface FilterPreviewProps {\n /** Available fields (for label lookup) */\n fields: FieldDefinition[]\n /** The filter to preview */\n filter: FilterGroup\n}\n\n// ============================================\n// UTILITY TYPES\n// ============================================\n\n/**\n * Default operators by field type\n */\nexport type OperatorsByType = Record<FieldType, OperatorType[]>\n\n/**\n * Operator display info\n */\nexport interface OperatorInfo {\n /** Display label */\n label: string\n /** Operator value */\n value: OperatorType\n}\n\n/**\n * Check if an item is a FilterGroup\n */\nexport function isFilterGroup(\n item: FilterGroup | FilterRule\n): item is FilterGroup {\n return \"combinator\" in item && \"rules\" in item\n}\n\n/**\n * Check if an item is a FilterRule\n */\nexport function isFilterRule(\n item: FilterGroup | FilterRule\n): item is FilterRule {\n return \"field\" in item && \"operator\" in item\n}\n","// FilterBuilder/FilterBuilder.variants.ts\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\n// Common style constants\nconst ROUNDED_MD = \"rounded-md\"\n\n/**\n * FilterBuilder root container variants\n */\nexport const filterBuilderVariants = cva(\n [\n \"w-full\",\n \"rounded-lg\",\n \"border border-border\",\n \"bg-background\",\n ],\n {\n variants: {\n size: {\n sm: \"p-3 text-sm\",\n default: \"p-4 text-sm\",\n lg: \"p-6 text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * FilterGroup container variants\n */\nexport const filterGroupVariants = cva(\n [\n \"relative\",\n ROUNDED_MD,\n \"border border-border\",\n \"bg-muted/30\",\n ],\n {\n variants: {\n size: {\n sm: \"p-2 gap-2\",\n default: \"p-4 gap-3\",\n lg: \"p-5 gap-4\",\n },\n isRoot: {\n true: \"border-0 bg-transparent p-0\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isRoot: false,\n },\n }\n)\n\n/**\n * FilterGroup header (combinator toggle) variants\n */\nexport const filterGroupHeaderVariants = cva(\n [\n \"flex items-center\",\n \"font-medium\",\n ],\n {\n variants: {\n size: {\n sm: \"gap-1.5 text-xs mb-2\",\n default: \"gap-2 text-sm mb-3\",\n lg: \"gap-3 text-base mb-4\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Combinator toggle button variants\n */\nexport const combinatorToggleVariants = cva(\n [\n \"inline-flex items-center justify-center\",\n ROUNDED_MD,\n \"font-semibold uppercase tracking-wide\",\n \"transition-colors duration-200\",\n \"cursor-pointer\",\n \"select-none\",\n ],\n {\n variants: {\n size: {\n sm: \"px-2 py-0.5 text-xs min-w-9\",\n default: \"px-2.5 py-1 text-xs min-w-11\",\n lg: \"px-3 py-1.5 text-sm min-w-14\",\n },\n active: {\n true: \"bg-primary text-primary-foreground\",\n false: \"bg-muted text-muted-foreground hover:bg-muted/80\",\n },\n },\n defaultVariants: {\n size: \"default\",\n active: false,\n },\n }\n)\n\n/**\n * FilterRule container variants\n */\nexport const filterRuleVariants = cva(\n [\n \"flex items-start\",\n ROUNDED_MD,\n \"bg-background\",\n \"border border-border\",\n \"transition-all duration-200\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-1\",\n ],\n {\n variants: {\n size: {\n sm: \"p-2 gap-1.5\",\n default: \"p-3 gap-2\",\n lg: \"p-4 gap-3\",\n },\n invalid: {\n true: \"border-destructive\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n invalid: false,\n },\n }\n)\n\n/**\n * Rule field select variants\n */\nexport const ruleFieldVariants = cva(\n [\n \"flex-shrink-0\",\n ],\n {\n variants: {\n size: {\n sm: \"w-32\",\n default: \"w-40\",\n lg: \"w-52\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Rule operator select variants\n */\nexport const ruleOperatorVariants = cva(\n [\n \"flex-shrink-0\",\n ],\n {\n variants: {\n size: {\n sm: \"w-24\",\n default: \"w-36\",\n lg: \"w-44\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Rule value input variants\n */\nexport const ruleValueVariants = cva(\n [\n \"flex-1 min-w-0\",\n ],\n {\n variants: {\n size: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Rules container variants\n */\nexport const rulesContainerVariants = cva(\n [\n \"flex flex-col\",\n ],\n {\n variants: {\n size: {\n sm: \"gap-2\",\n default: \"gap-3\",\n lg: \"gap-4\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * FilterToolbar variants\n */\nexport const filterToolbarVariants = cva(\n [\n \"flex items-center justify-between\",\n \"pt-3 mt-3\",\n \"border-t border-border\",\n ],\n {\n variants: {\n size: {\n sm: \"gap-2\",\n default: \"gap-3\",\n lg: \"gap-4\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * FilterPreview variants\n */\nexport const filterPreviewVariants = cva(\n [\n ROUNDED_MD,\n \"bg-muted/50\",\n \"font-mono\",\n \"overflow-x-auto\",\n ],\n {\n variants: {\n size: {\n sm: \"p-2 text-xs mt-3\",\n default: \"p-3 text-xs mt-4\",\n lg: \"p-4 text-sm mt-5\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/**\n * Empty state variants\n */\nexport const emptyStateVariants = cva(\n [\n \"flex flex-col items-center justify-center\",\n \"text-muted-foreground\",\n \"border border-dashed border-border\",\n ROUNDED_MD,\n ],\n {\n variants: {\n size: {\n sm: \"py-4 px-3 text-xs gap-1\",\n default: \"py-6 px-4 text-sm gap-2\",\n lg: \"py-8 px-6 text-base gap-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n// ============================================\n// VARIANT PROP TYPES\n// ============================================\n\nexport type FilterBuilderVariantProps = VariantProps<typeof filterBuilderVariants>\nexport type FilterGroupVariantProps = VariantProps<typeof filterGroupVariants>\nexport type FilterRuleVariantProps = VariantProps<typeof filterRuleVariants>\nexport type CombinatorToggleVariantProps = VariantProps<typeof combinatorToggleVariants>\n","// FilterBuilder/FilterBuilder.tsx\n\"use client\"\n\nimport type {\n FieldDefinition,\n FilterBuilderProps,\n FilterGroup,\n FilterGroupProps,\n FilterPreviewProps,\n FilterRule,\n FilterRuleProps,\n FilterToolbarProps,\n OperatorInfo,\n OperatorsByType,\n OperatorType,\n} from \"./FilterBuilder.types\"\n\nimport { PlusIcon, TrashIcon, XIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../forms/Select\"\nimport { TextInput } from \"../../forms/TextInput\"\nimport { Button } from \"../../primitives/Button\"\nimport { isFilterGroup } from \"./FilterBuilder.types\"\nimport {\n combinatorToggleVariants,\n emptyStateVariants,\n filterBuilderVariants,\n filterGroupHeaderVariants,\n filterGroupVariants,\n filterPreviewVariants,\n filterRuleVariants,\n filterToolbarVariants,\n ruleFieldVariants,\n ruleOperatorVariants,\n rulesContainerVariants,\n ruleValueVariants,\n} from \"./FilterBuilder.variants\"\n\n// ============================================\n// CONSTANTS\n// ============================================\n\n/**\n * Default operators available for each field type\n */\nconst DEFAULT_OPERATORS_BY_TYPE: OperatorsByType = {\n boolean: [\"equals\", \"not_equals\"],\n date: [\n \"equals\",\n \"not_equals\",\n \"greater_than\",\n \"less_than\",\n \"between\",\n ],\n number: [\n \"equals\",\n \"not_equals\",\n \"greater_than\",\n \"greater_than_or_equal\",\n \"less_than\",\n \"less_than_or_equal\",\n \"between\",\n ],\n select: [\"equals\", \"not_equals\", \"in\", \"not_in\"],\n string: [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n ],\n}\n\n/**\n * Operator display labels\n */\nconst OPERATOR_LABELS: Record<OperatorType, string> = {\n between: \"between\",\n contains: \"contains\",\n ends_with: \"ends with\",\n equals: \"equals\",\n greater_than: \"greater than\",\n greater_than_or_equal: \"greater than or equal\",\n in: \"is any of\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n less_than: \"less than\",\n less_than_or_equal: \"less than or equal\",\n not_equals: \"does not equal\",\n not_in: \"is none of\",\n starts_with: \"starts with\",\n}\n\n/**\n * Generate a unique ID for rules and groups\n */\nfunction generateId(): string {\n return Math.random().toString(36).slice(2, 11)\n}\n\n/**\n * Create an empty rule\n */\nfunction createEmptyRule(): FilterRule {\n return {\n field: \"\",\n id: generateId(),\n operator: \"\",\n value: \"\",\n }\n}\n\n/**\n * Create an empty group\n */\nfunction createEmptyGroup(): FilterGroup {\n return {\n combinator: \"and\",\n id: generateId(),\n rules: [],\n }\n}\n\n/**\n * Get operators for a field\n */\nfunction getOperatorsForField(\n field: FieldDefinition | undefined\n): OperatorInfo[] {\n if (!field) return []\n\n const operators = field.operators ?? DEFAULT_OPERATORS_BY_TYPE[field.type]\n return operators.map((op) => ({\n label: OPERATOR_LABELS[op],\n value: op,\n }))\n}\n\n/**\n * Count total rules in a filter group (including nested)\n */\nfunction countRules(group: FilterGroup): number {\n return group.rules.reduce((count, item) => {\n if (isFilterGroup(item)) {\n return count + countRules(item)\n }\n return count + 1\n }, 0)\n}\n\n/**\n * Get size for input components\n */\nfunction getInputSize(size: \"default\" | \"lg\" | \"sm\"): \"lg\" | \"md\" | \"sm\" {\n if (size === \"lg\") return \"lg\"\n if (size === \"sm\") return \"sm\"\n return \"md\"\n}\n\n// ============================================\n// CONTEXT\n// ============================================\n\ninterface FilterBuilderContextValue {\n fields: FieldDefinition[]\n size: \"default\" | \"lg\" | \"sm\"\n}\n\nconst FilterBuilderContext = React.createContext<FilterBuilderContextValue>({\n fields: [],\n size: \"default\",\n})\n\nfunction useFilterBuilderContext() {\n return React.use(FilterBuilderContext)\n}\n\n// ============================================\n// VALUE INPUT COMPONENT (extracted to reduce complexity)\n// ============================================\n\ninterface ValueInputProps {\n needsSecondValue: boolean\n onChange: (value: string) => void\n selectedField: FieldDefinition | undefined\n size: \"default\" | \"lg\" | \"sm\"\n value: unknown\n}\n\nfunction ValueInput({\n needsSecondValue,\n onChange,\n selectedField,\n size,\n value,\n}: ValueInputProps) {\n const inputSize = getInputSize(size)\n\n // Select field type\n if (selectedField?.type === \"select\" && selectedField.options) {\n return (\n <Select\n value={value as string}\n onValueChange={onChange}\n >\n <SelectTrigger\n aria-label=\"Select value\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n {selectedField.options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n\n // Boolean field type\n if (selectedField?.type === \"boolean\") {\n return (\n <Select\n value={String(value)}\n onValueChange={onChange}\n >\n <SelectTrigger\n aria-label=\"Select value\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n </SelectContent>\n </Select>\n )\n }\n\n // Between operator (two inputs)\n if (needsSecondValue) {\n const rawArray = Array.isArray(value) ? value : [\"\", \"\"]\n const fromValue = String(rawArray[0] ?? \"\")\n const toValue = String(rawArray[1] ?? \"\")\n return (\n <div className=\"flex items-center gap-2\">\n <TextInput\n aria-label=\"From value\"\n placeholder=\"From\"\n size={inputSize}\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={fromValue}\n onChange={(e) =>\n { onChange(JSON.stringify([e.target.value, toValue])); }\n }\n />\n <span className=\"text-sm text-muted-foreground\">and</span>\n <TextInput\n aria-label=\"To value\"\n placeholder=\"To\"\n size={inputSize}\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={toValue}\n onChange={(e) =>\n { onChange(JSON.stringify([fromValue, e.target.value])); }\n }\n />\n </div>\n )\n }\n\n // Default text/number/date input\n const inputType =\n selectedField?.type === \"number\"\n ? \"number\"\n : selectedField?.type === \"date\"\n ? \"date\"\n : \"text\"\n\n return (\n <TextInput\n aria-label=\"Filter value\"\n placeholder=\"Enter value\"\n size={inputSize}\n type={inputType}\n value={value as string}\n onChange={(e) => { onChange(e.target.value); }}\n />\n )\n}\n\n// ============================================\n// FILTER RULE COMPONENT\n// ============================================\n\nfunction FilterRuleComponent({\n fields,\n onChange,\n onRemove,\n rule,\n}: FilterRuleProps) {\n const { size } = useFilterBuilderContext()\n\n const selectedField = fields.find((f) => f.name === rule.field)\n const operators = getOperatorsForField(selectedField)\n const isInvalid = Boolean(rule.field && !rule.operator)\n const inputSize = getInputSize(size)\n\n const handleFieldChange = (fieldName: string) => {\n const newField = fields.find((f) => f.name === fieldName)\n const newOperators = getOperatorsForField(newField)\n\n onChange({\n ...rule,\n field: fieldName,\n operator: newOperators[0]?.value ?? \"\",\n value: \"\",\n })\n }\n\n const handleOperatorChange = (operator: string) => {\n onChange({\n ...rule,\n operator: operator as OperatorType,\n value: [\"is_empty\", \"is_not_empty\"].includes(operator) ? \"\" : rule.value,\n })\n }\n\n const handleValueChange = (value: string) => {\n onChange({ ...rule, value })\n }\n\n const needsValue = rule.operator && ![\"is_empty\", \"is_not_empty\"].includes(rule.operator)\n const needsSecondValue = rule.operator === \"between\"\n\n return (\n <div\n aria-label={`Filter rule: ${selectedField?.label ?? \"Select field\"}`}\n className={cn(filterRuleVariants({ invalid: isInvalid, size }))}\n data-slot=\"filter-rule\"\n role=\"group\"\n >\n {/* Field Select */}\n <div className={cn(ruleFieldVariants({ size }))}>\n <Select\n value={rule.field}\n onValueChange={handleFieldChange}\n >\n <SelectTrigger\n aria-label=\"Select field\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent>\n {fields.map((field) => (\n <SelectItem key={field.name} value={field.name}>\n {field.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Operator Select */}\n {rule.field && (\n <div className={cn(ruleOperatorVariants({ size }))}>\n <Select\n value={rule.operator}\n onValueChange={handleOperatorChange}\n >\n <SelectTrigger\n aria-label=\"Select operator\"\n size={inputSize}\n >\n <SelectValue placeholder=\"Operator\" />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Value Input */}\n {needsValue && (\n <div className={cn(ruleValueVariants({ size }))}>\n <ValueInput\n needsSecondValue={needsSecondValue}\n selectedField={selectedField}\n size={size}\n value={rule.value}\n onChange={handleValueChange}\n />\n </div>\n )}\n\n {/* Remove Button */}\n <Button\n aria-label=\"Remove rule\"\n className=\"flex-shrink-0 text-muted-foreground hover:text-destructive\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <XIcon className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\n// ============================================\n// FILTER GROUP COMPONENT\n// ============================================\n\nfunction FilterGroupComponent({\n depth,\n fields,\n group,\n isRoot = false,\n maxDepth,\n maxRules,\n onChange,\n onRemove,\n rulesCount,\n}: FilterGroupProps) {\n const { size } = useFilterBuilderContext()\n\n const handleCombinatorChange = (combinator: \"and\" | \"or\") => {\n onChange({ ...group, combinator })\n }\n\n const handleAddRule = () => {\n if (rulesCount >= maxRules) return\n onChange({ ...group, rules: [...group.rules, createEmptyRule()] })\n }\n\n const handleAddGroup = () => {\n if (depth >= maxDepth || rulesCount >= maxRules) return\n onChange({ ...group, rules: [...group.rules, createEmptyGroup()] })\n }\n\n const handleRuleChange = (index: number, updatedItem: FilterGroup | FilterRule) => {\n const newRules = [...group.rules]\n newRules[index] = updatedItem\n onChange({ ...group, rules: newRules })\n }\n\n const handleRemoveItem = (index: number) => {\n onChange({ ...group, rules: group.rules.filter((_, i) => i !== index) })\n }\n\n const canAddRule = rulesCount < maxRules\n const canAddGroup = depth < maxDepth && rulesCount < maxRules\n const buttonSize = size === \"lg\" ? \"default\" : \"sm\"\n\n return (\n <div\n aria-label={`Filter group with ${group.combinator.toUpperCase()} combinator`}\n className={cn(filterGroupVariants({ isRoot, size }))}\n data-slot=\"filter-group\"\n role=\"group\"\n >\n {/* Group Header - Combinator Toggle */}\n {!isRoot && (\n <div className={cn(filterGroupHeaderVariants({ size }))}>\n <div className=\"flex items-center gap-1\">\n <button\n className={cn(\n combinatorToggleVariants({\n active: group.combinator === \"and\",\n size,\n })\n )}\n aria-pressed={group.combinator === \"and\"}\n type=\"button\"\n onClick={() => { handleCombinatorChange(\"and\"); }}\n >\n AND\n </button>\n <button\n className={cn(\n combinatorToggleVariants({\n active: group.combinator === \"or\",\n size,\n })\n )}\n aria-pressed={group.combinator === \"or\"}\n type=\"button\"\n onClick={() => { handleCombinatorChange(\"or\"); }}\n >\n OR\n </button>\n </div>\n\n {onRemove && (\n <Button\n aria-label=\"Remove group\"\n className=\"ml-auto text-muted-foreground hover:text-destructive\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <TrashIcon className=\"size-4\" />\n </Button>\n )}\n </div>\n )}\n\n {/* Rules Container */}\n <div className={cn(rulesContainerVariants({ size }))}>\n {group.rules.length === 0 ? (\n <div className={cn(emptyStateVariants({ size }))}>\n <span>No filters added</span>\n <span className=\"text-xs\">Click "Add Rule" to create a filter</span>\n </div>\n ) : (\n group.rules.map((item, index) => (\n <React.Fragment key={item.id}>\n {/* Combinator Label between rules (not for first item) */}\n {index > 0 && (\n <div className=\"flex items-center gap-2 pl-2\">\n <span className=\"text-xs font-medium uppercase text-muted-foreground\">\n {group.combinator}\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n )}\n\n {isFilterGroup(item) ? (\n <FilterGroupComponent\n depth={depth + 1}\n fields={fields}\n group={item}\n maxDepth={maxDepth}\n maxRules={maxRules}\n rulesCount={rulesCount}\n onChange={(updated) => { handleRuleChange(index, updated); }}\n onRemove={() => { handleRemoveItem(index); }}\n />\n ) : (\n <FilterRuleComponent\n fields={fields}\n rule={item}\n onChange={(updated) => { handleRuleChange(index, updated); }}\n onRemove={() => { handleRemoveItem(index); }}\n />\n )}\n </React.Fragment>\n ))\n )}\n </div>\n\n {/* Add Buttons */}\n <div className=\"mt-2 flex items-center gap-2\">\n <Button\n className=\"gap-1\"\n disabled={!canAddRule}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddRule}\n >\n <PlusIcon className=\"size-3\" />\n Add Rule\n </Button>\n\n {!isRoot && (\n <Button\n className=\"gap-1\"\n disabled={!canAddGroup}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddGroup}\n >\n <PlusIcon className=\"size-3\" />\n Add Group\n </Button>\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// FILTER TOOLBAR COMPONENT\n// ============================================\n\nfunction FilterToolbar({\n canAddGroup,\n canAddRule,\n hasRules,\n onAddGroup,\n onAddRule,\n onApply,\n onClear,\n}: FilterToolbarProps) {\n const { size } = useFilterBuilderContext()\n const buttonSize = size === \"lg\" ? \"default\" : \"sm\"\n\n return (\n <div\n className={cn(filterToolbarVariants({ size }))}\n data-slot=\"filter-toolbar\"\n >\n <div className=\"flex items-center gap-2\">\n <Button\n className=\"gap-1\"\n disabled={!canAddRule}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={onAddRule}\n >\n <PlusIcon className=\"size-3\" />\n Add Rule\n </Button>\n\n <Button\n className=\"gap-1\"\n disabled={!canAddGroup}\n size={buttonSize}\n type=\"button\"\n variant=\"outline\"\n onClick={onAddGroup}\n >\n <PlusIcon className=\"size-3\" />\n Add Group\n </Button>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {onClear && hasRules && (\n <Button\n size={buttonSize}\n type=\"button\"\n variant=\"ghost\"\n onClick={onClear}\n >\n Clear All\n </Button>\n )}\n\n {onApply && (\n <Button\n size={buttonSize}\n type=\"button\"\n variant=\"default\"\n onClick={onApply}\n >\n Apply Filters\n </Button>\n )}\n </div>\n </div>\n )\n}\n\n// ============================================\n// FILTER PREVIEW COMPONENT\n// ============================================\n\nfunction FilterPreview({ fields, filter }: FilterPreviewProps) {\n const { size } = useFilterBuilderContext()\n\n const getFieldLabel = (fieldName: string): string => {\n const field = fields.find((f) => f.name === fieldName)\n return field?.label ?? fieldName\n }\n\n const formatValue = (value: unknown): string => {\n if (Array.isArray(value)) {\n return value.join(\" and \")\n }\n return String(value)\n }\n\n const renderRule = (rule: FilterRule): string => {\n if (!rule.field || !rule.operator) return \"\"\n\n const fieldLabel = getFieldLabel(rule.field)\n // After the check above, rule.operator is guaranteed to be a valid OperatorType\n const operatorLabel = OPERATOR_LABELS[rule.operator]\n\n if ([\"is_empty\", \"is_not_empty\"].includes(rule.operator)) {\n return `${fieldLabel} ${operatorLabel}`\n }\n\n return `${fieldLabel} ${operatorLabel} \"${formatValue(rule.value)}\"`\n }\n\n const renderGroup = (group: FilterGroup): string => {\n const parts = group.rules\n .map((item) => {\n if (isFilterGroup(item)) {\n return `(${renderGroup(item)})`\n }\n return renderRule(item)\n })\n .filter(Boolean)\n\n return parts.join(` ${group.combinator.toUpperCase()} `)\n }\n\n const preview = renderGroup(filter)\n\n if (!preview) {\n return (\n <div\n className={cn(filterPreviewVariants({ size }), \"italic text-muted-foreground\")}\n data-slot=\"filter-preview\"\n >\n No filters defined\n </div>\n )\n }\n\n return (\n <div\n className={cn(filterPreviewVariants({ size }))}\n data-slot=\"filter-preview\"\n >\n <code>{preview}</code>\n </div>\n )\n}\n\n// ============================================\n// MAIN FILTER BUILDER COMPONENT\n// ============================================\n\n/**\n * FilterBuilder - Advanced visual query builder component\n *\n * Allows creating complex filters with multiple conditions,\n * logical operators (AND/OR), nested groups, and various field types.\n *\n * @example\n * ```tsx\n * const fields = [\n * { name: \"name\", label: \"Name\", type: \"string\" },\n * { name: \"age\", label: \"Age\", type: \"number\" },\n * { name: \"status\", label: \"Status\", type: \"select\", options: [\n * { value: \"active\", label: \"Active\" },\n * { value: \"inactive\", label: \"Inactive\" },\n * ]},\n * ]\n *\n * <FilterBuilder\n * fields={fields}\n * value={filter}\n * onChange={setFilter}\n * onApply={(f) => console.log(\"Apply:\", f)}\n * />\n * ```\n */\nfunction FilterBuilder({\n className,\n fields,\n maxDepth = 3,\n maxRules = 20,\n onApply,\n onChange,\n onClear,\n showPreview = false,\n size = \"default\",\n value,\n ...props\n}: FilterBuilderProps) {\n const filter = value ?? createEmptyGroup()\n\n const handleChange = (updatedFilter: FilterGroup) => {\n onChange?.(updatedFilter)\n }\n\n const handleAddRule = () => {\n const rulesCount = countRules(filter)\n if (rulesCount >= maxRules) return\n handleChange({ ...filter, rules: [...filter.rules, createEmptyRule()] })\n }\n\n const handleAddGroup = () => {\n const rulesCount = countRules(filter)\n if (rulesCount >= maxRules) return\n handleChange({ ...filter, rules: [...filter.rules, createEmptyGroup()] })\n }\n\n const handleClear = () => {\n handleChange(createEmptyGroup())\n onClear?.()\n }\n\n const handleApply = () => {\n onApply?.(filter)\n }\n\n const rulesCount = countRules(filter)\n const hasRules = rulesCount > 0\n const canAddRule = rulesCount < maxRules\n const canAddGroup = rulesCount < maxRules\n\n return (\n <FilterBuilderContext value={{ fields, size: size ?? \"default\" }}>\n <div\n aria-label=\"Filter builder\"\n className={cn(filterBuilderVariants({ size }), className)}\n data-slot=\"filter-builder\"\n role=\"region\"\n {...props}\n >\n {/* Main Filter Group */}\n <FilterGroupComponent\n isRoot\n depth={0}\n fields={fields}\n group={filter}\n maxDepth={maxDepth}\n maxRules={maxRules}\n rulesCount={rulesCount}\n onChange={handleChange}\n />\n\n {/* Toolbar */}\n <FilterToolbar\n canAddGroup={canAddGroup}\n canAddRule={canAddRule}\n hasRules={hasRules}\n onAddGroup={handleAddGroup}\n onAddRule={handleAddRule}\n onApply={onApply ? handleApply : undefined}\n onClear={onClear ? handleClear : undefined}\n />\n\n {/* Preview */}\n {showPreview && (\n <FilterPreview fields={fields} filter={filter} />\n )}\n </div>\n </FilterBuilderContext>\n )\n}\n\nFilterBuilder.displayName = \"FilterBuilder\"\n\n// ============================================\n// EXPORTS\n// ============================================\n\nexport {\n FilterBuilder,\n type FilterBuilderProps,\n FilterGroupComponent as FilterGroup,\n type FilterGroupProps,\n FilterPreview,\n type FilterPreviewProps,\n FilterRuleComponent as FilterRule,\n type FilterRuleProps,\n FilterToolbar,\n type FilterToolbarProps,\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Field, FieldLabel, FieldError, FieldDescription } from './chunk-
|
|
2
|
-
import { Textarea } from './chunk-
|
|
1
|
+
import { Field, FieldLabel, FieldError, FieldDescription } from './chunk-4GQN76L7.js';
|
|
2
|
+
import { Textarea } from './chunk-U6EOAIPK.js';
|
|
3
3
|
import { useId } from 'react';
|
|
4
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
5
|
import { cva } from 'class-variance-authority';
|
|
@@ -97,5 +97,5 @@ var textareaFieldErrorVariants = cva(
|
|
|
97
97
|
);
|
|
98
98
|
|
|
99
99
|
export { TextareaField, textareaFieldDescriptionVariants, textareaFieldErrorVariants, textareaFieldLabelVariants, textareaFieldVariants };
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
101
|
-
//# sourceMappingURL=chunk-
|
|
100
|
+
//# sourceMappingURL=chunk-B4ETIQOO.js.map
|
|
101
|
+
//# sourceMappingURL=chunk-B4ETIQOO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/forms/TextareaField/TextareaField.tsx","../src/components/forms/TextareaField/TextareaField.variants.ts"],"names":[],"mappings":";;;;;;AA2BA,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,EAAA,EAAI,UAAA;AAAA,EACJ,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,EAAA,MAAM,KAAK,UAAA,IAAc,WAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,GAAG,EAAE,CAAA,YAAA,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,GAAG,EAAE,CAAA,MAAA,CAAA;AAErB,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,YAAA;AAEnB,EAAA,4BACG,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,KAAA,oBACC,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,EAAA,EAClB,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,SAAA,EAAU,yBAAwB,QAAA,EAAA,GAAA,EAE3D;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEF,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EACE,QAAA,GAAW,OAAA,GAAW,WAAA,GAAc,aAAA,GAAgB,MAAA;AAAA,QAEtD,gBAAc,QAAA,IAAY,MAAA;AAAA,QAC1B,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,EAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,IACC,QAAA,mBACC,GAAA,CAAC,UAAA,EAAA,EAAW,EAAA,EAAI,OAAA,EAAU,QAAA,EAAA,YAAA,EAAa,CAAA,GACrC,WAAA,mBACF,GAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAI,aAAA,EAAgB,uBAAY,CAAA,GAChD;AAAA,GAAA,EACN,CAAA;AAEJ;AChEO,IAAM,qBAAA,GAAwB,GAAA;AAAA,EACnC,qBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,OAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;AAKO,IAAM,0BAAA,GAA6B,GAAA;AAAA,EACxC,oFAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;AAKO,IAAM,gCAAA,GAAmC,GAAA;AAAA,EAC9C,uBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;AAKO,IAAM,0BAAA,GAA6B,GAAA;AAAA,EACxC,8BAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/TextareaField/TextareaField.tsx","../src/components/forms/TextareaField/TextareaField.variants.ts"],"names":[],"mappings":";;;;;;AA2BA,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,EAAA,EAAI,UAAA;AAAA,EACJ,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,EAAA,MAAM,KAAK,UAAA,IAAc,WAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,GAAG,EAAE,CAAA,YAAA,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,GAAG,EAAE,CAAA,MAAA,CAAA;AAErB,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,YAAA;AAEnB,EAAA,4BACG,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,KAAA,oBACC,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,EAAA,EAClB,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,SAAA,EAAU,yBAAwB,QAAA,EAAA,GAAA,EAE3D;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEF,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EACE,QAAA,GAAW,OAAA,GAAW,WAAA,GAAc,aAAA,GAAgB,MAAA;AAAA,QAEtD,gBAAc,QAAA,IAAY,MAAA;AAAA,QAC1B,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,EAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,IACC,QAAA,mBACC,GAAA,CAAC,UAAA,EAAA,EAAW,EAAA,EAAI,OAAA,EAAU,QAAA,EAAA,YAAA,EAAa,CAAA,GACrC,WAAA,mBACF,GAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAI,aAAA,EAAgB,uBAAY,CAAA,GAChD;AAAA,GAAA,EACN,CAAA;AAEJ;AChEO,IAAM,qBAAA,GAAwB,GAAA;AAAA,EACnC,qBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,OAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;AAKO,IAAM,0BAAA,GAA6B,GAAA;AAAA,EACxC,oFAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;AAKO,IAAM,gCAAA,GAAmC,GAAA;AAAA,EAC9C,uBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;AAKO,IAAM,0BAAA,GAA6B,GAAA;AAAA,EACxC,8BAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ","file":"chunk-B4ETIQOO.js","sourcesContent":["\"use client\"\n\nimport type { TextareaFieldProps } from \"./TextareaField.types\"\n\nimport { useId } from \"react\"\n\nimport { Field, FieldDescription, FieldError, FieldLabel } from \"../Field\"\nimport { Textarea } from \"../Textarea\"\n\n/**\n * TextareaField - A complete form field combining Textarea with label, description, and error handling\n *\n * @example\n * ```tsx\n * <TextareaField\n * label=\"Description\"\n * description=\"Enter a detailed description\"\n * placeholder=\"Type here...\"\n * />\n *\n * <TextareaField\n * label=\"Comments\"\n * errorMessage=\"This field is required\"\n * required\n * />\n * ```\n */\nfunction TextareaField({\n label,\n description,\n errorMessage,\n required,\n id: providedId,\n ...textareaProps\n}: TextareaFieldProps) {\n const generatedId = useId()\n const id = providedId ?? generatedId\n const descriptionId = `${id}-description`\n const errorId = `${id}-error`\n\n const hasError = !!errorMessage\n\n return (\n <Field>\n {label && (\n <FieldLabel htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive ml-1\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n <Textarea\n aria-describedby={\n hasError ? errorId : (description ? descriptionId : undefined)\n }\n aria-invalid={hasError || undefined}\n aria-required={required ?? undefined}\n id={id}\n {...textareaProps}\n />\n {hasError ? (\n <FieldError id={errorId}>{errorMessage}</FieldError>\n ) : description ? (\n <FieldDescription id={descriptionId}>{description}</FieldDescription>\n ) : null}\n </Field>\n )\n}\n\nexport { TextareaField }\n","import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * TextareaField container variant styles using CVA\n * Wraps the Field + Textarea combination with consistent spacing\n */\nexport const textareaFieldVariants = cva(\n \"flex flex-col gap-2\",\n {\n variants: {\n size: {\n sm: \"gap-1.5\",\n md: \"gap-2\",\n lg: \"gap-2.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\n/**\n * TextareaField label variant styles using CVA\n */\nexport const textareaFieldLabelVariants = cva(\n \"font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\n/**\n * TextareaField description variant styles using CVA\n */\nexport const textareaFieldDescriptionVariants = cva(\n \"text-muted-foreground\",\n {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\n/**\n * TextareaField error variant styles using CVA\n */\nexport const textareaFieldErrorVariants = cva(\n \"text-destructive font-medium\",\n {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nexport type TextareaFieldVariantProps = VariantProps<typeof textareaFieldVariants>\nexport type TextareaFieldLabelVariantProps = VariantProps<typeof textareaFieldLabelVariants>\nexport type TextareaFieldDescriptionVariantProps = VariantProps<typeof textareaFieldDescriptionVariants>\nexport type TextareaFieldErrorVariantProps = VariantProps<typeof textareaFieldErrorVariants>\n"]}
|
|
@@ -4,11 +4,11 @@ import { useState, useRef, useEffect } from 'react';
|
|
|
4
4
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
var sizeClasses = {
|
|
7
|
-
lg: "text-
|
|
8
|
-
md: "text-
|
|
9
|
-
sm: "text-
|
|
10
|
-
xl: "text-
|
|
11
|
-
xs: "text-
|
|
7
|
+
lg: "text-[length:var(--single-stat-value-size-lg)]",
|
|
8
|
+
md: "text-[length:var(--single-stat-value-size-md)]",
|
|
9
|
+
sm: "text-[length:var(--single-stat-value-size-sm)]",
|
|
10
|
+
xl: "text-[length:var(--single-stat-value-size-xl)]",
|
|
11
|
+
xs: "text-[length:var(--single-stat-value-size-xs)]"
|
|
12
12
|
};
|
|
13
13
|
var skeletonSizes = {
|
|
14
14
|
lg: "h-10",
|
|
@@ -109,7 +109,7 @@ function SingleStat({
|
|
|
109
109
|
"span",
|
|
110
110
|
{
|
|
111
111
|
className: cn(
|
|
112
|
-
"font-
|
|
112
|
+
"font-[number:var(--single-stat-value-weight)] tabular-nums text-[color:var(--single-stat-value-color)]",
|
|
113
113
|
sizeClasses[size],
|
|
114
114
|
className
|
|
115
115
|
),
|
|
@@ -139,7 +139,7 @@ function SingleStat({
|
|
|
139
139
|
"span",
|
|
140
140
|
{
|
|
141
141
|
className: cn(
|
|
142
|
-
"font-
|
|
142
|
+
"font-[number:var(--single-stat-value-weight)] tabular-nums text-[color:var(--single-stat-value-color)]",
|
|
143
143
|
sizeClasses[size]
|
|
144
144
|
),
|
|
145
145
|
"data-slot": "single-stat-value",
|
|
@@ -153,7 +153,7 @@ function SingleStat({
|
|
|
153
153
|
label && /* @__PURE__ */ jsx(
|
|
154
154
|
"span",
|
|
155
155
|
{
|
|
156
|
-
className: "text-sm font-
|
|
156
|
+
className: "text-sm font-[number:var(--single-stat-label-weight)] text-[color:var(--single-stat-label-color)]",
|
|
157
157
|
"data-slot": "single-stat-label",
|
|
158
158
|
children: label
|
|
159
159
|
}
|
|
@@ -174,7 +174,7 @@ function SingleStat({
|
|
|
174
174
|
label && /* @__PURE__ */ jsx(
|
|
175
175
|
"p",
|
|
176
176
|
{
|
|
177
|
-
className: "text-sm font-
|
|
177
|
+
className: "text-sm font-[number:var(--single-stat-label-weight)] text-[color:var(--single-stat-label-color)]",
|
|
178
178
|
"data-slot": "single-stat-label",
|
|
179
179
|
children: label
|
|
180
180
|
}
|
|
@@ -183,7 +183,7 @@ function SingleStat({
|
|
|
183
183
|
"p",
|
|
184
184
|
{
|
|
185
185
|
className: cn(
|
|
186
|
-
"font-
|
|
186
|
+
"font-[number:var(--single-stat-value-weight)] tabular-nums text-[color:var(--single-stat-value-color)]",
|
|
187
187
|
sizeClasses[size]
|
|
188
188
|
),
|
|
189
189
|
"data-slot": "single-stat-value",
|
|
@@ -200,5 +200,5 @@ function SingleStat({
|
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
export { SingleStat };
|
|
203
|
-
//# sourceMappingURL=chunk-
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
203
|
+
//# sourceMappingURL=chunk-D6TH3EGA.js.map
|
|
204
|
+
//# sourceMappingURL=chunk-D6TH3EGA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/SingleStat/SingleStat.tsx"],"names":[],"mappings":"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","file":"chunk-D6TH3EGA.js","sourcesContent":["import type { SingleStatProps, SingleStatSize } from \"./SingleStat.types\"\n\nimport { useEffect, useRef, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { SkeletonLoader } from \"../../primitives/SkeletonLoader\"\n\n/**\n * Size configuration for value typography\n */\nconst sizeClasses: Record<SingleStatSize, string> = {\n lg: \"text-[length:var(--single-stat-value-size-lg)]\",\n md: \"text-[length:var(--single-stat-value-size-md)]\",\n sm: \"text-[length:var(--single-stat-value-size-sm)]\",\n xl: \"text-[length:var(--single-stat-value-size-xl)]\",\n xs: \"text-[length:var(--single-stat-value-size-xs)]\",\n}\n\n/**\n * Skeleton height configuration by size\n */\nconst skeletonSizes: Record<SingleStatSize, string> = {\n lg: \"h-10\",\n md: \"h-8\",\n sm: \"h-7\",\n xl: \"h-14\",\n xs: \"h-6\",\n}\n\n/**\n * Hook for animated count-up effect\n */\nfunction useAnimatedCounter(\n targetValue: number,\n duration: number,\n enabled: boolean\n): number {\n // When not enabled, just return the target value directly\n const [count, setCount] = useState(0)\n const animationFrameRef = useRef<number>(0)\n const startTimeRef = useRef<null | number>(null)\n\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n startTimeRef.current = null\n\n const animate = (timestamp: number) => {\n startTimeRef.current ??= timestamp\n const progress = Math.min((timestamp - startTimeRef.current) / duration, 1)\n\n // Use easeOutQuad for smoother animation\n const eased = 1 - (1 - progress) * (1 - progress)\n setCount(Math.floor(eased * targetValue))\n\n if (progress < 1) {\n animationFrameRef.current = requestAnimationFrame(animate)\n }\n }\n\n animationFrameRef.current = requestAnimationFrame(animate)\n\n return () => {\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current)\n }\n }\n }, [targetValue, duration, enabled])\n\n // Return target value when not animating, otherwise return animated count\n return enabled ? count : targetValue\n}\n\n/**\n * SingleStat - Minimalist single metric display\n *\n * A compact component for displaying a single highlighted metric.\n * Simpler than KPICard, focused only on value and label.\n * Ideal for inline indicators or space-constrained layouts.\n *\n * @example\n * ```tsx\n * <SingleStat value={1234} label=\"Total Users\" />\n * ```\n *\n * @example\n * ```tsx\n * <SingleStat\n * value={45231}\n * prefix=\"$\"\n * label=\"Revenue\"\n * size=\"lg\"\n * />\n * ```\n */\nfunction SingleStat({\n value,\n label,\n variant = \"default\",\n size = \"md\",\n prefix,\n suffix,\n animated = false,\n animationDuration = 1000,\n loading = false,\n className,\n ...props\n}: SingleStatProps) {\n // Use animated counter for numeric values\n const numericValue = typeof value === \"number\" ? value : Number.NaN\n const isNumeric = !Number.isNaN(numericValue)\n const animatedValue = useAnimatedCounter(\n isNumeric ? numericValue : 0,\n animationDuration,\n animated && isNumeric\n )\n\n // Format the display value\n const displayValue = animated && isNumeric\n ? animatedValue.toLocaleString()\n : typeof value === \"number\"\n ? value.toLocaleString()\n : value\n\n // Loading state\n if (loading) {\n if (variant === \"compact\") {\n return (\n <SkeletonLoader\n className={cn(skeletonSizes[size], \"w-24\", className)}\n data-slot=\"single-stat\"\n {...props}\n />\n )\n }\n\n if (variant === \"inline\") {\n return (\n <div\n className={cn(\"flex items-baseline gap-2\", className)}\n data-slot=\"single-stat\"\n {...props}\n >\n <SkeletonLoader className={cn(skeletonSizes[size], \"w-20\")} />\n {label && <SkeletonLoader className=\"h-4 w-16\" />}\n </div>\n )\n }\n\n return (\n <div\n className={cn(\"space-y-1\", className)}\n data-slot=\"single-stat\"\n {...props}\n >\n {label && <SkeletonLoader className=\"h-4 w-20\" />}\n <SkeletonLoader className={cn(skeletonSizes[size], \"w-24\")} />\n </div>\n )\n }\n\n // Compact variant: value only\n if (variant === \"compact\") {\n const ariaValue = typeof displayValue === \"string\" ? displayValue : String(displayValue)\n return (\n <span\n className={cn(\n \"font-[number:var(--single-stat-value-weight)] tabular-nums text-[color:var(--single-stat-value-color)]\",\n sizeClasses[size],\n className\n )}\n aria-label={label ? `${label}: ${prefix ?? \"\"}${ariaValue}${suffix ?? \"\"}` : undefined}\n data-slot=\"single-stat\"\n role=\"text\"\n {...props}\n >\n {prefix && <span aria-hidden=\"true\">{prefix}</span>}\n {displayValue}\n {suffix && <span aria-hidden=\"true\">{suffix}</span>}\n </span>\n )\n }\n\n // Inline variant: label and value side by side\n if (variant === \"inline\") {\n return (\n <div\n aria-label={label}\n className={cn(\"flex items-baseline gap-2\", className)}\n data-slot=\"single-stat\"\n role=\"group\"\n {...props}\n >\n <span\n className={cn(\n \"font-[number:var(--single-stat-value-weight)] tabular-nums text-[color:var(--single-stat-value-color)]\",\n sizeClasses[size]\n )}\n data-slot=\"single-stat-value\"\n >\n {prefix && <span aria-hidden=\"true\">{prefix}</span>}\n {displayValue}\n {suffix && <span aria-hidden=\"true\">{suffix}</span>}\n </span>\n {label && (\n <span\n className=\"text-sm font-[number:var(--single-stat-label-weight)] text-[color:var(--single-stat-label-color)]\"\n data-slot=\"single-stat-label\"\n >\n {label}\n </span>\n )}\n </div>\n )\n }\n\n // Default variant: label above, value below\n return (\n <div\n aria-label={label}\n className={cn(\"space-y-1\", className)}\n data-slot=\"single-stat\"\n role=\"group\"\n {...props}\n >\n {label && (\n <p\n className=\"text-sm font-[number:var(--single-stat-label-weight)] text-[color:var(--single-stat-label-color)]\"\n data-slot=\"single-stat-label\"\n >\n {label}\n </p>\n )}\n <p\n className={cn(\n \"font-[number:var(--single-stat-value-weight)] tabular-nums text-[color:var(--single-stat-value-color)]\",\n sizeClasses[size]\n )}\n data-slot=\"single-stat-value\"\n >\n {prefix && <span aria-hidden=\"true\">{prefix}</span>}\n {displayValue}\n {suffix && <span aria-hidden=\"true\">{suffix}</span>}\n </p>\n </div>\n )\n}\n\nexport { SingleStat }\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Badge } from './chunk-
|
|
1
|
+
import { Badge } from './chunk-TNROOKX3.js';
|
|
2
2
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
3
3
|
import { useRef, useState, useId, useCallback } from 'react';
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
@@ -195,5 +195,5 @@ function TagsInput({
|
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
export { TagsInput, tagsInputInputVariants, tagsInputVariants };
|
|
198
|
-
//# sourceMappingURL=chunk-
|
|
199
|
-
//# sourceMappingURL=chunk-
|
|
198
|
+
//# sourceMappingURL=chunk-DDM2I5C6.js.map
|
|
199
|
+
//# sourceMappingURL=chunk-DDM2I5C6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/forms/TagsInput/TagsInput.variants.ts","../src/components/forms/TagsInput/TagsInput.tsx"],"names":[],"mappings":";;;;;;AAKO,IAAM,iBAAA,GAAoB,GAAA;AAAA,EAC/B;AAAA,IACE,gIAAA;AAAA,IACA,kBAAA;AAAA,IACA,4EAAA;AAAA,IACA,6FAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,2BAAA;AAAA,QACJ,EAAA,EAAI,0CAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,wBAAA;AAAA,QACT,MAAA,EAAQ,6BAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX;AAEJ;AAKO,IAAM,sBAAA,GAAyB,GAAA;AAAA,EACpC;AAAA,IACE,6CAAA;AAAA,IACA,mCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,aAAA;AAAA,QACJ,EAAA,EAAI,0BAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;ACvBA,SAAS,SAAA,CAAU;AAAA,EACjB,KAAA,EAAO,eAAA;AAAA,EACP,eAAe,EAAC;AAAA,EAChB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,OAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,EACjB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAmB,YAAY,CAAA;AACvE,EAAA,MAAM,KAAK,KAAA,EAAM;AAGjB,EAAA,MAAM,eAAe,eAAA,KAAoB,MAAA;AACzC,EAAA,MAAM,IAAA,GAAO,eAAe,eAAA,GAAkB,YAAA;AAE9C,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,OAAA,KAAsB;AACrB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,MACzB;AACA,MAAA,QAAA,GAAW,OAAO,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,GACzB;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,CAAC,GAAA,KAAgB;AACf,MAAA,MAAM,UAAA,GAAa,IAAI,IAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,UAAA,EAAY;AAGjB,MAAA,IAAI,CAAC,eAAA,IAAmB,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AACjD,QAAA,aAAA,CAAc,EAAE,CAAA;AAChB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,MAAA,IAAU,OAAA,EAAS;AACrC,QAAA,aAAA,CAAc,EAAE,CAAA;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,EAAM,UAAU,CAAA;AACpC,MAAA,UAAA,CAAW,OAAO,CAAA;AAClB,MAAA,QAAA,GAAW,UAAU,CAAA;AACrB,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,YAAY,QAAQ;AAAA,GACvD;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,WAAA,KAAwB;AACvB,MAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,QAAQ,WAAW,CAAA;AACxD,MAAA,UAAA,CAAW,OAAO,CAAA;AAClB,MAAA,WAAA,GAAc,WAAW,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,UAAA,EAAY,WAAW;AAAA,GAChC;AAEA,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACpC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,SAAA,CAAU,OAAO,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,CAAA,KAA6C;AAC5C,MAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,IAAW,WAAW,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA,EAAG;AACnD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,CAAO,UAAU,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,EAAE,GAAA,KAAQ,WAAA,IAAe,eAAe,EAAA,IAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACxE,QAAA,aAAA,EAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,eAAe,UAAU;AAAA,GAC7D;AAEA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,CAAA,KAA2C;AAC1C,MAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AAGvB,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7B,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACnC,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,YAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC5B,cAAA,MAAA,CAAO,IAAI,CAAA;AAAA,YACb,CAAA,MAAO;AACL,cAAA,aAAA,CAAc,IAAI,CAAA;AAAA,YACpB;AAAA,UACF,CAAC,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,YAAY,MAAM;AAAA,GACrB;AAEA,EAAA,MAAM,oBAAA,GAAuB,YAAY,MAAM;AAC7C,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,IAAA;AAE5C,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,gBAAc,OAAA,IAAW,MAAA;AAAA,MACzB,SAAA,EAAW,GAAG,iBAAA,CAAkB,EAAE,MAAM,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,MAC7D,WAAA,EAAU,YAAA;AAAA,MACV,OAAA,EAAS,oBAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACd,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAM,OAAA;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,IAAA,EAAK,YAAA;AAAA,YACL,SAAA,EAAW,QAAA,GAAW,MAAA,GAAY,MAAM;AAAE,cAAA,SAAA,CAAU,GAAG,CAAA;AAAA,YAAG,CAAA;AAAA,YAEzD,QAAA,EAAA;AAAA,WAAA;AAAA,UANI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAQ/B,CAAA;AAAA,wBACD,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,SAAA;AAAA,YACX,SAAA,EAAW,sBAAA,CAAuB,EAAE,IAAA,EAAM,CAAA;AAAA,YAC1C,WAAA,EAAU,kBAAA;AAAA,YACV,QAAA;AAAA,YACA,EAAA;AAAA,YACA,WAAA,EAAa,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,WAAA,GAAc,MAAA;AAAA,YAC/C,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,UAAA;AAAA,YACP,QAAA,EAAU,iBAAA;AAAA,YACV,SAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,GACF;AAEJ","file":"chunk-ZJVZ3LQS.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * TagsInput container variant styles using CVA\n */\nexport const tagsInputVariants = cva(\n [\n \"flex flex-wrap items-center gap-1.5 w-full min-w-0 rounded-md border bg-transparent transition-[color,box-shadow] outline-none\",\n \"dark:bg-input/30\",\n \"focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]\",\n \"aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n ],\n {\n variants: {\n size: {\n sm: \"min-h-8 px-2 py-1 text-sm\",\n md: \"min-h-9 px-3 py-1.5 text-base md:text-sm\",\n lg: \"min-h-10 px-3.5 py-2 text-base\",\n },\n variant: {\n default: \"border-input shadow-xs\",\n filled: \"border-transparent bg-muted\",\n flushed: \"rounded-none border-x-0 border-t-0 border-b-input px-0\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * TagsInput inner input variant styles\n */\nexport const tagsInputInputVariants = cva(\n [\n \"flex-1 min-w-24 bg-transparent outline-none\",\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n ],\n {\n variants: {\n size: {\n sm: \"text-sm h-5\",\n md: \"text-base md:text-sm h-5\",\n lg: \"text-base h-6\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nexport type TagsInputVariantProps = VariantProps<typeof tagsInputVariants>\nexport type TagsInputInputVariantProps = VariantProps<typeof tagsInputInputVariants>\n","\"use client\"\n\nimport type { TagsInputProps } from \"./TagsInput.types\"\n\nimport * as React from \"react\"\nimport { useCallback, useId, useRef, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { tagsInputInputVariants, tagsInputVariants } from \"./TagsInput.variants\"\n\n/**\n * TagsInput - A multi-tag input component for entering and managing tags\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <TagsInput\n * defaultValue={[\"react\", \"typescript\"]}\n * placeholder=\"Add tags...\"\n * />\n *\n * // Controlled\n * const [tags, setTags] = useState([\"hello\"])\n * <TagsInput\n * value={tags}\n * onChange={setTags}\n * maxTags={5}\n * />\n * ```\n */\nfunction TagsInput({\n value: controlledValue,\n defaultValue = [],\n onChange,\n onTagAdd,\n onTagRemove,\n placeholder = \"Add tag...\",\n maxTags,\n allowDuplicates = false,\n disabled,\n size = \"md\",\n variant,\n invalid,\n delimiters = [\",\"],\n className,\n ...props\n}: TagsInputProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [inputValue, setInputValue] = useState(\"\")\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue)\n const id = useId()\n\n // Determine if controlled or uncontrolled\n const isControlled = controlledValue !== undefined\n const tags = isControlled ? controlledValue : internalTags\n\n const updateTags = useCallback(\n (newTags: string[]) => {\n if (!isControlled) {\n setInternalTags(newTags)\n }\n onChange?.(newTags)\n },\n [isControlled, onChange]\n )\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim()\n if (!trimmedTag) return\n\n // Check for duplicates\n if (!allowDuplicates && tags.includes(trimmedTag)) {\n setInputValue(\"\")\n return\n }\n\n // Check max tags\n if (maxTags && tags.length >= maxTags) {\n setInputValue(\"\")\n return\n }\n\n const newTags = [...tags, trimmedTag]\n updateTags(newTags)\n onTagAdd?.(trimmedTag)\n setInputValue(\"\")\n },\n [tags, allowDuplicates, maxTags, updateTags, onTagAdd]\n )\n\n const removeTag = useCallback(\n (tagToRemove: string) => {\n const newTags = tags.filter((tag) => tag !== tagToRemove)\n updateTags(newTags)\n onTagRemove?.(tagToRemove)\n },\n [tags, updateTags, onTagRemove]\n )\n\n const removeLastTag = useCallback(() => {\n const lastTag = tags[tags.length - 1]\n if (lastTag) {\n removeTag(lastTag)\n }\n }, [tags, removeTag])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" || delimiters.includes(e.key)) {\n e.preventDefault()\n addTag(inputValue)\n } else if (e.key === \"Backspace\" && inputValue === \"\" && tags.length > 0) {\n removeLastTag()\n }\n },\n [inputValue, tags.length, addTag, removeLastTag, delimiters]\n )\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n\n // Check if any delimiter is in the pasted/typed value\n for (const delimiter of delimiters) {\n if (value.includes(delimiter)) {\n const parts = value.split(delimiter)\n parts.forEach((part, index) => {\n if (index < parts.length - 1) {\n addTag(part)\n } else {\n setInputValue(part)\n }\n })\n return\n }\n }\n\n setInputValue(value)\n },\n [delimiters, addTag]\n )\n\n const handleContainerClick = useCallback(() => {\n inputRef.current?.focus()\n }, [])\n\n // Map size to Tag size\n const tagSize = size === \"lg\" ? \"default\" : \"sm\"\n\n return (\n <div\n aria-disabled={disabled ?? undefined}\n aria-invalid={invalid ?? undefined}\n className={cn(tagsInputVariants({ size, variant }), className)}\n data-slot=\"tags-input\"\n onClick={handleContainerClick}\n {...props}\n >\n {tags.map((tag, index) => (\n <Badge\n key={`${tag}-${String(index)}`}\n color=\"muted\"\n size={tagSize}\n type=\"pill-color\"\n onDismiss={disabled ? undefined : () => { removeTag(tag); }}\n >\n {tag}\n </Badge>\n ))}\n <input\n ref={inputRef}\n aria-label=\"Add tag\"\n className={tagsInputInputVariants({ size })}\n data-slot=\"tags-input-field\"\n disabled={disabled}\n id={id}\n placeholder={tags.length === 0 ? placeholder : undefined}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n />\n </div>\n )\n}\n\nexport { TagsInput }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/TagsInput/TagsInput.variants.ts","../src/components/forms/TagsInput/TagsInput.tsx"],"names":[],"mappings":"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","file":"chunk-DDM2I5C6.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * TagsInput container variant styles using CVA\n */\nexport const tagsInputVariants = cva(\n [\n \"flex flex-wrap items-center gap-1.5 w-full min-w-0 rounded-md border bg-transparent transition-[color,box-shadow] outline-none\",\n \"dark:bg-input/30\",\n \"focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]\",\n \"aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n ],\n {\n variants: {\n size: {\n sm: \"min-h-8 px-2 py-1 text-sm\",\n md: \"min-h-9 px-3 py-1.5 text-base md:text-sm\",\n lg: \"min-h-10 px-3.5 py-2 text-base\",\n },\n variant: {\n default: \"border-input shadow-xs\",\n filled: \"border-transparent bg-muted\",\n flushed: \"rounded-none border-x-0 border-t-0 border-b-input px-0\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * TagsInput inner input variant styles\n */\nexport const tagsInputInputVariants = cva(\n [\n \"flex-1 min-w-24 bg-transparent outline-none\",\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n ],\n {\n variants: {\n size: {\n sm: \"text-sm h-5\",\n md: \"text-base md:text-sm h-5\",\n lg: \"text-base h-6\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nexport type TagsInputVariantProps = VariantProps<typeof tagsInputVariants>\nexport type TagsInputInputVariantProps = VariantProps<typeof tagsInputInputVariants>\n","\"use client\"\n\nimport type { TagsInputProps } from \"./TagsInput.types\"\n\nimport * as React from \"react\"\nimport { useCallback, useId, useRef, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Badge } from \"../../primitives/Badge\"\nimport { tagsInputInputVariants, tagsInputVariants } from \"./TagsInput.variants\"\n\n/**\n * TagsInput - A multi-tag input component for entering and managing tags\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <TagsInput\n * defaultValue={[\"react\", \"typescript\"]}\n * placeholder=\"Add tags...\"\n * />\n *\n * // Controlled\n * const [tags, setTags] = useState([\"hello\"])\n * <TagsInput\n * value={tags}\n * onChange={setTags}\n * maxTags={5}\n * />\n * ```\n */\nfunction TagsInput({\n value: controlledValue,\n defaultValue = [],\n onChange,\n onTagAdd,\n onTagRemove,\n placeholder = \"Add tag...\",\n maxTags,\n allowDuplicates = false,\n disabled,\n size = \"md\",\n variant,\n invalid,\n delimiters = [\",\"],\n className,\n ...props\n}: TagsInputProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [inputValue, setInputValue] = useState(\"\")\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue)\n const id = useId()\n\n // Determine if controlled or uncontrolled\n const isControlled = controlledValue !== undefined\n const tags = isControlled ? controlledValue : internalTags\n\n const updateTags = useCallback(\n (newTags: string[]) => {\n if (!isControlled) {\n setInternalTags(newTags)\n }\n onChange?.(newTags)\n },\n [isControlled, onChange]\n )\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim()\n if (!trimmedTag) return\n\n // Check for duplicates\n if (!allowDuplicates && tags.includes(trimmedTag)) {\n setInputValue(\"\")\n return\n }\n\n // Check max tags\n if (maxTags && tags.length >= maxTags) {\n setInputValue(\"\")\n return\n }\n\n const newTags = [...tags, trimmedTag]\n updateTags(newTags)\n onTagAdd?.(trimmedTag)\n setInputValue(\"\")\n },\n [tags, allowDuplicates, maxTags, updateTags, onTagAdd]\n )\n\n const removeTag = useCallback(\n (tagToRemove: string) => {\n const newTags = tags.filter((tag) => tag !== tagToRemove)\n updateTags(newTags)\n onTagRemove?.(tagToRemove)\n },\n [tags, updateTags, onTagRemove]\n )\n\n const removeLastTag = useCallback(() => {\n const lastTag = tags[tags.length - 1]\n if (lastTag) {\n removeTag(lastTag)\n }\n }, [tags, removeTag])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" || delimiters.includes(e.key)) {\n e.preventDefault()\n addTag(inputValue)\n } else if (e.key === \"Backspace\" && inputValue === \"\" && tags.length > 0) {\n removeLastTag()\n }\n },\n [inputValue, tags.length, addTag, removeLastTag, delimiters]\n )\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n\n // Check if any delimiter is in the pasted/typed value\n for (const delimiter of delimiters) {\n if (value.includes(delimiter)) {\n const parts = value.split(delimiter)\n parts.forEach((part, index) => {\n if (index < parts.length - 1) {\n addTag(part)\n } else {\n setInputValue(part)\n }\n })\n return\n }\n }\n\n setInputValue(value)\n },\n [delimiters, addTag]\n )\n\n const handleContainerClick = useCallback(() => {\n inputRef.current?.focus()\n }, [])\n\n // Map size to Tag size\n const tagSize = size === \"lg\" ? \"default\" : \"sm\"\n\n return (\n <div\n aria-disabled={disabled ?? undefined}\n aria-invalid={invalid ?? undefined}\n className={cn(tagsInputVariants({ size, variant }), className)}\n data-slot=\"tags-input\"\n onClick={handleContainerClick}\n {...props}\n >\n {tags.map((tag, index) => (\n <Badge\n key={`${tag}-${String(index)}`}\n color=\"muted\"\n size={tagSize}\n type=\"pill-color\"\n onDismiss={disabled ? undefined : () => { removeTag(tag); }}\n >\n {tag}\n </Badge>\n ))}\n <input\n ref={inputRef}\n aria-label=\"Add tag\"\n className={tagsInputInputVariants({ size })}\n data-slot=\"tags-input-field\"\n disabled={disabled}\n id={id}\n placeholder={tags.length === 0 ? placeholder : undefined}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n />\n </div>\n )\n}\n\nexport { TagsInput }\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LineChart } from './chunk-XV6NXXXP.js';
|
|
2
2
|
import { SkeletonLoader } from './chunk-QHKOBGLW.js';
|
|
3
|
-
import { Badge } from './chunk-
|
|
3
|
+
import { Badge } from './chunk-TNROOKX3.js';
|
|
4
4
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
import { cva } from 'class-variance-authority';
|
|
@@ -178,5 +178,5 @@ function ChartCard({
|
|
|
178
178
|
ChartCard.displayName = "ChartCard";
|
|
179
179
|
|
|
180
180
|
export { ChartCard, chartCardChartVariants, chartCardHeaderVariants, chartCardPreviousValueVariants, chartCardTitleVariants, chartCardValueContainerVariants, chartCardValueVariants, chartCardVariants };
|
|
181
|
-
//# sourceMappingURL=chunk-
|
|
182
|
-
//# sourceMappingURL=chunk-
|
|
181
|
+
//# sourceMappingURL=chunk-DDR24GOP.js.map
|
|
182
|
+
//# sourceMappingURL=chunk-DDR24GOP.js.map
|