forlogic-core 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../lib/utils/index.ts","../lib/components/ui/button.tsx","../lib/components/ui/alert-dialog.tsx","../lib/components/ui/alert.tsx","../lib/components/ui/badge.tsx","../lib/components/ui/breadcrumb.tsx","../lib/components/ui/card.tsx","../lib/components/ui/input.tsx","../lib/components/ui/label.tsx","../lib/components/ui/popover.tsx","../lib/components/ui/color-picker.tsx","../lib/components/ui/command.tsx","../lib/components/ui/data-list.tsx","../lib/components/ui/delete-dialog.tsx","../lib/components/ui/dialog.tsx","../lib/components/ui/dropdown-menu.tsx","../lib/components/ui/empty-state.tsx","../lib/auth/services/TokenManager.ts","../lib/hooks/use-toast.ts","../lib/services/ErrorService.ts","../lib/supabase/SupabaseSingleton.ts","../lib/config/index.ts","../lib/auth/services/AuthService.ts","../lib/auth/contexts/AuthContext.tsx","../lib/components/ui/feedback-dialog.tsx","../lib/components/ui/form.tsx","../lib/components/ui/grid.tsx","../lib/components/ui/scroll-area.tsx","../lib/components/ui/icon-picker.tsx","../lib/components/ui/input-otp.tsx","../lib/components/ui/spinner.tsx","../lib/components/ui/pagination.tsx","../lib/components/ui/select.tsx","../lib/components/ui/separator.tsx","../lib/components/ui/sheet.tsx","../lib/components/ui/tooltip.tsx","../lib/components/ui/sidebar.tsx","../lib/components/ui/skeleton.tsx","../lib/components/ui/skeleton-variants.tsx","../lib/components/ui/stack.tsx","../lib/components/ui/table.tsx","../lib/components/ui/textarea.tsx","../lib/components/ui/toast.tsx","../lib/contexts/NavigationContext.tsx","../lib/hooks/usePageTitle.ts","../lib/auth/components/UserInfo.tsx","../lib/hooks/useDebounce.ts","../lib/components/layout/AppHeader.tsx","../lib/hooks/useActiveModules.ts","../lib/assets/index.ts","../lib/components/layout/AppSidebar.tsx","../lib/components/ErrorBoundary.tsx","../lib/crud/hooks/useBaseForm.ts","../lib/qualiex/services/qualiexApi.ts","../lib/qualiex/hooks/useQualiexUsers.ts","../lib/qualiex/components/QualiexUserField.tsx","../lib/qualiex/components/QualiexResponsibleSelectField.tsx","../lib/crud/components/BaseForm.tsx","../node_modules/date-fns/locale/_lib/buildFormatLongFn.mjs","../node_modules/date-fns/locale/_lib/buildLocalizeFn.mjs","../node_modules/date-fns/locale/_lib/buildMatchFn.mjs","../node_modules/date-fns/locale/pt-BR/_lib/formatDistance.mjs","../node_modules/date-fns/locale/pt-BR/_lib/formatLong.mjs","../node_modules/date-fns/locale/pt-BR/_lib/formatRelative.mjs","../node_modules/date-fns/locale/_lib/buildMatchPatternFn.mjs","../node_modules/date-fns/locale/pt-BR.mjs","../node_modules/date-fns/locale/pt-BR/_lib/localize.mjs","../node_modules/date-fns/locale/pt-BR/_lib/match.mjs","../lib/crud/components/ActionMenuItems.tsx","../lib/crud/components/TableRowActions.tsx","../lib/crud/components/CrudTable.tsx","../lib/crud/components/CrudForm.tsx","../lib/crud/components/TableFooter.tsx","../lib/crud/components/CrudPage.tsx","../lib/services/QualiexEnrichmentService.ts","../lib/services/BaseService.ts","../lib/components/layout/AppLayout.tsx","../lib/crud/BaseCrudPage.tsx","../lib/auth/pages/CallbackPage.tsx","../lib/crud/components/CrudCards.tsx","../lib/crud/components/FilterBar.tsx","../lib/crud/GenericEntityForm.tsx","../lib/components/ui/loading-state.tsx","../lib/components/ui/page-breadcrumb.tsx","../lib/auth/components/ProtectedRoute.tsx","../lib/components/ui/toaster.tsx","../lib/setup.ts","../lib/crud/hooks/useCrud.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","// ============= UNIFIED UTILITIES =============\r\n\r\nimport { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\nimport { parseISO, isValid } from 'date-fns';\r\n\r\n// ============= CLASS UTILITIES =============\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n// ============= STRING UTILITIES =============\r\nexport const trimTextFields = (data: any): any => {\r\n if (data === null || data === undefined) return data;\r\n if (typeof data === 'string') return data.trim();\r\n if (Array.isArray(data)) return data.map(trimTextFields);\r\n \r\n if (typeof data === 'object' && data.constructor === Object) {\r\n const trimmed: any = {};\r\n for (const [key, value] of Object.entries(data)) {\r\n trimmed[key] = trimTextFields(value);\r\n }\r\n return trimmed;\r\n }\r\n \r\n return data;\r\n};\r\n\r\n// ============= DATE UTILITIES =============\r\nexport const formatDatetime = (dateString: string) => {\r\n if (!dateString) return '';\r\n \r\n const date = parseISO(dateString);\r\n if (!isValid(date)) return 'Data inválida';\r\n \r\n const dateStr = date.toLocaleDateString('pt-BR', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric'\r\n });\r\n const timeStr = date.toLocaleTimeString('pt-BR', {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n });\r\n return `${dateStr} ${timeStr}`;\r\n};\r\n\r\n// ============= ASYNC UTILITIES =============\r\nexport const debounce = <T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let timeout: NodeJS.Timeout;\r\n \r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func(...args), wait);\r\n };\r\n};","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\r\n destructive:\r\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\r\n outline:\r\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n \"icon-only\": \"bg-transparent border border-input hover:bg-accent hover:text-accent-foreground p-2\",\r\n \"external-link\": \"bg-transparent text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors\",\r\n \"action-primary\": \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\r\n \"action-secondary\": \"bg-secondary text-secondary-foreground hover:bg-secondary/80 border border-input\",\r\n },\r\n size: {\r\n default: \"h-10 px-4 py-2\",\r\n sm: \"h-9 rounded-md px-3\",\r\n lg: \"h-11 rounded-md px-8\",\r\n icon: \"h-10 w-10\",\r\n \"icon-sm\": \"h-8 w-8\",\r\n \"icon-xs\": \"h-6 w-6\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean\r\n}\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n return (\r\n <Comp\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nButton.displayName = \"Button\"\r\n\r\nexport { Button, buttonVariants }","import * as React from \"react\"\r\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\r\n\r\nimport { cn } from \"../../utils\"\r\nimport { buttonVariants } from \"./button\"\r\n\r\nconst AlertDialog = AlertDialogPrimitive.Root\r\n\r\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\r\n\r\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\r\n\r\nconst AlertDialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\r\n\r\nconst AlertDialogContent = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPortal>\r\n <AlertDialogOverlay />\r\n <AlertDialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </AlertDialogPortal>\r\n))\r\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\r\n\r\nconst AlertDialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left bg-primary text-primary-foreground px-6 py-4 -mx-6 -mt-6 mb-6 rounded-t-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\r\n\r\nconst AlertDialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\r\n\r\nconst AlertDialogTitle = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\r\n\r\nconst AlertDialogDescription = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogDescription.displayName =\r\n AlertDialogPrimitive.Description.displayName\r\n\r\nconst AlertDialogAction = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Action\r\n ref={ref}\r\n className={cn(buttonVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\r\n\r\nconst AlertDialogCancel = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Cancel\r\n ref={ref}\r\n className={cn(\r\n buttonVariants({ variant: \"outline\" }),\r\n \"mt-2 sm:mt-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\r\n\r\nexport {\r\n AlertDialog,\r\n AlertDialogPortal,\r\n AlertDialogOverlay,\r\n AlertDialogTrigger,\r\n AlertDialogContent,\r\n AlertDialogHeader,\r\n AlertDialogFooter,\r\n AlertDialogTitle,\r\n AlertDialogDescription,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n}","import * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst alertVariants = cva(\r\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-background text-foreground\",\r\n destructive:\r\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\nconst Alert = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\r\n>(({ className, variant, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n role=\"alert\"\r\n className={cn(alertVariants({ variant }), className)}\r\n {...props}\r\n />\r\n))\r\nAlert.displayName = \"Alert\"\r\n\r\nconst AlertTitle = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h5\r\n ref={ref}\r\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertTitle.displayName = \"AlertTitle\"\r\n\r\nconst AlertDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDescription.displayName = \"AlertDescription\"\r\n\r\nexport { Alert, AlertTitle, AlertDescription }\r\n","import * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst badgeVariants = cva(\r\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\r\n secondary:\r\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n destructive:\r\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\r\n outline: \"text-foreground\",\r\n success:\r\n \"border-transparent bg-green-500 text-white hover:bg-green-600\",\r\n warning:\r\n \"border-transparent bg-yellow-500 text-white hover:bg-yellow-600\",\r\n info:\r\n \"border-transparent bg-blue-500 text-white hover:bg-blue-600\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\r\n ({ className, variant, ...props }, ref) => {\r\n return (\r\n <div ref={ref} className={cn(badgeVariants({ variant }), className)} {...props} />\r\n )\r\n }\r\n)\r\n\r\nBadge.displayName = \"Badge\"\r\n\r\nexport { Badge, badgeVariants }","import * as React from \"react\"\r\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Breadcrumb = React.forwardRef<\r\n HTMLElement,\r\n React.ComponentPropsWithoutRef<\"nav\"> & {\r\n separator?: React.ComponentType<{ className?: string }>\r\n }\r\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\r\nBreadcrumb.displayName = \"Breadcrumb\"\r\n\r\nconst BreadcrumbList = React.forwardRef<\r\n HTMLOListElement,\r\n React.ComponentPropsWithoutRef<\"ol\">\r\n>(({ className, ...props }, ref) => (\r\n <ol\r\n ref={ref}\r\n className={cn(\r\n \"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nBreadcrumbList.displayName = \"BreadcrumbList\"\r\n\r\nconst BreadcrumbItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentPropsWithoutRef<\"li\">\r\n>(({ className, ...props }, ref) => (\r\n <li\r\n ref={ref}\r\n className={cn(\"inline-flex items-center gap-1.5\", className)}\r\n {...props}\r\n />\r\n))\r\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\r\n\r\nconst BreadcrumbLink = React.forwardRef<\r\n HTMLAnchorElement,\r\n React.ComponentPropsWithoutRef<\"a\"> & {\r\n asChild?: boolean\r\n }\r\n>(({ asChild, className, ...props }, ref) => {\r\n const Comp = asChild ? React.Fragment : \"a\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n className={cn(\"transition-colors hover:text-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nBreadcrumbLink.displayName = \"BreadcrumbLink\"\r\n\r\nconst BreadcrumbPage = React.forwardRef<\r\n HTMLSpanElement,\r\n React.ComponentPropsWithoutRef<\"span\">\r\n>(({ className, ...props }, ref) => (\r\n <span\r\n ref={ref}\r\n role=\"link\"\r\n aria-disabled=\"true\"\r\n aria-current=\"page\"\r\n className={cn(\"font-normal text-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nBreadcrumbPage.displayName = \"BreadcrumbPage\"\r\n\r\nconst BreadcrumbSeparator = ({\r\n children,\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"li\">) => (\r\n <li\r\n role=\"presentation\"\r\n aria-hidden=\"true\"\r\n className={cn(\"[&>svg]:size-3.5\", className)}\r\n {...props}\r\n >\r\n {children ?? <ChevronRight />}\r\n </li>\r\n)\r\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\"\r\n\r\nconst BreadcrumbEllipsis = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"span\">) => (\r\n <span\r\n role=\"presentation\"\r\n aria-hidden=\"true\"\r\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\r\n {...props}\r\n >\r\n <MoreHorizontal className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">More</span>\r\n </span>\r\n)\r\nBreadcrumbEllipsis.displayName = \"BreadcrumbEllipsis\"\r\n\r\nexport {\r\n Breadcrumb,\r\n BreadcrumbList,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n BreadcrumbEllipsis,\r\n}","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Card = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCard.displayName = \"Card\"\r\n\r\nconst CardHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"flex flex-col space-y-1.5 p-6\", className)} {...props} />\r\n))\r\nCardHeader.displayName = \"CardHeader\"\r\n\r\nconst CardTitle = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h3\r\n ref={ref}\r\n className={cn(\r\n \"text-2xl font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCardTitle.displayName = \"CardTitle\"\r\n\r\nconst CardDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <p\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nCardDescription.displayName = \"CardDescription\"\r\n\r\nconst CardContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\r\n))\r\nCardContent.displayName = \"CardContent\"\r\n\r\nconst CardFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"flex items-center p-6 pt-0\", className)}\r\n {...props}\r\n />\r\n))\r\nCardFooter.displayName = \"CardFooter\"\r\n\r\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInput.displayName = \"Input\"\r\n\r\nexport { Input }","import * as React from \"react\"\r\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst labelVariants = cva(\r\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\r\n)\r\n\r\nconst Label = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\r\n VariantProps<typeof labelVariants>\r\n>(({ className, ...props }, ref) => (\r\n <LabelPrimitive.Root\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nLabel.displayName = LabelPrimitive.Root.displayName\r\n\r\nexport { Label }","import * as React from \"react\"\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Popover = PopoverPrimitive.Root\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n))\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent }","import React from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\r\n\r\ninterface ColorPickerProps {\r\n value?: string;\r\n onChange?: (color: string) => void;\r\n label?: string;\r\n}\r\n\r\nconst PRESET_COLORS = [\r\n '#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6',\r\n '#06b6d4', '#84cc16', '#f97316', '#ec4899', '#6b7280'\r\n];\r\n\r\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\r\n value = '#3b82f6',\r\n onChange,\r\n label\r\n}) => {\r\n return (\r\n <div className=\"space-y-2\">\r\n {label && <Label>{label}</Label>}\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n className=\"w-full justify-start text-left font-normal\"\r\n >\r\n <div\r\n className=\"h-4 w-4 rounded border mr-2\"\r\n style={{ backgroundColor: value }}\r\n />\r\n {value}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-64\">\r\n <div className=\"space-y-3\">\r\n <div>\r\n <Label htmlFor=\"color-input\">Cor personalizada</Label>\r\n <Input\r\n id=\"color-input\"\r\n type=\"color\"\r\n value={value}\r\n onChange={(e) => onChange?.(e.target.value)}\r\n className=\"h-10 w-full\"\r\n />\r\n </div>\r\n <div>\r\n <Label>Cores predefinidas</Label>\r\n <div className=\"grid grid-cols-5 gap-2 mt-2\">\r\n {PRESET_COLORS.map((color) => (\r\n <button\r\n key={color}\r\n className=\"h-8 w-8 rounded border-2 border-border hover:border-primary\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => onChange?.(color)}\r\n aria-label={`Selecionar cor ${color}`}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n};","import * as React from \"react\"\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Command = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommand.displayName = \"Command\"\r\n\r\ninterface CommandDialogProps {\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n children: React.ReactNode\r\n}\r\n\r\nconst CommandDialog = ({ children, ...props }: CommandDialogProps) => {\r\n return (\r\n <div {...props}>\r\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\r\n {children}\r\n </Command>\r\n </div>\r\n )\r\n}\r\n\r\nconst CommandInput = React.forwardRef<\r\n HTMLInputElement,\r\n React.InputHTMLAttributes<HTMLInputElement>\r\n>(({ className, ...props }, ref) => (\r\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\r\n <input\r\n ref={ref}\r\n className={cn(\r\n \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n))\r\nCommandInput.displayName = \"CommandInput\"\r\n\r\nconst CommandList = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandList.displayName = \"CommandList\"\r\n\r\nconst CommandEmpty = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"py-6 text-center text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandEmpty.displayName = \"CommandEmpty\"\r\n\r\nconst CommandGroup = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandGroup.displayName = \"CommandGroup\"\r\n\r\nconst CommandSeparator = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"-mx-1 h-px bg-border\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandSeparator.displayName = \"CommandSeparator\"\r\n\r\nconst CommandItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & {\r\n disabled?: boolean\r\n onSelect?: (value: string) => void\r\n value?: string\r\n }\r\n>(({ className, disabled, onSelect, value, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50\",\r\n className\r\n )}\r\n data-disabled={disabled}\r\n onClick={() => !disabled && onSelect?.(value || \"\")}\r\n {...props}\r\n />\r\n))\r\nCommandItem.displayName = \"CommandItem\"\r\n\r\nconst CommandShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\r\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\nCommandShortcut.displayName = \"CommandShortcut\"\r\n\r\nexport {\r\n Command,\r\n CommandDialog,\r\n CommandInput,\r\n CommandList,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandItem,\r\n CommandSeparator,\r\n CommandShortcut,\r\n}","import { ReactNode } from \"react\"\r\nimport { cn } from \"../../utils\"\r\nimport { Card, CardContent } from \"./card\"\r\n\r\ninterface DataListProps {\r\n children: ReactNode\r\n className?: string\r\n}\r\n\r\ninterface DataListItemProps {\r\n children: ReactNode\r\n onClick?: () => void\r\n className?: string\r\n}\r\n\r\ninterface DataListFieldProps {\r\n label: string\r\n value: ReactNode\r\n className?: string\r\n}\r\n\r\nfunction DataListRoot({ children, className }: DataListProps) {\r\n return (\r\n <div className={cn(\"space-y-4\", className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nfunction DataListItem({ children, onClick, className }: DataListItemProps) {\r\n return (\r\n <Card \r\n className={cn(\r\n \"transition-colors\",\r\n onClick && \"cursor-pointer hover:bg-muted/50\",\r\n className\r\n )}\r\n onClick={onClick}\r\n >\r\n <CardContent className=\"p-4\">\r\n {children}\r\n </CardContent>\r\n </Card>\r\n )\r\n}\r\n\r\nfunction DataListField({ label, value, className }: DataListFieldProps) {\r\n return (\r\n <div className={cn(\"flex justify-between items-center text-sm\", className)}>\r\n <span className=\"text-muted-foreground font-medium\">{label}:</span>\r\n <span className=\"text-foreground\">{value}</span>\r\n </div>\r\n )\r\n}\r\n\r\nexport const DataList = {\r\n Root: DataListRoot,\r\n Item: DataListItem,\r\n Field: DataListField\r\n}","import React, { useState, useEffect } from 'react';\r\nimport { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from './alert-dialog';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\n\r\ninterface DeleteConfirmationItem {\r\n id: string;\r\n title: string;\r\n}\r\n\r\ninterface DeleteConfirmationDialogProps<T extends DeleteConfirmationItem> {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n item?: T;\r\n onConfirm: (item: T) => void;\r\n entityName?: string;\r\n isDeleting?: boolean;\r\n}\r\n\r\nconst DeleteConfirmationDialog = <T extends DeleteConfirmationItem>({\r\n open,\r\n onOpenChange,\r\n item,\r\n onConfirm,\r\n entityName = 'item',\r\n isDeleting = false\r\n}: DeleteConfirmationDialogProps<T>) => {\r\n const [confirmationText, setConfirmationText] = useState('');\r\n \r\n // Reset state when dialog opens/closes\r\n useEffect(() => {\r\n if (!open) {\r\n setConfirmationText('');\r\n }\r\n }, [open]);\r\n \r\n const handleCancel = () => {\r\n setConfirmationText('');\r\n onOpenChange(false);\r\n };\r\n \r\n const handleConfirm = () => {\r\n if (item && confirmationText === item.title) {\r\n onConfirm(item);\r\n setConfirmationText('');\r\n onOpenChange(false);\r\n }\r\n };\r\n \r\n const isConfirmationValid = confirmationText === item?.title;\r\n \r\n if (!item) return null;\r\n \r\n return (\r\n <AlertDialog open={open} onOpenChange={handleCancel}>\r\n <AlertDialogContent className=\"sm:max-w-[500px]\">\r\n <AlertDialogHeader>\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-destructive/10 flex items-center justify-center\">\r\n <span className=\"text-destructive font-semibold text-sm\">!</span>\r\n </div>\r\n <div className=\"flex-1\">\r\n <AlertDialogTitle className=\"text-lg font-semibold\">\r\n Confirmar Exclusão\r\n </AlertDialogTitle>\r\n </div>\r\n </div>\r\n </AlertDialogHeader>\r\n \r\n <AlertDialogDescription asChild>\r\n <div className=\"space-y-4\">\r\n <div className=\"text-sm text-muted-foreground\">\r\n <p className=\"mb-2\">\r\n Você está prestes a excluir permanentemente o {entityName}:\r\n </p>\r\n <div className=\"p-3 bg-muted rounded-md border-l-4 border-l-destructive\">\r\n <p className=\"font-medium text-foreground\">{item.title}</p>\r\n </div>\r\n </div>\r\n \r\n <div className=\"bg-orange-50 border border-orange-200 rounded-md p-3\">\r\n <div className=\"flex items-start space-x-2\">\r\n <div className=\"flex-shrink-0 w-5 h-5 rounded-full bg-orange-500 flex items-center justify-center mt-0.5\">\r\n <span className=\"text-white font-bold text-xs\">!</span>\r\n </div>\r\n <div className=\"text-sm text-orange-800\">\r\n <p className=\"font-medium mb-1\">Atenção!</p>\r\n <p>Esta ação não pode ser desfeita. O {entityName} será removido permanentemente do sistema.</p>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"confirmation\" className=\"text-sm font-medium\">\r\n Para confirmar, digite <strong>\"{item.title}\"</strong> abaixo:\r\n </Label>\r\n <Input\r\n id=\"confirmation\"\r\n type=\"text\"\r\n value={confirmationText}\r\n onChange={(e) => setConfirmationText(e.target.value)}\r\n placeholder={`Digite: ${item.title}`}\r\n className=\"w-full\"\r\n />\r\n </div>\r\n </div>\r\n </AlertDialogDescription>\r\n \r\n <AlertDialogFooter>\r\n <AlertDialogCancel onClick={handleCancel}>\r\n Cancelar\r\n </AlertDialogCancel>\r\n <AlertDialogAction \r\n onClick={handleConfirm}\r\n disabled={!isConfirmationValid || isDeleting}\r\n className=\"bg-destructive hover:bg-destructive/90 text-destructive-foreground\"\r\n >\r\n {isDeleting ? 'Removendo...' : `Excluir ${entityName}`}\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n );\r\n};\r\n\r\nexport default DeleteConfirmationDialog;","import * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Dialog = DialogPrimitive.Root\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger\r\n\r\nconst DialogPortal = DialogPrimitive.Portal\r\n\r\nconst DialogClose = DialogPrimitive.Close\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\r\n\r\nconst DialogContent = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\r\n>(({ className, children, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-background p-6 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg overflow-hidden\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 rounded-sm text-white opacity-70 ring-offset-background transition-opacity hover:opacity-100 hover:text-white focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n))\r\nDialogContent.displayName = DialogPrimitive.Content.displayName\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-1.5 text-center sm:text-left bg-primary text-primary-foreground px-6 py-4 -mx-6 -mt-6 mb-3 rounded-t-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\r\n \"text-lg font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName\r\n\r\nconst DialogDescription = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n","import * as React from \"react\"\r\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\r\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root\r\n\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\r\n\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\r\n\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\r\n\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\r\n\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\r\n\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default select-none items-center px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto h-4 w-4\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n))\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName\r\n\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(\r\n \"z-50 min-w-[8rem] overflow-hidden border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-[100] min-w-[8rem] overflow-hidden rounded-md border bg-white shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:bg-gray-800 dark:border-gray-700\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n))\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\r\n\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\r\n\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n))\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName\r\n\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Circle className=\"h-2 w-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n))\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\r\n\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn(\r\n \"px-2 py-1.5 text-sm font-semibold\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\r\n\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\r\n\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuGroup,\r\n DropdownMenuPortal,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuRadioGroup,\r\n}\r\n","import { ReactNode } from \"react\"\r\nimport { cn } from \"../../utils\"\r\nimport { FileX, Search, AlertCircle } from \"lucide-react\"\r\nimport { Button } from \"./button\"\r\n\r\ninterface EmptyStateProps {\r\n icon?: ReactNode\r\n title: string\r\n description?: string\r\n action?: {\r\n label: string\r\n onClick: () => void\r\n }\r\n className?: string\r\n variant?: \"default\" | \"search\" | \"error\"\r\n}\r\n\r\nconst variantIcons = {\r\n default: FileX,\r\n search: Search,\r\n error: AlertCircle\r\n}\r\n\r\nexport function EmptyState({\r\n icon,\r\n title,\r\n description,\r\n action,\r\n className,\r\n variant = \"default\"\r\n}: EmptyStateProps) {\r\n const IconComponent = icon ? () => icon : variantIcons[variant]\r\n\r\n return (\r\n <div className={cn(\r\n \"flex flex-col items-center justify-center py-12 px-4 text-center\",\r\n className\r\n )}>\r\n <div className=\"flex items-center justify-center w-16 h-16 rounded-full bg-muted mb-4\">\r\n <IconComponent className=\"h-8 w-8 text-muted-foreground\" />\r\n </div>\r\n \r\n <h3 className=\"text-lg font-semibold mb-2\">{title}</h3>\r\n \r\n {description && (\r\n <p className=\"text-muted-foreground mb-6 max-w-sm\">\r\n {description}\r\n </p>\r\n )}\r\n \r\n {action && (\r\n <Button onClick={action.onClick} variant=\"outline\">\r\n {action.label}\r\n </Button>\r\n )}\r\n </div>\r\n )\r\n}","// Gerenciamento centralizado de tokens\r\nconst STORAGE_KEYS = {\r\n qualiex_access: 'qualiex_access_token',\r\n qualiex_id: 'qualiex_id_token',\r\n supabase: 'supabase_token',\r\n oauth_state: 'oauth_state',\r\n oauth_nonce: 'oauth_nonce',\r\n selected_alias: 'selected_alias',\r\n} as const;\r\n\r\nexport const TokenManager = {\r\n // Qualiex Access Token\r\n setAccessToken: (token: string) => localStorage.setItem(STORAGE_KEYS.qualiex_access, token),\r\n getAccessToken: () => localStorage.getItem(STORAGE_KEYS.qualiex_access),\r\n \r\n // Qualiex ID Token\r\n setIdToken: (token: string) => localStorage.setItem(STORAGE_KEYS.qualiex_id, token),\r\n getIdToken: () => localStorage.getItem(STORAGE_KEYS.qualiex_id),\r\n \r\n // Supabase Token\r\n setSupabaseToken: (token: string) => localStorage.setItem(STORAGE_KEYS.supabase, token),\r\n getSupabaseToken: () => localStorage.getItem(STORAGE_KEYS.supabase),\r\n \r\n // OAuth State\r\n setOAuthState: (state: string) => sessionStorage.setItem(STORAGE_KEYS.oauth_state, state),\r\n getOAuthState: () => sessionStorage.getItem(STORAGE_KEYS.oauth_state),\r\n clearOAuthState: () => sessionStorage.removeItem(STORAGE_KEYS.oauth_state),\r\n \r\n // OAuth Nonce\r\n setOAuthNonce: (nonce: string) => sessionStorage.setItem(STORAGE_KEYS.oauth_nonce, nonce),\r\n getOAuthNonce: () => sessionStorage.getItem(STORAGE_KEYS.oauth_nonce),\r\n clearOAuthNonce: () => sessionStorage.removeItem(STORAGE_KEYS.oauth_nonce),\r\n \r\n // Selected Alias\r\n setSelectedAlias: (alias: string) => localStorage.setItem(STORAGE_KEYS.selected_alias, alias),\r\n getSelectedAlias: () => localStorage.getItem(STORAGE_KEYS.selected_alias),\r\n clearSelectedAlias: () => localStorage.removeItem(STORAGE_KEYS.selected_alias),\r\n \r\n // Generators\r\n generateOAuthState: (): string => {\r\n return 'Lw==';\r\n },\r\n generateOAuthNonce: (): string => {\r\n const randomBytes = new Uint8Array(32);\r\n crypto.getRandomValues(randomBytes);\r\n return btoa(String.fromCharCode(...randomBytes)).replace(/[+/=]/g, '');\r\n },\r\n \r\n // Utils\r\n hasAllTokens: () => !!(TokenManager.getAccessToken() && TokenManager.getIdToken()),\r\n clearAll: () => {\r\n localStorage.removeItem(STORAGE_KEYS.qualiex_access);\r\n localStorage.removeItem(STORAGE_KEYS.qualiex_id);\r\n localStorage.removeItem(STORAGE_KEYS.supabase);\r\n localStorage.removeItem(STORAGE_KEYS.selected_alias);\r\n sessionStorage.removeItem(STORAGE_KEYS.oauth_state);\r\n sessionStorage.removeItem(STORAGE_KEYS.oauth_nonce);\r\n },\r\n \r\n // Token validation\r\n isTokenExpired: (token: string): boolean => {\r\n try {\r\n const payload = JSON.parse(atob(token.split('.')[1]));\r\n return payload.exp * 1000 < Date.now();\r\n } catch {\r\n return true;\r\n }\r\n },\r\n\r\n // Supabase token validation\r\n isSupabaseTokenValid: (): boolean => {\r\n const token = TokenManager.getSupabaseToken();\r\n return token ? !TokenManager.isTokenExpired(token) : false;\r\n },\r\n\r\n getValidSupabaseToken: (): string | null => {\r\n const token = TokenManager.getSupabaseToken();\r\n if (!token || TokenManager.isTokenExpired(token)) {\r\n return null;\r\n }\r\n return token;\r\n },\r\n\r\n // Extrair dados do token Supabase\r\n extractTokenData: () => {\r\n const token = TokenManager.getSupabaseToken();\r\n \r\n if (!token) {\r\n return null;\r\n }\r\n\r\n try {\r\n // Extrair alias e companyId do token\r\n const payload = JSON.parse(atob(token.split('.')[1]));\r\n const alias = payload.alias || payload.default || payload.user_alias;\r\n \r\n // Tentar extrair companyId de diferentes formas\r\n let companyId = payload.company_id;\r\n if (!companyId && alias) {\r\n // Procurar por campos co* que contenham o alias\r\n for (const key in payload) {\r\n if (key.startsWith('co') && /^co\\d+$/.test(key)) {\r\n const coField = payload[key];\r\n if (coField && typeof coField === 'string') {\r\n const parts = coField.split(';');\r\n if (parts.length > 7 && parts[0] === alias) {\r\n companyId = parts[7]; // companyId está na posição 7\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { alias, companyId, payload };\r\n } catch {\r\n return null;\r\n }\r\n },\r\n};","import * as React from \"react\"\r\n\r\nimport type {\r\n ToastActionElement,\r\n ToastProps,\r\n} from \"../components/ui/toast\"\r\n\r\nconst TOAST_LIMIT = 1\r\nconst TOAST_REMOVE_DELAY = 1000000\r\n\r\ntype ToasterToast = ToastProps & {\r\n id: string\r\n title?: React.ReactNode\r\n description?: React.ReactNode\r\n action?: ToastActionElement\r\n}\r\n\r\nconst actionTypes = {\r\n ADD_TOAST: \"ADD_TOAST\",\r\n UPDATE_TOAST: \"UPDATE_TOAST\",\r\n DISMISS_TOAST: \"DISMISS_TOAST\",\r\n REMOVE_TOAST: \"REMOVE_TOAST\",\r\n} as const\r\n\r\nlet count = 0\r\n\r\nfunction genId() {\r\n count = (count + 1) % Number.MAX_SAFE_INTEGER\r\n return count.toString()\r\n}\r\n\r\ntype ActionType = typeof actionTypes\r\n\r\ntype Action =\r\n | {\r\n type: ActionType[\"ADD_TOAST\"]\r\n toast: ToasterToast\r\n }\r\n | {\r\n type: ActionType[\"UPDATE_TOAST\"]\r\n toast: Partial<ToasterToast>\r\n }\r\n | {\r\n type: ActionType[\"DISMISS_TOAST\"]\r\n toastId?: ToasterToast[\"id\"]\r\n }\r\n | {\r\n type: ActionType[\"REMOVE_TOAST\"]\r\n toastId?: ToasterToast[\"id\"]\r\n }\r\n\r\ninterface State {\r\n toasts: ToasterToast[]\r\n}\r\n\r\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\r\n\r\nconst addToRemoveQueue = (toastId: string) => {\r\n if (toastTimeouts.has(toastId)) {\r\n return\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n toastTimeouts.delete(toastId)\r\n dispatch({\r\n type: \"REMOVE_TOAST\",\r\n toastId: toastId,\r\n })\r\n }, TOAST_REMOVE_DELAY)\r\n\r\n toastTimeouts.set(toastId, timeout)\r\n}\r\n\r\nexport const reducer = (state: State, action: Action): State => {\r\n switch (action.type) {\r\n case \"ADD_TOAST\":\r\n return {\r\n ...state,\r\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\r\n }\r\n\r\n case \"UPDATE_TOAST\":\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === action.toast.id ? { ...t, ...action.toast } : t\r\n ),\r\n }\r\n\r\n case \"DISMISS_TOAST\": {\r\n const { toastId } = action\r\n\r\n // ! Side effects ! - This could be extracted into a dismissToast() action,\r\n // but I'll keep it here for simplicity\r\n if (toastId) {\r\n addToRemoveQueue(toastId)\r\n } else {\r\n state.toasts.forEach((toast) => {\r\n addToRemoveQueue(toast.id)\r\n })\r\n }\r\n\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === toastId || toastId === undefined\r\n ? {\r\n ...t,\r\n open: false,\r\n }\r\n : t\r\n ),\r\n }\r\n }\r\n case \"REMOVE_TOAST\":\r\n if (action.toastId === undefined) {\r\n return {\r\n ...state,\r\n toasts: [],\r\n }\r\n }\r\n return {\r\n ...state,\r\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\r\n }\r\n }\r\n}\r\n\r\nconst listeners: Array<(state: State) => void> = []\r\n\r\nlet memoryState: State = { toasts: [] }\r\n\r\nfunction dispatch(action: Action) {\r\n memoryState = reducer(memoryState, action)\r\n listeners.forEach((listener) => {\r\n listener(memoryState)\r\n })\r\n}\r\n\r\ntype Toast = Omit<ToasterToast, \"id\">\r\n\r\nfunction toast({ ...props }: Toast) {\r\n const id = genId()\r\n\r\n const update = (props: ToasterToast) =>\r\n dispatch({\r\n type: \"UPDATE_TOAST\",\r\n toast: { ...props, id },\r\n })\r\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id })\r\n\r\n dispatch({\r\n type: \"ADD_TOAST\",\r\n toast: {\r\n ...props,\r\n id,\r\n open: true,\r\n onOpenChange: (open) => {\r\n if (!open) dismiss()\r\n },\r\n },\r\n })\r\n\r\n return {\r\n id: id,\r\n dismiss,\r\n update,\r\n }\r\n}\r\n\r\nfunction useToast() {\r\n const [state, setState] = React.useState<State>(memoryState)\r\n\r\n React.useEffect(() => {\r\n listeners.push(setState)\r\n return () => {\r\n const index = listeners.indexOf(setState)\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n }\r\n }, [state])\r\n\r\n return {\r\n ...state,\r\n toast,\r\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\r\n }\r\n}\r\n\r\nexport { useToast, toast }\r\n","// ============= SIMPLIFIED ERROR SERVICE =============\r\n\r\nimport { toast } from '../hooks/use-toast';\r\n\r\ninterface ErrorEntry {\r\n id: string;\r\n message: string;\r\n timestamp: number;\r\n count: number;\r\n}\r\n\r\nclass ErrorService {\r\n private errors: ErrorEntry[] = [];\r\n private toastCount = 0;\r\n private lastToastTime = 0;\r\n\r\n // Simple error handling\r\n handleError(error: Error | string, showToast = true) {\r\n const message = typeof error === 'string' ? error : error.message;\r\n \r\n // Add to log\r\n this.errors.push({\r\n id: Date.now().toString(),\r\n message,\r\n timestamp: Date.now(),\r\n count: 1\r\n });\r\n\r\n // Show toast with rate limiting\r\n if (showToast && this.shouldShowToast()) {\r\n toast({\r\n title: 'Erro',\r\n description: message,\r\n variant: 'destructive',\r\n });\r\n }\r\n\r\n \r\n }\r\n\r\n // Simple success notification\r\n success(title: string, description?: string) {\r\n toast({\r\n title,\r\n description,\r\n variant: 'default',\r\n });\r\n }\r\n\r\n // Rate limiting for toasts\r\n private shouldShowToast(): boolean {\r\n const now = Date.now();\r\n if (now - this.lastToastTime > 60000) { // Reset after 1 minute\r\n this.toastCount = 0;\r\n }\r\n \r\n if (this.toastCount < 3) { // Max 3 toasts per minute\r\n this.toastCount++;\r\n this.lastToastTime = now;\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n // Get recent errors\r\n getErrors() {\r\n return this.errors.slice(-50); // Keep last 50 errors\r\n }\r\n\r\n // Clear errors\r\n clearErrors() {\r\n this.errors = [];\r\n }\r\n}\r\n\r\nexport const errorService = new ErrorService();","// ============= DEFINITIVE SUPABASE SINGLETON =============\r\n\r\nimport { createClient } from '@supabase/supabase-js';\r\nimport type { Database } from './types';\r\nimport { TokenManager } from '../auth/services/TokenManager';\r\nimport { errorService } from '../services/ErrorService';\r\n\r\n// Configuração do Supabase\r\nconst SUPABASE_URL = import.meta.env.VITE_SUPABASE_URL;\r\nconst SUPABASE_PUBLISHABLE_KEY = import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY;\r\n\r\n// ============= SINGLETON PATTERN ROBUSTO =============\r\n\r\nclass SupabaseSingleton {\r\n private static instance: SupabaseSingleton;\r\n private client: ReturnType<typeof createClient<Database>>;\r\n private currentToken: string | null = null;\r\n private instanceCount = 0;\r\n\r\n private constructor() {\r\n this.instanceCount++;\r\n \r\n // Create initial client without token\r\n this.client = this.createClientWithToken(null);\r\n }\r\n\r\n private createClientWithToken(token: string | null) {\r\n const headers: Record<string, string> = {\r\n 'apikey': SUPABASE_PUBLISHABLE_KEY\r\n };\r\n\r\n if (token && this.isTokenValid(token)) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n return createClient<Database>(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, {\r\n auth: {\r\n persistSession: false,\r\n autoRefreshToken: false,\r\n },\r\n global: {\r\n headers\r\n }\r\n });\r\n }\r\n\r\n public static getInstance(): SupabaseSingleton {\r\n if (!SupabaseSingleton.instance) {\r\n SupabaseSingleton.instance = new SupabaseSingleton();\r\n }\r\n return SupabaseSingleton.instance;\r\n }\r\n\r\n public getClient() {\r\n const token = TokenManager.getSupabaseToken();\r\n \r\n // Se o token mudou, recrie o cliente com o novo token\r\n if (token !== this.currentToken) {\r\n this.client = this.createClientWithToken(token);\r\n this.currentToken = token;\r\n }\r\n \r\n return this.client;\r\n }\r\n\r\n private isTokenValid(token: string): boolean {\r\n try {\r\n const payload = JSON.parse(atob(token.split('.')[1]));\r\n const now = Math.floor(Date.now() / 1000);\r\n return payload.exp > now;\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : '❌ Supabase - Error validating token', false);\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n// ============= EXPORTS =============\r\n\r\nexport const getSupabaseClient = () => {\r\n return SupabaseSingleton.getInstance().getClient();\r\n};","// Auth Configuration\r\nexport const AUTH_CONFIG = {\r\n oauth: {\r\n authUrl: import.meta.env.VITE_OAUTH_AUTH_URL,\r\n clientId: import.meta.env.VITE_OAUTH_CLIENT_ID,\r\n responseType: 'id_token token',\r\n scope: 'openid profile email',\r\n },\r\n} as const;\r\n\r\n// CRUD Configuration \r\nexport const CRUD_CONFIG = {\r\n pagination: {\r\n defaultPageSize: 25,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n },\r\n sorting: {\r\n defaultField: 'updated_at',\r\n defaultDirection: 'desc' as const,\r\n },\r\n} as const;\r\n\r\n// Search Configuration\r\nexport const SEARCH_CONFIG = {\r\n debounceDelay: 500,\r\n} as const;\r\n\r\n// Environment Detection\r\nexport const isDevEnvironment = (): boolean => {\r\n const origin = window.location.origin;\r\n \r\n // Apenas localhost, 127.0.0.1 e lovable.dev são desenvolvimento\r\n const isDev = (\r\n origin.includes('localhost') || \r\n origin.includes('127.0.0.1') || \r\n origin.includes('id-preview') ||\r\n origin.includes('lovable.dev') ||\r\n import.meta.env.DEV\r\n );\r\n \r\n return isDev;\r\n};\r\n\r\n// Query Keys\r\nexport const QUERY_KEYS = {\r\n crud: (entity: string) => [entity] as const,\r\n list: (entity: string, filters?: Record<string, any>) => [entity, 'list', filters] as const,\r\n detail: (entity: string, id: string) => [entity, 'detail', id] as const,\r\n} as const;\r\n\r\n// Messages\r\nexport const MESSAGES = {\r\n success: {\r\n created: (entity: string) => `${entity} criado com sucesso`,\r\n updated: (entity: string) => `${entity} atualizado com sucesso`, \r\n deleted: (entity: string) => `${entity} removido com sucesso`,\r\n },\r\n error: {\r\n create: (entity: string) => `Erro ao criar ${entity}`,\r\n update: (entity: string) => `Erro ao atualizar ${entity}`,\r\n delete: (entity: string) => `Erro ao remover ${entity}`,\r\n load: (entity: string) => `Erro ao carregar ${entity}`,\r\n },\r\n} as const;","import { getSupabaseClient } from '../../supabase/SupabaseSingleton';\r\nimport { TokenManager } from './TokenManager';\r\n// Token decoder integrated\r\nimport { AUTH_CONFIG, isDevEnvironment } from '../../config';\r\nimport type { UserInfo, Company, AuthState } from '../../types';\r\n\r\nexport class AuthService {\r\n /**\r\n * Inicializa o estado de autenticação verificando apenas tokens armazenados\r\n * Tokens da URL devem ser processados exclusivamente na CallbackPage\r\n */\r\n static async initialize(): Promise<AuthState> {\r\n try {\r\n // Verificar apenas tokens armazenados no localStorage\r\n if (!TokenManager.hasAllTokens()) {\r\n return {\r\n isAuthenticated: false,\r\n isLoading: false,\r\n user: null,\r\n alias: null,\r\n companies: [],\r\n };\r\n }\r\n\r\n // Decodificar informações dos tokens armazenados\r\n const storedAccessToken = TokenManager.getAccessToken()!;\r\n const storedIdToken = TokenManager.getIdToken()!;\r\n\r\n const user = this.extractUserFromIdToken(storedIdToken);\r\n const companies = this.extractCompaniesFromIdToken(storedIdToken);\r\n const defaultAlias = this.extractAliasFromAccessToken(storedAccessToken);\r\n \r\n // Priority: selected alias (if valid) > default alias > first company\r\n const storedSelectedAlias = TokenManager.getSelectedAlias();\r\n const isSelectedAliasValid = storedSelectedAlias && companies.some(c => c.alias === storedSelectedAlias);\r\n const selectedAlias = isSelectedAliasValid ? storedSelectedAlias : (defaultAlias || companies[0]?.alias || null);\r\n\r\n // Verificar se precisa regenerar token Supabase\r\n if (!TokenManager.isSupabaseTokenValid() && selectedAlias) {\r\n const newSupabaseToken = await this.generateSupabaseToken(storedAccessToken, selectedAlias);\r\n if (newSupabaseToken) {\r\n TokenManager.setSupabaseToken(newSupabaseToken);\r\n }\r\n }\r\n\r\n return {\r\n isAuthenticated: true,\r\n isLoading: false,\r\n user,\r\n alias: selectedAlias,\r\n companies,\r\n };\r\n } catch (error) {\r\n console.error('[Auth] Erro na inicialização:', error);\r\n return {\r\n isAuthenticated: false,\r\n isLoading: false,\r\n user: null,\r\n alias: null,\r\n companies: [],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Login para ambiente de desenvolvimento - redireciona para callback com tokens\r\n */\r\n static async loginDev(): Promise<boolean> {\r\n try {\r\n const supabase = getSupabaseClient();\r\n const { data, error } = await supabase.functions.invoke('dev-tokens', {\r\n body: { environment: 'development' }\r\n });\r\n\r\n if (error) {\r\n console.error('[Auth] Erro na Edge Function dev-tokens:', error);\r\n return false;\r\n }\r\n\r\n if (!data?.access_token || !data?.id_token) {\r\n console.error('[Auth] Tokens ausentes na resposta');\r\n return false;\r\n }\r\n\r\n // Redirecionar para callback com tokens na URL (mesmo fluxo que prod)\r\n const callbackUrl = new URL('/callback', window.location.origin);\r\n callbackUrl.hash = `access_token=${data.access_token}&id_token=${data.id_token}&token_type=bearer`;\r\n \r\n window.location.href = callbackUrl.toString();\r\n return true;\r\n } catch (error) {\r\n console.error('[Auth] Erro no login dev:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Login para ambiente de produção (OAuth)\r\n */\r\n static loginProd(): void {\r\n // Gerar e armazenar state e nonce para verificação\r\n const state = TokenManager.generateOAuthState();\r\n TokenManager.setOAuthState(state);\r\n const nonce = TokenManager.generateOAuthNonce();\r\n TokenManager.setOAuthNonce(nonce);\r\n\r\n // Construir URL de autorização\r\n const redirectUri = `${window.location.origin}/callback`;\r\n const authUrl = new URL(AUTH_CONFIG.oauth.authUrl);\r\n authUrl.searchParams.set('client_id', AUTH_CONFIG.oauth.clientId);\r\n authUrl.searchParams.set('response_type', AUTH_CONFIG.oauth.responseType);\r\n authUrl.searchParams.set('scope', AUTH_CONFIG.oauth.scope);\r\n authUrl.searchParams.set('redirect_uri', redirectUri);\r\n authUrl.searchParams.set('state', state);\r\n authUrl.searchParams.set('nonce', nonce);\r\n authUrl.searchParams.set('response_mode', 'fragment');\r\n\r\n // Verificar se estamos em produção\r\n const isProduction = !isDevEnvironment();\r\n\r\n window.location.href = authUrl.toString();\r\n }\r\n\r\n /**\r\n * Processa o callback do OAuth (simplificado)\r\n */\r\n static async processCallback(): Promise<boolean> {\r\n try {\r\n // Idempotent: if tokens already stored, ensure Supabase token and return\r\n if (TokenManager.hasAllTokens()) {\r\n const existingSupabase = TokenManager.getValidSupabaseToken();\r\n if (!existingSupabase) {\r\n const storedAccess = TokenManager.getAccessToken()!;\r\n const aliasFromAccess = this.extractAliasFromAccessToken(storedAccess);\r\n const aliasFallback = this.extractCompaniesFromIdToken(TokenManager.getIdToken()!)[0]?.alias;\r\n const alias = aliasFromAccess || aliasFallback;\r\n if (alias) {\r\n const supa = await this.generateSupabaseToken(storedAccess, alias);\r\n if (supa) TokenManager.setSupabaseToken(supa);\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n const hashParams = new URLSearchParams(window.location.hash.startsWith('#') ? window.location.hash.substring(1) : window.location.hash);\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const getParam = (key: string) => hashParams.get(key) || searchParams.get(key);\r\n \r\n const accessToken = getParam('access_token');\r\n const idToken = getParam('id_token');\r\n const error = getParam('error');\r\n\r\n // Verificar se há erro no callback\r\n if (error) {\r\n throw new Error(`Erro OAuth: ${error}`);\r\n }\r\n\r\n // Verificar se tokens estão presentes\r\n if (!accessToken || !idToken) {\r\n throw new Error('Tokens não encontrados na URL de callback');\r\n }\r\n\r\n // Armazenar tokens\r\n TokenManager.setAccessToken(accessToken);\r\n TokenManager.setIdToken(idToken);\r\n\r\n // Extrair alias do access token\r\n const alias = this.extractAliasFromAccessToken(accessToken);\r\n \r\n if (!alias) {\r\n // Fallback: usar primeira empresa do ID token\r\n const companies = this.extractCompaniesFromIdToken(idToken);\r\n if (companies.length === 0) {\r\n throw new Error('Nenhuma empresa encontrada nos tokens');\r\n }\r\n const firstAlias = companies[0].alias;\r\n const supabaseToken = await this.generateSupabaseToken(accessToken, firstAlias);\r\n if (!supabaseToken) {\r\n throw new Error('Falha ao gerar token Supabase');\r\n }\r\n TokenManager.setSupabaseToken(supabaseToken);\r\n } else {\r\n // Gerar token Supabase com alias encontrado\r\n const supabaseToken = await this.generateSupabaseToken(accessToken, alias);\r\n if (!supabaseToken) {\r\n throw new Error('Falha ao gerar token Supabase');\r\n }\r\n TokenManager.setSupabaseToken(supabaseToken);\r\n }\r\n\r\n // Limpar parâmetros OAuth do localStorage (se existirem)\r\n TokenManager.clearOAuthState();\r\n TokenManager.clearOAuthNonce();\r\n\r\n return true;\r\n } catch (error) {\r\n console.error('❌ [CallbackPage] Erro ao processar callback:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Logout do usuário\r\n */\r\n static logout(): void {\r\n TokenManager.clearAll();\r\n window.location.href = '/';\r\n }\r\n\r\n /**\r\n * Decodifica um token JWT\r\n */\r\n private static decodeToken(token: string): any {\r\n try {\r\n const payload = token.split('.')[1];\r\n const decoded = atob(payload);\r\n \r\n // Converter para UTF-8 corretamente\r\n const bytes = new Uint8Array(decoded.length);\r\n for (let i = 0; i < decoded.length; i++) {\r\n bytes[i] = decoded.charCodeAt(i);\r\n }\r\n \r\n const utf8String = new TextDecoder('utf-8').decode(bytes);\r\n return JSON.parse(utf8String);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Extrai informações do usuário do ID token\r\n */\r\n private static extractUserFromIdToken(idToken: string): UserInfo | null {\r\n const payload = this.decodeToken(idToken);\r\n if (!payload) return null;\r\n\r\n return {\r\n id: payload.subNewId,\r\n email: payload.email,\r\n name: payload.name,\r\n identifier: payload.identifier,\r\n photoDate: payload['photo-date'],\r\n };\r\n }\r\n\r\n /**\r\n * Extrai empresas do ID token\r\n */\r\n private static extractCompaniesFromIdToken(idToken: string): Company[] {\r\n const payload = this.decodeToken(idToken);\r\n if (!payload) return [];\r\n\r\n const companies: Company[] = [];\r\n \r\n // Buscar campos co* dinâmicos\r\n Object.keys(payload).forEach(key => {\r\n const match = key.match(/^co(\\d+)$/);\r\n if (match && typeof payload[key] === 'string') {\r\n // Formato: \"alias;id1;id2;Nome da Empresa;status\"\r\n const parts = payload[key].split(';');\r\n if (parts.length >= 4) {\r\n companies.push({\r\n alias: parts[0].trim(),\r\n name: parts[3].trim(),\r\n });\r\n } else {\r\n // Fallback para formato original: \"alias|Nome da Empresa\"\r\n const [alias, name] = payload[key].split('|');\r\n if (alias && name) {\r\n companies.push({\r\n alias: alias.trim(),\r\n name: name.trim(),\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n return companies;\r\n }\r\n\r\n /**\r\n * Extrai alias do access token (campo default)\r\n */\r\n private static extractAliasFromAccessToken(accessToken: string): string | null {\r\n const payload = this.decodeToken(accessToken);\r\n return payload?.default || null;\r\n }\r\n\r\n /**\r\n * Gera token Supabase usando access token e alias\r\n */\r\n public static async generateSupabaseToken(accessToken: string, alias: string): Promise<string | null> {\r\n try {\r\n const supabase = getSupabaseClient();\r\n const { data, error } = await supabase.functions.invoke('validate-token', {\r\n body: {\r\n access_token: accessToken,\r\n alias: alias,\r\n }\r\n });\r\n\r\n if (error) {\r\n console.error('[Auth] Erro na Edge Function validate-token:', error);\r\n return null;\r\n }\r\n\r\n if (!data?.access_token) {\r\n console.error('[Auth] Token Supabase ausente na resposta');\r\n return null;\r\n }\r\n\r\n return data.access_token;\r\n } catch (error) {\r\n console.error('[Auth] Erro ao gerar token Supabase:', error);\r\n return null;\r\n }\r\n }\r\n}","import React, { createContext, useContext, useState, useEffect, useCallback, useMemo } from 'react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { AuthState, Company } from '../../types';\r\nimport { TokenManager } from '../services/TokenManager';\r\nimport { AuthService } from '../services/AuthService';\r\n\r\n// Estado inicial padrão\r\nconst getInitialState = (): AuthState => {\r\n return {\r\n user: null,\r\n companies: [],\r\n alias: null,\r\n isAuthenticated: false,\r\n isLoading: true,\r\n };\r\n};\r\n\r\n// Tipo do contexto\r\ninterface AuthContextType extends AuthState {\r\n logout: () => void;\r\n processCallback: () => Promise<boolean>;\r\n switchUnit: (company: Company) => Promise<void>;\r\n availableUnits: Company[];\r\n \r\n // Search state (movido do AppContext)\r\n isSearchVisible: boolean;\r\n setSearchVisible: (visible: boolean) => void;\r\n clearSearch: () => void;\r\n refreshData: () => void;\r\n}\r\n\r\n// Criação do contexto\r\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\r\n\r\n// Provider\r\nexport const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n const [authState, setAuthState] = useState<AuthState>(getInitialState());\r\n const queryClient = useQueryClient();\r\n \r\n // Search state (movido do AppContext)\r\n const [isSearchVisible, setIsSearchVisible] = useState(false);\r\n const [refreshTrigger, setRefreshTrigger] = useState(0);\r\n\r\n // Função para atualizar o estado de autenticação\r\n const updateAuthState = useCallback((newState: Partial<AuthState>) => {\r\n setAuthState(prev => ({ ...prev, ...newState }));\r\n }, []);\r\n\r\n // Função para definir loading\r\n const setLoading = useCallback((isLoading: boolean) => {\r\n setAuthState(prev => ({ ...prev, isLoading }));\r\n }, []);\r\n\r\n // Função para resetar o estado\r\n const resetAuthState = useCallback(() => {\r\n setAuthState(getInitialState());\r\n }, []);\r\n\r\n // Função para trocar de unidade\r\n const switchUnit = useCallback(async (company: Company) => {\r\n try {\r\n setLoading(true);\r\n \r\n // Obter access token atual\r\n const accessToken = TokenManager.getAccessToken();\r\n if (!accessToken) {\r\n console.error('[AuthContext] Access token não encontrado para trocar unidade');\r\n return;\r\n }\r\n\r\n // Gerar novo token Supabase com o alias da nova empresa\r\n const newSupabaseToken = await AuthService.generateSupabaseToken(accessToken, company.alias);\r\n if (!newSupabaseToken) {\r\n console.error('[AuthContext] Erro ao gerar token Supabase para nova unidade');\r\n return;\r\n }\r\n\r\n // Armazenar o novo token\r\n TokenManager.setSupabaseToken(newSupabaseToken);\r\n\r\n // Armazenar alias selecionado para persistir entre reloads\r\n TokenManager.setSelectedAlias(company.alias);\r\n\r\n // Atualizar estado da aplicação\r\n updateAuthState({\r\n alias: company.alias,\r\n });\r\n\r\n // Invalidar queries para refrescar dados da nova empresa\r\n await queryClient.invalidateQueries();\r\n \r\n } catch (error) {\r\n console.error('[AuthContext] Erro ao trocar unidade', error, company);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [updateAuthState, queryClient, setLoading]);\r\n\r\n\r\n const processCallback = useCallback(async () => {\r\n return await AuthService.processCallback();\r\n }, []);\r\n\r\n const logout = useCallback(async () => {\r\n AuthService.logout();\r\n resetAuthState();\r\n await queryClient.clear();\r\n }, [resetAuthState, queryClient]);\r\n\r\n\r\n // Search functions (movidas do AppContext)\r\n const setSearchVisible = useCallback((visible: boolean) => {\r\n setIsSearchVisible(visible);\r\n }, []);\r\n\r\n const clearSearch = useCallback(() => {\r\n setRefreshTrigger(prev => prev + 1);\r\n }, []);\r\n\r\n const refreshData = useCallback(() => {\r\n setRefreshTrigger(prev => prev + 1);\r\n }, []);\r\n\r\n // Inicialização\r\n useEffect(() => {\r\n const initializeAuth = async () => {\r\n try {\r\n // Add small delay to ensure DOM is ready in production\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n \r\n const authResult = await AuthService.initialize();\r\n \r\n if (authResult && authResult.isAuthenticated) {\r\n updateAuthState({\r\n user: authResult.user,\r\n companies: authResult.companies,\r\n alias: authResult.alias, // Use the alias from AuthService instead of first company\r\n isAuthenticated: true,\r\n isLoading: false,\r\n });\r\n\r\n // Token Supabase já é gerenciado automaticamente pelo singleton\r\n } else {\r\n setLoading(false);\r\n }\r\n } catch (error) {\r\n console.error('[AuthContext] Erro na inicialização da autenticação', error);\r\n setLoading(false);\r\n }\r\n };\r\n\r\n initializeAuth();\r\n }, [updateAuthState, setLoading]);\r\n\r\n // Memorizar o contexto para evitar re-renderizações desnecessárias\r\n const contextValue = useMemo((): AuthContextType => ({\r\n ...authState,\r\n logout,\r\n processCallback,\r\n switchUnit,\r\n availableUnits: authState.companies,\r\n \r\n // Search state\r\n isSearchVisible,\r\n setSearchVisible,\r\n clearSearch,\r\n refreshData,\r\n }), [authState, logout, processCallback, switchUnit, isSearchVisible, setSearchVisible, clearSearch, refreshData]);\r\n\r\n return (\r\n <AuthContext.Provider value={contextValue}>\r\n {children}\r\n </AuthContext.Provider>\r\n );\r\n};\r\n\r\n// Hook personalizado para usar o contexto\r\nexport const useAuth = () => {\r\n const context = useContext(AuthContext);\r\n if (context === undefined) {\r\n throw new Error('useAuth deve ser usado dentro de um AuthProvider');\r\n }\r\n return context;\r\n};","import React, { useState } from 'react';\r\nimport { MessageCircle } from 'lucide-react';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogTrigger,\r\n} from './dialog';\r\nimport { Button } from './button';\r\n\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\n\r\ninterface FeedbackDialogProps {\r\n variant?: 'button' | 'menuItem';\r\n className?: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const FeedbackDialog: React.FC<FeedbackDialogProps> = ({ \r\n variant = 'button',\r\n className = '',\r\n children \r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n const { user } = useAuth();\r\n const { companies, alias } = useAuth();\r\n const selectedUnit = alias \r\n ? companies?.find(company => company.alias === alias) || companies?.[0] || null\r\n : companies?.[0] || null;\r\n\r\n // Construir URL dinâmica\r\n const buildFeedbackUrl = () => {\r\n if (!user?.email) return '';\r\n \r\n const baseUrl = `${import.meta.env.VITE_FEEDBACK_APP_URL}/`;\r\n const params = new URLSearchParams({\r\n email: user.email,\r\n module: 'OKR',\r\n alias: selectedUnit?.alias || ''\r\n });\r\n \r\n return `${baseUrl}?${params.toString()}`;\r\n };\r\n\r\n const feedbackUrl = buildFeedbackUrl();\r\n\r\n // Se não tem dados necessários, não renderizar\r\n if (!user?.email || !selectedUnit) {\r\n return null;\r\n }\r\n\r\n const TriggerButton = React.forwardRef<HTMLButtonElement | HTMLDivElement, any>((props, ref) => {\r\n if (variant === 'menuItem') {\r\n return (\r\n <div \r\n ref={ref as React.Ref<HTMLDivElement>}\r\n className=\"flex items-center cursor-pointer w-full px-2 py-1.5 text-sm hover:bg-accent rounded-sm\"\r\n {...props}\r\n >\r\n <MessageCircle className=\"mr-2 h-4 w-4\" />\r\n Feedback\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Button \r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n variant=\"default\"\r\n size=\"sm\"\r\n className={`bg-primary hover:bg-primary/90 ${className}`}\r\n {...props}\r\n >\r\n <MessageCircle className=\"mr-2 h-4 w-4\" />\r\n Feedback\r\n </Button>\r\n );\r\n });\r\n\r\n TriggerButton.displayName = \"TriggerButton\";\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={setOpen}>\r\n <DialogTrigger asChild>\r\n <TriggerButton />\r\n </DialogTrigger>\r\n \r\n <DialogContent className=\"max-w-4xl max-h-[90vh] w-full h-full p-0 overflow-hidden\">\r\n <DialogHeader className=\"sr-only\">\r\n <DialogTitle>Feedback</DialogTitle>\r\n <DialogDescription>\r\n Formulário de feedback para melhorias no sistema\r\n </DialogDescription>\r\n </DialogHeader>\r\n \r\n <div className=\"w-full h-full\">\r\n <iframe\r\n src={feedbackUrl}\r\n width=\"100%\"\r\n height=\"600px\"\r\n className=\"feedback-iframe\"\r\n title=\"Formulário de Feedback\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default FeedbackDialog;","import * as React from \"react\"\r\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport {\r\n Controller,\r\n ControllerProps,\r\n FieldPath,\r\n FieldValues,\r\n FormProvider,\r\n useFormContext,\r\n} from \"react-hook-form\"\r\n\r\nimport { cn } from \"../../utils\"\r\nimport { Label } from \"./label\"\r\n\r\nconst Form = FormProvider\r\n\r\ntype FormFieldContextValue<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n> = {\r\n name: TName\r\n}\r\n\r\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\r\n {} as FormFieldContextValue\r\n)\r\n\r\nconst FormField = <\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n>({\r\n ...props\r\n}: ControllerProps<TFieldValues, TName>) => {\r\n return (\r\n <FormFieldContext.Provider value={{ name: props.name }}>\r\n <Controller {...props} />\r\n </FormFieldContext.Provider>\r\n )\r\n}\r\n\r\nconst useFormField = () => {\r\n const fieldContext = React.useContext(FormFieldContext)\r\n const itemContext = React.useContext(FormItemContext)\r\n const { getFieldState, formState } = useFormContext()\r\n\r\n const fieldState = getFieldState(fieldContext.name, formState)\r\n\r\n if (!fieldContext) {\r\n throw new Error(\"useFormField should be used within <FormField>\")\r\n }\r\n\r\n const { id } = itemContext\r\n\r\n return {\r\n id,\r\n name: fieldContext.name,\r\n formItemId: `${id}-form-item`,\r\n formDescriptionId: `${id}-form-item-description`,\r\n formMessageId: `${id}-form-item-message`,\r\n ...fieldState,\r\n }\r\n}\r\n\r\ntype FormItemContextValue = {\r\n id: string\r\n}\r\n\r\nconst FormItemContext = React.createContext<FormItemContextValue>(\r\n {} as FormItemContextValue\r\n)\r\n\r\nconst FormItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => {\r\n const id = React.useId()\r\n\r\n return (\r\n <FormItemContext.Provider value={{ id }}>\r\n <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\r\n </FormItemContext.Provider>\r\n )\r\n})\r\nFormItem.displayName = \"FormItem\"\r\n\r\nconst FormLabel = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\r\n>(({ className, ...props }, ref) => {\r\n const { error, formItemId } = useFormField()\r\n\r\n return (\r\n <Label\r\n ref={ref}\r\n className={cn(error && \"text-destructive\", className)}\r\n htmlFor={formItemId}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormLabel.displayName = \"FormLabel\"\r\n\r\nconst FormControl = React.forwardRef<\r\n React.ElementRef<typeof Slot>,\r\n React.ComponentPropsWithoutRef<typeof Slot>\r\n>(({ ...props }, ref) => {\r\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\r\n\r\n return (\r\n <Slot\r\n ref={ref}\r\n id={formItemId}\r\n aria-describedby={\r\n !error\r\n ? `${formDescriptionId}`\r\n : `${formDescriptionId} ${formMessageId}`\r\n }\r\n aria-invalid={!!error}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormControl.displayName = \"FormControl\"\r\n\r\nconst FormDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => {\r\n const { formDescriptionId } = useFormField()\r\n\r\n return (\r\n <p\r\n ref={ref}\r\n id={formDescriptionId}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormDescription.displayName = \"FormDescription\"\r\n\r\nconst FormMessage = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, children, ...props }, ref) => {\r\n const { error, formMessageId } = useFormField()\r\n const body = error ? String(error?.message) : children\r\n\r\n if (!body) {\r\n return null\r\n }\r\n\r\n return (\r\n <p\r\n ref={ref}\r\n id={formMessageId}\r\n className={cn(\"text-sm font-medium text-destructive\", className)}\r\n {...props}\r\n >\r\n {body}\r\n </p>\r\n )\r\n})\r\nFormMessage.displayName = \"FormMessage\"\r\n\r\nexport {\r\n useFormField,\r\n Form,\r\n FormItem,\r\n FormLabel,\r\n FormControl,\r\n FormDescription,\r\n FormMessage,\r\n FormField,\r\n}\r\n","import { cn } from \"../../utils\"\r\nimport { ReactNode } from \"react\"\r\n\r\ninterface GridProps {\r\n children: ReactNode\r\n cols?: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"auto-fit\" | \"auto-fill\"\r\n gap?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\r\n className?: string\r\n}\r\n\r\nconst colsClasses = {\r\n \"1\": \"grid-cols-1\",\r\n \"2\": \"grid-cols-2\",\r\n \"3\": \"grid-cols-3\", \r\n \"4\": \"grid-cols-4\",\r\n \"5\": \"grid-cols-5\",\r\n \"6\": \"grid-cols-6\",\r\n \"auto-fit\": \"grid-cols-[repeat(auto-fit,minmax(250px,1fr))]\",\r\n \"auto-fill\": \"grid-cols-[repeat(auto-fill,minmax(250px,1fr))]\"\r\n}\r\n\r\nconst gapClasses = {\r\n xs: \"gap-1\",\r\n sm: \"gap-2\",\r\n md: \"gap-4\", \r\n lg: \"gap-6\",\r\n xl: \"gap-8\"\r\n}\r\n\r\nexport function Grid({\r\n children,\r\n cols = \"auto-fit\",\r\n gap = \"md\",\r\n className\r\n}: GridProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"grid\",\r\n colsClasses[cols],\r\n gapClasses[gap],\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}","import * as React from \"react\"\r\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst ScrollArea = React.forwardRef<\r\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\r\n>(({ className, children, ...props }, ref) => (\r\n <ScrollAreaPrimitive.Root\r\n ref={ref}\r\n className={cn(\"relative overflow-hidden\", className)}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\r\n {children}\r\n </ScrollAreaPrimitive.Viewport>\r\n <ScrollBar />\r\n <ScrollAreaPrimitive.Corner />\r\n </ScrollAreaPrimitive.Root>\r\n))\r\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\r\n\r\nconst ScrollBar = React.forwardRef<\r\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\r\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\r\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\r\n <ScrollAreaPrimitive.ScrollAreaScrollbar\r\n ref={ref}\r\n orientation={orientation}\r\n className={cn(\r\n \"flex touch-none select-none transition-colors\",\r\n orientation === \"vertical\" &&\r\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\r\n orientation === \"horizontal\" &&\r\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\r\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\r\n))\r\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\r\n\r\nexport { ScrollArea, ScrollBar }\r\n","import React, { useState } from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\r\nimport { ScrollArea } from './scroll-area';\r\nimport { \r\n Star, Heart, Home, User, Settings, Mail, Phone, Calendar,\r\n MapPin, Camera, Image, Music, Video, Book, Bookmark,\r\n Search, Filter, Edit, Trash2, Plus, Minus, Check, X,\r\n ChevronDown, ChevronUp, ChevronLeft, ChevronRight,\r\n ArrowUp, ArrowDown, ArrowLeft, ArrowRight,\r\n Clock, Bell, AlertCircle, Info, HelpCircle,\r\n Download, Upload, Share, Copy,\r\n Save, FileText, Folder, FolderOpen, Archive,\r\n Lock, Unlock, Eye, EyeOff, Shield, Key,\r\n Zap, Flame, Sparkles, Award, Trophy, Target\r\n} from 'lucide-react';\r\n\r\ninterface IconPickerProps {\r\n value?: string;\r\n onChange?: (iconName: string) => void;\r\n label?: string;\r\n}\r\n\r\nconst ICONS = {\r\n Star, Heart, Home, User, Settings, Mail, Phone, Calendar,\r\n MapPin, Camera, Image, Music, Video, Book, Bookmark,\r\n Search, Filter, Edit, Trash2, Plus, Minus, Check, X,\r\n ChevronDown, ChevronUp, ChevronLeft, ChevronRight,\r\n ArrowUp, ArrowDown, ArrowLeft, ArrowRight,\r\n Clock, Bell, AlertCircle, Info, HelpCircle,\r\n Download, Upload, Share, Copy,\r\n Save, FileText, Folder, FolderOpen, Archive,\r\n Lock, Unlock, Eye, EyeOff, Shield, Key,\r\n Zap, Flame, Sparkles, Award, Trophy, Target\r\n};\r\n\r\nexport const IconPicker: React.FC<IconPickerProps> = ({\r\n value = 'Star',\r\n onChange,\r\n label\r\n}) => {\r\n const [searchTerm, setSearchTerm] = useState('');\r\n\r\n const filteredIcons = Object.entries(ICONS).filter(([name]) =>\r\n name.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n const SelectedIcon = ICONS[value as keyof typeof ICONS] || Star;\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n {label && <Label>{label}</Label>}\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n className=\"w-full justify-start text-left font-normal\"\r\n >\r\n <SelectedIcon className=\"h-4 w-4 mr-2\" />\r\n {value}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n <div className=\"space-y-3\">\r\n <div>\r\n <Label htmlFor=\"icon-search\">Buscar ícone</Label>\r\n <Input\r\n id=\"icon-search\"\r\n placeholder=\"Digite o nome do ícone...\"\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n />\r\n </div>\r\n <ScrollArea className=\"h-48\">\r\n <div className=\"grid grid-cols-6 gap-2\">\r\n {filteredIcons.map(([name, IconComponent]) => (\r\n <button\r\n key={name}\r\n className={`p-2 rounded border-2 hover:border-primary ${\r\n value === name ? 'border-primary bg-primary/10' : 'border-border'\r\n }`}\r\n onClick={() => onChange?.(name)}\r\n title={name}\r\n >\r\n <IconComponent className=\"h-4 w-4\" />\r\n </button>\r\n ))}\r\n </div>\r\n </ScrollArea>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n};","import * as React from \"react\"\r\nimport { OTPInput, OTPInputContext } from \"input-otp\"\r\nimport { Dot } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst InputOTP = React.forwardRef<\r\n React.ElementRef<typeof OTPInput>,\r\n React.ComponentPropsWithoutRef<typeof OTPInput>\r\n>(({ className, containerClassName, ...props }, ref) => (\r\n <OTPInput\r\n ref={ref}\r\n containerClassName={cn(\r\n \"flex items-center gap-2 has-[:disabled]:opacity-50\",\r\n containerClassName\r\n )}\r\n className={cn(\"disabled:cursor-not-allowed\", className)}\r\n {...props}\r\n />\r\n))\r\nInputOTP.displayName = \"InputOTP\"\r\n\r\nconst InputOTPGroup = React.forwardRef<\r\n React.ElementRef<\"div\">,\r\n React.ComponentPropsWithoutRef<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"flex items-center\", className)} {...props} />\r\n))\r\nInputOTPGroup.displayName = \"InputOTPGroup\"\r\n\r\nconst InputOTPSlot = React.forwardRef<\r\n React.ElementRef<\"div\">,\r\n React.ComponentPropsWithoutRef<\"div\"> & { index: number }\r\n>(({ index, className, ...props }, ref) => {\r\n const inputOTPContext = React.useContext(OTPInputContext)\r\n const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md\",\r\n isActive && \"z-10 ring-2 ring-ring ring-offset-background\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {char}\r\n {hasFakeCaret && (\r\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\r\n <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n})\r\nInputOTPSlot.displayName = \"InputOTPSlot\"\r\n\r\nconst InputOTPSeparator = React.forwardRef<\r\n React.ElementRef<\"div\">,\r\n React.ComponentPropsWithoutRef<\"div\">\r\n>(({ ...props }, ref) => (\r\n <div ref={ref} role=\"separator\" {...props}>\r\n <Dot />\r\n </div>\r\n))\r\nInputOTPSeparator.displayName = \"InputOTPSeparator\"\r\n\r\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\r\n","import { cn } from \"../../utils\"\r\nimport { Loader2 } from \"lucide-react\"\r\n\r\ninterface SpinnerProps {\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n className?: string\r\n}\r\n\r\nconst sizeClasses = {\r\n sm: \"h-4 w-4\",\r\n md: \"h-6 w-6\", \r\n lg: \"h-8 w-8\"\r\n}\r\n\r\nexport function Spinner({ size = \"md\", className }: SpinnerProps) {\r\n return (\r\n <Loader2 \r\n className={cn(\r\n \"animate-spin text-muted-foreground\",\r\n sizeClasses[size],\r\n className\r\n )} \r\n />\r\n )\r\n}","import * as React from \"react\"\r\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\nimport { ButtonProps, buttonVariants } from \"./button\"\r\n\r\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\r\n <nav\r\n role=\"navigation\"\r\n aria-label=\"pagination\"\r\n className={cn(\"mx-auto flex w-full justify-center\", className)}\r\n {...props}\r\n />\r\n)\r\nPagination.displayName = \"Pagination\"\r\n\r\nconst PaginationContent = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n className={cn(\"flex flex-row items-center gap-1\", className)}\r\n {...props}\r\n />\r\n))\r\nPaginationContent.displayName = \"PaginationContent\"\r\n\r\nconst PaginationItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ className, ...props }, ref) => (\r\n <li ref={ref} className={cn(\"\", className)} {...props} />\r\n))\r\nPaginationItem.displayName = \"PaginationItem\"\r\n\r\ntype PaginationLinkProps = {\r\n isActive?: boolean\r\n} & Pick<ButtonProps, \"size\"> &\r\n React.ComponentProps<\"a\">\r\n\r\nconst PaginationLink = ({\r\n className,\r\n isActive,\r\n size = \"icon\",\r\n ...props\r\n}: PaginationLinkProps) => (\r\n <a\r\n aria-current={isActive ? \"page\" : undefined}\r\n className={cn(\r\n buttonVariants({\r\n variant: isActive ? \"outline\" : \"ghost\",\r\n size,\r\n }),\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nPaginationLink.displayName = \"PaginationLink\"\r\n\r\nconst PaginationPrevious = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof PaginationLink>) => (\r\n <PaginationLink\r\n aria-label=\"Go to previous page\"\r\n size=\"default\"\r\n className={cn(\"gap-1 pl-2.5\", className)}\r\n {...props}\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n <span>Previous</span>\r\n </PaginationLink>\r\n)\r\nPaginationPrevious.displayName = \"PaginationPrevious\"\r\n\r\nconst PaginationNext = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof PaginationLink>) => (\r\n <PaginationLink\r\n aria-label=\"Go to next page\"\r\n size=\"default\"\r\n className={cn(\"gap-1 pr-2.5\", className)}\r\n {...props}\r\n >\r\n <span>Next</span>\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </PaginationLink>\r\n)\r\nPaginationNext.displayName = \"PaginationNext\"\r\n\r\nconst PaginationEllipsis = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"span\">) => (\r\n <span\r\n aria-hidden\r\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\r\n {...props}\r\n >\r\n <MoreHorizontal className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">More pages</span>\r\n </span>\r\n)\r\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\r\n\r\nexport {\r\n Pagination,\r\n PaginationContent,\r\n PaginationEllipsis,\r\n PaginationItem,\r\n PaginationLink,\r\n PaginationNext,\r\n PaginationPrevious,\r\n}\r\n","import * as React from \"react\"\r\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\r\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Select = SelectPrimitive.Root\r\n\r\nconst SelectGroup = SelectPrimitive.Group\r\n\r\nconst SelectValue = SelectPrimitive.Value\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n))\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n))\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n))\r\nSelectScrollDownButton.displayName =\r\n SelectPrimitive.ScrollDownButton.displayName\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = \"popper\", ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n position === \"popper\" &&\r\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\r\n className\r\n )}\r\n position={position}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n \"p-1\",\r\n position === \"popper\" &&\r\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\r\n )}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n))\r\nSelectContent.displayName = SelectPrimitive.Content.displayName\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <SelectPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n))\r\nSelectItem.displayName = SelectPrimitive.Item.displayName\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n}","import * as React from \"react\"\r\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\r\n>(\r\n (\r\n { className, orientation = \"horizontal\", decorative = true, ...props },\r\n ref\r\n ) => (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n \"shrink-0 bg-border\",\r\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\nSeparator.displayName = SeparatorPrimitive.Root.displayName\r\n\r\nexport { Separator }","import * as SheetPrimitive from \"@radix-ui/react-dialog\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { X } from \"lucide-react\"\r\nimport * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Sheet = SheetPrimitive.Root\r\n\r\nconst SheetTrigger = SheetPrimitive.Trigger\r\n\r\nconst SheetClose = SheetPrimitive.Close\r\n\r\nconst SheetPortal = SheetPrimitive.Portal\r\n\r\nconst SheetOverlay = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\r\n\r\nconst sheetVariants = cva(\r\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\r\n {\r\n variants: {\r\n side: {\r\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\r\n bottom:\r\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\r\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\r\n right:\r\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\r\n },\r\n },\r\n defaultVariants: {\r\n side: \"right\",\r\n },\r\n }\r\n)\r\n\r\ninterface SheetContentProps\r\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\r\n VariantProps<typeof sheetVariants> { }\r\n\r\nconst SheetContent = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Content>,\r\n SheetContentProps\r\n>(({ side = \"right\", className, children, ...props }, ref) => (\r\n <SheetPortal>\r\n <SheetOverlay />\r\n <SheetPrimitive.Content\r\n ref={ref}\r\n className={cn(sheetVariants({ side }), className)}\r\n {...props}\r\n >\r\n {children}\r\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </SheetPrimitive.Close>\r\n </SheetPrimitive.Content>\r\n </SheetPortal>\r\n))\r\nSheetContent.displayName = SheetPrimitive.Content.displayName\r\n\r\nconst SheetHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetHeader.displayName = \"SheetHeader\"\r\n\r\nconst SheetFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetFooter.displayName = \"SheetFooter\"\r\n\r\nconst SheetTitle = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold text-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetTitle.displayName = SheetPrimitive.Title.displayName\r\n\r\nconst SheetDescription = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetDescription.displayName = SheetPrimitive.Description.displayName\r\n\r\nexport {\r\n Sheet, SheetClose,\r\n SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger\r\n}\r\n\r\n","\r\nimport * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { VariantProps, cva } from \"class-variance-authority\"\r\nimport { PanelLeft } from \"lucide-react\"\r\n\r\n// Mobile hook integrated inline\r\nimport { cn } from \"../../utils\"\r\nimport { Button } from \"./button\"\r\nimport { Input } from \"./input\"\r\nimport { Separator } from \"./separator\"\r\nimport { Sheet, SheetContent, SheetTitle } from \"./sheet\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from \"./tooltip\"\r\nconst SIDEBAR_STORAGE_KEY = \"sidebar:state\"\r\nconst SIDEBAR_WIDTH = \"16rem\"\r\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\r\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\r\n\r\ntype SidebarContext = {\r\n state: \"expanded\" | \"collapsed\"\r\n open: boolean\r\n setOpen: (open: boolean) => void\r\n openMobile: boolean\r\n setOpenMobile: (open: boolean) => void\r\n isMobile: boolean\r\n toggleSidebar: () => void\r\n}\r\n\r\nconst SidebarContext = React.createContext<SidebarContext | null>(null)\r\n\r\nfunction useSidebar() {\r\n const context = React.useContext(SidebarContext)\r\n if (!context) {\r\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\r\n }\r\n\r\n return context\r\n}\r\n\r\nconst SidebarProvider = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n defaultOpen?: boolean\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n }\r\n>(\r\n (\r\n {\r\n defaultOpen = true,\r\n open: openProp,\r\n onOpenChange: setOpenProp,\r\n className,\r\n style,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [isMobile, setIsMobile] = React.useState(false)\r\n \r\n React.useEffect(() => {\r\n const checkMobile = () => setIsMobile(window.innerWidth < 768);\r\n checkMobile();\r\n window.addEventListener('resize', checkMobile);\r\n return () => window.removeEventListener('resize', checkMobile);\r\n }, [])\r\n const [openMobile, setOpenMobile] = React.useState(false)\r\n\r\n // This is the internal state of the sidebar.\r\n // We use openProp and setOpenProp for control from outside the component.\r\n const [_open, _setOpen] = React.useState(() => {\r\n if (typeof window !== 'undefined') {\r\n const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY)\r\n return stored !== null ? stored === 'true' : defaultOpen\r\n }\r\n return defaultOpen\r\n })\r\n const open = openProp ?? _open\r\n const setOpen = React.useCallback(\r\n (value: boolean | ((value: boolean) => boolean)) => {\r\n const openState = typeof value === \"function\" ? value(open) : value\r\n if (setOpenProp) {\r\n setOpenProp(openState)\r\n } else {\r\n _setOpen(openState)\r\n }\r\n\r\n // This saves the sidebar state to localStorage.\r\n if (typeof window !== 'undefined') {\r\n localStorage.setItem(SIDEBAR_STORAGE_KEY, String(openState))\r\n }\r\n },\r\n [setOpenProp, open]\r\n )\r\n\r\n // Helper to toggle the sidebar.\r\n const toggleSidebar = React.useCallback(() => {\r\n return isMobile\r\n ? setOpenMobile((open) => !open)\r\n : setOpen((open) => !open)\r\n }, [isMobile, setOpen, setOpenMobile])\r\n\r\n // Adds a keyboard shortcut to toggle the sidebar.\r\n React.useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (\r\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\r\n (event.metaKey || event.ctrlKey)\r\n ) {\r\n event.preventDefault()\r\n toggleSidebar()\r\n }\r\n }\r\n\r\n window.addEventListener(\"keydown\", handleKeyDown)\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\r\n }, [toggleSidebar])\r\n\r\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n // This makes it easier to style the sidebar with Tailwind classes.\r\n const state = open ? \"expanded\" : \"collapsed\"\r\n\r\n const contextValue = React.useMemo<SidebarContext>(\r\n () => ({\r\n state,\r\n open,\r\n setOpen,\r\n isMobile,\r\n openMobile,\r\n setOpenMobile,\r\n toggleSidebar,\r\n }),\r\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\r\n )\r\n\r\n return (\r\n <SidebarContext.Provider value={contextValue}>\r\n <TooltipProvider delayDuration={0}>\r\n <div\r\n className={cn(\r\n \"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar sidebar-container\",\r\n className\r\n )}\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH,\r\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\r\n ...style,\r\n } as React.CSSProperties\r\n }\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </TooltipProvider>\r\n </SidebarContext.Provider>\r\n )\r\n }\r\n)\r\nSidebarProvider.displayName = \"SidebarProvider\"\r\n\r\nconst Sidebar = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n side?: \"left\" | \"right\"\r\n variant?: \"sidebar\" | \"floating\" | \"inset\"\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\r\n }\r\n>(\r\n (\r\n {\r\n side = \"left\",\r\n variant = \"sidebar\",\r\n collapsible = \"offcanvas\",\r\n className,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\r\n\r\n if (collapsible === \"none\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n\r\n if (isMobile) {\r\n return (\r\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n <SheetContent\r\n data-sidebar=\"sidebar\"\r\n data-mobile=\"true\"\r\n className=\"w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden sidebar-mobile\"\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\r\n } as React.CSSProperties\r\n }\r\n side={side}\r\n >\r\n <SheetTitle className=\"sr-only\">Menu de Navegação</SheetTitle>\r\n <div className=\"flex h-full w-full flex-col\">{children}</div>\r\n </SheetContent>\r\n </Sheet>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className=\"group peer hidden md:block text-sidebar-foreground\"\r\n data-state={state}\r\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\r\n data-variant={variant}\r\n data-side={side}\r\n >\r\n {/* This is what handles the sidebar gap on desktop */}\r\n <div\r\n className={cn(\r\n \"duration-200 relative h-svh w-[--sidebar-width] bg-transparent transition-[width] ease-linear\",\r\n \"group-data-[collapsible=offcanvas]:w-0\",\r\n \"group-data-[side=right]:rotate-180\",\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]\"\r\n : \"group-data-[collapsible=icon]:w-[--sidebar-width-icon]\"\r\n )}\r\n />\r\n <div\r\n className={cn(\r\n \"duration-200 fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] ease-linear md:flex\",\r\n side === \"left\"\r\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\r\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\r\n // Adjust the padding for floating and inset variants.\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]\"\r\n : \"group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n data-sidebar=\"sidebar\"\r\n className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\nSidebar.displayName = \"Sidebar\"\r\n\r\nconst SidebarTrigger = React.forwardRef<\r\n React.ElementRef<typeof Button>,\r\n React.ComponentProps<typeof Button>\r\n>(({ className, onClick, ...props }, ref) => {\r\n const { toggleSidebar } = useSidebar()\r\n\r\n return (\r\n <Button\r\n ref={ref}\r\n data-sidebar=\"trigger\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-7 w-7\", className)}\r\n onClick={(event) => {\r\n onClick?.(event)\r\n toggleSidebar()\r\n }}\r\n {...props}\r\n >\r\n <PanelLeft />\r\n <span className=\"sr-only\">Toggle Sidebar</span>\r\n </Button>\r\n )\r\n})\r\nSidebarTrigger.displayName = \"SidebarTrigger\"\r\n\r\nconst SidebarRail = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\">\r\n>(({ className, ...props }, ref) => {\r\n const { toggleSidebar } = useSidebar()\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n data-sidebar=\"rail\"\r\n aria-label=\"Toggle Sidebar\"\r\n tabIndex={-1}\r\n onClick={toggleSidebar}\r\n title=\"Toggle Sidebar\"\r\n className={cn(\r\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\r\n \"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize\",\r\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\r\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar\",\r\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\r\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarRail.displayName = \"SidebarRail\"\r\n\r\nconst SidebarInset = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"main\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <main\r\n ref={ref}\r\n className={cn(\r\n \"relative flex min-h-svh flex-1 flex-col bg-background\",\r\n \"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInset.displayName = \"SidebarInset\"\r\n\r\nconst SidebarInput = React.forwardRef<\r\n React.ElementRef<typeof Input>,\r\n React.ComponentProps<typeof Input>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Input\r\n ref={ref}\r\n data-sidebar=\"input\"\r\n className={cn(\r\n \"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInput.displayName = \"SidebarInput\"\r\n\r\nconst SidebarHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"header\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarHeader.displayName = \"SidebarHeader\"\r\n\r\nconst SidebarFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"footer\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarFooter.displayName = \"SidebarFooter\"\r\n\r\nconst SidebarSeparator = React.forwardRef<\r\n React.ElementRef<typeof Separator>,\r\n React.ComponentProps<typeof Separator>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Separator\r\n ref={ref}\r\n data-sidebar=\"separator\"\r\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarSeparator.displayName = \"SidebarSeparator\"\r\n\r\nconst SidebarContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"content\"\r\n className={cn(\r\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarContent.displayName = \"SidebarContent\"\r\n\r\nconst SidebarGroup = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group\"\r\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroup.displayName = \"SidebarGroup\"\r\n\r\nconst SidebarGroupLabel = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-label\"\r\n className={cn(\r\n \"duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\"\r\n\r\nconst SidebarGroupAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-action\"\r\n className={cn(\r\n \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 after:md:hidden\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupAction.displayName = \"SidebarGroupAction\"\r\n\r\nconst SidebarGroupContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group-content\"\r\n className={cn(\"w-full text-sm\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarGroupContent.displayName = \"SidebarGroupContent\"\r\n\r\nconst SidebarMenu = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu\"\r\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenu.displayName = \"SidebarMenu\"\r\n\r\nconst SidebarMenuItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ className, ...props }, ref) => (\r\n <li\r\n ref={ref}\r\n data-sidebar=\"menu-item\"\r\n className={cn(\"group/menu-item relative\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuItem.displayName = \"SidebarMenuItem\"\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-primary data-[active=true]:font-medium data-[active=true]:text-sidebar-primary-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:gap-0 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\r\n outline:\r\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\r\n },\r\n size: {\r\n default: \"h-10 text-sm\",\r\n sm: \"h-7 text-xs\",\r\n lg: \"h-12 text-sm group-data-[collapsible=icon]:!p-0\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nconst SidebarMenuButton = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & {\r\n asChild?: boolean\r\n isActive?: boolean\r\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\r\n } & VariantProps<typeof sidebarMenuButtonVariants>\r\n>(\r\n (\r\n {\r\n asChild = false,\r\n isActive = false,\r\n variant = \"default\",\r\n size = \"default\",\r\n tooltip,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n const { isMobile, state } = useSidebar()\r\n\r\n const button = (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n {...props}\r\n />\r\n )\r\n\r\n if (!tooltip) {\r\n return button\r\n }\r\n\r\n if (typeof tooltip === \"string\") {\r\n tooltip = {\r\n children: tooltip,\r\n }\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{button}</TooltipTrigger>\r\n <TooltipContent\r\n side=\"right\"\r\n align=\"center\"\r\n hidden={state !== \"collapsed\" || isMobile}\r\n {...tooltip}\r\n />\r\n </Tooltip>\r\n )\r\n }\r\n)\r\nSidebarMenuButton.displayName = \"SidebarMenuButton\"\r\n\r\nconst SidebarMenuAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & {\r\n asChild?: boolean\r\n showOnHover?: boolean\r\n }\r\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-action\"\r\n className={cn(\r\n \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 after:md:hidden\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n showOnHover &&\r\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuAction.displayName = \"SidebarMenuAction\"\r\n\r\nconst SidebarMenuBadge = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-badge\"\r\n className={cn(\r\n \"absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none pointer-events-none\",\r\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\"\r\n\r\nconst SidebarMenuSkeleton = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n showIcon?: boolean\r\n }\r\n>(({ className, showIcon = false, ...props }, ref) => {\r\n // Random width between 50 to 90%.\r\n const width = React.useMemo(() => {\r\n return `${Math.floor(Math.random() * 40) + 50}%`\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-skeleton\"\r\n className={cn(\"rounded-md h-8 flex gap-2 px-2 items-center\", className)}\r\n {...props}\r\n >\r\n {showIcon && (\r\n <div\r\n className=\"size-4 rounded-md\"\r\n data-sidebar=\"menu-skeleton-icon\"\r\n />\r\n )}\r\n <div\r\n className=\"h-4 flex-1 max-w-[--skeleton-width] skeleton-width\"\r\n data-sidebar=\"menu-skeleton-text\"\r\n style={\r\n {\r\n \"--skeleton-width\": width,\r\n } as React.CSSProperties\r\n }\r\n />\r\n </div>\r\n )\r\n})\r\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\"\r\n\r\nconst SidebarMenuSub = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu-sub\"\r\n className={cn(\r\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuSub.displayName = \"SidebarMenuSub\"\r\n\r\nconst SidebarMenuSubItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\r\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\"\r\n\r\nconst SidebarMenuSubButton = React.forwardRef<\r\n HTMLAnchorElement,\r\n React.ComponentProps<\"a\"> & {\r\n asChild?: boolean\r\n size?: \"sm\" | \"md\"\r\n isActive?: boolean\r\n }\r\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"a\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-sub-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(\r\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\r\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\r\n size === \"sm\" && \"text-xs\",\r\n size === \"md\" && \"text-sm\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\"\r\n\r\nexport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarGroup,\r\n SidebarGroupAction,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarHeader,\r\n SidebarInput,\r\n SidebarInset,\r\n SidebarMenu,\r\n SidebarMenuAction,\r\n SidebarMenuBadge,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSkeleton,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n SidebarProvider,\r\n SidebarRail,\r\n SidebarSeparator,\r\n SidebarTrigger,\r\n useSidebar,\r\n}\r\n","import { cn } from \"../../utils\"\r\n\r\nfunction Skeleton({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div\r\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Skeleton }","import { Skeleton } from \"./skeleton\"\r\nimport { Card, CardContent, CardHeader } from \"./card\"\r\n\r\ninterface TableSkeletonProps {\r\n rows?: number\r\n columns?: number\r\n}\r\n\r\ninterface CardSkeletonProps {\r\n count?: number\r\n}\r\n\r\ninterface FormSkeletonProps {\r\n fields?: number\r\n}\r\n\r\nexport function TableSkeleton({ rows = 5, columns = 4 }: TableSkeletonProps) {\r\n return (\r\n <div className=\"w-full\">\r\n <div className=\"rounded-md border\">\r\n <div className=\"border-b bg-muted/50 px-4 py-3\">\r\n <div className=\"flex space-x-4\">\r\n {Array.from({ length: columns }).map((_, i) => (\r\n <Skeleton key={i} className=\"h-4 w-24\" />\r\n ))}\r\n </div>\r\n </div>\r\n <div>\r\n {Array.from({ length: rows }).map((_, i) => (\r\n <div key={i} className=\"border-b px-4 py-3 last:border-0\">\r\n <div className=\"flex space-x-4\">\r\n {Array.from({ length: columns }).map((_, j) => (\r\n <Skeleton key={j} className=\"h-4 w-20\" />\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function CardSkeleton({ count = 3 }: CardSkeletonProps) {\r\n return (\r\n <div className=\"space-y-4\">\r\n {Array.from({ length: count }).map((_, i) => (\r\n <Card key={i}>\r\n <CardHeader>\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n <Skeleton className=\"h-3 w-1/2\" />\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-3 w-full\" />\r\n <Skeleton className=\"h-3 w-2/3\" />\r\n </div>\r\n </CardContent>\r\n </Card>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport function FormSkeleton({ fields = 4 }: FormSkeletonProps) {\r\n return (\r\n <div className=\"space-y-4\">\r\n {Array.from({ length: fields }).map((_, i) => (\r\n <div key={i} className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n ))}\r\n <div className=\"flex justify-end space-x-2 pt-4\">\r\n <Skeleton className=\"h-10 w-20\" />\r\n <Skeleton className=\"h-10 w-20\" />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function HeaderSkeleton() {\r\n return (\r\n <div className=\"flex items-center justify-between p-4 border-b\">\r\n <div className=\"flex items-center space-x-3\">\r\n <Skeleton className=\"h-8 w-8 rounded-full\" />\r\n <Skeleton className=\"h-6 w-32\" />\r\n </div>\r\n <div className=\"flex items-center space-x-2\">\r\n <Skeleton className=\"h-8 w-8\" />\r\n <Skeleton className=\"h-8 w-24\" />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function SidebarSkeleton() {\r\n return (\r\n <div className=\"w-64 border-r bg-muted/10\">\r\n <div className=\"p-4\">\r\n <Skeleton className=\"h-8 w-32 mb-6\" />\r\n <div className=\"space-y-2\">\r\n {Array.from({ length: 6 }).map((_, i) => (\r\n <div key={i} className=\"flex items-center space-x-3 p-2\">\r\n <Skeleton className=\"h-4 w-4\" />\r\n <Skeleton className=\"h-4 w-20\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}","import { cn } from \"../../utils\"\r\nimport { ReactNode } from \"react\"\r\n\r\ninterface StackProps {\r\n children: ReactNode\r\n direction?: \"row\" | \"column\"\r\n gap?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\r\n align?: \"start\" | \"center\" | \"end\" | \"stretch\"\r\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\"\r\n wrap?: boolean\r\n className?: string\r\n}\r\n\r\nconst gapClasses = {\r\n xs: \"gap-1\",\r\n sm: \"gap-2\", \r\n md: \"gap-4\",\r\n lg: \"gap-6\",\r\n xl: \"gap-8\"\r\n}\r\n\r\nconst alignClasses = {\r\n start: \"items-start\",\r\n center: \"items-center\", \r\n end: \"items-end\",\r\n stretch: \"items-stretch\"\r\n}\r\n\r\nconst justifyClasses = {\r\n start: \"justify-start\",\r\n center: \"justify-center\",\r\n end: \"justify-end\", \r\n between: \"justify-between\",\r\n around: \"justify-around\",\r\n evenly: \"justify-evenly\"\r\n}\r\n\r\nexport function Stack({\r\n children,\r\n direction = \"column\",\r\n gap = \"md\",\r\n align = \"stretch\",\r\n justify = \"start\", \r\n wrap = false,\r\n className\r\n}: StackProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex\",\r\n direction === \"column\" ? \"flex-col\" : \"flex-row\",\r\n gapClasses[gap],\r\n alignClasses[align],\r\n justifyClasses[justify],\r\n wrap && \"flex-wrap\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Table = React.forwardRef<\r\n HTMLTableElement,\r\n React.HTMLAttributes<HTMLTableElement>\r\n>(({ className, ...props }, ref) => (\r\n <table\r\n ref={ref}\r\n className={cn(\"w-full caption-bottom text-sm\", className)}\r\n {...props}\r\n />\r\n))\r\nTable.displayName = \"Table\"\r\n\r\nconst TableHeader = React.forwardRef<\r\n HTMLTableSectionElement,\r\n React.HTMLAttributes<HTMLTableSectionElement>\r\n>(({ className, ...props }, ref) => (\r\n <thead ref={ref} className={cn(\"[&_tr]:border-b sticky top-0 z-10 bg-background\", className)} {...props} />\r\n))\r\nTableHeader.displayName = \"TableHeader\"\r\n\r\nconst TableBody = React.forwardRef<\r\n HTMLTableSectionElement,\r\n React.HTMLAttributes<HTMLTableSectionElement>\r\n>(({ className, ...props }, ref) => (\r\n <tbody\r\n ref={ref}\r\n className={cn(\"[&_tr:last-child]:border-0\", className)}\r\n {...props}\r\n />\r\n))\r\nTableBody.displayName = \"TableBody\"\r\n\r\nconst TableFooter = React.forwardRef<\r\n HTMLTableSectionElement,\r\n React.HTMLAttributes<HTMLTableSectionElement>\r\n>(({ className, ...props }, ref) => (\r\n <tfoot\r\n ref={ref}\r\n className={cn(\r\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTableFooter.displayName = \"TableFooter\"\r\n\r\nconst TableRow = React.forwardRef<\r\n HTMLTableRowElement,\r\n React.HTMLAttributes<HTMLTableRowElement>\r\n>(({ className, ...props }, ref) => (\r\n <tr\r\n ref={ref}\r\n className={cn(\r\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTableRow.displayName = \"TableRow\"\r\n\r\nconst TableHead = React.forwardRef<\r\n HTMLTableCellElement,\r\n React.ThHTMLAttributes<HTMLTableCellElement>\r\n>(({ className, ...props }, ref) => (\r\n <th\r\n ref={ref}\r\n className={cn(\r\n \"h-12 px-4 py-3 text-left align-middle font-medium text-muted-foreground bg-background border-b [&:has([role=checkbox])]:pr-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTableHead.displayName = \"TableHead\"\r\n\r\nconst TableCell = React.forwardRef<\r\n HTMLTableCellElement,\r\n React.TdHTMLAttributes<HTMLTableCellElement>\r\n>(({ className, ...props }, ref) => (\r\n <td\r\n ref={ref}\r\n className={cn(\"px-4 py-3 align-middle [&:has([role=checkbox])]:pr-0\", className)}\r\n {...props}\r\n />\r\n))\r\nTableCell.displayName = \"TableCell\"\r\n\r\nconst TableCaption = React.forwardRef<\r\n HTMLTableCaptionElement,\r\n React.HTMLAttributes<HTMLTableCaptionElement>\r\n>(({ className, ...props }, ref) => (\r\n <caption\r\n ref={ref}\r\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nTableCaption.displayName = \"TableCaption\"\r\n\r\nexport {\r\n Table,\r\n TableHeader,\r\n TableBody,\r\n TableFooter,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableCaption,\r\n}","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nexport interface TextareaProps\r\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\r\n\r\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n ({ className, ...props }, ref) => {\r\n return (\r\n <textarea\r\n className={cn(\r\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nTextarea.displayName = \"Textarea\"\r\n\r\nexport { Textarea }","import * as React from \"react\"\r\nimport * as ToastPrimitives from \"@radix-ui/react-toast\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst ToastProvider = ToastPrimitives.Provider\r\n\r\nconst ToastViewport = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Viewport>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Viewport\r\n ref={ref}\r\n className={cn(\r\n \"fixed top-4 left-1/2 transform -translate-x-1/2 z-[100] flex max-h-screen w-full max-w-[420px] flex-col p-4\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\r\n\r\nconst toastVariants = cva(\r\n \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"border bg-background text-foreground\",\r\n destructive:\r\n \"destructive group border-destructive bg-destructive text-destructive-foreground\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\nconst Toast = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Root>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\r\n VariantProps<typeof toastVariants>\r\n>(({ className, variant, ...props }, ref) => {\r\n return (\r\n <ToastPrimitives.Root\r\n ref={ref}\r\n className={cn(toastVariants({ variant }), className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nToast.displayName = ToastPrimitives.Root.displayName\r\n\r\nconst ToastAction = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Action>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Action\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nToastAction.displayName = ToastPrimitives.Action.displayName\r\n\r\nconst ToastClose = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Close>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Close\r\n ref={ref}\r\n className={cn(\r\n \"absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600\",\r\n className\r\n )}\r\n toast-close=\"\"\r\n {...props}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </ToastPrimitives.Close>\r\n))\r\nToastClose.displayName = ToastPrimitives.Close.displayName\r\n\r\nconst ToastTitle = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Title>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Title\r\n ref={ref}\r\n className={cn(\"text-sm font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nToastTitle.displayName = ToastPrimitives.Title.displayName\r\n\r\nconst ToastDescription = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Description>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Description\r\n ref={ref}\r\n className={cn(\"text-sm opacity-90\", className)}\r\n {...props}\r\n />\r\n))\r\nToastDescription.displayName = ToastPrimitives.Description.displayName\r\n\r\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\r\n\r\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\r\n\r\nexport {\r\n type ToastProps,\r\n type ToastActionElement,\r\n ToastProvider,\r\n ToastViewport,\r\n Toast,\r\n ToastTitle,\r\n ToastDescription,\r\n ToastClose,\r\n ToastAction,\r\n}\r\n","import React, { createContext, useContext, ReactNode } from 'react';\r\nimport { SidebarConfig } from '../types/sidebar';\r\n\r\ninterface NavigationContextType {\r\n navigation?: SidebarConfig['navigation'];\r\n}\r\n\r\nconst NavigationContext = createContext<NavigationContextType>({});\r\n\r\ninterface NavigationProviderProps {\r\n children: ReactNode;\r\n config?: SidebarConfig;\r\n}\r\n\r\nexport function NavigationProvider({ children, config }: NavigationProviderProps) {\r\n return (\r\n <NavigationContext.Provider value={{ navigation: config?.navigation }}>\r\n {children}\r\n </NavigationContext.Provider>\r\n );\r\n}\r\n\r\nexport function useNavigation() {\r\n return useContext(NavigationContext);\r\n}","import { useLocation } from \"react-router-dom\"\r\nimport { useNavigation } from \"../contexts/NavigationContext\"\r\n\r\nexport function usePageTitle(): string {\r\n const location = useLocation()\r\n const { navigation } = useNavigation()\r\n \r\n // Busca o título na configuração de navegação\r\n const currentRoute = navigation?.find(item => item.path === location.pathname)\r\n \r\n // Retorna o título da rota atual ou um fallback\r\n return currentRoute?.label || 'Página'\r\n}","import React from 'react';\r\nimport { User, Building2, LogOut, ChevronDown, RefreshCw } from 'lucide-react';\r\nimport { Button } from '../../components/ui/button';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card';\r\nimport { Badge } from '../../components/ui/badge';\r\nimport { Separator } from '../../components/ui/separator';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n} from '../../components/ui/dropdown-menu';\r\nimport { FeedbackDialog } from '../../components/ui/feedback-dialog';\r\nimport { useAuth } from '../contexts/AuthContext';\r\nimport type { Company } from '../../types';\r\n\r\ninterface UserInfoProps {\r\n variant?: 'card' | 'dropdown';\r\n className?: string;\r\n selectedUnit?: Company | null;\r\n onUnitChange?: (unit: Company) => void;\r\n showDebug?: boolean;\r\n}\r\n\r\nconst UserInfo: React.FC<UserInfoProps> = React.memo(({ \r\n variant = 'card', \r\n className = '',\r\n selectedUnit: propSelectedUnit,\r\n onUnitChange,\r\n showDebug = false\r\n}) => {\r\n const { \r\n user, \r\n companies, \r\n alias,\r\n isAuthenticated, \r\n logout,\r\n switchUnit\r\n } = useAuth();\r\n \r\n const defaultCompany = companies?.[0] || null;\r\n // Use the company that matches the current alias from AuthContext\r\n const authSelectedUnit = alias ? companies?.find(c => c.alias === alias) : defaultCompany;\r\n const selectedUnit = propSelectedUnit || authSelectedUnit || defaultCompany;\r\n const availableUnits = companies || [];\r\n const currentUnit = selectedUnit || defaultCompany;\r\n\r\n // Handle unit change with proper callback\r\n const handleUnitChange = React.useCallback((unit: Company) => {\r\n if (onUnitChange) {\r\n onUnitChange(unit);\r\n } else {\r\n switchUnit(unit);\r\n }\r\n }, [onUnitChange, switchUnit]);\r\n\r\n // Unidades únicas e ordenadas\r\n const uniqueSortedUnits = React.useMemo(() => {\r\n if (!availableUnits?.length) return [];\r\n \r\n const uniqueUnitsMap = new Map();\r\n availableUnits.forEach(unit => {\r\n uniqueUnitsMap.set(unit.alias, unit);\r\n });\r\n \r\n const uniqueUnits = Array.from(uniqueUnitsMap.values());\r\n const currentUnitInList = uniqueUnits.find(unit => unit.alias === currentUnit?.alias);\r\n const otherUnits = uniqueUnits.filter(unit => unit.alias !== currentUnit?.alias);\r\n \r\n otherUnits.sort((a, b) => \r\n (a.name || '').localeCompare(b.name || '', 'pt-BR', { sensitivity: 'base' })\r\n );\r\n \r\n return currentUnitInList ? [currentUnitInList, ...otherUnits] : otherUnits;\r\n }, [availableUnits, currentUnit?.alias]);\r\n\r\n if (!isAuthenticated || !user) {\r\n return null;\r\n }\r\n\r\n const UserContent = () => (\r\n <>\r\n <div className=\"flex items-center space-x-3\">\r\n <div className=\"flex-shrink-0\">\r\n <div className=\"w-10 h-10 bg-primary rounded-full flex items-center justify-center\">\r\n <User className=\"h-5 w-5 text-primary-foreground\" />\r\n </div>\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate\">\r\n {user.name}\r\n </p>\r\n <p className=\"text-xs text-muted-foreground\">\r\n Unidade: {currentUnit?.name || 'N/A'}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {currentUnit && (\r\n <div className=\"mt-3\">\r\n <div className=\"flex items-center space-x-2\">\r\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"text-sm font-medium\">\r\n {currentUnit.name}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {uniqueSortedUnits.length > 1 && (\r\n <div className=\"mt-2\">\r\n <p className=\"text-xs text-muted-foreground mb-1\">\r\n Unidades disponíveis: {uniqueSortedUnits.length}\r\n </p>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {uniqueSortedUnits.slice(0, 3).map((unit) => (\r\n <Badge \r\n key={unit.alias} \r\n variant={unit.alias === currentUnit?.alias ? \"default\" : \"secondary\"}\r\n className=\"text-xs cursor-pointer\"\r\n onClick={() => handleUnitChange(unit)}\r\n >\r\n {unit.name}\r\n </Badge>\r\n ))}\r\n {uniqueSortedUnits.length > 3 && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n +{uniqueSortedUnits.length - 3}\r\n </Badge>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n\r\n if (variant === 'dropdown') {\r\n const hasPhoto = user.identifier && user.photoDate;\r\n const photoUrl = hasPhoto \r\n ? `${import.meta.env.VITE_QUALIEX_COMMON_API_URL}/api/common/users/photo/${user.identifier}/${user.photoDate}?size=36`\r\n : null;\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"ghost\" className={`h-auto p-2 ${className}`}>\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"hidden md:block text-left\">\r\n <p className=\"text-sm font-medium\">{user.name}</p>\r\n <p className=\"text-xs text-muted-foreground\">{currentUnit?.name || 'N/A'}</p>\r\n </div>\r\n {photoUrl ? (\r\n <img \r\n src={photoUrl} \r\n alt=\"Foto do usuário\" \r\n className=\"w-8 h-8 rounded-full object-cover\"\r\n onError={(e) => {\r\n (e.currentTarget as HTMLImageElement).style.display = 'none';\r\n const nextElement = e.currentTarget.nextElementSibling as HTMLElement;\r\n if (nextElement) nextElement.style.display = 'flex';\r\n }}\r\n />\r\n ) : null}\r\n <div className={`w-8 h-8 bg-primary rounded-full flex items-center justify-center ${photoUrl ? 'hidden' : ''}`}>\r\n <User className=\"h-4 w-4 text-primary-foreground\" />\r\n </div>\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n \r\n <DropdownMenuContent \r\n className=\"w-56 bg-background border border-border shadow-lg z-50\" \r\n align=\"end\"\r\n >\r\n <DropdownMenuSub>\r\n <DropdownMenuSubTrigger>\r\n <RefreshCw className=\"mr-2 h-4 w-4\" />\r\n Alterar Unidade\r\n </DropdownMenuSubTrigger>\r\n <DropdownMenuSubContent>\r\n {uniqueSortedUnits.map((unit) => (\r\n <DropdownMenuItem \r\n key={unit.alias} \r\n onClick={() => handleUnitChange(unit)}\r\n className={unit.alias === currentUnit?.alias ? \"bg-muted\" : \"\"}\r\n >\r\n <Building2 className=\"mr-2 h-4 w-4\" />\r\n {unit.name}\r\n {unit.alias === currentUnit?.alias && (\r\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\r\n Atual\r\n </Badge>\r\n )}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuSubContent>\r\n </DropdownMenuSub>\r\n \r\n <DropdownMenuSeparator />\r\n \r\n <FeedbackDialog variant=\"menuItem\" />\r\n \r\n <DropdownMenuItem onClick={logout}>\r\n <LogOut className=\"mr-2 h-4 w-4\" />\r\n Sair\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n }\r\n\r\n return (\r\n <Card className={className}>\r\n <CardHeader>\r\n <CardTitle className=\"text-lg\">Informações do Usuário</CardTitle>\r\n </CardHeader>\r\n \r\n <CardContent className=\"space-y-4\">\r\n <UserContent />\r\n \r\n <Separator />\r\n \r\n <div className=\"flex space-x-2\">\r\n <FeedbackDialog className=\"flex-1\" />\r\n <Button \r\n variant=\"outline\" \r\n onClick={logout}\r\n size=\"sm\"\r\n className=\"flex-1\"\r\n >\r\n <LogOut className=\"mr-2 h-4 w-4\" />\r\n Sair\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n});\r\n\r\nexport default UserInfo;","import { useState, useEffect, useRef, useCallback } from 'react';\r\n\r\n/**\r\n * Hook para aplicar debounce em um valor com capacidade de cancelamento\r\n * @param value - Valor a ser debounced\r\n * @param delay - Delay em milissegundos\r\n * @returns [valor com debounce aplicado, função para cancelar]\r\n */\r\nexport function useDebounce<T>(value: T, delay: number): [T, () => void] {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n const timeoutRef = useRef<NodeJS.Timeout>();\r\n\r\n const cancel = useCallback(() => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = undefined;\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n cancel(); // Cancela timeout anterior\r\n \r\n timeoutRef.current = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n return cancel;\r\n }, [value, delay, cancel]);\r\n\r\n return [debouncedValue, cancel];\r\n}","import React, { useState, useEffect } from 'react';\r\nimport { Button } from '../ui/button';\r\nimport { Input } from '../ui/input';\r\nimport { SidebarTrigger } from '../ui/sidebar';\r\nimport { X, RefreshCw, Search } from 'lucide-react';\r\nimport { usePageTitle } from '../../hooks/usePageTitle';\r\nimport { useSearchParams, useLocation } from 'react-router-dom';\r\nimport UserInfo from '../../auth/components/UserInfo';\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\nimport { useDebounce } from '../../hooks/useDebounce';\r\nimport { SEARCH_CONFIG } from '../../config';\r\n\r\ninterface AppHeaderProps {\r\n actions?: React.ReactNode;\r\n}\r\n\r\nconst AppHeader = ({ actions }: AppHeaderProps) => {\r\n const location = useLocation();\r\n const pageTitle = usePageTitle();\r\n \r\n \r\n const { companies, alias, isSearchVisible, clearSearch, refreshData, switchUnit } = useAuth();\r\n const selectedUnit = alias \r\n ? companies?.find(company => company.alias === alias) || companies?.[0] || null\r\n : companies?.[0] || null;\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n // Local state for immediate input value - initialize once from URL\r\n const [inputValue, setInputValue] = useState(() => searchParams.get('search') || '');\r\n \r\n // Debounced value that triggers URL updates with cancel function\r\n const [debouncedSearchValue, cancelDebounce] = useDebounce(inputValue, SEARCH_CONFIG.debounceDelay);\r\n\r\n // Update URL params (only when search is visible) to avoid clearing OAuth fragments on /callback\r\n useEffect(() => {\r\n if (!isSearchVisible) return;\r\n const newParams = new URLSearchParams(searchParams);\r\n if (debouncedSearchValue) {\r\n newParams.set('search', debouncedSearchValue);\r\n newParams.set('page', '1'); // Reset to page 1\r\n } else {\r\n newParams.delete('search');\r\n newParams.delete('page');\r\n }\r\n setSearchParams(newParams);\r\n }, [debouncedSearchValue, setSearchParams, isSearchVisible, searchParams]);\r\n\r\n const handleSearchChange = (value: string) => {\r\n setInputValue(value);\r\n };\r\n\r\n const handleClearSearch = () => {\r\n // Cancel any pending debounce\r\n cancelDebounce();\r\n \r\n // Clear input immediately\r\n setInputValue('');\r\n \r\n // Update URL immediately\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.delete('search');\r\n newParams.delete('page');\r\n setSearchParams(newParams);\r\n };\r\n\r\n return (\r\n <header className=\"bg-white border-b border-gray-200 px-2 md:px-4 py-2\">\r\n <div className=\"flex items-center justify-between gap-4\">\r\n {/* Left side: Menu button, breadcrumb and search */}\r\n <div className=\"flex items-center space-x-1 md:space-x-2 min-w-0\">\r\n <SidebarTrigger className=\"flex-shrink-0\" />\r\n\r\n <div className=\"min-w-0 flex flex-col md:flex-row md:items-center md:space-x-3 space-y-2 md:space-y-0\">\r\n {/* Page Title */}\r\n <div className=\"min-w-0\">\r\n <h1 className=\"text-lg font-semibold text-foreground truncate\">\r\n {pageTitle}\r\n </h1>\r\n </div>\r\n\r\n {/* Search field (only visible on CRUD pages) */}\r\n {isSearchVisible && (\r\n <div className=\"flex items-center space-x-1 w-full md:w-auto\">\r\n <div className=\"relative w-full md:w-48\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4\" />\r\n <Input\r\n placeholder=\"Buscar...\"\r\n value={inputValue}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n className=\"w-full pl-10 pr-8\"\r\n />\r\n {inputValue && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"absolute right-1 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0 hover:bg-gray-100\"\r\n onClick={handleClearSearch}\r\n title=\"Limpar busca\"\r\n >\r\n <X size={14} />\r\n </Button>\r\n )}\r\n </div>\r\n\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={refreshData}\r\n className=\"flex-shrink-0 h-10 w-10 p-0\"\r\n title=\"Atualizar dados\"\r\n >\r\n <RefreshCw size={14} />\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right side: Actions and User info */}\r\n <div className=\"flex-shrink-0 flex items-center gap-3\">\r\n {actions && (\r\n <div className=\"flex items-center gap-2\">\r\n {actions}\r\n </div>\r\n )}\r\n <div className=\"text-sm\">\r\n <UserInfo\r\n variant=\"dropdown\"\r\n selectedUnit={selectedUnit}\r\n onUnitChange={switchUnit}\r\n showDebug={true}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n};\r\n\r\nexport default AppHeader;","import { useQuery } from '@tanstack/react-query';\r\nimport { getSupabaseClient } from '../supabase/SupabaseSingleton';\r\nimport { useAuth } from '../auth/contexts/AuthContext';\r\n\r\ninterface UseActiveModulesOptions {\r\n enabled?: boolean;\r\n}\r\n\r\nexport const useActiveModules = (options: UseActiveModulesOptions = {}) => {\r\n const { enabled = true } = options;\r\n const { alias } = useAuth();\r\n \r\n return useQuery({\r\n queryKey: ['active-modules', alias],\r\n queryFn: async () => {\r\n if (!alias) {\r\n return [];\r\n }\r\n\r\n const supabase = getSupabaseClient();\r\n const { data, error } = await (supabase as any)\r\n .schema('central')\r\n .from('modules')\r\n .select(`\r\n id, name, url,\r\n modules_alias!inner(alias)\r\n `)\r\n .eq('modules_alias.alias', alias)\r\n .eq('status', 'active')\r\n .order('name');\r\n \r\n if (error) {\r\n throw error;\r\n }\r\n \r\n return data || [];\r\n },\r\n enabled: enabled && !!alias, // Só executa quando enabled for true E alias existir\r\n });\r\n};","// Asset exports for ForLogic Core library\r\n\r\n// Supabase Storage URLs for library assets\r\nconst DEFAULT_SUPABASE_PROJECT_ID = import.meta.env.VITE_SUPABASE_PROJECT_ID;\r\n\r\nexport const assets = {\r\n logo: `https://${DEFAULT_SUPABASE_PROJECT_ID}.supabase.co/storage/v1/object/public/library-assets/logo.png`,\r\n smallLogo: `https://${DEFAULT_SUPABASE_PROJECT_ID}.supabase.co/storage/v1/object/public/library-assets/small.png`\r\n};\r\n\r\n// Export for backward compatibility\r\nexport const logoSrc = assets.logo;\r\nexport const smallLogoSrc = assets.smallLogo;","import { useState } from 'react';\r\nimport { ChevronDown, ExternalLink, Loader2, AlertCircle } from 'lucide-react';\r\nimport { Link, useLocation } from 'react-router-dom';\r\nimport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarGroup,\r\n SidebarGroupContent,\r\n SidebarHeader,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from '../ui/sidebar';\r\n\r\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '../ui/dropdown-menu';\r\nimport { useActiveModules } from '../../hooks/useActiveModules';\r\nimport { SidebarConfig } from '../../types/sidebar';\r\nimport { assets } from '../../assets';\r\n\r\ninterface Module {\r\n id: string;\r\n name: string;\r\n url?: string;\r\n status: 'active' | 'inactive';\r\n}\r\n\r\ninterface AppSidebarProps {\r\n config?: SidebarConfig;\r\n}\r\n\r\nexport function AppSidebar({ config }: AppSidebarProps = {}) {\r\n const { state } = useSidebar();\r\n const location = useLocation();\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n\r\n // Só carrega os módulos quando o dropdown é aberto\r\n const {\r\n data: modules,\r\n isLoading,\r\n error\r\n } = useActiveModules({\r\n enabled: dropdownOpen\r\n });\r\n\r\n const isActive = (path: string) => location.pathname === path;\r\n \r\n const getColorVariant = (index: number) => {\r\n const colors = ['border-l-yellow-400', 'border-l-green-400', 'border-l-blue-400', 'border-l-red-400', 'border-l-purple-400', 'border-l-pink-400'];\r\n return colors[index % colors.length];\r\n };\r\n \r\n const handleModuleClick = (moduleUrl: string) => {\r\n const module = modules?.find(m => m.url === moduleUrl);\r\n if (module?.url) {\r\n window.open(module.url, '_blank');\r\n }\r\n };\r\n \r\n const renderModulesContent = () => {\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center space-x-2 py-3 px-3 text-muted-foreground\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n <span className=\"text-sm\">Carregando módulos...</span>\r\n </div>\r\n );\r\n }\r\n \r\n if (error) {\r\n return (\r\n <div className=\"flex items-center space-x-2 py-3 px-3 text-destructive\">\r\n <AlertCircle className=\"h-4 w-4\" />\r\n <span className=\"text-sm\">Erro ao carregar módulos</span>\r\n </div>\r\n );\r\n }\r\n \r\n if (!modules || modules.length === 0) {\r\n return (\r\n <div className=\"py-3 px-3 text-muted-foreground text-sm\">\r\n Nenhum módulo disponível\r\n </div>\r\n );\r\n }\r\n \r\n return (\r\n <div className=\"space-y-2\">\r\n {modules.map((module: Module, index: number) => (\r\n <div \r\n key={module.id} \r\n onClick={() => handleModuleClick(module.url || '')} \r\n className={`\r\n bg-muted/50 hover:bg-muted rounded-md p-3 cursor-pointer \r\n border-l-4 ${getColorVariant(index)} transition-colors duration-200\r\n `}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"font-medium text-foreground text-sm\">{module.name}</span>\r\n {module.url && <ExternalLink className=\"h-4 w-4 text-muted-foreground\" />}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <Sidebar collapsible=\"icon\">\r\n <SidebarHeader className=\"p-0 gap-0\">\r\n {/* Modules Dropdown */}\r\n <DropdownMenu onOpenChange={setDropdownOpen}>\r\n <DropdownMenuTrigger asChild>\r\n <div className=\"bg-gradient-to-r from-primary to-primary hover:opacity-90 text-primary-foreground font-semibold text-sm flex items-center justify-center cursor-pointer transition-all duration-200 h-8 gap-2 shadow-lg rounded-b-2xl\">\r\n {state !== \"collapsed\" && config?.appName}\r\n <ChevronDown size={16} />\r\n </div>\r\n </DropdownMenuTrigger>\r\n \r\n <DropdownMenuContent className=\"w-80 bg-popover rounded-lg shadow-lg border border-border p-4 z-50\" align={state === \"collapsed\" ? \"center\" : \"start\"}>\r\n {renderModulesContent()}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n \r\n {/* Logo Section */}\r\n <div className=\"flex justify-center items-center h-20\">\r\n <img \r\n src={state === \"collapsed\" ? assets.smallLogo : assets.logo} \r\n alt=\"Logo\" \r\n className={state === \"collapsed\" ? \"h-8 w-8\" : \"h-14 max-w-full\"} \r\n />\r\n </div>\r\n </SidebarHeader>\r\n \r\n <SidebarContent>\r\n <SidebarGroup>\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {config?.navigation?.map((item) => (\r\n <SidebarMenuItem key={item.path}>\r\n <SidebarMenuButton asChild isActive={isActive(item.path)}>\r\n <Link to={item.path}>\r\n <item.icon />\r\n <span>{item.label}</span>\r\n </Link>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n ))}\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n </SidebarContent>\r\n </Sidebar>\r\n );\r\n}\r\n\r\nexport default AppSidebar;","// ============= SIMPLE ERROR BOUNDARY =============\r\n\r\nimport React, { Component, ReactNode } from 'react';\r\nimport { errorService } from '../services/ErrorService';\r\nimport { Card, CardContent, CardHeader, CardTitle } from './ui/card';\r\nimport { Button } from './ui/button';\r\nimport { AlertTriangle } from 'lucide-react';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n}\r\n\r\ninterface State {\r\n hasError: boolean;\r\n error?: Error;\r\n}\r\n\r\nexport class ErrorBoundary extends Component<Props, State> {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): State {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\r\n errorService.handleError(error, false);\r\n console.error('ErrorBoundary caught an error:', error, errorInfo);\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n if (this.props.fallback) {\r\n return this.props.fallback;\r\n }\r\n\r\n return (\r\n <div className=\"flex items-center justify-center min-h-screen p-4\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <div className=\"flex justify-center mb-4\">\r\n <AlertTriangle className=\"h-12 w-12 text-destructive\" />\r\n </div>\r\n <CardTitle>Algo deu errado</CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center space-y-4\">\r\n <p className=\"text-muted-foreground\">\r\n Ocorreu um erro inesperado. Tente recarregar a página.\r\n </p>\r\n <Button \r\n onClick={() => window.location.reload()}\r\n className=\"w-full\"\r\n >\r\n Recarregar Página\r\n </Button>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\nexport default ErrorBoundary;","import { useState, useEffect, useMemo, useRef } from 'react';\r\nimport { FormField } from '../../types';\r\n\r\nexport function useBaseForm<T extends Record<string, any>>(\r\n fields: FormField[],\r\n initialData?: Partial<T>,\r\n onFormDataChange?: (data: T) => void,\r\n open?: boolean\r\n) {\r\n const [formData, setFormData] = useState<T>({} as T);\r\n const [errors, setErrors] = useState<Record<string, string>>({});\r\n\r\n // Memoize the fields to avoid re-processing if they don't change\r\n const memoizedFields = useMemo(() => fields, [fields]);\r\n\r\n // Helper to check if a value is a valid Date\r\n const isValidDate = (value: any): value is Date => {\r\n return value instanceof Date && !isNaN(value.getTime());\r\n };\r\n\r\n // Get default value for field type\r\n const getDefaultFieldValue = (field: FormField): any => {\r\n if (field.defaultValue !== undefined) return field.defaultValue;\r\n \r\n switch (field.type) {\r\n case 'multiselect':\r\n return [];\r\n case 'checkbox':\r\n return false;\r\n case 'number':\r\n return 0;\r\n case 'date':\r\n return '';\r\n case 'group':\r\n return {};\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n // Calculate computed value if field has computedValue function\r\n const calculateComputedValue = (field: FormField, currentFormData: T): any => {\r\n if (field.computedValue && typeof field.computedValue === 'function') {\r\n try {\r\n return field.computedValue(currentFormData);\r\n } catch (error) {\r\n // Silent computation error handling\r\n return getDefaultFieldValue(field);\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n // Update dependent fields when a field changes\r\n const updateDependentFields = (changedFieldName: string, newFormData: T): T => {\r\n let updatedData = { ...newFormData };\r\n \r\n // Get all fields that depend on the changed field\r\n const getAllFields = (fieldList: FormField[]): FormField[] => {\r\n const allFields: FormField[] = [];\r\n \r\n fieldList.forEach(field => {\r\n allFields.push(field);\r\n if (field.fields) {\r\n allFields.push(...getAllFields(field.fields));\r\n }\r\n });\r\n \r\n return allFields;\r\n };\r\n\r\n const dependentFields = getAllFields(memoizedFields).filter(field => \r\n field.dependsOn === changedFieldName\r\n );\r\n \r\n dependentFields.forEach(field => {\r\n const computedValue = calculateComputedValue(field, updatedData);\r\n if (computedValue !== undefined) {\r\n updatedData = { ...updatedData, [field.name]: computedValue };\r\n }\r\n });\r\n \r\n return updatedData;\r\n };\r\n\r\n // Validate a single field\r\n const validateField = (field: FormField, value: any, currentFormData?: T): string | undefined => {\r\n // Check required validation\r\n if (field.required && (value === '' || value === null || value === undefined || \r\n (Array.isArray(value) && value.length === 0))) {\r\n return `${field.label} é obrigatório`;\r\n }\r\n\r\n // Check custom validation\r\n if (field.validation) {\r\n let validator: ((value: any, formData?: any) => string | undefined) | undefined;\r\n \r\n if (typeof field.validation === 'function') {\r\n validator = field.validation;\r\n } else if (field.validation.custom && typeof field.validation.custom === 'function') {\r\n validator = field.validation.custom;\r\n }\r\n\r\n if (validator) {\r\n try {\r\n const result = validator(value, currentFormData);\r\n if (result) return result;\r\n } catch (error) {\r\n // Silent validation error handling\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n // Initialize form data - simplified logic\r\n useEffect(() => {\r\n // Always initialize when open changes to true or when initialData/fields change\r\n if (!open) return;\r\n\r\n // Get all fields (including nested ones)\r\n const getAllFields = (fieldList: FormField[]): FormField[] => {\r\n const allFields: FormField[] = [];\r\n \r\n fieldList.forEach(field => {\r\n allFields.push(field);\r\n if (field.fields) {\r\n allFields.push(...getAllFields(field.fields));\r\n }\r\n });\r\n \r\n return allFields;\r\n };\r\n\r\n const allFields = getAllFields(memoizedFields);\r\n const newFormData: any = {};\r\n\r\n // Iterate each field\r\n allFields.forEach(field => {\r\n let fieldValue: any;\r\n\r\n // Check if we have initial data for this field\r\n if (initialData && initialData[field.name as keyof T] !== undefined) {\r\n fieldValue = initialData[field.name as keyof T];\r\n \r\n // Handle null/undefined text fields - convert to empty string\r\n if ((fieldValue === null || fieldValue === undefined)) {\r\n fieldValue = '';\r\n }\r\n \r\n // Handle date fields - convert to YYYY-MM-DD format for input[type=\"date\"]\r\n if (field.type === 'date' && fieldValue) {\r\n if (typeof fieldValue === 'string') {\r\n const date = new Date(fieldValue);\r\n if (isValidDate(date)) {\r\n fieldValue = date.toISOString().split('T')[0];\r\n }\r\n } else if (isValidDate(fieldValue)) {\r\n fieldValue = fieldValue.toISOString().split('T')[0];\r\n }\r\n }\r\n } else {\r\n // Use default value\r\n fieldValue = getDefaultFieldValue(field);\r\n }\r\n\r\n newFormData[field.name] = fieldValue;\r\n });\r\n\r\n // Calculate computed values after all fields are set\r\n allFields.forEach(field => {\r\n const computedValue = calculateComputedValue(field, newFormData);\r\n if (computedValue !== undefined) {\r\n newFormData[field.name] = computedValue;\r\n }\r\n });\r\n\r\n setFormData(newFormData as T);\r\n setErrors({});\r\n\r\n // Notify parent of form data change\r\n if (onFormDataChange) {\r\n onFormDataChange(newFormData as T);\r\n }\r\n }, [memoizedFields, initialData, onFormDataChange, open]);\r\n\r\n // Update a field value\r\n const updateField = (fieldName: string, value: any) => {\r\n setFormData(prevData => {\r\n const newData = { ...prevData, [fieldName]: value };\r\n \r\n // Update dependent fields\r\n const updatedData = updateDependentFields(fieldName, newData);\r\n \r\n // Notify parent of form data change\r\n if (onFormDataChange) {\r\n onFormDataChange(updatedData);\r\n }\r\n \r\n return updatedData;\r\n });\r\n\r\n // Clear error for this field if it exists\r\n if (errors[fieldName]) {\r\n setErrors(prevErrors => {\r\n const newErrors = { ...prevErrors };\r\n delete newErrors[fieldName];\r\n return newErrors;\r\n });\r\n }\r\n\r\n // Validate field in real-time\r\n const field = getAllFields(memoizedFields).find(f => f.name === fieldName);\r\n if (field) {\r\n const error = validateField(field, value, formData);\r\n if (error) {\r\n setErrors(prevErrors => ({ ...prevErrors, [fieldName]: error }));\r\n }\r\n }\r\n };\r\n\r\n // Helper to get all fields (including nested)\r\n const getAllFields = (fieldList: FormField[]): FormField[] => {\r\n const allFields: FormField[] = [];\r\n \r\n fieldList.forEach(field => {\r\n allFields.push(field);\r\n if (field.fields) {\r\n allFields.push(...getAllFields(field.fields));\r\n }\r\n });\r\n \r\n return allFields;\r\n };\r\n\r\n // Validate entire form\r\n const validateForm = (): boolean => {\r\n const allFields = getAllFields(memoizedFields);\r\n const newErrors: Record<string, string> = {};\r\n\r\n allFields.forEach(field => {\r\n const error = validateField(field, formData[field.name], formData);\r\n if (error) {\r\n newErrors[field.name] = error;\r\n }\r\n });\r\n\r\n setErrors(newErrors);\r\n return Object.keys(newErrors).length === 0;\r\n };\r\n\r\n // Create submit handler\r\n const handleSubmit = (onSubmit: (data: T) => void) => {\r\n return (e?: React.FormEvent) => {\r\n if (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n \r\n if (validateForm()) {\r\n onSubmit(formData);\r\n }\r\n };\r\n };\r\n\r\n return {\r\n formData,\r\n errors,\r\n updateField,\r\n validateForm,\r\n handleSubmit,\r\n };\r\n}","import { TokenManager } from '../../auth/services/TokenManager';\r\nimport { QualiexUser } from '../../types';\r\nimport { errorService } from '../../services/ErrorService';\r\n\r\ninterface QualiexApiResponse {\r\n success: boolean;\r\n data?: any[];\r\n error?: string;\r\n message?: string;\r\n}\r\n\r\nclass QualiexApiService {\r\n private baseUrl = import.meta.env.VITE_QUALIEX_API_URL;\r\n\r\n /**\r\n * Faz uma chamada para a API do Qualiex\r\n * IMPORTANTE: O header 'un-alias' é OBRIGATÓRIO para todas as requisições da API common-v4\r\n * Sem este header, a API retorna erro 401 \"ID not found\"\r\n */\r\n private async makeApiCall(endpoint: string, params: Record<string, string>, alias: string): Promise<any> {\r\n const token = TokenManager.getAccessToken();\r\n \r\n if (!token) {\r\n throw new Error('Token Qualiex não encontrado');\r\n }\r\n\r\n // Validação obrigatória: alias não pode ser vazio\r\n if (!alias || alias.trim() === '') {\r\n throw new Error('Alias da unidade é obrigatório para chamadas à API do Qualiex');\r\n }\r\n\r\n const url = new URL(endpoint, this.baseUrl);\r\n Object.entries(params).forEach(([key, value]) => {\r\n url.searchParams.append(key, value);\r\n });\r\n\r\n const response = await fetch(url.toString(), {\r\n method: 'GET',\r\n headers: {\r\n 'Authorization': `Bearer ${token}`,\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n // CRÍTICO: Header 'un-alias' é obrigatório para a API common-v4 do Qualiex\r\n // Sem este header, todas as requisições falham com 401 \"ID not found\"\r\n 'un-alias': alias,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`API call failed: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n \r\n return data;\r\n }\r\n\r\n private mapToQualiexUser(userData: any): QualiexUser {\r\n // Mapear os dados retornados pela API para o formato esperado (userId, userName, userEmail)\r\n return {\r\n userId: userData.userId || String(userData.ID),\r\n userName: userData.userName || 'Nome não disponível',\r\n userEmail: userData.userEmail || 'Email não disponível',\r\n };\r\n }\r\n\r\n async fetchUsers(alias: string, companyId: string): Promise<QualiexUser[]> {\r\n try {\r\n // Fazer chamada para API real do Qualiex\r\n // Endpoint correto: /api/common/v1/companiesusers\r\n // IMPORTANTE: Passando o alias como terceiro parâmetro para incluir o header 'un-alias'\r\n const response = await this.makeApiCall('/api/common/v1/companiesusers', {\r\n companyId,\r\n search: '', // Busca vazia por padrão\r\n filterStatus: 'active', // Apenas usuários ativos\r\n }, alias);\r\n\r\n // A API common-v4 pode retornar dados diretamente ou em uma propriedade específica\r\n let userData = response;\r\n if (response.data) {\r\n userData = response.data;\r\n } else if (Array.isArray(response)) {\r\n userData = response;\r\n } else {\r\n errorService.handleError('[QualiexApi] Unexpected response format', false);\r\n return [];\r\n }\r\n\r\n if (!Array.isArray(userData)) {\r\n errorService.handleError('[QualiexApi] Response is not an array', false);\r\n return [];\r\n }\r\n\r\n // Mapear os dados para o formato esperado\r\n const users: QualiexUser[] = userData.map(this.mapToQualiexUser);\r\n\r\n return users;\r\n\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : '[QualiexApi] Error fetching users');\r\n return [];\r\n }\r\n }\r\n\r\n // Método para buscar um usuário específico por ID\r\n async fetchUserById(userId: string, alias: string, companyId: string): Promise<QualiexUser | null> {\r\n try {\r\n const users = await this.fetchUsers(alias, companyId);\r\n return users.find(user => user.userId === userId) || null;\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : '[QualiexApi] Error fetching user by ID');\r\n return null;\r\n }\r\n }\r\n\r\n\r\n // Método público para buscar usuários - usado pelo hook useQualiexUsers\r\n async getUsers(alias: string): Promise<QualiexUser[]> {\r\n // Extrair companyId do token Supabase\r\n const tokenData = TokenManager.extractTokenData();\r\n \r\n if (!tokenData || !tokenData.companyId) {\r\n errorService.handleError('[QualiexApi] CompanyId não encontrado no token Supabase', false);\r\n return [];\r\n }\r\n \r\n return this.fetchUsers(alias, tokenData.companyId);\r\n }\r\n}\r\n\r\nexport const qualiexApi = new QualiexApiService();","import { useQuery } from '@tanstack/react-query';\r\nimport { QualiexUser } from '../../types';\r\nimport { qualiexApi } from '../services/qualiexApi';\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\nimport { errorService } from '../../services/ErrorService';\r\n\r\ninterface UseQualiexUsersOptions {\r\n enabled?: boolean;\r\n}\r\n\r\nexport const useQualiexUsers = (options: UseQualiexUsersOptions = {}) => {\r\n const { user, alias: companyAlias } = useAuth();\r\n const { enabled = true } = options;\r\n\r\n return useQuery<QualiexUser[]>({\r\n queryKey: ['qualiex-users', companyAlias],\r\n queryFn: () => qualiexApi.getUsers(companyAlias!),\r\n enabled: enabled && !!companyAlias && !!user,\r\n retry: 2,\r\n retryDelay: 1000,\r\n });\r\n};","import React from 'react';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\nimport { Skeleton } from '../../components/ui/skeleton';\r\nimport { useQualiexUsers } from '../hooks/useQualiexUsers';\r\nimport { AlertCircle } from 'lucide-react';\r\nimport { cn } from '../../utils';\r\n\r\ninterface QualiexUserFieldProps {\r\n value?: string;\r\n onChange?: (value: string) => void;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const QualiexUserField: React.FC<QualiexUserFieldProps> = ({\r\n value = '',\r\n onChange,\r\n placeholder = 'Selecionar usuário',\r\n disabled,\r\n className\r\n}) => {\r\n const { data: users = [], isLoading, error } = useQualiexUsers();\r\n\r\n if (isLoading) {\r\n return <Skeleton className={cn(\"h-10 w-full\", className)} />;\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className={`flex items-center gap-2 p-2 border border-destructive/20 rounded-md ${className}`}>\r\n <AlertCircle className=\"h-4 w-4 text-destructive\" />\r\n <span className=\"text-sm text-destructive\">Erro ao carregar usuários</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Select\r\n value={value}\r\n onValueChange={onChange}\r\n disabled={disabled || users.length === 0}\r\n >\r\n <SelectTrigger className={className}>\r\n <SelectValue placeholder={placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {users.length === 0 ? (\r\n <SelectItem value=\"no-users\" disabled>\r\n Nenhum usuário encontrado\r\n </SelectItem>\r\n ) : (\r\n users.map((user) => (\r\n <SelectItem key={user.userId} value={user.userId}>\r\n {user.userName}\r\n </SelectItem>\r\n ))\r\n )}\r\n </SelectContent>\r\n </Select>\r\n );\r\n};","import React from 'react';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\n\r\ninterface QualiexResponsibleSelectFieldProps {\r\n value?: string;\r\n onChange?: (value: string) => void;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const QualiexResponsibleSelectField: React.FC<QualiexResponsibleSelectFieldProps> = ({\r\n value,\r\n onChange,\r\n placeholder = 'Selecionar responsável',\r\n disabled,\r\n className\r\n}) => {\r\n return (\r\n <Select value={value} onValueChange={onChange} disabled={disabled}>\r\n <SelectTrigger className={className}>\r\n <SelectValue placeholder={placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"placeholder\">Responsável placeholder</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n );\r\n};","import React, { useState, useMemo, useCallback } from 'react';\r\nimport { Dialog, DialogContent, DialogTitle, DialogDescription, DialogHeader } from '../../components/ui/dialog';\r\n// VisuallyHidden removed - using inline implementation\r\nimport type { BaseFormProps, FormField, FormSection } from '../../types';\r\nimport { useBaseForm } from '../hooks/useBaseForm';\r\nimport { cn } from '../../utils';\r\nimport { Button } from '../../components/ui/button';\r\nimport { Input } from '../../components/ui/input';\r\nimport { Textarea } from '../../components/ui/textarea';\r\nimport { Label } from '../../components/ui/label';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\nimport { ColorPicker } from '../../components/ui/color-picker';\r\nimport { IconPicker } from '../../components/ui/icon-picker';\r\n\r\nimport { QualiexUserField } from '../../qualiex/components/QualiexUserField';\r\nimport { QualiexResponsibleSelectField } from '../../qualiex/components/QualiexResponsibleSelectField';\r\nfunction BaseForm<T extends Record<string, any>>({\r\n title,\r\n sections,\r\n initialData,\r\n onSubmit,\r\n onCancel,\r\n open,\r\n submitButtonText = 'Salvar',\r\n isLoading = false,\r\n usersData\r\n}: BaseFormProps<T> & {\r\n usersData?: any[];\r\n isLoading?: boolean;\r\n}) {\r\n const [activeSection, setActiveSection] = useState(sections?.[0]?.id || '');\r\n\r\n // Stabilize allFields reference using useMemo to prevent infinite re-renders\r\n // Now handles grouped fields by expanding them\r\n const allFields = useMemo(() => {\r\n if (!sections || !Array.isArray(sections)) return [];\r\n return sections.flatMap(section => section.fields.flatMap(field => field.type === 'group' ? field.fields || [] : field));\r\n }, [sections]);\r\n const {\r\n formData,\r\n errors,\r\n updateField,\r\n handleSubmit\r\n } = useBaseForm<T>(allFields, initialData, undefined, open);\r\n\r\n // Evaluate section conditions and filter available sections\r\n const availableSections = useMemo(() => {\r\n if (!sections || !Array.isArray(sections)) return [];\r\n return sections.map(section => ({\r\n ...section,\r\n disabled: section.condition ? !section.condition(formData) : section.disabled || false\r\n }));\r\n }, [sections, formData]);\r\n\r\n // Ensure active section is available, if not switch to first available\r\n const validActiveSection = useMemo(() => {\r\n const currentSection = availableSections.find(s => s.id === activeSection);\r\n if (currentSection && !currentSection.disabled) {\r\n return activeSection;\r\n }\r\n const firstAvailable = availableSections.find(s => !s.disabled);\r\n return firstAvailable?.id || activeSection;\r\n }, [availableSections, activeSection]);\r\n\r\n // Update active section if it's not valid\r\n React.useEffect(() => {\r\n if (validActiveSection !== activeSection) {\r\n setActiveSection(validActiveSection);\r\n }\r\n }, [validActiveSection, activeSection]);\r\n const currentSection = availableSections.find(s => s.id === validActiveSection);\r\n const renderField = (field: any) => {\r\n // For computed fields, use the computed value, otherwise use form data\r\n // Fix: Use proper null/undefined checks instead of || to preserve 0 values\r\n // For computed fields, use the computed value, otherwise use form data\r\n // Fix: Use proper null/undefined checks instead of || to preserve 0 values\r\n const rawValue = field.computedValue ? formData[field.name as keyof T] : formData[field.name as keyof T];\r\n const value = rawValue !== undefined ? rawValue : '';\r\n const error = errors[field.name];\r\n switch (field.type) {\r\n case 'group':\r\n return <div key={field.name} className=\"space-y-2\">\r\n {field.label}\r\n <div className={field.className || (field.layout === 'horizontal' ? 'flex gap-3' : 'space-y-3')}>\r\n {field.fields?.map((subField: any) => renderField(subField))}\r\n </div>\r\n </div>;\r\n case 'user-select':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <QualiexUserField\r\n value={value || ''} \r\n onChange={newValue => updateField(field.name, newValue)} \r\n placeholder={field.placeholder} \r\n disabled={field.disabled} \r\n className={error ? 'border-red-500' : ''} \r\n />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'textarea':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Textarea id={field.name} value={value || ''} onChange={e => {\r\n updateField(field.name, e.target.value);\r\n }} placeholder={field.placeholder} disabled={field.disabled} className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'select':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Select value={String(value)} onValueChange={newValue => {\r\n updateField(field.name, newValue);\r\n // Execute custom onValueChange if provided\r\n if (field.onValueChange) {\r\n field.onValueChange(newValue);\r\n }\r\n }} disabled={field.disabled}>\r\n <SelectTrigger className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`}>\r\n <SelectValue placeholder={field.placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {field.options?.map(option => <SelectItem key={option.value} value={option.value}>\r\n {option.label}\r\n </SelectItem>)}\r\n </SelectContent>\r\n </Select>\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'date':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Input id={field.name} type=\"date\" value={String(value)} onChange={e => updateField(field.name, e.target.value)} placeholder={field.placeholder} disabled={field.disabled} className={cn(\"w-full\", error ? 'border-red-500' : '', field.disabled ? 'bg-gray-100 cursor-not-allowed' : '')} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'single-responsible-select':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <QualiexResponsibleSelectField \r\n value={String(value)} \r\n onChange={selectedResponsible => updateField(field.name, selectedResponsible)} \r\n placeholder={field.placeholder}\r\n disabled={field.disabled} \r\n className={error ? 'border-red-500' : ''} \r\n />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'simple-qualiex-user-field':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <QualiexUserField \r\n value={value ?? ''}\r\n onChange={newValue => updateField(field.name, newValue)}\r\n placeholder={field.placeholder} \r\n disabled={field.disabled} \r\n className={error ? 'border-red-500' : ''} \r\n />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'color':\r\n return (\r\n <div key={field.name}>\r\n <Label htmlFor={field.name}>{field.label} {field.required && <span className=\"text-destructive\">*</span>}</Label>\r\n <Input\r\n id={field.name}\r\n type=\"color\"\r\n value={value || field.defaultValue || '#000000'}\r\n onChange={(e) => updateField(field.name, e.target.value)}\r\n className=\"h-10\"\r\n />\r\n {error && (\r\n <p className=\"text-sm text-destructive mt-1\">{error}</p>\r\n )}\r\n </div>\r\n );\r\n\r\n case 'color-picker':\r\n return (\r\n <div key={field.name}>\r\n <ColorPicker\r\n label={`${field.label} ${field.required ? '*' : ''}`}\r\n value={value || field.defaultValue || '#3b82f6'}\r\n onChange={(color) => updateField(field.name, color)}\r\n />\r\n {error && (\r\n <p className=\"text-sm text-destructive mt-1\">{error}</p>\r\n )}\r\n </div>\r\n );\r\n\r\n case 'icon-picker':\r\n return (\r\n <div key={field.name}>\r\n <IconPicker\r\n label={`${field.label} ${field.required ? '*' : ''}`}\r\n value={value || field.defaultValue || 'Star'}\r\n onChange={(iconName) => updateField(field.name, iconName)}\r\n />\r\n {error && (\r\n <p className=\"text-sm text-destructive mt-1\">{error}</p>\r\n )}\r\n </div>\r\n );\r\n\r\n case 'number':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Input id={field.name} type=\"number\" value={value !== null && value !== undefined ? String(value) : ''} onChange={e => {\r\n const inputValue = e.target.value;\r\n const newValue = inputValue === '' ? null : Number(inputValue);\r\n updateField(field.name, newValue);\r\n }} placeholder={field.placeholder} disabled={field.disabled} className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`} min={field.min} step={field.step || '1'} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n default:\r\n // text\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Input id={field.name} type=\"text\" value={value || ''} onChange={e => {\r\n updateField(field.name, e.target.value);\r\n }} placeholder={field.placeholder} disabled={field.disabled} className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`} readOnly={field.disabled} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n }\r\n };\r\n const renderSectionContent = useCallback(() => {\r\n if (!currentSection) return null;\r\n\r\n // Show disabled message if section is disabled\r\n if (currentSection.disabled) {\r\n return <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <div className=\"rounded-full bg-muted p-3 mb-4\">\r\n <svg className=\"h-6 w-6 text-muted-foreground\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m0 0v2m0-2h2m-2 0H9m3-8V9m0-4V3\" />\r\n </svg>\r\n </div>\r\n <h3 className=\"text-lg font-semibold mb-2\">Seção não disponível</h3>\r\n <p className=\"text-muted-foreground max-w-sm\">\r\n Complete as informações obrigatórias na seção \"Informações Gerais\" para acessar esta seção.\r\n </p>\r\n </div>;\r\n }\r\n\r\n // If section has a custom component, render it\r\n if (currentSection.component) {\r\n const SectionComponent = currentSection.component;\r\n return <SectionComponent formData={formData} updateField={updateField} errors={errors} users={usersData} disabled={currentSection.disabled} />;\r\n }\r\n\r\n // Default field rendering\r\n return <div className=\"space-y-3\">\r\n {currentSection.fields.map(renderField)}\r\n </div>;\r\n }, [currentSection, formData, updateField, errors, usersData, renderField]);\r\n const handleSectionChange = (sectionId: string) => {\r\n const section = availableSections.find(s => s.id === sectionId);\r\n if (section && !section.disabled) {\r\n setActiveSection(sectionId);\r\n }\r\n };\r\n const formContent =\r\n // Default layout without sidebar - compact modal version\r\n <div className=\"flex flex-col max-h-[80vh]\">\r\n {/* Section navigation for multi-section forms */}\r\n {availableSections.length > 1 && <div className=\"flex-shrink-0 p-4 border-b\">\r\n <div className=\"flex space-x-2\">\r\n {availableSections.map(section => \r\n <Button\r\n key={section.id}\r\n variant={validActiveSection === section.id ? \"action-primary\" : \"action-secondary\"}\r\n size=\"sm\"\r\n onClick={() => handleSectionChange(section.id)}\r\n disabled={section.disabled}\r\n className={section.disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}\r\n >\r\n {section.title}\r\n </Button>\r\n )}\r\n </div>\r\n </div>}\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto px-2 md:px-4 pt-0 pb-2 md:pb-4\">\r\n {isLoading ? <div className=\"flex items-center justify-center py-12\">\r\n <div className=\"text-muted-foreground\">Carregando dados...</div>\r\n </div> : <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-3 md:space-y-4\">\r\n {renderSectionContent()}\r\n \r\n {/* Submit buttons */}\r\n <div className=\"flex justify-end space-x-2 pt-4\">\r\n <Button type=\"button\" variant=\"outline\" onClick={onCancel}>\r\n Cancelar\r\n </Button>\r\n <Button type=\"submit\" disabled={isLoading}>\r\n {submitButtonText}\r\n </Button>\r\n </div>\r\n </form>}\r\n </div>\r\n </div>;\r\nreturn <Dialog open={open} onOpenChange={openState => {\r\n // Só fecha se explicitamente mudou para false\r\n if (openState === false && open === true) {\r\n onCancel();\r\n }\r\n}}>\r\n <DialogContent className=\"max-w-4xl max-h-[90vh] overflow-hidden\">\r\n <DialogHeader className=\"bg-primary text-primary-foreground px-6 py-4 -mx-6 -mt-6 mb-4\">\r\n <DialogTitle className=\"text-white\">{title}</DialogTitle>\r\n <DialogDescription className=\"sr-only\">\r\n Formulário para preenchimento de dados\r\n </DialogDescription>\r\n </DialogHeader>\r\n {formContent}\r\n </DialogContent>\r\n </Dialog>;\r\n}\r\nexport default BaseForm;","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","/* eslint-disable no-unused-vars */\n\n/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"menos de um segundo\",\n other: \"menos de {{count}} segundos\",\n },\n\n xSeconds: {\n one: \"1 segundo\",\n other: \"{{count}} segundos\",\n },\n\n halfAMinute: \"meio minuto\",\n\n lessThanXMinutes: {\n one: \"menos de um minuto\",\n other: \"menos de {{count}} minutos\",\n },\n\n xMinutes: {\n one: \"1 minuto\",\n other: \"{{count}} minutos\",\n },\n\n aboutXHours: {\n one: \"cerca de 1 hora\",\n other: \"cerca de {{count}} horas\",\n },\n\n xHours: {\n one: \"1 hora\",\n other: \"{{count}} horas\",\n },\n\n xDays: {\n one: \"1 dia\",\n other: \"{{count}} dias\",\n },\n\n aboutXWeeks: {\n one: \"cerca de 1 semana\",\n other: \"cerca de {{count}} semanas\",\n },\n\n xWeeks: {\n one: \"1 semana\",\n other: \"{{count}} semanas\",\n },\n\n aboutXMonths: {\n one: \"cerca de 1 mês\",\n other: \"cerca de {{count}} meses\",\n },\n\n xMonths: {\n one: \"1 mês\",\n other: \"{{count}} meses\",\n },\n\n aboutXYears: {\n one: \"cerca de 1 ano\",\n other: \"cerca de {{count}} anos\",\n },\n\n xYears: {\n one: \"1 ano\",\n other: \"{{count}} anos\",\n },\n\n overXYears: {\n one: \"mais de 1 ano\",\n other: \"mais de {{count}} anos\",\n },\n\n almostXYears: {\n one: \"quase 1 ano\",\n other: \"quase {{count}} anos\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"em \" + result;\n } else {\n return \"há \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE, d 'de' MMMM 'de' y\",\n long: \"d 'de' MMMM 'de' y\",\n medium: \"d MMM y\",\n short: \"dd/MM/yyyy\",\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'às' {{time}}\",\n long: \"{{date}} 'às' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: (date) => {\n const weekday = date.getDay();\n const last = weekday === 0 || weekday === 6 ? \"último\" : \"última\";\n return \"'\" + last + \"' eeee 'às' p\";\n },\n yesterday: \"'ontem às' p\",\n today: \"'hoje às' p\",\n tomorrow: \"'amanhã às' p\",\n nextWeek: \"eeee 'às' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, date, _baseDate, _options) => {\n const format = formatRelativeLocale[token];\n\n if (typeof format === \"function\") {\n return format(date);\n }\n\n return format;\n};\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { formatDistance } from \"./pt-BR/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./pt-BR/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./pt-BR/_lib/formatRelative.mjs\";\nimport { localize } from \"./pt-BR/_lib/localize.mjs\";\nimport { match } from \"./pt-BR/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary Portuguese locale (Brazil).\n * @language Portuguese\n * @iso-639-2 por\n * @author Lucas Duailibe [@duailibe](https://github.com/duailibe)\n * @author Yago Carballo [@yagocarballo](https://github.com/YagoCarballo)\n */\nexport const ptBR = {\n code: \"pt-BR\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default ptBR;\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"AC\", \"DC\"],\n abbreviated: [\"AC\", \"DC\"],\n wide: [\"antes de cristo\", \"depois de cristo\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"T1\", \"T2\", \"T3\", \"T4\"],\n wide: [\"1º trimestre\", \"2º trimestre\", \"3º trimestre\", \"4º trimestre\"],\n};\n\nconst monthValues = {\n narrow: [\"j\", \"f\", \"m\", \"a\", \"m\", \"j\", \"j\", \"a\", \"s\", \"o\", \"n\", \"d\"],\n abbreviated: [\n \"jan\",\n \"fev\",\n \"mar\",\n \"abr\",\n \"mai\",\n \"jun\",\n \"jul\",\n \"ago\",\n \"set\",\n \"out\",\n \"nov\",\n \"dez\",\n ],\n\n wide: [\n \"janeiro\",\n \"fevereiro\",\n \"março\",\n \"abril\",\n \"maio\",\n \"junho\",\n \"julho\",\n \"agosto\",\n \"setembro\",\n \"outubro\",\n \"novembro\",\n \"dezembro\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n short: [\"dom\", \"seg\", \"ter\", \"qua\", \"qui\", \"sex\", \"sab\"],\n abbreviated: [\n \"domingo\",\n \"segunda\",\n \"terça\",\n \"quarta\",\n \"quinta\",\n \"sexta\",\n \"sábado\",\n ],\n\n wide: [\n \"domingo\",\n \"segunda-feira\",\n \"terça-feira\",\n \"quarta-feira\",\n \"quinta-feira\",\n \"sexta-feira\",\n \"sábado\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mn\",\n noon: \"md\",\n morning: \"manhã\",\n afternoon: \"tarde\",\n evening: \"tarde\",\n night: \"noite\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"manhã\",\n afternoon: \"tarde\",\n evening: \"tarde\",\n night: \"noite\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"manhã\",\n afternoon: \"tarde\",\n evening: \"tarde\",\n night: \"noite\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mn\",\n noon: \"md\",\n morning: \"da manhã\",\n afternoon: \"da tarde\",\n evening: \"da tarde\",\n night: \"da noite\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"da manhã\",\n afternoon: \"da tarde\",\n evening: \"da tarde\",\n night: \"da noite\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"da manhã\",\n afternoon: \"da tarde\",\n evening: \"da tarde\",\n night: \"da noite\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n\n if (options?.unit === \"week\") {\n return number + \"ª\";\n }\n return number + \"º\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)[ºªo]?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(ac|dc|a|d)/i,\n abbreviated: /^(a\\.?\\s?c\\.?|d\\.?\\s?c\\.?)/i,\n wide: /^(antes de cristo|depois de cristo)/i,\n};\nconst parseEraPatterns = {\n any: [/^ac/i, /^dc/i],\n wide: [/^antes de cristo/i, /^depois de cristo/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^T[1234]/i,\n wide: /^[1234](º)? trimestre/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmajsond]/i,\n abbreviated: /^(jan|fev|mar|abr|mai|jun|jul|ago|set|out|nov|dez)/i,\n wide: /^(janeiro|fevereiro|março|abril|maio|junho|julho|agosto|setembro|outubro|novembro|dezembro)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^fev/i,\n /^mar/i,\n /^abr/i,\n /^mai/i,\n /^jun/i,\n /^jul/i,\n /^ago/i,\n /^set/i,\n /^out/i,\n /^nov/i,\n /^dez/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^(dom|[23456]ª?|s[aá]b)/i,\n short: /^(dom|[23456]ª?|s[aá]b)/i,\n abbreviated: /^(dom|seg|ter|qua|qui|sex|s[aá]b)/i,\n wide: /^(domingo|(segunda|ter[cç]a|quarta|quinta|sexta)([- ]feira)?|s[aá]bado)/i,\n};\nconst parseDayPatterns = {\n short: [/^d/i, /^2/i, /^3/i, /^4/i, /^5/i, /^6/i, /^s[aá]/i],\n narrow: [/^d/i, /^2/i, /^3/i, /^4/i, /^5/i, /^6/i, /^s[aá]/i],\n any: [/^d/i, /^seg/i, /^t/i, /^qua/i, /^qui/i, /^sex/i, /^s[aá]b/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mn|md|(da) (manhã|tarde|noite))/i,\n any: /^([ap]\\.?\\s?m\\.?|meia[-\\s]noite|meio[-\\s]dia|(da) (manhã|tarde|noite))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mn|^meia[-\\s]noite/i,\n noon: /^md|^meio[-\\s]dia/i,\n morning: /manhã/i,\n afternoon: /tarde/i,\n evening: /tarde/i,\n night: /noite/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import React from 'react';\r\nimport { Edit, Trash2, PowerOff, Power } from \"lucide-react\";\r\nimport { DropdownMenuItem } from \"../../components/ui/dropdown-menu\";\r\nimport { Button } from \"../../components/ui/button\";\r\n\r\ninterface ActionMenuItemsProps {\r\n onEdit?: () => void;\r\n onDelete?: () => void;\r\n onToggleStatus?: () => void;\r\n isActive?: boolean;\r\n canDelete?: boolean;\r\n renderAs: 'dropdown' | 'context';\r\n}\r\n\r\nexport const ActionMenuItems: React.FC<ActionMenuItemsProps> = ({\r\n onEdit,\r\n onDelete,\r\n onToggleStatus,\r\n isActive = true,\r\n canDelete = true,\r\n renderAs\r\n}) => {\r\n const items = [];\r\n\r\n // Edit action\r\n if (onEdit) {\r\n const editItem = {\r\n icon: Edit,\r\n label: \"Editar\",\r\n onClick: onEdit\r\n };\r\n items.push(editItem);\r\n }\r\n\r\n // Toggle status action\r\n if (onToggleStatus) {\r\n const toggleItem = {\r\n icon: isActive ? PowerOff : Power,\r\n label: isActive ? \"Inativar\" : \"Ativar\",\r\n onClick: onToggleStatus\r\n };\r\n items.push(toggleItem);\r\n }\r\n\r\n // Delete action\r\n if (canDelete && onDelete) {\r\n const deleteItem = {\r\n icon: Trash2,\r\n label: \"Remover\",\r\n onClick: onDelete,\r\n destructive: true\r\n };\r\n items.push(deleteItem);\r\n }\r\n\r\n if (renderAs === 'dropdown') {\r\n return (\r\n <>\r\n {items.map((item, index) => (\r\n <DropdownMenuItem \r\n key={index}\r\n onClick={item.onClick}\r\n className={item.destructive ? \"text-destructive\" : \"\"}\r\n >\r\n <item.icon className=\"mr-2 h-4 w-4\" />\r\n {item.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </>\r\n );\r\n }\r\n\r\n // Context menu rendering\r\n return (\r\n <>\r\n {items.map((item, index) => (\r\n <Button\r\n key={index}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={item.onClick}\r\n className={`w-full justify-start h-auto py-2 px-3 text-sm font-normal ${\r\n item.destructive ? 'text-destructive hover:text-destructive' : ''\r\n }`}\r\n >\r\n <item.icon className=\"h-4 w-4 mr-2\" />\r\n {item.label}\r\n </Button>\r\n ))}\r\n </>\r\n );\r\n};","import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from \"../../components/ui/dropdown-menu\";\r\nimport { Button } from \"../../components/ui/button\";\r\nimport { EllipsisVertical } from \"lucide-react\";\r\nimport { ActionMenuItems } from \"./ActionMenuItems\";\r\n\r\ninterface TableRowActionsProps {\r\n onEdit?: () => void;\r\n onDelete?: () => void;\r\n canDelete?: boolean;\r\n onToggleStatus?: () => void;\r\n isActive?: boolean;\r\n}\r\n\r\nexport const TableRowActions: React.FC<TableRowActionsProps> = ({\r\n onEdit,\r\n onDelete,\r\n canDelete = true,\r\n onToggleStatus,\r\n isActive = true\r\n}) => {\r\n const handleEdit = (e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n onEdit?.();\r\n };\r\n\r\n const handleDelete = (e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n onDelete?.();\r\n };\r\n\r\n const handleToggleStatus = (e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n onToggleStatus?.();\r\n };\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"default\" size=\"sm\" className=\"h-7 px-2 text-xs bg-primary text-primary-foreground hover:bg-primary/90\">\r\n <EllipsisVertical size={12} />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <ActionMenuItems\r\n onEdit={handleEdit}\r\n onDelete={handleDelete}\r\n onToggleStatus={handleToggleStatus}\r\n isActive={isActive}\r\n canDelete={canDelete}\r\n renderAs=\"dropdown\"\r\n />\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n};","import React, { useState, useEffect } from 'react';\r\nimport { Card, CardContent } from \"../../components/ui/card\";\r\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../../components/ui/table';\r\nimport { TableSkeleton, CardSkeleton } from \"../../components/ui/skeleton-variants\";\r\nimport { EmptyState } from \"../../components/ui/empty-state\";\r\nimport { ArrowUpDown, ArrowUp, ArrowDown } from \"lucide-react\";\r\nimport type { CrudColumn, CrudManager, BaseEntity } from '../../types';\r\nimport { TableRowActions } from './TableRowActions';\r\nimport { ActionMenuItems } from './ActionMenuItems';\r\n\r\ninterface CrudTableProps<T extends BaseEntity> {\r\n manager: CrudManager<T>;\r\n columns: CrudColumn<T>[];\r\n onEdit?: (item: T) => void;\r\n onView?: (item: T) => void;\r\n onToggleStatus?: (item: T) => void;\r\n onDelete?: (item: T) => void;\r\n renderActions?: (item: T) => React.ReactNode;\r\n}\r\n\r\nexport const CrudTable = <T extends BaseEntity>({\r\n manager,\r\n columns,\r\n onEdit,\r\n onView,\r\n onToggleStatus,\r\n onDelete,\r\n renderActions,\r\n}: CrudTableProps<T>) => {\r\n const [isMobile, setIsMobile] = useState(false);\r\n const [contextMenu, setContextMenu] = useState<{\r\n x: number;\r\n y: number;\r\n item: T;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setIsMobile(window.innerWidth < 768);\r\n checkMobile();\r\n window.addEventListener('resize', checkMobile);\r\n return () => window.removeEventListener('resize', checkMobile);\r\n }, []);\r\n\r\n // Close context menu when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = () => setContextMenu(null);\r\n if (contextMenu) {\r\n document.addEventListener('click', handleClickOutside);\r\n return () => document.removeEventListener('click', handleClickOutside);\r\n }\r\n }, [contextMenu]);\r\n\r\n const getSortIcon = (columnKey: string) => {\r\n if (manager.sortField !== columnKey) {\r\n return <ArrowUpDown size={14} className=\"ml-1 opacity-50\" />;\r\n }\r\n return manager.sortDirection === 'asc' ? <ArrowUp size={14} className=\"ml-1\" /> : <ArrowDown size={14} className=\"ml-1\" />;\r\n };\r\n\r\n // Calculate column widths based on minWidth, weight, and width\r\n const calculateColumnWidths = () => {\r\n const actionColumnWidth = 100; // Fixed width for actions column\r\n const totalColumns = columns.length + 1; // +1 for actions column\r\n \r\n // Calculate total minWidth and total weight\r\n let totalMinWidth = 0;\r\n let totalWeight = 0;\r\n const columnConfigs = columns.map(column => {\r\n if (column.width) {\r\n // Fixed width column\r\n totalMinWidth += column.width;\r\n return { ...column, calculatedWidth: column.width, isFixed: true };\r\n } else {\r\n const minWidth = column.minWidth || 120; // Default minimum\r\n const weight = column.weight || 1; // Default weight\r\n totalMinWidth += minWidth;\r\n totalWeight += weight;\r\n return { ...column, calculatedWidth: minWidth, weight, isFixed: false };\r\n }\r\n });\r\n \r\n totalMinWidth += actionColumnWidth; // Add actions column to total\r\n \r\n // Return column configs with calculated styles\r\n return columnConfigs.map(config => {\r\n if (config.isFixed) {\r\n return { \r\n ...config, \r\n style: { width: `${config.calculatedWidth}px` } \r\n };\r\n } else {\r\n // For flexible columns, use minWidth and flex-grow\r\n return { \r\n ...config, \r\n style: { \r\n minWidth: `${config.calculatedWidth}px`,\r\n width: `${config.calculatedWidth}px` // Fallback for table-layout: fixed\r\n } \r\n };\r\n }\r\n });\r\n };\r\n\r\n const columnWidths = calculateColumnWidths();\r\n\r\n if (isMobile) {\r\n if (manager.isLoading) {\r\n return <CardSkeleton count={3} />\r\n }\r\n \r\n if (manager.entities.length === 0) {\r\n return (\r\n <EmptyState\r\n title=\"Nenhum item encontrado\"\r\n description=\"Não há dados para exibir no momento.\"\r\n variant=\"search\"\r\n />\r\n )\r\n }\r\n \r\n return (\r\n <div className=\"space-y-4\">\r\n {manager.entities.map(item => <Card \r\n key={item.id} \r\n className=\"overflow-hidden cursor-pointer hover:bg-muted/50\" \r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEdit?.(item);\r\n }}\r\n onContextMenu={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setContextMenu({\r\n x: e.clientX,\r\n y: e.clientY,\r\n item\r\n });\r\n }}\r\n >\r\n <CardContent className=\"p-4\">\r\n {columns.map(column => <div key={column.key} className=\"flex justify-between items-start mb-2 last:mb-0\">\r\n <span className=\"text-sm font-medium text-muted-foreground min-w-0 mr-2\">\r\n {column.header}:\r\n </span>\r\n <div className=\"text-sm text-foreground text-right min-w-0 flex-1\">\r\n {column.render ? column.render(item) : (item as any)[column.key]}\r\n </div>\r\n </div>)}\r\n\r\n {(onEdit || onView || renderActions) && <div className=\"mt-3 pt-3 border-t flex justify-end\" onClick={(e) => e.stopPropagation()}>\r\n {renderActions ? renderActions(item) : (\r\n <TableRowActions \r\n onEdit={onEdit ? () => {\r\n onEdit(item);\r\n } : undefined} \r\n onDelete={onDelete ? () => onDelete(item) : undefined} \r\n onToggleStatus={onToggleStatus ? () => onToggleStatus(item) : undefined}\r\n isActive={(item as any).is_actived}\r\n />\r\n )}\r\n </div>}\r\n </CardContent>\r\n </Card>)}\r\n\r\n {/* Unified Context Menu */}\r\n {contextMenu && (\r\n <div \r\n className=\"fixed bg-background border border-border rounded-md shadow-lg py-1 z-50 min-w-[120px]\"\r\n style={{ left: contextMenu.x, top: contextMenu.y }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <ActionMenuItems\r\n onEdit={onEdit ? () => {\r\n onEdit(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onDelete={onDelete ? () => {\r\n onDelete(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onToggleStatus={onToggleStatus ? () => {\r\n onToggleStatus(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n isActive={(contextMenu.item as any).is_actived}\r\n canDelete={!!onDelete}\r\n renderAs=\"context\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-col h-full\">\r\n {manager.isLoading ? (\r\n <TableSkeleton rows={5} columns={columns.length} />\r\n ) : manager.entities.length === 0 ? (\r\n <EmptyState\r\n title=\"Nenhum item encontrado\"\r\n description=\"Não há dados para exibir no momento.\"\r\n variant=\"search\"\r\n />\r\n ) : (\r\n <div className=\"flex flex-col h-full overflow-hidden\">\r\n <div className=\"flex-1 overflow-auto\">\r\n <Table className=\"table-fixed\">\r\n <colgroup>\r\n {columnWidths.map((config, index) => (\r\n <col key={index} style={config.style} />\r\n ))}\r\n <col style={{ width: '100px' }} />\r\n </colgroup>\r\n <TableHeader>\r\n <TableRow>\r\n {columns.map(column => (\r\n <TableHead\r\n key={column.key}\r\n className={`${column.className || ''} ${column.sortable ? 'cursor-pointer hover:bg-muted/50' : ''}`}\r\n onClick={column.sortable ? () => manager.handleSort(column.key) : undefined}\r\n >\r\n <div className={`flex items-center ${column.className?.includes('text-center') ? 'justify-center' : ''}`}>\r\n {column.header}\r\n {column.sortable && getSortIcon(column.key)}\r\n </div>\r\n </TableHead>\r\n ))}\r\n <TableHead className=\"w-[100px] text-center\">Ações</TableHead>\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {manager.entities.map(item => (\r\n <TableRow \r\n key={item.id} \r\n className=\"cursor-pointer hover:bg-muted/50\" \r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEdit?.(item);\r\n }}\r\n onContextMenu={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setContextMenu({\r\n x: e.clientX,\r\n y: e.clientY,\r\n item\r\n });\r\n }}\r\n >\r\n {columns.map(column => (\r\n <TableCell key={column.key} className={column.className}>\r\n {column.render ? column.render(item) : (item as any)[column.key]}\r\n </TableCell>\r\n ))}\r\n <TableCell className=\"text-center\">\r\n {renderActions ? renderActions(item) : (\r\n <TableRowActions \r\n onEdit={onEdit ? () => onEdit(item) : undefined} \r\n onDelete={onDelete ? () => onDelete(item) : undefined}\r\n onToggleStatus={onToggleStatus ? () => onToggleStatus(item) : undefined}\r\n isActive={(item as any).is_actived}\r\n />\r\n )}\r\n </TableCell>\r\n </TableRow>))}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Unified Context Menu */}\r\n {contextMenu && (\r\n <div \r\n className=\"fixed bg-background border border-border rounded-md shadow-lg py-1 z-50 min-w-[120px]\"\r\n style={{ left: contextMenu.x, top: contextMenu.y }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <ActionMenuItems\r\n onEdit={onEdit ? () => {\r\n onEdit(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onDelete={onDelete ? () => {\r\n onDelete(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onToggleStatus={onToggleStatus ? () => {\r\n onToggleStatus(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n isActive={(contextMenu.item as any).is_actived}\r\n canDelete={!!onDelete}\r\n renderAs=\"context\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CrudTable;","import BaseForm from \"./BaseForm\";\r\nimport type { FormSection, CrudEntity } from \"../../types\";\r\n\r\ninterface CrudFormProps<T extends CrudEntity> {\r\n open: boolean;\r\n title: string;\r\n sections: FormSection[];\r\n initialData?: Partial<T>;\r\n onSubmit: (data: T) => void;\r\n onCancel: () => void;\r\n isLoading?: boolean;\r\n submitButtonText?: string;\r\n}\r\n\r\nexport function CrudForm<T extends CrudEntity>({\r\n open,\r\n title,\r\n sections,\r\n initialData,\r\n onSubmit,\r\n onCancel,\r\n isLoading = false,\r\n submitButtonText = \"Salvar\"\r\n}: CrudFormProps<T>) {\r\n return (\r\n <BaseForm\r\n open={open}\r\n title={title}\r\n sections={sections}\r\n initialData={initialData}\r\n onSubmit={onSubmit}\r\n onCancel={onCancel}\r\n isLoading={isLoading}\r\n submitButtonText={submitButtonText}\r\n />\r\n );\r\n}","import React from 'react';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\nimport { Button } from '../../components/ui/button';\r\nimport { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from 'lucide-react';\r\n\r\ninterface TableFooterProps {\r\n manager: {\r\n pagination?: {\r\n totalItems?: number;\r\n totalPages?: number;\r\n };\r\n currentPage?: number;\r\n itemsPerPage?: number;\r\n handlePageChange?: (page: number) => void;\r\n handleItemsPerPageChange?: (itemsPerPage: number) => void;\r\n };\r\n}\r\n\r\nexport const TableFooter = ({ manager }: TableFooterProps) => {\r\n const {\r\n pagination = { totalItems: 0, totalPages: 1 },\r\n currentPage = 1,\r\n itemsPerPage = 10,\r\n handlePageChange = () => {},\r\n handleItemsPerPageChange = () => {}\r\n } = manager;\r\n\r\n const { totalItems = 0, totalPages = 1 } = pagination;\r\n\r\n const startItem = totalItems > 0 ? ((currentPage - 1) * itemsPerPage) + 1 : 0;\r\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\r\n\r\n const handleFirstPage = () => handlePageChange(1);\r\n const handlePreviousPage = () => handlePageChange(Math.max(1, currentPage - 1));\r\n const handleNextPage = () => handlePageChange(Math.min(totalPages, currentPage + 1));\r\n const handleLastPage = () => handlePageChange(totalPages);\r\n\r\n return (\r\n <div className=\"px-4 h-12 flex items-center justify-between text-sm text-muted-foreground bg-muted/50 border-t border-border flex-shrink-0 mt-auto\">\r\n {/* Esquerda: Seletor de Itens por Página */}\r\n <div className=\"flex items-center space-x-3\">\r\n <span>Itens por página</span>\r\n <Select\r\n value={itemsPerPage.toString()}\r\n onValueChange={(value) => handleItemsPerPageChange(Number(value))}\r\n >\r\n <SelectTrigger className=\"w-20 h-8 border-border\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"10\">10</SelectItem>\r\n <SelectItem value=\"25\">25</SelectItem>\r\n <SelectItem value=\"50\">50</SelectItem>\r\n <SelectItem value=\"100\">100</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n \r\n {/* Centro: Informações de Paginação */}\r\n <div className=\"flex-1 flex justify-center\">\r\n <span>\r\n {totalItems > 0 \r\n ? `${startItem}-${endItem} de ${totalItems} itens (página ${currentPage} de ${totalPages})`\r\n : '0 itens'\r\n }\r\n </span>\r\n </div>\r\n \r\n {/* Direita: Controles de Navegação */}\r\n <div className=\"flex items-center space-x-1\">\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleFirstPage} disabled={currentPage === 1}>\r\n <ChevronsLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handlePreviousPage} disabled={currentPage === 1}>\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleNextPage} disabled={currentPage === totalPages}>\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleLastPage} disabled={currentPage === totalPages}>\r\n <ChevronsRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default TableFooter;","import { useState, useEffect } from \"react\";\r\nimport { Button } from \"../../components/ui/button\";\r\nimport { Plus, X } from \"lucide-react\";\r\nimport DeleteConfirmationDialog from \"../../components/ui/delete-dialog\";\r\nimport { CrudTable } from \"./CrudTable\";\r\nimport { CrudForm } from \"./CrudForm\";\r\nimport { TableFooter } from \"./TableFooter\";\r\nimport type { CrudEntity, CrudManager, CrudPageConfig, FormSection } from \"../../types\";\r\n\r\ninterface CrudPageProps<T extends CrudEntity> {\r\n manager: CrudManager<T>;\r\n config: CrudPageConfig<T>;\r\n formSections: FormSection[];\r\n onSave: (data: any) => void;\r\n FormComponent?: React.ComponentType<any>;\r\n TableComponent?: React.ComponentType<any>;\r\n onToggleStatus?: (item: T) => void;\r\n}\r\n\r\nexport function CrudPage<T extends CrudEntity>({\r\n manager,\r\n config,\r\n formSections,\r\n onSave,\r\n FormComponent,\r\n TableComponent,\r\n onToggleStatus\r\n}: CrudPageProps<T>) {\r\n const [isFormOpen, setIsFormOpen] = useState(false);\r\n const [editingEntity, setEditingEntity] = useState<T | null>(null);\r\n const [deleteConfirmation, setDeleteConfirmation] = useState<{\r\n isOpen: boolean;\r\n entityId: string | null;\r\n entityName: string;\r\n }>({\r\n isOpen: false,\r\n entityId: null,\r\n entityName: ''\r\n });\r\n\r\n const handleNew = () => {\r\n setEditingEntity(null);\r\n setIsFormOpen(true);\r\n };\r\n\r\n const handleEdit = (entity: T) => {\r\n setEditingEntity(entity);\r\n setIsFormOpen(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n setIsFormOpen(false);\r\n setEditingEntity(null);\r\n };\r\n\r\n const handleSaveWithClose = (data: any) => {\r\n onSave(data);\r\n setIsFormOpen(false);\r\n setEditingEntity(null);\r\n };\r\n\r\n const handleDeleteClick = (entity: T) => {\r\n setDeleteConfirmation({\r\n isOpen: true,\r\n entityId: entity.id,\r\n entityName: (entity as any).title || (entity as any).name || 'Item'\r\n });\r\n };\r\n\r\n const handleConfirmDelete = () => {\r\n if (deleteConfirmation.entityId) {\r\n manager.deleteEntity(deleteConfirmation.entityId);\r\n setDeleteConfirmation({ isOpen: false, entityId: null, entityName: '' });\r\n }\r\n };\r\n\r\n const handleCancelDelete = () => {\r\n setDeleteConfirmation({ isOpen: false, entityId: null, entityName: '' });\r\n };\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col h-full\">\r\n {/* Action Bar - Fixed */}\r\n <div className=\"flex-shrink-0 flex justify-between items-center px-4 py-1.5 bg-muted/50 border-b\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button onClick={handleNew} className=\"flex items-center gap-2\">\r\n <Plus size={16} />\r\n Novo\r\n </Button>\r\n \r\n {/* Inline Filters */}\r\n </div>\r\n </div>\r\n\r\n {/* Table/Cards - Scrollable */}\r\n <div className=\"flex-1 flex flex-col overflow-hidden\">\r\n {TableComponent ? (\r\n <TableComponent\r\n manager={manager}\r\n onEdit={handleEdit}\r\n onDelete={handleDeleteClick}\r\n onToggleStatus={onToggleStatus}\r\n />\r\n ) : (\r\n <CrudTable\r\n manager={manager}\r\n columns={config.columns}\r\n onEdit={handleEdit}\r\n onDelete={handleDeleteClick}\r\n onToggleStatus={onToggleStatus}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Pagination Footer - Fixed */}\r\n <div className=\"flex-shrink-0 border-t bg-background\">\r\n <TableFooter manager={manager} />\r\n </div>\r\n\r\n {/* Form */}\r\n {FormComponent ? (\r\n <FormComponent\r\n open={isFormOpen}\r\n onCancel={handleCancel}\r\n onSubmit={handleSaveWithClose}\r\n editingEntity={editingEntity}\r\n isLoading={manager.isLoading}\r\n />\r\n ) : (\r\n <CrudForm\r\n open={isFormOpen}\r\n title={editingEntity ? `Editar ${config.entityName}` : `Novo ${config.entityName}`}\r\n sections={formSections}\r\n initialData={editingEntity || undefined}\r\n onSubmit={handleSaveWithClose}\r\n onCancel={handleCancel}\r\n isLoading={manager.isLoading}\r\n submitButtonText={editingEntity ? \"Atualizar\" : \"Criar\"}\r\n />\r\n )}\r\n\r\n {/* Delete Confirmation */}\r\n <DeleteConfirmationDialog\r\n open={deleteConfirmation.isOpen}\r\n onOpenChange={handleCancelDelete}\r\n onConfirm={(item) => handleConfirmDelete()}\r\n item={deleteConfirmation.entityId ? { id: deleteConfirmation.entityId, title: deleteConfirmation.entityName } : undefined}\r\n entityName={config.entityName}\r\n isDeleting={manager.isDeleting}\r\n />\r\n </div>\r\n );\r\n}","// ============= QUALIEX ENRICHMENT SERVICE =============\r\n\r\nimport { qualiexApi } from '../qualiex/services/qualiexApi';\r\nimport { TokenManager } from '../auth/services/TokenManager';\r\nimport { errorService } from './ErrorService';\r\n\r\nexport interface QualiexEnrichmentOptions {\r\n entityName: string;\r\n fallbackResponsibleText?: string;\r\n}\r\n\r\nexport class QualiexEnrichmentService {\r\n private static async extractTokenData() {\r\n const tokenData = TokenManager.extractTokenData();\r\n \r\n if (!tokenData) {\r\n errorService.handleError('[QualiexEnrichment] ❌ Token Supabase não encontrado', false);\r\n return null;\r\n }\r\n\r\n return tokenData;\r\n }\r\n\r\n static async enrichWithResponsibleNames<T extends { id_user?: string | null }>(\r\n entities: T[],\r\n options: QualiexEnrichmentOptions\r\n ): Promise<(T & { responsible_name?: string })[]> {\r\n // Se não há entidades, retornar vazio\r\n if (!entities || entities.length === 0) {\r\n errorService.handleError(`[QualiexEnrichment.${options.entityName}] Nenhuma entidade encontrada`, false);\r\n return entities as (T & { responsible_name?: string })[];\r\n }\r\n\r\n try {\r\n const tokenData = await this.extractTokenData();\r\n \r\n if (!tokenData) {\r\n return entities.map(entity => ({\r\n ...entity,\r\n responsible_name: entity.id_user ? 'Token não encontrado' : null\r\n }));\r\n }\r\n\r\n const { alias, companyId } = tokenData;\r\n\r\n if (!alias || !companyId) {\r\n errorService.handleError(`[QualiexEnrichment.${options.entityName}] DADOS OBRIGATÓRIOS FALTANDO - alias: ${!!alias}, companyId: ${!!companyId}`, false);\r\n return entities.map(entity => ({\r\n ...entity,\r\n responsible_name: entity.id_user ? `Configuração incompleta (alias: ${!!alias}, companyId: ${!!companyId})` : null\r\n }));\r\n }\r\n\r\n // Buscar usuários do Qualiex\r\n const qualiexUsers = await qualiexApi.getUsers(alias);\r\n\r\n // Mapear entidades com nomes dos responsáveis\r\n const entitiesWithResponsibleNames = entities.map(entity => { \r\n if (entity.id_user) {\r\n // Tentar encontrar por userId primeiro, depois por id\r\n const responsibleUser = qualiexUsers.find(user => user.userId === entity.id_user);\r\n \r\n return {\r\n ...entity,\r\n responsible_name: responsibleUser?.userName || `ID não encontrado: ${entity.id_user}`\r\n };\r\n }\r\n return {\r\n ...entity,\r\n responsible_name: null\r\n };\r\n });\r\n \r\n const successCount = entitiesWithResponsibleNames.filter(e => \r\n e.responsible_name && \r\n !e.responsible_name.includes('ID não encontrado') && \r\n !e.responsible_name.includes('Erro:') &&\r\n !e.responsible_name.includes('Token não encontrado') &&\r\n !e.responsible_name.includes('Configuração incompleta')\r\n ).length;\r\n\r\n return entitiesWithResponsibleNames;\r\n\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : `[QualiexEnrichment.${options.entityName}] 💥 ERRO CRÍTICO`);\r\n // Retornar entidades sem nomes dos responsáveis em caso de erro\r\n return entities.map(entity => ({\r\n ...entity,\r\n responsible_name: entity.id_user ? `Erro: ${error.message}` : null\r\n }));\r\n }\r\n }\r\n}","import { getSupabaseClient } from '../supabase/SupabaseSingleton';\r\nimport { QualiexEnrichmentService } from './QualiexEnrichmentService';\r\nimport type { PaginatedResponse, QueryParams } from '../types';\r\nimport { trimTextFields } from '../utils';\r\n\r\n// Using QueryParams from shared types\r\n\r\nexport interface ServiceOptions {\r\n tableName: string;\r\n searchFields?: string[];\r\n schemaName?: string;\r\n entityName?: string; // Para enrichment com Qualiex\r\n}\r\n\r\n// Campos virtuais conhecidos\r\nconst VIRTUAL_FIELDS = ['responsible_name'];\r\n\r\nconst isVirtualField = (field: string): boolean => VIRTUAL_FIELDS.includes(field);\r\n\r\nconst sortData = <T>(data: T[], sortField: string, sortDirection: 'asc' | 'desc'): T[] => {\r\n return [...data].sort((a, b) => {\r\n const aValue = (a as any)[sortField] || '';\r\n const bValue = (b as any)[sortField] || '';\r\n const comparison = aValue.localeCompare(bValue, 'pt-BR', { sensitivity: 'base' });\r\n return sortDirection === 'asc' ? comparison : -comparison;\r\n });\r\n};\r\n\r\nconst paginateData = <T>(data: T[], page: number = 1, limit: number = 25) => {\r\n const startIndex = (page - 1) * limit;\r\n const endIndex = startIndex + limit;\r\n const paginatedData = data.slice(startIndex, endIndex);\r\n \r\n return {\r\n data: paginatedData,\r\n pagination: {\r\n currentPage: page,\r\n totalPages: Math.ceil(data.length / limit),\r\n totalItems: paginatedData.length,\r\n totalCount: data.length,\r\n itemsPerPage: limit,\r\n hasNextPage: endIndex < data.length,\r\n hasPreviousPage: page > 1\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Factory function to create a service with CRUD operations for Supabase tables\r\n * \r\n * IMPORTANT: This service is designed for SOFT DELETE architecture\r\n * - delete() method sets is_removed = true (NO physical DELETE)\r\n * - getAll() automatically filters is_removed = false\r\n * - Works with RLS policies that expect company_id filtering\r\n * \r\n * Expected Table Structure:\r\n * - id: UUID PRIMARY KEY\r\n * - company_id: TEXT NOT NULL (for RLS filtering)\r\n * - is_removed: BOOLEAN DEFAULT false (for soft delete)\r\n * - created_at/updated_at: TIMESTAMP WITH TIME ZONE\r\n * \r\n * Expected RLS Policies:\r\n * - SELECT: company_id filter + is_removed = false\r\n * - INSERT: company_id validation \r\n * - UPDATE: company_id filter\r\n * - DELETE: NOT NEEDED (soft delete used)\r\n * \r\n * @param options Service configuration or table name\r\n * @param searchFields Optional array of fields to search in (deprecated - use options object)\r\n * @param schemaName Optional schema name (deprecated - use options object)\r\n */\r\nexport function createService<T extends { id_user?: string | null } = any, TInsert = any, TUpdate = any>(\r\n options: ServiceOptions | string, // Mantém compatibilidade com API antiga\r\n searchFields?: string[],\r\n schemaName?: string\r\n) {\r\n // Normalizar parâmetros para suportar ambas as APIs\r\n const config: ServiceOptions = typeof options === 'string' \r\n ? { \r\n tableName: options, \r\n searchFields: searchFields || [], \r\n schemaName: schemaName || 'central' \r\n }\r\n : { \r\n searchFields: options.searchFields || [], \r\n schemaName: options.schemaName || 'central',\r\n ...options \r\n };\r\n\r\n const { tableName, searchFields: configSearchFields, schemaName: configSchemaName, entityName } = config;\r\n const createQuery = () => {\r\n // Always get the current authenticated client\r\n const client = getSupabaseClient();\r\n return (client as any).schema(configSchemaName).from(tableName);\r\n };\r\n\r\n const buildSearchQuery = (query: any, search: string) => {\r\n if (search && configSearchFields.length > 0) {\r\n const searchConditions = configSearchFields.map(field => `${field}.ilike.%${search}%`).join(',');\r\n return query.or(searchConditions);\r\n }\r\n return query;\r\n };\r\n\r\n const buildPaginatedQuery = (query: any, page: number, limit: number) => {\r\n const from = (page - 1) * limit;\r\n const to = from + limit - 1;\r\n return query.range(from, to);\r\n };\r\n\r\n const createPaginatedResponse = <TData>(\r\n data: TData[],\r\n count: number | null,\r\n page: number,\r\n limit: number\r\n ): PaginatedResponse<TData> => {\r\n const totalPages = Math.ceil((count || 0) / limit);\r\n \r\n return {\r\n data,\r\n currentPage: page,\r\n totalPages,\r\n totalItems: count || 0,\r\n itemsPerPage: limit,\r\n hasNextPage: page < totalPages,\r\n hasPreviousPage: page > 1,\r\n };\r\n };\r\n\r\n return {\r\n async getAll(params: QueryParams = {}): Promise<PaginatedResponse<T & { responsible_name?: string }>> {\r\n \r\n const {\r\n search = '',\r\n sortField = 'updated_at',\r\n sortDirection = 'desc',\r\n page = 1,\r\n limit = 25,\r\n ...additionalFilters\r\n } = params;\r\n\r\n let query = createQuery().select('*', { count: 'exact' });\r\n\r\n // ✅ Filtrar registros não removidos no nível da aplicação\r\n query = query.eq('is_removed', false);\r\n\r\n // Apply additional filters\r\n Object.entries(additionalFilters).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null && value !== '') {\r\n // Se o valor é um array, usar filter 'in'\r\n if (Array.isArray(value)) {\r\n query = query.in(key, value);\r\n } else if (typeof value === 'object' && value && 'operator' in value && value.operator === 'not_null') {\r\n query = query.not(key, 'is', null);\r\n } else {\r\n query = query.eq(key, value);\r\n }\r\n }\r\n });\r\n\r\n // Apply search filter\r\n query = buildSearchQuery(query, search);\r\n\r\n // Apply sorting\r\n query = query.order(sortField, { ascending: sortDirection === 'asc' });\r\n\r\n // Apply pagination\r\n query = buildPaginatedQuery(query, page, limit);\r\n\r\n const { data, error, count } = await query;\r\n\r\n if (error) {\r\n throw new Error(`Error fetching ${tableName}: ${error.message}`);\r\n }\r\n\r\n let response = createPaginatedResponse<T>(data || [], count, page, limit);\r\n\r\n // Se entityName foi fornecido, aplicar enrichment com Qualiex\r\n if (entityName && response.data.length > 0) {\r\n // Para campos virtuais, buscar dados maiores e processar localmente\r\n if (sortField && isVirtualField(sortField)) {\r\n // Refazer a query sem paginação e ordenação para virtual fields\r\n const largeParams = { ...params, page: 1, limit: 500, sortField: undefined, sortDirection: undefined };\r\n const largeResponse = await this.getAll(largeParams);\r\n \r\n if (!largeResponse?.data?.length) {\r\n return largeResponse as PaginatedResponse<T & { responsible_name?: string }>;\r\n }\r\n\r\n const enrichedData = await QualiexEnrichmentService.enrichWithResponsibleNames(\r\n largeResponse.data,\r\n { entityName }\r\n );\r\n\r\n const sortedData = sortData(enrichedData, sortField, sortDirection);\r\n const paginatedResult = paginateData(sortedData, page, limit);\r\n\r\n return {\r\n data: paginatedResult.data,\r\n currentPage: paginatedResult.pagination.currentPage,\r\n totalPages: paginatedResult.pagination.totalPages,\r\n totalItems: paginatedResult.pagination.totalItems,\r\n itemsPerPage: paginatedResult.pagination.itemsPerPage,\r\n hasNextPage: paginatedResult.pagination.hasNextPage,\r\n hasPreviousPage: paginatedResult.pagination.hasPreviousPage,\r\n } as PaginatedResponse<T & { responsible_name?: string }>;\r\n }\r\n\r\n // Para campos físicos, aplicar enrichment nos dados já paginados\r\n const enrichedData = await QualiexEnrichmentService.enrichWithResponsibleNames(\r\n response.data,\r\n { entityName }\r\n );\r\n\r\n response = { ...response, data: enrichedData as (T & { responsible_name?: string })[] };\r\n }\r\n\r\n return response as PaginatedResponse<T & { responsible_name?: string }>;\r\n },\r\n\r\n async getById(id: string): Promise<T | null> {\r\n const { data, error } = await createQuery()\r\n .select('*')\r\n .eq('id', id)\r\n .maybeSingle();\r\n\r\n if (error) {\r\n throw new Error(`Error fetching ${tableName}: ${error.message}`);\r\n }\r\n\r\n return data;\r\n },\r\n\r\n async create(payload: TInsert): Promise<T> {\r\n const trimmedPayload = trimTextFields(payload);\r\n const cleanPayload = Object.entries(trimmedPayload as any).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n acc[key] = value;\r\n }\r\n return acc;\r\n }, {} as any);\r\n\r\n const { data, error } = await createQuery()\r\n .insert(cleanPayload)\r\n .select()\r\n .single();\r\n\r\n if (error) {\r\n throw new Error(`Error creating ${tableName}: ${error.message}`);\r\n }\r\n\r\n if (!data) {\r\n throw new Error(`No data returned from create ${tableName} operation`);\r\n }\r\n\r\n return data;\r\n },\r\n\r\n async update(id: string, payload: TUpdate): Promise<T> {\r\n const trimmedPayload = trimTextFields(payload);\r\n const updateData = {\r\n ...trimmedPayload,\r\n updated_at: new Date().toISOString(),\r\n } as TUpdate;\r\n\r\n const { data, error } = await createQuery()\r\n .update(updateData)\r\n .eq('id', id)\r\n .select()\r\n .single();\r\n\r\n if (error) {\r\n throw new Error(`Error updating ${tableName}: ${error.message}`);\r\n }\r\n\r\n if (!data) {\r\n throw new Error(`No data returned from update ${tableName} operation`);\r\n }\r\n\r\n return data;\r\n },\r\n\r\n /**\r\n * Delete a record by ID using SOFT DELETE\r\n * \r\n * IMPORTANT: This performs a SOFT DELETE by setting is_removed = true\r\n * - No physical DELETE is performed\r\n * - Record remains in database but filtered from queries\r\n * - RLS policies should NOT include DELETE policies\r\n * - Compatible with audit trails and data recovery\r\n */\r\n async delete(id: string): Promise<void> {\r\n const updateData = {\r\n is_removed: true,\r\n updated_at: new Date().toISOString(),\r\n } as unknown as Partial<TUpdate>;\r\n\r\n const { error } = await createQuery()\r\n .update(updateData)\r\n .eq('id', id);\r\n\r\n if (error) {\r\n throw new Error(`Error soft deleting ${tableName}: ${error.message}`);\r\n }\r\n },\r\n };\r\n}","import { ReactNode } from 'react';\r\nimport { SidebarProvider } from '../ui/sidebar';\r\nimport AppHeader from './AppHeader';\r\nimport { AppSidebar } from './AppSidebar';\r\nimport { SidebarConfig } from '../../types/sidebar';\r\nimport { NavigationProvider } from '../../contexts/NavigationContext';\r\n\r\ninterface AppLayoutProps {\r\n children: ReactNode;\r\n sidebar?: ReactNode;\r\n sidebarConfig?: SidebarConfig;\r\n showHeader?: boolean;\r\n}\r\n\r\nexport function AppLayout({ \r\n children, \r\n sidebar, \r\n sidebarConfig,\r\n showHeader = true \r\n}: AppLayoutProps) {\r\n const sidebarComponent = sidebar || <AppSidebar config={sidebarConfig} />;\r\n\r\n return (\r\n <NavigationProvider config={sidebarConfig}>\r\n <SidebarProvider>\r\n <div className=\"min-h-screen flex w-full h-screen overflow-hidden\">\r\n {sidebarComponent}\r\n <main className=\"flex-1 flex flex-col h-full overflow-hidden\">\r\n {showHeader && (\r\n <div className=\"flex-shrink-0\">\r\n <AppHeader />\r\n </div>\r\n )}\r\n <div className=\"flex-1 flex flex-col overflow-hidden\">\r\n {children}\r\n </div>\r\n </main>\r\n </div>\r\n </SidebarProvider>\r\n </NavigationProvider>\r\n );\r\n}","// ============= BASE CRUD PAGE =============\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { CrudPage } from './components/CrudPage';\r\nimport type { CrudPageConfig, CrudEntity, FormSection } from '../types';\r\nimport { useAuth } from '../auth/contexts/AuthContext';\r\n\r\ninterface BaseCrudPageProps<T extends CrudEntity> {\r\n manager: any;\r\n config: CrudPageConfig<T>;\r\n formSections: FormSection[];\r\n onSave: (data: any) => void;\r\n FormComponent?: React.ComponentType<any>;\r\n TableComponent?: React.ComponentType<any>;\r\n onToggleStatus?: (item: T) => void;\r\n}\r\n\r\nexport function BaseCrudPage<T extends CrudEntity>({\r\n manager,\r\n config,\r\n formSections,\r\n onSave,\r\n FormComponent,\r\n TableComponent,\r\n onToggleStatus,\r\n}: BaseCrudPageProps<T>) {\r\n const { setSearchVisible, refreshData } = useAuth();\r\n\r\n // Set up search\r\n useEffect(() => {\r\n setSearchVisible(true);\r\n return () => {\r\n setSearchVisible(false);\r\n };\r\n }, [setSearchVisible]);\r\n\r\n return (\r\n <CrudPage\r\n manager={manager}\r\n config={config}\r\n formSections={formSections}\r\n onSave={onSave}\r\n FormComponent={FormComponent}\r\n TableComponent={TableComponent}\r\n onToggleStatus={onToggleStatus}\r\n />\r\n );\r\n}","import { useEffect, useState } from 'react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card';\r\nimport { Spinner } from '../../components/ui/spinner';\r\nimport { Alert, AlertDescription } from '../../components/ui/alert';\r\nimport { Button } from '../../components/ui/button';\r\nimport { useAuth } from '../contexts/AuthContext';\r\nimport { AlertCircle, RefreshCw } from 'lucide-react';\r\n\r\nexport const CallbackPage = () => {\r\n const { processCallback } = useAuth();\r\n const [error, setError] = useState<string | null>(null);\r\n const [isRetrying, setIsRetrying] = useState(false);\r\n\r\n useEffect(() => {\r\n const handleCallback = async () => {\r\n try {\r\n // Processar callback (toda validação está no AuthService)\r\n const success = await processCallback();\r\n if (success) {\r\n // Limpar URL e redirecionar\r\n window.history.replaceState({}, document.title, '/');\r\n \r\n // Verificar se há página de origem salva\r\n const returnUrl = localStorage.getItem('auth_return_url');\r\n if (returnUrl) {\r\n localStorage.removeItem('auth_return_url');\r\n window.location.href = returnUrl;\r\n } else {\r\n window.location.href = '/';\r\n }\r\n } else {\r\n setError('Falha na autenticação. Tente novamente.');\r\n }\r\n } catch (err: any) {\r\n console.error('❌ [CallbackPage] Erro no processamento:', err);\r\n setError(err?.message || 'Erro durante a autenticação. Tente novamente.');\r\n }\r\n };\r\n\r\n handleCallback();\r\n }, [processCallback]);\r\n\r\n const handleRetry = async () => {\r\n setIsRetrying(true);\r\n setError(null);\r\n \r\n try {\r\n const success = await processCallback();\r\n if (!success) {\r\n setError('Falha na autenticação. Tente novamente.');\r\n }\r\n } catch (err: any) {\r\n setError(err?.message || 'Erro ao tentar novamente.');\r\n } finally {\r\n setIsRetrying(false);\r\n }\r\n };\r\n\r\n const handleGoHome = () => {\r\n window.location.href = '/';\r\n };\r\n\r\n if (error) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold text-destructive flex items-center justify-center gap-2\">\r\n <AlertCircle className=\"h-5 w-5\" />\r\n Erro na Autenticação\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n <Alert variant=\"destructive\">\r\n <AlertDescription>\r\n {error}\r\n </AlertDescription>\r\n </Alert>\r\n \r\n <div className=\"text-sm text-muted-foreground\">\r\n <p>Se o problema persistir, verifique se a URL de callback está configurada corretamente no provedor OAuth.</p>\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <Button \r\n onClick={handleRetry} \r\n disabled={isRetrying}\r\n className=\"flex-1\"\r\n >\r\n {isRetrying ? (\r\n <>\r\n <Spinner size=\"sm\" className=\"mr-2\" />\r\n Tentando...\r\n </>\r\n ) : (\r\n <>\r\n <RefreshCw className=\"h-4 w-4 mr-2\" />\r\n Tentar Novamente\r\n </>\r\n )}\r\n </Button>\r\n <Button \r\n onClick={handleGoHome}\r\n variant=\"outline\"\r\n className=\"flex-1\"\r\n >\r\n Voltar ao Início\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Processando Autenticação\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"flex justify-center mb-4\">\r\n <Spinner size=\"lg\" />\r\n </div>\r\n <p className=\"text-muted-foreground\">\r\n Processando tokens e redirecionando...\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n};","import { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../components/ui/card\";\r\nimport { Badge } from \"../../components/ui/badge\";\r\nimport { Skeleton } from \"../../components/ui/skeleton\";\r\nimport { Grid } from \"../../components/ui/grid\";\r\nimport { DataList } from \"../../components/ui/data-list\";\r\nimport { ExternalLink, Copy } from \"lucide-react\";\r\nimport { format } from \"date-fns\";\r\nimport { ptBR } from \"date-fns/locale\";\r\nimport { toast } from \"sonner\";\r\nimport { Button } from \"../../components/ui/button\";\r\nimport { TableRowActions } from \"./TableRowActions\";\r\nimport type { CrudEntity, CrudManager, CrudPageConfig } from \"../../types\";\r\n\r\ninterface CrudCardsProps<T extends CrudEntity> {\r\n manager: Pick<CrudManager<T>, 'entities' | 'isLoading' | 'deleteEntity'>;\r\n config: Pick<CrudPageConfig<T>, 'cardFields'>;\r\n onEdit: (item: T) => void;\r\n onDelete?: (item: T) => void;\r\n}\r\n\r\nexport function CrudCards<T extends CrudEntity>({\r\n manager,\r\n config,\r\n onEdit,\r\n onDelete\r\n}: CrudCardsProps<T>) {\r\n const handleExternalLink = (url: string) => {\r\n try {\r\n const newWindow = window.open(url, '_blank');\r\n if (!newWindow || newWindow.closed || typeof newWindow.closed == 'undefined') {\r\n navigator.clipboard.writeText(url);\r\n toast.info(\"Link copiado para a área de transferência\");\r\n }\r\n } catch (error) {\r\n window.location.href = url;\r\n }\r\n };\r\n\r\n if (manager.isLoading) {\r\n return (\r\n <Grid>\r\n {Array.from({ length: 3 }).map((_, index) => (\r\n <Card key={index}>\r\n <CardHeader>\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n <Skeleton className=\"h-3 w-1/2\" />\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-3 w-full\" />\r\n <Skeleton className=\"h-3 w-2/3\" />\r\n </div>\r\n </CardContent>\r\n </Card>\r\n ))}\r\n </Grid>\r\n );\r\n }\r\n\r\n return (\r\n <DataList.Root>\r\n {manager.entities.map((entity) => (\r\n <DataList.Item key={entity.id} onClick={() => onEdit(entity)}>\r\n <CardHeader className=\"pb-3\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex-1 min-w-0\">\r\n <CardTitle className=\"text-base leading-6 truncate\">\r\n {(entity as any).title || (entity as any).name || 'Sem título'}\r\n </CardTitle>\r\n <CardDescription className=\"text-sm\">\r\n {format(new Date(entity.created_at), \"dd/MM/yyyy HH:mm\", { locale: ptBR })}\r\n </CardDescription>\r\n </div>\r\n <div className=\"flex items-center gap-2 ml-2\">\r\n {(entity as any).link && (\r\n <Button\r\n variant=\"external-link\"\r\n size=\"icon-xs\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleExternalLink((entity as any).link);\r\n }}\r\n title=\"Abrir link externo\"\r\n >\r\n <ExternalLink className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n <div onClick={(e) => e.stopPropagation()}>\r\n <TableRowActions\r\n onEdit={() => onEdit(entity)}\r\n onDelete={onDelete ? () => onDelete(entity) : undefined}\r\n canDelete={!!onDelete}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </CardHeader>\r\n \r\n <CardContent className=\"pt-0\">\r\n <div className=\"space-y-2\">\r\n {config.cardFields?.map((field) => {\r\n const value = entity[field.key];\r\n if (!value) return null;\r\n \r\n return (\r\n <DataList.Field\r\n key={String(field.key)}\r\n label={field.label}\r\n value={field.render ? field.render(value, entity) : String(value)}\r\n />\r\n );\r\n })}\r\n </div>\r\n </CardContent>\r\n </DataList.Item>\r\n ))}\r\n </DataList.Root>\r\n );\r\n}","import { Button } from \"../../components/ui/button\";\r\nimport { Input } from \"../../components/ui/input\";\r\nimport { Stack } from \"../../components/ui/stack\";\r\nimport { X, Search } from \"lucide-react\";\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\nimport type { CrudManager, CrudFilter, CrudEntity } from '../../types';\r\n\r\ninterface FilterBarProps<T extends CrudEntity> {\r\n manager: Pick<CrudManager<T>, 'searchTerm' | 'handleSearch' | 'clearFilters'>;\r\n filters: CrudFilter[];\r\n}\r\n\r\nexport function FilterBar<T extends CrudEntity>({\r\n manager,\r\n filters,\r\n}: FilterBarProps<T>) {\r\n const { isSearchVisible } = useAuth();\r\n const hasActiveFilters = manager.searchTerm;\r\n\r\n return (\r\n <Stack direction=\"column\" gap=\"md\" className=\"mb-6\">\r\n <Stack direction=\"row\" gap=\"md\" wrap className=\"flex-col sm:flex-row\">\r\n {/* Search */}\r\n {filters.some(f => f.type === 'search') && !isSearchVisible && (\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4\" />\r\n <Input\r\n placeholder=\"Buscar...\"\r\n value={manager.searchTerm}\r\n onChange={(e) => manager.handleSearch(e.target.value)}\r\n className=\"pl-10\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Custom Filters */}\r\n {filters\r\n .filter(f => f.type === 'custom' && f.component)\r\n .map((filter, index) => {\r\n const CustomComponent = filter.component!;\r\n return (\r\n <div key={index} className=\"w-full sm:w-auto\">\r\n <CustomComponent {...filter.props} />\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Clear Filters */}\r\n {hasActiveFilters && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={manager.clearFilters}\r\n className=\"whitespace-nowrap\"\r\n >\r\n <X className=\"h-4 w-4 mr-2\" />\r\n Limpar Filtros\r\n </Button>\r\n )}\r\n </Stack>\r\n </Stack>\r\n );\r\n}","// ============= GENERIC ENTITY FORM =============\r\n\r\nimport React from 'react';\r\nimport { CrudForm } from './components/CrudForm';\r\nimport type { FormSection } from '../types';\r\nimport { useAuth } from '../auth/contexts/AuthContext';\r\n\r\ninterface GenericEntityFormProps<T = any> {\r\n open: boolean;\r\n onCancel: () => void;\r\n onSubmit: (data: T) => void;\r\n editingEntity?: any;\r\n isLoading?: boolean;\r\n title: string;\r\n editTitle: string;\r\n sections: FormSection[];\r\n transformData?: (data: any, alias: string) => T;\r\n}\r\n\r\nexport function GenericEntityForm<T = any>({\r\n open,\r\n onCancel,\r\n onSubmit,\r\n editingEntity,\r\n isLoading = false,\r\n title,\r\n editTitle,\r\n sections,\r\n transformData\r\n}: GenericEntityFormProps<T>) {\r\n const { alias } = useAuth();\r\n\r\n const handleSubmit = (data: any) => {\r\n if (transformData) {\r\n const processedData = transformData(data, alias || '');\r\n onSubmit(processedData);\r\n } else {\r\n // Default transformation - add alias and preserve id for editing\r\n const processedData = {\r\n ...data,\r\n alias: alias || ''\r\n };\r\n // Preserve id if editing\r\n if (editingEntity?.id) {\r\n processedData.id = editingEntity.id;\r\n }\r\n onSubmit(processedData);\r\n }\r\n };\r\n\r\n return (\r\n <CrudForm\r\n open={open}\r\n title={editingEntity ? editTitle : title}\r\n sections={sections}\r\n initialData={editingEntity}\r\n onSubmit={handleSubmit}\r\n onCancel={onCancel}\r\n isLoading={isLoading}\r\n submitButtonText={editingEntity ? \"Atualizar\" : \"Salvar\"}\r\n />\r\n );\r\n}","import { cn } from \"../../utils\"\r\nimport { ReactNode } from \"react\"\r\nimport { Spinner } from \"./spinner\"\r\n\r\ninterface LoadingStateProps {\r\n isLoading: boolean\r\n children: ReactNode\r\n className?: string\r\n type?: \"spinner\" | \"skeleton\" | \"overlay\"\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n}\r\n\r\nexport function LoadingState({\r\n isLoading,\r\n children,\r\n className,\r\n type = \"spinner\",\r\n size = \"md\"\r\n}: LoadingStateProps) {\r\n if (!isLoading) {\r\n return <>{children}</>\r\n }\r\n\r\n if (type === \"overlay\") {\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n {children}\r\n <div className=\"absolute inset-0 bg-background/50 backdrop-blur-sm flex items-center justify-center z-10\">\r\n <Spinner size={size} />\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (type === \"skeleton\") {\r\n return (\r\n <div className={cn(\"animate-pulse\", className)}>\r\n <div className=\"bg-muted rounded-md h-full w-full\" />\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className={cn(\"flex items-center justify-center py-8\", className)}>\r\n <Spinner size={size} />\r\n </div>\r\n )\r\n}","import { ReactNode } from \"react\"\r\nimport { useLocation } from \"react-router-dom\"\r\nimport { \r\n Breadcrumb,\r\n BreadcrumbEllipsis,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from \"./breadcrumb\"\r\n\r\ninterface BreadcrumbItem {\r\n label: string\r\n href?: string\r\n isCurrentPage?: boolean\r\n}\r\n\r\ninterface PageBreadcrumbProps {\r\n items: BreadcrumbItem[]\r\n maxItems?: number\r\n className?: string\r\n}\r\n\r\nexport function PageBreadcrumb({ items, maxItems = 3, className }: PageBreadcrumbProps) {\r\n const displayItems = items.length > maxItems \r\n ? [\r\n items[0],\r\n ...items.slice(-(maxItems - 1))\r\n ]\r\n : items\r\n\r\n const hasCollapsed = items.length > maxItems\r\n\r\n return (\r\n <Breadcrumb className={className}>\r\n <BreadcrumbList>\r\n {displayItems.map((item, index) => {\r\n const isLast = index === displayItems.length - 1\r\n const showEllipsis = hasCollapsed && index === 1\r\n\r\n return (\r\n <div key={`${item.label}-${index}`} className=\"flex items-center\">\r\n {showEllipsis && (\r\n <>\r\n <BreadcrumbItem>\r\n <BreadcrumbEllipsis />\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n </>\r\n )}\r\n \r\n <BreadcrumbItem>\r\n {isLast || item.isCurrentPage ? (\r\n <BreadcrumbPage className=\"font-bold text-lg\">{item.label}</BreadcrumbPage>\r\n ) : (\r\n <BreadcrumbLink href={item.href}>\r\n {item.label}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n \r\n {!isLast && <BreadcrumbSeparator />}\r\n </div>\r\n )\r\n })}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n )\r\n}\r\n\r\n// Hook para gerar breadcrumbs automaticamente baseado na rota\r\nexport function useRouteBreadcrumbs() {\r\n const location = useLocation()\r\n \r\n const generateBreadcrumbs = (): BreadcrumbItem[] => {\r\n const pathSegments = location.pathname.split('/').filter(Boolean)\r\n \r\n const breadcrumbs: BreadcrumbItem[] = [\r\n { label: 'Exemplos', href: '/' }\r\n ]\r\n \r\n let currentPath = ''\r\n \r\n pathSegments.forEach((segment, index) => {\r\n currentPath += `/${segment}`\r\n const isLast = index === pathSegments.length - 1\r\n \r\n // Capitalize and replace dashes with spaces\r\n const label = segment\r\n .split('-')\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ')\r\n \r\n breadcrumbs.push({\r\n label,\r\n href: isLast ? undefined : currentPath,\r\n isCurrentPage: isLast\r\n })\r\n })\r\n \r\n return breadcrumbs\r\n }\r\n \r\n return generateBreadcrumbs()\r\n}","import React from 'react';\r\nimport { useAuth } from '../contexts/AuthContext';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card';\r\nimport { isDevEnvironment } from '../../config';\r\nimport { AuthService } from '../services/AuthService';\r\n\r\ninterface ProtectedRouteProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ children }) => {\r\n const { isAuthenticated, isLoading } = useAuth();\r\n\r\n // Loading durante inicialização\r\n if (isLoading) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Carregando...\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4\"></div>\r\n <p className=\"text-muted-foreground\">\r\n Verificando autenticação...\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n // Não autenticado - login automático\r\n if (!isAuthenticated) {\r\n // Verificar se já tem tokens na URL (evitar loop)\r\n const hasTokensInUrl = new URLSearchParams(window.location.search).has('access_token') ||\r\n new URLSearchParams(window.location.hash.substring(1)).has('access_token');\r\n if (hasTokensInUrl) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Processando...\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4\"></div>\r\n <p className=\"text-muted-foreground\">\r\n Processando tokens...\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n \r\n // Login automático baseado no ambiente\r\n React.useEffect(() => {\r\n const performAutoLogin = async () => {\r\n const isDev = isDevEnvironment();\r\n \r\n if (isDev) {\r\n // Em desenvolvimento: fazer login automático\r\n await AuthService.loginDev();\r\n } else {\r\n // Em produção: redirecionar para Qualiex\r\n AuthService.loginProd();\r\n }\r\n };\r\n \r\n performAutoLogin();\r\n }, []);\r\n \r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Iniciando...\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4\"></div>\r\n <p className=\"text-muted-foreground\">\r\n {isDevEnvironment() \r\n ? 'Fazendo login automático...' \r\n : 'Redirecionando para autenticação...'}\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n return <>{children}</>;\r\n};","import { useToast } from \"../../hooks/use-toast\"\r\nimport {\r\n Toast,\r\n ToastClose,\r\n ToastDescription,\r\n ToastProvider,\r\n ToastTitle,\r\n ToastViewport,\r\n} from \"./toast\"\r\n\r\nexport function Toaster() {\r\n const { toasts } = useToast()\r\n\r\n return (\r\n <ToastProvider>\r\n {toasts.map(function ({ id, title, description, action, ...props }) {\r\n return (\r\n <Toast key={id} {...props}>\r\n <div className=\"grid gap-1\">\r\n {title && <ToastTitle>{title}</ToastTitle>}\r\n {description && (\r\n <ToastDescription>{description}</ToastDescription>\r\n )}\r\n </div>\r\n {action}\r\n <ToastClose />\r\n </Toast>\r\n )\r\n })}\r\n <ToastViewport />\r\n </ToastProvider>\r\n )\r\n}\r\n","import { QueryClient } from '@tanstack/react-query';\r\n\r\ninterface QualiexCoreConfig {\r\n supabase: {\r\n url: string;\r\n anonKey: string;\r\n };\r\n theme?: 'light' | 'dark' | 'system';\r\n queryClient?: QueryClient;\r\n}\r\n\r\nexport function setupQualiexCore(config: QualiexCoreConfig) {\r\n // Setup automático do pacote\r\n const queryClient = config.queryClient || new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n retry: 1,\r\n refetchOnWindowFocus: false,\r\n },\r\n },\r\n });\r\n\r\n return {\r\n queryClient,\r\n config\r\n };\r\n}","/**\r\n * Hook genérico para operações CRUD com React Query\r\n */\r\n\r\nimport { useCallback, useMemo } from 'react';\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { useSearchParams } from 'react-router-dom';\r\n\r\nimport { toast } from 'sonner';\r\nimport { CRUD_CONFIG, MESSAGES } from '../../config';\r\n\r\ninterface CrudService<T, TInsert = Partial<T>, TUpdate = Partial<T>> {\r\n getAll: (params: any) => Promise<any>;\r\n create: (data: TInsert) => Promise<T>;\r\n update: (id: string, data: TUpdate) => Promise<T>;\r\n delete: (id: string) => Promise<void>;\r\n}\r\n\r\ninterface CrudConfig<T, TInsert = Partial<T>, TUpdate = Partial<T>> {\r\n queryKey: string;\r\n service: CrudService<T, TInsert, TUpdate>;\r\n entityName: string;\r\n searchFields?: string[];\r\n additionalFilters?: Record<string, any>;\r\n onSuccess?: () => void; // ✅ Callback para fechar modal\r\n}\r\n\r\nexport function useCrud<T extends { id: string }, TInsert = Partial<T>, TUpdate = Partial<T>>({\r\n queryKey,\r\n service,\r\n entityName,\r\n searchFields,\r\n additionalFilters = {},\r\n onSuccess // ✅ Callback para fechar modal\r\n}: CrudConfig<T, TInsert, TUpdate>) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const queryClient = useQueryClient();\r\n \r\n // Extract state from URL params\r\n const searchTerm = searchParams.get('search') || '';\r\n const sortField = searchParams.get('sortField') || CRUD_CONFIG.sorting.defaultField;\r\n const sortDirection = (searchParams.get('sortDirection') as 'asc' | 'desc') || CRUD_CONFIG.sorting.defaultDirection;\r\n const page = parseInt(searchParams.get('page') || '1');\r\n const limit = parseInt(searchParams.get('limit') || String(CRUD_CONFIG.pagination.defaultPageSize));\r\n \r\n const debouncedSearch = searchTerm;\r\n \r\n // Build query params with memoization to prevent excessive re-renders\r\n const queryParams = useMemo(() => ({\r\n search: debouncedSearch,\r\n sortField,\r\n sortDirection,\r\n page,\r\n limit,\r\n ...additionalFilters,\r\n }), [debouncedSearch, sortField, sortDirection, page, limit, additionalFilters]);\r\n\r\n // Memoize query function to prevent unnecessary re-creation\r\n const queryFn = useCallback(() => service.getAll(queryParams), [service, queryParams]);\r\n \r\n // Data query\r\n const query = useQuery({\r\n queryKey: [queryKey, queryParams],\r\n queryFn,\r\n });\r\n\r\n // Mutations\r\n const createMutation = useMutation({\r\n mutationFn: service.create,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [queryKey] });\r\n toast.success(MESSAGES.success.created(entityName));\r\n onSuccess?.(); // ✅ Fechar modal após sucesso\r\n },\r\n onError: (error: any) => {\r\n toast.error(`${MESSAGES.error.create(entityName)}: ${error.message}`);\r\n },\r\n });\r\n\r\n const updateMutation = useMutation({\r\n mutationFn: ({ id, data }: { id: string; data: TUpdate }) => \r\n service.update(id, data),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [queryKey] });\r\n toast.success(MESSAGES.success.updated(entityName));\r\n onSuccess?.(); // ✅ Fechar modal após sucesso\r\n },\r\n onError: (error: any) => {\r\n toast.error(`${MESSAGES.error.update(entityName)}: ${error.message}`);\r\n },\r\n });\r\n\r\n const deleteMutation = useMutation({\r\n mutationFn: service.delete,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [queryKey] });\r\n toast.success(MESSAGES.success.deleted(entityName));\r\n },\r\n onError: (error: any) => {\r\n toast.error(`${MESSAGES.error.delete(entityName)}: ${error.message}`);\r\n },\r\n });\r\n\r\n // Update URL params helper\r\n const updateParams = useCallback((newParams: Record<string, string | number>) => {\r\n const current = Object.fromEntries(searchParams);\r\n const updated = { ...current };\r\n \r\n Object.entries(newParams).forEach(([key, value]) => {\r\n if (value === '' || value === 0) {\r\n delete updated[key];\r\n } else {\r\n updated[key] = String(value);\r\n }\r\n });\r\n \r\n setSearchParams(updated);\r\n }, [searchParams, setSearchParams]);\r\n\r\n // Handlers\r\n const handleSearch = useCallback((search: string) => {\r\n updateParams({ search, page: 1 });\r\n }, [updateParams]);\r\n\r\n const handleSort = useCallback((field: string) => {\r\n const newDirection = sortField === field && sortDirection === 'asc' ? 'desc' : 'asc';\r\n updateParams({ sortField: field, sortDirection: newDirection, page: 1 });\r\n }, [sortField, sortDirection, updateParams]);\r\n\r\n const handlePageChange = useCallback((newPage: number) => {\r\n updateParams({ page: newPage });\r\n }, [updateParams]);\r\n\r\n const handleLimitChange = useCallback((newLimit: number) => {\r\n updateParams({ limit: newLimit, page: 1 });\r\n }, [updateParams]);\r\n\r\n const clearFilters = useCallback(() => {\r\n setSearchParams({});\r\n }, [setSearchParams]);\r\n\r\n return {\r\n // Data\r\n entities: query.data?.data || [],\r\n pagination: {\r\n currentPage: query.data?.currentPage || 1,\r\n totalPages: query.data?.totalPages || 1,\r\n totalItems: query.data?.totalItems || 0,\r\n itemsPerPage: query.data?.itemsPerPage || CRUD_CONFIG.pagination.defaultPageSize,\r\n hasNextPage: query.data?.hasNextPage || false,\r\n hasPreviousPage: query.data?.hasPreviousPage || false,\r\n },\r\n \r\n // Loading states\r\n isLoading: query.isLoading,\r\n isCreating: createMutation.isPending,\r\n isUpdating: updateMutation.isPending,\r\n isDeleting: deleteMutation.isPending,\r\n \r\n // Error\r\n error: query.error,\r\n \r\n // Current state\r\n searchTerm,\r\n sortField,\r\n sortDirection,\r\n currentPage: page,\r\n itemsPerPage: limit,\r\n \r\n // Actions\r\n createEntity: createMutation.mutate,\r\n updateEntity: (id: string, data: TUpdate) => updateMutation.mutate({ id, data }),\r\n deleteEntity: deleteMutation.mutate,\r\n \r\n // Handlers\r\n handleSearch,\r\n handleSort,\r\n handlePageChange,\r\n handleItemsPerPageChange: handleLimitChange,\r\n clearFilters,\r\n refetch: query.refetch,\r\n };\r\n}"],"names":["process","env","NODE_ENV","React","require$$0","REACT_ELEMENT_TYPE","Symbol","for","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","iterator","ReactSharedInternals","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","error","format","_len2","arguments","length","args","Array","_key2","level","ReactDebugCurrentFrame","stack","getStackAddendum","concat","argsWithFormat","map","item","String","unshift","Function","prototype","apply","call","console","printWarning","REACT_MODULE_REFERENCE","getContextName","type","displayName","getComponentNameFromType","tag","name","$$typeof","_context","outerType","innerType","wrapperName","functionName","getWrappedName","render","outerName","lazyComponent","payload","_payload","init","_init","x","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","assign","Object","disabledDepth","disabledLog","__reactDisabledLog","prefix","ReactCurrentDispatcher","describeBuiltInComponentFrame","source","ownerFn","undefined","Error","match","trim","componentFrameCache","reentry","PossiblyWeakMap","WeakMap","Map","describeNativeComponentFrame","fn","construct","control","frame","get","previousDispatcher","previousPrepareStackTrace","prepareStackTrace","current","log","info","warn","group","groupCollapsed","groupEnd","props","configurable","enumerable","value","writable","defineProperties","disableLogs","Fake","defineProperty","set","Reflect","sample","sampleLines","split","controlLines","s","c","_frame","replace","includes","reenableLogs","syntheticFrame","describeUnknownElementTypeFrameInDEV","isReactComponent","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","_owner","_source","setExtraStackFrame","isArrayImpl","isArray","a","testStringCoercion","checkKeyStringCoercion","e","willCoercionThrow","toStringTag","constructor","typeName","specialPropKeyWarningShown","specialPropRefWarningShown","ReactCurrentOwner","RESERVED_PROPS","key","ref","__self","__source","jsxDEV","config","maybeKey","self","propName","getter","getOwnPropertyDescriptor","isReactWarning","hasValidKey","hasValidRef","warnIfStringRefCannotBeAutoConverted","defaultProps","warnAboutAccessingKey","defineKeyPropWarningGetter","warnAboutAccessingRef","defineRefPropWarningGetter","_store","freeze","ReactElement","propTypesMisspellWarningShown","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","isValidElement","object","getDeclarationErrorAddendum","ownerHasKeyUseWarning","validateExplicitKey","parentType","validated","currentComponentErrorInfo","parentName","getCurrentComponentErrorInfo","childOwner","validateChildKeys","node","i","child","iteratorFn","maybeIterable","maybeIterator","getIteratorFn","entries","step","next","done","validatePropTypes","propTypes","typeSpecs","values","location","componentName","has","bind","typeSpecName","error$1","err","ex","message","checkPropTypes","PropTypes","getDefaultProps","isReactClassApproved","didWarnAboutKeySpread","jsxWithValidation","isStaticChildren","validType","getModuleId","isValidElementType","keys","typeString","children","filter","k","beforeExample","join","fragment","validateFragmentProps","jsx","jsxs","reactJsxRuntime_development","Fragment","jsxRuntimeModule","exports","f","l","m","n","p","q","g","b","d","h","reactJsxRuntime_production_min","require$$1","cn","inputs","twMerge","clsx","trimTextFields","data","trimmed","buttonVariants","cva","variants","variant","default","destructive","outline","secondary","ghost","link","size","sm","lg","icon","defaultVariants","Button","forwardRef","className","asChild","Comp","Slot","AlertDialog","AlertDialogPrimitive","Root","AlertDialogTrigger","Trigger","AlertDialogPortal","Portal","AlertDialogOverlay","Overlay","AlertDialogContent","Content","AlertDialogHeader","AlertDialogFooter","AlertDialogTitle","Title","AlertDialogDescription","Description","AlertDialogAction","Action","AlertDialogCancel","Cancel","alertVariants","Alert","role","AlertTitle","AlertDescription","badgeVariants","success","warning","Badge","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbPage","BreadcrumbSeparator","ChevronRight","BreadcrumbEllipsis","MoreHorizontal","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Input","labelVariants","Label","LabelPrimitive","Popover","PopoverPrimitive","PopoverTrigger","PopoverContent","align","sideOffset","PRESET_COLORS","ColorPicker","onChange","label","style","backgroundColor","htmlFor","id","target","color","onClick","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","disabled","onSelect","CommandShortcut","DataList","Item","Field","DeleteConfirmationDialog","open","onOpenChange","onConfirm","entityName","isDeleting","confirmationText","setConfirmationText","useState","useEffect","handleCancel","isConfirmationValid","title","placeholder","Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","Close","DialogOverlay","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuGroup","Group","DropdownMenuPortal","DropdownMenuSub","Sub","DropdownMenuRadioGroup","RadioGroup","DropdownMenuSubTrigger","inset","SubTrigger","DropdownMenuSubContent","SubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","CheckboxItem","ItemIndicator","Check","DropdownMenuRadioItem","RadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","Separator","DropdownMenuShortcut","variantIcons","FileX","search","Search","AlertCircle","EmptyState","description","action","IconComponent","STORAGE_KEYS","TokenManager","setAccessToken","token","localStorage","setItem","getAccessToken","getItem","setIdToken","getIdToken","setSupabaseToken","getSupabaseToken","setOAuthState","state","sessionStorage","getOAuthState","clearOAuthState","removeItem","setOAuthNonce","nonce","getOAuthNonce","clearOAuthNonce","setSelectedAlias","alias","getSelectedAlias","clearSelectedAlias","generateOAuthState","generateOAuthNonce","randomBytes","Uint8Array","crypto","getRandomValues","btoa","fromCharCode","hasAllTokens","clearAll","isTokenExpired","JSON","parse","atob","exp","Date","now","isSupabaseTokenValid","getValidSupabaseToken","extractTokenData","user_alias","companyId","company_id","startsWith","test","coField","parts","count","toastTimeouts","addToRemoveQueue","toastId","timeout","setTimeout","delete","dispatch","reducer","toasts","toast","slice","t","forEach","listeners","memoryState","listener","Number","MAX_SAFE_INTEGER","toString","dismiss","update","useToast","setState","push","index","indexOf","splice","errorService","__publicField","this","handleError","showToast","errors","timestamp","shouldShowToast","lastToastTime","toastCount","getErrors","clearErrors","SUPABASE_URL","VITE_SUPABASE_URL","SUPABASE_PUBLISHABLE_KEY","VITE_SUPABASE_PUBLISHABLE_KEY","_SupabaseSingleton","instanceCount","client","createClientWithToken","headers","apikey","isTokenValid","createClient","auth","persistSession","autoRefreshToken","global","getInstance","instance","getClient","currentToken","Math","floor","SupabaseSingleton","getSupabaseClient","AUTH_CONFIG","oauth","authUrl","VITE_OAUTH_AUTH_URL","clientId","VITE_OAUTH_CLIENT_ID","responseType","scope","CRUD_CONFIG","pagination","defaultPageSize","pageSizeOptions","sorting","defaultField","defaultDirection","SEARCH_CONFIG","debounceDelay","isDevEnvironment","origin","window","DEV","MESSAGES","created","entity","updated","deleted","create","load","AuthService","initialize","isAuthenticated","isLoading","user","companies","storedAccessToken","storedIdToken","extractUserFromIdToken","extractCompaniesFromIdToken","defaultAlias","extractAliasFromAccessToken","storedSelectedAlias","selectedAlias","some","newSupabaseToken","generateSupabaseToken","loginDev","supabase","functions","invoke","body","environment","access_token","id_token","callbackUrl","URL","hash","href","loginProd","redirectUri","searchParams","processCallback","storedAccess","aliasFromAccess","aliasFallback","supa","hashParams","URLSearchParams","substring","getParam","accessToken","idToken","supabaseToken","firstAlias","logout","decodeToken","decoded","bytes","charCodeAt","utf8String","TextDecoder","decode","subNewId","email","identifier","photoDate","AuthContext","createContext","useAuth","context","useContext","FeedbackDialog","setOpen","selectedUnit","find","company","feedbackUrl","VITE_FEEDBACK_APP_URL","module","buildFeedbackUrl","TriggerButton","MessageCircle","src","width","height","loading","Form","FormProvider","FormFieldContext","useFormField","fieldContext","itemContext","FormItemContext","getFieldState","formState","useFormContext","fieldState","formItemId","formDescriptionId","formMessageId","FormItem","useId","Provider","FormLabel","FormControl","FormDescription","FormMessage","colsClasses","gapClasses","xs","md","xl","Grid","cols","gap","ScrollArea","ScrollAreaPrimitive","Viewport","ScrollBar","Corner","orientation","ScrollAreaScrollbar","ScrollAreaThumb","ICONS","Star","Heart","Home","User","Settings","Mail","Phone","Calendar","MapPin","Camera","Image","Music","Video","Book","Bookmark","Filter","Edit","Trash2","Plus","Minus","ChevronDown","ChevronUp","ChevronLeft","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Clock","Bell","Info","HelpCircle","Download","Upload","Share","Copy","Save","FileText","Folder","FolderOpen","Archive","Lock","Unlock","Eye","EyeOff","Shield","Key","Zap","Flame","Sparkles","Award","Trophy","Target","IconPicker","searchTerm","setSearchTerm","filteredIcons","toLowerCase","SelectedIcon","InputOTP","containerClassName","OTPInput","InputOTPGroup","InputOTPSlot","inputOTPContext","OTPInputContext","char","hasFakeCaret","isActive","slots","InputOTPSeparator","Dot","sizeClasses","Spinner","Loader2","Pagination","PaginationContent","PaginationItem","PaginationLink","PaginationPrevious","PaginationNext","PaginationEllipsis","Select","SelectPrimitive","SelectGroup","SelectValue","Value","SelectTrigger","Icon","SelectScrollUpButton","ScrollUpButton","SelectScrollDownButton","ScrollDownButton","SelectContent","position","SelectLabel","SelectItem","ItemText","SelectSeparator","decorative","SeparatorPrimitive","Sheet","SheetPrimitive","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","sheetVariants","side","top","bottom","left","right","SheetContent","SheetHeader","SheetFooter","SheetTitle","SheetDescription","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","SIDEBAR_STORAGE_KEY","SidebarContext","useSidebar","SidebarProvider","defaultOpen","openProp","setOpenProp","isMobile","setIsMobile","checkMobile","innerWidth","addEventListener","removeEventListener","openMobile","setOpenMobile","_open","_setOpen","stored","useCallback","openState","toggleSidebar","handleKeyDown","event","metaKey","ctrlKey","preventDefault","contextValue","useMemo","delayDuration","Sidebar","collapsible","SidebarTrigger","PanelLeft","SidebarRail","tabIndex","SidebarInset","SidebarInput","SidebarHeader","SidebarFooter","SidebarSeparator","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarGroupAction","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","SidebarMenuButton","tooltip","button","hidden","SidebarMenuAction","showOnHover","SidebarMenuBadge","SidebarMenuSkeleton","showIcon","random","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton","Skeleton","TableSkeleton","rows","columns","from","_","j","CardSkeleton","alignClasses","start","center","end","stretch","justifyClasses","between","around","evenly","Stack","direction","justify","wrap","Table","TableHeader","TableBody","TableRow","TableHead","TableCell","TableCaption","Textarea","ToastProvider","ToastPrimitives","ToastViewport","toastVariants","Toast","ToastAction","ToastClose","ToastTitle","ToastDescription","NavigationContext","NavigationProvider","navigation","useNavigation","usePageTitle","useLocation","currentRoute","path","pathname","UserInfo","memo","propSelectedUnit","onUnitChange","showDebug","switchUnit","defaultCompany","authSelectedUnit","availableUnits","currentUnit","handleUnitChange","unit","uniqueSortedUnits","uniqueUnitsMap","uniqueUnits","currentUnitInList","otherUnits","sort","localeCompare","sensitivity","UserContent","Building2","photoUrl","VITE_QUALIEX_COMMON_API_URL","alt","onError","currentTarget","display","nextElement","nextElementSibling","RefreshCw","LogOut","useDebounce","delay","debouncedValue","setDebouncedValue","timeoutRef","useRef","cancel","clearTimeout","AppHeader","actions","pageTitle","isSearchVisible","clearSearch","refreshData","setSearchParams","useSearchParams","inputValue","setInputValue","debouncedSearchValue","cancelDebounce","newParams","handleSearchChange","useActiveModules","options","enabled","useQuery","queryKey","queryFn","async","schema","select","eq","order","DEFAULT_SUPABASE_PROJECT_ID","VITE_SUPABASE_PROJECT_ID","assets","logo","smallLogo","logoSrc","smallLogoSrc","AppSidebar","dropdownOpen","setDropdownOpen","modules","getColorVariant","colors","appName","moduleUrl","url","handleModuleClick","ExternalLink","Link","to","ErrorBoundary","Component","super","hasError","getDerivedStateFromError","componentDidCatch","errorInfo","fallback","AlertTriangle","reload","useBaseForm","fields","initialData","onFormDataChange","formData","setFormData","setErrors","memoizedFields","isValidDate","isNaN","getTime","getDefaultFieldValue","field","defaultValue","calculateComputedValue","currentFormData","computedValue","validateField","required","validation","validator","custom","result","getAllFields","fieldList","allFields","newFormData","fieldValue","date","toISOString","validateForm","newErrors","updateField","fieldName","prevData","newData","updatedData","changedFieldName","dependsOn","updateDependentFields","prevErrors","handleSubmit","onSubmit","stopPropagation","qualiexApi","VITE_QUALIEX_API_URL","makeApiCall","endpoint","params","baseUrl","append","response","fetch","method","Authorization","Accept","ok","status","statusText","json","mapToQualiexUser","userData","userId","ID","userName","userEmail","fetchUsers","filterStatus","fetchUserById","getUsers","tokenData","useQualiexUsers","companyAlias","retry","retryDelay","QualiexUserField","users","onValueChange","QualiexResponsibleSelectField","BaseForm","sections","onCancel","submitButtonText","usersData","activeSection","setActiveSection","flatMap","section","availableSections","condition","validActiveSection","currentSection","firstAvailable","renderField","rawValue","layout","subField","newValue","option","selectedResponsible","iconName","min","readOnly","renderSectionContent","fill","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","component","SectionComponent","formContent","sectionId","handleSectionChange","buildFormatLongFn","defaultWidth","formats","buildLocalizeFn","valuesArray","formattingValues","defaultFormattingWidth","argumentCallback","buildMatchFn","string","matchPattern","matchPatterns","defaultMatchWidth","matchResult","matchedString","parsePatterns","defaultParseWidth","array","predicate","findIndex","pattern","findKey","valueCallback","rest","formatDistanceLocale","lessThanXSeconds","one","other","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","formatLong","full","long","medium","short","time","dateTime","formatRelativeLocale","lastWeek","weekday","getDay","yesterday","today","tomorrow","nextWeek","ptBR","code","formatDistance","tokenValue","addSuffix","comparison","formatRelative","_baseDate","_options","localize","ordinalNumber","dirtyNumber","number","era","narrow","abbreviated","wide","quarter","month","day","dayPeriod","am","pm","midnight","noon","morning","afternoon","evening","night","parsePattern","parseInt","parseResult","any","weekStartsOn","firstWeekContainsDate","ActionMenuItems","onEdit","onDelete","onToggleStatus","canDelete","renderAs","items","editItem","toggleItem","PowerOff","Power","deleteItem","TableRowActions","EllipsisVertical","CrudTable","manager","onView","renderActions","contextMenu","setContextMenu","handleClickOutside","document","columnWidths","totalMinWidth","columnConfigs","column","calculatedWidth","isFixed","minWidth","weight","calculateColumnWidths","entities","onContextMenu","clientX","y","clientY","header","is_actived","sortable","handleSort","columnKey","sortField","ArrowUpDown","sortDirection","CrudForm","TableFooter","totalItems","totalPages","currentPage","itemsPerPage","handlePageChange","handleItemsPerPageChange","startItem","endItem","ChevronsLeft","max","ChevronsRight","CrudPage","formSections","onSave","FormComponent","TableComponent","isFormOpen","setIsFormOpen","editingEntity","setEditingEntity","deleteConfirmation","setDeleteConfirmation","isOpen","entityId","handleEdit","handleSaveWithClose","handleDeleteClick","deleteEntity","QualiexEnrichmentService","enrichWithResponsibleNames","responsible_name","id_user","qualiexUsers","entitiesWithResponsibleNames","responsibleUser","VIRTUAL_FIELDS","sidebar","sidebarConfig","showHeader","sidebarComponent","authState","setAuthState","queryClient","useQueryClient","setIsSearchVisible","refreshTrigger","setRefreshTrigger","updateAuthState","newState","prev","setLoading","resetAuthState","invalidateQueries","clear","setSearchVisible","visible","Promise","resolve","authResult","initializeAuth","setError","isRetrying","setIsRetrying","history","replaceState","returnUrl","handleCallback","handleRetry","handleGoHome","created_at","locale","newWindow","closed","navigator","clipboard","writeText","handleExternalLink","cardFields","filters","hasActiveFilters","handleSearch","CustomComponent","clearFilters","Controller","editTitle","transformData","processedData","maxItems","displayItems","hasCollapsed","isLast","showEllipsis","isCurrentPage","performAutoLogin","crud","list","detail","searchFields","schemaName","tableName","configSearchFields","configSchemaName","createQuery","getAll","page","limit","additionalFilters","query","in","operator","not","searchConditions","or","buildSearchQuery","ascending","range","buildPaginatedQuery","ceil","hasNextPage","hasPreviousPage","createPaginatedResponse","largeParams","largeResponse","sortedData","aValue","bValue","sortData","paginatedResult","startIndex","endIndex","paginatedData","totalCount","paginateData","enrichedData","getById","maybeSingle","trimmedPayload","cleanPayload","reduce","acc","insert","single","updateData","updated_at","is_removed","func","wait","dateString","parseISO","isValid","toLocaleDateString","year","toLocaleTimeString","hour","minute","QueryClient","defaultOptions","queries","refetchOnWindowFocus","service","onSuccess","debouncedSearch","queryParams","createMutation","useMutation","mutationFn","updateMutation","deleteMutation","updateParams","fromEntries","newPage","handleLimitChange","newLimit","isCreating","isPending","isUpdating","createEntity","mutate","updateEntity","refetch","pathSegments","Boolean","breadcrumbs","currentPath","segment","word","charAt","toUpperCase","generateBreadcrumbs"],"mappings":";;;;;;;;;+BAY6B,eAAzBA,QAAQC,IAAIC,UACd,WAGF,IAAIC,EAAQC,EAMRC,EAAqBC,OAAOC,IAAI,iBAChCC,EAAoBF,OAAOC,IAAI,gBAC/BE,EAAsBH,OAAOC,IAAI,kBACjCG,EAAyBJ,OAAOC,IAAI,qBACpCI,EAAsBL,OAAOC,IAAI,kBACjCK,EAAsBN,OAAOC,IAAI,kBACjCM,EAAqBP,OAAOC,IAAI,iBAChCO,EAAyBR,OAAOC,IAAI,qBACpCQ,EAAsBT,OAAOC,IAAI,kBACjCS,EAA2BV,OAAOC,IAAI,uBACtCU,EAAkBX,OAAOC,IAAI,cAC7BW,EAAkBZ,OAAOC,IAAI,cAC7BY,EAAuBb,OAAOC,IAAI,mBAClCa,EAAwBd,OAAOe,SAgBnC,IAAIC,EAAuBnB,EAAMoB,mDAEjC,SAASC,EAAMC,GAGT,IAAK,IAAIC,EAAQC,UAAUC,OAAQC,EAAO,IAAIC,MAAMJ,EAAQ,EAAIA,EAAQ,EAAI,GAAIK,EAAQ,EAAGA,EAAQL,EAAOK,IACxGF,EAAKE,EAAQ,GAAKJ,UAAUI,IAQpC,SAAsBC,EAAOP,EAAQI,GAIjC,IAAII,EAAyBX,EAAqBW,uBAC9CC,EAAQD,EAAuBE,mBAErB,KAAVD,IACFT,GAAU,KACVI,EAAOA,EAAKO,OAAO,CAACF,KAItB,IAAIG,EAAiBR,EAAKS,IAAI,SAAUC,GACtC,OAAOC,OAAOD,EACpB,GAEIF,EAAeI,QAAQ,YAAchB,GAIrCiB,SAASC,UAAUC,MAAMC,KAAKC,QAAQd,GAAQc,QAAST,EAE3D,CA5BMU,CAAa,QAAStB,EAAQI,EAGpC,CA6BA,IAUImB,EAyCJ,SAASC,EAAeC,GACtB,OAAOA,EAAKC,aAAe,SAC7B,CAGA,SAASC,EAAyBF,GAChC,GAAY,MAARA,EAEF,OAAO,KAST,GAL0B,iBAAbA,EAAKG,KACd7B,EAAM,qHAIU,mBAAT0B,EACT,OAAOA,EAAKC,aAAeD,EAAKI,MAAQ,KAG1C,GAAoB,iBAATJ,EACT,OAAOA,EAGT,OAAQA,GACN,KAAKzC,EACH,MAAO,WAET,KAAKD,EACH,MAAO,SAET,KAAKG,EACH,MAAO,WAET,KAAKD,EACH,MAAO,aAET,KAAKK,EACH,MAAO,WAET,KAAKC,EACH,MAAO,eAIX,GAAoB,iBAATkC,EACT,OAAQA,EAAKK,UACX,KAAK1C,EAEH,OAAOoC,EADOC,GACmB,YAEnC,KAAKtC,EAEH,OAAOqC,EADQC,EACgBM,UAAY,YAE7C,KAAK1C,EACH,OArER,SAAwB2C,EAAWC,EAAWC,GAC5C,IAAIR,EAAcM,EAAUN,YAE5B,GAAIA,EACF,OAAOA,EAGT,IAAIS,EAAeF,EAAUP,aAAeO,EAAUJ,MAAQ,GAC9D,MAAwB,KAAjBM,EAAsBD,EAAc,IAAMC,EAAe,IAAMD,CACxE,CA4DeE,CAAeX,EAAMA,EAAKY,OAAQ,cAE3C,KAAK7C,EACH,IAAI8C,EAAYb,EAAKC,aAAe,KAEpC,OAAkB,OAAdY,EACKA,EAGFX,EAAyBF,EAAKA,OAAS,OAEhD,KAAKhC,EAED,IAAI8C,EAAgBd,EAChBe,EAAUD,EAAcE,SACxBC,EAAOH,EAAcI,MAEzB,IACE,OAAOhB,EAAyBe,EAAKF,GACjD,CAAY,MAAOI,GACP,OAAO,IACnB,EAOE,OAAO,IACT,CA5HErB,EAAyB1C,OAAOC,IAAI,0BA8HtC,IAOI+D,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAbAC,EAASC,OAAOD,OAMhBE,EAAgB,EASpB,SAASC,IAAc,CAEvBA,EAAYC,oBAAqB,EA+EjC,IACIC,EADAC,EAAyB7D,EAAqB6D,uBAElD,SAASC,EAA8B9B,EAAM+B,EAAQC,GAEjD,QAAeC,IAAXL,EAEF,IACE,MAAMM,OACd,CAAQ,MAAOnB,GACP,IAAIoB,EAAQpB,EAAEnC,MAAMwD,OAAOD,MAAM,gBACjCP,EAASO,GAASA,EAAM,IAAM,EACtC,CAII,MAAO,KAAOP,EAAS5B,CAE3B,CACA,IACIqC,EADAC,GAAU,EAIRC,EAAqC,mBAAZC,QAAyBA,QAAUC,IAIlE,SAASC,EAA6BC,EAAIC,GAExC,IAAMD,GAAML,EACV,MAAO,GAIP,IAOEO,EAPEC,EAAQT,EAAoBU,IAAIJ,GAEpC,QAAcV,IAAVa,EACF,OAAOA,EAKXR,GAAU,EACV,IAGIU,EAHAC,EAA4Bf,MAAMgB,kBAEtChB,MAAMgB,uBAAoBjB,EAIxBe,EAAqBnB,EAAuBsB,QAG5CtB,EAAuBsB,QAAU,KAjIrC,WAEI,GAAsB,IAAlB1B,EAAqB,CAEvBT,EAAUxB,QAAQ4D,IAClBnC,EAAWzB,QAAQ6D,KACnBnC,EAAW1B,QAAQ8D,KACnBnC,EAAY3B,QAAQtB,MACpBkD,EAAY5B,QAAQ+D,MACpBlC,EAAqB7B,QAAQgE,eAC7BlC,EAAe9B,QAAQiE,SAEvB,IAAIC,EAAQ,CACVC,cAAc,EACdC,YAAY,EACZC,MAAOnC,EACPoC,UAAU,GAGZtC,OAAOuC,iBAAiBvE,QAAS,CAC/B6D,KAAMK,EACNN,IAAKM,EACLJ,KAAMI,EACNxF,MAAOwF,EACPH,MAAOG,EACPF,eAAgBE,EAChBD,SAAUC,GAGlB,CAEIjC,GAEJ,CAiGIuC,GAGF,IAEE,GAAIpB,EAAW,CAEb,IAAIqB,EAAO,WACT,MAAM/B,OACd,EAWM,GARAV,OAAO0C,eAAeD,EAAK5E,UAAW,QAAS,CAC7C8E,IAAK,WAGH,MAAMjC,OAChB,IAG6B,iBAAZkC,SAAwBA,QAAQxB,UAAW,CAGpD,IACEwB,QAAQxB,UAAUqB,EAAM,GAClC,CAAU,MAAOlD,GACP8B,EAAU9B,CACpB,CAEQqD,QAAQxB,UAAUD,EAAI,GAAIsB,EAClC,KAAa,CACL,IACEA,EAAK1E,MACf,CAAU,MAAOwB,GACP8B,EAAU9B,CACpB,CAEQ4B,EAAGpD,KAAK0E,EAAK5E,UACrB,CACA,KAAW,CACL,IACE,MAAM6C,OACd,CAAQ,MAAOnB,GACP8B,EAAU9B,CAClB,CAEM4B,GACN,CACA,CAAI,MAAO0B,GAEP,GAAIA,GAAUxB,GAAmC,iBAAjBwB,EAAOzF,MAAoB,CAQzD,IALA,IAAI0F,EAAcD,EAAOzF,MAAM2F,MAAM,MACjCC,EAAe3B,EAAQjE,MAAM2F,MAAM,MACnCE,EAAIH,EAAYhG,OAAS,EACzBoG,EAAIF,EAAalG,OAAS,EAEvBmG,GAAK,GAAKC,GAAK,GAAKJ,EAAYG,KAAOD,EAAaE,IAOzDA,IAGF,KAAOD,GAAK,GAAKC,GAAK,EAAGD,IAAKC,IAG5B,GAAIJ,EAAYG,KAAOD,EAAaE,GAAI,CAMtC,GAAU,IAAND,GAAiB,IAANC,EACb,GAKE,GAJAD,MACAC,EAGQ,GAAKJ,EAAYG,KAAOD,EAAaE,GAAI,CAE/C,IAAIC,EAAS,KAAOL,EAAYG,GAAGG,QAAQ,WAAY,QAgBvD,OAXIjC,EAAG9C,aAAe8E,EAAOE,SAAS,iBACpCF,EAASA,EAAOC,QAAQ,cAAejC,EAAG9C,cAIxB,mBAAP8C,GACTN,EAAoB8B,IAAIxB,EAAIgC,GAKzBA,CACvB,QACqBF,GAAK,GAAKC,GAAK,GAG1B,KACV,CAEA,CACA,CAAG,QACCpC,GAAU,EAGRT,EAAuBsB,QAAUH,EAlNvC,WAII,GAAsB,MAFtBvB,EAEyB,CAEvB,IAAIiC,EAAQ,CACVC,cAAc,EACdC,YAAY,EACZE,UAAU,GAGZtC,OAAOuC,iBAAiBvE,QAAS,CAC/B4D,IAAK7B,EAAO,CAAA,EAAImC,EAAO,CACrBG,MAAO7C,IAETqC,KAAM9B,EAAO,CAAA,EAAImC,EAAO,CACtBG,MAAO5C,IAETqC,KAAM/B,EAAO,CAAA,EAAImC,EAAO,CACtBG,MAAO3C,IAEThD,MAAOqD,EAAO,CAAA,EAAImC,EAAO,CACvBG,MAAO1C,IAEToC,MAAOhC,EAAO,CAAA,EAAImC,EAAO,CACvBG,MAAOzC,IAEToC,eAAgBjC,EAAO,CAAA,EAAImC,EAAO,CAChCG,MAAOxC,IAEToC,SAAUlC,EAAO,CAAA,EAAImC,EAAO,CAC1BG,MAAOvC,KAIjB,CAEQG,EAAgB,GAClBvD,EAAM,+EAGZ,CAyKM4G,GAGF5C,MAAMgB,kBAAoBD,CAC9B,CAGE,IAAIjD,EAAO2C,EAAKA,EAAG9C,aAAe8C,EAAG3C,KAAO,GACxC+E,EAAiB/E,EAAO8B,EAA8B9B,GAAQ,GAQlE,MALoB,mBAAP2C,GACTN,EAAoB8B,IAAIxB,EAAIoC,GAIzBA,CACT,CAYA,SAASC,EAAqCpF,EAAMmC,EAAQC,GAE1D,GAAY,MAARpC,EACF,MAAO,GAGT,GAAoB,mBAATA,EAEP,OAAO8C,EAA6B9C,MAZpCP,EAY0DO,EAZpCP,aACHA,EAAU4F,mBAFnC,IACM5F,EAgBJ,GAAoB,iBAATO,EACT,OAAOkC,EAA8BlC,GAGvC,OAAQA,GACN,KAAKnC,EACH,OAAOqE,EAA8B,YAEvC,KAAKpE,EACH,OAAOoE,EAA8B,gBAGzC,GAAoB,iBAATlC,EACT,OAAQA,EAAKK,UACX,KAAKzC,EACH,OApCGkF,EAoCmC9C,EAAKY,QApCP,GAsCtC,KAAK7C,EAEH,OAAOqH,EAAqCpF,EAAKA,KAAMmC,EAAQC,GAEjE,KAAKpE,EAED,IAAI8C,EAAgBd,EAChBe,EAAUD,EAAcE,SACxBC,EAAOH,EAAcI,MAEzB,IAEE,OAAOkE,EAAqCnE,EAAKF,GAAUoB,EAAQC,EAC/E,CAAY,MAAOjB,GAAG,EAKpB,MAAO,EACT,CA7NEsB,EAAsB,IAAIE,EA+N5B,IAAI2C,EAAiB1D,OAAOnC,UAAU6F,eAElCC,EAAqB,CAAA,EACrBxG,EAAyBX,EAAqBW,uBAElD,SAASyG,EAA8BC,GAEnC,GAAIA,EAAS,CACX,IAAIC,EAAQD,EAAQE,OAChB3G,EAAQoG,EAAqCK,EAAQzF,KAAMyF,EAAQG,QAASF,EAAQA,EAAM1F,KAAO,MACrGjB,EAAuB8G,mBAAmB7G,EAChD,MACMD,EAAuB8G,mBAAmB,KAGhD,CAmDA,IAAIC,EAAclH,MAAMmH,QAExB,SAASA,EAAQC,GACf,OAAOF,EAAYE,EACrB,CAiCA,SAASC,EAAmBhC,GAwB1B,MAAO,GAAKA,CACd,CACA,SAASiC,EAAuBjC,GAE5B,GAvCJ,SAA2BA,GAEvB,IAEE,OADAgC,EAAmBhC,IACZ,CACb,CAAM,MAAOkC,GACP,OAAO,CACb,CAEA,CA8BQC,CAAkBnC,GAGpB,OAFA3F,EAAM,kHAlDZ,SAAkB2F,GAKd,MAFuC,mBAAX7G,QAAyBA,OAAOiJ,aAC/BpC,EAAM7G,OAAOiJ,cAAgBpC,EAAMqC,YAAYlG,MAAQ,QAGxF,CA2CoImG,CAAStC,IAEhIgC,EAAmBhC,EAGhC,CAEA,IAOIuC,EACAC,EARAC,EAAoBtI,EAAqBsI,kBACzCC,EAAiB,CACnBC,KAAK,EACLC,KAAK,EACLC,QAAQ,EACRC,UAAU,GAyKZ,SAASC,EAAOhH,EAAMiH,EAAQC,EAAU/E,EAAQgF,GAE5C,IAAIC,EAEAtD,EAAQ,CAAA,EACR8C,EAAM,KACNC,EAAM,KA6BV,IAAKO,UAtBY/E,IAAb6E,IAEAhB,EAAuBgB,GAGzBN,EAAM,GAAKM,GAnKjB,SAAqBD,GAEjB,GAAI3B,EAAe3F,KAAKsH,EAAQ,OAAQ,CACtC,IAAII,EAASzF,OAAO0F,yBAAyBL,EAAQ,OAAO9D,IAE5D,GAAIkE,GAAUA,EAAOE,eACnB,OAAO,CAEf,CAGE,YAAsBlF,IAAf4E,EAAOL,GAChB,CA0JQY,CAAYP,KAEZf,EAAuBe,EAAOL,KAGhCA,EAAM,GAAKK,EAAOL,KAzLxB,SAAqBK,GAEjB,GAAI3B,EAAe3F,KAAKsH,EAAQ,OAAQ,CACtC,IAAII,EAASzF,OAAO0F,yBAAyBL,EAAQ,OAAO9D,IAE5D,GAAIkE,GAAUA,EAAOE,eACnB,OAAO,CAEf,CAGE,YAAsBlF,IAAf4E,EAAOJ,GAChB,CAgLQY,CAAYR,KACdJ,EAAMI,EAAOJ,IAjKnB,SAA8CI,GAEhB,iBAAfA,EAAOJ,KAAoBH,EAAkBnD,OAU5D,CAsJMmE,CAAqCT,IAItBA,EACX3B,EAAe3F,KAAKsH,EAAQG,KAAcT,EAAerB,eAAe8B,KAC1EtD,EAAMsD,GAAYH,EAAOG,IAK7B,GAAIpH,GAAQA,EAAK2H,aAAc,CAC7B,IAAIA,EAAe3H,EAAK2H,aAExB,IAAKP,KAAYO,OACStF,IAApByB,EAAMsD,KACRtD,EAAMsD,GAAYO,EAAaP,GAGzC,CAEI,GAAIR,GAAOC,EAAK,CACd,IAAI5G,EAA8B,mBAATD,EAAsBA,EAAKC,aAAeD,EAAKI,MAAQ,UAAYJ,EAExF4G,GA5KV,SAAoC9C,EAAO7D,GAEvC,IAAI2H,EAAwB,WACrBpB,IACHA,GAA6B,EAE7BlI,EAAM,4OAA4P2B,GAE1Q,EAEI2H,EAAsBL,gBAAiB,EACvC3F,OAAO0C,eAAeR,EAAO,MAAO,CAClCX,IAAKyE,EACL7D,cAAc,GAGpB,CA6JQ8D,CAA2B/D,EAAO7D,GAGhC4G,GA9JV,SAAoC/C,EAAO7D,GAEvC,IAAI6H,EAAwB,WACrBrB,IACHA,GAA6B,EAE7BnI,EAAM,4OAA4P2B,GAE1Q,EAEI6H,EAAsBP,gBAAiB,EACvC3F,OAAO0C,eAAeR,EAAO,MAAO,CAClCX,IAAK2E,EACL/D,cAAc,GAGpB,CA+IQgE,CAA2BjE,EAAO7D,EAE1C,CAEI,OA5He,SAAUD,EAAM4G,EAAKC,EAAKM,EAAMhF,EAAQuD,EAAO5B,GAChE,IAAI2B,EAAU,CAEZpF,SAAUlD,EAEV6C,KAAMA,EACN4G,IAAKA,EACLC,IAAKA,EACL/C,MAAOA,EAEP6B,OAAQD,EAQRD,OAAiB,IAiCnB,OA5BE7D,OAAO0C,eAAemB,EAAQuC,OAAQ,YAAa,CACjDjE,cAAc,EACdC,YAAY,EACZE,UAAU,EACVD,OAAO,IAGTrC,OAAO0C,eAAemB,EAAS,QAAS,CACtC1B,cAAc,EACdC,YAAY,EACZE,UAAU,EACVD,MAAOkD,IAITvF,OAAO0C,eAAemB,EAAS,UAAW,CACxC1B,cAAc,EACdC,YAAY,EACZE,UAAU,EACVD,MAAO9B,IAGLP,OAAOqG,SACTrG,OAAOqG,OAAOxC,EAAQ3B,OACtBlC,OAAOqG,OAAOxC,IAIXA,CACT,CAwEWyC,CAAalI,EAAM4G,EAAKC,EAAKM,EAAMhF,EAAQuE,EAAkBnD,QAASO,EAEjF,CAEA,IAeIqE,EAfAC,GAAsBhK,EAAqBsI,kBAC3C2B,GAA2BjK,EAAqBW,uBAEpD,SAASuJ,GAAgC7C,GAErC,GAAIA,EAAS,CACX,IAAIC,EAAQD,EAAQE,OAChB3G,EAAQoG,EAAqCK,EAAQzF,KAAMyF,EAAQG,QAASF,EAAQA,EAAM1F,KAAO,MACrGqI,GAAyBxC,mBAAmB7G,EAClD,MACMqJ,GAAyBxC,mBAAmB,KAGlD,CAgBA,SAAS0C,GAAeC,GAEpB,MAAyB,iBAAXA,GAAkC,OAAXA,GAAmBA,EAAOnI,WAAalD,CAEhF,CAEA,SAASsL,KAEL,GAAIL,GAAoB7E,QAAS,CAC/B,IAAInD,EAAOF,EAAyBkI,GAAoB7E,QAAQvD,MAEhE,GAAII,EACF,MAAO,mCAAqCA,EAAO,IAE3D,CAEI,MAAO,EAEX,CA7BE+H,GAAgC,EAiDlC,IAAIO,GAAwB,CAAA,EA8B5B,SAASC,GAAoBlD,EAASmD,GAElC,GAAKnD,EAAQuC,SAAUvC,EAAQuC,OAAOa,WAA4B,MAAfpD,EAAQmB,IAA3D,CAIAnB,EAAQuC,OAAOa,WAAY,EAC3B,IAAIC,EAnCR,SAAsCF,GAElC,IAAInF,EAAOgF,KAEX,IAAKhF,EAAM,CACT,IAAIsF,EAAmC,iBAAfH,EAA0BA,EAAaA,EAAW3I,aAAe2I,EAAWxI,KAEhG2I,IACFtF,EAAO,8CAAgDsF,EAAa,KAE5E,CAEI,OAAOtF,CAEX,CAqBoCuF,CAA6BJ,GAE7D,IAAIF,GAAsBI,GAA1B,CAIAJ,GAAsBI,IAA6B,EAInD,IAAIG,EAAa,GAEbxD,GAAWA,EAAQE,QAAUF,EAAQE,SAAWyC,GAAoB7E,UAEtE0F,EAAa,+BAAiC/I,EAAyBuF,EAAQE,OAAO3F,MAAQ,KAGhGsI,GAAgC7C,GAEhCnH,EAAM,4HAAkIwK,EAA2BG,GAEnKX,GAAgC,KAjBpC,CAPA,CA0BA,CAYA,SAASY,GAAkBC,EAAMP,GAE7B,GAAoB,iBAATO,EAIX,GAAIpD,EAAQoD,GACV,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAKzK,OAAQ0K,IAAK,CACpC,IAAIC,EAAQF,EAAKC,GAEbb,GAAec,IACjBV,GAAoBU,EAAOT,EAErC,MACW,GAAIL,GAAeY,GAEpBA,EAAKnB,SACPmB,EAAKnB,OAAOa,WAAY,QAErB,GAAIM,EAAM,CACf,IAAIG,EApjCV,SAAuBC,GACrB,GAAsB,OAAlBA,GAAmD,iBAAlBA,EACnC,OAAO,KAGT,IAAIC,EAAgBtL,GAAyBqL,EAAcrL,IAA0BqL,EAN5D,cAQzB,MAA6B,mBAAlBC,EACFA,EAGF,IACT,CAwiCuBC,CAAcN,GAE/B,GAA0B,mBAAfG,GAGLA,IAAeH,EAAKO,QAItB,IAHA,IACIC,EADAxL,EAAWmL,EAAW3J,KAAKwJ,KAGtBQ,EAAOxL,EAASyL,QAAQC,MAC3BtB,GAAeoB,EAAK1F,QACtB0E,GAAoBgB,EAAK1F,MAAO2E,EAK9C,CAEA,CASA,SAASkB,GAAkBrE,GAEvB,IAMIsE,EANA/J,EAAOyF,EAAQzF,KAEnB,GAAIA,SAAuD,iBAATA,EAAlD,CAMA,GAAoB,mBAATA,EACT+J,EAAY/J,EAAK+J,cACZ,IAAoB,iBAAT/J,GAAsBA,EAAKK,WAAazC,GAE1DoC,EAAKK,WAAatC,EAGhB,OAFAgM,EAAY/J,EAAK+J,SAGvB,CAEI,GAAIA,EAAW,CAEb,IAAI3J,EAAOF,EAAyBF,IA5jB1C,SAAwBgK,EAAWC,EAAQC,EAAUC,EAAe1E,GAGhE,IAAI2E,EAAM5K,SAASG,KAAK0K,KAAK/E,GAE7B,IAAK,IAAIgF,KAAgBN,EACvB,GAAII,EAAIJ,EAAWM,GAAe,CAChC,IAAIC,OAAU,EAId,IAGE,GAAuC,mBAA5BP,EAAUM,GAA8B,CAEjD,IAAIE,EAAMlI,OAAO6H,GAAiB,eAAiB,KAAOD,EAAW,UAAYI,EAAjE,oGAA2LN,EAAUM,GAArM,mGAEhB,MADAE,EAAIpK,KAAO,sBACLoK,CAClB,CAEUD,EAAUP,EAAUM,GAAcL,EAAQK,EAAcH,EAAeD,EAAU,KAAM,+CACjG,CAAU,MAAOO,GACPF,EAAUE,CACpB,EAEYF,GAAaA,aAAmBjI,QAClCkD,EAA8BC,GAE9BnH,EAAM,2RAAqT6L,GAAiB,cAAeD,EAAUI,SAAqBC,GAE1X/E,EAA8B,OAG5B+E,aAAmBjI,SAAWiI,EAAQG,WAAWnF,KAGnDA,EAAmBgF,EAAQG,UAAW,EACtClF,EAA8BC,GAE9BnH,EAAM,qBAAsB4L,EAAUK,EAAQG,SAE9ClF,EAA8B,MAExC,CAGA,CA8gBMmF,CAAeZ,EAAWtE,EAAQ3B,MAAO,OAAQ1D,EAAMqF,EAC7D,MAAW,QAAuBpD,IAAnBrC,EAAK4K,YAA4BzC,EAA+B,CACzEA,GAAgC,EAIhC7J,EAAM,sGAFM4B,EAAyBF,IAEiF,UAC5H,CAEwC,mBAAzBA,EAAK6K,iBAAmC7K,EAAK6K,gBAAgBC,sBACtExM,EAAM,6HA3BZ,CA8BA,CAkCA,IAAIyM,GAAwB,CAAA,EAC5B,SAASC,GAAkBhL,EAAM8D,EAAO8C,EAAKqE,EAAkB9I,EAAQgF,GAEnE,IAAI+D,EAjlCR,SAA4BlL,GAC1B,MAAoB,iBAATA,GAAqC,mBAATA,GAKnCA,IAASzC,GAAuByC,IAASvC,GAA8CuC,IAASxC,GAA0BwC,IAASnC,GAAuBmC,IAASlC,GAAmDkC,IAAS/B,GAI/M,iBAAT+B,GAA8B,OAATA,IAC1BA,EAAKK,WAAarC,GAAmBgC,EAAKK,WAAatC,GAAmBiC,EAAKK,WAAa3C,GAAuBsC,EAAKK,WAAa1C,GAAsBqC,EAAKK,WAAazC,GAIjLoC,EAAKK,WAAaP,QAA+CuC,IAArBrC,EAAKmL,YAMrD,CA4jCoBC,CAAmBpL,GAGnC,IAAKkL,EAAW,CACd,IAAIzH,EAAO,SAEEpB,IAATrC,GAAsC,iBAATA,GAA8B,OAATA,GAA8C,IAA7B4B,OAAOyJ,KAAKrL,GAAMtB,UACvF+E,GAAQ,oIAGV,IAQI6H,EAHF7H,GAAQgF,KAKG,OAATzI,EACFsL,EAAa,OACJvF,EAAQ/F,GACjBsL,EAAa,aACKjJ,IAATrC,GAAsBA,EAAKK,WAAalD,GACjDmO,EAAa,KAAOpL,EAAyBF,EAAKA,OAAS,WAAa,MACxEyD,EAAO,sEAEP6H,SAAoBtL,EAGtB1B,EAAM,0IAAqJgN,EAAY7H,EAC7K,CAEI,IAAIgC,EAAUuB,EAAOhH,EAAM8D,EAAO8C,EAAKzE,EAAQgF,GAG/C,GAAe,MAAX1B,EACF,OAAOA,EAQT,GAAIyF,EAAW,CACb,IAAIK,EAAWzH,EAAMyH,SAErB,QAAiBlJ,IAAbkJ,EACF,GAAIN,EACF,GAAIlF,EAAQwF,GAAW,CACrB,IAAK,IAAInC,EAAI,EAAGA,EAAImC,EAAS7M,OAAQ0K,IACnCF,GAAkBqC,EAASnC,GAAIpJ,GAG7B4B,OAAOqG,QACTrG,OAAOqG,OAAOsD,EAE5B,MACYjN,EAAM,6JAGR4K,GAAkBqC,EAAUvL,EAGtC,CAGM,GAAIsF,EAAe3F,KAAKmE,EAAO,OAAQ,CACrC,IAAIqG,EAAgBjK,EAAyBF,GACzCqL,EAAOzJ,OAAOyJ,KAAKvH,GAAO0H,OAAO,SAAUC,GAC7C,MAAa,QAANA,CACjB,GACYC,EAAgBL,EAAK3M,OAAS,EAAI,kBAAoB2M,EAAKM,KAAK,WAAa,SAAW,iBAE5F,IAAKZ,GAAsBZ,EAAgBuB,GAGzCpN,EAAM,kOAA4PoN,EAAevB,EAF9PkB,EAAK3M,OAAS,EAAI,IAAM2M,EAAKM,KAAK,WAAa,SAAW,KAEiOxB,GAE9SY,GAAsBZ,EAAgBuB,IAAiB,CAEjE,CASI,OANI1L,IAASzC,EApHjB,SAA+BqO,GAI3B,IAFA,IAAIP,EAAOzJ,OAAOyJ,KAAKO,EAAS9H,OAEvBsF,EAAI,EAAGA,EAAIiC,EAAK3M,OAAQ0K,IAAK,CACpC,IAAIxC,EAAMyE,EAAKjC,GAEf,GAAY,aAARxC,GAA8B,QAARA,EAAe,CACvC0B,GAAgCsD,GAEhCtN,EAAM,2GAAiHsI,GAEvH0B,GAAgC,MAChC,KACR,CACA,CAEyB,OAAjBsD,EAAS/E,MACXyB,GAAgCsD,GAEhCtN,EAAM,yDAENgK,GAAgC,MAGtC,CA4FMuD,CAAsBpG,GAEtBqE,GAAkBrE,GAGbA,CAEX,CAgBA,IAAIqG,GANJ,SAAkC9L,EAAM8D,EAAO8C,GAE3C,OAAOoE,GAAkBhL,EAAM8D,EAAO8C,GAAK,EAE/C,EAKImF,GAdJ,SAAiC/L,EAAM8D,EAAO8C,GAE1C,OAAOoE,GAAkBhL,EAAM8D,EAAO8C,GAAK,EAE/C,EAYAoF,EAAAC,SAAmB1O,EACnByO,EAAAF,IAAcA,GACdE,EAAAD,KAAeA,EACZ,CAtyCD,qBCX2B,eAAzBjP,QAAQC,IAAIC,SACdkP,EAAAC,qCCMW,IAAIC,EAAElP,EAAiBuO,EAAErO,OAAOC,IAAI,iBAAiBgP,EAAEjP,OAAOC,IAAI,kBAAkBiP,EAAE1K,OAAOnC,UAAU6F,eAAeiH,EAAEH,EAAE/N,mDAAmDqI,kBAAkB8F,EAAE,CAAC5F,KAAI,EAAGC,KAAI,EAAGC,QAAO,EAAGC,UAAS,GAChP,SAAS0F,EAAE3H,EAAEkB,EAAE0G,GAAG,IAAIC,EAAEC,EAAE,CAAA,EAAGzG,EAAE,KAAK0G,EAAE,KAAiF,IAAIF,UAAhF,IAASD,IAAIvG,EAAE,GAAGuG,QAAG,IAAS1G,EAAEY,MAAMT,EAAE,GAAGH,EAAEY,UAAK,IAASZ,EAAEa,MAAMgG,EAAE7G,EAAEa,KAAcb,EAAEsG,EAAE3M,KAAKqG,EAAE2G,KAAKH,EAAElH,eAAeqH,KAAKC,EAAED,GAAG3G,EAAE2G,IAAI,GAAG7H,GAAGA,EAAE6C,aAAa,IAAIgF,KAAK3G,EAAElB,EAAE6C,kBAAe,IAASiF,EAAED,KAAKC,EAAED,GAAG3G,EAAE2G,IAAI,MAAM,CAACtM,SAASoL,EAAEzL,KAAK8E,EAAE8B,IAAIT,EAAEU,IAAIgG,EAAE/I,MAAM8I,EAAEjH,OAAO4G,EAAEhJ,QAAQ,QAACuJ,WAAiBT,EAAES,EAAAhB,IAAYW,EAAEK,EAAAf,KAAaU,IDPvVvP,GAEjBgP,EAAAC,QAAiBY,gBEEZ,SAASC,KAAMC,GACpB,OAAOC,EAAAA,QAAQC,OAAKF,GACtB,CAGO,MAAMG,EAAkBC,IAC7B,GAAIA,QAAqC,OAAOA,EAChD,GAAoB,iBAATA,EAAmB,OAAOA,EAAK7K,OAC1C,GAAI5D,MAAMmH,QAAQsH,GAAO,OAAOA,EAAKjO,IAAIgO,GAEzC,GAAoB,iBAATC,GAAqBA,EAAK/G,cAAgB1E,OAAQ,CAC3D,MAAM0L,EAAe,CAAA,EACrB,IAAA,MAAY1G,EAAK3C,KAAUrC,OAAO8H,QAAQ2D,GACxCC,EAAQ1G,GAAOwG,EAAenJ,GAEhC,OAAOqJ,CACT,CAEA,OAAOD,GCnBHE,EAAiBC,EAAAA,IACrB,2VACA,CACEC,SAAU,CACRC,QAAS,CACPC,QAAS,yDACTC,YACE,qEACFC,QACE,iFACFC,UACE,+DACFC,MAAO,+CACPC,KAAM,kDACN,YAAa,sFACb,gBAAiB,kGACjB,iBAAkB,mEAClB,mBAAoB,oFAEtBC,KAAM,CACJN,QAAS,iBACTO,GAAI,sBACJC,GAAI,uBACJC,KAAM,YACN,UAAW,UACX,UAAW,YAGfC,gBAAiB,CACfX,QAAS,UACTO,KAAM,aAWNK,EAASrR,EAAMsR,WACnB,EAAGC,YAAWd,UAASO,OAAMQ,WAAU,KAAU3K,GAAS+C,KACxD,MAAM6H,EAAOD,EAAUE,EAAAA,KAAO,SAC9B,OACE7C,EAAAA,IAAC4C,EAAA,CACCF,UAAWxB,EAAGO,EAAe,CAAEG,UAASO,OAAMO,eAC9C3H,SACI/C,MAKZwK,EAAOrO,YAAc,SCrDrB,MAAM2O,EAAcC,EAAqBC,KAEnCC,EAAqBF,EAAqBG,QAE1CC,EAAoBJ,EAAqBK,OAEzCC,EAAqBlS,EAAMsR,WAG/B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC+C,EAAqBO,QAArB,CACCZ,UAAWxB,EACT,0JACAwB,MAEE1K,EACJ+C,SAGJsI,EAAmBlP,YAAc4O,EAAqBO,QAAQnP,YAE9D,MAAMoP,EAAqBpS,EAAMsR,WAG/B,EAAGC,eAAc1K,GAAS+C,IAC1BkF,EAAAA,KAACkD,EAAA,CACC1D,SAAA,CAAAO,EAAAA,IAACqD,EAAA,IACDrD,EAAAA,IAAC+C,EAAqBS,QAArB,CACCzI,MACA2H,UAAWxB,EACT,8fACAwB,MAEE1K,QAIVuL,EAAmBpP,YAAc4O,EAAqBS,QAAQrP,YAE9D,MAAMsP,EAAoB,EACxBf,eACG1K,KAEHgI,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,8HACAwB,MAEE1K,IAGRyL,EAAkBtP,YAAc,oBAEhC,MAAMuP,EAAoB,EACxBhB,eACG1K,KAEHgI,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,gEACAwB,MAEE1K,IAGR0L,EAAkBvP,YAAc,oBAEhC,MAAMwP,GAAmBxS,EAAMsR,WAG7B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC+C,EAAqBa,MAArB,CACC7I,MACA2H,UAAWxB,EAAG,wBAAyBwB,MACnC1K,KAGR2L,GAAiBxP,YAAc4O,EAAqBa,MAAMzP,YAE1D,MAAM0P,GAAyB1S,EAAMsR,WAGnC,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC+C,EAAqBe,YAArB,CACC/I,MACA2H,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,KAGR6L,GAAuB1P,YACrB4O,EAAqBe,YAAY3P,YAEnC,MAAM4P,GAAoB5S,EAAMsR,WAG9B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC+C,EAAqBiB,OAArB,CACCjJ,MACA2H,UAAWxB,EAAGO,IAAkBiB,MAC5B1K,KAGR+L,GAAkB5P,YAAc4O,EAAqBiB,OAAO7P,YAE5D,MAAM8P,GAAoB9S,EAAMsR,WAG9B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC+C,EAAqBmB,OAArB,CACCnJ,MACA2H,UAAWxB,EACTO,EAAe,CAAEG,QAAS,YAC1B,eACAc,MAEE1K,KAGRiM,GAAkB9P,YAAc4O,EAAqBmB,OAAO/P,YCvH5D,MAAMgQ,GAAgBzC,EAAAA,IACpB,4JACA,CACEC,SAAU,CACRC,QAAS,CACPC,QAAS,gCACTC,YACE,4FAGNS,gBAAiB,CACfX,QAAS,aAKTwC,GAAQjT,EAAMsR,WAGlB,EAAGC,YAAWd,aAAY5J,GAAS+C,IACnCiF,EAAAA,IAAC,MAAA,CACCjF,MACAsJ,KAAK,QACL3B,UAAWxB,EAAGiD,GAAc,CAAEvC,YAAYc,MACtC1K,KAGRoM,GAAMjQ,YAAc,QAEpB,MAAMmQ,GAAanT,EAAMsR,WAGvB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EAAG,+CAAgDwB,MAC1D1K,KAGRsM,GAAWnQ,YAAc,aAEzB,MAAMoQ,GAAmBpT,EAAMsR,WAG7B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,KAGRuM,GAAiBpQ,YAAc,mBCnD/B,MAAMqQ,GAAgB9C,EAAAA,IACpB,yKACA,CACEC,SAAU,CACRC,QAAS,CACPC,QACE,4EACFG,UACE,kFACFF,YACE,wFACFC,QAAS,kBACT0C,QACE,gEACFC,QACE,kEACF/M,KACE,gEAGN4K,gBAAiB,CACfX,QAAS,aAST+C,GAAQxT,EAAMsR,WAClB,EAAGC,YAAWd,aAAY5J,GAAS+C,IAE/BiF,EAAAA,IAAC,MAAA,CAAIjF,MAAU2H,UAAWxB,EAAGsD,GAAc,CAAE5C,YAAYc,MAAgB1K,KAK/E2M,GAAMxQ,YAAc,QCtCpB,MAAMyQ,GAAazT,EAAMsR,WAKvB,KAAMzK,GAAS+C,IAAQiF,EAAAA,IAAC,OAAIjF,MAAU,aAAW,gBAAiB/C,KACpE4M,GAAWzQ,YAAc,aAEzB,MAAM0Q,GAAiB1T,EAAMsR,WAG3B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EACT,2FACAwB,MAEE1K,KAGR6M,GAAe1Q,YAAc,iBAE7B,MAAM2Q,GAAiB3T,EAAMsR,WAG3B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EAAG,mCAAoCwB,MAC9C1K,KAGR8M,GAAe3Q,YAAc,iBAE7B,MAAM4Q,GAAiB5T,EAAMsR,WAK3B,EAAGE,UAASD,eAAc1K,GAAS+C,KACnC,MAAM6H,EAAOD,EAAUxR,EAAMgP,SAAW,IAExC,OACEH,EAAAA,IAAC4C,EAAA,CACC7H,MACA2H,UAAWxB,EAAG,0CAA2CwB,MACrD1K,MAIV+M,GAAe5Q,YAAc,iBAE7B,MAAM6Q,GAAiB7T,EAAMsR,WAG3B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,OAAA,CACCjF,MACAsJ,KAAK,OACL,gBAAc,OACd,eAAa,OACb3B,UAAWxB,EAAG,8BAA+BwB,MACzC1K,KAGRgN,GAAe7Q,YAAc,iBAE7B,MAAM8Q,GAAsB,EAC1BxF,WACAiD,eACG1K,KAEHgI,EAAAA,IAAC,KAAA,CACCqE,KAAK,eACL,cAAY,OACZ3B,UAAWxB,EAAG,mBAAoBwB,MAC9B1K,EAEHyH,SAAAA,SAAayF,EAAAA,aAAA,CAAA,KAGlBD,GAAoB9Q,YAAc,sBAElC,MAAMgR,GAAqB,EACzBzC,eACG1K,KAEHiI,EAAAA,KAAC,OAAA,CACCoE,KAAK,eACL,cAAY,OACZ3B,UAAWxB,EAAG,2CAA4CwB,MACtD1K,EAEJyH,SAAA,CAAAO,EAAAA,IAACoF,EAAAA,eAAA,CAAe1C,UAAU,YAC1B1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,UAAUjD,SAAA,YAG9B0F,GAAmBhR,YAAc,qBCnGjC,MAAMkR,GAAOlU,EAAMsR,WAGjB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EACT,2DACAwB,MAEE1K,KAGRqN,GAAKlR,YAAc,OAEnB,MAAMmR,GAAanU,EAAMsR,WAGvB,EAAGC,eAAc1K,GAAS+C,UACzB,MAAA,CAAIA,MAAU2H,UAAWxB,EAAG,gCAAiCwB,MAAgB1K,KAEhFsN,GAAWnR,YAAc,aAEzB,MAAMoR,GAAYpU,EAAMsR,WAGtB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EACT,qDACAwB,MAEE1K,KAGRuN,GAAUpR,YAAc,YAExB,MAAMqR,GAAkBrU,EAAMsR,WAG5B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,IAAA,CACCjF,MACA2H,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,KAGRwN,GAAgBrR,YAAc,kBAE9B,MAAMsR,GAActU,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,UACzB,MAAA,CAAIA,MAAU2H,UAAWxB,EAAG,WAAYwB,MAAgB1K,KAE3DyN,GAAYtR,YAAc,cAE1B,MAAMuR,GAAavU,EAAMsR,WAGvB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EAAG,6BAA8BwB,MACxC1K,KAGR0N,GAAWvR,YAAc,aCpEzB,MAAMwR,GAAQxU,EAAMsR,WAClB,EAAGC,YAAWxO,UAAS8D,GAAS+C,IAE5BiF,EAAAA,IAAC,QAAA,CACC9L,OACAwO,UAAWxB,EACT,iYACAwB,GAEF3H,SACI/C,KAKZ2N,GAAMxR,YAAc,QCbpB,MAAMyR,GAAgBlE,EAAAA,IACpB,8FAGImE,GAAQ1U,EAAMsR,WAIlB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC8F,EAAe9C,KAAf,CACCjI,MACA2H,UAAWxB,EAAG0E,KAAiBlD,MAC3B1K,KAGR6N,GAAM1R,YAAc2R,EAAe9C,KAAK7O,YChBxC,MAAM4R,GAAUC,EAAiBhD,KAE3BiD,GAAiBD,EAAiB9C,QAElCgD,GAAiB/U,EAAMsR,WAG3B,EAAGC,YAAWyD,QAAQ,SAAUC,aAAa,KAAMpO,GAAS+C,IAC5DiF,EAAAA,IAACgG,EAAiB5C,OAAjB,CACC3D,SAAAO,EAAAA,IAACgG,EAAiBxC,QAAjB,CACCzI,MACAoL,QACAC,aACA1D,UAAWxB,EACT,6aACAwB,MAEE1K,OAIVkO,GAAe/R,YAAc6R,EAAiBxC,QAAQrP,YCdtD,MAAMkS,GAAgB,CACpB,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,WAGjCC,GAA0C,EACrDnO,QAAQ,UACRoO,WACAC,WAGEvG,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACZjD,SAAA,CAAA+G,GAASxG,EAAAA,IAAC6F,IAAOpG,SAAA+G,WACjBT,GAAA,CACCtG,SAAA,CAAAO,EAAAA,IAACiG,GAAA,CAAetD,SAAO,EACrBlD,SAAAQ,EAAAA,KAACuC,EAAA,CACCZ,QAAQ,UACRc,UAAU,6CAEVjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CACC0C,UAAU,8BACV+D,MAAO,CAAEC,gBAAiBvO,KAE3BA,aAGJ+N,GAAA,CAAexD,UAAU,OACxBjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACbjD,SAAA,CAAAQ,OAAC,MAAA,CACCR,SAAA,CAAAO,EAAAA,IAAC6F,GAAA,CAAMc,QAAQ,cAAclH,SAAA,sBAC7BO,EAAAA,IAAC2F,GAAA,CACCiB,GAAG,cACH1S,KAAK,QACLiE,QACAoO,SAAWlM,GAAMkM,IAAWlM,EAAEwM,OAAO1O,OACrCuK,UAAU,0BAGb,MAAA,CACCjD,SAAA,CAAAO,EAAAA,IAAC6F,IAAMpG,SAAA,6BACN,MAAA,CAAIiD,UAAU,8BACZjD,SAAA4G,GAAc/S,IAAKwT,GAClB9G,EAAAA,IAAC,SAAA,CAEC0C,UAAU,8DACV+D,MAAO,CAAEC,gBAAiBI,GAC1BC,QAAS,IAAMR,IAAWO,GAC1B,aAAY,kBAAkBA,KAJzBA,oBCpDnBE,GAAU7V,EAAMsR,WAGpB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EACT,4FACAwB,MAEE1K,KAGRgP,GAAQ7S,YAAc,UAQtB,MAUM8S,GAAe9V,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CAAI0C,UAAU,kCAAkC,qBAAmB,GAClEjD,SAAAO,EAAAA,IAAC,QAAA,CACCjF,MACA2H,UAAWxB,EACT,yJACAwB,MAEE1K,OAIViP,GAAa9S,YAAc,eAE3B,MAAM+S,GAAc/V,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EAAG,kDAAmDwB,MAC7D1K,KAGRkP,GAAY/S,YAAc,cAE1B,MAAMgT,GAAehW,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EAAG,iDAAkDwB,MAC5D1K,KAGRmP,GAAahT,YAAc,eAE3B,MAAMiT,GAAejW,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EACT,yNACAwB,MAEE1K,KAGRoP,GAAajT,YAAc,eAE3B,MAAMkT,GAAmBlW,EAAMsR,WAG7B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EAAG,uBAAwBwB,MAClC1K,KAGRqP,GAAiBlT,YAAc,mBAE/B,MAAMmT,GAAcnW,EAAMsR,WAOxB,EAAGC,YAAW6E,WAAUC,WAAUrP,WAAUH,GAAS+C,IACrDiF,EAAAA,IAAC,MAAA,CACCjF,MACA2H,UAAWxB,EACT,wPACAwB,GAEF,gBAAe6E,EACfR,QAAS,KAAOQ,GAAYC,IAAWrP,GAAS,OAC5CH,KAGRsP,GAAYnT,YAAc,cAE1B,MAAMsT,GAAkB,EACtB/E,eACG1K,KAGDgI,EAAAA,IAAC,OAAA,CACC0C,UAAWxB,EACT,wDACAwB,MAEE1K,IAIVyP,GAAgBtT,YAAc,kBClFvB,MAAMuT,GAAW,CACtB1E,KAnCF,UAAsBvD,SAAEA,EAAAiD,UAAUA,IAChC,aACG,MAAA,CAAIA,UAAWxB,EAAG,YAAawB,GAC7BjD,YAGP,EA8BEkI,KA5BF,UAAsBlI,SAAEA,EAAAsH,QAAUA,EAAArE,UAASA,IACzC,OACE1C,EAAAA,IAACqF,GAAA,CACC3C,UAAWxB,EACT,oBACA6F,GAAW,mCACXrE,GAEFqE,UAEAtH,SAAAO,EAAAA,IAACyF,GAAA,CAAY/C,UAAU,MACpBjD,cAIT,EAcEmI,MAZF,UAAuBpB,MAAEA,EAAArO,MAAOA,EAAAuK,UAAOA,IACrC,cACG,MAAA,CAAIA,UAAWxB,EAAG,4CAA6CwB,GAC9DjD,SAAA,CAAAQ,EAAAA,KAAC,OAAA,CAAKyC,UAAU,oCAAqCjD,SAAA,CAAA+G,EAAM,OAC3DxG,EAAAA,IAAC,OAAA,CAAK0C,UAAU,kBAAmBjD,SAAAtH,MAGzC,GClCM0P,GAA2B,EAC/BC,OACAC,eACAxU,OACAyU,YACAC,aAAa,OACbC,cAAa,MAEb,MAAOC,EAAkBC,GAAuBC,EAAAA,SAAS,IAGzDC,EAAAA,UAAU,KACHR,GACHM,EAAoB,KAErB,CAACN,IAEJ,MAAMS,EAAe,KACnBH,EAAoB,IACpBL,GAAa,IAWTS,EAAsBL,IAAqB5U,GAAMkV,MAEvD,OAAKlV,EAGHyM,EAAAA,IAAC8C,GAAYgF,OAAYC,aAAcQ,EACrC9I,SAAAQ,EAAAA,KAACsD,EAAA,CAAmBb,UAAU,mBAC5BjD,SAAA,CAAAO,MAACyD,EAAA,CACChE,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,wFACbjD,SAAAO,EAAAA,IAAC,QAAK0C,UAAU,yCAAyCjD,iBAE3DO,EAAAA,IAAC,OAAI0C,UAAU,SACbjD,eAACkE,GAAA,CAAiBjB,UAAU,wBAAwBjD,SAAA,oCAOzDoE,GAAA,CAAuBlB,SAAO,EAC7BlD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACbjD,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,gCACbjD,SAAA,CAAAQ,EAAAA,KAAC,IAAA,CAAEyC,UAAU,OAAOjD,SAAA,CAAA,iDAC6BwI,EAAW,OAE5DjI,EAAAA,IAAC,MAAA,CAAI0C,UAAU,0DACbjD,SAAAO,EAAAA,IAAC,KAAE0C,UAAU,8BAA+BjD,SAAAlM,EAAKkV,mBAIpD,MAAA,CAAI/F,UAAU,uDACbjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,6BACbjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,2FACbjD,SAAAO,EAAAA,IAAC,QAAK0C,UAAU,+BAA+BjD,iBAEjDQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,0BACbjD,SAAA,CAAAO,EAAAA,IAAC,IAAA,CAAE0C,UAAU,mBAAmBjD,SAAA,oBAC/B,IAAA,CAAEA,SAAA,CAAA,sCAAoCwI,EAAW,wDAKxDhI,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACbjD,SAAA,CAAAQ,EAAAA,KAAC4F,GAAA,CAAMc,QAAQ,eAAejE,UAAU,sBAAsBjD,SAAA,CAAA,iCACpC,SAAA,CAAOA,SAAA,CAAA,IAAElM,EAAKkV,MAAM,OAAU,cAExDzI,EAAAA,IAAC2F,GAAA,CACCiB,GAAG,eACH1S,KAAK,OACLiE,MAAOgQ,EACP5B,SAAWlM,GAAM+N,EAAoB/N,EAAEwM,OAAO1O,OAC9CuQ,YAAa,WAAWnV,EAAKkV,QAC7B/F,UAAU,0BAMjBgB,EAAA,CACCjE,SAAA,CAAAO,EAAAA,IAACiE,GAAA,CAAkB8C,QAASwB,EAAc9I,SAAA,aAG1CO,EAAAA,IAAC+D,GAAA,CACCgD,QAxEY,KAChBxT,GAAQ4U,IAAqB5U,EAAKkV,QACpCT,EAAUzU,GACV6U,EAAoB,IACpBL,GAAa,KAqEPR,UAAWiB,GAAuBN,EAClCxF,UAAU,qEAETjD,SAAAyI,EAAa,eAAiB,WAAWD,cAlElC,MC7CdU,GAASC,EAAgB5F,KAEzB6F,GAAgBD,EAAgB1F,QAEhC4F,GAAeF,EAAgBxF,OAE/B2F,GAAcH,EAAgBI,MAE9BC,GAAgB9X,EAAMsR,WAG1B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC4I,EAAgBtF,QAAhB,CACCvI,MACA2H,UAAWxB,EACT,0JACAwB,MAEE1K,KAGRiR,GAAc9U,YAAcyU,EAAgBtF,QAAQnP,YAEpD,MAAM+U,GAAgB/X,EAAMsR,WAG1B,EAAGC,YAAWjD,cAAazH,GAAS+C,IACpCkF,EAAAA,KAAC6I,GAAA,CACCrJ,SAAA,CAAAO,EAAAA,IAACiJ,GAAA,IACDhJ,EAAAA,KAAC2I,EAAgBpF,QAAhB,CACCzI,MACA2H,UAAWxB,EACT,0fACAwB,MAEE1K,EAEHyH,SAAA,CAAAA,EACDQ,EAAAA,KAAC2I,EAAgBI,MAAhB,CAAsBtG,UAAU,6OAC/BjD,SAAA,CAAAO,EAAAA,IAACmJ,EAAAA,EAAA,CAAEzG,UAAU,YACb1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,UAAUjD,SAAA,oBAKlCyJ,GAAc/U,YAAcyU,EAAgBpF,QAAQrP,YAEpD,MAAMiV,GAAe,EACnB1G,eACG1K,KAEHgI,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,gIACAwB,MAEE1K,IAGRoR,GAAajV,YAAc,eAE3B,MAAMkV,GAAe,EACnB3G,eACG1K,KAEHgI,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,gEACAwB,MAEE1K,IAGRqR,GAAalV,YAAc,eAE3B,MAAMmV,GAAcnY,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC4I,EAAgBhF,MAAhB,CACC7I,MACA2H,UAAWxB,EACT,oDACAwB,MAEE1K,KAGRsR,GAAYnV,YAAcyU,EAAgBhF,MAAMzP,YAEhD,MAAMoV,GAAoBpY,EAAMsR,WAG9B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC4I,EAAgB9E,YAAhB,CACC/I,MACA2H,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,KAGRuR,GAAkBpV,YAAcyU,EAAgB9E,YAAY3P,YCpG5D,MAAMqV,GAAeC,EAAsBzG,KAErC0G,GAAsBD,EAAsBvG,QAE5CyG,GAAoBF,EAAsBG,MAE1CC,GAAqBJ,EAAsBrG,OAE3C0G,GAAkBL,EAAsBM,IAExCC,GAAyBP,EAAsBQ,WAE/CC,GAAyB/Y,EAAMsR,WAKnC,EAAGC,YAAWyH,QAAO1K,cAAazH,GAAS+C,IAC3CkF,EAAAA,KAACwJ,EAAsBW,WAAtB,CACCrP,MACA2H,UAAWxB,EACT,4HACAiJ,GAAS,OACTzH,MAEE1K,EAEHyH,SAAA,CAAAA,EACDO,EAAAA,IAACkF,EAAAA,aAAA,CAAaxC,UAAU,wBAG5BwH,GAAuB/V,YACrBsV,EAAsBW,WAAWjW,YAEnC,MAAMkW,GAAyBlZ,EAAMsR,WAGnC,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACyJ,EAAsBa,WAAtB,CACCvP,MACA2H,UAAWxB,EACT,6aACAwB,MAEE1K,KAGRqS,GAAuBlW,YACrBsV,EAAsBa,WAAWnW,YAEnC,MAAMoW,GAAsBpZ,EAAMsR,WAGhC,EAAGC,YAAW0D,aAAa,KAAMpO,GAAS+C,IAC1CiF,EAAAA,IAACyJ,EAAsBrG,OAAtB,CACC3D,SAAAO,EAAAA,IAACyJ,EAAsBjG,QAAtB,CACCzI,MACAqL,aACA1D,UAAWxB,EACT,mcACAwB,MAEE1K,OAIVuS,GAAoBpW,YAAcsV,EAAsBjG,QAAQrP,YAEhE,MAAMqW,GAAmBrZ,EAAMsR,WAK7B,EAAGC,YAAWyH,WAAUnS,GAAS+C,IACjCiF,EAAAA,IAACyJ,EAAsB9B,KAAtB,CACC5M,MACA2H,UAAWxB,EACT,uNACAiJ,GAAS,OACTzH,MAEE1K,KAGRwS,GAAiBrW,YAAcsV,EAAsB9B,KAAKxT,YAE1D,MAAMsW,GAA2BtZ,EAAMsR,WAGrC,EAAGC,YAAWjD,WAAUiL,aAAY1S,GAAS+C,IAC7CkF,EAAAA,KAACwJ,EAAsBkB,aAAtB,CACC5P,MACA2H,UAAWxB,EACT,4NACAwB,GAEFgI,aACI1S,EAEJyH,SAAA,CAAAO,EAAAA,IAAC,OAAA,CAAK0C,UAAU,+DACdjD,SAAAO,EAAAA,IAACyJ,EAAsBmB,cAAtB,CACCnL,SAAAO,EAAAA,IAAC6K,QAAA,CAAMnI,UAAU,gBAGpBjD,MAGLgL,GAAyBtW,YACvBsV,EAAsBkB,aAAaxW,YAErC,MAAM2W,GAAwB3Z,EAAMsR,WAGlC,EAAGC,YAAWjD,cAAazH,GAAS+C,IACpCkF,EAAAA,KAACwJ,EAAsBsB,UAAtB,CACChQ,MACA2H,UAAWxB,EACT,4NACAwB,MAEE1K,EAEJyH,SAAA,CAAAO,EAAAA,IAAC,OAAA,CAAK0C,UAAU,+DACdjD,SAAAO,EAAAA,IAACyJ,EAAsBmB,cAAtB,CACCnL,SAAAO,EAAAA,IAACgL,SAAA,CAAOtI,UAAU,6BAGrBjD,MAGLqL,GAAsB3W,YAAcsV,EAAsBsB,UAAU5W,YAEpE,MAAM8W,GAAoB9Z,EAAMsR,WAK9B,EAAGC,YAAWyH,WAAUnS,GAAS+C,IACjCiF,EAAAA,IAACyJ,EAAsB5D,MAAtB,CACC9K,MACA2H,UAAWxB,EACT,oCACAiJ,GAAS,OACTzH,MAEE1K,KAGRiT,GAAkB9W,YAAcsV,EAAsB5D,MAAM1R,YAE5D,MAAM+W,GAAwB/Z,EAAMsR,WAGlC,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACyJ,EAAsB0B,UAAtB,CACCpQ,MACA2H,UAAWxB,EAAG,2BAA4BwB,MACtC1K,KAGRkT,GAAsB/W,YAAcsV,EAAsB0B,UAAUhX,YAEpE,MAAMiX,GAAuB,EAC3B1I,eACG1K,KAGDgI,EAAAA,IAAC,OAAA,CACC0C,UAAWxB,EAAG,6CAA8CwB,MACxD1K,IAIVoT,GAAqBjX,YAAc,uBClKnC,MAAMkX,GAAe,CACnBxJ,QAASyJ,EAAAA,MACTC,OAAQC,EAAAA,OACRhZ,MAAOiZ,EAAAA,aAGF,SAASC,IAAWpJ,KACzBA,EAAAmG,MACAA,EAAAkD,YACAA,EAAAC,OACAA,EAAAlJ,UACAA,EAAAd,QACAA,EAAU,YAEV,MAAMiK,EAAgBvJ,EAAO,IAAMA,EAAO+I,GAAazJ,GAEvD,OACE3B,OAAC,OAAIyC,UAAWxB,EACd,mEACAwB,GAEAjD,SAAA,CAAAO,EAAAA,IAAC,OAAI0C,UAAU,wEACbjD,eAACoM,EAAA,CAAcnJ,UAAU,oCAG3B1C,EAAAA,IAAC,KAAA,CAAG0C,UAAU,6BAA8BjD,SAAAgJ,IAE3CkD,GACC3L,EAAAA,IAAC,IAAA,CAAE0C,UAAU,sCACVjD,SAAAkM,IAIJC,SACEpJ,EAAA,CAAOuE,QAAS6E,EAAO7E,QAASnF,QAAQ,UACtCnC,SAAAmM,EAAOpF,UAKlB,CCxDA,MAAMsF,GACY,uBADZA,GAEQ,mBAFRA,GAGM,iBAHNA,GAIS,cAJTA,GAKS,cALTA,GAMY,iBAGLC,GAAe,CAE1BC,eAAiBC,GAAkBC,aAAaC,QAAQL,GAA6BG,GACrFG,eAAgB,IAAMF,aAAaG,QAAQP,IAG3CQ,WAAaL,GAAkBC,aAAaC,QAAQL,GAAyBG,GAC7EM,WAAY,IAAML,aAAaG,QAAQP,IAGvCU,iBAAmBP,GAAkBC,aAAaC,QAAQL,GAAuBG,GACjFQ,iBAAkB,IAAMP,aAAaG,QAAQP,IAG7CY,cAAgBC,GAAkBC,eAAeT,QAAQL,GAA0Ba,GACnFE,cAAe,IAAMD,eAAeP,QAAQP,IAC5CgB,gBAAiB,IAAMF,eAAeG,WAAWjB,IAGjDkB,cAAgBC,GAAkBL,eAAeT,QAAQL,GAA0BmB,GACnFC,cAAe,IAAMN,eAAeP,QAAQP,IAC5CqB,gBAAiB,IAAMP,eAAeG,WAAWjB,IAGjDsB,iBAAmBC,GAAkBnB,aAAaC,QAAQL,GAA6BuB,GACvFC,iBAAkB,IAAMpB,aAAaG,QAAQP,IAC7CyB,mBAAoB,IAAMrB,aAAaa,WAAWjB,IAGlD0B,mBAAoB,IACX,OAETC,mBAAoB,KAClB,MAAMC,EAAc,IAAIC,WAAW,IAEnC,OADAC,OAAOC,gBAAgBH,GAChBI,KAAKta,OAAOua,gBAAgBL,IAAcxU,QAAQ,SAAU,KAIrE8U,aAAc,OAASjC,GAAaK,mBAAoBL,GAAaQ,cACrE0B,SAAU,KACR/B,aAAaa,WAAWjB,IACxBI,aAAaa,WAAWjB,IACxBI,aAAaa,WAAWjB,IACxBI,aAAaa,WAAWjB,IACxBc,eAAeG,WAAWjB,IAC1Bc,eAAeG,WAAWjB,KAI5BoC,eAAiBjC,IACf,IAEE,OAAqB,IADLkC,KAAKC,MAAMC,KAAKpC,EAAMpT,MAAM,KAAK,KAClCyV,IAAaC,KAAKC,KACnC,CAAA,MACE,OAAO,CACT,GAIFC,qBAAsB,KACpB,MAAMxC,EAAQF,GAAaU,mBAC3B,QAAOR,IAASF,GAAamC,eAAejC,IAG9CyC,sBAAuB,KACrB,MAAMzC,EAAQF,GAAaU,mBAC3B,OAAKR,GAASF,GAAamC,eAAejC,GACjC,KAEFA,GAIT0C,iBAAkB,KAChB,MAAM1C,EAAQF,GAAaU,mBAE3B,IAAKR,EACH,OAAO,KAGT,IAEE,MAAMhX,EAAUkZ,KAAKC,MAAMC,KAAKpC,EAAMpT,MAAM,KAAK,KAC3CwU,EAAQpY,EAAQoY,OAASpY,EAAQ4M,SAAW5M,EAAQ2Z,WAG1D,IAAIC,EAAY5Z,EAAQ6Z,WACxB,IAAKD,GAAaxB,EAEhB,IAAA,MAAWvS,KAAO7F,EAChB,GAAI6F,EAAIiU,WAAW,OAAS,UAAUC,KAAKlU,GAAM,CAC/C,MAAMmU,EAAUha,EAAQ6F,GACxB,GAAImU,GAA8B,iBAAZA,EAAsB,CAC1C,MAAMC,EAAQD,EAAQpW,MAAM,KAC5B,GAAIqW,EAAMtc,OAAS,GAAKsc,EAAM,KAAO7B,EAAO,CAC1CwB,EAAYK,EAAM,GAClB,KACF,CACF,CACF,CAIJ,MAAO,CAAE7B,QAAOwB,YAAW5Z,UAC7B,CAAA,MACE,OAAO,IACT,IC7FJ,IAAIka,GAAQ,EA+BZ,MAAMC,OAAoBrY,IAEpBsY,GAAoBC,IACxB,GAAIF,GAAc9Q,IAAIgR,GACpB,OAGF,MAAMC,EAAUC,WAAW,KACzBJ,GAAcK,OAAOH,GACrBI,GAAS,CACPxb,KAAM,eACNob,aA1DqB,KA8DzBF,GAAc3W,IAAI6W,EAASC,IAGhBI,GAAU,CAAChD,EAAcf,KACpC,OAAQA,EAAO1X,MACb,IAAK,YACH,MAAO,IACFyY,EACHiD,OAAQ,CAAChE,EAAOiE,SAAUlD,EAAMiD,QAAQE,MAAM,EAvElC,IA0EhB,IAAK,eACH,MAAO,IACFnD,EACHiD,OAAQjD,EAAMiD,OAAOtc,IAAKyc,GACxBA,EAAEnJ,KAAOgF,EAAOiE,MAAMjJ,GAAK,IAAKmJ,KAAMnE,EAAOiE,OAAUE,IAI7D,IAAK,gBAAiB,CACpB,MAAMT,QAAEA,GAAY1D,EAYpB,OARI0D,EACFD,GAAiBC,GAEjB3C,EAAMiD,OAAOI,QAASH,IACpBR,GAAiBQ,EAAMjJ,MAIpB,IACF+F,EACHiD,OAAQjD,EAAMiD,OAAOtc,IAAKyc,GACxBA,EAAEnJ,KAAO0I,QAAuB,IAAZA,EAChB,IACKS,EACHjI,MAAM,GAERiI,GAGV,CACA,IAAK,eACH,YAAuB,IAAnBnE,EAAO0D,QACF,IACF3C,EACHiD,OAAQ,IAGL,IACFjD,EACHiD,OAAQjD,EAAMiD,OAAOlQ,OAAQqQ,GAAMA,EAAEnJ,KAAOgF,EAAO0D,YAKrDW,GAA2C,GAEjD,IAAIC,GAAqB,CAAEN,OAAQ,IAEnC,SAASF,GAAS9D,GAChBsE,GAAcP,GAAQO,GAAatE,GACnCqE,GAAUD,QAASG,IACjBA,EAASD,KAEb,CAIA,SAASL,OAAW7X,IAClB,MAAM4O,GAnHNuI,IAASA,GAAQ,GAAKiB,OAAOC,iBACtBlB,GAAMmB,YAyHPC,EAAU,IAAMb,GAAS,CAAExb,KAAM,gBAAiBob,QAAS1I,IAcjE,OAZA8I,GAAS,CACPxb,KAAM,YACN2b,MAAO,IACF7X,EACH4O,KACAkB,MAAM,EACNC,aAAeD,IACRA,GAAMyI,QAKV,CACL3J,KACA2J,UACAC,OAtBcxY,GACd0X,GAAS,CACPxb,KAAM,eACN2b,MAAO,IAAK7X,EAAO4O,QAqBzB,CAEA,SAAS6J,KACP,MAAO9D,EAAO+D,GAAYvf,EAAMkX,SAAgB6H,IAYhD,OAVA/e,EAAMmX,UAAU,KACd2H,GAAUU,KAAKD,GACR,KACL,MAAME,EAAQX,GAAUY,QAAQH,GAC5BE,GAAQ,GACVX,GAAUa,OAAOF,EAAO,KAG3B,CAACjE,IAEG,IACFA,EACHkD,SACAU,QAAUjB,GAAqBI,GAAS,CAAExb,KAAM,gBAAiBob,YAErE,8JChHO,MAAMyB,GAAe,IAjE5B,MAAA,WAAAvW,GACEwW,GAAAC,KAAQ,SAAuB,IAC/BD,GAAAC,KAAQ,aAAa,GACrBD,GAAAC,KAAQ,gBAAgB,EAAA,CAGxB,WAAAC,CAAY1e,EAAuB2e,GAAY,GAC7C,MAAMvS,EAA2B,iBAAVpM,EAAqBA,EAAQA,EAAMoM,QAG1DqS,KAAKG,OAAOT,KAAK,CACf/J,GAAI2H,KAAKC,MAAM8B,WACf1R,UACAyS,UAAW9C,KAAKC,MAChBW,MAAO,IAILgC,GAAaF,KAAKK,mBACpBzB,GAAM,CACJpH,MAAO,OACPkD,YAAa/M,EACbgD,QAAS,eAKf,CAGA,OAAA6C,CAAQgE,EAAekD,GACrBkE,GAAM,CACJpH,QACAkD,cACA/J,QAAS,WAEb,CAGQ,eAAA0P,GACN,MAAM9C,EAAMD,KAAKC,MAKjB,OAJIA,EAAMyC,KAAKM,cAAgB,MAC7BN,KAAKO,WAAa,GAGhBP,KAAKO,WAAa,IACpBP,KAAKO,aACLP,KAAKM,cAAgB/C,GACd,EAIX,CAGA,SAAAiD,GACE,OAAOR,KAAKG,OAAOtB,UACrB,CAGA,WAAA4B,GACET,KAAKG,OAAS,EAChB,gKCjEF,MAAMO,SAAepb,GAAgBqb,kBAC/BC,SAA2Btb,GAAgBub,8BAI3CC,GAAN,MAAMA,EAMI,WAAAvX,GAJRwW,GAAAC,KAAQ,UACRD,GAAAC,KAAQ,eAA8B,MACtCD,GAAAC,KAAQ,gBAAgB,GAGtBA,KAAKe,gBAGLf,KAAKgB,OAAShB,KAAKiB,sBAAsB,KAC3C,CAEQ,qBAAAA,CAAsBjG,GAC5B,MAAMkG,EAAkC,CACtCC,OAAUP,IAOZ,OAJI5F,GAASgF,KAAKoB,aAAapG,KAC7BkG,EAAuB,cAAI,UAAUlG,KAGhCqG,EAAAA,aAAuBX,GAAcE,GAA0B,CACpEU,KAAM,CACJC,gBAAgB,EAChBC,kBAAkB,GAEpBC,OAAQ,CACNP,YAGN,CAEA,kBAAcQ,GAIZ,OAHKZ,EAAkBa,WACrBb,EAAkBa,SAAW,IAAIb,GAE5BA,EAAkBa,QAC3B,CAEO,SAAAC,GACL,MAAM5G,EAAQF,GAAaU,mBAQ3B,OALIR,IAAUgF,KAAK6B,eACjB7B,KAAKgB,OAAShB,KAAKiB,sBAAsBjG,GACzCgF,KAAK6B,aAAe7G,GAGfgF,KAAKgB,MACd,CAEQ,YAAAI,CAAapG,GACnB,IACE,MAAMhX,EAAUkZ,KAAKC,MAAMC,KAAKpC,EAAMpT,MAAM,KAAK,KAC3C2V,EAAMuE,KAAKC,MAAMzE,KAAKC,MAAQ,KACpC,OAAOvZ,EAAQqZ,IAAME,CACvB,OAAShc,GAEP,OADAue,GAAaG,YAAY1e,aAAiBgE,MAAQhE,EAAQ,uCAAuC,IAC1F,CACT,CACF,GA5DAwe,GADIe,GACW,YADjB,IAAMkB,GAANlB,GAkEO,MAAMmB,GAAoB,IACxBD,GAAkBN,cAAcE,YC/E5BM,GAAc,CACzBC,MAAO,CACLC,cAAS9c,GAAgB+c,oBACzBC,eAAUhd,GAAgBid,qBAC1BC,aAAc,iBACdC,MAAO,yBAKEC,GAAc,CACzBC,WAAY,CACVC,gBAAiB,GACjBC,gBAAiB,CAAC,GAAI,GAAI,GAAI,MAEhCC,QAAS,CACPC,aAAc,aACdC,iBAAkB,SAKTC,GAAgB,CAC3BC,cAAe,KAIJC,GAAmB,KAC9B,MAAMC,EAASC,OAAOlW,SAASiW,OAW/B,OAPEA,EAAOlb,SAAS,cAChBkb,EAAOlb,SAAS,cAChBkb,EAAOlb,SAAS,eAChBkb,EAAOlb,SAAS,sBAChB5C,GAAgBge,KAcPC,GAAW,CACtB/P,QAAS,CACPgQ,QAAUC,GAAmB,GAAGA,uBAChCC,QAAUD,GAAmB,GAAGA,2BAChCE,QAAUF,GAAmB,GAAGA,0BAElCliB,MAAO,CACLqiB,OAASH,GAAmB,iBAAiBA,IAC7ClE,OAASkE,GAAmB,qBAAqBA,IACjDjF,OAASiF,GAAmB,mBAAmBA,IAC/CI,KAAOJ,GAAmB,oBAAoBA,MCvD3C,MAAMK,GAKX,uBAAaC,GACX,IAEE,IAAKjJ,GAAaiC,eAChB,MAAO,CACLiH,iBAAiB,EACjBC,WAAW,EACXC,KAAM,KACN9H,MAAO,KACP+H,UAAW,IAKf,MAAMC,EAAoBtJ,GAAaK,iBACjCkJ,EAAgBvJ,GAAaQ,aAE7B4I,EAAOlE,KAAKsE,uBAAuBD,GACnCF,EAAYnE,KAAKuE,4BAA4BF,GAC7CG,EAAexE,KAAKyE,4BAA4BL,GAGhDM,EAAsB5J,GAAauB,mBAEnCsI,EADuBD,GAAuBP,EAAUS,KAAK7c,GAAKA,EAAEqU,QAAUsI,GACvCA,EAAuBF,GAAgBL,EAAU,IAAI/H,OAAS,KAG3G,IAAKtB,GAAa0C,wBAA0BmH,EAAe,CACzD,MAAME,QAAyB7E,KAAK8E,sBAAsBV,EAAmBO,GACzEE,GACF/J,GAAaS,iBAAiBsJ,EAElC,CAEA,MAAO,CACLb,iBAAiB,EACjBC,WAAW,EACXC,OACA9H,MAAOuI,EACPR,YAEJ,OAAS5iB,GAEP,OADAsB,QAAQtB,MAAM,gCAAiCA,GACxC,CACLyiB,iBAAiB,EACjBC,WAAW,EACXC,KAAM,KACN9H,MAAO,KACP+H,UAAW,GAEf,CACF,CAKA,qBAAaY,GACX,IACE,MAAMC,EAAW/C,MACX3R,KAAEA,QAAM/O,SAAgByjB,EAASC,UAAUC,OAAO,aAAc,CACpEC,KAAM,CAAEC,YAAa,iBAGvB,GAAI7jB,EAEF,OADAsB,QAAQtB,MAAM,2CAA4CA,IACnD,EAGT,IAAK+O,GAAM+U,eAAiB/U,GAAMgV,SAEhC,OADAziB,QAAQtB,MAAM,uCACP,EAIT,MAAMgkB,EAAc,IAAIC,IAAI,YAAanC,OAAOlW,SAASiW,QAIzD,OAHAmC,EAAYE,KAAO,gBAAgBnV,EAAK+U,yBAAyB/U,EAAKgV,6BAEtEjC,OAAOlW,SAASuY,KAAOH,EAAYlG,YAC5B,CACT,OAAS9d,GAEP,OADAsB,QAAQtB,MAAM,4BAA6BA,IACpC,CACT,CACF,CAKA,gBAAOokB,GAEL,MAAMjK,EAAQZ,GAAayB,qBAC3BzB,GAAaW,cAAcC,GAC3B,MAAMM,EAAQlB,GAAa0B,qBAC3B1B,GAAaiB,cAAcC,GAG3B,MAAM4J,EAAc,GAAGvC,OAAOlW,SAASiW,kBACjChB,EAAU,IAAIoD,IAAItD,GAAYC,MAAMC,SAC1CA,EAAQyD,aAAare,IAAI,YAAa0a,GAAYC,MAAMG,UACxDF,EAAQyD,aAAare,IAAI,gBAAiB0a,GAAYC,MAAMK,cAC5DJ,EAAQyD,aAAare,IAAI,QAAS0a,GAAYC,MAAMM,OACpDL,EAAQyD,aAAare,IAAI,eAAgBoe,GACzCxD,EAAQyD,aAAare,IAAI,QAASkU,GAClC0G,EAAQyD,aAAare,IAAI,QAASwU,GAClCoG,EAAQyD,aAAare,IAAI,gBAAiB,YAGpB2b,KAEtBE,OAAOlW,SAASuY,KAAOtD,EAAQ/C,UACjC,CAKA,4BAAayG,GACX,IAEE,GAAIhL,GAAaiC,eAAgB,CAE/B,IADyBjC,GAAa2C,wBACf,CACrB,MAAMsI,EAAejL,GAAaK,iBAC5B6K,EAAkBhG,KAAKyE,4BAA4BsB,GACnDE,EAAgBjG,KAAKuE,4BAA4BzJ,GAAaQ,cAAe,IAAIc,MACjFA,EAAQ4J,GAAmBC,EACjC,GAAI7J,EAAO,CACT,MAAM8J,QAAalG,KAAK8E,sBAAsBiB,EAAc3J,GACxD8J,GAAMpL,GAAaS,iBAAiB2K,EAC1C,CACF,CACA,OAAO,CACT,CAEA,MAAMC,EAAa,IAAIC,gBAAgB/C,OAAOlW,SAASsY,KAAK3H,WAAW,KAAOuF,OAAOlW,SAASsY,KAAKY,UAAU,GAAKhD,OAAOlW,SAASsY,MAC5HI,EAAe,IAAIO,gBAAgB/C,OAAOlW,SAASmN,QACnDgM,EAAYzc,GAAgBsc,EAAW/f,IAAIyD,IAAQgc,EAAazf,IAAIyD,GAEpE0c,EAAcD,EAAS,gBACvBE,EAAUF,EAAS,YACnB/kB,EAAQ+kB,EAAS,SAGvB,GAAI/kB,EACF,MAAM,IAAIgE,MAAM,eAAehE,KAIjC,IAAKglB,IAAgBC,EACnB,MAAM,IAAIjhB,MAAM,6CAIlBuV,GAAaC,eAAewL,GAC5BzL,GAAaO,WAAWmL,GAGxB,MAAMpK,EAAQ4D,KAAKyE,4BAA4B8B,GAE/C,GAAKnK,EAYE,CAEL,MAAMqK,QAAsBzG,KAAK8E,sBAAsByB,EAAanK,GACpE,IAAKqK,EACH,MAAM,IAAIlhB,MAAM,iCAElBuV,GAAaS,iBAAiBkL,EAChC,KAnBY,CAEV,MAAMtC,EAAYnE,KAAKuE,4BAA4BiC,GACnD,GAAyB,IAArBrC,EAAUxiB,OACZ,MAAM,IAAI4D,MAAM,yCAElB,MAAMmhB,EAAavC,EAAU,GAAG/H,MAC1BqK,QAAsBzG,KAAK8E,sBAAsByB,EAAaG,GACpE,IAAKD,EACH,MAAM,IAAIlhB,MAAM,iCAElBuV,GAAaS,iBAAiBkL,EAChC,CAaA,OAHA3L,GAAae,kBACbf,GAAaoB,mBAEN,CACT,OAAS3a,GAEP,MADAsB,QAAQtB,MAAM,+CAAgDA,GACxDA,CACR,CACF,CAKA,aAAOolB,GACL7L,GAAakC,WACbqG,OAAOlW,SAASuY,KAAO,GACzB,CAKA,kBAAekB,CAAY5L,GACzB,IACE,MAAMhX,EAAUgX,EAAMpT,MAAM,KAAK,GAC3Bif,EAAUzJ,KAAKpZ,GAGf8iB,EAAQ,IAAIpK,WAAWmK,EAAQllB,QACrC,IAAA,IAAS0K,EAAI,EAAGA,EAAIwa,EAAQllB,OAAQ0K,IAClCya,EAAMza,GAAKwa,EAAQE,WAAW1a,GAGhC,MAAM2a,EAAa,IAAIC,YAAY,SAASC,OAAOJ,GACnD,OAAO5J,KAAKC,MAAM6J,EACpB,CAAA,MACE,OAAO,IACT,CACF,CAKA,6BAAe1C,CAAuBkC,GACpC,MAAMxiB,EAAUgc,KAAK4G,YAAYJ,GACjC,OAAKxiB,EAEE,CACL2R,GAAI3R,EAAQmjB,SACZC,MAAOpjB,EAAQojB,MACf/jB,KAAMW,EAAQX,KACdgkB,WAAYrjB,EAAQqjB,WACpBC,UAAWtjB,EAAQ,eAPA,IASvB,CAKA,kCAAeugB,CAA4BiC,GACzC,MAAMxiB,EAAUgc,KAAK4G,YAAYJ,GACjC,IAAKxiB,EAAS,MAAO,GAErB,MAAMmgB,EAAuB,GA0B7B,OAvBAtf,OAAOyJ,KAAKtK,GAAS+a,QAAQlV,IAE3B,GADcA,EAAIrE,MAAM,cACa,iBAAjBxB,EAAQ6F,GAAmB,CAE7C,MAAMoU,EAAQja,EAAQ6F,GAAKjC,MAAM,KACjC,GAAIqW,EAAMtc,QAAU,EAClBwiB,EAAUzE,KAAK,CACbtD,MAAO6B,EAAM,GAAGxY,OAChBpC,KAAM4a,EAAM,GAAGxY,aAEZ,CAEL,MAAO2W,EAAO/Y,GAAQW,EAAQ6F,GAAKjC,MAAM,KACrCwU,GAAS/Y,GACX8gB,EAAUzE,KAAK,CACbtD,MAAOA,EAAM3W,OACbpC,KAAMA,EAAKoC,QAGjB,CACF,IAGK0e,CACT,CAKA,kCAAeM,CAA4B8B,GACzC,MAAMviB,EAAUgc,KAAK4G,YAAYL,GACjC,OAAOviB,GAAS4M,SAAW,IAC7B,CAKA,kCAAoBkU,CAAsByB,EAAqBnK,GAC7D,IACE,MAAM4I,EAAW/C,MACX3R,KAAEA,QAAM/O,SAAgByjB,EAASC,UAAUC,OAAO,iBAAkB,CACxEC,KAAM,CACJE,aAAckB,EACdnK,WAIJ,OAAI7a,GACFsB,QAAQtB,MAAM,+CAAgDA,GACvD,MAGJ+O,GAAM+U,aAKJ/U,EAAK+U,cAJVxiB,QAAQtB,MAAM,6CACP,KAIX,OAASA,GAEP,OADAsB,QAAQtB,MAAM,uCAAwCA,GAC/C,IACT,CACF,ECvTF,MAyBMgmB,GAAcC,EAAAA,mBAA2C,GAiJlDC,GAAU,KACrB,MAAMC,EAAUC,EAAAA,WAAWJ,IAC3B,QAAgB,IAAZG,EACF,MAAM,IAAIniB,MAAM,oDAElB,OAAOmiB,GClKIE,GAAgD,EAC3DjX,UAAU,SACVc,YAAY,GACZjD,eAEA,MAAOqI,EAAMgR,GAAWzQ,EAAAA,UAAS,IAC3B8M,KAAEA,GAASuD,MACXtD,UAAEA,EAAA/H,MAAWA,GAAUqL,KACvBK,EAAe1L,EACjB+H,GAAW4D,QAAgBC,EAAQ5L,QAAUA,IAAU+H,IAAY,IAAM,KACzEA,IAAY,IAAM,KAgBhB8D,EAbmB,MACvB,IAAK/D,GAAMkD,MAAO,MAAO,GASzB,MAAO,GAPS,SAAG9hB,GAAgB4iB,4BACpB,IAAI9B,gBAAgB,CACjCgB,MAAOlD,EAAKkD,MACZe,OAAQ,MACR/L,MAAO0L,GAAc1L,OAAS,KAGJiD,cAGV+I,GAGpB,IAAKlE,GAAMkD,QAAUU,EACnB,OAAO,KAGT,MAAMO,EAAgBnoB,EAAMsR,WAAoD,CAACzK,EAAO+C,IACtE,aAAZ6G,EAEA3B,EAAAA,KAAC,MAAA,CACClF,MACA2H,UAAU,4FACN1K,EAEJyH,SAAA,CAAAO,EAAAA,IAACuZ,EAAAA,cAAA,CAAc7W,UAAU,iBAAiB,cAO9CzC,EAAAA,KAACuC,EAAA,CACCzH,MACA6G,QAAQ,UACRO,KAAK,KACLO,UAAW,kCAAkCA,OACzC1K,EAEJyH,SAAA,CAAAO,EAAAA,IAACuZ,EAAAA,cAAA,CAAc7W,UAAU,iBAAiB,eAQhD,OAFA4W,EAAcnlB,YAAc,gBAG1B8L,EAAAA,KAAC0I,GAAA,CAAOb,OAAYC,aAAc+Q,EAChCrZ,SAAA,CAAAO,MAAC6I,GAAA,CAAclG,SAAO,EACpBlD,SAAAO,MAACsZ,QAGHrZ,EAAAA,KAACiJ,GAAA,CAAcxG,UAAU,2DACvBjD,SAAA,CAAAQ,EAAAA,KAACmJ,GAAA,CAAa1G,UAAU,UACtBjD,SAAA,CAAAO,EAAAA,IAACsJ,IAAY7J,SAAA,aACbO,EAAAA,IAACuJ,IAAkB9J,SAAA,wDAKrBO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,gBACbjD,SAAAO,EAAAA,IAAC,SAAA,CACCwZ,IAAKN,EACLO,MAAM,OACNC,OAAO,QACPhX,UAAU,kBACV+F,MAAM,yBACNkR,QAAQ,kBCzFdC,GAAOC,EAAAA,aASPC,GAAmB3oB,EAAMsnB,cAC7B,CAAA,GAgBIsB,GAAe,KACnB,MAAMC,EAAe7oB,EAAMynB,WAAWkB,IAChCG,EAAc9oB,EAAMynB,WAAWsB,KAC/BC,cAAEA,EAAAC,UAAeA,GAAcC,mBAE/BC,EAAaH,EAAcH,EAAa1lB,KAAM8lB,GAEpD,IAAKJ,EACH,MAAM,IAAIxjB,MAAM,kDAGlB,MAAMoQ,GAAEA,GAAOqT,EAEf,MAAO,CACLrT,KACAtS,KAAM0lB,EAAa1lB,KACnBimB,WAAY,GAAG3T,cACf4T,kBAAmB,GAAG5T,0BACtB6T,cAAe,GAAG7T,yBACf0T,IAQDJ,GAAkB/oB,EAAMsnB,cAC5B,CAAA,GAGIiC,GAAWvpB,EAAMsR,WAGrB,EAAGC,eAAc1K,GAAS+C,KAC1B,MAAM6L,EAAKzV,EAAMwpB,QAEjB,aACGT,GAAgBU,SAAhB,CAAyBziB,MAAO,CAAEyO,MACjCnH,SAAAO,EAAAA,IAAC,MAAA,CAAIjF,MAAU2H,UAAWxB,EAAG,YAAawB,MAAgB1K,QAIhE0iB,GAASvmB,YAAc,WAEvB,MAAM0mB,GAAY1pB,EAAMsR,WAGtB,EAAGC,eAAc1K,GAAS+C,KAC1B,MAAMvI,MAAEA,EAAA+nB,WAAOA,GAAeR,KAE9B,OACE/Z,EAAAA,IAAC6F,GAAA,CACC9K,MACA2H,UAAWxB,EAAG1O,GAAS,mBAAoBkQ,GAC3CiE,QAAS4T,KACLviB,MAIV6iB,GAAU1mB,YAAc,YAExB,MAAM2mB,GAAc3pB,EAAMsR,WAGxB,KAAMzK,GAAS+C,KACf,MAAMvI,MAAEA,EAAA+nB,WAAOA,EAAAC,kBAAYA,EAAAC,cAAmBA,GAAkBV,KAEhE,OACE/Z,EAAAA,IAAC6C,EAAAA,KAAA,CACC9H,MACA6L,GAAI2T,EACJ,mBACG/nB,EAEG,GAAGgoB,KAAqBC,IADxB,GAAGD,IAGT,iBAAgBhoB,KACZwF,MAIV8iB,GAAY3mB,YAAc,cAE1B,MAAM4mB,GAAkB5pB,EAAMsR,WAG5B,EAAGC,eAAc1K,GAAS+C,KAC1B,MAAMyf,kBAAEA,GAAsBT,KAE9B,OACE/Z,EAAAA,IAAC,IAAA,CACCjF,MACA6L,GAAI4T,EACJ9X,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,MAIV+iB,GAAgB5mB,YAAc,kBAE9B,MAAM6mB,GAAc7pB,EAAMsR,WAGxB,EAAGC,YAAWjD,cAAazH,GAAS+C,KACpC,MAAMvI,MAAEA,EAAAioB,cAAOA,GAAkBV,KAC3B3D,EAAO5jB,EAAQgB,OAAOhB,GAAOoM,SAAWa,EAE9C,OAAK2W,EAKHpW,EAAAA,IAAC,IAAA,CACCjF,MACA6L,GAAI6T,EACJ/X,UAAWxB,EAAG,uCAAwCwB,MAClD1K,EAEHyH,SAAA2W,IAVI,OAcX4E,GAAY7mB,YAAc,cC1J1B,MAAM8mB,GAAc,CAClB,EAAK,cACL,EAAK,cACL,EAAK,cACL,EAAK,cACL,EAAK,cACL,EAAK,cACL,WAAY,iDACZ,YAAa,mDAGTC,GAAa,CACjBC,GAAI,QACJ/Y,GAAI,QACJgZ,GAAI,QACJ/Y,GAAI,QACJgZ,GAAI,SAGC,SAASC,IAAK7b,SACnBA,EAAA8b,KACAA,EAAO,WAAAC,IACPA,EAAM,KAAA9Y,UACNA,IAEA,OACE1C,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,OACA+Z,GAAYM,GACZL,GAAWM,GACX9Y,GAGDjD,YAGP,CC1CA,MAAMgc,GAAatqB,EAAMsR,WAGvB,EAAGC,YAAWjD,cAAazH,GAAS+C,IACpCkF,EAAAA,KAACyb,EAAoB1Y,KAApB,CACCjI,MACA2H,UAAWxB,EAAG,2BAA4BwB,MACtC1K,EAEJyH,SAAA,CAAAO,EAAAA,IAAC0b,EAAoBC,SAApB,CAA6BjZ,UAAU,kCACrCjD,mBAEFmc,GAAA,IACD5b,MAAC0b,EAAoBG,OAApB,CAAA,OAGLJ,GAAWtnB,YAAcunB,EAAoB1Y,KAAK7O,YAElD,MAAMynB,GAAYzqB,EAAMsR,WAGtB,EAAGC,YAAWoZ,cAAc,cAAe9jB,GAAS+C,IACpDiF,EAAAA,IAAC0b,EAAoBK,oBAApB,CACChhB,MACA+gB,cACApZ,UAAWxB,EACT,gDACgB,aAAhB4a,GACE,qDACc,eAAhBA,GACE,uDACFpZ,MAEE1K,EAEJyH,SAAAO,EAAAA,IAAC0b,EAAoBM,gBAApB,CAAoCtZ,UAAU,8CAGnDkZ,GAAUznB,YAAcunB,EAAoBK,oBAAoB5nB,YClBhE,MAAM8nB,GAAQ,CAAAC,KACZA,EAAAA,KAAAC,MAAMA,EAAAA,MAAAC,KAAOA,EAAAA,KAAAC,KAAMA,EAAAA,KAAAC,SAAMA,EAAAA,SAAAC,KAAUA,EAAAA,KAAAC,MAAMA,EAAAA,MAAAC,SAAOA,EAAAA,SAAAC,OAChDA,EAAAA,OAAAC,OAAQA,EAAAA,OAAAC,MAAQA,EAAAA,MAAAC,MAAOA,EAAAA,MAAAC,MAAOA,EAAAA,MAAAC,KAAOA,EAAAA,KAAAC,SAAMA,EAAAA,SAAAxR,OAC3CA,EAAAA,OAAAyR,OAAQA,EAAAA,OAAAC,KAAQA,EAAAA,KAAAC,OAAMA,EAAAA,OAAAC,KAAQA,EAAAA,KAAAC,MAAMA,EAAAA,MAAAxS,MAAOA,EAAAA,MAAA1B,EAAOA,EAAAA,EAAAmU,YAClDA,EAAAA,YAAAC,UAAaA,EAAAA,UAAAC,YAAWA,EAAAA,YAAAtY,aAAaA,EAAAA,aAAAuY,QACrCA,EAAAA,QAAAC,UAASA,EAAAA,UAAAC,UAAWA,EAAAA,UAAAC,WAAWA,EAAAA,WAAAC,MAC/BA,EAAAA,MAAAC,KAAOA,EAAAA,KAAArS,YAAMA,EAAAA,YAAAsS,KAAaA,EAAAA,KAAAC,WAAMA,EAAAA,WAAAC,SAChCA,EAAAA,SAAAC,OAAUA,EAAAA,OAAAC,MAAQA,EAAAA,MAAAC,KAAOA,EAAAA,KAAAC,KACzBA,EAAAA,KAAAC,SAAMA,EAAAA,SAAAC,OAAUA,EAAAA,OAAAC,WAAQA,EAAAA,WAAAC,QAAYA,EAAAA,QAAAC,KACpCA,EAAAA,KAAAC,OAAMA,EAAAA,OAAAC,IAAQA,EAAAA,IAAAC,OAAKA,EAAAA,OAAAC,OAAQA,EAAAA,OAAAC,IAAQA,EAAAA,IAAAC,IACnCA,EAAAA,IAAAC,MAAKA,EAAAA,MAAAC,SAAOA,EAAAA,SAAAC,MAAUA,EAAAA,MAAAC,OAAOA,EAAAA,OAAAC,OAAQA,EAAAA,QAG1BC,GAAwC,EACnDnnB,QAAQ,OACRoO,WACAC,YAEA,MAAO+Y,EAAYC,GAAiBnX,EAAAA,SAAS,IAEvCoX,EAAgB3pB,OAAO8H,QAAQqe,IAAOvc,OAAO,EAAEpL,KACnDA,EAAKorB,cAAcvmB,SAASomB,EAAWG,gBAGnCC,EAAe1D,GAAM9jB,IAAgC+jB,EAAAA,KAE3D,OACEjc,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACZjD,SAAA,CAAA+G,GAASxG,EAAAA,IAAC6F,IAAOpG,SAAA+G,WACjBT,GAAA,CACCtG,SAAA,CAAAO,EAAAA,IAACiG,GAAA,CAAetD,SAAO,EACrBlD,SAAAQ,EAAAA,KAACuC,EAAA,CACCZ,QAAQ,UACRc,UAAU,6CAEVjD,SAAA,CAAAO,EAAAA,IAAC2f,EAAA,CAAajd,UAAU,iBACvBvK,aAGJ+N,GAAA,CAAexD,UAAU,OACxBjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACbjD,SAAA,CAAAQ,OAAC,MAAA,CACCR,SAAA,CAAAO,EAAAA,IAAC6F,GAAA,CAAMc,QAAQ,cAAclH,SAAA,iBAC7BO,EAAAA,IAAC2F,GAAA,CACCiB,GAAG,cACH8B,YAAY,4BACZvQ,MAAOonB,EACPhZ,SAAWlM,GAAMmlB,EAAcnlB,EAAEwM,OAAO1O,YAG5C6H,EAAAA,IAACyb,GAAA,CAAW/Y,UAAU,OACpBjD,eAAC,MAAA,CAAIiD,UAAU,yBACZjD,SAAAggB,EAAcnsB,IAAI,EAAEgB,EAAMuX,KACzB7L,EAAAA,IAAC,SAAA,CAEC0C,UAAW,8CACTvK,IAAU7D,EAAO,+BAAiC,iBAEpDyS,QAAS,IAAMR,IAAWjS,GAC1BmU,MAAOnU,EAEPmL,SAAAO,EAAAA,IAAC6L,EAAA,CAAcnJ,UAAU,aAPpBpO,oBCzEnBsrB,GAAWzuB,EAAMsR,WAGrB,EAAGC,YAAWmd,wBAAuB7nB,GAAS+C,IAC9CiF,EAAAA,IAAC8f,EAAAA,SAAA,CACC/kB,MACA8kB,mBAAoB3e,EAClB,qDACA2e,GAEFnd,UAAWxB,EAAG,8BAA+BwB,MACzC1K,KAGR4nB,GAASzrB,YAAc,WAEvB,MAAM4rB,GAAgB5uB,EAAMsR,WAG1B,EAAGC,eAAc1K,GAAS+C,UACzB,MAAA,CAAIA,MAAU2H,UAAWxB,EAAG,oBAAqBwB,MAAgB1K,KAEpE+nB,GAAc5rB,YAAc,gBAE5B,MAAM6rB,GAAe7uB,EAAMsR,WAGzB,EAAGmO,QAAOlO,eAAc1K,GAAS+C,KACjC,MAAMklB,EAAkB9uB,EAAMynB,WAAWsH,oBACnCC,KAAEA,EAAAC,aAAMA,EAAAC,SAAcA,GAAaJ,EAAgBK,MAAM1P,GAE/D,OACE3Q,EAAAA,KAAC,MAAA,CACClF,MACA2H,UAAWxB,EACT,gKACAmf,GAAY,+CACZ3d,MAEE1K,EAEHyH,SAAA,CAAA0gB,EACAC,SACE,MAAA,CAAI1d,UAAU,wEACbjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,oEAMzBsd,GAAa7rB,YAAc,eAE3B,MAAMosB,GAAoBpvB,EAAMsR,WAG9B,KAAMzK,GAAS+C,UACd,MAAA,CAAIA,MAAUsJ,KAAK,eAAgBrM,EAClCyH,SAAAO,MAACwgB,EAAAA,IAAA,CAAA,MAGLD,GAAkBpsB,YAAc,oBC1DhC,MAAMssB,GAAc,CAClBre,GAAI,UACJgZ,GAAI,UACJ/Y,GAAI,WAGC,SAASqe,IAAQve,KAAEA,EAAO,KAAAO,UAAMA,IACrC,OACE1C,EAAAA,IAAC2gB,EAAAA,QAAA,CACCje,UAAWxB,EACT,qCACAuf,GAAYte,GACZO,IAIR,CClBA,MAAMke,GAAa,EAAGle,eAAc1K,KAClCgI,EAAAA,IAAC,MAAA,CACCqE,KAAK,aACL,aAAW,aACX3B,UAAWxB,EAAG,qCAAsCwB,MAChD1K,IAGR4oB,GAAWzsB,YAAc,aAEzB,MAAM0sB,GAAoB1vB,EAAMsR,WAG9B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EAAG,mCAAoCwB,MAC9C1K,KAGR6oB,GAAkB1sB,YAAc,oBAEhC,MAAM2sB,GAAiB3vB,EAAMsR,WAG3B,EAAGC,eAAc1K,GAAS+C,UACzB,KAAA,CAAGA,MAAU2H,UAAWxB,EAAG,GAAIwB,MAAgB1K,KAElD8oB,GAAe3sB,YAAc,iBAO7B,MAAM4sB,GAAiB,EACrBre,YACA2d,WACAle,OAAO,UACJnK,KAEHgI,EAAAA,IAAC,IAAA,CACC,eAAcqgB,EAAW,YAAS,EAClC3d,UAAWxB,EACTO,EAAe,CACbG,QAASye,EAAW,UAAY,QAChCle,SAEFO,MAEE1K,IAGR+oB,GAAe5sB,YAAc,iBAE7B,MAAM6sB,GAAqB,EACzBte,eACG1K,KAEHiI,EAAAA,KAAC8gB,GAAA,CACC,aAAW,sBACX5e,KAAK,UACLO,UAAWxB,EAAG,eAAgBwB,MAC1B1K,EAEJyH,SAAA,CAAAO,EAAAA,IAACwd,EAAAA,YAAA,CAAY9a,UAAU,YACvB1C,EAAAA,IAAC,QAAKP,SAAA,gBAGVuhB,GAAmB7sB,YAAc,qBAEjC,MAAM8sB,GAAiB,EACrBve,eACG1K,KAEHiI,EAAAA,KAAC8gB,GAAA,CACC,aAAW,kBACX5e,KAAK,UACLO,UAAWxB,EAAG,eAAgBwB,MAC1B1K,EAEJyH,SAAA,CAAAO,EAAAA,IAAC,QAAKP,SAAA,SACNO,EAAAA,IAACkF,EAAAA,aAAA,CAAaxC,UAAU,eAG5Bue,GAAe9sB,YAAc,iBAE7B,MAAM+sB,GAAqB,EACzBxe,eACG1K,KAEHiI,EAAAA,KAAC,OAAA,CACC,eAAW,EACXyC,UAAWxB,EAAG,2CAA4CwB,MACtD1K,EAEJyH,SAAA,CAAAO,EAAAA,IAACoF,EAAAA,eAAA,CAAe1C,UAAU,YAC1B1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,UAAUjD,SAAA,kBAG9ByhB,GAAmB/sB,YAAc,qBCpGjC,MAAMgtB,GAASC,EAAgBpe,KAEzBqe,GAAcD,EAAgBxX,MAE9B0X,GAAcF,EAAgBG,MAE9BC,GAAgBrwB,EAAMsR,WAG1B,EAAGC,YAAWjD,cAAazH,GAAS+C,IACpCkF,EAAAA,KAACmhB,EAAgBle,QAAhB,CACCnI,MACA2H,UAAWxB,EACT,kTACAwB,MAEE1K,EAEHyH,SAAA,CAAAA,EACDO,EAAAA,IAACohB,EAAgBK,KAAhB,CAAqB9e,SAAO,EAC3BlD,SAAAO,EAAAA,IAACsd,EAAAA,YAAA,CAAY5a,UAAU,6BAI7B8e,GAAcrtB,YAAcitB,EAAgBle,QAAQ/O,YAEpD,MAAMutB,GAAuBvwB,EAAMsR,WAGjC,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACohB,EAAgBO,eAAhB,CACC5mB,MACA2H,UAAWxB,EACT,uDACAwB,MAEE1K,EAEJyH,SAAAO,EAAAA,IAACud,EAAAA,UAAA,CAAU7a,UAAU,eAGzBgf,GAAqBvtB,YAAcitB,EAAgBO,eAAextB,YAElE,MAAMytB,GAAyBzwB,EAAMsR,WAGnC,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACohB,EAAgBS,iBAAhB,CACC9mB,MACA2H,UAAWxB,EACT,uDACAwB,MAEE1K,EAEJyH,SAAAO,EAAAA,IAACsd,EAAAA,YAAA,CAAY5a,UAAU,eAG3Bkf,GAAuBztB,YACrBitB,EAAgBS,iBAAiB1tB,YAEnC,MAAM2tB,GAAgB3wB,EAAMsR,WAG1B,EAAGC,YAAWjD,WAAUsiB,WAAW,YAAa/pB,GAAS+C,IACzDiF,EAAAA,IAACohB,EAAgBhe,OAAhB,CACC3D,SAAAQ,EAAAA,KAACmhB,EAAgB5d,QAAhB,CACCzI,MACA2H,UAAWxB,EACT,scACa,WAAb6gB,GACE,kIACFrf,GAEFqf,cACI/pB,EAEJyH,SAAA,CAAAO,EAAAA,IAAC0hB,GAAA,IACD1hB,EAAAA,IAACohB,EAAgBzF,SAAhB,CACCjZ,UAAWxB,EACT,MACa,WAAb6gB,GACE,2FAGHtiB,mBAEFmiB,GAAA,CAAA,SAIPE,GAAc3tB,YAAcitB,EAAgB5d,QAAQrP,YAEpD,MAAM6tB,GAAc7wB,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACohB,EAAgBvb,MAAhB,CACC9K,MACA2H,UAAWxB,EAAG,yCAA0CwB,MACpD1K,KAGRgqB,GAAY7tB,YAAcitB,EAAgBvb,MAAM1R,YAEhD,MAAM8tB,GAAa9wB,EAAMsR,WAGvB,EAAGC,YAAWjD,cAAazH,GAAS+C,IACpCkF,EAAAA,KAACmhB,EAAgBzZ,KAAhB,CACC5M,MACA2H,UAAWxB,EACT,4NACAwB,MAEE1K,EAEJyH,SAAA,CAAAO,EAAAA,IAAC,OAAA,CAAK0C,UAAU,+DACdjD,SAAAO,EAAAA,IAACohB,EAAgBxW,cAAhB,CACCnL,SAAAO,EAAAA,IAAC6K,QAAA,CAAMnI,UAAU,gBAIrB1C,EAAAA,IAACohB,EAAgBc,SAAhB,CAA0BziB,iBAG/BwiB,GAAW9tB,YAAcitB,EAAgBzZ,KAAKxT,YAE9C,MAAMguB,GAAkBhxB,EAAMsR,WAG5B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACohB,EAAgBjW,UAAhB,CACCpQ,MACA2H,UAAWxB,EAAG,2BAA4BwB,MACtC1K,KAGRmqB,GAAgBhuB,YAAcitB,EAAgBjW,UAAUhX,YC3IxD,MAAMgX,GAAYha,EAAMsR,WAItB,EACIC,YAAWoZ,cAAc,aAAcsG,cAAa,KAASpqB,GAC/D+C,IAEAiF,EAAAA,IAACqiB,EAAmBrf,KAAnB,CACCjI,MACAqnB,aACAtG,cACApZ,UAAWxB,EACT,qBACgB,eAAhB4a,EAA+B,iBAAmB,iBAClDpZ,MAEE1K,KAIVmT,GAAUhX,YAAckuB,EAAmBrf,KAAK7O,YCnBhD,MAAMmuB,GAAQC,EAAevf,KAEvBwf,GAAeD,EAAerf,QAE9Buf,GAAaF,EAAevZ,MAE5B0Z,GAAcH,EAAenf,OAE7Buf,GAAexxB,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACuiB,EAAejf,QAAf,CACCZ,UAAWxB,EACT,0JACAwB,MAEE1K,EACJ+C,SAGJ4nB,GAAaxuB,YAAcouB,EAAejf,QAAQnP,YAElD,MAAMyuB,GAAgBlhB,EAAAA,IACpB,mMACA,CACEC,SAAU,CACRkhB,KAAM,CACJC,IAAK,oGACLC,OACE,6GACFC,KAAM,gIACNC,MACE,sIAGN1gB,gBAAiB,CACfsgB,KAAM,WASNK,GAAe/xB,EAAMsR,WAGzB,EAAGogB,OAAO,QAASngB,YAAWjD,cAAazH,GAAS+C,WACnD2nB,GAAA,CACCjjB,SAAA,CAAAO,EAAAA,IAAC2iB,GAAA,IACD1iB,EAAAA,KAACsiB,EAAe/e,QAAf,CACCzI,MACA2H,UAAWxB,EAAG0hB,GAAc,CAAEC,SAASngB,MACnC1K,EAEHyH,SAAA,CAAAA,EACDQ,EAAAA,KAACsiB,EAAevZ,MAAf,CAAqBtG,UAAU,2OAC9BjD,SAAA,CAAAO,EAAAA,IAACmJ,EAAAA,EAAA,CAAEzG,UAAU,YACb1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,UAAUjD,SAAA,oBAKlCyjB,GAAa/uB,YAAcouB,EAAe/e,QAAQrP,YAElD,MAAMgvB,GAAc,EAClBzgB,eACG1K,KAEHgI,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,mDACAwB,MAEE1K,IAGRmrB,GAAYhvB,YAAc,cAE1B,MAAMivB,GAAc,EAClB1gB,eACG1K,KAEHgI,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,gEACAwB,MAEE1K,IAGRorB,GAAYjvB,YAAc,cAE1B,MAAMkvB,GAAalyB,EAAMsR,WAGvB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACuiB,EAAe3e,MAAf,CACC7I,MACA2H,UAAWxB,EAAG,wCAAyCwB,MACnD1K,KAGRqrB,GAAWlvB,YAAcouB,EAAe3e,MAAMzP,YAE9C,MAAMmvB,GAAmBnyB,EAAMsR,WAG7B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACuiB,EAAeze,YAAf,CACC/I,MACA2H,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,KAGRsrB,GAAiBnvB,YAAcouB,EAAeze,YAAY3P,YCtH1D,MAAMovB,GAAkBC,EAAiB5I,SAEnC6I,GAAUD,EAAiBxgB,KAE3B0gB,GAAiBF,EAAiBtgB,QAElCygB,GAAiBxyB,EAAMsR,WAG3B,EAAGC,YAAW0D,aAAa,KAAMpO,GAAS+C,IAC1CiF,EAAAA,IAACwjB,EAAiBhgB,QAAjB,CACCzI,MACAqL,aACA1D,UAAWxB,EACT,qYACAwB,MAEE1K,KAGR2rB,GAAexvB,YAAcqvB,EAAiBhgB,QAAQrP,YCTtD,MAAMyvB,GAAsB,gBAgBtBC,GAAiB1yB,EAAMsnB,cAAqC,MAElE,SAASqL,KACP,MAAMnL,EAAUxnB,EAAMynB,WAAWiL,IACjC,IAAKlL,EACH,MAAM,IAAIniB,MAAM,qDAGlB,OAAOmiB,CACT,CAEA,MAAMoL,GAAkB5yB,EAAMsR,WAQ5B,EAEIuhB,eAAc,EACdlc,KAAMmc,EACNlc,aAAcmc,EACdxhB,YACA+D,QACAhH,cACGzH,GAEL+C,KAEA,MAAOopB,EAAUC,GAAejzB,EAAMkX,UAAS,GAE/ClX,EAAMmX,UAAU,KACd,MAAM+b,EAAc,IAAMD,EAAY9P,OAAOgQ,WAAa,KAG1D,OAFAD,IACA/P,OAAOiQ,iBAAiB,SAAUF,GAC3B,IAAM/P,OAAOkQ,oBAAoB,SAAUH,IACjD,IACH,MAAOI,EAAYC,GAAiBvzB,EAAMkX,UAAS,IAI5Csc,EAAOC,GAAYzzB,EAAMkX,SAAS,KACvC,GAAsB,oBAAXiM,OAAwB,CACjC,MAAMuQ,EAAS3Y,aAAaG,QAAQuX,IACpC,OAAkB,OAAXiB,EAA6B,SAAXA,EAAoBb,CAC/C,CACA,OAAOA,IAEHlc,EAAOmc,GAAYU,EACnB7L,EAAU3nB,EAAM2zB,YACnB3sB,IACC,MAAM4sB,EAA6B,mBAAV5sB,EAAuBA,EAAM2P,GAAQ3P,EAC1D+rB,EACFA,EAAYa,GAEZH,EAASG,GAIW,oBAAXzQ,QACTpI,aAAaC,QAAQyX,GAAqBpwB,OAAOuxB,KAGrD,CAACb,EAAapc,IAIVkd,EAAgB7zB,EAAM2zB,YAAY,IAC/BX,EACHO,EAAe5c,IAAUA,GACzBgR,EAAShR,IAAUA,GACtB,CAACqc,EAAUrL,EAAS4L,IAGvBvzB,EAAMmX,UAAU,KACd,MAAM2c,EAAiBC,IAzFK,MA2FxBA,EAAMpqB,MACLoqB,EAAMC,SAAWD,EAAME,WAExBF,EAAMG,iBACNL,MAKJ,OADA1Q,OAAOiQ,iBAAiB,UAAWU,GAC5B,IAAM3Q,OAAOkQ,oBAAoB,UAAWS,IAClD,CAACD,IAIJ,MAAMrY,EAAQ7E,EAAO,WAAa,YAE5Bwd,EAAen0B,EAAMo0B,QACzB,KAAA,CACE5Y,QACA7E,OACAgR,UACAqL,WACAM,aACAC,gBACAM,kBAEF,CAACrY,EAAO7E,EAAMgR,EAASqL,EAAUM,EAAYC,EAAeM,IAG9D,OACEhlB,EAAAA,IAAC6jB,GAAejJ,SAAf,CAAwBziB,MAAOmtB,EAC9B7lB,SAAAO,EAAAA,IAACujB,GAAA,CAAgBiC,cAAe,EAC9B/lB,SAAAO,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,sGACAwB,GAEF+D,MACE,CACE,kBArIM,QAsIN,uBApIW,UAqIRA,GAGP1L,SACI/C,EAEHyH,mBAObskB,GAAgB5vB,YAAc,kBAE9B,MAAMsxB,GAAUt0B,EAAMsR,WAQpB,EAEIogB,OAAO,OACPjhB,UAAU,UACV8jB,cAAc,YACdhjB,YACAjD,cACGzH,GAEL+C,KAEA,MAAMopB,SAAEA,EAAAxX,MAAUA,EAAA8X,WAAOA,EAAAC,cAAYA,GAAkBZ,KAEvD,MAAoB,SAAhB4B,EAEA1lB,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,8EACAwB,GAEF3H,SACI/C,EAEHyH,aAKH0kB,QAEC7B,GAAA,CAAMxa,KAAM2c,EAAY1c,aAAc2c,KAAmB1sB,EACxDyH,SAAAQ,EAAAA,KAACijB,GAAA,CACC,eAAa,UACb,cAAY,OACZxgB,UAAU,8FACV+D,MACE,CACE,kBAlMa,SAqMjBoc,OAEApjB,SAAA,CAAAO,EAAAA,IAACqjB,GAAA,CAAW3gB,UAAU,UAAUjD,SAAA,sBAChCO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,8BAA+BjD,kBAOpDQ,EAAAA,KAAC,MAAA,CACClF,MACA2H,UAAU,qDACV,aAAYiK,EACZ,mBAA4B,cAAVA,EAAwB+Y,EAAc,GACxD,eAAc9jB,EACd,YAAWihB,EAGXpjB,SAAA,CAAAO,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,gGACA,yCACA,qCACY,aAAZU,GAAsC,UAAZA,EACtB,uFACA,4DAGR5B,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,uHACS,SAAT2hB,EACI,iFACA,mFAEQ,aAAZjhB,GAAsC,UAAZA,EACtB,gGACA,0HACJc,MAEE1K,EAEJyH,SAAAO,EAAAA,IAAC,MAAA,CACC,eAAa,UACb0C,UAAU,gNAETjD,oBAObgmB,GAAQtxB,YAAc,UAEtB,MAAMwxB,GAAiBx0B,EAAMsR,WAG3B,EAAGC,YAAWqE,aAAY/O,GAAS+C,KACnC,MAAMiqB,cAAEA,GAAkBlB,KAE1B,OACE7jB,EAAAA,KAACuC,EAAA,CACCzH,MACA,eAAa,UACb6G,QAAQ,QACRO,KAAK,OACLO,UAAWxB,EAAG,UAAWwB,GACzBqE,QAAUme,IACRne,IAAUme,GACVF,QAEEhtB,EAEJyH,SAAA,CAAAO,EAAAA,IAAC4lB,EAAAA,UAAA,IACD5lB,EAAAA,IAAC,OAAA,CAAK0C,UAAU,UAAUjD,SAAA,wBAIhCkmB,GAAexxB,YAAc,iBAE7B,MAAM0xB,GAAc10B,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,KAC1B,MAAMiqB,cAAEA,GAAkBlB,KAE1B,OACE9jB,EAAAA,IAAC,SAAA,CACCjF,MACA,eAAa,OACb,aAAW,iBACX+qB,UAAU,EACV/e,QAASie,EACTvc,MAAM,iBACN/F,UAAWxB,EACT,kPACA,6EACA,yHACA,0JACA,4DACA,4DACAwB,MAEE1K,MAIV6tB,GAAY1xB,YAAc,cAE1B,MAAM4xB,GAAe50B,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAExBiF,EAAAA,IAAC,OAAA,CACCjF,MACA2H,UAAWxB,EACT,wDACA,+QACAwB,MAEE1K,KAIV+tB,GAAa5xB,YAAc,eAE3B,MAAM6xB,GAAe70B,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAExBiF,EAAAA,IAAC2F,GAAA,CACC5K,MACA,eAAa,QACb2H,UAAWxB,EACT,4FACAwB,MAEE1K,KAIVguB,GAAa7xB,YAAc,eAE3B,MAAM8xB,GAAgB90B,EAAMsR,WAG1B,EAAGC,eAAc1K,GAAS+C,IAExBiF,EAAAA,IAAC,MAAA,CACCjF,MACA,eAAa,SACb2H,UAAWxB,EAAG,0BAA2BwB,MACrC1K,KAIViuB,GAAc9xB,YAAc,gBAE5B,MAAM+xB,GAAgB/0B,EAAMsR,WAG1B,EAAGC,eAAc1K,GAAS+C,IAExBiF,EAAAA,IAAC,MAAA,CACCjF,MACA,eAAa,SACb2H,UAAWxB,EAAG,0BAA2BwB,MACrC1K,KAIVkuB,GAAc/xB,YAAc,gBAE5B,MAAMgyB,GAAmBh1B,EAAMsR,WAG7B,EAAGC,eAAc1K,GAAS+C,IAExBiF,EAAAA,IAACmL,GAAA,CACCpQ,MACA,eAAa,YACb2H,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,KAIVmuB,GAAiBhyB,YAAc,mBAE/B,MAAMiyB,GAAiBj1B,EAAMsR,WAG3B,EAAGC,eAAc1K,GAAS+C,IAExBiF,EAAAA,IAAC,MAAA,CACCjF,MACA,eAAa,UACb2H,UAAWxB,EACT,iGACAwB,MAEE1K,KAIVouB,GAAejyB,YAAc,iBAE7B,MAAMkyB,GAAel1B,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAExBiF,EAAAA,IAAC,MAAA,CACCjF,MACA,eAAa,QACb2H,UAAWxB,EAAG,4CAA6CwB,MACvD1K,KAIVquB,GAAalyB,YAAc,eAE3B,MAAMmyB,GAAoBn1B,EAAMsR,WAG9B,EAAGC,YAAWC,WAAU,KAAU3K,GAAS+C,KAC3C,MAAM6H,EAAOD,EAAUE,EAAAA,KAAO,MAE9B,OACE7C,EAAAA,IAAC4C,EAAA,CACC7H,MACA,eAAa,cACb2H,UAAWxB,EACT,qOACA,8EACAwB,MAEE1K,MAIVsuB,GAAkBnyB,YAAc,oBAEhC,MAAMoyB,GAAqBp1B,EAAMsR,WAG/B,EAAGC,YAAWC,WAAU,KAAU3K,GAAS+C,KAC3C,MAAM6H,EAAOD,EAAUE,EAAAA,KAAO,SAE9B,OACE7C,EAAAA,IAAC4C,EAAA,CACC7H,MACA,eAAa,eACb2H,UAAWxB,EACT,2RAEA,gDACA,uCACAwB,MAEE1K,MAIVuuB,GAAmBpyB,YAAc,qBAEjC,MAAMqyB,GAAsBr1B,EAAMsR,WAGhC,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA,eAAa,gBACb2H,UAAWxB,EAAG,iBAAkBwB,MAC5B1K,KAGRwuB,GAAoBryB,YAAc,sBAElC,MAAMsyB,GAAct1B,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA,eAAa,OACb2H,UAAWxB,EAAG,qCAAsCwB,MAChD1K,KAGRyuB,GAAYtyB,YAAc,cAE1B,MAAMuyB,GAAkBv1B,EAAMsR,WAG5B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA,eAAa,YACb2H,UAAWxB,EAAG,2BAA4BwB,MACtC1K,KAGR0uB,GAAgBvyB,YAAc,kBAE9B,MAAMwyB,GAA4BjlB,EAAAA,IAChC,u4BACA,CACEC,SAAU,CACRC,QAAS,CACPC,QAAS,+DACTE,QACE,gLAEJI,KAAM,CACJN,QAAS,eACTO,GAAI,cACJC,GAAI,oDAGRE,gBAAiB,CACfX,QAAS,UACTO,KAAM,aAKNykB,GAAoBz1B,EAAMsR,WAQ9B,EAEIE,WAAU,EACV0d,YAAW,EACXze,UAAU,UACVO,OAAO,UACP0kB,UACAnkB,eACG1K,GAEL+C,KAEA,MAAM6H,EAAOD,EAAUE,EAAAA,KAAO,UACxBshB,SAAEA,EAAAxX,MAAUA,GAAUmX,KAEtBgD,EACJ9mB,EAAAA,IAAC4C,EAAA,CACC7H,MACA,eAAa,cACb,YAAWoH,EACX,cAAake,EACb3d,UAAWxB,EAAGylB,GAA0B,CAAE/kB,UAASO,SAASO,MACxD1K,IAIR,OAAK6uB,GAIkB,iBAAZA,IACTA,EAAU,CACRpnB,SAAUonB,WAKXpD,GAAA,CACChkB,SAAA,CAAAO,EAAAA,IAAC0jB,GAAA,CAAe/gB,SAAO,EAAElD,SAAAqnB,IACzB9mB,EAAAA,IAAC2jB,GAAA,CACCd,KAAK,QACL1c,MAAM,SACN4gB,OAAkB,cAAVpa,GAAyBwX,KAC7B0C,QAhBDC,IAsBbF,GAAkBzyB,YAAc,oBAEhC,MAAM6yB,GAAoB71B,EAAMsR,WAM9B,EAAGC,YAAWC,WAAU,EAAOskB,eAAc,KAAUjvB,GAAS+C,KAChE,MAAM6H,EAAOD,EAAUE,EAAAA,KAAO,SAE9B,OACE7C,EAAAA,IAAC4C,EAAA,CACC7H,MACA,eAAa,cACb2H,UAAWxB,EACT,iVAEA,gDACA,wCACA,+CACA,0CACA,uCACA+lB,GACE,2LACFvkB,MAEE1K,MAIVgvB,GAAkB7yB,YAAc,oBAEhC,MAAM+yB,GAAmB/1B,EAAMsR,WAG7B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,MAAA,CACCjF,MACA,eAAa,aACb2H,UAAWxB,EACT,yKACA,2HACA,wCACA,+CACA,0CACA,uCACAwB,MAEE1K,KAGRkvB,GAAiB/yB,YAAc,mBAE/B,MAAMgzB,GAAsBh2B,EAAMsR,WAKhC,EAAGC,YAAW0kB,YAAW,KAAUpvB,GAAS+C,KAE5C,MAAM0e,EAAQtoB,EAAMo0B,QAAQ,IACnB,GAAGxS,KAAKC,MAAsB,GAAhBD,KAAKsU,UAAiB,MAC1C,IAEH,OACEpnB,EAAAA,KAAC,MAAA,CACClF,MACA,eAAa,gBACb2H,UAAWxB,EAAG,8CAA+CwB,MACzD1K,EAEHyH,SAAA,CAAA2nB,GACCpnB,EAAAA,IAAC,MAAA,CACC0C,UAAU,oBACV,eAAa,uBAGjB1C,EAAAA,IAAC,MAAA,CACC0C,UAAU,qDACV,eAAa,qBACb+D,MACE,CACE,mBAAoBgT,UAOhC0N,GAAoBhzB,YAAc,sBAElC,MAAMmzB,GAAiBn2B,EAAMsR,WAG3B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA,eAAa,WACb2H,UAAWxB,EACT,iGACA,uCACAwB,MAEE1K,KAGRsvB,GAAenzB,YAAc,iBAE7B,MAAMozB,GAAqBp2B,EAAMsR,WAG/B,KAAMzK,GAAS+C,IAAQiF,EAAAA,IAAC,KAAA,CAAGjF,SAAc/C,KAC3CuvB,GAAmBpzB,YAAc,qBAEjC,MAAMqzB,GAAuBr2B,EAAMsR,WAOjC,EAAGE,WAAU,EAAOR,OAAO,KAAMke,WAAU3d,eAAc1K,GAAS+C,KAClE,MAAM6H,EAAOD,EAAUE,EAAAA,KAAO,IAE9B,OACE7C,EAAAA,IAAC4C,EAAA,CACC7H,MACA,eAAa,kBACb,YAAWoH,EACX,cAAake,EACb3d,UAAWxB,EACT,8eACA,yFACS,OAATiB,GAAiB,UACR,OAATA,GAAiB,UACjB,uCACAO,MAEE1K,MCpuBV,SAASyvB,IAAS/kB,UAChBA,KACG1K,IAEH,OACEgI,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EAAG,oCAAqCwB,MAC/C1K,GAGV,CCIO,SAAS0vB,IAAcC,KAAEA,EAAO,EAAAC,QAAGA,EAAU,IAClD,aACG,MAAA,CAAIllB,UAAU,SACbjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,oBACbjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,iCACbjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,iBACZjD,SAAA3M,MAAM+0B,KAAK,CAAEj1B,OAAQg1B,IAAWt0B,IAAI,CAACw0B,EAAGxqB,IACvC0C,EAAAA,IAACynB,GAAA,CAAiB/kB,UAAU,YAAbpF,cAIpB,MAAA,CACEmC,SAAA3M,MAAM+0B,KAAK,CAAEj1B,OAAQ+0B,IAAQr0B,IAAI,CAACw0B,EAAGxqB,IACpC0C,MAAC,MAAA,CAAY0C,UAAU,mCACrBjD,SAAAO,MAAC,OAAI0C,UAAU,iBACZjD,SAAA3M,MAAM+0B,KAAK,CAAEj1B,OAAQg1B,IAAWt0B,IAAI,CAACw0B,EAAGC,UACtCN,GAAA,CAAiB/kB,UAAU,YAAbqlB,OAHXzqB,UAYtB,CAEO,SAAS0qB,IAAa7Y,MAAEA,EAAQ,IACrC,aACG,MAAA,CAAIzM,UAAU,YACZjD,SAAA3M,MAAM+0B,KAAK,CAAEj1B,OAAQuc,IAAS7b,IAAI,CAACw0B,EAAGxqB,WACpC+H,GAAA,CACC5F,SAAA,CAAAQ,OAACqF,GAAA,CACC7F,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,cACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,iBAEtB1C,MAACyF,GAAA,CACChG,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACbjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,eACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,qBARfpF,KAenB,CF4qBAkqB,GAAqBrzB,YAAc,uBG7tBnC,MAAM+mB,GAAa,CACjBC,GAAI,QACJ/Y,GAAI,QACJgZ,GAAI,QACJ/Y,GAAI,QACJgZ,GAAI,SAGA4M,GAAe,CACnBC,MAAO,cACPC,OAAQ,eACRC,IAAK,YACLC,QAAS,iBAGLC,GAAiB,CACrBJ,MAAO,gBACPC,OAAQ,iBACRC,IAAK,cACLG,QAAS,kBACTC,OAAQ,iBACRC,OAAQ,kBAGH,SAASC,IAAMjpB,SACpBA,EAAAkpB,UACAA,EAAY,SAAAnN,IACZA,EAAM,KAAArV,MACNA,EAAQ,UAAAyiB,QACRA,EAAU,QAAAC,KACVA,GAAO,EAAAnmB,UACPA,IAEA,OACE1C,EAAAA,IAAC,MAAA,CACC0C,UAAWxB,EACT,OACc,WAAdynB,EAAyB,WAAa,WACtCzN,GAAWM,GACXyM,GAAa9hB,GACbmiB,GAAeM,GACfC,GAAQ,YACRnmB,GAGDjD,YAGP,CCzDA,MAAMqpB,GAAQ33B,EAAMsR,WAGlB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,QAAA,CACCjF,MACA2H,UAAWxB,EAAG,gCAAiCwB,MAC3C1K,KAGR8wB,GAAM30B,YAAc,QAEpB,MAAM40B,GAAc53B,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,UACzB,QAAA,CAAMA,MAAU2H,UAAWxB,EAAG,kDAAmDwB,MAAgB1K,KAEpG+wB,GAAY50B,YAAc,cAE1B,MAAM60B,GAAY73B,EAAMsR,WAGtB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,QAAA,CACCjF,MACA2H,UAAWxB,EAAG,6BAA8BwB,MACxC1K,KAGRgxB,GAAU70B,YAAc,YAEJhD,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,QAAA,CACCjF,MACA2H,UAAWxB,EACT,0DACAwB,MAEE1K,KAGI7D,YAAc,cAE1B,MAAM80B,GAAW93B,EAAMsR,WAGrB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EACT,8EACAwB,MAEE1K,KAGRixB,GAAS90B,YAAc,WAEvB,MAAM+0B,GAAY/3B,EAAMsR,WAGtB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EACT,+HACAwB,MAEE1K,KAGRkxB,GAAU/0B,YAAc,YAExB,MAAMg1B,GAAYh4B,EAAMsR,WAGtB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,KAAA,CACCjF,MACA2H,UAAWxB,EAAG,uDAAwDwB,MAClE1K,KAGRmxB,GAAUh1B,YAAc,YAExB,MAAMi1B,GAAej4B,EAAMsR,WAGzB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAAC,UAAA,CACCjF,MACA2H,UAAWxB,EAAG,qCAAsCwB,MAChD1K,KAGRoxB,GAAaj1B,YAAc,eChG3B,MAAMk1B,GAAWl4B,EAAMsR,WACrB,EAAGC,eAAc1K,GAAS+C,IAEtBiF,EAAAA,IAAC,WAAA,CACC0C,UAAWxB,EACT,uSACAwB,GAEF3H,SACI/C,KAKZqxB,GAASl1B,YAAc,WCdvB,MAAMm1B,GAAgBC,EAAgB3O,SAEhC4O,GAAgBr4B,EAAMsR,WAG1B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACupB,EAAgB5N,SAAhB,CACC5gB,MACA2H,UAAWxB,EACT,8GACAwB,MAEE1K,KAGRwxB,GAAcr1B,YAAco1B,EAAgB5N,SAASxnB,YAErD,MAAMs1B,GAAgB/nB,EAAAA,IACpB,4lBACA,CACEC,SAAU,CACRC,QAAS,CACPC,QAAS,uCACTC,YACE,oFAGNS,gBAAiB,CACfX,QAAS,aAKT8nB,GAAQv4B,EAAMsR,WAIlB,EAAGC,YAAWd,aAAY5J,GAAS+C,IAEjCiF,EAAAA,IAACupB,EAAgBvmB,KAAhB,CACCjI,MACA2H,UAAWxB,EAAGuoB,GAAc,CAAE7nB,YAAYc,MACtC1K,KAIV0xB,GAAMv1B,YAAco1B,EAAgBvmB,KAAK7O,YAEzC,MAAMw1B,GAAcx4B,EAAMsR,WAGxB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACupB,EAAgBvlB,OAAhB,CACCjJ,MACA2H,UAAWxB,EACT,qgBACAwB,MAEE1K,KAGR2xB,GAAYx1B,YAAco1B,EAAgBvlB,OAAO7P,YAEjD,MAAMy1B,GAAaz4B,EAAMsR,WAGvB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACupB,EAAgBvgB,MAAhB,CACCjO,MACA2H,UAAWxB,EACT,wVACAwB,GAEF,cAAY,MACR1K,EAEJyH,SAAAO,EAAAA,IAACmJ,EAAAA,EAAA,CAAEzG,UAAU,eAGjBknB,GAAWz1B,YAAco1B,EAAgBvgB,MAAM7U,YAE/C,MAAM01B,GAAa14B,EAAMsR,WAGvB,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACupB,EAAgB3lB,MAAhB,CACC7I,MACA2H,UAAWxB,EAAG,wBAAyBwB,MACnC1K,KAGR6xB,GAAW11B,YAAco1B,EAAgB3lB,MAAMzP,YAE/C,MAAM21B,GAAmB34B,EAAMsR,WAG7B,EAAGC,eAAc1K,GAAS+C,IAC1BiF,EAAAA,IAACupB,EAAgBzlB,YAAhB,CACC/I,MACA2H,UAAWxB,EAAG,qBAAsBwB,MAChC1K,KAGR8xB,GAAiB31B,YAAco1B,EAAgBzlB,YAAY3P,YCvG3D,MAAM41B,GAAoBtR,EAAAA,cAAqC,IAOxD,SAASuR,IAAmBvqB,SAAEA,EAAAtE,OAAUA,IAC7C,OACE6E,MAAC+pB,GAAkBnP,SAAlB,CAA2BziB,MAAO,CAAE8xB,WAAY9uB,GAAQ8uB,YACtDxqB,YAGP,CAEO,SAASyqB,KACd,OAAOtR,EAAAA,WAAWmR,GACpB,CCrBO,SAASI,KACd,MAAM/rB,EAAWgsB,EAAAA,eACXH,WAAEA,GAAeC,KAGjBG,EAAeJ,GAAYjR,QAAazlB,EAAK+2B,OAASlsB,EAASmsB,UAGrE,OAAOF,GAAc7jB,OAAS,QAChC,CCgBA,MAAMgkB,GAAoCr5B,EAAMs5B,KAAK,EACnD7oB,UAAU,OACVc,YAAY,GACZqW,aAAc2R,EACdC,eACAC,aAAY,MAEZ,MAAMzV,KACJA,EAAAC,UACAA,EAAA/H,MACAA,EAAA4H,gBACAA,EAAA2C,OACAA,EAAAiT,WACAA,GACEnS,KAEEoS,EAAiB1V,IAAY,IAAM,KAEnC2V,EAAmB1d,EAAQ+H,GAAW4D,QAAUhgB,EAAEqU,QAAUA,GAASyd,EAErEE,EAAiB5V,GAAa,GAC9B6V,EAFeP,GAAoBK,GAAoBD,GAEzBA,EAG9BI,EAAmB/5B,EAAM2zB,YAAaqG,IACtCR,EACFA,EAAaQ,GAEbN,EAAWM,IAEZ,CAACR,EAAcE,IAGZO,EAAoBj6B,EAAMo0B,QAAQ,KACtC,IAAKyF,GAAgBp4B,OAAQ,MAAO,GAEpC,MAAMy4B,MAAqBt0B,IAC3Bi0B,EAAehb,QAAQmb,IACrBE,EAAe5yB,IAAI0yB,EAAK9d,MAAO8d,KAGjC,MAAMG,EAAcx4B,MAAM+0B,KAAKwD,EAAeltB,UACxCotB,EAAoBD,EAAYtS,QAAamS,EAAK9d,QAAU4d,GAAa5d,OACzEme,EAAaF,EAAY5rB,UAAeyrB,EAAK9d,QAAU4d,GAAa5d,OAM1E,OAJAme,EAAWC,KAAK,CAACvxB,EAAG2G,KACjB3G,EAAE5F,MAAQ,IAAIo3B,cAAc7qB,EAAEvM,MAAQ,GAAI,QAAS,CAAEq3B,YAAa,UAG9DJ,EAAoB,CAACA,KAAsBC,GAAcA,GAC/D,CAACR,EAAgBC,GAAa5d,QAEjC,IAAK4H,IAAoBE,EACvB,OAAO,KAGT,MAAMyW,EAAc,IAClB3rB,EAAAA,KAAAE,EAAAA,SAAA,CACEV,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,gBACbjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,qEACbjD,SAAAO,EAAAA,IAACqc,OAAA,CAAK3Z,UAAU,wCAGpBzC,EAAAA,KAAC,MAAA,CAAIyC,UAAU,iBACbjD,SAAA,CAAAO,EAAAA,IAAC,IAAA,CAAE0C,UAAU,+BACVjD,SAAA0V,EAAK7gB,OAER2L,EAAAA,KAAC,IAAA,CAAEyC,UAAU,gCAAgCjD,SAAA,CAAA,YACjCwrB,GAAa32B,MAAQ,eAKpC22B,SACE,MAAA,CAAIvoB,UAAU,OACbjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAO,EAAAA,IAAC6rB,EAAAA,UAAA,CAAUnpB,UAAU,kCACrB1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,sBACbjD,WAAYnL,YAMpB82B,EAAkBx4B,OAAS,GAC1BqN,EAAAA,KAAC,MAAA,CAAIyC,UAAU,OACbjD,SAAA,CAAAQ,EAAAA,KAAC,IAAA,CAAEyC,UAAU,qCAAqCjD,SAAA,CAAA,yBACzB2rB,EAAkBx4B,UAE3CqN,EAAAA,KAAC,MAAA,CAAIyC,UAAU,uBACZjD,SAAA,CAAA2rB,EAAkBtb,MAAM,EAAG,GAAGxc,IAAK63B,GAClCnrB,EAAAA,IAAC2E,GAAA,CAEC/C,QAASupB,EAAK9d,QAAU4d,GAAa5d,MAAQ,UAAY,YACzD3K,UAAU,yBACVqE,QAAS,IAAMmkB,EAAiBC,GAE/B1rB,SAAA0rB,EAAK72B,MALD62B,EAAK9d,QAQb+d,EAAkBx4B,OAAS,GAC1BqN,EAAAA,KAAC0E,IAAM/C,QAAQ,UAAUc,UAAU,UAAUjD,SAAA,CAAA,IACzC2rB,EAAkBx4B,OAAS,cAS3C,GAAgB,aAAZgP,EAAwB,CAC1B,MACMkqB,EADW3W,EAAKmD,YAAcnD,EAAKoD,UAErC,SAAGhiB,GAAgBw1B,sDAAsD5W,EAAKmD,cAAcnD,EAAKoD,oBACjG,KAEJ,cACG/O,GAAA,CACC/J,SAAA,CAAAO,MAAC0J,GAAA,CAAoB/G,SAAO,EAC1BlD,SAAAO,MAACwC,GAAOZ,QAAQ,QAAQc,UAAW,cAAcA,IAC/CjD,SAAAQ,OAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,4BACbjD,SAAA,CAAAO,EAAAA,IAAC,IAAA,CAAE0C,UAAU,sBAAuBjD,SAAA0V,EAAK7gB,aACxC,IAAA,CAAEoO,UAAU,gCAAiCjD,SAAAwrB,GAAa32B,MAAQ,WAEpEw3B,EACC9rB,EAAAA,IAAC,MAAA,CACCwZ,IAAKsS,EACLE,IAAI,kBACJtpB,UAAU,oCACVupB,QAAU5xB,IACPA,EAAE6xB,cAAmCzlB,MAAM0lB,QAAU,OACtD,MAAMC,EAAc/xB,EAAE6xB,cAAcG,mBAChCD,IAAaA,EAAY3lB,MAAM0lB,QAAU,WAG/C,KACJnsB,EAAAA,IAAC,MAAA,CAAI0C,UAAW,qEAAoEopB,EAAW,SAAW,IACxGrsB,SAAAO,EAAAA,IAACqc,EAAAA,KAAA,CAAK3Z,UAAU,sCAElB1C,EAAAA,IAACsd,EAAAA,YAAA,CAAY5a,UAAU,mBAK7BzC,EAAAA,KAACsK,GAAA,CACC7H,UAAU,yDACVyD,MAAM,MAEN1G,SAAA,CAAAQ,OAAC6J,GAAA,CACCrK,SAAA,CAAAQ,OAACiK,GAAA,CACCzK,SAAA,CAAAO,EAAAA,IAACssB,EAAAA,UAAA,CAAU5pB,UAAU,iBAAiB,qBAGxC1C,EAAAA,IAACqK,GAAA,CACE5K,SAAA2rB,EAAkB93B,IAAK63B,GACtBlrB,EAAAA,KAACuK,GAAA,CAECzD,QAAS,IAAMmkB,EAAiBC,GAChCzoB,UAAWyoB,EAAK9d,QAAU4d,GAAa5d,MAAQ,WAAa,GAE5D5N,SAAA,CAAAO,EAAAA,IAAC6rB,EAAAA,UAAA,CAAUnpB,UAAU,iBACpByoB,EAAK72B,KACL62B,EAAK9d,QAAU4d,GAAa5d,OAC3BrN,EAAAA,IAAC2E,IAAM/C,QAAQ,UAAUc,UAAU,eAAejD,SAAA,YAP/C0rB,EAAK9d,mBAgBjBnC,GAAA,IAEDlL,EAAAA,IAAC6Y,GAAA,CAAejX,QAAQ,aAExB3B,EAAAA,KAACuK,GAAA,CAAiBzD,QAAS6Q,EACzBnY,SAAA,CAAAO,EAAAA,IAACusB,EAAAA,OAAA,CAAO7pB,UAAU,iBAAiB,eAM7C,CAEA,OACEzC,OAACoF,IAAK3C,YACJjD,SAAA,CAAAO,EAAAA,IAACsF,IACC7F,SAAAO,EAAAA,IAACuF,GAAA,CAAU7C,UAAU,UAAUjD,sCAGjCQ,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,YACrBjD,SAAA,CAAAO,EAAAA,IAAC4rB,EAAA,UAEAzgB,GAAA,IAEDlL,EAAAA,KAAC,MAAA,CAAIyC,UAAU,iBACbjD,SAAA,CAAAO,EAAAA,IAAC6Y,GAAA,CAAenW,UAAU,WAC1BzC,EAAAA,KAACuC,EAAA,CACCZ,QAAQ,UACRmF,QAAS6Q,EACTzV,KAAK,KACLO,UAAU,SAEVjD,SAAA,CAAAO,EAAAA,IAACusB,EAAAA,OAAA,CAAO7pB,UAAU,iBAAiB,qBCnOxC,SAAS8pB,GAAer0B,EAAUs0B,GACvC,MAAOC,EAAgBC,GAAqBtkB,EAAAA,SAAYlQ,GAClDy0B,EAAaC,EAAAA,SAEbC,EAAShI,EAAAA,YAAY,KACrB8H,EAAWn1B,UACbs1B,aAAaH,EAAWn1B,SACxBm1B,EAAWn1B,aAAU,IAEtB,IAYH,OAVA6Q,EAAAA,UAAU,KACRwkB,IAEAF,EAAWn1B,QAAU+X,WAAW,KAC9Bmd,EAAkBx0B,IACjBs0B,GAEIK,GACN,CAAC30B,EAAOs0B,EAAOK,IAEX,CAACJ,EAAgBI,EAC1B,CCdA,MAAME,GAAY,EAAGC,cACF7C,EAAAA,cACjB,MAAM8C,EAAY/C,MAGZ/U,UAAEA,QAAW/H,EAAA8f,gBAAOA,EAAAC,YAAiBA,cAAaC,EAAAxC,WAAaA,GAAenS,KAC9EK,EAAe1L,EACjB+H,GAAW4D,QAAgBC,EAAQ5L,QAAUA,IAAU+H,IAAY,IAAM,KACzEA,IAAY,IAAM,MACf0B,EAAcwW,GAAmBC,qBAGjCC,EAAYC,GAAiBplB,EAAAA,SAAS,IAAMyO,EAAazf,IAAI,WAAa,KAG1Eq2B,EAAsBC,GAAkBnB,GAAYgB,EAAYtZ,GAAcC,eAGrF7L,EAAAA,UAAU,KACR,IAAK6kB,EAAiB,OACtB,MAAMS,EAAY,IAAIvW,gBAAgBP,GAClC4W,GACFE,EAAUn1B,IAAI,SAAUi1B,GACxBE,EAAUn1B,IAAI,OAAQ,OAEtBm1B,EAAUne,OAAO,UACjBme,EAAUne,OAAO,SAEnB6d,EAAgBM,IACf,CAACF,EAAsBJ,EAAiBH,EAAiBrW,IAoB5D,aACG,SAAA,CAAOpU,UAAU,sDAChBjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,0CAEbjD,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,mDACbjD,SAAA,CAAAO,EAAAA,IAAC2lB,GAAA,CAAejjB,UAAU,kBAE1BzC,EAAAA,KAAC,MAAA,CAAIyC,UAAU,wFAEbjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,UACbjD,SAAAO,EAAAA,IAAC,MAAG0C,UAAU,iDACXjD,eAKJ0tB,GACCltB,EAAAA,KAAC,MAAA,CAAIyC,UAAU,+CACbjD,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,0BACbjD,SAAA,CAAAO,EAAAA,IAACwL,EAAAA,OAAA,CAAO9I,UAAU,qFAClB1C,EAAAA,IAAC2F,GAAA,CACC+C,YAAY,YACZvQ,MAAOq1B,EACPjnB,SAAWlM,IAAMwzB,OAzCP11B,EAyC0BkC,EAAEwM,OAAO1O,WAxC7Ds1B,EAAct1B,GADW,IAACA,GA0CVuK,UAAU,sBAEX8qB,GACCxtB,EAAAA,IAACwC,EAAA,CACCZ,QAAQ,QACRO,KAAK,KACLO,UAAU,oFACVqE,QA7CM,KAExB4mB,IAGAF,EAAc,IAGd,MAAMG,EAAY,IAAIvW,gBAAgBP,GACtC8W,EAAUne,OAAO,UACjBme,EAAUne,OAAO,QACjB6d,EAAgBM,IAmCEnlB,MAAM,eAENhJ,SAAAO,EAAAA,IAACmJ,EAAAA,EAAA,CAAEhH,KAAM,UAKfnC,EAAAA,IAACwC,EAAA,CACCZ,QAAQ,UACRO,KAAK,KACL4E,QAASsmB,EACT3qB,UAAU,8BACV+F,MAAM,kBAENhJ,SAAAO,EAAAA,IAACssB,EAAAA,UAAA,CAAUnqB,KAAM,gBAQ3BlC,EAAAA,KAAC,MAAA,CAAIyC,UAAU,wCACZjD,SAAA,CAAAwtB,GACCjtB,EAAAA,IAAC,MAAA,CAAI0C,UAAU,0BACZjD,SAAAwtB,IAGLjtB,EAAAA,IAAC,MAAA,CAAI0C,UAAU,UACbjD,SAAAO,EAAAA,IAACwqB,GAAA,CACC5oB,QAAQ,WACRmX,eACA4R,aAAcE,EACdD,WAAW,eC1HZkD,GAAmB,CAACC,EAAmC,MAClE,MAAMC,QAAEA,GAAU,GAASD,GACrB1gB,MAAEA,GAAUqL,KAElB,OAAOuV,WAAS,CACdC,SAAU,CAAC,iBAAkB7gB,GAC7B8gB,QAASC,UACP,IAAK/gB,EACH,MAAO,GAGT,MAAM4I,EAAW/C,MACX3R,KAAEA,EAAA/O,MAAMA,SAAiByjB,EAC5BoY,OAAO,WACPxG,KAAK,WACLyG,OAAO,8EAIPC,GAAG,sBAAuBlhB,GAC1BkhB,GAAG,SAAU,UACbC,MAAM,QAET,GAAIh8B,EACF,MAAMA,EAGR,OAAO+O,GAAQ,IAEjBysB,QAASA,KAAa3gB,KClCpBohB,SAA8Bl4B,GAAgBm4B,yBAEvCC,GAAS,CACpBC,KAAM,WAAWH,kEACjBI,UAAW,WAAWJ,oEAIXK,GAAUH,GAAOC,KACjBG,GAAeJ,GAAOE,UCmB5B,SAASG,IAAW7zB,OAAEA,GAA4B,IACvD,MAAMwR,MAAEA,GAAUmX,KACZ1lB,EAAWgsB,EAAAA,eACV6E,EAAcC,GAAmB7mB,EAAAA,UAAS,IAI/C9G,KAAM4tB,EAAAja,UACNA,EAAA1iB,MACAA,GACEs7B,GAAiB,CACnBE,QAASiB,IAKLG,EAAmBxe,IACvB,MAAMye,EAAS,CAAC,sBAAuB,qBAAsB,oBAAqB,mBAAoB,sBAAuB,qBAC7H,OAAOA,EAAOze,EAAQye,EAAOz8B,SA0D/B,OACEqN,EAAAA,KAACwlB,GAAA,CAAQC,YAAY,OACnBjmB,SAAA,CAAAQ,EAAAA,KAACgmB,GAAA,CAAcvjB,UAAU,YAEvBjD,SAAA,CAAAQ,EAAAA,KAACuJ,GAAA,CAAazB,aAAcmnB,EAC1BzvB,SAAA,CAAAO,EAAAA,IAAC0J,IAAoB/G,SAAO,EAC1BlD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,wNACZjD,SAAA,CAAU,cAAVkN,GAAyBxR,GAAQm0B,QAClCtvB,EAAAA,IAACsd,EAAAA,YAAA,CAAYnb,KAAM,UAIvBnC,EAAAA,IAACuK,GAAA,CAAoB7H,UAAU,qEAAqEyD,MAAiB,cAAVwG,EAAwB,SAAW,QAC3IlN,SA5DLyV,EAEAjV,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8DACbjD,SAAA,CAAAO,EAAAA,IAAC2gB,EAAAA,QAAA,CAAQje,UAAU,yBACnB1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,UAAUjD,SAAA,6BAK5BjN,EAEAyN,EAAAA,KAAC,MAAA,CAAIyC,UAAU,yDACbjD,SAAA,CAAAO,EAAAA,IAACyL,EAAAA,YAAA,CAAY/I,UAAU,YACvB1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,UAAUjD,SAAA,gCAK3B0vB,GAA8B,IAAnBA,EAAQv8B,OAStBoN,MAAC,OAAI0C,UAAU,YACZjD,WAAQnM,IAAI,CAAC8lB,EAAgBxI,IAC5B5Q,EAAAA,IAAC,MAAA,CAEC+G,QAAS,IAvCO,CAACwoB,IACzB,MAAMnW,EAAS+V,GAASnW,KAAKxY,GAAKA,EAAEgvB,MAAQD,GACxCnW,GAAQoW,KACVlb,OAAOxM,KAAKsR,EAAOoW,IAAK,WAoCHC,CAAkBrW,EAAOoW,KAAO,IAC/C9sB,UAAW,uGAEI0sB,EAAgBxe,kDAG/BnR,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,oCACbjD,SAAA,CAAAO,EAAAA,IAAC,OAAA,CAAK0C,UAAU,sCAAuCjD,SAAA2Z,EAAO9kB,OAC7D8kB,EAAOoW,KAAOxvB,EAAAA,IAAC0vB,EAAAA,aAAA,CAAahtB,UAAU,sCATpC0W,EAAOxS,OAVhB5G,EAAAA,IAAC,MAAA,CAAI0C,UAAU,0CAA0CjD,SAAA,kCA6CzDO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,wCACbjD,SAAAO,EAAAA,IAAC,MAAA,CACCwZ,IAAe,cAAV7M,EAAwBgiB,GAAOE,UAAYF,GAAOC,KACvD5C,IAAI,OACJtpB,UAAqB,cAAViK,EAAwB,UAAY,yBAKrD3M,MAAComB,GAAA,CACC3mB,SAAAO,EAAAA,IAACqmB,GAAA,CACC5mB,SAAAO,EAAAA,IAACwmB,GAAA,CACC/mB,SAAAO,EAAAA,IAACymB,GAAA,CACEhnB,SAAAtE,GAAQ8uB,YAAY32B,IAAKC,IACxByM,SAAAA,IAAC0mB,GAAA,CACCjnB,SAAAO,EAAAA,IAAC4mB,GAAA,CAAkBjkB,SAAO,EAAC0d,UA/FzBiK,EA+F4C/2B,EAAK+2B,KA/FhClsB,EAASmsB,WAAaD,GAgGvC7qB,SAAAQ,EAAAA,KAAC0vB,EAAAA,KAAA,CAAKC,GAAIr8B,EAAK+2B,KACb7qB,SAAA,CAAAO,MAACzM,EAAK+O,KAAL,IACDtC,EAAAA,IAAC,OAAA,CAAMP,SAAAlM,EAAKiT,cAJIjT,EAAK+2B,MA9FxB,IAACA,cA6GpB,CCxIO,MAAMuF,WAAsBC,EAAAA,UACjC,WAAAt1B,CAAYxC,GACV+3B,MAAM/3B,GACNiZ,KAAKtE,MAAQ,CAAEqjB,UAAU,EAC3B,CAEA,+BAAOC,CAAyBz9B,GAC9B,MAAO,CAAEw9B,UAAU,EAAMx9B,QAC3B,CAEA,iBAAA09B,CAAkB19B,EAAc29B,GAC9Bpf,GAAaG,YAAY1e,GAAO,GAChCsB,QAAQtB,MAAM,iCAAkCA,EAAO29B,EACzD,CAEA,MAAAr7B,GACE,OAAImc,KAAKtE,MAAMqjB,SACT/e,KAAKjZ,MAAMo4B,SACNnf,KAAKjZ,MAAMo4B,eAIjB,MAAA,CAAI1tB,UAAU,oDACbjD,SAAAQ,EAAAA,KAACoF,GAAA,CAAK3C,UAAU,kBACdjD,SAAA,CAAAQ,EAAAA,KAACqF,GAAA,CAAW5C,UAAU,cACpBjD,SAAA,CAAAO,EAAAA,IAAC,OAAI0C,UAAU,2BACbjD,eAAC4wB,EAAAA,cAAA,CAAc3tB,UAAU,iCAE3B1C,EAAAA,IAACuF,IAAU9F,SAAA,uBAEbQ,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,wBACrBjD,SAAA,CAAAO,EAAAA,IAAC,IAAA,CAAE0C,UAAU,wBAAwBjD,SAAA,2DAGrCO,EAAAA,IAACwC,EAAA,CACCuE,QAAS,IAAMuN,OAAOlW,SAASkyB,SAC/B5tB,UAAU,SACXjD,SAAA,8BASJwR,KAAKjZ,MAAMyH,QACpB,EC9DK,SAAS8wB,GACdC,EACAC,EACAC,EACA5oB,GAEA,MAAO6oB,EAAUC,GAAevoB,EAAAA,SAAY,CAAA,IACrC+I,EAAQyf,GAAaxoB,EAAAA,SAAiC,CAAA,GAGvDyoB,EAAiBvL,EAAAA,QAAQ,IAAMiL,EAAQ,CAACA,IAGxCO,EAAe54B,GACZA,aAAiBoW,OAASyiB,MAAM74B,EAAM84B,WAIzCC,EAAwBC,IAC5B,QAA2B,IAAvBA,EAAMC,aAA4B,OAAOD,EAAMC,aAEnD,OAAQD,EAAMj9B,MACZ,IAAK,cACH,MAAO,GACT,IAAK,WACH,OAAO,EACT,IAAK,SACH,OAAO,EACT,IAAK,OAIL,QACE,MAAO,GAHT,IAAK,QACH,MAAO,CAAA,IAOPm9B,EAAyB,CAACF,EAAkBG,KAChD,GAAIH,EAAMI,eAAgD,mBAAxBJ,EAAMI,cACtC,IACE,OAAOJ,EAAMI,cAAcD,EAC7B,OAAS9+B,GAEP,OAAO0+B,EAAqBC,EAC9B,GAsCEK,EAAgB,CAACL,EAAkBh5B,EAAYm5B,KAEnD,GAAIH,EAAMM,WAAuB,KAAVt5B,SAAgBA,GAClCrF,MAAMmH,QAAQ9B,IAA2B,IAAjBA,EAAMvF,QACjC,MAAO,GAAGu+B,EAAM3qB,sBAIlB,GAAI2qB,EAAMO,WAAY,CACpB,IAAIC,EAQJ,GANgC,mBAArBR,EAAMO,WACfC,EAAYR,EAAMO,WACTP,EAAMO,WAAWE,QAA6C,mBAA5BT,EAAMO,WAAWE,SAC5DD,EAAYR,EAAMO,WAAWE,QAG3BD,EACF,IACE,MAAME,EAASF,EAAUx5B,EAAOm5B,GAChC,GAAIO,EAAQ,OAAOA,CACrB,OAASr/B,GAET,CAEJ,GAMF8V,EAAAA,UAAU,KAER,IAAKR,EAAM,OAGX,MAAMgqB,EAAgBC,IACpB,MAAMC,EAAyB,GAS/B,OAPAD,EAAU/hB,QAAQmhB,IAChBa,EAAUrhB,KAAKwgB,GACXA,EAAMX,QACRwB,EAAUrhB,QAAQmhB,EAAaX,EAAMX,WAIlCwB,GAGHA,EAAYF,EAAahB,GACzBmB,EAAmB,CAAA,EAGzBD,EAAUhiB,QAAQmhB,IAChB,IAAIe,EAGJ,GAAIzB,QAAsD,IAAvCA,EAAYU,EAAM78B,OASnC,GARA49B,EAAazB,EAAYU,EAAM78B,MAG1B49B,UACHA,EAAa,IAII,SAAff,EAAMj9B,MAAmBg+B,EAC3B,GAA0B,iBAAfA,EAAyB,CAClC,MAAMC,EAAO,IAAI5jB,KAAK2jB,GAClBnB,EAAYoB,KACdD,EAAaC,EAAKC,cAAcv5B,MAAM,KAAK,GAE/C,MAAWk4B,EAAYmB,KACrBA,EAAaA,EAAWE,cAAcv5B,MAAM,KAAK,SAKrDq5B,EAAahB,EAAqBC,GAGpCc,EAAYd,EAAM78B,MAAQ49B,IAI5BF,EAAUhiB,QAAQmhB,IAChB,MAAMI,EAAgBF,EAAuBF,EAAOc,QAC9B,IAAlBV,IACFU,EAAYd,EAAM78B,MAAQi9B,KAI9BX,EAAYqB,GACZpB,EAAU,CAAA,GAGNH,GACFA,EAAiBuB,IAElB,CAACnB,EAAgBL,EAAaC,EAAkB5oB,IAGnD,MAmCMgqB,EAAgBC,IACpB,MAAMC,EAAyB,GAS/B,OAPAD,EAAU/hB,QAAQmhB,IAChBa,EAAUrhB,KAAKwgB,GACXA,EAAMX,QACRwB,EAAUrhB,QAAQmhB,EAAaX,EAAMX,WAIlCwB,GAIHK,EAAe,KACnB,MAAML,EAAYF,EAAahB,GACzBwB,EAAoC,CAAA,EAU1C,OARAN,EAAUhiB,QAAQmhB,IAChB,MAAM3+B,EAAQg/B,EAAcL,EAAOR,EAASQ,EAAM78B,MAAOq8B,GACrDn+B,IACF8/B,EAAUnB,EAAM78B,MAAQ9B,KAI5Bq+B,EAAUyB,GAC+B,IAAlCx8B,OAAOyJ,KAAK+yB,GAAW1/B,QAiBhC,MAAO,CACL+9B,WACAvf,SACAmhB,YAjFkB,CAACC,EAAmBr6B,KACtCy4B,EAAY6B,IACV,MAAMC,EAAU,IAAKD,EAAUD,CAACA,GAAYr6B,GAGtCw6B,EA3IoB,EAACC,EAA0BX,KACvD,IAAIU,EAAc,IAAKV,GAGvB,MAAMH,EAAgBC,IACpB,MAAMC,EAAyB,GAS/B,OAPAD,EAAU/hB,QAAQmhB,IAChBa,EAAUrhB,KAAKwgB,GACXA,EAAMX,QACRwB,EAAUrhB,QAAQmhB,EAAaX,EAAMX,WAIlCwB,GAcT,OAXwBF,EAAahB,GAAgBpxB,OAAOyxB,GAC1DA,EAAM0B,YAAcD,GAGN5iB,QAAQmhB,IACtB,MAAMI,EAAgBF,EAAuBF,EAAOwB,QAC9B,IAAlBpB,IACFoB,EAAc,IAAKA,EAAa,CAACxB,EAAM78B,MAAOi9B,MAI3CoB,GA+GeG,CAAsBN,EAAWE,GAOrD,OAJIhC,GACFA,EAAiBiC,GAGZA,IAILvhB,EAAOohB,IACT3B,EAAUkC,IACR,MAAMT,EAAY,IAAKS,GAEvB,cADOT,EAAUE,GACVF,IAKX,MAAMnB,EAAQW,EAAahB,GAAgB9X,KAAK1Y,GAAKA,EAAEhM,OAASk+B,GAChE,GAAIrB,EAAO,CACT,MAAM3+B,EAAQg/B,EAAcL,EAAOh5B,EAAOw4B,GACtCn+B,GACFq+B,EAAUkC,QAAoBA,EAAYP,CAACA,GAAYhgC,IAE3D,GAmDA6/B,eACAW,aAlBoBC,GACZ54B,IACFA,IACFA,EAAEgrB,iBACFhrB,EAAE64B,mBAGAb,KACFY,EAAStC,IAYjB,yIC/IO,MAAMwC,GAAa,IAvH1B,MAAA,WAAA34B,GACEwW,GAAAC,KAAQ,gBAAU1a,GAAgB68B,qBAAA,CAOlC,iBAAcC,CAAYC,EAAkBC,EAAgClmB,GAC1E,MAAMpB,EAAQF,GAAaK,iBAE3B,IAAKH,EACH,MAAM,IAAIzV,MAAM,gCAIlB,IAAK6W,GAA0B,KAAjBA,EAAM3W,OAClB,MAAM,IAAIF,MAAM,iEAGlB,MAAMg5B,EAAM,IAAI/Y,IAAI6c,EAAUriB,KAAKuiB,SACnC19B,OAAO8H,QAAQ21B,GAAQvjB,QAAQ,EAAElV,EAAK3C,MACpCq3B,EAAI1Y,aAAa2c,OAAO34B,EAAK3C,KAG/B,MAAMu7B,QAAiBC,MAAMnE,EAAIlf,WAAY,CAC3CsjB,OAAQ,MACRzhB,QAAS,CACP0hB,cAAiB,UAAU5nB,IAC3B,eAAgB,mBAChB6nB,OAAU,mBAGV,WAAYzmB,KAIhB,IAAKqmB,EAASK,GACZ,MAAM,IAAIv9B,MAAM,oBAAoBk9B,EAASM,UAAUN,EAASO,cAKlE,aAFmBP,EAASQ,MAG9B,CAEQ,gBAAAC,CAAiBC,GAEvB,MAAO,CACLC,OAAQD,EAASC,QAAU7gC,OAAO4gC,EAASE,IAC3CC,SAAUH,EAASG,UAAY,sBAC/BC,UAAWJ,EAASI,WAAa,uBAErC,CAEA,gBAAMC,CAAWpnB,EAAewB,GAC9B,IAIE,MAAM6kB,QAAiBziB,KAAKoiB,YAAY,gCAAiC,CACvExkB,YACAtD,OAAQ,GACRmpB,aAAc,UACbrnB,GAGH,IAAI+mB,EAAWV,EACf,GAAIA,EAASnyB,KACX6yB,EAAWV,EAASnyB,SACtB,KAAWzO,MAAMmH,QAAQy5B,GAIvB,OADA3iB,GAAaG,YAAY,2CAA2C,GAC7D,GAHPkjB,EAAWV,CAIb,CAEA,IAAK5gC,MAAMmH,QAAQm6B,GAEjB,OADArjB,GAAaG,YAAY,yCAAyC,GAC3D,GAMT,OAF6BkjB,EAAS9gC,IAAI2d,KAAKkjB,iBAIjD,OAAS3hC,GAEP,OADAue,GAAaG,YAAY1e,aAAiBgE,MAAQhE,EAAQ,qCACnD,EACT,CACF,CAGA,mBAAMmiC,CAAcN,EAAgBhnB,EAAewB,GACjD,IAEE,aADoBoC,KAAKwjB,WAAWpnB,EAAOwB,IAC9BmK,KAAK7D,GAAQA,EAAKkf,SAAWA,IAAW,IACvD,OAAS7hC,GAEP,OADAue,GAAaG,YAAY1e,aAAiBgE,MAAQhE,EAAQ,0CACnD,IACT,CACF,CAIA,cAAMoiC,CAASvnB,GAEb,MAAMwnB,EAAY9oB,GAAa4C,mBAE/B,OAAKkmB,GAAcA,EAAUhmB,UAKtBoC,KAAKwjB,WAAWpnB,EAAOwnB,EAAUhmB,YAJtCkC,GAAaG,YAAY,2DAA2D,GAC7E,GAIX,GCrHW4jB,GAAkB,CAAC/G,EAAkC,MAChE,MAAM5Y,KAAEA,EAAM9H,MAAO0nB,GAAiBrc,MAChCsV,QAAEA,GAAU,GAASD,EAE3B,OAAOE,WAAwB,CAC7BC,SAAU,CAAC,gBAAiB6G,GAC5B5G,QAAS,IAAMgF,GAAWyB,SAASG,GACnC/G,QAASA,KAAa+G,KAAkB5f,EACxC6f,MAAO,EACPC,WAAY,OCJHC,GAAoD,EAC/D/8B,QAAQ,GACRoO,WACAmC,cAAc,qBACdnB,WACA7E,gBAEA,MAAQnB,KAAM4zB,EAAQ,aAAIjgB,EAAA1iB,MAAWA,GAAUsiC,KAE/C,OAAI5f,QACMuS,GAAA,CAAS/kB,UAAWxB,EAAG,cAAewB,KAG5ClQ,EAEAyN,EAAAA,KAAC,MAAA,CAAIyC,UAAW,uEAAuEA,IACrFjD,SAAA,CAAAO,EAAAA,IAACyL,EAAAA,YAAA,CAAY/I,UAAU,6BACvB1C,EAAAA,IAAC,OAAA,CAAK0C,UAAU,2BAA2BjD,SAAA,iCAM/CQ,EAAAA,KAACkhB,GAAA,CACChpB,QACAi9B,cAAe7uB,EACfgB,SAAUA,GAA6B,IAAjB4tB,EAAMviC,OAE5B6M,SAAA,CAAAO,MAACwhB,GAAA,CAAc9e,YACbjD,SAAAO,EAAAA,IAACshB,GAAA,CAAY5Y,kBAEf1I,EAAAA,IAAC8hB,GAAA,CACEriB,SAAiB,IAAjB01B,EAAMviC,OACLoN,EAAAA,IAACiiB,GAAA,CAAW9pB,MAAM,WAAWoP,UAAQ,EAAC9H,SAAA,8BAItC01B,EAAM7hC,IAAK6hB,GACTnV,EAAAA,IAACiiB,GAAA,CAA6B9pB,MAAOgd,EAAKkf,OACvC50B,SAAA0V,EAAKof,UADSpf,EAAKkf,eC1CrBgB,GAA8E,EACzFl9B,QACAoO,WACAmC,cAAc,yBACdnB,WACA7E,eAGEzC,EAAAA,KAACkhB,GAAA,CAAOhpB,QAAci9B,cAAe7uB,EAAUgB,WAC7C9H,SAAA,CAAAO,MAACwhB,GAAA,CAAc9e,YACbjD,SAAAO,EAAAA,IAACshB,GAAA,CAAY5Y,wBAEdoZ,GAAA,CACCriB,SAAAO,MAACiiB,IAAW9pB,MAAM,cAAcsH,0CCRxC,SAAS61B,IAAwC7sB,MAC/CA,EAAA8sB,SACAA,EAAA9E,YACAA,EAAAwC,SACAA,EAAAuC,SACAA,EAAA1tB,KACAA,EAAA2tB,iBACAA,EAAmB,SAAAvgB,UACnBA,GAAY,EAAAwgB,UACZA,IAKA,MAAOC,EAAeC,GAAoBvtB,EAAAA,SAASktB,IAAW,IAAI3uB,IAAM,IAIlEorB,EAAYzM,EAAAA,QAAQ,IACnBgQ,GAAaziC,MAAMmH,QAAQs7B,GACzBA,EAASM,QAAQC,GAAWA,EAAQtF,OAAOqF,QAAQ1E,GAAwB,UAAfA,EAAMj9B,KAAmBi9B,EAAMX,QAAU,GAAKW,IAD/D,GAEjD,CAACoE,KACE5E,SACJA,EAAAvf,OACAA,EAAAmhB,YACAA,EAAAS,aACAA,GACEzC,GAAeyB,EAAWvB,OAAa,EAAW3oB,GAGhDiuB,EAAoBxQ,EAAAA,QAAQ,IAC3BgQ,GAAaziC,MAAMmH,QAAQs7B,GACzBA,EAASjiC,IAAIwiC,IAAA,IACfA,EACHvuB,SAAUuuB,EAAQE,WAAaF,EAAQE,UAAUrF,GAAYmF,EAAQvuB,WAAY,KAHjC,GAKjD,CAACguB,EAAU5E,IAGRsF,EAAqB1Q,EAAAA,QAAQ,KACjC,MAAM2Q,EAAiBH,EAAkB/c,KAAKjgB,GAAKA,EAAE6N,KAAO+uB,GAC5D,GAAIO,IAAmBA,EAAe3uB,SACpC,OAAOouB,EAET,MAAMQ,EAAiBJ,EAAkB/c,KAAKjgB,IAAMA,EAAEwO,UACtD,OAAO4uB,GAAgBvvB,IAAM+uB,GAC5B,CAACI,EAAmBJ,IAGvBxkC,EAAMmX,UAAU,KACV2tB,IAAuBN,GACzBC,EAAiBK,IAElB,CAACA,EAAoBN,IACxB,MAAMO,EAAiBH,EAAkB/c,KAAKjgB,GAAKA,EAAE6N,KAAOqvB,GACtDG,EAAejF,IAKnB,MAAMkF,GAAWlF,EAAMI,cAAgBZ,EAASQ,EAAM78B,OAChD6D,OAAqB,IAAbk+B,EAAyBA,EAAW,GAC5C7jC,EAAQ4e,EAAO+f,EAAM78B,MAC3B,OAAQ68B,EAAMj9B,MACZ,IAAK,QACH,OAAO+L,EAAAA,KAAC,MAAA,CAAqByC,UAAU,YAClCjD,SAAA,CAAA0xB,EAAM3qB,YACN,MAAA,CAAI9D,UAAWyuB,EAAMzuB,YAA+B,eAAjByuB,EAAMmF,OAA0B,aAAe,aAChF72B,SAAA0xB,EAAMX,QAAQl9B,IAAKijC,GAAkBH,EAAYG,QAHvCpF,EAAM78B,MAMzB,IAAK,cACH,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,QACrCxG,EAAAA,IAACk1B,GAAA,CACG/8B,MAAOA,GAAS,GAChBoO,SAAUiwB,GAAYjE,EAAYpB,EAAM78B,KAAMkiC,GAC9C9tB,YAAayoB,EAAMzoB,YACnBnB,SAAU4pB,EAAM5pB,SAChB7E,UAAWlQ,EAAQ,iBAAmB,KAEvCA,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MATlC2+B,EAAM78B,MAWzB,IAAK,WACH,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,QACnCxG,EAAAA,IAACqpB,IAASziB,GAAIuqB,EAAM78B,KAAM6D,MAAOA,GAAS,GAAIoO,SAAUlM,IACxDk4B,EAAYpB,EAAM78B,KAAM+F,EAAEwM,OAAO1O,QAChCuQ,YAAayoB,EAAMzoB,YAAanB,SAAU4pB,EAAM5pB,SAAU7E,UAAW,GAAGlQ,EAAQ,iBAAmB,MAAM2+B,EAAM5pB,SAAW,iCAAmC,OAC7J/U,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MALlC2+B,EAAM78B,MAOzB,IAAK,SACH,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,eAClC2a,GAAA,CAAOhpB,MAAO3E,OAAO2E,GAAQi9B,cAAeoB,IAC7CjE,EAAYpB,EAAM78B,KAAMkiC,GAEpBrF,EAAMiE,eACRjE,EAAMiE,cAAcoB,IAErBjvB,SAAU4pB,EAAM5pB,SACf9H,SAAA,CAAAO,MAACwhB,IAAc9e,UAAW,GAAGlQ,EAAQ,iBAAmB,MAAM2+B,EAAM5pB,SAAW,iCAAmC,KAChH9H,SAAAO,MAACshB,IAAY5Y,YAAayoB,EAAMzoB,sBAEjCoZ,GAAA,CACEriB,SAAA0xB,EAAMpD,SAASz6B,OAAc0M,MAACiiB,GAAA,CAA8B9pB,MAAOs+B,EAAOt+B,MACtEsH,SAAAg3B,EAAOjwB,OADmCiwB,EAAOt+B,aAKzD3F,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MAlBlC2+B,EAAM78B,MAoBzB,IAAK,OACH,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,cAClCb,GAAA,CAAMiB,GAAIuqB,EAAM78B,KAAMJ,KAAK,OAAOiE,MAAO3E,OAAO2E,GAAQoO,SAAUlM,GAAKk4B,EAAYpB,EAAM78B,KAAM+F,EAAEwM,OAAO1O,OAAQuQ,YAAayoB,EAAMzoB,YAAanB,SAAU4pB,EAAM5pB,SAAU7E,UAAWxB,EAAG,SAAU1O,EAAQ,iBAAmB,GAAI2+B,EAAM5pB,SAAW,iCAAmC,MACrR/U,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MAHlC2+B,EAAM78B,MAKzB,IAAK,4BACH,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,QACnCxG,EAAAA,IAACq1B,GAAA,CACCl9B,MAAO3E,OAAO2E,GACdoO,SAAUmwB,GAAuBnE,EAAYpB,EAAM78B,KAAMoiC,GACzDhuB,YAAayoB,EAAMzoB,YACnBnB,SAAU4pB,EAAM5pB,SAChB7E,UAAWlQ,EAAQ,iBAAmB,KAEvCA,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MATlC2+B,EAAM78B,MAWzB,IAAK,4BACH,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,QACnCxG,EAAAA,IAACk1B,GAAA,CACC/8B,MAAOA,GAAS,GAChBoO,SAAUiwB,GAAYjE,EAAYpB,EAAM78B,KAAMkiC,GAC9C9tB,YAAayoB,EAAMzoB,YACnBnB,SAAU4pB,EAAM5pB,SAChB7E,UAAWlQ,EAAQ,iBAAmB,KAEvCA,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MATlC2+B,EAAM78B,MAWzB,IAAK,QACH,cACG,MAAA,CACCmL,SAAA,CAAAQ,EAAAA,KAAC4F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,SAAA,CAAA0xB,EAAM3qB,MAAM,IAAE2qB,EAAMM,UAAYzxB,EAAAA,IAAC,OAAA,CAAK0C,UAAU,mBAAmBjD,SAAA,SAChGO,EAAAA,IAAC2F,GAAA,CACCiB,GAAIuqB,EAAM78B,KACVJ,KAAK,QACLiE,MAAOA,GAASg5B,EAAMC,cAAgB,UACtC7qB,SAAWlM,GAAMk4B,EAAYpB,EAAM78B,KAAM+F,EAAEwM,OAAO1O,OAClDuK,UAAU,SAEXlQ,GACCwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,gCAAiCjD,SAAAjN,MAVxC2+B,EAAM78B,MAepB,IAAK,eACH,cACG,MAAA,CACCmL,SAAA,CAAAO,EAAAA,IAACsG,GAAA,CACCE,MAAO,GAAG2qB,EAAM3qB,SAAS2qB,EAAMM,SAAW,IAAM,KAChDt5B,MAAOA,GAASg5B,EAAMC,cAAgB,UACtC7qB,SAAWO,GAAUyrB,EAAYpB,EAAM78B,KAAMwS,KAE9CtU,GACCwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,gCAAiCjD,SAAAjN,MAPxC2+B,EAAM78B,MAYpB,IAAK,cACH,cACG,MAAA,CACCmL,SAAA,CAAAO,EAAAA,IAACsf,GAAA,CACC9Y,MAAO,GAAG2qB,EAAM3qB,SAAS2qB,EAAMM,SAAW,IAAM,KAChDt5B,MAAOA,GAASg5B,EAAMC,cAAgB,OACtC7qB,SAAWowB,GAAapE,EAAYpB,EAAM78B,KAAMqiC,KAEjDnkC,GACCwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,gCAAiCjD,SAAAjN,MAPxC2+B,EAAM78B,MAYpB,IAAK,SACH,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,cAClCb,GAAA,CAAMiB,GAAIuqB,EAAM78B,KAAMJ,KAAK,SAASiE,MAAOA,QAAwC3E,OAAO2E,GAAS,GAAIoO,SAAUlM,IAClH,MAAMmzB,EAAanzB,EAAEwM,OAAO1O,MACtBq+B,EAA0B,KAAfhJ,EAAoB,KAAOpd,OAAOod,GACnD+E,EAAYpB,EAAM78B,KAAMkiC,IACvB9tB,YAAayoB,EAAMzoB,YAAanB,SAAU4pB,EAAM5pB,SAAU7E,UAAW,GAAGlQ,EAAQ,iBAAmB,MAAM2+B,EAAM5pB,SAAW,iCAAmC,KAAMqvB,IAAKzF,EAAMyF,IAAK/4B,KAAMszB,EAAMtzB,MAAQ,MACvMrL,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MAPlC2+B,EAAM78B,MASzB,QAEE,cAAQ,MAAA,CAAqBoO,UAAW,aAAayuB,EAAMzuB,WAAa,KACpEjD,SAAA,CAAAO,MAAC6F,GAAA,CAAMc,QAASwqB,EAAM78B,KAAOmL,WAAM+G,QACnCxG,EAAAA,IAAC2F,GAAA,CAAMiB,GAAIuqB,EAAM78B,KAAMJ,KAAK,OAAOiE,MAAOA,GAAS,GAAIoO,SAAUlM,IACjEk4B,EAAYpB,EAAM78B,KAAM+F,EAAEwM,OAAO1O,QAChCuQ,YAAayoB,EAAMzoB,YAAanB,SAAU4pB,EAAM5pB,SAAU7E,UAAW,GAAGlQ,EAAQ,iBAAmB,MAAM2+B,EAAM5pB,SAAW,iCAAmC,KAAMsvB,SAAU1F,EAAM5pB,WACnL/U,GAASwN,EAAAA,IAAC,IAAA,CAAE0C,UAAU,uBAAwBjD,SAAAjN,MALlC2+B,EAAM78B,QASvBwiC,EAAuBhS,EAAAA,YAAY,KACvC,IAAKoR,EAAgB,OAAO,KAG5B,GAAIA,EAAe3uB,SACjB,OAAOtH,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8DAClBjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,iCACbjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,gCAAgCq0B,KAAK,OAAOC,QAAQ,YAAYC,OAAO,eACpFx3B,SAAAO,EAAAA,IAAC,OAAA,CAAKk3B,cAAc,QAAQC,eAAe,QAAQC,YAAa,EAAGt2B,EAAE,gDAGzEd,EAAAA,IAAC,KAAA,CAAG0C,UAAU,6BAA6BjD,SAAA,yBAC3CO,EAAAA,IAAC,IAAA,CAAE0C,UAAU,iCAAiCjD,SAAA,mGAOpD,GAAIy2B,EAAemB,UAAW,CAC5B,MAAMC,EAAmBpB,EAAemB,UACxC,OAAOr3B,MAACs3B,GAAiB3G,WAAoB4B,cAA0BnhB,SAAgB+jB,MAAOO,EAAWnuB,SAAU2uB,EAAe3uB,UACpI,CAGA,OAAOvH,MAAC,OAAI0C,UAAU,YACjBjD,WAAe+wB,OAAOl9B,IAAI8iC,MAE9B,CAACF,EAAgBvF,EAAU4B,EAAanhB,EAAQskB,EAAWU,IAOxDmB,EAENt3B,EAAAA,KAAC,MAAA,CAAIyC,UAAU,6BAERjD,SAAA,CAAAs2B,EAAkBnjC,OAAS,GAAKoN,EAAAA,IAAC,MAAA,CAAI0C,UAAU,6BAC5CjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,iBACZjD,SAAAs2B,EAAkBziC,IAAIwiC,GACrB91B,EAAAA,IAACwC,EAAA,CAECZ,QAASq0B,IAAuBH,EAAQlvB,GAAK,iBAAmB,mBAChEzE,KAAK,KACL4E,QAAS,IAjBG,CAACywB,IAC3B,MAAM1B,EAAUC,EAAkB/c,KAAKjgB,GAAKA,EAAE6N,KAAO4wB,GACjD1B,IAAYA,EAAQvuB,UACtBquB,EAAiB4B,IAcUC,CAAoB3B,EAAQlvB,IAC3CW,SAAUuuB,EAAQvuB,SAClB7E,UAAWozB,EAAQvuB,SAAW,gCAAkC,GAE/D9H,SAAAq2B,EAAQrtB,OAPJqtB,EAAQlvB,SAcvB5G,EAAAA,IAAC,OAAI0C,UAAU,wDACZjD,WAAYO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,yCACxBjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,wBAAwBjD,SAAA,0BAChCQ,EAAAA,KAAC,OAAA,CAAKgzB,SAAUD,EAAaC,GAAWvwB,UAAU,yBACxDjD,SAAA,CAAAq3B,IAGL72B,EAAAA,KAAC,MAAA,CAAIyC,UAAU,kCACbjD,SAAA,CAAAO,EAAAA,IAACwC,GAAOtO,KAAK,SAAS0N,QAAQ,UAAUmF,QAASyuB,EAAU/1B,SAAA,mBAG1D+C,EAAA,CAAOtO,KAAK,SAASqT,SAAU2N,EAC7BzV,SAAAg2B,eAMf,OAAOz1B,EAAAA,IAAC2I,GAAA,CAAOb,OAAYC,aAAcgd,KAErB,IAAdA,IAAgC,IAATjd,GACzB0tB,KAGA/1B,SAAAQ,OAACiJ,GAAA,CAAcxG,UAAU,yCACvBjD,SAAA,CAAAQ,EAAAA,KAACmJ,GAAA,CAAa1G,UAAU,gEACtBjD,SAAA,CAAAO,EAAAA,IAACsJ,GAAA,CAAY5G,UAAU,aAAcjD,SAAAgJ,IACrCzI,EAAAA,IAACuJ,GAAA,CAAkB7G,UAAU,UAAUjD,SAAA,8CAIxC83B,MAGP,CC3TO,SAASG,GAAkB7kC,GAChC,MAAO,CAACk7B,EAAU,MAEhB,MAAMtU,EAAQsU,EAAQtU,MAAQjmB,OAAOu6B,EAAQtU,OAAS5mB,EAAK8kC,aAE3D,OADe9kC,EAAK+kC,QAAQne,IAAU5mB,EAAK+kC,QAAQ/kC,EAAK8kC,cAG5D,CCkCO,SAASE,GAAgBhlC,GAC9B,MAAO,CAACsF,EAAO41B,KAGb,IAAI+J,EACJ,GAAgB,gBAHA/J,GAASpV,QAAUnlB,OAAOu6B,EAAQpV,SAAW,eAG7B9lB,EAAKklC,iBAAkB,CACrD,MAAMJ,EAAe9kC,EAAKmlC,wBAA0BnlC,EAAK8kC,aACnDle,EAAQsU,GAAStU,MAAQjmB,OAAOu6B,EAAQtU,OAASke,EAEvDG,EACEjlC,EAAKklC,iBAAiBte,IAAU5mB,EAAKklC,iBAAiBJ,EAC1D,KAAO,CACL,MAAMA,EAAe9kC,EAAK8kC,aACpBle,EAAQsU,GAAStU,MAAQjmB,OAAOu6B,EAAQtU,OAAS5mB,EAAK8kC,aAE5DG,EAAcjlC,EAAKsL,OAAOsb,IAAU5mB,EAAKsL,OAAOw5B,EAClD,CAIA,OAAOG,EAHOjlC,EAAKolC,iBAAmBplC,EAAKolC,iBAAiB9/B,GAASA,GAKzE,CC/DO,SAAS+/B,GAAarlC,GAC3B,MAAO,CAACslC,EAAQpK,EAAU,MACxB,MAAMtU,EAAQsU,EAAQtU,MAEhB2e,EACH3e,GAAS5mB,EAAKwlC,cAAc5e,IAC7B5mB,EAAKwlC,cAAcxlC,EAAKylC,mBACpBC,EAAcJ,EAAO1hC,MAAM2hC,GAEjC,IAAKG,EACH,OAAO,KAET,MAAMC,EAAgBD,EAAY,GAE5BE,EACHhf,GAAS5mB,EAAK4lC,cAAchf,IAC7B5mB,EAAK4lC,cAAc5lC,EAAK6lC,mBAEpB59B,EAAMhI,MAAMmH,QAAQw+B,GA+B9B,SAAmBE,EAAOC,GACxB,IAAK,IAAI99B,EAAM,EAAGA,EAAM69B,EAAM/lC,OAAQkI,IACpC,GAAI89B,EAAUD,EAAM79B,IAClB,OAAOA,EAGX,MACF,CArCQ+9B,CAAUJ,EAAgBK,GAAYA,EAAQ9pB,KAAKwpB,IAkB3D,SAAiB97B,EAAQk8B,GACvB,IAAK,MAAM99B,KAAO4B,EAChB,GACE5G,OAAOnC,UAAU6F,eAAe3F,KAAK6I,EAAQ5B,IAC7C89B,EAAUl8B,EAAO5B,IAEjB,OAAOA,EAGX,MACF,CA1BQi+B,CAAQN,EAAgBK,GAAYA,EAAQ9pB,KAAKwpB,IAErD,IAAIrgC,EAEJA,EAAQtF,EAAKmmC,cAAgBnmC,EAAKmmC,cAAcl+B,GAAOA,EACvD3C,EAAQ41B,EAAQiL,cAEZjL,EAAQiL,cAAc7gC,GACtBA,EAIJ,MAAO,CAAEA,QAAO8gC,KAFHd,EAAOroB,MAAM0oB,EAAc5lC,SAI5C,CCnCA,MAAMsmC,GAAuB,CAC3BC,iBAAkB,CAChBC,IAAK,sBACLC,MAAO,+BAGTC,SAAU,CACRF,IAAK,YACLC,MAAO,sBAGTE,YAAa,cAEbC,iBAAkB,CAChBJ,IAAK,qBACLC,MAAO,8BAGTI,SAAU,CACRL,IAAK,WACLC,MAAO,qBAGTK,YAAa,CACXN,IAAK,kBACLC,MAAO,4BAGTM,OAAQ,CACNP,IAAK,SACLC,MAAO,mBAGTO,MAAO,CACLR,IAAK,QACLC,MAAO,kBAGTQ,YAAa,CACXT,IAAK,oBACLC,MAAO,8BAGTS,OAAQ,CACNV,IAAK,WACLC,MAAO,qBAGTU,aAAc,CACZX,IAAK,iBACLC,MAAO,4BAGTW,QAAS,CACPZ,IAAK,QACLC,MAAO,mBAGTY,YAAa,CACXb,IAAK,iBACLC,MAAO,2BAGTa,OAAQ,CACNd,IAAK,QACLC,MAAO,kBAGTc,WAAY,CACVf,IAAK,gBACLC,MAAO,0BAGTe,aAAc,CACZhB,IAAK,cACLC,MAAO,yBCpDEgB,GAAa,CACxBlI,KAAMuF,GAAkB,CACtBE,QAvBgB,CAClB0C,KAAM,2BACNC,KAAM,qBACNC,OAAQ,UACRC,MAAO,cAoBL9C,aAAc,SAGhB+C,KAAMhD,GAAkB,CACtBE,QArBgB,CAClB0C,KAAM,gBACNC,KAAM,aACNC,OAAQ,WACRC,MAAO,SAkBL9C,aAAc,SAGhBgD,SAAUjD,GAAkB,CAC1BE,QAnBoB,CACtB0C,KAAM,yBACNC,KAAM,yBACNC,OAAQ,qBACRC,MAAO,sBAgBL9C,aAAc,UCpCZiD,GAAuB,CAC3BC,SAAW1I,IACT,MAAM2I,EAAU3I,EAAK4I,SAErB,MAAO,KADkB,IAAZD,GAA6B,IAAZA,EAAgB,SAAW,UACrC,iBAEtBE,UAAW,eACXC,MAAO,cACPC,SAAU,gBACVC,SAAU,cACV9B,MAAO,KCVF,IAA6BxmC,GCc7B,MAAMuoC,GAAO,CAClBC,KAAM,QACNC,eJ+D4B,CAACrvB,EAAOkD,EAAO4e,KAC3C,IAAI8D,EAEJ,MAAM0J,EAAarC,GAAqBjtB,GASxC,OAPE4lB,EADwB,iBAAf0J,EACAA,EACU,IAAVpsB,EACAosB,EAAWnC,IAEXmC,EAAWlC,MAAMngC,QAAQ,YAAa1F,OAAO2b,IAGpD4e,GAASyN,UACPzN,EAAQ0N,YAAc1N,EAAQ0N,WAAa,EACtC,MAAQ5J,EAER,MAAQA,EAIZA,GIlFPwI,WAAYA,GACZqB,eFL4B,CAACzvB,EAAOkmB,EAAMwJ,EAAWC,KACrD,MAAMnpC,EAASmoC,GAAqB3uB,GAEpC,MAAsB,mBAAXxZ,EACFA,EAAO0/B,GAGT1/B,GEDPopC,SC+HsB,CACtBC,cAVoB,CAACC,EAAahO,KAClC,MAAMiO,EAAS5rB,OAAO2rB,GAEtB,MAAsB,SAAlBhO,GAAS5C,KACJ6Q,EAAS,IAEXA,EAAS,KAMhBC,IAAKpE,GAAgB,CACnB15B,OApJc,CAChB+9B,OAAQ,CAAC,KAAM,MACfC,YAAa,CAAC,KAAM,MACpBC,KAAM,CAAC,kBAAmB,qBAkJxBzE,aAAc,SAGhB0E,QAASxE,GAAgB,CACvB15B,OAnJkB,CACpB+9B,OAAQ,CAAC,IAAK,IAAK,IAAK,KACxBC,YAAa,CAAC,KAAM,KAAM,KAAM,MAChCC,KAAM,CAAC,eAAgB,eAAgB,eAAgB,iBAiJrDzE,aAAc,OACdM,iBAAmBoE,GAAYA,EAAU,IAG3CC,MAAOzE,GAAgB,CACrB15B,OAnJgB,CAClB+9B,OAAQ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAChEC,YAAa,CACX,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAGFC,KAAM,CACJ,UACA,YACA,QACA,QACA,OACA,QACA,QACA,SACA,WACA,UACA,WACA,aAuHAzE,aAAc,SAGhB4E,IAAK1E,GAAgB,CACnB15B,OAvHc,CAChB+9B,OAAQ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACvCzB,MAAO,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClD0B,YAAa,CACX,UACA,UACA,QACA,SACA,SACA,QACA,UAGFC,KAAM,CACJ,UACA,gBACA,cACA,eACA,eACA,cACA,WAoGAzE,aAAc,SAGhB6E,UAAW3E,GAAgB,CACzB15B,OApGoB,CACtB+9B,OAAQ,CACNO,GAAI,IACJC,GAAI,IACJC,SAAU,KACVC,KAAM,KACNC,QAAS,QACTC,UAAW,QACXC,QAAS,QACTC,MAAO,SAETb,YAAa,CACXM,GAAI,KACJC,GAAI,KACJC,SAAU,aACVC,KAAM,WACNC,QAAS,QACTC,UAAW,QACXC,QAAS,QACTC,MAAO,SAETZ,KAAM,CACJK,GAAI,OACJC,GAAI,OACJC,SAAU,aACVC,KAAM,WACNC,QAAS,QACTC,UAAW,QACXC,QAAS,QACTC,MAAO,UAwEPrF,aAAc,OACdI,iBArE8B,CAChCmE,OAAQ,CACNO,GAAI,IACJC,GAAI,IACJC,SAAU,KACVC,KAAM,KACNC,QAAS,WACTC,UAAW,WACXC,QAAS,WACTC,MAAO,YAETb,YAAa,CACXM,GAAI,KACJC,GAAI,KACJC,SAAU,aACVC,KAAM,WACNC,QAAS,WACTC,UAAW,WACXC,QAAS,WACTC,MAAO,YAETZ,KAAM,CACJK,GAAI,OACJC,GAAI,OACJC,SAAU,aACVC,KAAM,WACNC,QAAS,WACTC,UAAW,WACXC,QAAS,WACTC,MAAO,aAyCPhF,uBAAwB,UD1J1BvhC,MEuEmB,CACnBqlC,eH5FkCjpC,GG4FC,CACjCulC,aA1F8B,gBA2F9B6E,aA1F8B,OA2F9BjE,cAAgB7gC,GAAU+kC,SAAS/kC,EAAO,KH9FrC,CAACggC,EAAQpK,EAAU,MACxB,MAAMwK,EAAcJ,EAAO1hC,MAAM5D,GAAKulC,cACtC,IAAKG,EAAa,OAAO,KACzB,MAAMC,EAAgBD,EAAY,GAE5B4E,EAAchF,EAAO1hC,MAAM5D,GAAKoqC,cACtC,IAAKE,EAAa,OAAO,KACzB,IAAIhlC,EAAQtF,GAAKmmC,cACbnmC,GAAKmmC,cAAcmE,EAAY,IAC/BA,EAAY,GAOhB,OAJAhlC,EAAQ41B,EAAQiL,cAAgBjL,EAAQiL,cAAc7gC,GAASA,EAIxD,CAAEA,QAAO8gC,KAFHd,EAAOroB,MAAM0oB,EAAc5lC,WGmF1CqpC,IAAK/D,GAAa,CAChBG,cA7FqB,CACvB6D,OAAQ,gBACRC,YAAa,8BACbC,KAAM,wCA2FJ9D,kBAAmB,OACnBG,cA1FqB,CACvB2E,IAAK,CAAC,OAAQ,QACdhB,KAAM,CAAC,oBAAqB,uBAyF1B1D,kBAAmB,QAGrB2D,QAASnE,GAAa,CACpBG,cA1FyB,CAC3B6D,OAAQ,WACRC,YAAa,YACbC,KAAM,0BAwFJ9D,kBAAmB,OACnBG,cAvFyB,CAC3B2E,IAAK,CAAC,KAAM,KAAM,KAAM,OAuFtB1E,kBAAmB,MACnBM,cAAgBpoB,GAAUA,EAAQ,IAGpC0rB,MAAOpE,GAAa,CAClBG,cAzFuB,CACzB6D,OAAQ,gBACRC,YAAa,sDACbC,KAAM,gGAuFJ9D,kBAAmB,OACnBG,cAtFuB,CACzByD,OAAQ,CACN,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAGFkB,IAAK,CACH,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,UA2DA1E,kBAAmB,QAGrB6D,IAAKrE,GAAa,CAChBG,cA3DqB,CACvB6D,OAAQ,2BACRzB,MAAO,2BACP0B,YAAa,qCACbC,KAAM,4EAwDJ9D,kBAAmB,OACnBG,cAvDqB,CACvBgC,MAAO,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,WAClDyB,OAAQ,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,WACnDkB,IAAK,CAAC,MAAO,QAAS,MAAO,QAAS,QAAS,QAAS,aAqDtD1E,kBAAmB,QAGrB8D,UAAWtE,GAAa,CACtBG,cAtD2B,CAC7B6D,OAAQ,yCACRkB,IAAK,2EAqDH9E,kBAAmB,MACnBG,cApD2B,CAC7B2E,IAAK,CACHX,GAAI,MACJC,GAAI,MACJC,SAAU,uBACVC,KAAM,qBACNC,QAAS,SACTC,UAAW,SACXC,QAAS,SACTC,MAAO,WA4CPtE,kBAAmB,SF9GrB3K,QAAS,CACPsP,aAAc,EACdC,sBAAuB,IGTdC,GAAkD,EAC7DC,SACAC,WACAC,iBACArd,YAAW,EACXsd,aAAY,EACZC,eAEA,MAAMC,EAAQ,GAGd,GAAIL,EAAQ,CACV,MAAMM,EAAW,CACfx7B,KAAM4a,EAAAA,KACN1W,MAAO,SACPO,QAASy2B,GAEXK,EAAMltB,KAAKmtB,EACb,CAGA,GAAIJ,EAAgB,CAClB,MAAMK,EAAa,CACjBz7B,KAAM+d,EAAW2d,EAAAA,SAAWC,EAAAA,MAC5Bz3B,MAAO6Z,EAAW,WAAa,SAC/BtZ,QAAS22B,GAEXG,EAAMltB,KAAKotB,EACb,CAGA,GAAIJ,GAAaF,EAAU,CACzB,MAAMS,EAAa,CACjB57B,KAAM6a,EAAAA,OACN3W,MAAO,UACPO,QAAS02B,EACT37B,aAAa,GAEf+7B,EAAMltB,KAAKutB,EACb,CAEA,MAAiB,aAAbN,EAEA59B,EAAAA,IAAAG,EAAAA,SAAA,CACGV,SAAAo+B,EAAMvqC,IAAI,CAACC,EAAMqd,IAChB3Q,EAAAA,KAACuK,GAAA,CAECzD,QAASxT,EAAKwT,QACdrE,UAAWnP,EAAKuO,YAAc,mBAAqB,GAEnDrC,SAAA,CAAAO,EAAAA,IAACzM,EAAK+O,KAAL,CAAUI,UAAU,iBACpBnP,EAAKiT,QALDoK,MAcb5Q,EAAAA,IAAAG,EAAAA,SAAA,CACGV,SAAAo+B,EAAMvqC,IAAI,CAACC,EAAMqd,IAChB3Q,EAAAA,KAACuC,EAAA,CAECZ,QAAQ,QACRO,KAAK,KACL4E,QAASxT,EAAKwT,QACdrE,UAAW,8DACTnP,EAAKuO,YAAc,0CAA4C,IAGjErC,SAAA,CAAAO,EAAAA,IAACzM,EAAK+O,KAAL,CAAUI,UAAU,iBACpBnP,EAAKiT,QATDoK,OChEFutB,GAAkD,EAC7DX,SACAC,WACAE,aAAY,EACZD,iBACArd,YAAW,YAkBR7W,GAAA,CACC/J,SAAA,CAAAO,MAAC0J,IAAoB/G,SAAO,EAC1BlD,SAAAO,EAAAA,IAACwC,EAAA,CAAOZ,QAAQ,UAAUO,KAAK,KAAKO,UAAU,0EAC5CjD,SAAAO,MAACo+B,EAAAA,iBAAA,CAAiBj8B,KAAM,SAG5BnC,EAAAA,IAACuK,GAAA,CAAoBpE,MAAM,MACzB1G,SAAAO,EAAAA,IAACu9B,GAAA,CACCC,OAxBYnjC,IAClBA,GAAG64B,kBACHsK,OAuBMC,SApBcpjC,IACpBA,GAAG64B,kBACHuK,OAmBMC,eAhBoBrjC,IAC1BA,GAAG64B,kBACHwK,OAeMrd,WACAsd,YACAC,SAAS,kBC7BZ,MAAMS,GAAY,EACvBC,UACA1W,UACA4V,SACAe,SACAb,iBACAD,WACAe,oBAEA,MAAOra,EAAUC,GAAe/b,EAAAA,UAAS,IAClCo2B,EAAaC,GAAkBr2B,EAAAA,SAI5B,MAEVC,EAAAA,UAAU,KACR,MAAM+b,EAAc,IAAMD,EAAY9P,OAAOgQ,WAAa,KAG1D,OAFAD,IACA/P,OAAOiQ,iBAAiB,SAAUF,GAC3B,IAAM/P,OAAOkQ,oBAAoB,SAAUH,IACjD,IAGH/b,EAAAA,UAAU,KACR,MAAMq2B,EAAqB,IAAMD,EAAe,MAChD,GAAID,EAEF,OADAG,SAASra,iBAAiB,QAASoa,GAC5B,IAAMC,SAASpa,oBAAoB,QAASma,IAEpD,CAACF,IAEJ,MAmDMI,EA3CwB,MAEPjX,EAAQh1B,OAG7B,IAAIksC,EAAgB,EAEpB,MAAMC,EAAgBnX,EAAQt0B,IAAI0rC,IAChC,GAAIA,EAAOvlB,MAGT,OADAqlB,GAAiBE,EAAOvlB,MACjB,IAAKulB,EAAQC,gBAAiBD,EAAOvlB,MAAOylB,SAAS,GACvD,CACL,MAAMC,EAAWH,EAAOG,UAAY,IAC9BC,EAASJ,EAAOI,QAAU,EAGhC,OAFAN,GAAiBK,EAEV,IAAKH,EAAQC,gBAAiBE,EAAUC,SAAQF,SAAS,EAClE,IAMF,OAHAJ,GApB0B,IAuBnBC,EAAczrC,IAAI6H,GACnBA,EAAO+jC,QACF,IACF/jC,EACHsL,MAAO,CAAEgT,MAAO,GAAGte,EAAO8jC,sBAIrB,IACF9jC,EACHsL,MAAO,CACL04B,SAAU,GAAGhkC,EAAO8jC,oBACpBxlB,MAAO,GAAGte,EAAO8jC,wBAONI,GAErB,OAAIlb,EACEma,EAAQppB,UACHlV,EAAAA,IAACgoB,GAAA,CAAa7Y,MAAO,IAGE,IAA5BmvB,EAAQgB,SAAS1sC,OAEjBoN,EAAAA,IAAC0L,GAAA,CACCjD,MAAM,yBACNkD,YAAY,uCACZ/J,QAAQ,WAMZ3B,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACZjD,SAAA,CAAA6+B,EAAQgB,SAAShsC,IAAIC,GAAQyM,EAAAA,IAACqF,GAAA,CAE7B3C,UAAU,mDACVqE,QAAU1M,IACRA,EAAE64B,kBACFsK,IAASjqC,IAEXgsC,cAAgBllC,IACdA,EAAEgrB,iBACFhrB,EAAE64B,kBACFwL,EAAe,CACbrpC,EAAGgF,EAAEmlC,QACLC,EAAGplC,EAAEqlC,QACLnsC,UAIJkM,SAAAQ,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,MACpBjD,SAAA,CAAAmoB,EAAQt0B,IAAI0rC,GAAU/+B,EAAAA,KAAC,MAAA,CAAqByC,UAAU,kDACrDjD,SAAA,CAAAQ,EAAAA,KAAC,OAAA,CAAKyC,UAAU,yDACbjD,SAAA,CAAAu/B,EAAOW,OAAO,OAEjB3/B,EAAAA,IAAC,MAAA,CAAI0C,UAAU,oDACZjD,SAAAu/B,EAAOlqC,OAASkqC,EAAOlqC,OAAOvB,GAASA,EAAayrC,EAAOlkC,SAL/BkkC,EAAOlkC,OAStC0iC,GAAUe,GAAUC,IAAkBx+B,EAAAA,IAAC,MAAA,CAAI0C,UAAU,sCAAsCqE,QAAU1M,GAAMA,EAAE64B,kBAC5GzzB,SAAA++B,EAAgBA,EAAcjrC,GAC7ByM,EAAAA,IAACm+B,GAAA,CACCX,OAAQA,EAAS,KACfA,EAAOjqC,SACL,EACJkqC,SAAUA,EAAW,IAAMA,EAASlqC,QAAQ,EAC5CmqC,eAAgBA,EAAiB,IAAMA,EAAenqC,QAAQ,EAC9D8sB,SAAW9sB,EAAaqsC,mBAlC3BrsC,EAAKqT,KA0CX63B,GACCz+B,EAAAA,IAAC,MAAA,CACC0C,UAAU,wFACV+D,MAAO,CAAEuc,KAAMyb,EAAYppC,EAAGytB,IAAK2b,EAAYgB,GAC/C14B,QAAU1M,GAAMA,EAAE64B,kBAElBzzB,SAAAO,EAAAA,IAACu9B,GAAA,CACCC,OAAQA,EAAS,KACfA,EAAOiB,EAAYlrC,MACnBmrC,EAAe,YACb,EACJjB,SAAUA,EAAW,KACnBA,EAASgB,EAAYlrC,MACrBmrC,EAAe,YACb,EACJhB,eAAgBA,EAAiB,KAC/BA,EAAee,EAAYlrC,MAC3BmrC,EAAe,YACb,EACJre,SAAWoe,EAAYlrC,KAAaqsC,WACpCjC,YAAaF,EACbG,SAAS,iBASnB39B,EAAAA,KAAC,MAAA,CAAIyC,UAAU,uBACZjD,SAAA,CAAA6+B,EAAQppB,UACPlV,EAAAA,IAAC0nB,GAAA,CAAcC,KAAM,EAAGC,QAASA,EAAQh1B,SACX,IAA5B0rC,EAAQgB,SAAS1sC,OACnBoN,EAAAA,IAAC0L,GAAA,CACCjD,MAAM,yBACNkD,YAAY,uCACZ/J,QAAQ,WAGV5B,EAAAA,IAAC,MAAA,CAAI0C,UAAU,uCACbjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,uBACbjD,SAAAQ,EAAAA,KAAC6oB,GAAA,CAAMpmB,UAAU,cACfjD,SAAA,CAAAQ,OAAC,WAAA,CACER,SAAA,CAAAo/B,EAAavrC,IAAI,CAAC6H,EAAQyV,IACzB5Q,EAAAA,IAAC,OAAgByG,MAAOtL,EAAOsL,OAArBmK,UAEX,MAAA,CAAInK,MAAO,CAAEgT,MAAO,cAEvBzZ,EAAAA,IAAC+oB,GAAA,CACCtpB,SAAAQ,EAAAA,KAACgpB,GAAA,CACExpB,SAAA,CAAAmoB,EAAQt0B,IAAI0rC,IACXh/B,SAAAA,IAACkpB,GAAA,CAECxmB,UAAW,GAAGs8B,EAAOt8B,WAAa,MAAMs8B,EAAOa,SAAW,mCAAqC,KAC/F94B,QAASi4B,EAAOa,SAAW,IAAMvB,EAAQwB,WAAWd,EAAOlkC,UAAO,EAElE2E,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAW,sBAAqBs8B,EAAOt8B,WAAWvJ,SAAS,eAAiB,iBAAmB,IACjGsG,SAAA,CAAAu/B,EAAOW,OACPX,EAAOa,WA5KTE,EA4KiCf,EAAOlkC,IA3KvDwjC,EAAQ0B,YAAcD,EACjB//B,EAAAA,IAACigC,EAAAA,YAAA,CAAY99B,KAAM,GAAIO,UAAU,oBAET,QAA1B47B,EAAQ4B,cAA0BlgC,EAAAA,IAACyd,WAAQtb,KAAM,GAAIO,UAAU,SAAY1C,EAAAA,IAAC0d,YAAA,CAAUvb,KAAM,GAAIO,UAAU,cAkK1Fs8B,EAAOlkC,KAtKZ,IAACilC,IAgLL//B,EAAAA,IAACkpB,GAAA,CAAUxmB,UAAU,wBAAwBjD,SAAA,eAGjDO,MAACgpB,GAAA,CACEvpB,SAAA6+B,EAAQgB,SAAShsC,IAAIC,GACpB0M,EAAAA,KAACgpB,GAAA,CAECvmB,UAAU,mCACVqE,QAAU1M,IACRA,EAAE64B,kBACFsK,IAASjqC,IAEXgsC,cAAgBllC,IACdA,EAAEgrB,iBACFhrB,EAAE64B,kBACFwL,EAAe,CACbrpC,EAAGgF,EAAEmlC,QACLC,EAAGplC,EAAEqlC,QACLnsC,UAIHkM,SAAA,CAAAmoB,EAAQt0B,IAAI0rC,GACXh/B,EAAAA,IAACmpB,IAA2BzmB,UAAWs8B,EAAOt8B,UAC3CjD,SAAAu/B,EAAOlqC,OAASkqC,EAAOlqC,OAAOvB,GAASA,EAAayrC,EAAOlkC,MAD9CkkC,EAAOlkC,YAIxBquB,GAAA,CAAUzmB,UAAU,cAClBjD,SAAA++B,EAAgBA,EAAcjrC,GAC7ByM,EAAAA,IAACm+B,GAAA,CACCX,OAAQA,EAAS,IAAMA,EAAOjqC,QAAQ,EACtCkqC,SAAUA,EAAW,IAAMA,EAASlqC,QAAQ,EAC5CmqC,eAAgBA,EAAiB,IAAMA,EAAenqC,QAAQ,EAC9D8sB,SAAW9sB,EAAaqsC,iBA3BzBrsC,EAAKqT,cAuCzB63B,GACCz+B,EAAAA,IAAC,MAAA,CACC0C,UAAU,wFACV+D,MAAO,CAAEuc,KAAMyb,EAAYppC,EAAGytB,IAAK2b,EAAYgB,GAC/C14B,QAAU1M,GAAMA,EAAE64B,kBAElBzzB,SAAAO,EAAAA,IAACu9B,GAAA,CACCC,OAAQA,EAAS,KACfA,EAAOiB,EAAYlrC,MACnBmrC,EAAe,YACb,EACJjB,SAAUA,EAAW,KACnBA,EAASgB,EAAYlrC,MACrBmrC,EAAe,YACb,EACJhB,eAAgBA,EAAiB,KAC/BA,EAAee,EAAYlrC,MAC3BmrC,EAAe,YACb,EACJre,SAAWoe,EAAYlrC,KAAaqsC,WACpCjC,YAAaF,EACbG,SAAS,kBCxRZ,SAASuC,IAA+Br4B,KAC7CA,EAAAW,MACAA,EAAA8sB,SACAA,EAAA9E,YACAA,EAAAwC,SACAA,EAAAuC,SACAA,EAAAtgB,UACAA,GAAY,EAAAugB,iBACZA,EAAmB,WAEnB,OACEz1B,EAAAA,IAACs1B,GAAA,CACCxtB,OACAW,QACA8sB,WACA9E,cACAwC,WACAuC,WACAtgB,YACAugB,oBAGN,CClBO,MAAM2K,GAAc,EAAG9B,cAC5B,MAAM1qB,WACJA,EAAa,CAAEysB,WAAY,EAAGC,WAAY,GAAEC,YAC5CA,EAAc,EAAAC,aACdA,EAAe,GAAAC,iBACfA,EAAmB,OAAOC,yBAC1BA,EAA2B,QACzBpC,GAEE+B,WAAEA,EAAa,EAAAC,WAAGA,EAAa,GAAM1sB,EAErC+sB,EAAYN,EAAa,GAAME,EAAc,GAAKC,EAAgB,EAAI,EACtEI,EAAU7tB,KAAK6jB,IAAI2J,EAAcC,EAAcH,GAOrD,OACEpgC,EAAAA,KAAC,MAAA,CAAIyC,UAAU,qIAEbjD,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAO,EAAAA,IAAC,QAAKP,SAAA,qBACNQ,EAAAA,KAACkhB,GAAA,CACChpB,MAAOqoC,EAAalwB,WACpB8kB,cAAgBj9B,GAAUuoC,EAAyBtwB,OAAOjY,IAE1DsH,SAAA,CAAAO,MAACwhB,GAAA,CAAc9e,UAAU,yBACvBjD,SAAAO,MAACshB,gBAEFQ,GAAA,CACCriB,SAAA,CAAAO,EAAAA,IAACiiB,GAAA,CAAW9pB,MAAM,KAAKsH,SAAA,OACvBO,EAAAA,IAACiiB,GAAA,CAAW9pB,MAAM,KAAKsH,SAAA,OACvBO,EAAAA,IAACiiB,GAAA,CAAW9pB,MAAM,KAAKsH,SAAA,OACvBO,EAAAA,IAACiiB,GAAA,CAAW9pB,MAAM,MAAMsH,SAAA,iBAM9BO,EAAAA,IAAC,OAAI0C,UAAU,6BACbjD,eAAC,OAAA,CACEA,SAAA4gC,EAAa,EACV,GAAGM,KAAaC,QAAcP,mBAA4BE,QAAkBD,KAC5E,cAMRrgC,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAO,MAACwC,EAAA,CAAOZ,QAAQ,UAAUO,KAAK,KAAK4E,QAtClB,IAAM05B,EAAiB,GAsCqBl5B,SAA0B,IAAhBg5B,EACtE9gC,SAAAO,MAAC6gC,EAAAA,aAAA,CAAan+B,UAAU,cAE1B1C,MAACwC,EAAA,CAAOZ,QAAQ,UAAUO,KAAK,KAAK4E,QAxCf,IAAM05B,EAAiB1tB,KAAK+tB,IAAI,EAAGP,EAAc,IAwCLh5B,SAA0B,IAAhBg5B,EACzE9gC,SAAAO,MAACwd,EAAAA,YAAA,CAAY9a,UAAU,cAEzB1C,MAACwC,EAAA,CAAOZ,QAAQ,UAAUO,KAAK,KAAK4E,QA1CnB,IAAM05B,EAAiB1tB,KAAK6jB,IAAI0J,EAAYC,EAAc,IA0Cdh5B,SAAUg5B,IAAgBD,EACrF7gC,SAAAO,MAACkF,EAAAA,aAAA,CAAaxC,UAAU,cAE1B1C,EAAAA,IAACwC,EAAA,CAAOZ,QAAQ,UAAUO,KAAK,KAAK4E,QA5CnB,IAAM05B,EAAiBH,GA4CqB/4B,SAAUg5B,IAAgBD,EACrF7gC,SAAAO,EAAAA,IAAC+gC,EAAAA,cAAA,CAAcr+B,UAAU,qBC7D5B,SAASs+B,IAA+B1C,QAC7CA,EAAAnjC,OACAA,EAAA8lC,aACAA,EAAAC,OACAA,EAAAC,cACAA,EAAAC,eACAA,EAAA1D,eACAA,IAEA,MAAO2D,EAAYC,GAAiBj5B,EAAAA,UAAS,IACtCk5B,EAAeC,GAAoBn5B,EAAAA,SAAmB,OACtDo5B,EAAoBC,GAAyBr5B,WAIjD,CACDs5B,QAAQ,EACRC,SAAU,KACV35B,WAAY,KAQR45B,EAAcntB,IAClB8sB,EAAiB9sB,GACjB4sB,GAAc,IAGV/4B,EAAe,KACnB+4B,GAAc,GACdE,EAAiB,OAGbM,EAAuBvgC,IAC3B2/B,EAAO3/B,GACP+/B,GAAc,GACdE,EAAiB,OAGbO,EAAqBrtB,IACzBgtB,EAAsB,CACpBC,QAAQ,EACRC,SAAUltB,EAAO9N,GACjBqB,WAAayM,EAAejM,OAAUiM,EAAepgB,MAAQ,UAejE,OACE2L,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BAEbjD,SAAA,CAAAO,MAAC,MAAA,CAAI0C,UAAU,mFACbjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,0BACbjD,SAAAQ,EAAAA,KAACuC,EAAA,CAAOuE,QA7CE,KAChBy6B,EAAiB,MACjBF,GAAc,IA2CoB5+B,UAAU,0BACpCjD,SAAA,CAAAO,EAAAA,IAACod,EAAAA,KAAA,CAAKjb,KAAM,KAAM,cASxBnC,EAAAA,IAAC,MAAA,CAAI0C,UAAU,uCACZjD,SAAA2hC,EACCphC,EAAAA,IAACohC,EAAA,CACC9C,UACAd,OAAQqE,EACRpE,SAAUsE,EACVrE,mBAGF19B,EAAAA,IAACq+B,GAAA,CACCC,UACA1W,QAASzsB,EAAOysB,QAChB4V,OAAQqE,EACRpE,SAAUsE,EACVrE,2BAML,MAAA,CAAIh7B,UAAU,uCACbjD,SAAAO,EAAAA,IAACogC,GAAA,CAAY9B,cAId6C,EACCnhC,EAAAA,IAACmhC,EAAA,CACCr5B,KAAMu5B,EACN7L,SAAUjtB,EACV0qB,SAAU6O,EACVP,gBACArsB,UAAWopB,EAAQppB,YAGrBlV,EAAAA,IAACmgC,GAAA,CACCr4B,KAAMu5B,EACN54B,MAAO84B,EAAgB,UAAUpmC,EAAO8M,aAAe,QAAQ9M,EAAO8M,aACtEstB,SAAU0L,EACVxQ,YAAa8Q,QAAiB,EAC9BtO,SAAU6O,EACVtM,SAAUjtB,EACV2M,UAAWopB,EAAQppB,UACnBugB,iBAAkB8L,EAAgB,YAAc,UAKpDvhC,EAAAA,IAAC6H,GAAA,CACCC,KAAM25B,EAAmBE,OACzB55B,aApEqB,KACzB25B,EAAsB,CAAEC,QAAQ,EAAOC,SAAU,KAAM35B,WAAY,MAoE/DD,UAAYzU,IA3EZkuC,EAAmBG,WACrBtD,EAAQ0D,aAAaP,EAAmBG,UACxCF,EAAsB,CAAEC,QAAQ,EAAOC,SAAU,KAAM35B,WAAY,OA0EjE1U,KAAMkuC,EAAmBG,SAAW,CAAEh7B,GAAI66B,EAAmBG,SAAUn5B,MAAOg5B,EAAmBx5B,iBAAe,EAChHA,WAAY9M,EAAO8M,WACnBC,WAAYo2B,EAAQp2B,eAI5B,CC7IO,MAAM+5B,GACX,6BAAqBtzB,GACnB,MAAMkmB,EAAY9oB,GAAa4C,mBAE/B,OAAKkmB,IACH9jB,GAAaG,YAAY,uDAAuD,GACzE,KAIX,CAEA,uCAAagxB,CACX5C,EACAvR,GAGA,IAAKuR,GAAgC,IAApBA,EAAS1sC,OAExB,OADAme,GAAaG,YAAY,sBAAsB6c,EAAQ9lB,2CAA2C,GAC3Fq3B,EAGT,IACE,MAAMzK,QAAkB5jB,KAAKtC,mBAE7B,IAAKkmB,EACH,OAAOyK,EAAShsC,IAAIohB,IAAA,IACfA,EACHytB,iBAAkBztB,EAAO0tB,QAAU,uBAAyB,QAIhE,MAAM/0B,MAAEA,EAAAwB,UAAOA,GAAcgmB,EAE7B,IAAKxnB,IAAUwB,EAEb,OADAkC,GAAaG,YAAY,sBAAsB6c,EAAQ9lB,sDAAsDoF,mBAAuBwB,KAAa,GAC1IywB,EAAShsC,IAAIohB,IAAA,IACfA,EACHytB,iBAAkBztB,EAAO0tB,QAAU,qCAAqC/0B,mBAAuBwB,KAAe,QAKlH,MAAMwzB,QAAqBlP,GAAWyB,SAASvnB,GAGzCi1B,EAA+BhD,EAAShsC,IAAIohB,IAChD,GAAIA,EAAO0tB,QAAS,CAElB,MAAMG,EAAkBF,EAAarpB,QAAa7D,EAAKkf,SAAW3f,EAAO0tB,SAEzE,MAAO,IACF1tB,EACHytB,iBAAkBI,GAAiBhO,UAAY,sBAAsB7f,EAAO0tB,UAEhF,CACA,MAAO,IACF1tB,EACHytB,iBAAkB,QAIDG,EAA6B5iC,OAAOrF,GACvDA,EAAE8nC,mBACD9nC,EAAE8nC,iBAAiBhpC,SAAS,uBAC5BkB,EAAE8nC,iBAAiBhpC,SAAS,WAC5BkB,EAAE8nC,iBAAiBhpC,SAAS,0BAC5BkB,EAAE8nC,iBAAiBhpC,SAAS,4BAC7BvG,OAEF,OAAO0vC,CAET,OAAS9vC,GAGP,OAFAue,GAAaG,YAAY1e,aAAiBgE,MAAQhE,EAAQ,sBAAsBu7B,EAAQ9lB,+BAEjFq3B,EAAShsC,IAAIohB,IAAA,IACfA,EACHytB,iBAAkBztB,EAAO0tB,QAAU,SAAS5vC,EAAMoM,UAAY,OAElE,CACF,EC5EF,MAAM4jC,GAAiB,CAAC,yeCDjB,UAAmB/iC,SACxBA,EAAAgjC,QACAA,EAAAC,cACAA,EAAAC,WACAA,GAAa,IAEb,MAAMC,EAAmBH,GAAWziC,EAAAA,IAACgvB,GAAA,CAAW7zB,OAAQunC,IAExD,OACE1iC,EAAAA,IAACgqB,IAAmB7uB,OAAQunC,EAC1BjjC,eAACskB,GAAA,CACCtkB,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,oDACZjD,SAAA,CAAAmjC,EACD3iC,EAAAA,KAAC,OAAA,CAAKyC,UAAU,8CACbjD,SAAA,CAAAkjC,SACE,MAAA,CAAIjgC,UAAU,gBACbjD,SAAAO,MAACgtB,SAGLhtB,EAAAA,IAAC,MAAA,CAAI0C,UAAU,uCACZjD,sBAOf,6CrDNqE,EAAGA,eACtE,MAAOojC,EAAWC,GAAgBz6B,EAAAA,SA5B3B,CACL8M,KAAM,KACNC,UAAW,GACX/H,MAAO,KACP4H,iBAAiB,EACjBC,WAAW,IAwBP6tB,EAAcC,EAAAA,kBAGb7V,EAAiB8V,GAAsB56B,EAAAA,UAAS,IAChD66B,EAAgBC,GAAqB96B,EAAAA,SAAS,GAG/C+6B,EAAkBte,cAAaue,IACnCP,UAA2BQ,KAASD,MACnC,IAGGE,EAAaze,cAAa5P,IAC9B4tB,EAAaQ,IAAA,IAAcA,EAAMpuB,gBAChC,IAGGsuB,EAAiB1e,EAAAA,YAAY,KACjCge,EA/CK,CACL3tB,KAAM,KACNC,UAAW,GACX/H,MAAO,KACP4H,iBAAiB,EACjBC,WAAW,KA2CV,IAGG2V,EAAa/F,cAAYsJ,MAAOnV,IACpC,IACEsqB,GAAW,GAGX,MAAM/rB,EAAczL,GAAaK,iBACjC,IAAKoL,EAEH,YADA1jB,QAAQtB,MAAM,iEAKhB,MAAMsjB,QAAyBf,GAAYgB,sBAAsByB,EAAayB,EAAQ5L,OACtF,IAAKyI,EAEH,YADAhiB,QAAQtB,MAAM,gEAKhBuZ,GAAaS,iBAAiBsJ,GAG9B/J,GAAaqB,iBAAiB6L,EAAQ5L,OAGtC+1B,EAAgB,CACd/1B,MAAO4L,EAAQ5L,cAIX01B,EAAYU,mBAEpB,OAASjxC,GACPsB,QAAQtB,MAAM,uCAAwCA,EAAOymB,EAC/D,CAAA,QACEsqB,GAAW,EACb,GACC,CAACH,EAAiBL,EAAaQ,IAG5BxsB,EAAkB+N,EAAAA,YAAYsJ,eACrBrZ,GAAYgC,kBACxB,IAEGa,EAASkN,EAAAA,YAAYsJ,UACzBrZ,GAAY6C,SACZ4rB,UACMT,EAAYW,SACjB,CAACF,EAAgBT,IAIdY,EAAmB7e,cAAa8e,IACpCX,EAAmBW,IAClB,IAEGxW,EAActI,EAAAA,YAAY,KAC9Bqe,EAAkBG,GAAQA,EAAO,IAChC,IAEGjW,EAAcvI,EAAAA,YAAY,KAC9Bqe,EAAkBG,GAAQA,EAAO,IAChC,IAGHh7B,EAAAA,UAAU,KACe8lB,WACrB,UAEQ,IAAIyV,QAAQC,GAAWt0B,WAAWs0B,EAAS,MAEjD,MAAMC,QAAmBhvB,GAAYC,aAEjC+uB,GAAcA,EAAW9uB,gBAC3BmuB,EAAgB,CACdjuB,KAAM4uB,EAAW5uB,KACjBC,UAAW2uB,EAAW3uB,UACtB/H,MAAO02B,EAAW12B,MAClB4H,iBAAiB,EACjBC,WAAW,IAKbquB,GAAW,EAEf,OAAS/wC,GACPsB,QAAQtB,MAAM,sDAAuDA,GACrE+wC,GAAW,EACb,GAGFS,IACC,CAACZ,EAAiBG,IAGrB,MAAMje,EAAeC,EAAAA,QAAQ,KAAA,IACxBsd,EACHjrB,SACAb,kBACA8T,aACAG,eAAgB6X,EAAUztB,UAG1B+X,kBACAwW,mBACAvW,cACAC,gBACE,CAACwV,EAAWjrB,EAAQb,EAAiB8T,EAAYsC,EAAiBwW,EAAkBvW,EAAaC,IAErG,aACG7U,GAAYoC,SAAZ,CAAqBziB,MAAOmtB,EAC1B7lB,2EsD1JA,UAA4C6+B,QACjDA,EAAAnjC,OACAA,EAAA8lC,aACAA,EAAAC,OACAA,EAAAC,cACAA,EAAAC,eACAA,EAAA1D,eACAA,IAEA,MAAMiG,iBAAEA,EAAAtW,YAAkBA,GAAgB3U,KAU1C,OAPApQ,EAAAA,UAAU,KACRq7B,GAAiB,GACV,KACLA,GAAiB,KAElB,CAACA,IAGF3jC,EAAAA,IAACghC,GAAA,CACC1C,UACAnjC,SACA8lC,eACAC,SACAC,gBACAC,iBACA1D,kBAGN,0PCvC4B,KAC1B,MAAM3mB,gBAAEA,GAAoB2B,MACrBlmB,EAAOyxC,GAAY57B,EAAAA,SAAwB,OAC3C67B,EAAYC,GAAiB97B,EAAAA,UAAS,GAE7CC,EAAAA,UAAU,KACe8lB,WACrB,IAGE,SADsBrX,IACT,CAEXzC,OAAO8vB,QAAQC,aAAa,CAAA,EAAIzF,SAASn2B,MAAO,KAGhD,MAAM67B,EAAYp4B,aAAaG,QAAQ,mBACnCi4B,GACFp4B,aAAaa,WAAW,mBACxBuH,OAAOlW,SAASuY,KAAO2tB,GAEvBhwB,OAAOlW,SAASuY,KAAO,GAE3B,MACEstB,EAAS,0CAEb,OAASvlC,GACP5K,QAAQtB,MAAM,0CAA2CkM,GACzDulC,EAASvlC,GAAKE,SAAW,gDAC3B,GAGF2lC,IACC,CAACxtB,IAEJ,MAAMytB,EAAcpW,UAClB+V,GAAc,GACdF,EAAS,MAET,UACwBltB,KAEpBktB,EAAS,0CAEb,OAASvlC,GACPulC,EAASvlC,GAAKE,SAAW,4BAC3B,CAAA,QACEulC,GAAc,EAChB,GAGIM,EAAe,KACnBnwB,OAAOlW,SAASuY,KAAO,KAGzB,OAAInkB,QAEC,MAAA,CAAIkQ,UAAU,gGACbjD,SAAAQ,EAAAA,KAACoF,GAAA,CAAK3C,UAAU,kBACdjD,SAAA,CAAAO,EAAAA,IAACsF,IAAW5C,UAAU,cACpBjD,SAAAQ,EAAAA,KAACsF,GAAA,CAAU7C,UAAU,gFACnBjD,SAAA,CAAAO,EAAAA,IAACyL,EAAAA,YAAA,CAAY/I,UAAU,YAAY,4BAIvCzC,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,YACrBjD,SAAA,CAAAO,EAAAA,IAACoE,IAAMxC,QAAQ,cACbnC,SAAAO,MAACuE,GAAA,CACE9E,qBAIJ,MAAA,CAAIiD,UAAU,gCACbjD,SAAAO,MAAC,IAAA,CAAEP,wHAGLQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,aACbjD,SAAA,CAAAO,EAAAA,IAACwC,EAAA,CACCuE,QAASy9B,EACTj9B,SAAU28B,EACVxhC,UAAU,SAETjD,WACCQ,EAAAA,KAAAE,EAAAA,SAAA,CACEV,SAAA,CAAAO,EAAAA,IAAC0gB,GAAA,CAAQve,KAAK,KAAKO,UAAU,SAAS,iBAIxCzC,EAAAA,KAAAE,EAAAA,SAAA,CACEV,SAAA,CAAAO,EAAAA,IAACssB,EAAAA,UAAA,CAAU5pB,UAAU,iBAAiB,wBAK5C1C,EAAAA,IAACwC,EAAA,CACCuE,QAAS09B,EACT7iC,QAAQ,UACRc,UAAU,SACXjD,SAAA,sCAWV,MAAA,CAAIiD,UAAU,gGACbjD,SAAAQ,EAAAA,KAACoF,GAAA,CAAK3C,UAAU,kBACdjD,SAAA,CAAAO,EAAAA,IAACsF,GAAA,CAAW5C,UAAU,cACpBjD,SAAAO,EAAAA,IAACuF,IAAU7C,UAAU,wBAAwBjD,wCAI/CQ,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,cACrBjD,SAAA,CAAAO,EAAAA,IAAC,OAAI0C,UAAU,2BACbjD,eAACihB,GAAA,CAAQve,KAAK,SAEhBnC,EAAAA,IAAC,IAAA,CAAE0C,UAAU,wBAAwBjD,SAAA,+QnEvGzB,EAAGA,cAAazH,KAElCgI,EAAAA,IAAC,UAAQhI,EACPyH,eAACuH,GAAA,CAAQtE,UAAU,8WAChBjD,8MoERF,UAAyC6+B,QAC9CA,EAAAnjC,OACAA,EAAAqiC,OACAA,EAAAC,SACAA,IAcA,OAAIa,EAAQppB,UAERlV,EAAAA,IAACsb,GAAA,CACE7b,SAAA3M,MAAM+0B,KAAK,CAAEj1B,OAAQ,IAAKU,IAAI,CAACw0B,EAAGlX,WAChCvL,GAAA,CACC5F,SAAA,CAAAQ,OAACqF,GAAA,CACC7F,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,cACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,iBAEtB1C,MAACyF,GAAA,CACChG,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACbjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,eACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,qBARfkO,YAkBhBlJ,GAAS1E,KAAT,CACEvD,SAAA6+B,EAAQgB,SAAShsC,IAAKohB,GACrBzU,OAACyH,GAASC,KAAT,CAA8BZ,QAAS,IAAMy2B,EAAO9oB,GACnDjV,SAAA,CAAAO,EAAAA,IAACsF,IAAW5C,UAAU,OACpBjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,mCACbjD,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,iBACbjD,SAAA,CAAAO,EAAAA,IAACuF,IAAU7C,UAAU,+BACjBjD,WAAegJ,OAAUiM,EAAepgB,MAAQ,eAEpD0L,EAAAA,IAACwF,GAAA,CAAgB9C,UAAU,UACxBjD,kBAAO,IAAI8O,KAAKmG,EAAOgwB,YAAa,mBAAoB,CAAEC,OAAQvJ,UAGvEn7B,EAAAA,KAAC,MAAA,CAAIyC,UAAU,+BACXjD,SAAA,CAAAiV,EAAexS,MACflC,EAAAA,IAACwC,EAAA,CACCZ,QAAQ,gBACRO,KAAK,UACL4E,QAAU1M,IACRA,EAAE64B,kBArDK,CAAC1D,IAC1B,IACE,MAAMoV,EAAYtwB,OAAOxM,KAAK0nB,EAAK,UAC9BoV,IAAaA,EAAUC,aAAqC,IAApBD,EAAUC,SACrDC,UAAUC,UAAUC,UAAUxV,GAC9B3f,EAAAA,MAAMlY,KAAK,6CAEf,OAASnF,GACP8hB,OAAOlW,SAASuY,KAAO6Y,CACzB,GA6CkByV,CAAoBvwB,EAAexS,OAErCuG,MAAM,qBAENhJ,SAAAO,EAAAA,IAAC0vB,EAAAA,aAAA,CAAahtB,UAAU,oBAG3B,MAAA,CAAIqE,QAAU1M,GAAMA,EAAE64B,kBACrBzzB,SAAAO,EAAAA,IAACm+B,GAAA,CACCX,OAAQ,IAAMA,EAAO9oB,GACrB+oB,SAAUA,EAAW,IAAMA,EAAS/oB,QAAU,EAC9CipB,YAAaF,cAOvBz9B,EAAAA,IAACyF,GAAA,CAAY/C,UAAU,OACrBjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,YACZjD,SAAAtE,EAAO+pC,YAAY5xC,IAAK69B,IACvB,MAAMh5B,EAAQuc,EAAOyc,EAAMr2B,KAC3B,OAAK3C,EAGH6H,EAAAA,IAAC0H,GAASE,MAAT,CAECpB,MAAO2qB,EAAM3qB,MACbrO,MAAOg5B,EAAMr8B,OAASq8B,EAAMr8B,OAAOqD,EAAOuc,GAAUlhB,OAAO2E,IAFtD3E,OAAO29B,EAAMr2B,MAJH,aAxCP4Z,EAAO9N,MAwDnC,+2BC1GO,UAAyC03B,QAC9CA,EAAA6G,QACAA,IAEA,MAAMhY,gBAAEA,GAAoBzU,KACtB0sB,EAAmB9G,EAAQ/e,WAEjC,aACGmJ,GAAA,CAAMC,UAAU,SAASnN,IAAI,KAAK9Y,UAAU,OAC3CjD,SAAAQ,EAAAA,KAACyoB,GAAA,CAAMC,UAAU,MAAMnN,IAAI,KAAKqN,MAAI,EAACnmB,UAAU,uBAE5CjD,SAAA,CAAA0lC,EAAQtvB,KAAKvV,GAAgB,WAAXA,EAAEpM,QAAuBi5B,GAC1CltB,EAAAA,KAAC,MAAA,CAAIyC,UAAU,kBACbjD,SAAA,CAAAO,EAAAA,IAACwL,EAAAA,OAAA,CAAO9I,UAAU,qFAClB1C,EAAAA,IAAC2F,GAAA,CACC+C,YAAY,YACZvQ,MAAOmmC,EAAQ/e,WACfhZ,SAAWlM,GAAMikC,EAAQ+G,aAAahrC,EAAEwM,OAAO1O,OAC/CuK,UAAU,aAMfyiC,EACEzlC,OAAOY,GAAgB,WAAXA,EAAEpM,MAAqBoM,EAAE+2B,WACrC/jC,IAAI,CAACoM,EAAQkR,KACZ,MAAM00B,EAAkB5lC,EAAO23B,UAC/B,OACEr3B,EAAAA,IAAC,MAAA,CAAgB0C,UAAU,mBACzBjD,SAAAO,EAAAA,IAACslC,MAAoB5lC,EAAO1H,SADpB4Y,KAOfw0B,GACCnlC,EAAAA,KAACuC,EAAA,CACCZ,QAAQ,UACRmF,QAASu3B,EAAQiH,aACjB7iC,UAAU,oBAEVjD,SAAA,CAAAO,EAAAA,IAACmJ,EAAAA,EAAA,CAAEzG,UAAU,iBAAiB,wBAO1C,sFvDjCkB,KAIb1K,KAGDgI,EAAAA,IAAC8Z,GAAiBc,SAAjB,CAA0BziB,MAAO,CAAE7D,KAAM0D,EAAM1D,MAC9CmL,SAAAO,EAAAA,IAACwlC,EAAAA,WAAA,IAAextC,2Fa4Bf,UAAsBw4B,OAAEA,EAAS,IACtC,OACEvwB,EAAAA,KAAC,MAAA,CAAIyC,UAAU,YACZjD,SAAA,CAAA3M,MAAM+0B,KAAK,CAAEj1B,OAAQ49B,IAAUl9B,IAAI,CAACw0B,EAAGxqB,IACtC2C,EAAAA,KAAC,MAAA,CAAYyC,UAAU,YACrBjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,aACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,kBAFZpF,IAKZ2C,EAAAA,KAAC,MAAA,CAAIyC,UAAU,kCACbjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,cACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,mBAI5B,4B2C5DO,UAAoCoF,KACzCA,EAAA0tB,SACAA,EAAAvC,SACAA,EAAAsO,cACAA,EAAArsB,UACAA,GAAY,EAAAzM,MACZA,EAAAg9B,UACAA,EAAAlQ,SACAA,EAAAmQ,cACAA,IAEA,MAAMr4B,MAAEA,GAAUqL,KAoBlB,OACE1Y,EAAAA,IAACmgC,GAAA,CACCr4B,OACAW,MAAO84B,EAAgBkE,EAAYh9B,EACnC8sB,WACA9E,YAAa8Q,EACbtO,SAxBkB1xB,IACpB,GAAImkC,EAAe,CACjB,MAAMC,EAAgBD,EAAcnkC,EAAM8L,GAAS,IACnD4lB,EAAS0S,EACX,KAAO,CAEL,MAAMA,EAAgB,IACjBpkC,EACH8L,MAAOA,GAAS,IAGdk0B,GAAe36B,KACjB++B,EAAc/+B,GAAK26B,EAAc36B,IAEnCqsB,EAAS0S,EACX,GAUEnQ,WACAtgB,YACAugB,iBAAkB8L,EAAgB,YAAc,UAGtD,yC3CmBO,WACL,OACEthC,EAAAA,KAAC,MAAA,CAAIyC,UAAU,iDACbjD,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,yBACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,gBAEtBzC,EAAAA,KAAC,MAAA,CAAIyC,UAAU,8BACbjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,YACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,kBAI5B,iL4ClFO,UAAsBwS,UAC3BA,EAAAzV,SACAA,EAAAiD,UACAA,EAAAxO,KACAA,EAAO,UAAAiO,KACPA,EAAO,OAEP,OAAK+S,EAIQ,YAAThhB,SAEC,MAAA,CAAIwO,UAAWxB,EAAG,WAAYwB,GAC5BjD,SAAA,CAAAA,QACA,MAAA,CAAIiD,UAAU,2FACbjD,SAAAO,EAAAA,IAAC0gB,GAAA,CAAQve,cAMJ,aAATjO,EAEA8L,EAAAA,IAAC,MAAA,CAAI0C,UAAWxB,EAAG,gBAAiBwB,GAClCjD,SAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,wCAMnB1C,EAAAA,IAAC,MAAA,CAAI0C,UAAWxB,EAAG,wCAAyCwB,GAC1DjD,SAAAO,EAAAA,IAAC0gB,GAAA,CAAQve,6BAxBD1C,YA2Bd,2ECvBO,UAAwBo+B,MAAEA,EAAA+H,SAAOA,EAAW,EAAAljC,UAAGA,IACpD,MAAMmjC,EAAehI,EAAMjrC,OAASgzC,EAChC,CACE/H,EAAM,MACHA,EAAM/tB,QAAQ81B,EAAW,KAE9B/H,EAEEiI,EAAejI,EAAMjrC,OAASgzC,EAEpC,OACE5lC,EAAAA,IAAC4E,IAAWlC,YACVjD,SAAAO,EAAAA,IAAC6E,IACEpF,SAAAomC,EAAavyC,IAAI,CAACC,EAAMqd,KACvB,MAAMm1B,EAASn1B,IAAUi1B,EAAajzC,OAAS,EACzCozC,EAAeF,GAA0B,IAAVl1B,EAErC,OACE3Q,EAAAA,KAAC,MAAA,CAAmCyC,UAAU,oBAC3CjD,SAAA,CAAAumC,GACC/lC,EAAAA,KAAAE,WAAA,CACEV,SAAA,CAAAO,EAAAA,IAAC8E,GAAA,CACCrF,SAAAO,EAAAA,IAACmF,GAAA,CAAA,WAEFF,GAAA,CAAA,YAIJH,GAAA,CACErF,SAAAsmC,GAAUxyC,EAAK0yC,cACdjmC,EAAAA,IAACgF,IAAetC,UAAU,oBAAqBjD,WAAK+G,cAEnDzB,GAAA,CAAe4R,KAAMpjB,EAAKojB,KACxBlX,SAAAlM,EAAKiT,WAKVu/B,GAAU/lC,MAACiF,GAAA,CAAA,KApBL,GAAG1R,EAAKiT,SAASoK,UA2BvC,6RC3D6D,EAAGnR,eAC9D,MAAMwV,gBAAEA,EAAAC,UAAiBA,GAAcwD,KAGvC,GAAIxD,EACF,aACG,MAAA,CAAIxS,UAAU,gGACbjD,SAAAQ,EAAAA,KAACoF,GAAA,CAAK3C,UAAU,kBACdjD,SAAA,CAAAO,EAAAA,IAACsF,GAAA,CAAW5C,UAAU,cACpBjD,SAAAO,EAAAA,IAACuF,IAAU7C,UAAU,wBAAwBjD,6BAI/CQ,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,cACrBjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,6EACf1C,EAAAA,IAAC,IAAA,CAAE0C,UAAU,wBAAwBjD,SAAA,wCAU/C,IAAKwV,EAAiB,CAIpB,OAFuB,IAAIoC,gBAAgB/C,OAAOlW,SAASmN,QAAQjN,IAAI,iBACjD,IAAI+Y,gBAAgB/C,OAAOlW,SAASsY,KAAKY,UAAU,IAAIhZ,IAAI,sBAG5E,MAAA,CAAIoE,UAAU,gGACbjD,SAAAQ,EAAAA,KAACoF,GAAA,CAAK3C,UAAU,kBACdjD,SAAA,CAAAO,EAAAA,IAACsF,GAAA,CAAW5C,UAAU,cACpBjD,SAAAO,EAAAA,IAACuF,IAAU7C,UAAU,wBAAwBjD,8BAI/CQ,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,cACrBjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,6EACf1C,EAAAA,IAAC,IAAA,CAAE0C,UAAU,wBAAwBjD,SAAA,mCAU/CtO,EAAMmX,UAAU,KACW8lB,WACTha,WAINW,GAAYiB,WAGlBjB,GAAY6B,aAIhBsvB,IACC,UAGA,MAAA,CAAIxjC,UAAU,gGACbjD,SAAAQ,EAAAA,KAACoF,GAAA,CAAK3C,UAAU,kBACdjD,SAAA,CAAAO,EAAAA,IAACsF,GAAA,CAAW5C,UAAU,cACpBjD,SAAAO,EAAAA,IAACuF,IAAU7C,UAAU,wBAAwBjD,4BAI/CQ,EAAAA,KAACwF,GAAA,CAAY/C,UAAU,cACrBjD,SAAA,CAAAO,EAAAA,IAAC,MAAA,CAAI0C,UAAU,mFACd,IAAA,CAAEA,UAAU,wBACVjD,SAAA2U,KACG,8BACA,gDAMhB,CAEA,yBAAU3U,iC/DrDc,CACxB0mC,KAAOzxB,GAAmB,CAACA,GAC3B0xB,KAAM,CAAC1xB,EAAgBywB,IAAkC,CAACzwB,EAAQ,OAAQywB,GAC1EkB,OAAQ,CAAC3xB,EAAgB9N,IAAe,CAAC8N,EAAQ,SAAU9N,8wCiBiDtD,WACL,aACG,MAAA,CAAIlE,UAAU,4BACbjD,SAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,MACbjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,wBACnB,MAAA,CAAIA,UAAU,YACZjD,SAAA3M,MAAM+0B,KAAK,CAAEj1B,OAAQ,IAAKU,IAAI,CAACw0B,EAAGxqB,IACjC2C,EAAAA,KAAC,MAAA,CAAYyC,UAAU,kCACrBjD,SAAA,CAAAO,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,YACpB1C,EAAAA,IAACynB,GAAA,CAAS/kB,UAAU,eAFZpF,UAStB,wf+CtGO,WACL,MAAMsS,OAAEA,GAAWa,KAEnB,cACG6Y,GAAA,CACE7pB,SAAA,CAAAmQ,EAAOtc,IAAI,UAAUsT,GAAEA,EAAA6B,MAAIA,cAAOkD,EAAAC,OAAaA,KAAW5T,IACzD,OACEiI,EAAAA,KAACypB,GAAA,IAAmB1xB,EAClByH,SAAA,CAAAQ,EAAAA,KAAC,MAAA,CAAIyC,UAAU,aACZjD,SAAA,CAAAgJ,GAASzI,EAAAA,IAAC6pB,IAAYpqB,SAAAgJ,IACtBkD,GACC3L,EAAAA,IAAC8pB,GAAA,CAAkBrqB,SAAAkM,OAGtBC,QACAge,GAAA,CAAA,KARShjB,EAWhB,SACC4iB,GAAA,CAAA,KAGP,mOVuCO,SACLuE,EACAuY,EACAC,GAGA,MAAMprC,EAA4C,iBAAZ4yB,EAClC,CACEyY,UAAWzY,EACXuY,aAAcA,GAAgB,GAC9BC,WAAYA,GAAc,WAE5B,CACED,aAAcvY,EAAQuY,cAAgB,GACtCC,WAAYxY,EAAQwY,YAAc,aAC/BxY,IAGHyY,UAAEA,EAAWF,aAAcG,EAAoBF,WAAYG,EAAAz+B,WAAkBA,GAAe9M,EAC5FwrC,EAAc,IAEHzzB,KACQmb,OAAOqY,GAAkB7e,KAAK2e,GAoCvD,MAAO,CACL,YAAMI,CAAOrT,EAAsB,IAEjC,MAAMhoB,OACJA,EAAS,GAAAy0B,UACTA,EAAY,aAAAE,cACZA,EAAgB,OAAA2G,KAChBA,EAAO,EAAAC,MACPA,EAAQ,MACLC,GACDxT,EAEJ,IAAIyT,EAAQL,IAAcrY,OAAO,IAAK,CAAEnf,MAAO,UAG/C63B,EAAQA,EAAMzY,GAAG,cAAc,GAG/Bz4B,OAAO8H,QAAQmpC,GAAmB/2B,QAAQ,EAAElV,EAAK3C,MAC3CA,SAAmD,KAAVA,IAGzC6uC,EADEl0C,MAAMmH,QAAQ9B,GACR6uC,EAAMC,GAAGnsC,EAAK3C,GACI,iBAAVA,GAAsBA,GAAS,aAAcA,GAA4B,aAAnBA,EAAM+uC,SACpEF,EAAMG,IAAIrsC,EAAK,KAAM,MAErBksC,EAAMzY,GAAGzzB,EAAK3C,MAM5B6uC,EAjEqB,EAACA,EAAYz7B,KACpC,GAAIA,GAAUk7B,EAAmB7zC,OAAS,EAAG,CAC3C,MAAMw0C,EAAmBX,EAAmBnzC,IAAI69B,GAAS,GAAGA,YAAgB5lB,MAAW1L,KAAK,KAC5F,OAAOmnC,EAAMK,GAAGD,EAClB,CACA,OAAOJ,GA4DGM,CAAiBN,EAAOz7B,GAGhCy7B,EAAQA,EAAMxY,MAAMwR,EAAW,CAAEuH,UAA6B,QAAlBrH,IAG5C8G,EA/DwB,EAACA,EAAYH,EAAcC,KACrD,MAAMjf,GAAQgf,EAAO,GAAKC,EACpBlX,EAAK/H,EAAOif,EAAQ,EAC1B,OAAOE,EAAMQ,MAAM3f,EAAM+H,IA4Df6X,CAAoBT,EAAOH,EAAMC,GAEzC,MAAMvlC,KAAEA,EAAA/O,MAAMA,EAAA2c,MAAOA,SAAgB63B,EAErC,GAAIx0C,EACF,MAAM,IAAIgE,MAAM,kBAAkBgwC,MAAch0C,EAAMoM,WAGxD,IAAI80B,EAjEwB,EAC9BnyB,EACA4N,EACA03B,EACAC,KAEA,MAAMxG,EAAavtB,KAAK20B,MAAMv4B,GAAS,GAAK23B,GAE5C,MAAO,CACLvlC,OACAg/B,YAAasG,EACbvG,aACAD,WAAYlxB,GAAS,EACrBqxB,aAAcsG,EACda,YAAad,EAAOvG,EACpBsH,gBAAiBf,EAAO,IAkDTgB,CAA2BtmC,GAAQ,GAAI4N,EAAO03B,EAAMC,GAGnE,GAAI7+B,GAAcyrB,EAASnyB,KAAK3O,OAAS,EAAG,CAE1C,GAAIotC,IAnKY7O,EAmKgB6O,EAnKWwC,GAAerpC,SAASg4B,IAmKvB,CAE1C,MAAM2W,EAAc,IAAKvU,EAAQsT,KAAM,EAAGC,MAAO,IAAK9G,eAAW,EAAWE,mBAAe,GACrF6H,QAAsB92B,KAAK21B,OAAOkB,GAExC,IAAKC,GAAexmC,MAAM3O,OACxB,OAAOm1C,EAGT,MAKMC,EA/KC,EAAIzmC,EAAWy+B,EAAmBE,IAC1C,IAAI3+B,GAAMkqB,KAAK,CAACvxB,EAAG2G,KACxB,MAAMonC,EAAU/tC,EAAU8lC,IAAc,GAClCkI,EAAUrnC,EAAUm/B,IAAc,GAClCvE,EAAawM,EAAOvc,cAAcwc,EAAQ,QAAS,CAAEvc,YAAa,SACxE,MAAyB,QAAlBuU,EAA0BzE,GAAcA,IA0KtB0M,OALQlG,GAAyBC,2BAClD6F,EAAcxmC,KACd,CAAE0G,eAGsC+3B,EAAWE,GAC/CkI,EAvKK,EAAI7mC,EAAWslC,EAAe,EAAGC,EAAgB,MACpE,MAAMuB,GAAcxB,EAAO,GAAKC,EAC1BwB,EAAWD,EAAavB,EACxByB,EAAgBhnC,EAAKuO,MAAMu4B,EAAYC,GAE7C,MAAO,CACL/mC,KAAMgnC,EACN30B,WAAY,CACV2sB,YAAasG,EACbvG,WAAYvtB,KAAK20B,KAAKnmC,EAAK3O,OAASk0C,GACpCzG,WAAYkI,EAAc31C,OAC1B41C,WAAYjnC,EAAK3O,OACjB4tC,aAAcsG,EACda,YAAaW,EAAW/mC,EAAK3O,OAC7Bg1C,gBAAiBf,EAAO,KAyJI4B,CAAaT,EAAYnB,EAAMC,GAEvD,MAAO,CACLvlC,KAAM6mC,EAAgB7mC,KACtBg/B,YAAa6H,EAAgBx0B,WAAW2sB,YACxCD,WAAY8H,EAAgBx0B,WAAW0sB,WACvCD,WAAY+H,EAAgBx0B,WAAWysB,WACvCG,aAAc4H,EAAgBx0B,WAAW4sB,aACzCmH,YAAaS,EAAgBx0B,WAAW+zB,YACxCC,gBAAiBQ,EAAgBx0B,WAAWg0B,gBAEhD,CAGA,MAAMc,QAAqBzG,GAAyBC,2BAClDxO,EAASnyB,KACT,CAAE0G,eAGJyrB,EAAW,IAAKA,EAAUnyB,KAAMmnC,EAClC,CAtMiB,IAACvX,EAwMlB,OAAOuC,CACT,EAEA,aAAMiV,CAAQ/hC,GACZ,MAAMrF,KAAEA,EAAA/O,MAAMA,SAAgBm0C,IAC3BrY,OAAO,KACPC,GAAG,KAAM3nB,GACTgiC,cAEH,GAAIp2C,EACF,MAAM,IAAIgE,MAAM,kBAAkBgwC,MAAch0C,EAAMoM,WAGxD,OAAO2C,CACT,EAEA,YAAMsT,CAAO5f,GACX,MAAM4zC,EAAiBvnC,EAAerM,GAChC6zC,EAAehzC,OAAO8H,QAAQirC,GAAuBE,OAAO,CAACC,GAAMluC,EAAK3C,WAC9D,IAAVA,IACF6wC,EAAIluC,GAAO3C,GAEN6wC,GACN,CAAA,IAEGznC,KAAEA,EAAA/O,MAAMA,SAAgBm0C,IAC3BsC,OAAOH,GACPxa,SACA4a,SAEH,GAAI12C,EACF,MAAM,IAAIgE,MAAM,kBAAkBgwC,MAAch0C,EAAMoM,WAGxD,IAAK2C,EACH,MAAM,IAAI/K,MAAM,gCAAgCgwC,eAGlD,OAAOjlC,CACT,EAEA,YAAMiP,CAAO5J,EAAY3R,GACvB,MACMk0C,EAAa,IADI7nC,EAAerM,GAGpCm0C,YAAA,IAAgB76B,MAAO6jB,gBAGnB7wB,KAAEA,EAAA/O,MAAMA,SAAgBm0C,IAC3Bn2B,OAAO24B,GACP5a,GAAG,KAAM3nB,GACT0nB,SACA4a,SAEH,GAAI12C,EACF,MAAM,IAAIgE,MAAM,kBAAkBgwC,MAAch0C,EAAMoM,WAGxD,IAAK2C,EACH,MAAM,IAAI/K,MAAM,gCAAgCgwC,eAGlD,OAAOjlC,CACT,EAWA,YAAM,CAAOqF,GACX,MAAMuiC,EAAa,CACjBE,YAAY,EACZD,YAAA,IAAgB76B,MAAO6jB,gBAGnB5/B,MAAEA,SAAgBm0C,IACrBn2B,OAAO24B,GACP5a,GAAG,KAAM3nB,GAEZ,GAAIpU,EACF,MAAM,IAAIgE,MAAM,uBAAuBgwC,MAAch0C,EAAMoM,UAE/D,EAEJ,mB3ElQwB,CACtB0qC,EACAC,KAEA,IAAIh6B,EAEJ,MAAO,IAAI1c,KACTk6B,aAAaxd,GACbA,EAAUC,WAAW,IAAM85B,KAAQz2C,GAAO02C,oDA3BfC,IAC7B,IAAKA,EAAY,MAAO,GAExB,MAAMrX,EAAOsX,EAAAA,SAASD,GACtB,IAAKE,EAAAA,QAAQvX,GAAO,MAAO,gBAW3B,MAAO,GATSA,EAAKwX,mBAAmB,QAAS,CAC/CpN,IAAK,UACLD,MAAO,UACPsN,KAAM,eAEQzX,EAAK0X,mBAAmB,QAAS,CAC/CC,KAAM,UACNC,OAAQ,0IsF/BL,SAA0B5uC,GAW/B,MAAO,CACL4nC,YAVkB5nC,EAAO4nC,aAAe,IAAIiH,EAAAA,YAAY,CACxDC,eAAgB,CACdC,QAAS,CACPlV,MAAO,EACPmV,sBAAsB,MAO1BhvC,SAEJ,0JCCO,UAAuF+yB,SAC5FA,EAAAkc,QACAA,EAAAniC,WACAA,EAAAq+B,aACAA,EAAAS,kBACAA,EAAoB,CAAA,EAACsD,UACrBA,IAEA,MAAOvzB,EAAcwW,GAAmBC,oBAClCwV,EAAcC,EAAAA,iBAGdzjB,EAAazI,EAAazf,IAAI,WAAa,GAC3C2oC,EAAYlpB,EAAazf,IAAI,cAAgBsc,GAAYI,QAAQC,aACjEksB,EAAiBppB,EAAazf,IAAI,kBAAuCsc,GAAYI,QAAQE,iBAC7F4yB,EAAO3J,SAASpmB,EAAazf,IAAI,SAAW,KAC5CyvC,EAAQ5J,SAASpmB,EAAazf,IAAI,UAAY7D,OAAOmgB,GAAYC,WAAWC,kBAE5Ey2B,EAAkB/qB,EAGlBgrB,EAAchlB,EAAAA,QAAQ,KAAA,CAC1Bha,OAAQ++B,EACRtK,YACAE,gBACA2G,OACAC,WACGC,IACD,CAACuD,EAAiBtK,EAAWE,EAAe2G,EAAMC,EAAOC,IAGvD5Y,EAAUrJ,cAAY,IAAMslB,EAAQxD,OAAO2D,GAAc,CAACH,EAASG,IAGnEvD,EAAQ/Y,EAAAA,SAAS,CACrBC,SAAU,CAACA,EAAUqc,GACrBpc,YAIIqc,EAAiBC,EAAAA,YAAY,CACjCC,WAAYN,EAAQv1B,OACpBw1B,UAAW,KACTtH,EAAYU,kBAAkB,CAAEvV,SAAU,CAACA,KAC3Cre,EAAAA,MAAMpL,QAAQ+P,GAAS/P,QAAQgQ,QAAQxM,IACvCoiC,OAEFpe,QAAUz5B,IACRqd,EAAAA,MAAMrd,MAAM,GAAGgiB,GAAShiB,MAAMqiB,OAAO5M,OAAgBzV,EAAMoM,cAIzD+rC,EAAiBF,EAAAA,YAAY,CACjCC,WAAY,EAAG9jC,KAAIrF,UACjB6oC,EAAQ55B,OAAO5J,EAAIrF,GACrB8oC,UAAW,KACTtH,EAAYU,kBAAkB,CAAEvV,SAAU,CAACA,KAC3Cre,EAAAA,MAAMpL,QAAQ+P,GAAS/P,QAAQkQ,QAAQ1M,IACvCoiC,OAEFpe,QAAUz5B,IACRqd,EAAAA,MAAMrd,MAAM,GAAGgiB,GAAShiB,MAAMge,OAAOvI,OAAgBzV,EAAMoM,cAIzDgsC,EAAiBH,EAAAA,YAAY,CACjCC,WAAYN,EAAQ36B,OACpB46B,UAAW,KACTtH,EAAYU,kBAAkB,CAAEvV,SAAU,CAACA,KAC3Cre,EAAAA,MAAMpL,QAAQ+P,GAAS/P,QAAQmQ,QAAQ3M,KAEzCgkB,QAAUz5B,IACRqd,EAAAA,MAAMrd,MAAM,GAAGgiB,GAAShiB,MAAMid,OAAOxH,OAAgBzV,EAAMoM,cAKzDisC,EAAe/lB,cAAa8I,IAChC,MACMjZ,EAAU,IADA7e,OAAOg1C,YAAYh0B,IAGnChhB,OAAO8H,QAAQgwB,GAAW5d,QAAQ,EAAElV,EAAK3C,MACzB,KAAVA,GAA0B,IAAVA,SACXwc,EAAQ7Z,GAEf6Z,EAAQ7Z,GAAOtH,OAAO2E,KAI1Bm1B,EAAgB3Y,IACf,CAACmC,EAAcwW,IAGZ+X,EAAevgB,cAAavZ,IAChCs/B,EAAa,CAAEt/B,SAAQs7B,KAAM,KAC5B,CAACgE,IAEE/K,EAAahb,cAAaqM,IAE9B0Z,EAAa,CAAE7K,UAAW7O,EAAO+O,cADZF,IAAc7O,GAA2B,QAAlB+O,EAA0B,OAAS,MACjB2G,KAAM,KACnE,CAAC7G,EAAWE,EAAe2K,IAExBpK,EAAmB3b,cAAaimB,IACpCF,EAAa,CAAEhE,KAAMkE,KACpB,CAACF,IAEEG,EAAoBlmB,cAAammB,IACrCJ,EAAa,CAAE/D,MAAOmE,EAAUpE,KAAM,KACrC,CAACgE,IAEEtF,EAAezgB,EAAAA,YAAY,KAC/BwI,EAAgB,CAAA,IACf,CAACA,IAEJ,MAAO,CAELgS,SAAU0H,EAAMzlC,MAAMA,MAAQ,GAC9BqS,WAAY,CACV2sB,YAAayG,EAAMzlC,MAAMg/B,aAAe,EACxCD,WAAY0G,EAAMzlC,MAAM++B,YAAc,EACtCD,WAAY2G,EAAMzlC,MAAM8+B,YAAc,EACtCG,aAAcwG,EAAMzlC,MAAMi/B,cAAgB7sB,GAAYC,WAAWC,gBACjE8zB,YAAaX,EAAMzlC,MAAMomC,cAAe,EACxCC,gBAAiBZ,EAAMzlC,MAAMqmC,kBAAmB,GAIlD1yB,UAAW8xB,EAAM9xB,UACjBg2B,WAAYV,EAAeW,UAC3BC,WAAYT,EAAeQ,UAC3BjjC,WAAY0iC,EAAeO,UAG3B34C,MAAOw0C,EAAMx0C,MAGb+sB,aACAygB,YACAE,gBACAK,YAAasG,EACbrG,aAAcsG,EAGduE,aAAcb,EAAec,OAC7BC,aAAc,CAAC3kC,EAAYrF,IAAkBopC,EAAeW,OAAO,CAAE1kC,KAAIrF,SACzEygC,aAAc4I,EAAeU,OAG7BjG,eACAvF,aACAW,mBACAC,yBAA0BsK,EAC1BzF,eACAiG,QAASxE,EAAMwE,QAEnB,yJJ9GO,WACL,MAAMptC,EAAWgsB,EAAAA,cA+BjB,MA7B4B,MAC1B,MAAMqhB,EAAertC,EAASmsB,SAAS1xB,MAAM,KAAK6G,OAAOgsC,SAEnDC,EAAgC,CACpC,CAAEnlC,MAAO,WAAYmQ,KAAM,MAG7B,IAAIi1B,EAAc,GAmBlB,OAjBAH,EAAaz7B,QAAQ,CAAC67B,EAASj7B,KAC7Bg7B,GAAe,IAAIC,IACnB,MAAM9F,EAASn1B,IAAU66B,EAAa74C,OAAS,EAGzC4T,EAAQqlC,EACXhzC,MAAM,KACNvF,OAAYw4C,EAAKC,OAAO,GAAGC,cAAgBF,EAAKh8B,MAAM,IACtDjQ,KAAK,KAER8rC,EAAYh7B,KAAK,CACfnK,QACAmQ,KAAMovB,OAAS,EAAY6F,EAC3B3F,cAAeF,MAIZ4F,GAGFM,EACT","x_google_ignoreList":[0,1,2,61,62,63,64,65,66,67,68,69,70]}
1
+ {"version":3,"file":"index.js","sources":["../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../lib/utils/index.ts","../lib/components/ui/button.tsx","../lib/components/ui/alert-dialog.tsx","../lib/components/ui/alert.tsx","../lib/components/ui/badge.tsx","../lib/components/ui/breadcrumb.tsx","../lib/components/ui/card.tsx","../lib/components/ui/input.tsx","../lib/components/ui/label.tsx","../lib/components/ui/popover.tsx","../lib/components/ui/color-picker.tsx","../lib/components/ui/command.tsx","../lib/components/ui/data-list.tsx","../lib/components/ui/delete-dialog.tsx","../lib/components/ui/dialog.tsx","../lib/components/ui/dropdown-menu.tsx","../lib/components/ui/empty-state.tsx","../lib/auth/services/TokenManager.ts","../lib/hooks/use-toast.ts","../lib/services/ErrorService.ts","../lib/supabase/SupabaseSingleton.ts","../lib/config/index.ts","../lib/auth/services/AuthService.ts","../lib/auth/contexts/AuthContext.tsx","../lib/components/ui/feedback-dialog.tsx","../lib/components/ui/form.tsx","../lib/components/ui/grid.tsx","../lib/components/ui/scroll-area.tsx","../lib/components/ui/icon-picker.tsx","../lib/components/ui/input-otp.tsx","../lib/components/ui/spinner.tsx","../lib/components/ui/pagination.tsx","../lib/components/ui/select.tsx","../lib/components/ui/separator.tsx","../lib/components/ui/sheet.tsx","../lib/components/ui/tooltip.tsx","../lib/components/ui/sidebar.tsx","../lib/components/ui/skeleton.tsx","../lib/components/ui/skeleton-variants.tsx","../lib/components/ui/stack.tsx","../lib/components/ui/table.tsx","../lib/components/ui/textarea.tsx","../lib/components/ui/toast.tsx","../lib/contexts/NavigationContext.tsx","../lib/hooks/usePageTitle.ts","../lib/auth/components/UserInfo.tsx","../lib/hooks/useDebounce.ts","../lib/components/layout/AppHeader.tsx","../lib/hooks/useActiveModules.ts","../lib/assets/index.ts","../lib/components/layout/AppSidebar.tsx","../lib/components/ErrorBoundary.tsx","../lib/crud/hooks/useBaseForm.ts","../lib/qualiex/services/qualiexApi.ts","../lib/qualiex/hooks/useQualiexUsers.ts","../lib/qualiex/components/QualiexUserField.tsx","../lib/qualiex/components/QualiexResponsibleSelectField.tsx","../lib/crud/components/BaseForm.tsx","../node_modules/date-fns/locale/_lib/buildFormatLongFn.mjs","../node_modules/date-fns/locale/_lib/buildLocalizeFn.mjs","../node_modules/date-fns/locale/_lib/buildMatchFn.mjs","../node_modules/date-fns/locale/pt-BR/_lib/formatDistance.mjs","../node_modules/date-fns/locale/pt-BR/_lib/formatLong.mjs","../node_modules/date-fns/locale/pt-BR/_lib/formatRelative.mjs","../node_modules/date-fns/locale/_lib/buildMatchPatternFn.mjs","../node_modules/date-fns/locale/pt-BR.mjs","../node_modules/date-fns/locale/pt-BR/_lib/localize.mjs","../node_modules/date-fns/locale/pt-BR/_lib/match.mjs","../lib/crud/components/ActionMenuItems.tsx","../lib/crud/components/TableRowActions.tsx","../lib/crud/components/CrudTable.tsx","../lib/crud/components/CrudForm.tsx","../lib/crud/components/TableFooter.tsx","../lib/crud/components/CrudPage.tsx","../lib/services/QualiexEnrichmentService.ts","../lib/services/BaseService.ts","../lib/components/layout/AppLayout.tsx","../lib/crud/BaseCrudPage.tsx","../lib/auth/pages/CallbackPage.tsx","../lib/crud/components/CrudCards.tsx","../lib/crud/components/FilterBar.tsx","../lib/crud/GenericEntityForm.tsx","../lib/components/ui/loading-state.tsx","../lib/components/ui/page-breadcrumb.tsx","../lib/auth/components/ProtectedRoute.tsx","../lib/components/ui/toaster.tsx","../lib/setup.ts","../lib/crud/hooks/useCrud.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","// ============= UNIFIED UTILITIES =============\r\n\r\nimport { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\nimport { parseISO, isValid } from 'date-fns';\r\n\r\n// ============= CLASS UTILITIES =============\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n// ============= STRING UTILITIES =============\r\nexport const trimTextFields = (data: any): any => {\r\n if (data === null || data === undefined) return data;\r\n if (typeof data === 'string') return data.trim();\r\n if (Array.isArray(data)) return data.map(trimTextFields);\r\n \r\n if (typeof data === 'object' && data.constructor === Object) {\r\n const trimmed: any = {};\r\n for (const [key, value] of Object.entries(data)) {\r\n trimmed[key] = trimTextFields(value);\r\n }\r\n return trimmed;\r\n }\r\n \r\n return data;\r\n};\r\n\r\n// ============= DATE UTILITIES =============\r\nexport const formatDatetime = (dateString: string) => {\r\n if (!dateString) return '';\r\n \r\n const date = parseISO(dateString);\r\n if (!isValid(date)) return 'Data inválida';\r\n \r\n const dateStr = date.toLocaleDateString('pt-BR', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric'\r\n });\r\n const timeStr = date.toLocaleTimeString('pt-BR', {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n });\r\n return `${dateStr} ${timeStr}`;\r\n};\r\n\r\n// ============= ASYNC UTILITIES =============\r\nexport const debounce = <T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let timeout: NodeJS.Timeout;\r\n \r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func(...args), wait);\r\n };\r\n};","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\r\n destructive:\r\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\r\n outline:\r\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n \"icon-only\": \"bg-transparent border border-input hover:bg-accent hover:text-accent-foreground p-2\",\r\n \"external-link\": \"bg-transparent text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors\",\r\n \"action-primary\": \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\r\n \"action-secondary\": \"bg-secondary text-secondary-foreground hover:bg-secondary/80 border border-input\",\r\n },\r\n size: {\r\n default: \"h-10 px-4 py-2\",\r\n sm: \"h-9 rounded-md px-3\",\r\n lg: \"h-11 rounded-md px-8\",\r\n icon: \"h-10 w-10\",\r\n \"icon-sm\": \"h-8 w-8\",\r\n \"icon-xs\": \"h-6 w-6\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean\r\n}\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n return (\r\n <Comp\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nButton.displayName = \"Button\"\r\n\r\nexport { Button, buttonVariants }","import * as React from \"react\"\r\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\r\n\r\nimport { cn } from \"../../utils\"\r\nimport { buttonVariants } from \"./button\"\r\n\r\nconst AlertDialog = AlertDialogPrimitive.Root\r\n\r\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\r\n\r\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\r\n\r\nconst AlertDialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\r\n\r\nconst AlertDialogContent = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPortal>\r\n <AlertDialogOverlay />\r\n <AlertDialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </AlertDialogPortal>\r\n))\r\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\r\n\r\nconst AlertDialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left bg-primary text-primary-foreground px-6 py-4 -mx-6 -mt-6 mb-6 rounded-t-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\r\n\r\nconst AlertDialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\r\n\r\nconst AlertDialogTitle = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\r\n\r\nconst AlertDialogDescription = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogDescription.displayName =\r\n AlertDialogPrimitive.Description.displayName\r\n\r\nconst AlertDialogAction = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Action\r\n ref={ref}\r\n className={cn(buttonVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\r\n\r\nconst AlertDialogCancel = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Cancel\r\n ref={ref}\r\n className={cn(\r\n buttonVariants({ variant: \"outline\" }),\r\n \"mt-2 sm:mt-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\r\n\r\nexport {\r\n AlertDialog,\r\n AlertDialogPortal,\r\n AlertDialogOverlay,\r\n AlertDialogTrigger,\r\n AlertDialogContent,\r\n AlertDialogHeader,\r\n AlertDialogFooter,\r\n AlertDialogTitle,\r\n AlertDialogDescription,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n}","import * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst alertVariants = cva(\r\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-background text-foreground\",\r\n destructive:\r\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\nconst Alert = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\r\n>(({ className, variant, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n role=\"alert\"\r\n className={cn(alertVariants({ variant }), className)}\r\n {...props}\r\n />\r\n))\r\nAlert.displayName = \"Alert\"\r\n\r\nconst AlertTitle = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h5\r\n ref={ref}\r\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertTitle.displayName = \"AlertTitle\"\r\n\r\nconst AlertDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDescription.displayName = \"AlertDescription\"\r\n\r\nexport { Alert, AlertTitle, AlertDescription }\r\n","import * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst badgeVariants = cva(\r\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\r\n secondary:\r\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n destructive:\r\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\r\n outline: \"text-foreground\",\r\n success:\r\n \"border-transparent bg-green-500 text-white hover:bg-green-600\",\r\n warning:\r\n \"border-transparent bg-yellow-500 text-white hover:bg-yellow-600\",\r\n info:\r\n \"border-transparent bg-blue-500 text-white hover:bg-blue-600\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\r\n ({ className, variant, ...props }, ref) => {\r\n return (\r\n <div ref={ref} className={cn(badgeVariants({ variant }), className)} {...props} />\r\n )\r\n }\r\n)\r\n\r\nBadge.displayName = \"Badge\"\r\n\r\nexport { Badge, badgeVariants }","import * as React from \"react\"\r\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Breadcrumb = React.forwardRef<\r\n HTMLElement,\r\n React.ComponentPropsWithoutRef<\"nav\"> & {\r\n separator?: React.ComponentType<{ className?: string }>\r\n }\r\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\r\nBreadcrumb.displayName = \"Breadcrumb\"\r\n\r\nconst BreadcrumbList = React.forwardRef<\r\n HTMLOListElement,\r\n React.ComponentPropsWithoutRef<\"ol\">\r\n>(({ className, ...props }, ref) => (\r\n <ol\r\n ref={ref}\r\n className={cn(\r\n \"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nBreadcrumbList.displayName = \"BreadcrumbList\"\r\n\r\nconst BreadcrumbItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentPropsWithoutRef<\"li\">\r\n>(({ className, ...props }, ref) => (\r\n <li\r\n ref={ref}\r\n className={cn(\"inline-flex items-center gap-1.5\", className)}\r\n {...props}\r\n />\r\n))\r\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\r\n\r\nconst BreadcrumbLink = React.forwardRef<\r\n HTMLAnchorElement,\r\n React.ComponentPropsWithoutRef<\"a\"> & {\r\n asChild?: boolean\r\n }\r\n>(({ asChild, className, ...props }, ref) => {\r\n const Comp = asChild ? React.Fragment : \"a\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n className={cn(\"transition-colors hover:text-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nBreadcrumbLink.displayName = \"BreadcrumbLink\"\r\n\r\nconst BreadcrumbPage = React.forwardRef<\r\n HTMLSpanElement,\r\n React.ComponentPropsWithoutRef<\"span\">\r\n>(({ className, ...props }, ref) => (\r\n <span\r\n ref={ref}\r\n role=\"link\"\r\n aria-disabled=\"true\"\r\n aria-current=\"page\"\r\n className={cn(\"font-normal text-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nBreadcrumbPage.displayName = \"BreadcrumbPage\"\r\n\r\nconst BreadcrumbSeparator = ({\r\n children,\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"li\">) => (\r\n <li\r\n role=\"presentation\"\r\n aria-hidden=\"true\"\r\n className={cn(\"[&>svg]:size-3.5\", className)}\r\n {...props}\r\n >\r\n {children ?? <ChevronRight />}\r\n </li>\r\n)\r\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\"\r\n\r\nconst BreadcrumbEllipsis = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"span\">) => (\r\n <span\r\n role=\"presentation\"\r\n aria-hidden=\"true\"\r\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\r\n {...props}\r\n >\r\n <MoreHorizontal className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">More</span>\r\n </span>\r\n)\r\nBreadcrumbEllipsis.displayName = \"BreadcrumbEllipsis\"\r\n\r\nexport {\r\n Breadcrumb,\r\n BreadcrumbList,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n BreadcrumbEllipsis,\r\n}","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Card = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCard.displayName = \"Card\"\r\n\r\nconst CardHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"flex flex-col space-y-1.5 p-6\", className)} {...props} />\r\n))\r\nCardHeader.displayName = \"CardHeader\"\r\n\r\nconst CardTitle = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h3\r\n ref={ref}\r\n className={cn(\r\n \"text-2xl font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCardTitle.displayName = \"CardTitle\"\r\n\r\nconst CardDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <p\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nCardDescription.displayName = \"CardDescription\"\r\n\r\nconst CardContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\r\n))\r\nCardContent.displayName = \"CardContent\"\r\n\r\nconst CardFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"flex items-center p-6 pt-0\", className)}\r\n {...props}\r\n />\r\n))\r\nCardFooter.displayName = \"CardFooter\"\r\n\r\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInput.displayName = \"Input\"\r\n\r\nexport { Input }","import * as React from \"react\"\r\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst labelVariants = cva(\r\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\r\n)\r\n\r\nconst Label = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\r\n VariantProps<typeof labelVariants>\r\n>(({ className, ...props }, ref) => (\r\n <LabelPrimitive.Root\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nLabel.displayName = LabelPrimitive.Root.displayName\r\n\r\nexport { Label }","import * as React from \"react\"\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Popover = PopoverPrimitive.Root\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n))\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent }","import React from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\r\n\r\ninterface ColorPickerProps {\r\n value?: string;\r\n onChange?: (color: string) => void;\r\n label?: string;\r\n}\r\n\r\nconst PRESET_COLORS = [\r\n '#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6',\r\n '#06b6d4', '#84cc16', '#f97316', '#ec4899', '#6b7280'\r\n];\r\n\r\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\r\n value = '#3b82f6',\r\n onChange,\r\n label\r\n}) => {\r\n return (\r\n <div className=\"space-y-2\">\r\n {label && <Label>{label}</Label>}\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n className=\"w-full justify-start text-left font-normal\"\r\n >\r\n <div\r\n className=\"h-4 w-4 rounded border mr-2\"\r\n style={{ backgroundColor: value }}\r\n />\r\n {value}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-64\">\r\n <div className=\"space-y-3\">\r\n <div>\r\n <Label htmlFor=\"color-input\">Cor personalizada</Label>\r\n <Input\r\n id=\"color-input\"\r\n type=\"color\"\r\n value={value}\r\n onChange={(e) => onChange?.(e.target.value)}\r\n className=\"h-10 w-full\"\r\n />\r\n </div>\r\n <div>\r\n <Label>Cores predefinidas</Label>\r\n <div className=\"grid grid-cols-5 gap-2 mt-2\">\r\n {PRESET_COLORS.map((color) => (\r\n <button\r\n key={color}\r\n className=\"h-8 w-8 rounded border-2 border-border hover:border-primary\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => onChange?.(color)}\r\n aria-label={`Selecionar cor ${color}`}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n};","import * as React from \"react\"\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Command = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommand.displayName = \"Command\"\r\n\r\ninterface CommandDialogProps {\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n children: React.ReactNode\r\n}\r\n\r\nconst CommandDialog = ({ children, ...props }: CommandDialogProps) => {\r\n return (\r\n <div {...props}>\r\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\r\n {children}\r\n </Command>\r\n </div>\r\n )\r\n}\r\n\r\nconst CommandInput = React.forwardRef<\r\n HTMLInputElement,\r\n React.InputHTMLAttributes<HTMLInputElement>\r\n>(({ className, ...props }, ref) => (\r\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\r\n <input\r\n ref={ref}\r\n className={cn(\r\n \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n))\r\nCommandInput.displayName = \"CommandInput\"\r\n\r\nconst CommandList = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandList.displayName = \"CommandList\"\r\n\r\nconst CommandEmpty = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"py-6 text-center text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandEmpty.displayName = \"CommandEmpty\"\r\n\r\nconst CommandGroup = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandGroup.displayName = \"CommandGroup\"\r\n\r\nconst CommandSeparator = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\"-mx-1 h-px bg-border\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandSeparator.displayName = \"CommandSeparator\"\r\n\r\nconst CommandItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & {\r\n disabled?: boolean\r\n onSelect?: (value: string) => void\r\n value?: string\r\n }\r\n>(({ className, disabled, onSelect, value, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50\",\r\n className\r\n )}\r\n data-disabled={disabled}\r\n onClick={() => !disabled && onSelect?.(value || \"\")}\r\n {...props}\r\n />\r\n))\r\nCommandItem.displayName = \"CommandItem\"\r\n\r\nconst CommandShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\r\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\nCommandShortcut.displayName = \"CommandShortcut\"\r\n\r\nexport {\r\n Command,\r\n CommandDialog,\r\n CommandInput,\r\n CommandList,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandItem,\r\n CommandSeparator,\r\n CommandShortcut,\r\n}","import { ReactNode } from \"react\"\r\nimport { cn } from \"../../utils\"\r\nimport { Card, CardContent } from \"./card\"\r\n\r\ninterface DataListProps {\r\n children: ReactNode\r\n className?: string\r\n}\r\n\r\ninterface DataListItemProps {\r\n children: ReactNode\r\n onClick?: () => void\r\n className?: string\r\n}\r\n\r\ninterface DataListFieldProps {\r\n label: string\r\n value: ReactNode\r\n className?: string\r\n}\r\n\r\nfunction DataListRoot({ children, className }: DataListProps) {\r\n return (\r\n <div className={cn(\"space-y-4\", className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nfunction DataListItem({ children, onClick, className }: DataListItemProps) {\r\n return (\r\n <Card \r\n className={cn(\r\n \"transition-colors\",\r\n onClick && \"cursor-pointer hover:bg-muted/50\",\r\n className\r\n )}\r\n onClick={onClick}\r\n >\r\n <CardContent className=\"p-4\">\r\n {children}\r\n </CardContent>\r\n </Card>\r\n )\r\n}\r\n\r\nfunction DataListField({ label, value, className }: DataListFieldProps) {\r\n return (\r\n <div className={cn(\"flex justify-between items-center text-sm\", className)}>\r\n <span className=\"text-muted-foreground font-medium\">{label}:</span>\r\n <span className=\"text-foreground\">{value}</span>\r\n </div>\r\n )\r\n}\r\n\r\nexport const DataList = {\r\n Root: DataListRoot,\r\n Item: DataListItem,\r\n Field: DataListField\r\n}","import React, { useState, useEffect } from 'react';\r\nimport { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from './alert-dialog';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\n\r\ninterface DeleteConfirmationItem {\r\n id: string;\r\n title: string;\r\n}\r\n\r\ninterface DeleteConfirmationDialogProps<T extends DeleteConfirmationItem> {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n item?: T;\r\n onConfirm: (item: T) => void;\r\n entityName?: string;\r\n isDeleting?: boolean;\r\n}\r\n\r\nconst DeleteConfirmationDialog = <T extends DeleteConfirmationItem>({\r\n open,\r\n onOpenChange,\r\n item,\r\n onConfirm,\r\n entityName = 'item',\r\n isDeleting = false\r\n}: DeleteConfirmationDialogProps<T>) => {\r\n const [confirmationText, setConfirmationText] = useState('');\r\n \r\n // Reset state when dialog opens/closes\r\n useEffect(() => {\r\n if (!open) {\r\n setConfirmationText('');\r\n }\r\n }, [open]);\r\n \r\n const handleCancel = () => {\r\n setConfirmationText('');\r\n onOpenChange(false);\r\n };\r\n \r\n const handleConfirm = () => {\r\n if (item && confirmationText === item.title) {\r\n onConfirm(item);\r\n setConfirmationText('');\r\n onOpenChange(false);\r\n }\r\n };\r\n \r\n const isConfirmationValid = confirmationText === item?.title;\r\n \r\n if (!item) return null;\r\n \r\n return (\r\n <AlertDialog open={open} onOpenChange={handleCancel}>\r\n <AlertDialogContent className=\"sm:max-w-[500px]\">\r\n <AlertDialogHeader>\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-destructive/10 flex items-center justify-center\">\r\n <span className=\"text-destructive font-semibold text-sm\">!</span>\r\n </div>\r\n <div className=\"flex-1\">\r\n <AlertDialogTitle className=\"text-lg font-semibold\">\r\n Confirmar Exclusão\r\n </AlertDialogTitle>\r\n </div>\r\n </div>\r\n </AlertDialogHeader>\r\n \r\n <AlertDialogDescription asChild>\r\n <div className=\"space-y-4\">\r\n <div className=\"text-sm text-muted-foreground\">\r\n <p className=\"mb-2\">\r\n Você está prestes a excluir permanentemente o {entityName}:\r\n </p>\r\n <div className=\"p-3 bg-muted rounded-md border-l-4 border-l-destructive\">\r\n <p className=\"font-medium text-foreground\">{item.title}</p>\r\n </div>\r\n </div>\r\n \r\n <div className=\"bg-orange-50 border border-orange-200 rounded-md p-3\">\r\n <div className=\"flex items-start space-x-2\">\r\n <div className=\"flex-shrink-0 w-5 h-5 rounded-full bg-orange-500 flex items-center justify-center mt-0.5\">\r\n <span className=\"text-white font-bold text-xs\">!</span>\r\n </div>\r\n <div className=\"text-sm text-orange-800\">\r\n <p className=\"font-medium mb-1\">Atenção!</p>\r\n <p>Esta ação não pode ser desfeita. O {entityName} será removido permanentemente do sistema.</p>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"confirmation\" className=\"text-sm font-medium\">\r\n Para confirmar, digite <strong>\"{item.title}\"</strong> abaixo:\r\n </Label>\r\n <Input\r\n id=\"confirmation\"\r\n type=\"text\"\r\n value={confirmationText}\r\n onChange={(e) => setConfirmationText(e.target.value)}\r\n placeholder={`Digite: ${item.title}`}\r\n className=\"w-full\"\r\n />\r\n </div>\r\n </div>\r\n </AlertDialogDescription>\r\n \r\n <AlertDialogFooter>\r\n <AlertDialogCancel onClick={handleCancel}>\r\n Cancelar\r\n </AlertDialogCancel>\r\n <AlertDialogAction \r\n onClick={handleConfirm}\r\n disabled={!isConfirmationValid || isDeleting}\r\n className=\"bg-destructive hover:bg-destructive/90 text-destructive-foreground\"\r\n >\r\n {isDeleting ? 'Removendo...' : `Excluir ${entityName}`}\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n );\r\n};\r\n\r\nexport default DeleteConfirmationDialog;","import * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Dialog = DialogPrimitive.Root\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger\r\n\r\nconst DialogPortal = DialogPrimitive.Portal\r\n\r\nconst DialogClose = DialogPrimitive.Close\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\r\n\r\nconst DialogContent = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\r\n>(({ className, children, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-background p-6 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg overflow-hidden\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 rounded-sm text-white opacity-70 ring-offset-background transition-opacity hover:opacity-100 hover:text-white focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n))\r\nDialogContent.displayName = DialogPrimitive.Content.displayName\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-1.5 text-center sm:text-left bg-primary text-primary-foreground px-6 py-4 -mx-6 -mt-6 mb-3 rounded-t-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\r\n \"text-lg font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName\r\n\r\nconst DialogDescription = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n","import * as React from \"react\"\r\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\r\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root\r\n\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\r\n\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\r\n\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\r\n\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\r\n\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\r\n\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default select-none items-center px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto h-4 w-4\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n))\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName\r\n\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(\r\n \"z-50 min-w-[8rem] overflow-hidden border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-[100] min-w-[8rem] overflow-hidden rounded-md border bg-white shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:bg-gray-800 dark:border-gray-700\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n))\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\r\n\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\r\n\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n))\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName\r\n\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Circle className=\"h-2 w-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n))\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\r\n\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn(\r\n \"px-2 py-1.5 text-sm font-semibold\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\r\n\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\r\n\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuGroup,\r\n DropdownMenuPortal,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuRadioGroup,\r\n}\r\n","import { ReactNode } from \"react\"\r\nimport { cn } from \"../../utils\"\r\nimport { FileX, Search, AlertCircle } from \"lucide-react\"\r\nimport { Button } from \"./button\"\r\n\r\ninterface EmptyStateProps {\r\n icon?: ReactNode\r\n title: string\r\n description?: string\r\n action?: {\r\n label: string\r\n onClick: () => void\r\n }\r\n className?: string\r\n variant?: \"default\" | \"search\" | \"error\"\r\n}\r\n\r\nconst variantIcons = {\r\n default: FileX,\r\n search: Search,\r\n error: AlertCircle\r\n}\r\n\r\nexport function EmptyState({\r\n icon,\r\n title,\r\n description,\r\n action,\r\n className,\r\n variant = \"default\"\r\n}: EmptyStateProps) {\r\n const IconComponent = icon ? () => icon : variantIcons[variant]\r\n\r\n return (\r\n <div className={cn(\r\n \"flex flex-col items-center justify-center py-12 px-4 text-center\",\r\n className\r\n )}>\r\n <div className=\"flex items-center justify-center w-16 h-16 rounded-full bg-muted mb-4\">\r\n <IconComponent className=\"h-8 w-8 text-muted-foreground\" />\r\n </div>\r\n \r\n <h3 className=\"text-lg font-semibold mb-2\">{title}</h3>\r\n \r\n {description && (\r\n <p className=\"text-muted-foreground mb-6 max-w-sm\">\r\n {description}\r\n </p>\r\n )}\r\n \r\n {action && (\r\n <Button onClick={action.onClick} variant=\"outline\">\r\n {action.label}\r\n </Button>\r\n )}\r\n </div>\r\n )\r\n}","// Gerenciamento centralizado de tokens\r\nconst STORAGE_KEYS = {\r\n qualiex_access: 'qualiex_access_token',\r\n qualiex_id: 'qualiex_id_token',\r\n supabase: 'supabase_token',\r\n oauth_state: 'oauth_state',\r\n oauth_nonce: 'oauth_nonce',\r\n selected_alias: 'selected_alias',\r\n} as const;\r\n\r\nexport const TokenManager = {\r\n // Qualiex Access Token\r\n setAccessToken: (token: string) => localStorage.setItem(STORAGE_KEYS.qualiex_access, token),\r\n getAccessToken: () => localStorage.getItem(STORAGE_KEYS.qualiex_access),\r\n \r\n // Qualiex ID Token\r\n setIdToken: (token: string) => localStorage.setItem(STORAGE_KEYS.qualiex_id, token),\r\n getIdToken: () => localStorage.getItem(STORAGE_KEYS.qualiex_id),\r\n \r\n // Supabase Token\r\n setSupabaseToken: (token: string) => localStorage.setItem(STORAGE_KEYS.supabase, token),\r\n getSupabaseToken: () => localStorage.getItem(STORAGE_KEYS.supabase),\r\n \r\n // OAuth State\r\n setOAuthState: (state: string) => sessionStorage.setItem(STORAGE_KEYS.oauth_state, state),\r\n getOAuthState: () => sessionStorage.getItem(STORAGE_KEYS.oauth_state),\r\n clearOAuthState: () => sessionStorage.removeItem(STORAGE_KEYS.oauth_state),\r\n \r\n // OAuth Nonce\r\n setOAuthNonce: (nonce: string) => sessionStorage.setItem(STORAGE_KEYS.oauth_nonce, nonce),\r\n getOAuthNonce: () => sessionStorage.getItem(STORAGE_KEYS.oauth_nonce),\r\n clearOAuthNonce: () => sessionStorage.removeItem(STORAGE_KEYS.oauth_nonce),\r\n \r\n // Selected Alias\r\n setSelectedAlias: (alias: string) => localStorage.setItem(STORAGE_KEYS.selected_alias, alias),\r\n getSelectedAlias: () => localStorage.getItem(STORAGE_KEYS.selected_alias),\r\n clearSelectedAlias: () => localStorage.removeItem(STORAGE_KEYS.selected_alias),\r\n \r\n // Generators\r\n generateOAuthState: (): string => {\r\n return 'Lw==';\r\n },\r\n generateOAuthNonce: (): string => {\r\n const randomBytes = new Uint8Array(32);\r\n crypto.getRandomValues(randomBytes);\r\n return btoa(String.fromCharCode(...randomBytes)).replace(/[+/=]/g, '');\r\n },\r\n \r\n // Utils\r\n hasAllTokens: () => !!(TokenManager.getAccessToken() && TokenManager.getIdToken()),\r\n clearAll: () => {\r\n localStorage.removeItem(STORAGE_KEYS.qualiex_access);\r\n localStorage.removeItem(STORAGE_KEYS.qualiex_id);\r\n localStorage.removeItem(STORAGE_KEYS.supabase);\r\n localStorage.removeItem(STORAGE_KEYS.selected_alias);\r\n sessionStorage.removeItem(STORAGE_KEYS.oauth_state);\r\n sessionStorage.removeItem(STORAGE_KEYS.oauth_nonce);\r\n },\r\n \r\n // Token validation\r\n isTokenExpired: (token: string): boolean => {\r\n try {\r\n const payload = JSON.parse(atob(token.split('.')[1]));\r\n return payload.exp * 1000 < Date.now();\r\n } catch {\r\n return true;\r\n }\r\n },\r\n\r\n // Supabase token validation\r\n isSupabaseTokenValid: (): boolean => {\r\n const token = TokenManager.getSupabaseToken();\r\n return token ? !TokenManager.isTokenExpired(token) : false;\r\n },\r\n\r\n getValidSupabaseToken: (): string | null => {\r\n const token = TokenManager.getSupabaseToken();\r\n if (!token || TokenManager.isTokenExpired(token)) {\r\n return null;\r\n }\r\n return token;\r\n },\r\n\r\n // Extrair dados do token Supabase\r\n extractTokenData: () => {\r\n const token = TokenManager.getSupabaseToken();\r\n \r\n if (!token) {\r\n return null;\r\n }\r\n\r\n try {\r\n // Extrair alias e companyId do token\r\n const payload = JSON.parse(atob(token.split('.')[1]));\r\n const alias = payload.alias || payload.default || payload.user_alias;\r\n \r\n // Tentar extrair companyId de diferentes formas\r\n let companyId = payload.company_id;\r\n if (!companyId && alias) {\r\n // Procurar por campos co* que contenham o alias\r\n for (const key in payload) {\r\n if (key.startsWith('co') && /^co\\d+$/.test(key)) {\r\n const coField = payload[key];\r\n if (coField && typeof coField === 'string') {\r\n const parts = coField.split(';');\r\n if (parts.length > 7 && parts[0] === alias) {\r\n companyId = parts[7]; // companyId está na posição 7\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { alias, companyId, payload };\r\n } catch {\r\n return null;\r\n }\r\n },\r\n};","import * as React from \"react\"\r\n\r\nimport type {\r\n ToastActionElement,\r\n ToastProps,\r\n} from \"../components/ui/toast\"\r\n\r\nconst TOAST_LIMIT = 1\r\nconst TOAST_REMOVE_DELAY = 1000000\r\n\r\ntype ToasterToast = ToastProps & {\r\n id: string\r\n title?: React.ReactNode\r\n description?: React.ReactNode\r\n action?: ToastActionElement\r\n}\r\n\r\nconst actionTypes = {\r\n ADD_TOAST: \"ADD_TOAST\",\r\n UPDATE_TOAST: \"UPDATE_TOAST\",\r\n DISMISS_TOAST: \"DISMISS_TOAST\",\r\n REMOVE_TOAST: \"REMOVE_TOAST\",\r\n} as const\r\n\r\nlet count = 0\r\n\r\nfunction genId() {\r\n count = (count + 1) % Number.MAX_SAFE_INTEGER\r\n return count.toString()\r\n}\r\n\r\ntype ActionType = typeof actionTypes\r\n\r\ntype Action =\r\n | {\r\n type: ActionType[\"ADD_TOAST\"]\r\n toast: ToasterToast\r\n }\r\n | {\r\n type: ActionType[\"UPDATE_TOAST\"]\r\n toast: Partial<ToasterToast>\r\n }\r\n | {\r\n type: ActionType[\"DISMISS_TOAST\"]\r\n toastId?: ToasterToast[\"id\"]\r\n }\r\n | {\r\n type: ActionType[\"REMOVE_TOAST\"]\r\n toastId?: ToasterToast[\"id\"]\r\n }\r\n\r\ninterface State {\r\n toasts: ToasterToast[]\r\n}\r\n\r\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\r\n\r\nconst addToRemoveQueue = (toastId: string) => {\r\n if (toastTimeouts.has(toastId)) {\r\n return\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n toastTimeouts.delete(toastId)\r\n dispatch({\r\n type: \"REMOVE_TOAST\",\r\n toastId: toastId,\r\n })\r\n }, TOAST_REMOVE_DELAY)\r\n\r\n toastTimeouts.set(toastId, timeout)\r\n}\r\n\r\nexport const reducer = (state: State, action: Action): State => {\r\n switch (action.type) {\r\n case \"ADD_TOAST\":\r\n return {\r\n ...state,\r\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\r\n }\r\n\r\n case \"UPDATE_TOAST\":\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === action.toast.id ? { ...t, ...action.toast } : t\r\n ),\r\n }\r\n\r\n case \"DISMISS_TOAST\": {\r\n const { toastId } = action\r\n\r\n // ! Side effects ! - This could be extracted into a dismissToast() action,\r\n // but I'll keep it here for simplicity\r\n if (toastId) {\r\n addToRemoveQueue(toastId)\r\n } else {\r\n state.toasts.forEach((toast) => {\r\n addToRemoveQueue(toast.id)\r\n })\r\n }\r\n\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === toastId || toastId === undefined\r\n ? {\r\n ...t,\r\n open: false,\r\n }\r\n : t\r\n ),\r\n }\r\n }\r\n case \"REMOVE_TOAST\":\r\n if (action.toastId === undefined) {\r\n return {\r\n ...state,\r\n toasts: [],\r\n }\r\n }\r\n return {\r\n ...state,\r\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\r\n }\r\n }\r\n}\r\n\r\nconst listeners: Array<(state: State) => void> = []\r\n\r\nlet memoryState: State = { toasts: [] }\r\n\r\nfunction dispatch(action: Action) {\r\n memoryState = reducer(memoryState, action)\r\n listeners.forEach((listener) => {\r\n listener(memoryState)\r\n })\r\n}\r\n\r\ntype Toast = Omit<ToasterToast, \"id\">\r\n\r\nfunction toast({ ...props }: Toast) {\r\n const id = genId()\r\n\r\n const update = (props: ToasterToast) =>\r\n dispatch({\r\n type: \"UPDATE_TOAST\",\r\n toast: { ...props, id },\r\n })\r\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id })\r\n\r\n dispatch({\r\n type: \"ADD_TOAST\",\r\n toast: {\r\n ...props,\r\n id,\r\n open: true,\r\n onOpenChange: (open) => {\r\n if (!open) dismiss()\r\n },\r\n },\r\n })\r\n\r\n return {\r\n id: id,\r\n dismiss,\r\n update,\r\n }\r\n}\r\n\r\nfunction useToast() {\r\n const [state, setState] = React.useState<State>(memoryState)\r\n\r\n React.useEffect(() => {\r\n listeners.push(setState)\r\n return () => {\r\n const index = listeners.indexOf(setState)\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n }\r\n }, [state])\r\n\r\n return {\r\n ...state,\r\n toast,\r\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\r\n }\r\n}\r\n\r\nexport { useToast, toast }\r\n","// ============= SIMPLIFIED ERROR SERVICE =============\r\n\r\nimport { toast } from '../hooks/use-toast';\r\n\r\ninterface ErrorEntry {\r\n id: string;\r\n message: string;\r\n timestamp: number;\r\n count: number;\r\n}\r\n\r\nclass ErrorService {\r\n private errors: ErrorEntry[] = [];\r\n private toastCount = 0;\r\n private lastToastTime = 0;\r\n\r\n // Simple error handling\r\n handleError(error: Error | string, showToast = true) {\r\n const message = typeof error === 'string' ? error : error.message;\r\n \r\n // Add to log\r\n this.errors.push({\r\n id: Date.now().toString(),\r\n message,\r\n timestamp: Date.now(),\r\n count: 1\r\n });\r\n\r\n // Show toast with rate limiting\r\n if (showToast && this.shouldShowToast()) {\r\n toast({\r\n title: 'Erro',\r\n description: message,\r\n variant: 'destructive',\r\n });\r\n }\r\n\r\n \r\n }\r\n\r\n // Simple success notification\r\n success(title: string, description?: string) {\r\n toast({\r\n title,\r\n description,\r\n variant: 'default',\r\n });\r\n }\r\n\r\n // Rate limiting for toasts\r\n private shouldShowToast(): boolean {\r\n const now = Date.now();\r\n if (now - this.lastToastTime > 60000) { // Reset after 1 minute\r\n this.toastCount = 0;\r\n }\r\n \r\n if (this.toastCount < 3) { // Max 3 toasts per minute\r\n this.toastCount++;\r\n this.lastToastTime = now;\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n // Get recent errors\r\n getErrors() {\r\n return this.errors.slice(-50); // Keep last 50 errors\r\n }\r\n\r\n // Clear errors\r\n clearErrors() {\r\n this.errors = [];\r\n }\r\n}\r\n\r\nexport const errorService = new ErrorService();","// ============= DEFINITIVE SUPABASE SINGLETON =============\r\n\r\nimport { createClient } from '@supabase/supabase-js';\r\nimport type { Database } from './types';\r\nimport { TokenManager } from '../auth/services/TokenManager';\r\nimport { errorService } from '../services/ErrorService';\r\n\r\n// Configuração do Supabase\r\nconst SUPABASE_URL = import.meta.env.VITE_SUPABASE_URL;\r\nconst SUPABASE_PUBLISHABLE_KEY = import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY;\r\n\r\n// ============= SINGLETON PATTERN ROBUSTO =============\r\n\r\nclass SupabaseSingleton {\r\n private static instance: SupabaseSingleton;\r\n private client: ReturnType<typeof createClient<Database>>;\r\n private currentToken: string | null = null;\r\n private instanceCount = 0;\r\n\r\n private constructor() {\r\n this.instanceCount++;\r\n \r\n // Create initial client without token\r\n this.client = this.createClientWithToken(null);\r\n }\r\n\r\n private createClientWithToken(token: string | null) {\r\n const headers: Record<string, string> = {\r\n 'apikey': SUPABASE_PUBLISHABLE_KEY\r\n };\r\n\r\n if (token && this.isTokenValid(token)) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n return createClient<Database>(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, {\r\n auth: {\r\n persistSession: false,\r\n autoRefreshToken: false,\r\n },\r\n global: {\r\n headers\r\n }\r\n });\r\n }\r\n\r\n public static getInstance(): SupabaseSingleton {\r\n if (!SupabaseSingleton.instance) {\r\n SupabaseSingleton.instance = new SupabaseSingleton();\r\n }\r\n return SupabaseSingleton.instance;\r\n }\r\n\r\n public getClient() {\r\n const token = TokenManager.getSupabaseToken();\r\n \r\n // Se o token mudou, recrie o cliente com o novo token\r\n if (token !== this.currentToken) {\r\n this.client = this.createClientWithToken(token);\r\n this.currentToken = token;\r\n }\r\n \r\n return this.client;\r\n }\r\n\r\n private isTokenValid(token: string): boolean {\r\n try {\r\n const payload = JSON.parse(atob(token.split('.')[1]));\r\n const now = Math.floor(Date.now() / 1000);\r\n return payload.exp > now;\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : '❌ Supabase - Error validating token', false);\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n// ============= EXPORTS =============\r\n\r\nexport const getSupabaseClient = () => {\r\n return SupabaseSingleton.getInstance().getClient();\r\n};","// Auth Configuration\r\nexport const AUTH_CONFIG = {\r\n oauth: {\r\n authUrl: import.meta.env.VITE_OAUTH_AUTH_URL,\r\n clientId: import.meta.env.VITE_OAUTH_CLIENT_ID,\r\n responseType: 'id_token token',\r\n scope: 'openid profile email',\r\n },\r\n} as const;\r\n\r\n// CRUD Configuration \r\nexport const CRUD_CONFIG = {\r\n pagination: {\r\n defaultPageSize: 25,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n },\r\n sorting: {\r\n defaultField: 'updated_at',\r\n defaultDirection: 'desc' as const,\r\n },\r\n} as const;\r\n\r\n// Search Configuration\r\nexport const SEARCH_CONFIG = {\r\n debounceDelay: 500,\r\n} as const;\r\n\r\n// Environment Detection\r\nexport const isDevEnvironment = (): boolean => {\r\n const origin = window.location.origin;\r\n \r\n // Apenas localhost, 127.0.0.1 e lovable.dev são desenvolvimento\r\n const isDev = (\r\n origin.includes('localhost') || \r\n origin.includes('127.0.0.1') || \r\n origin.includes('id-preview') ||\r\n origin.includes('lovable.dev') ||\r\n import.meta.env.DEV\r\n );\r\n \r\n return isDev;\r\n};\r\n\r\n// Query Keys\r\nexport const QUERY_KEYS = {\r\n crud: (entity: string) => [entity] as const,\r\n list: (entity: string, filters?: Record<string, any>) => [entity, 'list', filters] as const,\r\n detail: (entity: string, id: string) => [entity, 'detail', id] as const,\r\n} as const;\r\n\r\n// Messages\r\nexport const MESSAGES = {\r\n success: {\r\n created: (entity: string) => `${entity} criado com sucesso`,\r\n updated: (entity: string) => `${entity} atualizado com sucesso`, \r\n deleted: (entity: string) => `${entity} removido com sucesso`,\r\n },\r\n error: {\r\n create: (entity: string) => `Erro ao criar ${entity}`,\r\n update: (entity: string) => `Erro ao atualizar ${entity}`,\r\n delete: (entity: string) => `Erro ao remover ${entity}`,\r\n load: (entity: string) => `Erro ao carregar ${entity}`,\r\n },\r\n} as const;","import { getSupabaseClient } from '../../supabase/SupabaseSingleton';\r\nimport { TokenManager } from './TokenManager';\r\n// Token decoder integrated\r\nimport { AUTH_CONFIG, isDevEnvironment } from '../../config';\r\nimport type { UserInfo, Company, AuthState } from '../../types';\r\n\r\nexport class AuthService {\r\n /**\r\n * Inicializa o estado de autenticação verificando apenas tokens armazenados\r\n * Tokens da URL devem ser processados exclusivamente na CallbackPage\r\n */\r\n static async initialize(): Promise<AuthState> {\r\n try {\r\n // Verificar apenas tokens armazenados no localStorage\r\n if (!TokenManager.hasAllTokens()) {\r\n return {\r\n isAuthenticated: false,\r\n isLoading: false,\r\n user: null,\r\n alias: null,\r\n companies: [],\r\n };\r\n }\r\n\r\n // Decodificar informações dos tokens armazenados\r\n const storedAccessToken = TokenManager.getAccessToken()!;\r\n const storedIdToken = TokenManager.getIdToken()!;\r\n\r\n const user = this.extractUserFromIdToken(storedIdToken);\r\n const companies = this.extractCompaniesFromIdToken(storedIdToken);\r\n const defaultAlias = this.extractAliasFromAccessToken(storedAccessToken);\r\n \r\n // Priority: selected alias (if valid) > default alias > first company\r\n const storedSelectedAlias = TokenManager.getSelectedAlias();\r\n const isSelectedAliasValid = storedSelectedAlias && companies.some(c => c.alias === storedSelectedAlias);\r\n const selectedAlias = isSelectedAliasValid ? storedSelectedAlias : (defaultAlias || companies[0]?.alias || null);\r\n\r\n // Verificar se precisa regenerar token Supabase\r\n if (!TokenManager.isSupabaseTokenValid() && selectedAlias) {\r\n const newSupabaseToken = await this.generateSupabaseToken(storedAccessToken, selectedAlias);\r\n if (newSupabaseToken) {\r\n TokenManager.setSupabaseToken(newSupabaseToken);\r\n }\r\n }\r\n\r\n return {\r\n isAuthenticated: true,\r\n isLoading: false,\r\n user,\r\n alias: selectedAlias,\r\n companies,\r\n };\r\n } catch (error) {\r\n console.error('[Auth] Erro na inicialização:', error);\r\n return {\r\n isAuthenticated: false,\r\n isLoading: false,\r\n user: null,\r\n alias: null,\r\n companies: [],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Login para ambiente de desenvolvimento - redireciona para callback com tokens\r\n */\r\n static async loginDev(): Promise<boolean> {\r\n try {\r\n const supabase = getSupabaseClient();\r\n const { data, error } = await supabase.functions.invoke('dev-tokens', {\r\n body: { environment: 'development' }\r\n });\r\n\r\n if (error) {\r\n console.error('[Auth] Erro na Edge Function dev-tokens:', error);\r\n return false;\r\n }\r\n\r\n if (!data?.access_token || !data?.id_token) {\r\n console.error('[Auth] Tokens ausentes na resposta');\r\n return false;\r\n }\r\n\r\n // Redirecionar para callback com tokens na URL (mesmo fluxo que prod)\r\n const callbackUrl = new URL('/callback', window.location.origin);\r\n callbackUrl.hash = `access_token=${data.access_token}&id_token=${data.id_token}&token_type=bearer`;\r\n \r\n window.location.href = callbackUrl.toString();\r\n return true;\r\n } catch (error) {\r\n console.error('[Auth] Erro no login dev:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Login para ambiente de produção (OAuth)\r\n */\r\n static loginProd(): void {\r\n // Gerar e armazenar state e nonce para verificação\r\n const state = TokenManager.generateOAuthState();\r\n TokenManager.setOAuthState(state);\r\n const nonce = TokenManager.generateOAuthNonce();\r\n TokenManager.setOAuthNonce(nonce);\r\n\r\n // Construir URL de autorização\r\n const redirectUri = `${window.location.origin}/callback`;\r\n const authUrl = new URL(AUTH_CONFIG.oauth.authUrl);\r\n authUrl.searchParams.set('client_id', AUTH_CONFIG.oauth.clientId);\r\n authUrl.searchParams.set('response_type', AUTH_CONFIG.oauth.responseType);\r\n authUrl.searchParams.set('scope', AUTH_CONFIG.oauth.scope);\r\n authUrl.searchParams.set('redirect_uri', redirectUri);\r\n authUrl.searchParams.set('state', state);\r\n authUrl.searchParams.set('nonce', nonce);\r\n authUrl.searchParams.set('response_mode', 'fragment');\r\n\r\n // Verificar se estamos em produção\r\n const isProduction = !isDevEnvironment();\r\n\r\n window.location.href = authUrl.toString();\r\n }\r\n\r\n /**\r\n * Processa o callback do OAuth (simplificado)\r\n */\r\n static async processCallback(): Promise<boolean> {\r\n try {\r\n // Idempotent: if tokens already stored, ensure Supabase token and return\r\n if (TokenManager.hasAllTokens()) {\r\n const existingSupabase = TokenManager.getValidSupabaseToken();\r\n if (!existingSupabase) {\r\n const storedAccess = TokenManager.getAccessToken()!;\r\n const aliasFromAccess = this.extractAliasFromAccessToken(storedAccess);\r\n const aliasFallback = this.extractCompaniesFromIdToken(TokenManager.getIdToken()!)[0]?.alias;\r\n const alias = aliasFromAccess || aliasFallback;\r\n if (alias) {\r\n const supa = await this.generateSupabaseToken(storedAccess, alias);\r\n if (supa) TokenManager.setSupabaseToken(supa);\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n const hashParams = new URLSearchParams(window.location.hash.startsWith('#') ? window.location.hash.substring(1) : window.location.hash);\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const getParam = (key: string) => hashParams.get(key) || searchParams.get(key);\r\n \r\n const accessToken = getParam('access_token');\r\n const idToken = getParam('id_token');\r\n const error = getParam('error');\r\n\r\n // Verificar se há erro no callback\r\n if (error) {\r\n throw new Error(`Erro OAuth: ${error}`);\r\n }\r\n\r\n // Verificar se tokens estão presentes\r\n if (!accessToken || !idToken) {\r\n throw new Error('Tokens não encontrados na URL de callback');\r\n }\r\n\r\n // Armazenar tokens\r\n TokenManager.setAccessToken(accessToken);\r\n TokenManager.setIdToken(idToken);\r\n\r\n // Extrair alias do access token\r\n const alias = this.extractAliasFromAccessToken(accessToken);\r\n \r\n if (!alias) {\r\n // Fallback: usar primeira empresa do ID token\r\n const companies = this.extractCompaniesFromIdToken(idToken);\r\n if (companies.length === 0) {\r\n throw new Error('Nenhuma empresa encontrada nos tokens');\r\n }\r\n const firstAlias = companies[0].alias;\r\n const supabaseToken = await this.generateSupabaseToken(accessToken, firstAlias);\r\n if (!supabaseToken) {\r\n throw new Error('Falha ao gerar token Supabase');\r\n }\r\n TokenManager.setSupabaseToken(supabaseToken);\r\n } else {\r\n // Gerar token Supabase com alias encontrado\r\n const supabaseToken = await this.generateSupabaseToken(accessToken, alias);\r\n if (!supabaseToken) {\r\n throw new Error('Falha ao gerar token Supabase');\r\n }\r\n TokenManager.setSupabaseToken(supabaseToken);\r\n }\r\n\r\n // Limpar parâmetros OAuth do localStorage (se existirem)\r\n TokenManager.clearOAuthState();\r\n TokenManager.clearOAuthNonce();\r\n\r\n return true;\r\n } catch (error) {\r\n console.error('❌ [CallbackPage] Erro ao processar callback:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Logout do usuário\r\n */\r\n static logout(): void {\r\n TokenManager.clearAll();\r\n window.location.href = '/';\r\n }\r\n\r\n /**\r\n * Decodifica um token JWT\r\n */\r\n private static decodeToken(token: string): any {\r\n try {\r\n const payload = token.split('.')[1];\r\n const decoded = atob(payload);\r\n \r\n // Converter para UTF-8 corretamente\r\n const bytes = new Uint8Array(decoded.length);\r\n for (let i = 0; i < decoded.length; i++) {\r\n bytes[i] = decoded.charCodeAt(i);\r\n }\r\n \r\n const utf8String = new TextDecoder('utf-8').decode(bytes);\r\n return JSON.parse(utf8String);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Extrai informações do usuário do ID token\r\n */\r\n private static extractUserFromIdToken(idToken: string): UserInfo | null {\r\n const payload = this.decodeToken(idToken);\r\n if (!payload) return null;\r\n\r\n return {\r\n id: payload.subNewId,\r\n email: payload.email,\r\n name: payload.name,\r\n identifier: payload.identifier,\r\n };\r\n }\r\n\r\n /**\r\n * Extrai empresas do ID token\r\n */\r\n private static extractCompaniesFromIdToken(idToken: string): Company[] {\r\n const payload = this.decodeToken(idToken);\r\n if (!payload) return [];\r\n\r\n const companies: Company[] = [];\r\n \r\n // Buscar campos co* dinâmicos\r\n Object.keys(payload).forEach(key => {\r\n const match = key.match(/^co(\\d+)$/);\r\n if (match && typeof payload[key] === 'string') {\r\n // Formato: \"alias;id1;id2;Nome da Empresa;status\"\r\n const parts = payload[key].split(';');\r\n if (parts.length >= 4) {\r\n companies.push({\r\n alias: parts[0].trim(),\r\n name: parts[3].trim(),\r\n });\r\n } else {\r\n // Fallback para formato original: \"alias|Nome da Empresa\"\r\n const [alias, name] = payload[key].split('|');\r\n if (alias && name) {\r\n companies.push({\r\n alias: alias.trim(),\r\n name: name.trim(),\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n return companies;\r\n }\r\n\r\n /**\r\n * Extrai alias do access token (campo default)\r\n */\r\n private static extractAliasFromAccessToken(accessToken: string): string | null {\r\n const payload = this.decodeToken(accessToken);\r\n return payload?.default || null;\r\n }\r\n\r\n /**\r\n * Gera token Supabase usando access token e alias\r\n */\r\n public static async generateSupabaseToken(accessToken: string, alias: string): Promise<string | null> {\r\n try {\r\n const supabase = getSupabaseClient();\r\n const { data, error } = await supabase.functions.invoke('validate-token', {\r\n body: {\r\n access_token: accessToken,\r\n alias: alias,\r\n }\r\n });\r\n\r\n if (error) {\r\n console.error('[Auth] Erro na Edge Function validate-token:', error);\r\n return null;\r\n }\r\n\r\n if (!data?.access_token) {\r\n console.error('[Auth] Token Supabase ausente na resposta');\r\n return null;\r\n }\r\n\r\n return data.access_token;\r\n } catch (error) {\r\n console.error('[Auth] Erro ao gerar token Supabase:', error);\r\n return null;\r\n }\r\n }\r\n}","import React, { createContext, useContext, useState, useEffect, useCallback, useMemo } from 'react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { AuthState, Company } from '../../types';\r\nimport { TokenManager } from '../services/TokenManager';\r\nimport { AuthService } from '../services/AuthService';\r\n\r\n// Estado inicial padrão\r\nconst getInitialState = (): AuthState => {\r\n return {\r\n user: null,\r\n companies: [],\r\n alias: null,\r\n isAuthenticated: false,\r\n isLoading: true,\r\n };\r\n};\r\n\r\n// Tipo do contexto\r\ninterface AuthContextType extends AuthState {\r\n logout: () => void;\r\n processCallback: () => Promise<boolean>;\r\n switchUnit: (company: Company) => Promise<void>;\r\n availableUnits: Company[];\r\n \r\n // Search state (movido do AppContext)\r\n isSearchVisible: boolean;\r\n setSearchVisible: (visible: boolean) => void;\r\n clearSearch: () => void;\r\n refreshData: () => void;\r\n}\r\n\r\n// Criação do contexto\r\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\r\n\r\n// Provider\r\nexport const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n const [authState, setAuthState] = useState<AuthState>(getInitialState());\r\n const queryClient = useQueryClient();\r\n \r\n // Search state (movido do AppContext)\r\n const [isSearchVisible, setIsSearchVisible] = useState(false);\r\n const [refreshTrigger, setRefreshTrigger] = useState(0);\r\n\r\n // Função para atualizar o estado de autenticação\r\n const updateAuthState = useCallback((newState: Partial<AuthState>) => {\r\n setAuthState(prev => ({ ...prev, ...newState }));\r\n }, []);\r\n\r\n // Função para definir loading\r\n const setLoading = useCallback((isLoading: boolean) => {\r\n setAuthState(prev => ({ ...prev, isLoading }));\r\n }, []);\r\n\r\n // Função para resetar o estado\r\n const resetAuthState = useCallback(() => {\r\n setAuthState(getInitialState());\r\n }, []);\r\n\r\n // Função para trocar de unidade\r\n const switchUnit = useCallback(async (company: Company) => {\r\n try {\r\n setLoading(true);\r\n \r\n // Obter access token atual\r\n const accessToken = TokenManager.getAccessToken();\r\n if (!accessToken) {\r\n console.error('[AuthContext] Access token não encontrado para trocar unidade');\r\n return;\r\n }\r\n\r\n // Gerar novo token Supabase com o alias da nova empresa\r\n const newSupabaseToken = await AuthService.generateSupabaseToken(accessToken, company.alias);\r\n if (!newSupabaseToken) {\r\n console.error('[AuthContext] Erro ao gerar token Supabase para nova unidade');\r\n return;\r\n }\r\n\r\n // Armazenar o novo token\r\n TokenManager.setSupabaseToken(newSupabaseToken);\r\n\r\n // Armazenar alias selecionado para persistir entre reloads\r\n TokenManager.setSelectedAlias(company.alias);\r\n\r\n // Atualizar estado da aplicação\r\n updateAuthState({\r\n alias: company.alias,\r\n });\r\n\r\n // Invalidar queries para refrescar dados da nova empresa\r\n await queryClient.invalidateQueries();\r\n \r\n } catch (error) {\r\n console.error('[AuthContext] Erro ao trocar unidade', error, company);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [updateAuthState, queryClient, setLoading]);\r\n\r\n\r\n const processCallback = useCallback(async () => {\r\n return await AuthService.processCallback();\r\n }, []);\r\n\r\n const logout = useCallback(async () => {\r\n AuthService.logout();\r\n resetAuthState();\r\n await queryClient.clear();\r\n }, [resetAuthState, queryClient]);\r\n\r\n\r\n // Search functions (movidas do AppContext)\r\n const setSearchVisible = useCallback((visible: boolean) => {\r\n setIsSearchVisible(visible);\r\n }, []);\r\n\r\n const clearSearch = useCallback(() => {\r\n setRefreshTrigger(prev => prev + 1);\r\n }, []);\r\n\r\n const refreshData = useCallback(() => {\r\n setRefreshTrigger(prev => prev + 1);\r\n }, []);\r\n\r\n // Inicialização\r\n useEffect(() => {\r\n const initializeAuth = async () => {\r\n try {\r\n // Add small delay to ensure DOM is ready in production\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n \r\n const authResult = await AuthService.initialize();\r\n \r\n if (authResult && authResult.isAuthenticated) {\r\n updateAuthState({\r\n user: authResult.user,\r\n companies: authResult.companies,\r\n alias: authResult.alias, // Use the alias from AuthService instead of first company\r\n isAuthenticated: true,\r\n isLoading: false,\r\n });\r\n\r\n // Token Supabase já é gerenciado automaticamente pelo singleton\r\n } else {\r\n setLoading(false);\r\n }\r\n } catch (error) {\r\n console.error('[AuthContext] Erro na inicialização da autenticação', error);\r\n setLoading(false);\r\n }\r\n };\r\n\r\n initializeAuth();\r\n }, [updateAuthState, setLoading]);\r\n\r\n // Memorizar o contexto para evitar re-renderizações desnecessárias\r\n const contextValue = useMemo((): AuthContextType => ({\r\n ...authState,\r\n logout,\r\n processCallback,\r\n switchUnit,\r\n availableUnits: authState.companies,\r\n \r\n // Search state\r\n isSearchVisible,\r\n setSearchVisible,\r\n clearSearch,\r\n refreshData,\r\n }), [authState, logout, processCallback, switchUnit, isSearchVisible, setSearchVisible, clearSearch, refreshData]);\r\n\r\n return (\r\n <AuthContext.Provider value={contextValue}>\r\n {children}\r\n </AuthContext.Provider>\r\n );\r\n};\r\n\r\n// Hook personalizado para usar o contexto\r\nexport const useAuth = () => {\r\n const context = useContext(AuthContext);\r\n if (context === undefined) {\r\n throw new Error('useAuth deve ser usado dentro de um AuthProvider');\r\n }\r\n return context;\r\n};","import React, { useState } from 'react';\r\nimport { MessageCircle } from 'lucide-react';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogTrigger,\r\n} from './dialog';\r\nimport { Button } from './button';\r\n\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\n\r\ninterface FeedbackDialogProps {\r\n variant?: 'button' | 'menuItem';\r\n className?: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const FeedbackDialog: React.FC<FeedbackDialogProps> = ({ \r\n variant = 'button',\r\n className = '',\r\n children \r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n const { user } = useAuth();\r\n const { companies, alias } = useAuth();\r\n const selectedUnit = alias \r\n ? companies?.find(company => company.alias === alias) || companies?.[0] || null\r\n : companies?.[0] || null;\r\n\r\n // Construir URL dinâmica\r\n const buildFeedbackUrl = () => {\r\n if (!user?.email) return '';\r\n \r\n const baseUrl = `${import.meta.env.VITE_FEEDBACK_APP_URL}/`;\r\n const params = new URLSearchParams({\r\n email: user.email,\r\n module: 'OKR',\r\n alias: selectedUnit?.alias || ''\r\n });\r\n \r\n return `${baseUrl}?${params.toString()}`;\r\n };\r\n\r\n const feedbackUrl = buildFeedbackUrl();\r\n\r\n // Se não tem dados necessários, não renderizar\r\n if (!user?.email || !selectedUnit) {\r\n return null;\r\n }\r\n\r\n const TriggerButton = React.forwardRef<HTMLButtonElement | HTMLDivElement, any>((props, ref) => {\r\n if (variant === 'menuItem') {\r\n return (\r\n <div \r\n ref={ref as React.Ref<HTMLDivElement>}\r\n className=\"flex items-center cursor-pointer w-full px-2 py-1.5 text-sm hover:bg-accent rounded-sm\"\r\n {...props}\r\n >\r\n <MessageCircle className=\"mr-2 h-4 w-4\" />\r\n Feedback\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Button \r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n variant=\"default\"\r\n size=\"sm\"\r\n className={`bg-primary hover:bg-primary/90 ${className}`}\r\n {...props}\r\n >\r\n <MessageCircle className=\"mr-2 h-4 w-4\" />\r\n Feedback\r\n </Button>\r\n );\r\n });\r\n\r\n TriggerButton.displayName = \"TriggerButton\";\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={setOpen}>\r\n <DialogTrigger asChild>\r\n <TriggerButton />\r\n </DialogTrigger>\r\n \r\n <DialogContent className=\"max-w-4xl max-h-[90vh] w-full h-full p-0 overflow-hidden\">\r\n <DialogHeader className=\"sr-only\">\r\n <DialogTitle>Feedback</DialogTitle>\r\n <DialogDescription>\r\n Formulário de feedback para melhorias no sistema\r\n </DialogDescription>\r\n </DialogHeader>\r\n \r\n <div className=\"w-full h-full\">\r\n <iframe\r\n src={feedbackUrl}\r\n width=\"100%\"\r\n height=\"600px\"\r\n className=\"feedback-iframe\"\r\n title=\"Formulário de Feedback\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default FeedbackDialog;","import * as React from \"react\"\r\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport {\r\n Controller,\r\n ControllerProps,\r\n FieldPath,\r\n FieldValues,\r\n FormProvider,\r\n useFormContext,\r\n} from \"react-hook-form\"\r\n\r\nimport { cn } from \"../../utils\"\r\nimport { Label } from \"./label\"\r\n\r\nconst Form = FormProvider\r\n\r\ntype FormFieldContextValue<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n> = {\r\n name: TName\r\n}\r\n\r\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\r\n {} as FormFieldContextValue\r\n)\r\n\r\nconst FormField = <\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n>({\r\n ...props\r\n}: ControllerProps<TFieldValues, TName>) => {\r\n return (\r\n <FormFieldContext.Provider value={{ name: props.name }}>\r\n <Controller {...props} />\r\n </FormFieldContext.Provider>\r\n )\r\n}\r\n\r\nconst useFormField = () => {\r\n const fieldContext = React.useContext(FormFieldContext)\r\n const itemContext = React.useContext(FormItemContext)\r\n const { getFieldState, formState } = useFormContext()\r\n\r\n const fieldState = getFieldState(fieldContext.name, formState)\r\n\r\n if (!fieldContext) {\r\n throw new Error(\"useFormField should be used within <FormField>\")\r\n }\r\n\r\n const { id } = itemContext\r\n\r\n return {\r\n id,\r\n name: fieldContext.name,\r\n formItemId: `${id}-form-item`,\r\n formDescriptionId: `${id}-form-item-description`,\r\n formMessageId: `${id}-form-item-message`,\r\n ...fieldState,\r\n }\r\n}\r\n\r\ntype FormItemContextValue = {\r\n id: string\r\n}\r\n\r\nconst FormItemContext = React.createContext<FormItemContextValue>(\r\n {} as FormItemContextValue\r\n)\r\n\r\nconst FormItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => {\r\n const id = React.useId()\r\n\r\n return (\r\n <FormItemContext.Provider value={{ id }}>\r\n <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\r\n </FormItemContext.Provider>\r\n )\r\n})\r\nFormItem.displayName = \"FormItem\"\r\n\r\nconst FormLabel = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\r\n>(({ className, ...props }, ref) => {\r\n const { error, formItemId } = useFormField()\r\n\r\n return (\r\n <Label\r\n ref={ref}\r\n className={cn(error && \"text-destructive\", className)}\r\n htmlFor={formItemId}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormLabel.displayName = \"FormLabel\"\r\n\r\nconst FormControl = React.forwardRef<\r\n React.ElementRef<typeof Slot>,\r\n React.ComponentPropsWithoutRef<typeof Slot>\r\n>(({ ...props }, ref) => {\r\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\r\n\r\n return (\r\n <Slot\r\n ref={ref}\r\n id={formItemId}\r\n aria-describedby={\r\n !error\r\n ? `${formDescriptionId}`\r\n : `${formDescriptionId} ${formMessageId}`\r\n }\r\n aria-invalid={!!error}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormControl.displayName = \"FormControl\"\r\n\r\nconst FormDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => {\r\n const { formDescriptionId } = useFormField()\r\n\r\n return (\r\n <p\r\n ref={ref}\r\n id={formDescriptionId}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormDescription.displayName = \"FormDescription\"\r\n\r\nconst FormMessage = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, children, ...props }, ref) => {\r\n const { error, formMessageId } = useFormField()\r\n const body = error ? String(error?.message) : children\r\n\r\n if (!body) {\r\n return null\r\n }\r\n\r\n return (\r\n <p\r\n ref={ref}\r\n id={formMessageId}\r\n className={cn(\"text-sm font-medium text-destructive\", className)}\r\n {...props}\r\n >\r\n {body}\r\n </p>\r\n )\r\n})\r\nFormMessage.displayName = \"FormMessage\"\r\n\r\nexport {\r\n useFormField,\r\n Form,\r\n FormItem,\r\n FormLabel,\r\n FormControl,\r\n FormDescription,\r\n FormMessage,\r\n FormField,\r\n}\r\n","import { cn } from \"../../utils\"\r\nimport { ReactNode } from \"react\"\r\n\r\ninterface GridProps {\r\n children: ReactNode\r\n cols?: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"auto-fit\" | \"auto-fill\"\r\n gap?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\r\n className?: string\r\n}\r\n\r\nconst colsClasses = {\r\n \"1\": \"grid-cols-1\",\r\n \"2\": \"grid-cols-2\",\r\n \"3\": \"grid-cols-3\", \r\n \"4\": \"grid-cols-4\",\r\n \"5\": \"grid-cols-5\",\r\n \"6\": \"grid-cols-6\",\r\n \"auto-fit\": \"grid-cols-[repeat(auto-fit,minmax(250px,1fr))]\",\r\n \"auto-fill\": \"grid-cols-[repeat(auto-fill,minmax(250px,1fr))]\"\r\n}\r\n\r\nconst gapClasses = {\r\n xs: \"gap-1\",\r\n sm: \"gap-2\",\r\n md: \"gap-4\", \r\n lg: \"gap-6\",\r\n xl: \"gap-8\"\r\n}\r\n\r\nexport function Grid({\r\n children,\r\n cols = \"auto-fit\",\r\n gap = \"md\",\r\n className\r\n}: GridProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"grid\",\r\n colsClasses[cols],\r\n gapClasses[gap],\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}","import * as React from \"react\"\r\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst ScrollArea = React.forwardRef<\r\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\r\n>(({ className, children, ...props }, ref) => (\r\n <ScrollAreaPrimitive.Root\r\n ref={ref}\r\n className={cn(\"relative overflow-hidden\", className)}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\r\n {children}\r\n </ScrollAreaPrimitive.Viewport>\r\n <ScrollBar />\r\n <ScrollAreaPrimitive.Corner />\r\n </ScrollAreaPrimitive.Root>\r\n))\r\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\r\n\r\nconst ScrollBar = React.forwardRef<\r\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\r\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\r\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\r\n <ScrollAreaPrimitive.ScrollAreaScrollbar\r\n ref={ref}\r\n orientation={orientation}\r\n className={cn(\r\n \"flex touch-none select-none transition-colors\",\r\n orientation === \"vertical\" &&\r\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\r\n orientation === \"horizontal\" &&\r\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\r\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\r\n))\r\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\r\n\r\nexport { ScrollArea, ScrollBar }\r\n","import React, { useState } from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\r\nimport { ScrollArea } from './scroll-area';\r\nimport { \r\n Star, Heart, Home, User, Settings, Mail, Phone, Calendar,\r\n MapPin, Camera, Image, Music, Video, Book, Bookmark,\r\n Search, Filter, Edit, Trash2, Plus, Minus, Check, X,\r\n ChevronDown, ChevronUp, ChevronLeft, ChevronRight,\r\n ArrowUp, ArrowDown, ArrowLeft, ArrowRight,\r\n Clock, Bell, AlertCircle, Info, HelpCircle,\r\n Download, Upload, Share, Copy,\r\n Save, FileText, Folder, FolderOpen, Archive,\r\n Lock, Unlock, Eye, EyeOff, Shield, Key,\r\n Zap, Flame, Sparkles, Award, Trophy, Target\r\n} from 'lucide-react';\r\n\r\ninterface IconPickerProps {\r\n value?: string;\r\n onChange?: (iconName: string) => void;\r\n label?: string;\r\n}\r\n\r\nconst ICONS = {\r\n Star, Heart, Home, User, Settings, Mail, Phone, Calendar,\r\n MapPin, Camera, Image, Music, Video, Book, Bookmark,\r\n Search, Filter, Edit, Trash2, Plus, Minus, Check, X,\r\n ChevronDown, ChevronUp, ChevronLeft, ChevronRight,\r\n ArrowUp, ArrowDown, ArrowLeft, ArrowRight,\r\n Clock, Bell, AlertCircle, Info, HelpCircle,\r\n Download, Upload, Share, Copy,\r\n Save, FileText, Folder, FolderOpen, Archive,\r\n Lock, Unlock, Eye, EyeOff, Shield, Key,\r\n Zap, Flame, Sparkles, Award, Trophy, Target\r\n};\r\n\r\nexport const IconPicker: React.FC<IconPickerProps> = ({\r\n value = 'Star',\r\n onChange,\r\n label\r\n}) => {\r\n const [searchTerm, setSearchTerm] = useState('');\r\n\r\n const filteredIcons = Object.entries(ICONS).filter(([name]) =>\r\n name.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n const SelectedIcon = ICONS[value as keyof typeof ICONS] || Star;\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n {label && <Label>{label}</Label>}\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n className=\"w-full justify-start text-left font-normal\"\r\n >\r\n <SelectedIcon className=\"h-4 w-4 mr-2\" />\r\n {value}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n <div className=\"space-y-3\">\r\n <div>\r\n <Label htmlFor=\"icon-search\">Buscar ícone</Label>\r\n <Input\r\n id=\"icon-search\"\r\n placeholder=\"Digite o nome do ícone...\"\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n />\r\n </div>\r\n <ScrollArea className=\"h-48\">\r\n <div className=\"grid grid-cols-6 gap-2\">\r\n {filteredIcons.map(([name, IconComponent]) => (\r\n <button\r\n key={name}\r\n className={`p-2 rounded border-2 hover:border-primary ${\r\n value === name ? 'border-primary bg-primary/10' : 'border-border'\r\n }`}\r\n onClick={() => onChange?.(name)}\r\n title={name}\r\n >\r\n <IconComponent className=\"h-4 w-4\" />\r\n </button>\r\n ))}\r\n </div>\r\n </ScrollArea>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n};","import * as React from \"react\"\r\nimport { OTPInput, OTPInputContext } from \"input-otp\"\r\nimport { Dot } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst InputOTP = React.forwardRef<\r\n React.ElementRef<typeof OTPInput>,\r\n React.ComponentPropsWithoutRef<typeof OTPInput>\r\n>(({ className, containerClassName, ...props }, ref) => (\r\n <OTPInput\r\n ref={ref}\r\n containerClassName={cn(\r\n \"flex items-center gap-2 has-[:disabled]:opacity-50\",\r\n containerClassName\r\n )}\r\n className={cn(\"disabled:cursor-not-allowed\", className)}\r\n {...props}\r\n />\r\n))\r\nInputOTP.displayName = \"InputOTP\"\r\n\r\nconst InputOTPGroup = React.forwardRef<\r\n React.ElementRef<\"div\">,\r\n React.ComponentPropsWithoutRef<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn(\"flex items-center\", className)} {...props} />\r\n))\r\nInputOTPGroup.displayName = \"InputOTPGroup\"\r\n\r\nconst InputOTPSlot = React.forwardRef<\r\n React.ElementRef<\"div\">,\r\n React.ComponentPropsWithoutRef<\"div\"> & { index: number }\r\n>(({ index, className, ...props }, ref) => {\r\n const inputOTPContext = React.useContext(OTPInputContext)\r\n const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md\",\r\n isActive && \"z-10 ring-2 ring-ring ring-offset-background\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {char}\r\n {hasFakeCaret && (\r\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\r\n <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n})\r\nInputOTPSlot.displayName = \"InputOTPSlot\"\r\n\r\nconst InputOTPSeparator = React.forwardRef<\r\n React.ElementRef<\"div\">,\r\n React.ComponentPropsWithoutRef<\"div\">\r\n>(({ ...props }, ref) => (\r\n <div ref={ref} role=\"separator\" {...props}>\r\n <Dot />\r\n </div>\r\n))\r\nInputOTPSeparator.displayName = \"InputOTPSeparator\"\r\n\r\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\r\n","import { cn } from \"../../utils\"\r\nimport { Loader2 } from \"lucide-react\"\r\n\r\ninterface SpinnerProps {\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n className?: string\r\n}\r\n\r\nconst sizeClasses = {\r\n sm: \"h-4 w-4\",\r\n md: \"h-6 w-6\", \r\n lg: \"h-8 w-8\"\r\n}\r\n\r\nexport function Spinner({ size = \"md\", className }: SpinnerProps) {\r\n return (\r\n <Loader2 \r\n className={cn(\r\n \"animate-spin text-muted-foreground\",\r\n sizeClasses[size],\r\n className\r\n )} \r\n />\r\n )\r\n}","import * as React from \"react\"\r\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\nimport { ButtonProps, buttonVariants } from \"./button\"\r\n\r\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\r\n <nav\r\n role=\"navigation\"\r\n aria-label=\"pagination\"\r\n className={cn(\"mx-auto flex w-full justify-center\", className)}\r\n {...props}\r\n />\r\n)\r\nPagination.displayName = \"Pagination\"\r\n\r\nconst PaginationContent = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n className={cn(\"flex flex-row items-center gap-1\", className)}\r\n {...props}\r\n />\r\n))\r\nPaginationContent.displayName = \"PaginationContent\"\r\n\r\nconst PaginationItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ className, ...props }, ref) => (\r\n <li ref={ref} className={cn(\"\", className)} {...props} />\r\n))\r\nPaginationItem.displayName = \"PaginationItem\"\r\n\r\ntype PaginationLinkProps = {\r\n isActive?: boolean\r\n} & Pick<ButtonProps, \"size\"> &\r\n React.ComponentProps<\"a\">\r\n\r\nconst PaginationLink = ({\r\n className,\r\n isActive,\r\n size = \"icon\",\r\n ...props\r\n}: PaginationLinkProps) => (\r\n <a\r\n aria-current={isActive ? \"page\" : undefined}\r\n className={cn(\r\n buttonVariants({\r\n variant: isActive ? \"outline\" : \"ghost\",\r\n size,\r\n }),\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nPaginationLink.displayName = \"PaginationLink\"\r\n\r\nconst PaginationPrevious = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof PaginationLink>) => (\r\n <PaginationLink\r\n aria-label=\"Go to previous page\"\r\n size=\"default\"\r\n className={cn(\"gap-1 pl-2.5\", className)}\r\n {...props}\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n <span>Previous</span>\r\n </PaginationLink>\r\n)\r\nPaginationPrevious.displayName = \"PaginationPrevious\"\r\n\r\nconst PaginationNext = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof PaginationLink>) => (\r\n <PaginationLink\r\n aria-label=\"Go to next page\"\r\n size=\"default\"\r\n className={cn(\"gap-1 pr-2.5\", className)}\r\n {...props}\r\n >\r\n <span>Next</span>\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </PaginationLink>\r\n)\r\nPaginationNext.displayName = \"PaginationNext\"\r\n\r\nconst PaginationEllipsis = ({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"span\">) => (\r\n <span\r\n aria-hidden\r\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\r\n {...props}\r\n >\r\n <MoreHorizontal className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">More pages</span>\r\n </span>\r\n)\r\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\r\n\r\nexport {\r\n Pagination,\r\n PaginationContent,\r\n PaginationEllipsis,\r\n PaginationItem,\r\n PaginationLink,\r\n PaginationNext,\r\n PaginationPrevious,\r\n}\r\n","import * as React from \"react\"\r\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\r\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Select = SelectPrimitive.Root\r\n\r\nconst SelectGroup = SelectPrimitive.Group\r\n\r\nconst SelectValue = SelectPrimitive.Value\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n))\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n))\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n))\r\nSelectScrollDownButton.displayName =\r\n SelectPrimitive.ScrollDownButton.displayName\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = \"popper\", ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n position === \"popper\" &&\r\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\r\n className\r\n )}\r\n position={position}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n \"p-1\",\r\n position === \"popper\" &&\r\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\r\n )}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n))\r\nSelectContent.displayName = SelectPrimitive.Content.displayName\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <SelectPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n))\r\nSelectItem.displayName = SelectPrimitive.Item.displayName\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n}","import * as React from \"react\"\r\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\r\n>(\r\n (\r\n { className, orientation = \"horizontal\", decorative = true, ...props },\r\n ref\r\n ) => (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n \"shrink-0 bg-border\",\r\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\nSeparator.displayName = SeparatorPrimitive.Root.displayName\r\n\r\nexport { Separator }","import * as SheetPrimitive from \"@radix-ui/react-dialog\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { X } from \"lucide-react\"\r\nimport * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Sheet = SheetPrimitive.Root\r\n\r\nconst SheetTrigger = SheetPrimitive.Trigger\r\n\r\nconst SheetClose = SheetPrimitive.Close\r\n\r\nconst SheetPortal = SheetPrimitive.Portal\r\n\r\nconst SheetOverlay = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\r\n\r\nconst sheetVariants = cva(\r\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\r\n {\r\n variants: {\r\n side: {\r\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\r\n bottom:\r\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\r\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\r\n right:\r\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\r\n },\r\n },\r\n defaultVariants: {\r\n side: \"right\",\r\n },\r\n }\r\n)\r\n\r\ninterface SheetContentProps\r\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\r\n VariantProps<typeof sheetVariants> { }\r\n\r\nconst SheetContent = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Content>,\r\n SheetContentProps\r\n>(({ side = \"right\", className, children, ...props }, ref) => (\r\n <SheetPortal>\r\n <SheetOverlay />\r\n <SheetPrimitive.Content\r\n ref={ref}\r\n className={cn(sheetVariants({ side }), className)}\r\n {...props}\r\n >\r\n {children}\r\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </SheetPrimitive.Close>\r\n </SheetPrimitive.Content>\r\n </SheetPortal>\r\n))\r\nSheetContent.displayName = SheetPrimitive.Content.displayName\r\n\r\nconst SheetHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetHeader.displayName = \"SheetHeader\"\r\n\r\nconst SheetFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetFooter.displayName = \"SheetFooter\"\r\n\r\nconst SheetTitle = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold text-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetTitle.displayName = SheetPrimitive.Title.displayName\r\n\r\nconst SheetDescription = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetDescription.displayName = SheetPrimitive.Description.displayName\r\n\r\nexport {\r\n Sheet, SheetClose,\r\n SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger\r\n}\r\n\r\n","\r\nimport * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { VariantProps, cva } from \"class-variance-authority\"\r\nimport { PanelLeft } from \"lucide-react\"\r\n\r\n// Mobile hook integrated inline\r\nimport { cn } from \"../../utils\"\r\nimport { Button } from \"./button\"\r\nimport { Input } from \"./input\"\r\nimport { Separator } from \"./separator\"\r\nimport { Sheet, SheetContent, SheetTitle } from \"./sheet\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from \"./tooltip\"\r\nconst SIDEBAR_STORAGE_KEY = \"sidebar:state\"\r\nconst SIDEBAR_WIDTH = \"16rem\"\r\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\r\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\r\n\r\ntype SidebarContext = {\r\n state: \"expanded\" | \"collapsed\"\r\n open: boolean\r\n setOpen: (open: boolean) => void\r\n openMobile: boolean\r\n setOpenMobile: (open: boolean) => void\r\n isMobile: boolean\r\n toggleSidebar: () => void\r\n}\r\n\r\nconst SidebarContext = React.createContext<SidebarContext | null>(null)\r\n\r\nfunction useSidebar() {\r\n const context = React.useContext(SidebarContext)\r\n if (!context) {\r\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\r\n }\r\n\r\n return context\r\n}\r\n\r\nconst SidebarProvider = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n defaultOpen?: boolean\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n }\r\n>(\r\n (\r\n {\r\n defaultOpen = true,\r\n open: openProp,\r\n onOpenChange: setOpenProp,\r\n className,\r\n style,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [isMobile, setIsMobile] = React.useState(false)\r\n \r\n React.useEffect(() => {\r\n const checkMobile = () => setIsMobile(window.innerWidth < 768);\r\n checkMobile();\r\n window.addEventListener('resize', checkMobile);\r\n return () => window.removeEventListener('resize', checkMobile);\r\n }, [])\r\n const [openMobile, setOpenMobile] = React.useState(false)\r\n\r\n // This is the internal state of the sidebar.\r\n // We use openProp and setOpenProp for control from outside the component.\r\n const [_open, _setOpen] = React.useState(() => {\r\n if (typeof window !== 'undefined') {\r\n const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY)\r\n return stored !== null ? stored === 'true' : defaultOpen\r\n }\r\n return defaultOpen\r\n })\r\n const open = openProp ?? _open\r\n const setOpen = React.useCallback(\r\n (value: boolean | ((value: boolean) => boolean)) => {\r\n const openState = typeof value === \"function\" ? value(open) : value\r\n if (setOpenProp) {\r\n setOpenProp(openState)\r\n } else {\r\n _setOpen(openState)\r\n }\r\n\r\n // This saves the sidebar state to localStorage.\r\n if (typeof window !== 'undefined') {\r\n localStorage.setItem(SIDEBAR_STORAGE_KEY, String(openState))\r\n }\r\n },\r\n [setOpenProp, open]\r\n )\r\n\r\n // Helper to toggle the sidebar.\r\n const toggleSidebar = React.useCallback(() => {\r\n return isMobile\r\n ? setOpenMobile((open) => !open)\r\n : setOpen((open) => !open)\r\n }, [isMobile, setOpen, setOpenMobile])\r\n\r\n // Adds a keyboard shortcut to toggle the sidebar.\r\n React.useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (\r\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\r\n (event.metaKey || event.ctrlKey)\r\n ) {\r\n event.preventDefault()\r\n toggleSidebar()\r\n }\r\n }\r\n\r\n window.addEventListener(\"keydown\", handleKeyDown)\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\r\n }, [toggleSidebar])\r\n\r\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n // This makes it easier to style the sidebar with Tailwind classes.\r\n const state = open ? \"expanded\" : \"collapsed\"\r\n\r\n const contextValue = React.useMemo<SidebarContext>(\r\n () => ({\r\n state,\r\n open,\r\n setOpen,\r\n isMobile,\r\n openMobile,\r\n setOpenMobile,\r\n toggleSidebar,\r\n }),\r\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\r\n )\r\n\r\n return (\r\n <SidebarContext.Provider value={contextValue}>\r\n <TooltipProvider delayDuration={0}>\r\n <div\r\n className={cn(\r\n \"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar sidebar-container\",\r\n className\r\n )}\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH,\r\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\r\n ...style,\r\n } as React.CSSProperties\r\n }\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </TooltipProvider>\r\n </SidebarContext.Provider>\r\n )\r\n }\r\n)\r\nSidebarProvider.displayName = \"SidebarProvider\"\r\n\r\nconst Sidebar = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n side?: \"left\" | \"right\"\r\n variant?: \"sidebar\" | \"floating\" | \"inset\"\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\r\n }\r\n>(\r\n (\r\n {\r\n side = \"left\",\r\n variant = \"sidebar\",\r\n collapsible = \"offcanvas\",\r\n className,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\r\n\r\n if (collapsible === \"none\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n\r\n if (isMobile) {\r\n return (\r\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n <SheetContent\r\n data-sidebar=\"sidebar\"\r\n data-mobile=\"true\"\r\n className=\"w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden sidebar-mobile\"\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\r\n } as React.CSSProperties\r\n }\r\n side={side}\r\n >\r\n <SheetTitle className=\"sr-only\">Menu de Navegação</SheetTitle>\r\n <div className=\"flex h-full w-full flex-col\">{children}</div>\r\n </SheetContent>\r\n </Sheet>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className=\"group peer hidden md:block text-sidebar-foreground\"\r\n data-state={state}\r\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\r\n data-variant={variant}\r\n data-side={side}\r\n >\r\n {/* This is what handles the sidebar gap on desktop */}\r\n <div\r\n className={cn(\r\n \"duration-200 relative h-svh w-[--sidebar-width] bg-transparent transition-[width] ease-linear\",\r\n \"group-data-[collapsible=offcanvas]:w-0\",\r\n \"group-data-[side=right]:rotate-180\",\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]\"\r\n : \"group-data-[collapsible=icon]:w-[--sidebar-width-icon]\"\r\n )}\r\n />\r\n <div\r\n className={cn(\r\n \"duration-200 fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] ease-linear md:flex\",\r\n side === \"left\"\r\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\r\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\r\n // Adjust the padding for floating and inset variants.\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]\"\r\n : \"group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n data-sidebar=\"sidebar\"\r\n className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\nSidebar.displayName = \"Sidebar\"\r\n\r\nconst SidebarTrigger = React.forwardRef<\r\n React.ElementRef<typeof Button>,\r\n React.ComponentProps<typeof Button>\r\n>(({ className, onClick, ...props }, ref) => {\r\n const { toggleSidebar } = useSidebar()\r\n\r\n return (\r\n <Button\r\n ref={ref}\r\n data-sidebar=\"trigger\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-7 w-7\", className)}\r\n onClick={(event) => {\r\n onClick?.(event)\r\n toggleSidebar()\r\n }}\r\n {...props}\r\n >\r\n <PanelLeft />\r\n <span className=\"sr-only\">Toggle Sidebar</span>\r\n </Button>\r\n )\r\n})\r\nSidebarTrigger.displayName = \"SidebarTrigger\"\r\n\r\nconst SidebarRail = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\">\r\n>(({ className, ...props }, ref) => {\r\n const { toggleSidebar } = useSidebar()\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n data-sidebar=\"rail\"\r\n aria-label=\"Toggle Sidebar\"\r\n tabIndex={-1}\r\n onClick={toggleSidebar}\r\n title=\"Toggle Sidebar\"\r\n className={cn(\r\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\r\n \"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize\",\r\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\r\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar\",\r\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\r\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarRail.displayName = \"SidebarRail\"\r\n\r\nconst SidebarInset = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"main\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <main\r\n ref={ref}\r\n className={cn(\r\n \"relative flex min-h-svh flex-1 flex-col bg-background\",\r\n \"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInset.displayName = \"SidebarInset\"\r\n\r\nconst SidebarInput = React.forwardRef<\r\n React.ElementRef<typeof Input>,\r\n React.ComponentProps<typeof Input>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Input\r\n ref={ref}\r\n data-sidebar=\"input\"\r\n className={cn(\r\n \"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInput.displayName = \"SidebarInput\"\r\n\r\nconst SidebarHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"header\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarHeader.displayName = \"SidebarHeader\"\r\n\r\nconst SidebarFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"footer\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarFooter.displayName = \"SidebarFooter\"\r\n\r\nconst SidebarSeparator = React.forwardRef<\r\n React.ElementRef<typeof Separator>,\r\n React.ComponentProps<typeof Separator>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Separator\r\n ref={ref}\r\n data-sidebar=\"separator\"\r\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarSeparator.displayName = \"SidebarSeparator\"\r\n\r\nconst SidebarContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"content\"\r\n className={cn(\r\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarContent.displayName = \"SidebarContent\"\r\n\r\nconst SidebarGroup = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group\"\r\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroup.displayName = \"SidebarGroup\"\r\n\r\nconst SidebarGroupLabel = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-label\"\r\n className={cn(\r\n \"duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\"\r\n\r\nconst SidebarGroupAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-action\"\r\n className={cn(\r\n \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 after:md:hidden\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupAction.displayName = \"SidebarGroupAction\"\r\n\r\nconst SidebarGroupContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group-content\"\r\n className={cn(\"w-full text-sm\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarGroupContent.displayName = \"SidebarGroupContent\"\r\n\r\nconst SidebarMenu = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu\"\r\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenu.displayName = \"SidebarMenu\"\r\n\r\nconst SidebarMenuItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ className, ...props }, ref) => (\r\n <li\r\n ref={ref}\r\n data-sidebar=\"menu-item\"\r\n className={cn(\"group/menu-item relative\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuItem.displayName = \"SidebarMenuItem\"\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-primary data-[active=true]:font-medium data-[active=true]:text-sidebar-primary-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:gap-0 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\r\n outline:\r\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\r\n },\r\n size: {\r\n default: \"h-10 text-sm\",\r\n sm: \"h-7 text-xs\",\r\n lg: \"h-12 text-sm group-data-[collapsible=icon]:!p-0\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nconst SidebarMenuButton = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & {\r\n asChild?: boolean\r\n isActive?: boolean\r\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\r\n } & VariantProps<typeof sidebarMenuButtonVariants>\r\n>(\r\n (\r\n {\r\n asChild = false,\r\n isActive = false,\r\n variant = \"default\",\r\n size = \"default\",\r\n tooltip,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n const { isMobile, state } = useSidebar()\r\n\r\n const button = (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n {...props}\r\n />\r\n )\r\n\r\n if (!tooltip) {\r\n return button\r\n }\r\n\r\n if (typeof tooltip === \"string\") {\r\n tooltip = {\r\n children: tooltip,\r\n }\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{button}</TooltipTrigger>\r\n <TooltipContent\r\n side=\"right\"\r\n align=\"center\"\r\n hidden={state !== \"collapsed\" || isMobile}\r\n {...tooltip}\r\n />\r\n </Tooltip>\r\n )\r\n }\r\n)\r\nSidebarMenuButton.displayName = \"SidebarMenuButton\"\r\n\r\nconst SidebarMenuAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & {\r\n asChild?: boolean\r\n showOnHover?: boolean\r\n }\r\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-action\"\r\n className={cn(\r\n \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 after:md:hidden\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n showOnHover &&\r\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuAction.displayName = \"SidebarMenuAction\"\r\n\r\nconst SidebarMenuBadge = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-badge\"\r\n className={cn(\r\n \"absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none pointer-events-none\",\r\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\"\r\n\r\nconst SidebarMenuSkeleton = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n showIcon?: boolean\r\n }\r\n>(({ className, showIcon = false, ...props }, ref) => {\r\n // Random width between 50 to 90%.\r\n const width = React.useMemo(() => {\r\n return `${Math.floor(Math.random() * 40) + 50}%`\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-skeleton\"\r\n className={cn(\"rounded-md h-8 flex gap-2 px-2 items-center\", className)}\r\n {...props}\r\n >\r\n {showIcon && (\r\n <div\r\n className=\"size-4 rounded-md\"\r\n data-sidebar=\"menu-skeleton-icon\"\r\n />\r\n )}\r\n <div\r\n className=\"h-4 flex-1 max-w-[--skeleton-width] skeleton-width\"\r\n data-sidebar=\"menu-skeleton-text\"\r\n style={\r\n {\r\n \"--skeleton-width\": width,\r\n } as React.CSSProperties\r\n }\r\n />\r\n </div>\r\n )\r\n})\r\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\"\r\n\r\nconst SidebarMenuSub = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu-sub\"\r\n className={cn(\r\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuSub.displayName = \"SidebarMenuSub\"\r\n\r\nconst SidebarMenuSubItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\r\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\"\r\n\r\nconst SidebarMenuSubButton = React.forwardRef<\r\n HTMLAnchorElement,\r\n React.ComponentProps<\"a\"> & {\r\n asChild?: boolean\r\n size?: \"sm\" | \"md\"\r\n isActive?: boolean\r\n }\r\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"a\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-sub-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(\r\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\r\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\r\n size === \"sm\" && \"text-xs\",\r\n size === \"md\" && \"text-sm\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\"\r\n\r\nexport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarGroup,\r\n SidebarGroupAction,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarHeader,\r\n SidebarInput,\r\n SidebarInset,\r\n SidebarMenu,\r\n SidebarMenuAction,\r\n SidebarMenuBadge,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSkeleton,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n SidebarProvider,\r\n SidebarRail,\r\n SidebarSeparator,\r\n SidebarTrigger,\r\n useSidebar,\r\n}\r\n","import { cn } from \"../../utils\"\r\n\r\nfunction Skeleton({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div\r\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Skeleton }","import { Skeleton } from \"./skeleton\"\r\nimport { Card, CardContent, CardHeader } from \"./card\"\r\n\r\ninterface TableSkeletonProps {\r\n rows?: number\r\n columns?: number\r\n}\r\n\r\ninterface CardSkeletonProps {\r\n count?: number\r\n}\r\n\r\ninterface FormSkeletonProps {\r\n fields?: number\r\n}\r\n\r\nexport function TableSkeleton({ rows = 5, columns = 4 }: TableSkeletonProps) {\r\n return (\r\n <div className=\"w-full\">\r\n <div className=\"rounded-md border\">\r\n <div className=\"border-b bg-muted/50 px-4 py-3\">\r\n <div className=\"flex space-x-4\">\r\n {Array.from({ length: columns }).map((_, i) => (\r\n <Skeleton key={i} className=\"h-4 w-24\" />\r\n ))}\r\n </div>\r\n </div>\r\n <div>\r\n {Array.from({ length: rows }).map((_, i) => (\r\n <div key={i} className=\"border-b px-4 py-3 last:border-0\">\r\n <div className=\"flex space-x-4\">\r\n {Array.from({ length: columns }).map((_, j) => (\r\n <Skeleton key={j} className=\"h-4 w-20\" />\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function CardSkeleton({ count = 3 }: CardSkeletonProps) {\r\n return (\r\n <div className=\"space-y-4\">\r\n {Array.from({ length: count }).map((_, i) => (\r\n <Card key={i}>\r\n <CardHeader>\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n <Skeleton className=\"h-3 w-1/2\" />\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-3 w-full\" />\r\n <Skeleton className=\"h-3 w-2/3\" />\r\n </div>\r\n </CardContent>\r\n </Card>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport function FormSkeleton({ fields = 4 }: FormSkeletonProps) {\r\n return (\r\n <div className=\"space-y-4\">\r\n {Array.from({ length: fields }).map((_, i) => (\r\n <div key={i} className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-24\" />\r\n <Skeleton className=\"h-10 w-full\" />\r\n </div>\r\n ))}\r\n <div className=\"flex justify-end space-x-2 pt-4\">\r\n <Skeleton className=\"h-10 w-20\" />\r\n <Skeleton className=\"h-10 w-20\" />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function HeaderSkeleton() {\r\n return (\r\n <div className=\"flex items-center justify-between p-4 border-b\">\r\n <div className=\"flex items-center space-x-3\">\r\n <Skeleton className=\"h-8 w-8 rounded-full\" />\r\n <Skeleton className=\"h-6 w-32\" />\r\n </div>\r\n <div className=\"flex items-center space-x-2\">\r\n <Skeleton className=\"h-8 w-8\" />\r\n <Skeleton className=\"h-8 w-24\" />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function SidebarSkeleton() {\r\n return (\r\n <div className=\"w-64 border-r bg-muted/10\">\r\n <div className=\"p-4\">\r\n <Skeleton className=\"h-8 w-32 mb-6\" />\r\n <div className=\"space-y-2\">\r\n {Array.from({ length: 6 }).map((_, i) => (\r\n <div key={i} className=\"flex items-center space-x-3 p-2\">\r\n <Skeleton className=\"h-4 w-4\" />\r\n <Skeleton className=\"h-4 w-20\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}","import { cn } from \"../../utils\"\r\nimport { ReactNode } from \"react\"\r\n\r\ninterface StackProps {\r\n children: ReactNode\r\n direction?: \"row\" | \"column\"\r\n gap?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\r\n align?: \"start\" | \"center\" | \"end\" | \"stretch\"\r\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\"\r\n wrap?: boolean\r\n className?: string\r\n}\r\n\r\nconst gapClasses = {\r\n xs: \"gap-1\",\r\n sm: \"gap-2\", \r\n md: \"gap-4\",\r\n lg: \"gap-6\",\r\n xl: \"gap-8\"\r\n}\r\n\r\nconst alignClasses = {\r\n start: \"items-start\",\r\n center: \"items-center\", \r\n end: \"items-end\",\r\n stretch: \"items-stretch\"\r\n}\r\n\r\nconst justifyClasses = {\r\n start: \"justify-start\",\r\n center: \"justify-center\",\r\n end: \"justify-end\", \r\n between: \"justify-between\",\r\n around: \"justify-around\",\r\n evenly: \"justify-evenly\"\r\n}\r\n\r\nexport function Stack({\r\n children,\r\n direction = \"column\",\r\n gap = \"md\",\r\n align = \"stretch\",\r\n justify = \"start\", \r\n wrap = false,\r\n className\r\n}: StackProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex\",\r\n direction === \"column\" ? \"flex-col\" : \"flex-row\",\r\n gapClasses[gap],\r\n alignClasses[align],\r\n justifyClasses[justify],\r\n wrap && \"flex-wrap\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst Table = React.forwardRef<\r\n HTMLTableElement,\r\n React.HTMLAttributes<HTMLTableElement>\r\n>(({ className, ...props }, ref) => (\r\n <table\r\n ref={ref}\r\n className={cn(\"w-full caption-bottom text-sm\", className)}\r\n {...props}\r\n />\r\n))\r\nTable.displayName = \"Table\"\r\n\r\nconst TableHeader = React.forwardRef<\r\n HTMLTableSectionElement,\r\n React.HTMLAttributes<HTMLTableSectionElement>\r\n>(({ className, ...props }, ref) => (\r\n <thead ref={ref} className={cn(\"[&_tr]:border-b sticky top-0 z-10 bg-background\", className)} {...props} />\r\n))\r\nTableHeader.displayName = \"TableHeader\"\r\n\r\nconst TableBody = React.forwardRef<\r\n HTMLTableSectionElement,\r\n React.HTMLAttributes<HTMLTableSectionElement>\r\n>(({ className, ...props }, ref) => (\r\n <tbody\r\n ref={ref}\r\n className={cn(\"[&_tr:last-child]:border-0\", className)}\r\n {...props}\r\n />\r\n))\r\nTableBody.displayName = \"TableBody\"\r\n\r\nconst TableFooter = React.forwardRef<\r\n HTMLTableSectionElement,\r\n React.HTMLAttributes<HTMLTableSectionElement>\r\n>(({ className, ...props }, ref) => (\r\n <tfoot\r\n ref={ref}\r\n className={cn(\r\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTableFooter.displayName = \"TableFooter\"\r\n\r\nconst TableRow = React.forwardRef<\r\n HTMLTableRowElement,\r\n React.HTMLAttributes<HTMLTableRowElement>\r\n>(({ className, ...props }, ref) => (\r\n <tr\r\n ref={ref}\r\n className={cn(\r\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTableRow.displayName = \"TableRow\"\r\n\r\nconst TableHead = React.forwardRef<\r\n HTMLTableCellElement,\r\n React.ThHTMLAttributes<HTMLTableCellElement>\r\n>(({ className, ...props }, ref) => (\r\n <th\r\n ref={ref}\r\n className={cn(\r\n \"h-12 px-4 py-3 text-left align-middle font-medium text-muted-foreground bg-background border-b [&:has([role=checkbox])]:pr-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTableHead.displayName = \"TableHead\"\r\n\r\nconst TableCell = React.forwardRef<\r\n HTMLTableCellElement,\r\n React.TdHTMLAttributes<HTMLTableCellElement>\r\n>(({ className, ...props }, ref) => (\r\n <td\r\n ref={ref}\r\n className={cn(\"px-4 py-3 align-middle [&:has([role=checkbox])]:pr-0\", className)}\r\n {...props}\r\n />\r\n))\r\nTableCell.displayName = \"TableCell\"\r\n\r\nconst TableCaption = React.forwardRef<\r\n HTMLTableCaptionElement,\r\n React.HTMLAttributes<HTMLTableCaptionElement>\r\n>(({ className, ...props }, ref) => (\r\n <caption\r\n ref={ref}\r\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nTableCaption.displayName = \"TableCaption\"\r\n\r\nexport {\r\n Table,\r\n TableHeader,\r\n TableBody,\r\n TableFooter,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableCaption,\r\n}","import * as React from \"react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nexport interface TextareaProps\r\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\r\n\r\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n ({ className, ...props }, ref) => {\r\n return (\r\n <textarea\r\n className={cn(\r\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nTextarea.displayName = \"Textarea\"\r\n\r\nexport { Textarea }","import * as React from \"react\"\r\nimport * as ToastPrimitives from \"@radix-ui/react-toast\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"../../utils\"\r\n\r\nconst ToastProvider = ToastPrimitives.Provider\r\n\r\nconst ToastViewport = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Viewport>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Viewport\r\n ref={ref}\r\n className={cn(\r\n \"fixed top-4 left-1/2 transform -translate-x-1/2 z-[100] flex max-h-screen w-full max-w-[420px] flex-col p-4\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\r\n\r\nconst toastVariants = cva(\r\n \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"border bg-background text-foreground\",\r\n destructive:\r\n \"destructive group border-destructive bg-destructive text-destructive-foreground\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\nconst Toast = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Root>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\r\n VariantProps<typeof toastVariants>\r\n>(({ className, variant, ...props }, ref) => {\r\n return (\r\n <ToastPrimitives.Root\r\n ref={ref}\r\n className={cn(toastVariants({ variant }), className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nToast.displayName = ToastPrimitives.Root.displayName\r\n\r\nconst ToastAction = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Action>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Action\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nToastAction.displayName = ToastPrimitives.Action.displayName\r\n\r\nconst ToastClose = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Close>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Close\r\n ref={ref}\r\n className={cn(\r\n \"absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600\",\r\n className\r\n )}\r\n toast-close=\"\"\r\n {...props}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </ToastPrimitives.Close>\r\n))\r\nToastClose.displayName = ToastPrimitives.Close.displayName\r\n\r\nconst ToastTitle = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Title>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Title\r\n ref={ref}\r\n className={cn(\"text-sm font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nToastTitle.displayName = ToastPrimitives.Title.displayName\r\n\r\nconst ToastDescription = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Description>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Description\r\n ref={ref}\r\n className={cn(\"text-sm opacity-90\", className)}\r\n {...props}\r\n />\r\n))\r\nToastDescription.displayName = ToastPrimitives.Description.displayName\r\n\r\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\r\n\r\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\r\n\r\nexport {\r\n type ToastProps,\r\n type ToastActionElement,\r\n ToastProvider,\r\n ToastViewport,\r\n Toast,\r\n ToastTitle,\r\n ToastDescription,\r\n ToastClose,\r\n ToastAction,\r\n}\r\n","import React, { createContext, useContext, ReactNode } from 'react';\r\nimport { SidebarConfig } from '../types/sidebar';\r\n\r\ninterface NavigationContextType {\r\n navigation?: SidebarConfig['navigation'];\r\n}\r\n\r\nconst NavigationContext = createContext<NavigationContextType>({});\r\n\r\ninterface NavigationProviderProps {\r\n children: ReactNode;\r\n config?: SidebarConfig;\r\n}\r\n\r\nexport function NavigationProvider({ children, config }: NavigationProviderProps) {\r\n return (\r\n <NavigationContext.Provider value={{ navigation: config?.navigation }}>\r\n {children}\r\n </NavigationContext.Provider>\r\n );\r\n}\r\n\r\nexport function useNavigation() {\r\n return useContext(NavigationContext);\r\n}","import { useLocation } from \"react-router-dom\"\r\nimport { useNavigation } from \"../contexts/NavigationContext\"\r\n\r\nexport function usePageTitle(): string {\r\n const location = useLocation()\r\n const { navigation } = useNavigation()\r\n \r\n // Busca o título na configuração de navegação\r\n const currentRoute = navigation?.find(item => item.path === location.pathname)\r\n \r\n // Retorna o título da rota atual ou um fallback\r\n return currentRoute?.label || 'Página'\r\n}","import React from 'react';\r\nimport { User, Building2, LogOut, ChevronDown, RefreshCw } from 'lucide-react';\r\nimport { Button } from '../../components/ui/button';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card';\r\nimport { Badge } from '../../components/ui/badge';\r\nimport { Separator } from '../../components/ui/separator';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n} from '../../components/ui/dropdown-menu';\r\nimport { FeedbackDialog } from '../../components/ui/feedback-dialog';\r\nimport { useAuth } from '../contexts/AuthContext';\r\nimport type { Company } from '../../types';\r\n\r\ninterface UserInfoProps {\r\n variant?: 'card' | 'dropdown';\r\n className?: string;\r\n selectedUnit?: Company | null;\r\n onUnitChange?: (unit: Company) => void;\r\n}\r\n\r\nconst UserInfo: React.FC<UserInfoProps> = React.memo(({ \r\n variant = 'card', \r\n className = '',\r\n selectedUnit: propSelectedUnit,\r\n onUnitChange,\r\n}) => {\r\n const { \r\n user, \r\n companies, \r\n alias,\r\n isAuthenticated, \r\n logout,\r\n switchUnit\r\n } = useAuth();\r\n \r\n const defaultCompany = companies?.[0] || null;\r\n // Use the company that matches the current alias from AuthContext\r\n const authSelectedUnit = alias ? companies?.find(c => c.alias === alias) : defaultCompany;\r\n const selectedUnit = propSelectedUnit || authSelectedUnit || defaultCompany;\r\n const availableUnits = companies || [];\r\n const currentUnit = selectedUnit || defaultCompany;\r\n\r\n // Handle unit change with proper callback\r\n const handleUnitChange = React.useCallback((unit: Company) => {\r\n if (onUnitChange) {\r\n onUnitChange(unit);\r\n } else {\r\n switchUnit(unit);\r\n }\r\n }, [onUnitChange, switchUnit]);\r\n\r\n // Unidades únicas e ordenadas\r\n const uniqueSortedUnits = React.useMemo(() => {\r\n if (!availableUnits?.length) return [];\r\n \r\n const uniqueUnitsMap = new Map();\r\n availableUnits.forEach(unit => {\r\n uniqueUnitsMap.set(unit.alias, unit);\r\n });\r\n \r\n const uniqueUnits = Array.from(uniqueUnitsMap.values());\r\n const currentUnitInList = uniqueUnits.find(unit => unit.alias === currentUnit?.alias);\r\n const otherUnits = uniqueUnits.filter(unit => unit.alias !== currentUnit?.alias);\r\n \r\n otherUnits.sort((a, b) => \r\n (a.name || '').localeCompare(b.name || '', 'pt-BR', { sensitivity: 'base' })\r\n );\r\n \r\n return currentUnitInList ? [currentUnitInList, ...otherUnits] : otherUnits;\r\n }, [availableUnits, currentUnit?.alias]);\r\n\r\n if (!isAuthenticated || !user) {\r\n return null;\r\n }\r\n\r\n const UserContent = () => (\r\n <>\r\n <div className=\"flex items-center space-x-3\">\r\n <div className=\"flex-shrink-0\">\r\n <div className=\"w-10 h-10 bg-primary rounded-full flex items-center justify-center\">\r\n <User className=\"h-5 w-5 text-primary-foreground\" />\r\n </div>\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate\">\r\n {user.name}\r\n </p>\r\n <p className=\"text-xs text-muted-foreground\">\r\n Unidade: {currentUnit?.name || 'N/A'}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {currentUnit && (\r\n <div className=\"mt-3\">\r\n <div className=\"flex items-center space-x-2\">\r\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"text-sm font-medium\">\r\n {currentUnit.name}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {uniqueSortedUnits.length > 1 && (\r\n <div className=\"mt-2\">\r\n <p className=\"text-xs text-muted-foreground mb-1\">\r\n Unidades disponíveis: {uniqueSortedUnits.length}\r\n </p>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {uniqueSortedUnits.slice(0, 3).map((unit) => (\r\n <Badge \r\n key={unit.alias} \r\n variant={unit.alias === currentUnit?.alias ? \"default\" : \"secondary\"}\r\n className=\"text-xs cursor-pointer\"\r\n onClick={() => handleUnitChange(unit)}\r\n >\r\n {unit.name}\r\n </Badge>\r\n ))}\r\n {uniqueSortedUnits.length > 3 && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n +{uniqueSortedUnits.length - 3}\r\n </Badge>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n\r\n if (variant === 'dropdown') {\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"ghost\" className={`h-auto p-2 ${className}`}>\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"hidden md:block text-left\">\r\n <p className=\"text-sm font-medium\">{user.name}</p>\r\n <p className=\"text-xs text-muted-foreground\">{currentUnit?.name || 'N/A'}</p>\r\n </div>\r\n <div className=\"w-8 h-8 bg-primary rounded-full flex items-center justify-center\">\r\n <User className=\"h-4 w-4 text-primary-foreground\" />\r\n </div>\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n \r\n <DropdownMenuContent \r\n className=\"w-56 bg-background border border-border shadow-lg z-50\" \r\n align=\"end\"\r\n >\r\n <DropdownMenuSub>\r\n <DropdownMenuSubTrigger>\r\n <RefreshCw className=\"mr-2 h-4 w-4\" />\r\n Alterar Unidade\r\n </DropdownMenuSubTrigger>\r\n <DropdownMenuSubContent>\r\n {uniqueSortedUnits.map((unit) => (\r\n <DropdownMenuItem \r\n key={unit.alias} \r\n onClick={() => handleUnitChange(unit)}\r\n className={unit.alias === currentUnit?.alias ? \"bg-muted\" : \"\"}\r\n >\r\n <Building2 className=\"mr-2 h-4 w-4\" />\r\n {unit.name}\r\n {unit.alias === currentUnit?.alias && (\r\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\r\n Atual\r\n </Badge>\r\n )}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuSubContent>\r\n </DropdownMenuSub>\r\n \r\n <DropdownMenuSeparator />\r\n \r\n <FeedbackDialog variant=\"menuItem\" />\r\n \r\n <DropdownMenuItem onClick={logout}>\r\n <LogOut className=\"mr-2 h-4 w-4\" />\r\n Sair\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n }\r\n\r\n return (\r\n <Card className={className}>\r\n <CardHeader>\r\n <CardTitle className=\"text-lg\">Informações do Usuário</CardTitle>\r\n </CardHeader>\r\n \r\n <CardContent className=\"space-y-4\">\r\n <UserContent />\r\n \r\n <Separator />\r\n \r\n <div className=\"flex space-x-2\">\r\n <FeedbackDialog className=\"flex-1\" />\r\n <Button \r\n variant=\"outline\" \r\n onClick={logout}\r\n size=\"sm\"\r\n className=\"flex-1\"\r\n >\r\n <LogOut className=\"mr-2 h-4 w-4\" />\r\n Sair\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n});\r\n\r\nexport default UserInfo;","import { useState, useEffect, useRef, useCallback } from 'react';\r\n\r\n/**\r\n * Hook para aplicar debounce em um valor com capacidade de cancelamento\r\n * @param value - Valor a ser debounced\r\n * @param delay - Delay em milissegundos\r\n * @returns [valor com debounce aplicado, função para cancelar]\r\n */\r\nexport function useDebounce<T>(value: T, delay: number): [T, () => void] {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n const timeoutRef = useRef<NodeJS.Timeout>();\r\n\r\n const cancel = useCallback(() => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = undefined;\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n cancel(); // Cancela timeout anterior\r\n \r\n timeoutRef.current = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n return cancel;\r\n }, [value, delay, cancel]);\r\n\r\n return [debouncedValue, cancel];\r\n}","import React, { useState, useEffect } from 'react';\r\nimport { Button } from '../ui/button';\r\nimport { Input } from '../ui/input';\r\nimport { SidebarTrigger } from '../ui/sidebar';\r\nimport { X, RefreshCw, Search } from 'lucide-react';\r\nimport { usePageTitle } from '../../hooks/usePageTitle';\r\nimport { useSearchParams, useLocation } from 'react-router-dom';\r\nimport UserInfo from '../../auth/components/UserInfo';\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\nimport { useDebounce } from '../../hooks/useDebounce';\r\nimport { SEARCH_CONFIG } from '../../config';\r\n\r\ninterface AppHeaderProps {\r\n actions?: React.ReactNode;\r\n}\r\n\r\nconst AppHeader = ({ actions }: AppHeaderProps) => {\r\n const location = useLocation();\r\n const pageTitle = usePageTitle();\r\n \r\n \r\n const { companies, alias, isSearchVisible, clearSearch, refreshData, switchUnit } = useAuth();\r\n const selectedUnit = alias \r\n ? companies?.find(company => company.alias === alias) || companies?.[0] || null\r\n : companies?.[0] || null;\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n // Local state for immediate input value - initialize once from URL\r\n const [inputValue, setInputValue] = useState(() => searchParams.get('search') || '');\r\n \r\n // Debounced value that triggers URL updates with cancel function\r\n const [debouncedSearchValue, cancelDebounce] = useDebounce(inputValue, SEARCH_CONFIG.debounceDelay);\r\n\r\n // Update URL params (only when search is visible) to avoid clearing OAuth fragments on /callback\r\n useEffect(() => {\r\n if (!isSearchVisible) return;\r\n const newParams = new URLSearchParams(searchParams);\r\n if (debouncedSearchValue) {\r\n newParams.set('search', debouncedSearchValue);\r\n newParams.set('page', '1'); // Reset to page 1\r\n } else {\r\n newParams.delete('search');\r\n newParams.delete('page');\r\n }\r\n setSearchParams(newParams);\r\n }, [debouncedSearchValue, setSearchParams, isSearchVisible, searchParams]);\r\n\r\n const handleSearchChange = (value: string) => {\r\n setInputValue(value);\r\n };\r\n\r\n const handleClearSearch = () => {\r\n // Cancel any pending debounce\r\n cancelDebounce();\r\n \r\n // Clear input immediately\r\n setInputValue('');\r\n \r\n // Update URL immediately\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.delete('search');\r\n newParams.delete('page');\r\n setSearchParams(newParams);\r\n };\r\n\r\n return (\r\n <header className=\"bg-white border-b border-gray-200 px-2 md:px-4 py-2\">\r\n <div className=\"flex items-center justify-between gap-4\">\r\n {/* Left side: Menu button, breadcrumb and search */}\r\n <div className=\"flex items-center space-x-1 md:space-x-2 min-w-0\">\r\n <SidebarTrigger className=\"flex-shrink-0\" />\r\n\r\n <div className=\"min-w-0 flex flex-col md:flex-row md:items-center md:space-x-3 space-y-2 md:space-y-0\">\r\n {/* Page Title */}\r\n <div className=\"min-w-0\">\r\n <h1 className=\"text-lg font-semibold text-foreground truncate\">\r\n {pageTitle}\r\n </h1>\r\n </div>\r\n\r\n {/* Search field (only visible on CRUD pages) */}\r\n {isSearchVisible && (\r\n <div className=\"flex items-center space-x-1 w-full md:w-auto\">\r\n <div className=\"relative w-full md:w-48\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4\" />\r\n <Input\r\n placeholder=\"Buscar...\"\r\n value={inputValue}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n className=\"w-full pl-10 pr-8\"\r\n />\r\n {inputValue && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"absolute right-1 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0 hover:bg-gray-100\"\r\n onClick={handleClearSearch}\r\n title=\"Limpar busca\"\r\n >\r\n <X size={14} />\r\n </Button>\r\n )}\r\n </div>\r\n\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={refreshData}\r\n className=\"flex-shrink-0 h-10 w-10 p-0\"\r\n title=\"Atualizar dados\"\r\n >\r\n <RefreshCw size={14} />\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right side: Actions and User info */}\r\n <div className=\"flex-shrink-0 flex items-center gap-3\">\r\n {actions && (\r\n <div className=\"flex items-center gap-2\">\r\n {actions}\r\n </div>\r\n )}\r\n <div className=\"text-sm\">\r\n <UserInfo\r\n variant=\"dropdown\"\r\n selectedUnit={selectedUnit}\r\n onUnitChange={switchUnit}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n};\r\n\r\nexport default AppHeader;","import { useQuery } from '@tanstack/react-query';\r\nimport { getSupabaseClient } from '../supabase/SupabaseSingleton';\r\nimport { useAuth } from '../auth/contexts/AuthContext';\r\n\r\ninterface UseActiveModulesOptions {\r\n enabled?: boolean;\r\n}\r\n\r\nexport const useActiveModules = (options: UseActiveModulesOptions = {}) => {\r\n const { enabled = true } = options;\r\n const { alias } = useAuth();\r\n \r\n return useQuery({\r\n queryKey: ['active-modules', alias],\r\n queryFn: async () => {\r\n if (!alias) {\r\n return [];\r\n }\r\n\r\n const supabase = getSupabaseClient();\r\n const { data, error } = await (supabase as any)\r\n .schema('central')\r\n .from('modules')\r\n .select(`\r\n id, name, url,\r\n modules_alias!inner(alias)\r\n `)\r\n .eq('modules_alias.alias', alias)\r\n .eq('status', 'active')\r\n .order('name');\r\n \r\n if (error) {\r\n throw error;\r\n }\r\n \r\n return data || [];\r\n },\r\n enabled: enabled && !!alias, // Só executa quando enabled for true E alias existir\r\n });\r\n};","// Asset exports for ForLogic Core library\r\n\r\n// Supabase Storage URLs for library assets\r\nconst DEFAULT_SUPABASE_PROJECT_ID = import.meta.env.VITE_SUPABASE_PROJECT_ID;\r\n\r\nexport const assets = {\r\n logo: `https://${DEFAULT_SUPABASE_PROJECT_ID}.supabase.co/storage/v1/object/public/library-assets/logo.png`,\r\n smallLogo: `https://${DEFAULT_SUPABASE_PROJECT_ID}.supabase.co/storage/v1/object/public/library-assets/small.png`\r\n};\r\n\r\n// Export for backward compatibility\r\nexport const logoSrc = assets.logo;\r\nexport const smallLogoSrc = assets.smallLogo;","import { useState } from 'react';\r\nimport { ChevronDown, ExternalLink, Loader2, AlertCircle } from 'lucide-react';\r\nimport { Link, useLocation } from 'react-router-dom';\r\nimport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarGroup,\r\n SidebarGroupContent,\r\n SidebarHeader,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from '../ui/sidebar';\r\n\r\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '../ui/dropdown-menu';\r\nimport { useActiveModules } from '../../hooks/useActiveModules';\r\nimport { SidebarConfig } from '../../types/sidebar';\r\nimport { assets } from '../../assets';\r\n\r\ninterface Module {\r\n id: string;\r\n name: string;\r\n url?: string;\r\n status: 'active' | 'inactive';\r\n}\r\n\r\ninterface AppSidebarProps {\r\n config?: SidebarConfig;\r\n}\r\n\r\nexport function AppSidebar({ config }: AppSidebarProps = {}) {\r\n const { state } = useSidebar();\r\n const location = useLocation();\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n\r\n // Só carrega os módulos quando o dropdown é aberto\r\n const {\r\n data: modules,\r\n isLoading,\r\n error\r\n } = useActiveModules({\r\n enabled: dropdownOpen\r\n });\r\n\r\n const isActive = (path: string) => location.pathname === path;\r\n \r\n const getColorVariant = (index: number) => {\r\n const colors = ['border-l-yellow-400', 'border-l-green-400', 'border-l-blue-400', 'border-l-red-400', 'border-l-purple-400', 'border-l-pink-400'];\r\n return colors[index % colors.length];\r\n };\r\n \r\n const handleModuleClick = (moduleUrl: string) => {\r\n const module = modules?.find(m => m.url === moduleUrl);\r\n if (module?.url) {\r\n window.open(module.url, '_blank');\r\n }\r\n };\r\n \r\n const renderModulesContent = () => {\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center space-x-2 py-3 px-3 text-muted-foreground\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n <span className=\"text-sm\">Carregando módulos...</span>\r\n </div>\r\n );\r\n }\r\n \r\n if (error) {\r\n return (\r\n <div className=\"flex items-center space-x-2 py-3 px-3 text-destructive\">\r\n <AlertCircle className=\"h-4 w-4\" />\r\n <span className=\"text-sm\">Erro ao carregar módulos</span>\r\n </div>\r\n );\r\n }\r\n \r\n if (!modules || modules.length === 0) {\r\n return (\r\n <div className=\"py-3 px-3 text-muted-foreground text-sm\">\r\n Nenhum módulo disponível\r\n </div>\r\n );\r\n }\r\n \r\n return (\r\n <div className=\"space-y-2\">\r\n {modules.map((module: Module, index: number) => (\r\n <div \r\n key={module.id} \r\n onClick={() => handleModuleClick(module.url || '')} \r\n className={`\r\n bg-muted/50 hover:bg-muted rounded-md p-3 cursor-pointer \r\n border-l-4 ${getColorVariant(index)} transition-colors duration-200\r\n `}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"font-medium text-foreground text-sm\">{module.name}</span>\r\n {module.url && <ExternalLink className=\"h-4 w-4 text-muted-foreground\" />}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <Sidebar collapsible=\"icon\">\r\n <SidebarHeader className=\"p-0 gap-0\">\r\n {/* Modules Dropdown */}\r\n <DropdownMenu onOpenChange={setDropdownOpen}>\r\n <DropdownMenuTrigger asChild>\r\n <div className=\"bg-gradient-to-r from-primary to-primary hover:opacity-90 text-primary-foreground font-semibold text-sm flex items-center justify-center cursor-pointer transition-all duration-200 h-8 gap-2 shadow-lg rounded-b-2xl\">\r\n {state !== \"collapsed\" && config?.appName}\r\n <ChevronDown size={16} />\r\n </div>\r\n </DropdownMenuTrigger>\r\n \r\n <DropdownMenuContent className=\"w-80 bg-popover rounded-lg shadow-lg border border-border p-4 z-50\" align={state === \"collapsed\" ? \"center\" : \"start\"}>\r\n {renderModulesContent()}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n \r\n {/* Logo Section */}\r\n <div className=\"flex justify-center items-center h-20\">\r\n <img \r\n src={state === \"collapsed\" ? assets.smallLogo : assets.logo} \r\n alt=\"Logo\" \r\n className={state === \"collapsed\" ? \"h-8 w-8\" : \"h-14 max-w-full\"} \r\n />\r\n </div>\r\n </SidebarHeader>\r\n \r\n <SidebarContent>\r\n <SidebarGroup>\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {config?.navigation?.map((item) => (\r\n <SidebarMenuItem key={item.path}>\r\n <SidebarMenuButton asChild isActive={isActive(item.path)}>\r\n <Link to={item.path}>\r\n <item.icon />\r\n <span>{item.label}</span>\r\n </Link>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n ))}\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n </SidebarContent>\r\n </Sidebar>\r\n );\r\n}\r\n\r\nexport default AppSidebar;","// ============= SIMPLE ERROR BOUNDARY =============\r\n\r\nimport React, { Component, ReactNode } from 'react';\r\nimport { errorService } from '../services/ErrorService';\r\nimport { Card, CardContent, CardHeader, CardTitle } from './ui/card';\r\nimport { Button } from './ui/button';\r\nimport { AlertTriangle } from 'lucide-react';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n}\r\n\r\ninterface State {\r\n hasError: boolean;\r\n error?: Error;\r\n}\r\n\r\nexport class ErrorBoundary extends Component<Props, State> {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): State {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\r\n errorService.handleError(error, false);\r\n console.error('ErrorBoundary caught an error:', error, errorInfo);\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n if (this.props.fallback) {\r\n return this.props.fallback;\r\n }\r\n\r\n return (\r\n <div className=\"flex items-center justify-center min-h-screen p-4\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <div className=\"flex justify-center mb-4\">\r\n <AlertTriangle className=\"h-12 w-12 text-destructive\" />\r\n </div>\r\n <CardTitle>Algo deu errado</CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center space-y-4\">\r\n <p className=\"text-muted-foreground\">\r\n Ocorreu um erro inesperado. Tente recarregar a página.\r\n </p>\r\n <Button \r\n onClick={() => window.location.reload()}\r\n className=\"w-full\"\r\n >\r\n Recarregar Página\r\n </Button>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\nexport default ErrorBoundary;","import { useState, useEffect, useMemo, useRef } from 'react';\r\nimport { FormField } from '../../types';\r\n\r\nexport function useBaseForm<T extends Record<string, any>>(\r\n fields: FormField[],\r\n initialData?: Partial<T>,\r\n onFormDataChange?: (data: T) => void,\r\n open?: boolean\r\n) {\r\n const [formData, setFormData] = useState<T>({} as T);\r\n const [errors, setErrors] = useState<Record<string, string>>({});\r\n\r\n // Memoize the fields to avoid re-processing if they don't change\r\n const memoizedFields = useMemo(() => fields, [fields]);\r\n\r\n // Helper to check if a value is a valid Date\r\n const isValidDate = (value: any): value is Date => {\r\n return value instanceof Date && !isNaN(value.getTime());\r\n };\r\n\r\n // Get default value for field type\r\n const getDefaultFieldValue = (field: FormField): any => {\r\n if (field.defaultValue !== undefined) return field.defaultValue;\r\n \r\n switch (field.type) {\r\n case 'multiselect':\r\n return [];\r\n case 'checkbox':\r\n return false;\r\n case 'number':\r\n return 0;\r\n case 'date':\r\n return '';\r\n case 'group':\r\n return {};\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n // Calculate computed value if field has computedValue function\r\n const calculateComputedValue = (field: FormField, currentFormData: T): any => {\r\n if (field.computedValue && typeof field.computedValue === 'function') {\r\n try {\r\n return field.computedValue(currentFormData);\r\n } catch (error) {\r\n // Silent computation error handling\r\n return getDefaultFieldValue(field);\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n // Update dependent fields when a field changes\r\n const updateDependentFields = (changedFieldName: string, newFormData: T): T => {\r\n let updatedData = { ...newFormData };\r\n \r\n // Get all fields that depend on the changed field\r\n const getAllFields = (fieldList: FormField[]): FormField[] => {\r\n const allFields: FormField[] = [];\r\n \r\n fieldList.forEach(field => {\r\n allFields.push(field);\r\n if (field.fields) {\r\n allFields.push(...getAllFields(field.fields));\r\n }\r\n });\r\n \r\n return allFields;\r\n };\r\n\r\n const dependentFields = getAllFields(memoizedFields).filter(field => \r\n field.dependsOn === changedFieldName\r\n );\r\n \r\n dependentFields.forEach(field => {\r\n const computedValue = calculateComputedValue(field, updatedData);\r\n if (computedValue !== undefined) {\r\n updatedData = { ...updatedData, [field.name]: computedValue };\r\n }\r\n });\r\n \r\n return updatedData;\r\n };\r\n\r\n // Validate a single field\r\n const validateField = (field: FormField, value: any, currentFormData?: T): string | undefined => {\r\n // Check required validation\r\n if (field.required && (value === '' || value === null || value === undefined || \r\n (Array.isArray(value) && value.length === 0))) {\r\n return `${field.label} é obrigatório`;\r\n }\r\n\r\n // Check custom validation\r\n if (field.validation) {\r\n let validator: ((value: any, formData?: any) => string | undefined) | undefined;\r\n \r\n if (typeof field.validation === 'function') {\r\n validator = field.validation;\r\n } else if (field.validation.custom && typeof field.validation.custom === 'function') {\r\n validator = field.validation.custom;\r\n }\r\n\r\n if (validator) {\r\n try {\r\n const result = validator(value, currentFormData);\r\n if (result) return result;\r\n } catch (error) {\r\n // Silent validation error handling\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n // Initialize form data - simplified logic\r\n useEffect(() => {\r\n // Always initialize when open changes to true or when initialData/fields change\r\n if (!open) return;\r\n\r\n // Get all fields (including nested ones)\r\n const getAllFields = (fieldList: FormField[]): FormField[] => {\r\n const allFields: FormField[] = [];\r\n \r\n fieldList.forEach(field => {\r\n allFields.push(field);\r\n if (field.fields) {\r\n allFields.push(...getAllFields(field.fields));\r\n }\r\n });\r\n \r\n return allFields;\r\n };\r\n\r\n const allFields = getAllFields(memoizedFields);\r\n const newFormData: any = {};\r\n\r\n // Iterate each field\r\n allFields.forEach(field => {\r\n let fieldValue: any;\r\n\r\n // Check if we have initial data for this field\r\n if (initialData && initialData[field.name as keyof T] !== undefined) {\r\n fieldValue = initialData[field.name as keyof T];\r\n \r\n // Handle null/undefined text fields - convert to empty string\r\n if ((fieldValue === null || fieldValue === undefined)) {\r\n fieldValue = '';\r\n }\r\n \r\n // Handle date fields - convert to YYYY-MM-DD format for input[type=\"date\"]\r\n if (field.type === 'date' && fieldValue) {\r\n if (typeof fieldValue === 'string') {\r\n const date = new Date(fieldValue);\r\n if (isValidDate(date)) {\r\n fieldValue = date.toISOString().split('T')[0];\r\n }\r\n } else if (isValidDate(fieldValue)) {\r\n fieldValue = fieldValue.toISOString().split('T')[0];\r\n }\r\n }\r\n } else {\r\n // Use default value\r\n fieldValue = getDefaultFieldValue(field);\r\n }\r\n\r\n newFormData[field.name] = fieldValue;\r\n });\r\n\r\n // Calculate computed values after all fields are set\r\n allFields.forEach(field => {\r\n const computedValue = calculateComputedValue(field, newFormData);\r\n if (computedValue !== undefined) {\r\n newFormData[field.name] = computedValue;\r\n }\r\n });\r\n\r\n setFormData(newFormData as T);\r\n setErrors({});\r\n\r\n // Notify parent of form data change\r\n if (onFormDataChange) {\r\n onFormDataChange(newFormData as T);\r\n }\r\n }, [memoizedFields, initialData, onFormDataChange, open]);\r\n\r\n // Update a field value\r\n const updateField = (fieldName: string, value: any) => {\r\n setFormData(prevData => {\r\n const newData = { ...prevData, [fieldName]: value };\r\n \r\n // Update dependent fields\r\n const updatedData = updateDependentFields(fieldName, newData);\r\n \r\n // Notify parent of form data change\r\n if (onFormDataChange) {\r\n onFormDataChange(updatedData);\r\n }\r\n \r\n return updatedData;\r\n });\r\n\r\n // Clear error for this field if it exists\r\n if (errors[fieldName]) {\r\n setErrors(prevErrors => {\r\n const newErrors = { ...prevErrors };\r\n delete newErrors[fieldName];\r\n return newErrors;\r\n });\r\n }\r\n\r\n // Validate field in real-time\r\n const field = getAllFields(memoizedFields).find(f => f.name === fieldName);\r\n if (field) {\r\n const error = validateField(field, value, formData);\r\n if (error) {\r\n setErrors(prevErrors => ({ ...prevErrors, [fieldName]: error }));\r\n }\r\n }\r\n };\r\n\r\n // Helper to get all fields (including nested)\r\n const getAllFields = (fieldList: FormField[]): FormField[] => {\r\n const allFields: FormField[] = [];\r\n \r\n fieldList.forEach(field => {\r\n allFields.push(field);\r\n if (field.fields) {\r\n allFields.push(...getAllFields(field.fields));\r\n }\r\n });\r\n \r\n return allFields;\r\n };\r\n\r\n // Validate entire form\r\n const validateForm = (): boolean => {\r\n const allFields = getAllFields(memoizedFields);\r\n const newErrors: Record<string, string> = {};\r\n\r\n allFields.forEach(field => {\r\n const error = validateField(field, formData[field.name], formData);\r\n if (error) {\r\n newErrors[field.name] = error;\r\n }\r\n });\r\n\r\n setErrors(newErrors);\r\n return Object.keys(newErrors).length === 0;\r\n };\r\n\r\n // Create submit handler\r\n const handleSubmit = (onSubmit: (data: T) => void) => {\r\n return (e?: React.FormEvent) => {\r\n if (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n \r\n if (validateForm()) {\r\n onSubmit(formData);\r\n }\r\n };\r\n };\r\n\r\n return {\r\n formData,\r\n errors,\r\n updateField,\r\n validateForm,\r\n handleSubmit,\r\n };\r\n}","import { TokenManager } from '../../auth/services/TokenManager';\r\nimport { QualiexUser } from '../../types';\r\nimport { errorService } from '../../services/ErrorService';\r\n\r\ninterface QualiexApiResponse {\r\n success: boolean;\r\n data?: any[];\r\n error?: string;\r\n message?: string;\r\n}\r\n\r\nclass QualiexApiService {\r\n private baseUrl = import.meta.env.VITE_QUALIEX_API_URL;\r\n\r\n /**\r\n * Faz uma chamada para a API do Qualiex\r\n * IMPORTANTE: O header 'un-alias' é OBRIGATÓRIO para todas as requisições da API common-v4\r\n * Sem este header, a API retorna erro 401 \"ID not found\"\r\n */\r\n private async makeApiCall(endpoint: string, params: Record<string, string>, alias: string): Promise<any> {\r\n const token = TokenManager.getAccessToken();\r\n \r\n if (!token) {\r\n throw new Error('Token Qualiex não encontrado');\r\n }\r\n\r\n // Validação obrigatória: alias não pode ser vazio\r\n if (!alias || alias.trim() === '') {\r\n throw new Error('Alias da unidade é obrigatório para chamadas à API do Qualiex');\r\n }\r\n\r\n const url = new URL(endpoint, this.baseUrl);\r\n Object.entries(params).forEach(([key, value]) => {\r\n url.searchParams.append(key, value);\r\n });\r\n\r\n const response = await fetch(url.toString(), {\r\n method: 'GET',\r\n headers: {\r\n 'Authorization': `Bearer ${token}`,\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n // CRÍTICO: Header 'un-alias' é obrigatório para a API common-v4 do Qualiex\r\n // Sem este header, todas as requisições falham com 401 \"ID not found\"\r\n 'un-alias': alias,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`API call failed: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n \r\n return data;\r\n }\r\n\r\n private mapToQualiexUser(userData: any): QualiexUser {\r\n // Mapear os dados retornados pela API para o formato esperado (userId, userName, userEmail)\r\n return {\r\n userId: userData.userId || String(userData.ID),\r\n userName: userData.userName || 'Nome não disponível',\r\n userEmail: userData.userEmail || 'Email não disponível',\r\n };\r\n }\r\n\r\n async fetchUsers(alias: string, companyId: string): Promise<QualiexUser[]> {\r\n try {\r\n // Fazer chamada para API real do Qualiex\r\n // Endpoint correto: /api/common/v1/companiesusers\r\n // IMPORTANTE: Passando o alias como terceiro parâmetro para incluir o header 'un-alias'\r\n const response = await this.makeApiCall('/api/common/v1/companiesusers', {\r\n companyId,\r\n search: '', // Busca vazia por padrão\r\n filterStatus: 'active', // Apenas usuários ativos\r\n }, alias);\r\n\r\n // A API common-v4 pode retornar dados diretamente ou em uma propriedade específica\r\n let userData = response;\r\n if (response.data) {\r\n userData = response.data;\r\n } else if (Array.isArray(response)) {\r\n userData = response;\r\n } else {\r\n errorService.handleError('[QualiexApi] Unexpected response format', false);\r\n return [];\r\n }\r\n\r\n if (!Array.isArray(userData)) {\r\n errorService.handleError('[QualiexApi] Response is not an array', false);\r\n return [];\r\n }\r\n\r\n // Mapear os dados para o formato esperado\r\n const users: QualiexUser[] = userData.map(this.mapToQualiexUser);\r\n\r\n return users;\r\n\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : '[QualiexApi] Error fetching users');\r\n return [];\r\n }\r\n }\r\n\r\n // Método para buscar um usuário específico por ID\r\n async fetchUserById(userId: string, alias: string, companyId: string): Promise<QualiexUser | null> {\r\n try {\r\n const users = await this.fetchUsers(alias, companyId);\r\n return users.find(user => user.userId === userId) || null;\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : '[QualiexApi] Error fetching user by ID');\r\n return null;\r\n }\r\n }\r\n\r\n\r\n // Método público para buscar usuários - usado pelo hook useQualiexUsers\r\n async getUsers(alias: string): Promise<QualiexUser[]> {\r\n // Extrair companyId do token Supabase\r\n const tokenData = TokenManager.extractTokenData();\r\n \r\n if (!tokenData || !tokenData.companyId) {\r\n errorService.handleError('[QualiexApi] CompanyId não encontrado no token Supabase', false);\r\n return [];\r\n }\r\n \r\n return this.fetchUsers(alias, tokenData.companyId);\r\n }\r\n}\r\n\r\nexport const qualiexApi = new QualiexApiService();","import { useQuery } from '@tanstack/react-query';\r\nimport { QualiexUser } from '../../types';\r\nimport { qualiexApi } from '../services/qualiexApi';\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\nimport { errorService } from '../../services/ErrorService';\r\n\r\ninterface UseQualiexUsersOptions {\r\n enabled?: boolean;\r\n}\r\n\r\nexport const useQualiexUsers = (options: UseQualiexUsersOptions = {}) => {\r\n const { user, alias: companyAlias } = useAuth();\r\n const { enabled = true } = options;\r\n\r\n return useQuery<QualiexUser[]>({\r\n queryKey: ['qualiex-users', companyAlias],\r\n queryFn: () => qualiexApi.getUsers(companyAlias!),\r\n enabled: enabled && !!companyAlias && !!user,\r\n retry: 2,\r\n retryDelay: 1000,\r\n });\r\n};","import React from 'react';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\nimport { Skeleton } from '../../components/ui/skeleton';\r\nimport { useQualiexUsers } from '../hooks/useQualiexUsers';\r\nimport { AlertCircle } from 'lucide-react';\r\nimport { cn } from '../../utils';\r\n\r\ninterface QualiexUserFieldProps {\r\n value?: string;\r\n onChange?: (value: string) => void;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const QualiexUserField: React.FC<QualiexUserFieldProps> = ({\r\n value = '',\r\n onChange,\r\n placeholder = 'Selecionar usuário',\r\n disabled,\r\n className\r\n}) => {\r\n const { data: users = [], isLoading, error } = useQualiexUsers();\r\n\r\n if (isLoading) {\r\n return <Skeleton className={cn(\"h-10 w-full\", className)} />;\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className={`flex items-center gap-2 p-2 border border-destructive/20 rounded-md ${className}`}>\r\n <AlertCircle className=\"h-4 w-4 text-destructive\" />\r\n <span className=\"text-sm text-destructive\">Erro ao carregar usuários</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Select\r\n value={value}\r\n onValueChange={onChange}\r\n disabled={disabled || users.length === 0}\r\n >\r\n <SelectTrigger className={className}>\r\n <SelectValue placeholder={placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {users.length === 0 ? (\r\n <SelectItem value=\"no-users\" disabled>\r\n Nenhum usuário encontrado\r\n </SelectItem>\r\n ) : (\r\n users.map((user) => (\r\n <SelectItem key={user.userId} value={user.userId}>\r\n {user.userName}\r\n </SelectItem>\r\n ))\r\n )}\r\n </SelectContent>\r\n </Select>\r\n );\r\n};","import React from 'react';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\n\r\ninterface QualiexResponsibleSelectFieldProps {\r\n value?: string;\r\n onChange?: (value: string) => void;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const QualiexResponsibleSelectField: React.FC<QualiexResponsibleSelectFieldProps> = ({\r\n value,\r\n onChange,\r\n placeholder = 'Selecionar responsável',\r\n disabled,\r\n className\r\n}) => {\r\n return (\r\n <Select value={value} onValueChange={onChange} disabled={disabled}>\r\n <SelectTrigger className={className}>\r\n <SelectValue placeholder={placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"placeholder\">Responsável placeholder</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n );\r\n};","import React, { useState, useMemo, useCallback } from 'react';\r\nimport { Dialog, DialogContent, DialogTitle, DialogDescription, DialogHeader } from '../../components/ui/dialog';\r\n// VisuallyHidden removed - using inline implementation\r\nimport type { BaseFormProps, FormField, FormSection } from '../../types';\r\nimport { useBaseForm } from '../hooks/useBaseForm';\r\nimport { cn } from '../../utils';\r\nimport { Button } from '../../components/ui/button';\r\nimport { Input } from '../../components/ui/input';\r\nimport { Textarea } from '../../components/ui/textarea';\r\nimport { Label } from '../../components/ui/label';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\nimport { ColorPicker } from '../../components/ui/color-picker';\r\nimport { IconPicker } from '../../components/ui/icon-picker';\r\n\r\nimport { QualiexUserField } from '../../qualiex/components/QualiexUserField';\r\nimport { QualiexResponsibleSelectField } from '../../qualiex/components/QualiexResponsibleSelectField';\r\nfunction BaseForm<T extends Record<string, any>>({\r\n title,\r\n sections,\r\n initialData,\r\n onSubmit,\r\n onCancel,\r\n open,\r\n submitButtonText = 'Salvar',\r\n isLoading = false,\r\n usersData\r\n}: BaseFormProps<T> & {\r\n usersData?: any[];\r\n isLoading?: boolean;\r\n}) {\r\n const [activeSection, setActiveSection] = useState(sections?.[0]?.id || '');\r\n\r\n // Stabilize allFields reference using useMemo to prevent infinite re-renders\r\n // Now handles grouped fields by expanding them\r\n const allFields = useMemo(() => {\r\n if (!sections || !Array.isArray(sections)) return [];\r\n return sections.flatMap(section => section.fields.flatMap(field => field.type === 'group' ? field.fields || [] : field));\r\n }, [sections]);\r\n const {\r\n formData,\r\n errors,\r\n updateField,\r\n handleSubmit\r\n } = useBaseForm<T>(allFields, initialData, undefined, open);\r\n\r\n // Evaluate section conditions and filter available sections\r\n const availableSections = useMemo(() => {\r\n if (!sections || !Array.isArray(sections)) return [];\r\n return sections.map(section => ({\r\n ...section,\r\n disabled: section.condition ? !section.condition(formData) : section.disabled || false\r\n }));\r\n }, [sections, formData]);\r\n\r\n // Ensure active section is available, if not switch to first available\r\n const validActiveSection = useMemo(() => {\r\n const currentSection = availableSections.find(s => s.id === activeSection);\r\n if (currentSection && !currentSection.disabled) {\r\n return activeSection;\r\n }\r\n const firstAvailable = availableSections.find(s => !s.disabled);\r\n return firstAvailable?.id || activeSection;\r\n }, [availableSections, activeSection]);\r\n\r\n // Update active section if it's not valid\r\n React.useEffect(() => {\r\n if (validActiveSection !== activeSection) {\r\n setActiveSection(validActiveSection);\r\n }\r\n }, [validActiveSection, activeSection]);\r\n const currentSection = availableSections.find(s => s.id === validActiveSection);\r\n const renderField = (field: any) => {\r\n // For computed fields, use the computed value, otherwise use form data\r\n // Fix: Use proper null/undefined checks instead of || to preserve 0 values\r\n // For computed fields, use the computed value, otherwise use form data\r\n // Fix: Use proper null/undefined checks instead of || to preserve 0 values\r\n const rawValue = field.computedValue ? formData[field.name as keyof T] : formData[field.name as keyof T];\r\n const value = rawValue !== undefined ? rawValue : '';\r\n const error = errors[field.name];\r\n switch (field.type) {\r\n case 'group':\r\n return <div key={field.name} className=\"space-y-2\">\r\n {field.label}\r\n <div className={field.className || (field.layout === 'horizontal' ? 'flex gap-3' : 'space-y-3')}>\r\n {field.fields?.map((subField: any) => renderField(subField))}\r\n </div>\r\n </div>;\r\n case 'user-select':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <QualiexUserField\r\n value={value || ''} \r\n onChange={newValue => updateField(field.name, newValue)} \r\n placeholder={field.placeholder} \r\n disabled={field.disabled} \r\n className={error ? 'border-red-500' : ''} \r\n />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'textarea':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Textarea id={field.name} value={value || ''} onChange={e => {\r\n updateField(field.name, e.target.value);\r\n }} placeholder={field.placeholder} disabled={field.disabled} className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'select':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Select value={String(value)} onValueChange={newValue => {\r\n updateField(field.name, newValue);\r\n // Execute custom onValueChange if provided\r\n if (field.onValueChange) {\r\n field.onValueChange(newValue);\r\n }\r\n }} disabled={field.disabled}>\r\n <SelectTrigger className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`}>\r\n <SelectValue placeholder={field.placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {field.options?.map(option => <SelectItem key={option.value} value={option.value}>\r\n {option.label}\r\n </SelectItem>)}\r\n </SelectContent>\r\n </Select>\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'date':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Input id={field.name} type=\"date\" value={String(value)} onChange={e => updateField(field.name, e.target.value)} placeholder={field.placeholder} disabled={field.disabled} className={cn(\"w-full\", error ? 'border-red-500' : '', field.disabled ? 'bg-gray-100 cursor-not-allowed' : '')} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'single-responsible-select':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <QualiexResponsibleSelectField \r\n value={String(value)} \r\n onChange={selectedResponsible => updateField(field.name, selectedResponsible)} \r\n placeholder={field.placeholder}\r\n disabled={field.disabled} \r\n className={error ? 'border-red-500' : ''} \r\n />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'simple-qualiex-user-field':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <QualiexUserField \r\n value={value ?? ''}\r\n onChange={newValue => updateField(field.name, newValue)}\r\n placeholder={field.placeholder} \r\n disabled={field.disabled} \r\n className={error ? 'border-red-500' : ''} \r\n />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n case 'color':\r\n return (\r\n <div key={field.name}>\r\n <Label htmlFor={field.name}>{field.label} {field.required && <span className=\"text-destructive\">*</span>}</Label>\r\n <Input\r\n id={field.name}\r\n type=\"color\"\r\n value={value || field.defaultValue || '#000000'}\r\n onChange={(e) => updateField(field.name, e.target.value)}\r\n className=\"h-10\"\r\n />\r\n {error && (\r\n <p className=\"text-sm text-destructive mt-1\">{error}</p>\r\n )}\r\n </div>\r\n );\r\n\r\n case 'color-picker':\r\n return (\r\n <div key={field.name}>\r\n <ColorPicker\r\n label={`${field.label} ${field.required ? '*' : ''}`}\r\n value={value || field.defaultValue || '#3b82f6'}\r\n onChange={(color) => updateField(field.name, color)}\r\n />\r\n {error && (\r\n <p className=\"text-sm text-destructive mt-1\">{error}</p>\r\n )}\r\n </div>\r\n );\r\n\r\n case 'icon-picker':\r\n return (\r\n <div key={field.name}>\r\n <IconPicker\r\n label={`${field.label} ${field.required ? '*' : ''}`}\r\n value={value || field.defaultValue || 'Star'}\r\n onChange={(iconName) => updateField(field.name, iconName)}\r\n />\r\n {error && (\r\n <p className=\"text-sm text-destructive mt-1\">{error}</p>\r\n )}\r\n </div>\r\n );\r\n\r\n case 'number':\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Input id={field.name} type=\"number\" value={value !== null && value !== undefined ? String(value) : ''} onChange={e => {\r\n const inputValue = e.target.value;\r\n const newValue = inputValue === '' ? null : Number(inputValue);\r\n updateField(field.name, newValue);\r\n }} placeholder={field.placeholder} disabled={field.disabled} className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`} min={field.min} step={field.step || '1'} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n default:\r\n // text\r\n return <div key={field.name} className={`space-y-2 ${field.className || ''}`}>\r\n <Label htmlFor={field.name}>{field.label}</Label>\r\n <Input id={field.name} type=\"text\" value={value || ''} onChange={e => {\r\n updateField(field.name, e.target.value);\r\n }} placeholder={field.placeholder} disabled={field.disabled} className={`${error ? 'border-red-500' : ''} ${field.disabled ? 'bg-gray-100 cursor-not-allowed' : ''}`} readOnly={field.disabled} />\r\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\r\n </div>;\r\n }\r\n };\r\n const renderSectionContent = useCallback(() => {\r\n if (!currentSection) return null;\r\n\r\n // Show disabled message if section is disabled\r\n if (currentSection.disabled) {\r\n return <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <div className=\"rounded-full bg-muted p-3 mb-4\">\r\n <svg className=\"h-6 w-6 text-muted-foreground\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m0 0v2m0-2h2m-2 0H9m3-8V9m0-4V3\" />\r\n </svg>\r\n </div>\r\n <h3 className=\"text-lg font-semibold mb-2\">Seção não disponível</h3>\r\n <p className=\"text-muted-foreground max-w-sm\">\r\n Complete as informações obrigatórias na seção \"Informações Gerais\" para acessar esta seção.\r\n </p>\r\n </div>;\r\n }\r\n\r\n // If section has a custom component, render it\r\n if (currentSection.component) {\r\n const SectionComponent = currentSection.component;\r\n return <SectionComponent formData={formData} updateField={updateField} errors={errors} users={usersData} disabled={currentSection.disabled} />;\r\n }\r\n\r\n // Default field rendering\r\n return <div className=\"space-y-3\">\r\n {currentSection.fields.map(renderField)}\r\n </div>;\r\n }, [currentSection, formData, updateField, errors, usersData, renderField]);\r\n const handleSectionChange = (sectionId: string) => {\r\n const section = availableSections.find(s => s.id === sectionId);\r\n if (section && !section.disabled) {\r\n setActiveSection(sectionId);\r\n }\r\n };\r\n const formContent =\r\n // Default layout without sidebar - compact modal version\r\n <div className=\"flex flex-col max-h-[80vh]\">\r\n {/* Section navigation for multi-section forms */}\r\n {availableSections.length > 1 && <div className=\"flex-shrink-0 p-4 border-b\">\r\n <div className=\"flex space-x-2\">\r\n {availableSections.map(section => \r\n <Button\r\n key={section.id}\r\n variant={validActiveSection === section.id ? \"action-primary\" : \"action-secondary\"}\r\n size=\"sm\"\r\n onClick={() => handleSectionChange(section.id)}\r\n disabled={section.disabled}\r\n className={section.disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}\r\n >\r\n {section.title}\r\n </Button>\r\n )}\r\n </div>\r\n </div>}\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto px-2 md:px-4 pt-0 pb-2 md:pb-4\">\r\n {isLoading ? <div className=\"flex items-center justify-center py-12\">\r\n <div className=\"text-muted-foreground\">Carregando dados...</div>\r\n </div> : <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-3 md:space-y-4\">\r\n {renderSectionContent()}\r\n \r\n {/* Submit buttons */}\r\n <div className=\"flex justify-end space-x-2 pt-4\">\r\n <Button type=\"button\" variant=\"outline\" onClick={onCancel}>\r\n Cancelar\r\n </Button>\r\n <Button type=\"submit\" disabled={isLoading}>\r\n {submitButtonText}\r\n </Button>\r\n </div>\r\n </form>}\r\n </div>\r\n </div>;\r\nreturn <Dialog open={open} onOpenChange={openState => {\r\n // Só fecha se explicitamente mudou para false\r\n if (openState === false && open === true) {\r\n onCancel();\r\n }\r\n}}>\r\n <DialogContent className=\"max-w-4xl max-h-[90vh] overflow-hidden\">\r\n <DialogHeader className=\"bg-primary text-primary-foreground px-6 py-4 -mx-6 -mt-6 mb-4\">\r\n <DialogTitle className=\"text-white\">{title}</DialogTitle>\r\n <DialogDescription className=\"sr-only\">\r\n Formulário para preenchimento de dados\r\n </DialogDescription>\r\n </DialogHeader>\r\n {formContent}\r\n </DialogContent>\r\n </Dialog>;\r\n}\r\nexport default BaseForm;","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","/* eslint-disable no-unused-vars */\n\n/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"menos de um segundo\",\n other: \"menos de {{count}} segundos\",\n },\n\n xSeconds: {\n one: \"1 segundo\",\n other: \"{{count}} segundos\",\n },\n\n halfAMinute: \"meio minuto\",\n\n lessThanXMinutes: {\n one: \"menos de um minuto\",\n other: \"menos de {{count}} minutos\",\n },\n\n xMinutes: {\n one: \"1 minuto\",\n other: \"{{count}} minutos\",\n },\n\n aboutXHours: {\n one: \"cerca de 1 hora\",\n other: \"cerca de {{count}} horas\",\n },\n\n xHours: {\n one: \"1 hora\",\n other: \"{{count}} horas\",\n },\n\n xDays: {\n one: \"1 dia\",\n other: \"{{count}} dias\",\n },\n\n aboutXWeeks: {\n one: \"cerca de 1 semana\",\n other: \"cerca de {{count}} semanas\",\n },\n\n xWeeks: {\n one: \"1 semana\",\n other: \"{{count}} semanas\",\n },\n\n aboutXMonths: {\n one: \"cerca de 1 mês\",\n other: \"cerca de {{count}} meses\",\n },\n\n xMonths: {\n one: \"1 mês\",\n other: \"{{count}} meses\",\n },\n\n aboutXYears: {\n one: \"cerca de 1 ano\",\n other: \"cerca de {{count}} anos\",\n },\n\n xYears: {\n one: \"1 ano\",\n other: \"{{count}} anos\",\n },\n\n overXYears: {\n one: \"mais de 1 ano\",\n other: \"mais de {{count}} anos\",\n },\n\n almostXYears: {\n one: \"quase 1 ano\",\n other: \"quase {{count}} anos\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"em \" + result;\n } else {\n return \"há \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE, d 'de' MMMM 'de' y\",\n long: \"d 'de' MMMM 'de' y\",\n medium: \"d MMM y\",\n short: \"dd/MM/yyyy\",\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'às' {{time}}\",\n long: \"{{date}} 'às' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: (date) => {\n const weekday = date.getDay();\n const last = weekday === 0 || weekday === 6 ? \"último\" : \"última\";\n return \"'\" + last + \"' eeee 'às' p\";\n },\n yesterday: \"'ontem às' p\",\n today: \"'hoje às' p\",\n tomorrow: \"'amanhã às' p\",\n nextWeek: \"eeee 'às' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, date, _baseDate, _options) => {\n const format = formatRelativeLocale[token];\n\n if (typeof format === \"function\") {\n return format(date);\n }\n\n return format;\n};\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { formatDistance } from \"./pt-BR/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./pt-BR/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./pt-BR/_lib/formatRelative.mjs\";\nimport { localize } from \"./pt-BR/_lib/localize.mjs\";\nimport { match } from \"./pt-BR/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary Portuguese locale (Brazil).\n * @language Portuguese\n * @iso-639-2 por\n * @author Lucas Duailibe [@duailibe](https://github.com/duailibe)\n * @author Yago Carballo [@yagocarballo](https://github.com/YagoCarballo)\n */\nexport const ptBR = {\n code: \"pt-BR\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default ptBR;\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"AC\", \"DC\"],\n abbreviated: [\"AC\", \"DC\"],\n wide: [\"antes de cristo\", \"depois de cristo\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"T1\", \"T2\", \"T3\", \"T4\"],\n wide: [\"1º trimestre\", \"2º trimestre\", \"3º trimestre\", \"4º trimestre\"],\n};\n\nconst monthValues = {\n narrow: [\"j\", \"f\", \"m\", \"a\", \"m\", \"j\", \"j\", \"a\", \"s\", \"o\", \"n\", \"d\"],\n abbreviated: [\n \"jan\",\n \"fev\",\n \"mar\",\n \"abr\",\n \"mai\",\n \"jun\",\n \"jul\",\n \"ago\",\n \"set\",\n \"out\",\n \"nov\",\n \"dez\",\n ],\n\n wide: [\n \"janeiro\",\n \"fevereiro\",\n \"março\",\n \"abril\",\n \"maio\",\n \"junho\",\n \"julho\",\n \"agosto\",\n \"setembro\",\n \"outubro\",\n \"novembro\",\n \"dezembro\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n short: [\"dom\", \"seg\", \"ter\", \"qua\", \"qui\", \"sex\", \"sab\"],\n abbreviated: [\n \"domingo\",\n \"segunda\",\n \"terça\",\n \"quarta\",\n \"quinta\",\n \"sexta\",\n \"sábado\",\n ],\n\n wide: [\n \"domingo\",\n \"segunda-feira\",\n \"terça-feira\",\n \"quarta-feira\",\n \"quinta-feira\",\n \"sexta-feira\",\n \"sábado\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mn\",\n noon: \"md\",\n morning: \"manhã\",\n afternoon: \"tarde\",\n evening: \"tarde\",\n night: \"noite\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"manhã\",\n afternoon: \"tarde\",\n evening: \"tarde\",\n night: \"noite\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"manhã\",\n afternoon: \"tarde\",\n evening: \"tarde\",\n night: \"noite\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mn\",\n noon: \"md\",\n morning: \"da manhã\",\n afternoon: \"da tarde\",\n evening: \"da tarde\",\n night: \"da noite\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"da manhã\",\n afternoon: \"da tarde\",\n evening: \"da tarde\",\n night: \"da noite\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"meia-noite\",\n noon: \"meio-dia\",\n morning: \"da manhã\",\n afternoon: \"da tarde\",\n evening: \"da tarde\",\n night: \"da noite\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n\n if (options?.unit === \"week\") {\n return number + \"ª\";\n }\n return number + \"º\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)[ºªo]?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(ac|dc|a|d)/i,\n abbreviated: /^(a\\.?\\s?c\\.?|d\\.?\\s?c\\.?)/i,\n wide: /^(antes de cristo|depois de cristo)/i,\n};\nconst parseEraPatterns = {\n any: [/^ac/i, /^dc/i],\n wide: [/^antes de cristo/i, /^depois de cristo/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^T[1234]/i,\n wide: /^[1234](º)? trimestre/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmajsond]/i,\n abbreviated: /^(jan|fev|mar|abr|mai|jun|jul|ago|set|out|nov|dez)/i,\n wide: /^(janeiro|fevereiro|março|abril|maio|junho|julho|agosto|setembro|outubro|novembro|dezembro)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^fev/i,\n /^mar/i,\n /^abr/i,\n /^mai/i,\n /^jun/i,\n /^jul/i,\n /^ago/i,\n /^set/i,\n /^out/i,\n /^nov/i,\n /^dez/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^(dom|[23456]ª?|s[aá]b)/i,\n short: /^(dom|[23456]ª?|s[aá]b)/i,\n abbreviated: /^(dom|seg|ter|qua|qui|sex|s[aá]b)/i,\n wide: /^(domingo|(segunda|ter[cç]a|quarta|quinta|sexta)([- ]feira)?|s[aá]bado)/i,\n};\nconst parseDayPatterns = {\n short: [/^d/i, /^2/i, /^3/i, /^4/i, /^5/i, /^6/i, /^s[aá]/i],\n narrow: [/^d/i, /^2/i, /^3/i, /^4/i, /^5/i, /^6/i, /^s[aá]/i],\n any: [/^d/i, /^seg/i, /^t/i, /^qua/i, /^qui/i, /^sex/i, /^s[aá]b/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mn|md|(da) (manhã|tarde|noite))/i,\n any: /^([ap]\\.?\\s?m\\.?|meia[-\\s]noite|meio[-\\s]dia|(da) (manhã|tarde|noite))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mn|^meia[-\\s]noite/i,\n noon: /^md|^meio[-\\s]dia/i,\n morning: /manhã/i,\n afternoon: /tarde/i,\n evening: /tarde/i,\n night: /noite/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import React from 'react';\r\nimport { Edit, Trash2, PowerOff, Power } from \"lucide-react\";\r\nimport { DropdownMenuItem } from \"../../components/ui/dropdown-menu\";\r\nimport { Button } from \"../../components/ui/button\";\r\n\r\ninterface ActionMenuItemsProps {\r\n onEdit?: () => void;\r\n onDelete?: () => void;\r\n onToggleStatus?: () => void;\r\n isActive?: boolean;\r\n canDelete?: boolean;\r\n renderAs: 'dropdown' | 'context';\r\n}\r\n\r\nexport const ActionMenuItems: React.FC<ActionMenuItemsProps> = ({\r\n onEdit,\r\n onDelete,\r\n onToggleStatus,\r\n isActive = true,\r\n canDelete = true,\r\n renderAs\r\n}) => {\r\n const items = [];\r\n\r\n // Edit action\r\n if (onEdit) {\r\n const editItem = {\r\n icon: Edit,\r\n label: \"Editar\",\r\n onClick: onEdit\r\n };\r\n items.push(editItem);\r\n }\r\n\r\n // Toggle status action\r\n if (onToggleStatus) {\r\n const toggleItem = {\r\n icon: isActive ? PowerOff : Power,\r\n label: isActive ? \"Inativar\" : \"Ativar\",\r\n onClick: onToggleStatus\r\n };\r\n items.push(toggleItem);\r\n }\r\n\r\n // Delete action\r\n if (canDelete && onDelete) {\r\n const deleteItem = {\r\n icon: Trash2,\r\n label: \"Remover\",\r\n onClick: onDelete,\r\n destructive: true\r\n };\r\n items.push(deleteItem);\r\n }\r\n\r\n if (renderAs === 'dropdown') {\r\n return (\r\n <>\r\n {items.map((item, index) => (\r\n <DropdownMenuItem \r\n key={index}\r\n onClick={item.onClick}\r\n className={item.destructive ? \"text-destructive\" : \"\"}\r\n >\r\n <item.icon className=\"mr-2 h-4 w-4\" />\r\n {item.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </>\r\n );\r\n }\r\n\r\n // Context menu rendering\r\n return (\r\n <>\r\n {items.map((item, index) => (\r\n <Button\r\n key={index}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={item.onClick}\r\n className={`w-full justify-start h-auto py-2 px-3 text-sm font-normal ${\r\n item.destructive ? 'text-destructive hover:text-destructive' : ''\r\n }`}\r\n >\r\n <item.icon className=\"h-4 w-4 mr-2\" />\r\n {item.label}\r\n </Button>\r\n ))}\r\n </>\r\n );\r\n};","import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from \"../../components/ui/dropdown-menu\";\r\nimport { Button } from \"../../components/ui/button\";\r\nimport { EllipsisVertical } from \"lucide-react\";\r\nimport { ActionMenuItems } from \"./ActionMenuItems\";\r\n\r\ninterface TableRowActionsProps {\r\n onEdit?: () => void;\r\n onDelete?: () => void;\r\n canDelete?: boolean;\r\n onToggleStatus?: () => void;\r\n isActive?: boolean;\r\n}\r\n\r\nexport const TableRowActions: React.FC<TableRowActionsProps> = ({\r\n onEdit,\r\n onDelete,\r\n canDelete = true,\r\n onToggleStatus,\r\n isActive = true\r\n}) => {\r\n const handleEdit = (e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n onEdit?.();\r\n };\r\n\r\n const handleDelete = (e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n onDelete?.();\r\n };\r\n\r\n const handleToggleStatus = (e?: React.MouseEvent) => {\r\n e?.stopPropagation();\r\n onToggleStatus?.();\r\n };\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"default\" size=\"sm\" className=\"h-7 px-2 text-xs bg-primary text-primary-foreground hover:bg-primary/90\">\r\n <EllipsisVertical size={12} />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <ActionMenuItems\r\n onEdit={handleEdit}\r\n onDelete={handleDelete}\r\n onToggleStatus={handleToggleStatus}\r\n isActive={isActive}\r\n canDelete={canDelete}\r\n renderAs=\"dropdown\"\r\n />\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n};","import React, { useState, useEffect } from 'react';\r\nimport { Card, CardContent } from \"../../components/ui/card\";\r\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../../components/ui/table';\r\nimport { TableSkeleton, CardSkeleton } from \"../../components/ui/skeleton-variants\";\r\nimport { EmptyState } from \"../../components/ui/empty-state\";\r\nimport { ArrowUpDown, ArrowUp, ArrowDown } from \"lucide-react\";\r\nimport type { CrudColumn, CrudManager, BaseEntity } from '../../types';\r\nimport { TableRowActions } from './TableRowActions';\r\nimport { ActionMenuItems } from './ActionMenuItems';\r\n\r\ninterface CrudTableProps<T extends BaseEntity> {\r\n manager: CrudManager<T>;\r\n columns: CrudColumn<T>[];\r\n onEdit?: (item: T) => void;\r\n onView?: (item: T) => void;\r\n onToggleStatus?: (item: T) => void;\r\n onDelete?: (item: T) => void;\r\n renderActions?: (item: T) => React.ReactNode;\r\n}\r\n\r\nexport const CrudTable = <T extends BaseEntity>({\r\n manager,\r\n columns,\r\n onEdit,\r\n onView,\r\n onToggleStatus,\r\n onDelete,\r\n renderActions,\r\n}: CrudTableProps<T>) => {\r\n const [isMobile, setIsMobile] = useState(false);\r\n const [contextMenu, setContextMenu] = useState<{\r\n x: number;\r\n y: number;\r\n item: T;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setIsMobile(window.innerWidth < 768);\r\n checkMobile();\r\n window.addEventListener('resize', checkMobile);\r\n return () => window.removeEventListener('resize', checkMobile);\r\n }, []);\r\n\r\n // Close context menu when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = () => setContextMenu(null);\r\n if (contextMenu) {\r\n document.addEventListener('click', handleClickOutside);\r\n return () => document.removeEventListener('click', handleClickOutside);\r\n }\r\n }, [contextMenu]);\r\n\r\n const getSortIcon = (columnKey: string) => {\r\n if (manager.sortField !== columnKey) {\r\n return <ArrowUpDown size={14} className=\"ml-1 opacity-50\" />;\r\n }\r\n return manager.sortDirection === 'asc' ? <ArrowUp size={14} className=\"ml-1\" /> : <ArrowDown size={14} className=\"ml-1\" />;\r\n };\r\n\r\n // Calculate column widths based on minWidth, weight, and width\r\n const calculateColumnWidths = () => {\r\n const actionColumnWidth = 100; // Fixed width for actions column\r\n const totalColumns = columns.length + 1; // +1 for actions column\r\n \r\n // Calculate total minWidth and total weight\r\n let totalMinWidth = 0;\r\n let totalWeight = 0;\r\n const columnConfigs = columns.map(column => {\r\n if (column.width) {\r\n // Fixed width column\r\n totalMinWidth += column.width;\r\n return { ...column, calculatedWidth: column.width, isFixed: true };\r\n } else {\r\n const minWidth = column.minWidth || 120; // Default minimum\r\n const weight = column.weight || 1; // Default weight\r\n totalMinWidth += minWidth;\r\n totalWeight += weight;\r\n return { ...column, calculatedWidth: minWidth, weight, isFixed: false };\r\n }\r\n });\r\n \r\n totalMinWidth += actionColumnWidth; // Add actions column to total\r\n \r\n // Return column configs with calculated styles\r\n return columnConfigs.map(config => {\r\n if (config.isFixed) {\r\n return { \r\n ...config, \r\n style: { width: `${config.calculatedWidth}px` } \r\n };\r\n } else {\r\n // For flexible columns, use minWidth and flex-grow\r\n return { \r\n ...config, \r\n style: { \r\n minWidth: `${config.calculatedWidth}px`,\r\n width: `${config.calculatedWidth}px` // Fallback for table-layout: fixed\r\n } \r\n };\r\n }\r\n });\r\n };\r\n\r\n const columnWidths = calculateColumnWidths();\r\n\r\n if (isMobile) {\r\n if (manager.isLoading) {\r\n return <CardSkeleton count={3} />\r\n }\r\n \r\n if (manager.entities.length === 0) {\r\n return (\r\n <EmptyState\r\n title=\"Nenhum item encontrado\"\r\n description=\"Não há dados para exibir no momento.\"\r\n variant=\"search\"\r\n />\r\n )\r\n }\r\n \r\n return (\r\n <div className=\"space-y-4\">\r\n {manager.entities.map(item => <Card \r\n key={item.id} \r\n className=\"overflow-hidden cursor-pointer hover:bg-muted/50\" \r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEdit?.(item);\r\n }}\r\n onContextMenu={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setContextMenu({\r\n x: e.clientX,\r\n y: e.clientY,\r\n item\r\n });\r\n }}\r\n >\r\n <CardContent className=\"p-4\">\r\n {columns.map(column => <div key={column.key} className=\"flex justify-between items-start mb-2 last:mb-0\">\r\n <span className=\"text-sm font-medium text-muted-foreground min-w-0 mr-2\">\r\n {column.header}:\r\n </span>\r\n <div className=\"text-sm text-foreground text-right min-w-0 flex-1\">\r\n {column.render ? column.render(item) : (item as any)[column.key]}\r\n </div>\r\n </div>)}\r\n\r\n {(onEdit || onView || renderActions) && <div className=\"mt-3 pt-3 border-t flex justify-end\" onClick={(e) => e.stopPropagation()}>\r\n {renderActions ? renderActions(item) : (\r\n <TableRowActions \r\n onEdit={onEdit ? () => {\r\n onEdit(item);\r\n } : undefined} \r\n onDelete={onDelete ? () => onDelete(item) : undefined} \r\n onToggleStatus={onToggleStatus ? () => onToggleStatus(item) : undefined}\r\n isActive={(item as any).is_actived}\r\n />\r\n )}\r\n </div>}\r\n </CardContent>\r\n </Card>)}\r\n\r\n {/* Unified Context Menu */}\r\n {contextMenu && (\r\n <div \r\n className=\"fixed bg-background border border-border rounded-md shadow-lg py-1 z-50 min-w-[120px]\"\r\n style={{ left: contextMenu.x, top: contextMenu.y }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <ActionMenuItems\r\n onEdit={onEdit ? () => {\r\n onEdit(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onDelete={onDelete ? () => {\r\n onDelete(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onToggleStatus={onToggleStatus ? () => {\r\n onToggleStatus(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n isActive={(contextMenu.item as any).is_actived}\r\n canDelete={!!onDelete}\r\n renderAs=\"context\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-col h-full\">\r\n {manager.isLoading ? (\r\n <TableSkeleton rows={5} columns={columns.length} />\r\n ) : manager.entities.length === 0 ? (\r\n <EmptyState\r\n title=\"Nenhum item encontrado\"\r\n description=\"Não há dados para exibir no momento.\"\r\n variant=\"search\"\r\n />\r\n ) : (\r\n <div className=\"flex flex-col h-full overflow-hidden\">\r\n <div className=\"flex-1 overflow-auto\">\r\n <Table className=\"table-fixed\">\r\n <colgroup>\r\n {columnWidths.map((config, index) => (\r\n <col key={index} style={config.style} />\r\n ))}\r\n <col style={{ width: '100px' }} />\r\n </colgroup>\r\n <TableHeader>\r\n <TableRow>\r\n {columns.map(column => (\r\n <TableHead\r\n key={column.key}\r\n className={`${column.className || ''} ${column.sortable ? 'cursor-pointer hover:bg-muted/50' : ''}`}\r\n onClick={column.sortable ? () => manager.handleSort(column.key) : undefined}\r\n >\r\n <div className={`flex items-center ${column.className?.includes('text-center') ? 'justify-center' : ''}`}>\r\n {column.header}\r\n {column.sortable && getSortIcon(column.key)}\r\n </div>\r\n </TableHead>\r\n ))}\r\n <TableHead className=\"w-[100px] text-center\">Ações</TableHead>\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {manager.entities.map(item => (\r\n <TableRow \r\n key={item.id} \r\n className=\"cursor-pointer hover:bg-muted/50\" \r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEdit?.(item);\r\n }}\r\n onContextMenu={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setContextMenu({\r\n x: e.clientX,\r\n y: e.clientY,\r\n item\r\n });\r\n }}\r\n >\r\n {columns.map(column => (\r\n <TableCell key={column.key} className={column.className}>\r\n {column.render ? column.render(item) : (item as any)[column.key]}\r\n </TableCell>\r\n ))}\r\n <TableCell className=\"text-center\">\r\n {renderActions ? renderActions(item) : (\r\n <TableRowActions \r\n onEdit={onEdit ? () => onEdit(item) : undefined} \r\n onDelete={onDelete ? () => onDelete(item) : undefined}\r\n onToggleStatus={onToggleStatus ? () => onToggleStatus(item) : undefined}\r\n isActive={(item as any).is_actived}\r\n />\r\n )}\r\n </TableCell>\r\n </TableRow>))}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Unified Context Menu */}\r\n {contextMenu && (\r\n <div \r\n className=\"fixed bg-background border border-border rounded-md shadow-lg py-1 z-50 min-w-[120px]\"\r\n style={{ left: contextMenu.x, top: contextMenu.y }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <ActionMenuItems\r\n onEdit={onEdit ? () => {\r\n onEdit(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onDelete={onDelete ? () => {\r\n onDelete(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n onToggleStatus={onToggleStatus ? () => {\r\n onToggleStatus(contextMenu.item);\r\n setContextMenu(null);\r\n } : undefined}\r\n isActive={(contextMenu.item as any).is_actived}\r\n canDelete={!!onDelete}\r\n renderAs=\"context\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CrudTable;","import BaseForm from \"./BaseForm\";\r\nimport type { FormSection, CrudEntity } from \"../../types\";\r\n\r\ninterface CrudFormProps<T extends CrudEntity> {\r\n open: boolean;\r\n title: string;\r\n sections: FormSection[];\r\n initialData?: Partial<T>;\r\n onSubmit: (data: T) => void;\r\n onCancel: () => void;\r\n isLoading?: boolean;\r\n submitButtonText?: string;\r\n}\r\n\r\nexport function CrudForm<T extends CrudEntity>({\r\n open,\r\n title,\r\n sections,\r\n initialData,\r\n onSubmit,\r\n onCancel,\r\n isLoading = false,\r\n submitButtonText = \"Salvar\"\r\n}: CrudFormProps<T>) {\r\n return (\r\n <BaseForm\r\n open={open}\r\n title={title}\r\n sections={sections}\r\n initialData={initialData}\r\n onSubmit={onSubmit}\r\n onCancel={onCancel}\r\n isLoading={isLoading}\r\n submitButtonText={submitButtonText}\r\n />\r\n );\r\n}","import React from 'react';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select';\r\nimport { Button } from '../../components/ui/button';\r\nimport { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from 'lucide-react';\r\n\r\ninterface TableFooterProps {\r\n manager: {\r\n pagination?: {\r\n totalItems?: number;\r\n totalPages?: number;\r\n };\r\n currentPage?: number;\r\n itemsPerPage?: number;\r\n handlePageChange?: (page: number) => void;\r\n handleItemsPerPageChange?: (itemsPerPage: number) => void;\r\n };\r\n}\r\n\r\nexport const TableFooter = ({ manager }: TableFooterProps) => {\r\n const {\r\n pagination = { totalItems: 0, totalPages: 1 },\r\n currentPage = 1,\r\n itemsPerPage = 10,\r\n handlePageChange = () => {},\r\n handleItemsPerPageChange = () => {}\r\n } = manager;\r\n\r\n const { totalItems = 0, totalPages = 1 } = pagination;\r\n\r\n const startItem = totalItems > 0 ? ((currentPage - 1) * itemsPerPage) + 1 : 0;\r\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\r\n\r\n const handleFirstPage = () => handlePageChange(1);\r\n const handlePreviousPage = () => handlePageChange(Math.max(1, currentPage - 1));\r\n const handleNextPage = () => handlePageChange(Math.min(totalPages, currentPage + 1));\r\n const handleLastPage = () => handlePageChange(totalPages);\r\n\r\n return (\r\n <div className=\"px-4 h-12 flex items-center justify-between text-sm text-muted-foreground bg-muted/50 border-t border-border flex-shrink-0 mt-auto\">\r\n {/* Esquerda: Seletor de Itens por Página */}\r\n <div className=\"flex items-center space-x-3\">\r\n <span>Itens por página</span>\r\n <Select\r\n value={itemsPerPage.toString()}\r\n onValueChange={(value) => handleItemsPerPageChange(Number(value))}\r\n >\r\n <SelectTrigger className=\"w-20 h-8 border-border\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"10\">10</SelectItem>\r\n <SelectItem value=\"25\">25</SelectItem>\r\n <SelectItem value=\"50\">50</SelectItem>\r\n <SelectItem value=\"100\">100</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n \r\n {/* Centro: Informações de Paginação */}\r\n <div className=\"flex-1 flex justify-center\">\r\n <span>\r\n {totalItems > 0 \r\n ? `${startItem}-${endItem} de ${totalItems} itens (página ${currentPage} de ${totalPages})`\r\n : '0 itens'\r\n }\r\n </span>\r\n </div>\r\n \r\n {/* Direita: Controles de Navegação */}\r\n <div className=\"flex items-center space-x-1\">\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleFirstPage} disabled={currentPage === 1}>\r\n <ChevronsLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handlePreviousPage} disabled={currentPage === 1}>\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleNextPage} disabled={currentPage === totalPages}>\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleLastPage} disabled={currentPage === totalPages}>\r\n <ChevronsRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default TableFooter;","import { useState, useEffect } from \"react\";\r\nimport { Button } from \"../../components/ui/button\";\r\nimport { Plus, X } from \"lucide-react\";\r\nimport DeleteConfirmationDialog from \"../../components/ui/delete-dialog\";\r\nimport { CrudTable } from \"./CrudTable\";\r\nimport { CrudForm } from \"./CrudForm\";\r\nimport { TableFooter } from \"./TableFooter\";\r\nimport type { CrudEntity, CrudManager, CrudPageConfig, FormSection } from \"../../types\";\r\n\r\ninterface CrudPageProps<T extends CrudEntity> {\r\n manager: CrudManager<T>;\r\n config: CrudPageConfig<T>;\r\n formSections: FormSection[];\r\n onSave: (data: any) => void;\r\n FormComponent?: React.ComponentType<any>;\r\n TableComponent?: React.ComponentType<any>;\r\n onToggleStatus?: (item: T) => void;\r\n}\r\n\r\nexport function CrudPage<T extends CrudEntity>({\r\n manager,\r\n config,\r\n formSections,\r\n onSave,\r\n FormComponent,\r\n TableComponent,\r\n onToggleStatus\r\n}: CrudPageProps<T>) {\r\n const [isFormOpen, setIsFormOpen] = useState(false);\r\n const [editingEntity, setEditingEntity] = useState<T | null>(null);\r\n const [deleteConfirmation, setDeleteConfirmation] = useState<{\r\n isOpen: boolean;\r\n entityId: string | null;\r\n entityName: string;\r\n }>({\r\n isOpen: false,\r\n entityId: null,\r\n entityName: ''\r\n });\r\n\r\n const handleNew = () => {\r\n setEditingEntity(null);\r\n setIsFormOpen(true);\r\n };\r\n\r\n const handleEdit = (entity: T) => {\r\n setEditingEntity(entity);\r\n setIsFormOpen(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n setIsFormOpen(false);\r\n setEditingEntity(null);\r\n };\r\n\r\n const handleSaveWithClose = (data: any) => {\r\n onSave(data);\r\n setIsFormOpen(false);\r\n setEditingEntity(null);\r\n };\r\n\r\n const handleDeleteClick = (entity: T) => {\r\n setDeleteConfirmation({\r\n isOpen: true,\r\n entityId: entity.id,\r\n entityName: (entity as any).title || (entity as any).name || 'Item'\r\n });\r\n };\r\n\r\n const handleConfirmDelete = () => {\r\n if (deleteConfirmation.entityId) {\r\n manager.deleteEntity(deleteConfirmation.entityId);\r\n setDeleteConfirmation({ isOpen: false, entityId: null, entityName: '' });\r\n }\r\n };\r\n\r\n const handleCancelDelete = () => {\r\n setDeleteConfirmation({ isOpen: false, entityId: null, entityName: '' });\r\n };\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col h-full\">\r\n {/* Action Bar - Fixed */}\r\n <div className=\"flex-shrink-0 flex justify-between items-center px-4 py-1.5 bg-muted/50 border-b\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button onClick={handleNew} className=\"flex items-center gap-2\">\r\n <Plus size={16} />\r\n Novo\r\n </Button>\r\n \r\n {/* Inline Filters */}\r\n </div>\r\n </div>\r\n\r\n {/* Table/Cards - Scrollable */}\r\n <div className=\"flex-1 flex flex-col overflow-hidden\">\r\n {TableComponent ? (\r\n <TableComponent\r\n manager={manager}\r\n onEdit={handleEdit}\r\n onDelete={handleDeleteClick}\r\n onToggleStatus={onToggleStatus}\r\n />\r\n ) : (\r\n <CrudTable\r\n manager={manager}\r\n columns={config.columns}\r\n onEdit={handleEdit}\r\n onDelete={handleDeleteClick}\r\n onToggleStatus={onToggleStatus}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Pagination Footer - Fixed */}\r\n <div className=\"flex-shrink-0 border-t bg-background\">\r\n <TableFooter manager={manager} />\r\n </div>\r\n\r\n {/* Form */}\r\n {FormComponent ? (\r\n <FormComponent\r\n open={isFormOpen}\r\n onCancel={handleCancel}\r\n onSubmit={handleSaveWithClose}\r\n editingEntity={editingEntity}\r\n isLoading={manager.isLoading}\r\n />\r\n ) : (\r\n <CrudForm\r\n open={isFormOpen}\r\n title={editingEntity ? `Editar ${config.entityName}` : `Novo ${config.entityName}`}\r\n sections={formSections}\r\n initialData={editingEntity || undefined}\r\n onSubmit={handleSaveWithClose}\r\n onCancel={handleCancel}\r\n isLoading={manager.isLoading}\r\n submitButtonText={editingEntity ? \"Atualizar\" : \"Criar\"}\r\n />\r\n )}\r\n\r\n {/* Delete Confirmation */}\r\n <DeleteConfirmationDialog\r\n open={deleteConfirmation.isOpen}\r\n onOpenChange={handleCancelDelete}\r\n onConfirm={(item) => handleConfirmDelete()}\r\n item={deleteConfirmation.entityId ? { id: deleteConfirmation.entityId, title: deleteConfirmation.entityName } : undefined}\r\n entityName={config.entityName}\r\n isDeleting={manager.isDeleting}\r\n />\r\n </div>\r\n );\r\n}","// ============= QUALIEX ENRICHMENT SERVICE =============\r\n\r\nimport { qualiexApi } from '../qualiex/services/qualiexApi';\r\nimport { TokenManager } from '../auth/services/TokenManager';\r\nimport { errorService } from './ErrorService';\r\n\r\nexport interface QualiexEnrichmentOptions {\r\n entityName: string;\r\n fallbackResponsibleText?: string;\r\n}\r\n\r\nexport class QualiexEnrichmentService {\r\n private static async extractTokenData() {\r\n const tokenData = TokenManager.extractTokenData();\r\n \r\n if (!tokenData) {\r\n errorService.handleError('[QualiexEnrichment] ❌ Token Supabase não encontrado', false);\r\n return null;\r\n }\r\n\r\n return tokenData;\r\n }\r\n\r\n static async enrichWithResponsibleNames<T extends { id_user?: string | null }>(\r\n entities: T[],\r\n options: QualiexEnrichmentOptions\r\n ): Promise<(T & { responsible_name?: string })[]> {\r\n // Se não há entidades, retornar vazio\r\n if (!entities || entities.length === 0) {\r\n errorService.handleError(`[QualiexEnrichment.${options.entityName}] Nenhuma entidade encontrada`, false);\r\n return entities as (T & { responsible_name?: string })[];\r\n }\r\n\r\n try {\r\n const tokenData = await this.extractTokenData();\r\n \r\n if (!tokenData) {\r\n return entities.map(entity => ({\r\n ...entity,\r\n responsible_name: entity.id_user ? 'Token não encontrado' : null\r\n }));\r\n }\r\n\r\n const { alias, companyId } = tokenData;\r\n\r\n if (!alias || !companyId) {\r\n errorService.handleError(`[QualiexEnrichment.${options.entityName}] DADOS OBRIGATÓRIOS FALTANDO - alias: ${!!alias}, companyId: ${!!companyId}`, false);\r\n return entities.map(entity => ({\r\n ...entity,\r\n responsible_name: entity.id_user ? `Configuração incompleta (alias: ${!!alias}, companyId: ${!!companyId})` : null\r\n }));\r\n }\r\n\r\n // Buscar usuários do Qualiex\r\n const qualiexUsers = await qualiexApi.getUsers(alias);\r\n\r\n // Mapear entidades com nomes dos responsáveis\r\n const entitiesWithResponsibleNames = entities.map(entity => { \r\n if (entity.id_user) {\r\n // Tentar encontrar por userId primeiro, depois por id\r\n const responsibleUser = qualiexUsers.find(user => user.userId === entity.id_user);\r\n \r\n return {\r\n ...entity,\r\n responsible_name: responsibleUser?.userName || `ID não encontrado: ${entity.id_user}`\r\n };\r\n }\r\n return {\r\n ...entity,\r\n responsible_name: null\r\n };\r\n });\r\n \r\n const successCount = entitiesWithResponsibleNames.filter(e => \r\n e.responsible_name && \r\n !e.responsible_name.includes('ID não encontrado') && \r\n !e.responsible_name.includes('Erro:') &&\r\n !e.responsible_name.includes('Token não encontrado') &&\r\n !e.responsible_name.includes('Configuração incompleta')\r\n ).length;\r\n\r\n return entitiesWithResponsibleNames;\r\n\r\n } catch (error) {\r\n errorService.handleError(error instanceof Error ? error : `[QualiexEnrichment.${options.entityName}] 💥 ERRO CRÍTICO`);\r\n // Retornar entidades sem nomes dos responsáveis em caso de erro\r\n return entities.map(entity => ({\r\n ...entity,\r\n responsible_name: entity.id_user ? `Erro: ${error.message}` : null\r\n }));\r\n }\r\n }\r\n}","import { getSupabaseClient } from '../supabase/SupabaseSingleton';\r\nimport { QualiexEnrichmentService } from './QualiexEnrichmentService';\r\nimport type { PaginatedResponse, QueryParams } from '../types';\r\nimport { trimTextFields } from '../utils';\r\n\r\n// Using QueryParams from shared types\r\n\r\nexport interface ServiceOptions {\r\n tableName: string;\r\n searchFields?: string[];\r\n schemaName?: string;\r\n entityName?: string; // Para enrichment com Qualiex\r\n enableQualiexEnrichment?: boolean; // Controla se deve enriquecer com dados do Qualiex\r\n}\r\n\r\n// Campos virtuais conhecidos\r\nconst VIRTUAL_FIELDS = ['responsible_name'];\r\n\r\nconst isVirtualField = (field: string): boolean => VIRTUAL_FIELDS.includes(field);\r\n\r\nconst sortData = <T>(data: T[], sortField: string, sortDirection: 'asc' | 'desc'): T[] => {\r\n return [...data].sort((a, b) => {\r\n const aValue = (a as any)[sortField] || '';\r\n const bValue = (b as any)[sortField] || '';\r\n const comparison = aValue.localeCompare(bValue, 'pt-BR', { sensitivity: 'base' });\r\n return sortDirection === 'asc' ? comparison : -comparison;\r\n });\r\n};\r\n\r\nconst paginateData = <T>(data: T[], page: number = 1, limit: number = 25) => {\r\n const startIndex = (page - 1) * limit;\r\n const endIndex = startIndex + limit;\r\n const paginatedData = data.slice(startIndex, endIndex);\r\n \r\n return {\r\n data: paginatedData,\r\n pagination: {\r\n currentPage: page,\r\n totalPages: Math.ceil(data.length / limit),\r\n totalItems: paginatedData.length,\r\n totalCount: data.length,\r\n itemsPerPage: limit,\r\n hasNextPage: endIndex < data.length,\r\n hasPreviousPage: page > 1\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Factory function to create a service with CRUD operations for Supabase tables\r\n * \r\n * IMPORTANT: This service is designed for SOFT DELETE architecture\r\n * - delete() method sets is_removed = true (NO physical DELETE)\r\n * - getAll() automatically filters is_removed = false\r\n * - Works with RLS policies that expect company_id filtering\r\n * \r\n * Expected Table Structure:\r\n * - id: UUID PRIMARY KEY\r\n * - company_id: TEXT NOT NULL (for RLS filtering)\r\n * - is_removed: BOOLEAN DEFAULT false (for soft delete)\r\n * - created_at/updated_at: TIMESTAMP WITH TIME ZONE\r\n * \r\n * Expected RLS Policies:\r\n * - SELECT: company_id filter + is_removed = false\r\n * - INSERT: company_id validation \r\n * - UPDATE: company_id filter\r\n * - DELETE: NOT NEEDED (soft delete used)\r\n * \r\n * @param options Service configuration or table name\r\n * @param searchFields Optional array of fields to search in (deprecated - use options object)\r\n * @param schemaName Optional schema name (deprecated - use options object)\r\n */\r\nexport function createService<T extends { id_user?: string | null } = any, TInsert = any, TUpdate = any>(\r\n options: ServiceOptions | string, // Mantém compatibilidade com API antiga\r\n searchFields?: string[],\r\n schemaName?: string\r\n) {\r\n // Normalizar parâmetros para suportar ambas as APIs\r\n const config: ServiceOptions = typeof options === 'string' \r\n ? { \r\n tableName: options, \r\n searchFields: searchFields || [], \r\n schemaName: schemaName || 'central' \r\n }\r\n : { \r\n searchFields: options.searchFields || [], \r\n schemaName: options.schemaName || 'central',\r\n ...options \r\n };\r\n\r\n const { tableName, searchFields: configSearchFields, schemaName: configSchemaName, entityName, enableQualiexEnrichment = false } = config;\r\n const createQuery = () => {\r\n // Always get the current authenticated client\r\n const client = getSupabaseClient();\r\n return (client as any).schema(configSchemaName).from(tableName);\r\n };\r\n\r\n const buildSearchQuery = (query: any, search: string) => {\r\n if (search && configSearchFields.length > 0) {\r\n const searchConditions = configSearchFields.map(field => `${field}.ilike.%${search}%`).join(',');\r\n return query.or(searchConditions);\r\n }\r\n return query;\r\n };\r\n\r\n const buildPaginatedQuery = (query: any, page: number, limit: number) => {\r\n const from = (page - 1) * limit;\r\n const to = from + limit - 1;\r\n return query.range(from, to);\r\n };\r\n\r\n const createPaginatedResponse = <TData>(\r\n data: TData[],\r\n count: number | null,\r\n page: number,\r\n limit: number\r\n ): PaginatedResponse<TData> => {\r\n const totalPages = Math.ceil((count || 0) / limit);\r\n \r\n return {\r\n data,\r\n currentPage: page,\r\n totalPages,\r\n totalItems: count || 0,\r\n itemsPerPage: limit,\r\n hasNextPage: page < totalPages,\r\n hasPreviousPage: page > 1,\r\n };\r\n };\r\n\r\n return {\r\n async getAll(params: QueryParams = {}): Promise<PaginatedResponse<T & { responsible_name?: string }>> {\r\n \r\n const {\r\n search = '',\r\n sortField = 'updated_at',\r\n sortDirection = 'desc',\r\n page = 1,\r\n limit = 25,\r\n ...additionalFilters\r\n } = params;\r\n\r\n let query = createQuery().select('*', { count: 'exact' });\r\n\r\n // ✅ Filtrar registros não removidos no nível da aplicação\r\n query = query.eq('is_removed', false);\r\n\r\n // Apply additional filters\r\n Object.entries(additionalFilters).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null && value !== '') {\r\n // Se o valor é um array, usar filter 'in'\r\n if (Array.isArray(value)) {\r\n query = query.in(key, value);\r\n } else if (typeof value === 'object' && value && 'operator' in value && value.operator === 'not_null') {\r\n query = query.not(key, 'is', null);\r\n } else {\r\n query = query.eq(key, value);\r\n }\r\n }\r\n });\r\n\r\n // Apply search filter\r\n query = buildSearchQuery(query, search);\r\n\r\n // Apply sorting\r\n query = query.order(sortField, { ascending: sortDirection === 'asc' });\r\n\r\n // Apply pagination\r\n query = buildPaginatedQuery(query, page, limit);\r\n\r\n const { data, error, count } = await query;\r\n\r\n if (error) {\r\n throw new Error(`Error fetching ${tableName}: ${error.message}`);\r\n }\r\n\r\n let response = createPaginatedResponse<T>(data || [], count, page, limit);\r\n\r\n // Se entityName foi fornecido e enriquecimento está habilitado, aplicar enrichment com Qualiex\r\n if (enableQualiexEnrichment && entityName && response.data.length > 0) {\r\n // Verifica se alguma entidade tem id_user antes de tentar enriquecer\r\n const hasUsersToEnrich = response.data.some((item: any) => item.id_user);\r\n \r\n if (hasUsersToEnrich) {\r\n // Para campos virtuais, buscar dados maiores e processar localmente\r\n if (sortField && isVirtualField(sortField)) {\r\n // Refazer a query sem paginação e ordenação para virtual fields\r\n const largeParams = { ...params, page: 1, limit: 500, sortField: undefined, sortDirection: undefined };\r\n const largeResponse = await this.getAll(largeParams);\r\n \r\n if (!largeResponse?.data?.length) {\r\n return largeResponse as PaginatedResponse<T & { responsible_name?: string }>;\r\n }\r\n\r\n const enrichedData = await QualiexEnrichmentService.enrichWithResponsibleNames(\r\n largeResponse.data,\r\n { entityName }\r\n );\r\n\r\n const sortedData = sortData(enrichedData, sortField, sortDirection);\r\n const paginatedResult = paginateData(sortedData, page, limit);\r\n\r\n return {\r\n data: paginatedResult.data,\r\n currentPage: paginatedResult.pagination.currentPage,\r\n totalPages: paginatedResult.pagination.totalPages,\r\n totalItems: paginatedResult.pagination.totalItems,\r\n itemsPerPage: paginatedResult.pagination.itemsPerPage,\r\n hasNextPage: paginatedResult.pagination.hasNextPage,\r\n hasPreviousPage: paginatedResult.pagination.hasPreviousPage,\r\n } as PaginatedResponse<T & { responsible_name?: string }>;\r\n }\r\n\r\n // Para campos físicos, aplicar enrichment nos dados já paginados\r\n const enrichedData = await QualiexEnrichmentService.enrichWithResponsibleNames(\r\n response.data,\r\n { entityName }\r\n );\r\n\r\n response = { ...response, data: enrichedData as (T & { responsible_name?: string })[] };\r\n }\r\n }\r\n\r\n return response as PaginatedResponse<T & { responsible_name?: string }>;\r\n },\r\n\r\n async getById(id: string): Promise<T | null> {\r\n const { data, error } = await createQuery()\r\n .select('*')\r\n .eq('id', id)\r\n .maybeSingle();\r\n\r\n if (error) {\r\n throw new Error(`Error fetching ${tableName}: ${error.message}`);\r\n }\r\n\r\n return data;\r\n },\r\n\r\n async create(payload: TInsert): Promise<T> {\r\n const trimmedPayload = trimTextFields(payload);\r\n const cleanPayload = Object.entries(trimmedPayload as any).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n acc[key] = value;\r\n }\r\n return acc;\r\n }, {} as any);\r\n\r\n const { data, error } = await createQuery()\r\n .insert(cleanPayload)\r\n .select()\r\n .single();\r\n\r\n if (error) {\r\n throw new Error(`Error creating ${tableName}: ${error.message}`);\r\n }\r\n\r\n if (!data) {\r\n throw new Error(`No data returned from create ${tableName} operation`);\r\n }\r\n\r\n return data;\r\n },\r\n\r\n async update(id: string, payload: TUpdate): Promise<T> {\r\n const trimmedPayload = trimTextFields(payload);\r\n const updateData = {\r\n ...trimmedPayload,\r\n updated_at: new Date().toISOString(),\r\n } as TUpdate;\r\n\r\n const { data, error } = await createQuery()\r\n .update(updateData)\r\n .eq('id', id)\r\n .select()\r\n .single();\r\n\r\n if (error) {\r\n throw new Error(`Error updating ${tableName}: ${error.message}`);\r\n }\r\n\r\n if (!data) {\r\n throw new Error(`No data returned from update ${tableName} operation`);\r\n }\r\n\r\n return data;\r\n },\r\n\r\n /**\r\n * Delete a record by ID using SOFT DELETE\r\n * \r\n * IMPORTANT: This performs a SOFT DELETE by setting is_removed = true\r\n * - No physical DELETE is performed\r\n * - Record remains in database but filtered from queries\r\n * - RLS policies should NOT include DELETE policies\r\n * - Compatible with audit trails and data recovery\r\n */\r\n async delete(id: string): Promise<void> {\r\n const updateData = {\r\n is_removed: true,\r\n updated_at: new Date().toISOString(),\r\n } as unknown as Partial<TUpdate>;\r\n\r\n const { error } = await createQuery()\r\n .update(updateData)\r\n .eq('id', id);\r\n\r\n if (error) {\r\n throw new Error(`Error soft deleting ${tableName}: ${error.message}`);\r\n }\r\n },\r\n };\r\n}","import { ReactNode } from 'react';\r\nimport { SidebarProvider } from '../ui/sidebar';\r\nimport AppHeader from './AppHeader';\r\nimport { AppSidebar } from './AppSidebar';\r\nimport { SidebarConfig } from '../../types/sidebar';\r\nimport { NavigationProvider } from '../../contexts/NavigationContext';\r\n\r\ninterface AppLayoutProps {\r\n children: ReactNode;\r\n sidebar?: ReactNode;\r\n sidebarConfig?: SidebarConfig;\r\n showHeader?: boolean;\r\n}\r\n\r\nexport function AppLayout({ \r\n children, \r\n sidebar, \r\n sidebarConfig,\r\n showHeader = true \r\n}: AppLayoutProps) {\r\n const sidebarComponent = sidebar || <AppSidebar config={sidebarConfig} />;\r\n\r\n return (\r\n <NavigationProvider config={sidebarConfig}>\r\n <SidebarProvider>\r\n <div className=\"min-h-screen flex w-full h-screen overflow-hidden\">\r\n {sidebarComponent}\r\n <main className=\"flex-1 flex flex-col h-full overflow-hidden\">\r\n {showHeader && (\r\n <div className=\"flex-shrink-0\">\r\n <AppHeader />\r\n </div>\r\n )}\r\n <div className=\"flex-1 flex flex-col overflow-hidden\">\r\n {children}\r\n </div>\r\n </main>\r\n </div>\r\n </SidebarProvider>\r\n </NavigationProvider>\r\n );\r\n}","// ============= BASE CRUD PAGE =============\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { CrudPage } from './components/CrudPage';\r\nimport type { CrudPageConfig, CrudEntity, FormSection } from '../types';\r\nimport { useAuth } from '../auth/contexts/AuthContext';\r\n\r\ninterface BaseCrudPageProps<T extends CrudEntity> {\r\n manager: any;\r\n config: CrudPageConfig<T>;\r\n formSections: FormSection[];\r\n onSave: (data: any) => void;\r\n FormComponent?: React.ComponentType<any>;\r\n TableComponent?: React.ComponentType<any>;\r\n onToggleStatus?: (item: T) => void;\r\n}\r\n\r\nexport function BaseCrudPage<T extends CrudEntity>({\r\n manager,\r\n config,\r\n formSections,\r\n onSave,\r\n FormComponent,\r\n TableComponent,\r\n onToggleStatus,\r\n}: BaseCrudPageProps<T>) {\r\n const { setSearchVisible, refreshData } = useAuth();\r\n\r\n // Set up search\r\n useEffect(() => {\r\n setSearchVisible(true);\r\n return () => {\r\n setSearchVisible(false);\r\n };\r\n }, [setSearchVisible]);\r\n\r\n return (\r\n <CrudPage\r\n manager={manager}\r\n config={config}\r\n formSections={formSections}\r\n onSave={onSave}\r\n FormComponent={FormComponent}\r\n TableComponent={TableComponent}\r\n onToggleStatus={onToggleStatus}\r\n />\r\n );\r\n}","import { useEffect, useState } from 'react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card';\r\nimport { Spinner } from '../../components/ui/spinner';\r\nimport { Alert, AlertDescription } from '../../components/ui/alert';\r\nimport { Button } from '../../components/ui/button';\r\nimport { useAuth } from '../contexts/AuthContext';\r\nimport { AlertCircle, RefreshCw } from 'lucide-react';\r\n\r\nexport const CallbackPage = () => {\r\n const { processCallback } = useAuth();\r\n const [error, setError] = useState<string | null>(null);\r\n const [isRetrying, setIsRetrying] = useState(false);\r\n\r\n useEffect(() => {\r\n const handleCallback = async () => {\r\n try {\r\n // Processar callback (toda validação está no AuthService)\r\n const success = await processCallback();\r\n if (success) {\r\n // Limpar URL e redirecionar\r\n window.history.replaceState({}, document.title, '/');\r\n \r\n // Verificar se há página de origem salva\r\n const returnUrl = localStorage.getItem('auth_return_url');\r\n if (returnUrl) {\r\n localStorage.removeItem('auth_return_url');\r\n window.location.href = returnUrl;\r\n } else {\r\n window.location.href = '/';\r\n }\r\n } else {\r\n setError('Falha na autenticação. Tente novamente.');\r\n }\r\n } catch (err: any) {\r\n console.error('❌ [CallbackPage] Erro no processamento:', err);\r\n setError(err?.message || 'Erro durante a autenticação. Tente novamente.');\r\n }\r\n };\r\n\r\n handleCallback();\r\n }, [processCallback]);\r\n\r\n const handleRetry = async () => {\r\n setIsRetrying(true);\r\n setError(null);\r\n \r\n try {\r\n const success = await processCallback();\r\n if (!success) {\r\n setError('Falha na autenticação. Tente novamente.');\r\n }\r\n } catch (err: any) {\r\n setError(err?.message || 'Erro ao tentar novamente.');\r\n } finally {\r\n setIsRetrying(false);\r\n }\r\n };\r\n\r\n const handleGoHome = () => {\r\n window.location.href = '/';\r\n };\r\n\r\n if (error) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold text-destructive flex items-center justify-center gap-2\">\r\n <AlertCircle className=\"h-5 w-5\" />\r\n Erro na Autenticação\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n <Alert variant=\"destructive\">\r\n <AlertDescription>\r\n {error}\r\n </AlertDescription>\r\n </Alert>\r\n \r\n <div className=\"text-sm text-muted-foreground\">\r\n <p>Se o problema persistir, verifique se a URL de callback está configurada corretamente no provedor OAuth.</p>\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <Button \r\n onClick={handleRetry} \r\n disabled={isRetrying}\r\n className=\"flex-1\"\r\n >\r\n {isRetrying ? (\r\n <>\r\n <Spinner size=\"sm\" className=\"mr-2\" />\r\n Tentando...\r\n </>\r\n ) : (\r\n <>\r\n <RefreshCw className=\"h-4 w-4 mr-2\" />\r\n Tentar Novamente\r\n </>\r\n )}\r\n </Button>\r\n <Button \r\n onClick={handleGoHome}\r\n variant=\"outline\"\r\n className=\"flex-1\"\r\n >\r\n Voltar ao Início\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Processando Autenticação\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"flex justify-center mb-4\">\r\n <Spinner size=\"lg\" />\r\n </div>\r\n <p className=\"text-muted-foreground\">\r\n Processando tokens e redirecionando...\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n};","import { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../components/ui/card\";\r\nimport { Badge } from \"../../components/ui/badge\";\r\nimport { Skeleton } from \"../../components/ui/skeleton\";\r\nimport { Grid } from \"../../components/ui/grid\";\r\nimport { DataList } from \"../../components/ui/data-list\";\r\nimport { ExternalLink, Copy } from \"lucide-react\";\r\nimport { format } from \"date-fns\";\r\nimport { ptBR } from \"date-fns/locale\";\r\nimport { toast } from \"sonner\";\r\nimport { Button } from \"../../components/ui/button\";\r\nimport { TableRowActions } from \"./TableRowActions\";\r\nimport type { CrudEntity, CrudManager, CrudPageConfig } from \"../../types\";\r\n\r\ninterface CrudCardsProps<T extends CrudEntity> {\r\n manager: Pick<CrudManager<T>, 'entities' | 'isLoading' | 'deleteEntity'>;\r\n config: Pick<CrudPageConfig<T>, 'cardFields'>;\r\n onEdit: (item: T) => void;\r\n onDelete?: (item: T) => void;\r\n}\r\n\r\nexport function CrudCards<T extends CrudEntity>({\r\n manager,\r\n config,\r\n onEdit,\r\n onDelete\r\n}: CrudCardsProps<T>) {\r\n const handleExternalLink = (url: string) => {\r\n try {\r\n const newWindow = window.open(url, '_blank');\r\n if (!newWindow || newWindow.closed || typeof newWindow.closed == 'undefined') {\r\n navigator.clipboard.writeText(url);\r\n toast.info(\"Link copiado para a área de transferência\");\r\n }\r\n } catch (error) {\r\n window.location.href = url;\r\n }\r\n };\r\n\r\n if (manager.isLoading) {\r\n return (\r\n <Grid>\r\n {Array.from({ length: 3 }).map((_, index) => (\r\n <Card key={index}>\r\n <CardHeader>\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n <Skeleton className=\"h-3 w-1/2\" />\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-3 w-full\" />\r\n <Skeleton className=\"h-3 w-2/3\" />\r\n </div>\r\n </CardContent>\r\n </Card>\r\n ))}\r\n </Grid>\r\n );\r\n }\r\n\r\n return (\r\n <DataList.Root>\r\n {manager.entities.map((entity) => (\r\n <DataList.Item key={entity.id} onClick={() => onEdit(entity)}>\r\n <CardHeader className=\"pb-3\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex-1 min-w-0\">\r\n <CardTitle className=\"text-base leading-6 truncate\">\r\n {(entity as any).title || (entity as any).name || 'Sem título'}\r\n </CardTitle>\r\n <CardDescription className=\"text-sm\">\r\n {format(new Date(entity.created_at), \"dd/MM/yyyy HH:mm\", { locale: ptBR })}\r\n </CardDescription>\r\n </div>\r\n <div className=\"flex items-center gap-2 ml-2\">\r\n {(entity as any).link && (\r\n <Button\r\n variant=\"external-link\"\r\n size=\"icon-xs\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleExternalLink((entity as any).link);\r\n }}\r\n title=\"Abrir link externo\"\r\n >\r\n <ExternalLink className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n <div onClick={(e) => e.stopPropagation()}>\r\n <TableRowActions\r\n onEdit={() => onEdit(entity)}\r\n onDelete={onDelete ? () => onDelete(entity) : undefined}\r\n canDelete={!!onDelete}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </CardHeader>\r\n \r\n <CardContent className=\"pt-0\">\r\n <div className=\"space-y-2\">\r\n {config.cardFields?.map((field) => {\r\n const value = entity[field.key];\r\n if (!value) return null;\r\n \r\n return (\r\n <DataList.Field\r\n key={String(field.key)}\r\n label={field.label}\r\n value={field.render ? field.render(value, entity) : String(value)}\r\n />\r\n );\r\n })}\r\n </div>\r\n </CardContent>\r\n </DataList.Item>\r\n ))}\r\n </DataList.Root>\r\n );\r\n}","import { Button } from \"../../components/ui/button\";\r\nimport { Input } from \"../../components/ui/input\";\r\nimport { Stack } from \"../../components/ui/stack\";\r\nimport { X, Search } from \"lucide-react\";\r\nimport { useAuth } from '../../auth/contexts/AuthContext';\r\nimport type { CrudManager, CrudFilter, CrudEntity } from '../../types';\r\n\r\ninterface FilterBarProps<T extends CrudEntity> {\r\n manager: Pick<CrudManager<T>, 'searchTerm' | 'handleSearch' | 'clearFilters'>;\r\n filters: CrudFilter[];\r\n}\r\n\r\nexport function FilterBar<T extends CrudEntity>({\r\n manager,\r\n filters,\r\n}: FilterBarProps<T>) {\r\n const { isSearchVisible } = useAuth();\r\n const hasActiveFilters = manager.searchTerm;\r\n\r\n return (\r\n <Stack direction=\"column\" gap=\"md\" className=\"mb-6\">\r\n <Stack direction=\"row\" gap=\"md\" wrap className=\"flex-col sm:flex-row\">\r\n {/* Search */}\r\n {filters.some(f => f.type === 'search') && !isSearchVisible && (\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4\" />\r\n <Input\r\n placeholder=\"Buscar...\"\r\n value={manager.searchTerm}\r\n onChange={(e) => manager.handleSearch(e.target.value)}\r\n className=\"pl-10\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Custom Filters */}\r\n {filters\r\n .filter(f => f.type === 'custom' && f.component)\r\n .map((filter, index) => {\r\n const CustomComponent = filter.component!;\r\n return (\r\n <div key={index} className=\"w-full sm:w-auto\">\r\n <CustomComponent {...filter.props} />\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Clear Filters */}\r\n {hasActiveFilters && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={manager.clearFilters}\r\n className=\"whitespace-nowrap\"\r\n >\r\n <X className=\"h-4 w-4 mr-2\" />\r\n Limpar Filtros\r\n </Button>\r\n )}\r\n </Stack>\r\n </Stack>\r\n );\r\n}","// ============= GENERIC ENTITY FORM =============\r\n\r\nimport React from 'react';\r\nimport { CrudForm } from './components/CrudForm';\r\nimport type { FormSection } from '../types';\r\nimport { useAuth } from '../auth/contexts/AuthContext';\r\n\r\ninterface GenericEntityFormProps<T = any> {\r\n open: boolean;\r\n onCancel: () => void;\r\n onSubmit: (data: T) => void;\r\n editingEntity?: any;\r\n isLoading?: boolean;\r\n title: string;\r\n editTitle: string;\r\n sections: FormSection[];\r\n transformData?: (data: any, alias: string) => T;\r\n}\r\n\r\nexport function GenericEntityForm<T = any>({\r\n open,\r\n onCancel,\r\n onSubmit,\r\n editingEntity,\r\n isLoading = false,\r\n title,\r\n editTitle,\r\n sections,\r\n transformData\r\n}: GenericEntityFormProps<T>) {\r\n const { alias } = useAuth();\r\n\r\n const handleSubmit = (data: any) => {\r\n if (transformData) {\r\n const processedData = transformData(data, alias || '');\r\n onSubmit(processedData);\r\n } else {\r\n // Default transformation - add alias and preserve id for editing\r\n const processedData = {\r\n ...data,\r\n alias: alias || ''\r\n };\r\n // Preserve id if editing\r\n if (editingEntity?.id) {\r\n processedData.id = editingEntity.id;\r\n }\r\n onSubmit(processedData);\r\n }\r\n };\r\n\r\n return (\r\n <CrudForm\r\n open={open}\r\n title={editingEntity ? editTitle : title}\r\n sections={sections}\r\n initialData={editingEntity}\r\n onSubmit={handleSubmit}\r\n onCancel={onCancel}\r\n isLoading={isLoading}\r\n submitButtonText={editingEntity ? \"Atualizar\" : \"Salvar\"}\r\n />\r\n );\r\n}","import { cn } from \"../../utils\"\r\nimport { ReactNode } from \"react\"\r\nimport { Spinner } from \"./spinner\"\r\n\r\ninterface LoadingStateProps {\r\n isLoading: boolean\r\n children: ReactNode\r\n className?: string\r\n type?: \"spinner\" | \"skeleton\" | \"overlay\"\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n}\r\n\r\nexport function LoadingState({\r\n isLoading,\r\n children,\r\n className,\r\n type = \"spinner\",\r\n size = \"md\"\r\n}: LoadingStateProps) {\r\n if (!isLoading) {\r\n return <>{children}</>\r\n }\r\n\r\n if (type === \"overlay\") {\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n {children}\r\n <div className=\"absolute inset-0 bg-background/50 backdrop-blur-sm flex items-center justify-center z-10\">\r\n <Spinner size={size} />\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (type === \"skeleton\") {\r\n return (\r\n <div className={cn(\"animate-pulse\", className)}>\r\n <div className=\"bg-muted rounded-md h-full w-full\" />\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className={cn(\"flex items-center justify-center py-8\", className)}>\r\n <Spinner size={size} />\r\n </div>\r\n )\r\n}","import { ReactNode } from \"react\"\r\nimport { useLocation } from \"react-router-dom\"\r\nimport { \r\n Breadcrumb,\r\n BreadcrumbEllipsis,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from \"./breadcrumb\"\r\n\r\ninterface BreadcrumbItem {\r\n label: string\r\n href?: string\r\n isCurrentPage?: boolean\r\n}\r\n\r\ninterface PageBreadcrumbProps {\r\n items: BreadcrumbItem[]\r\n maxItems?: number\r\n className?: string\r\n}\r\n\r\nexport function PageBreadcrumb({ items, maxItems = 3, className }: PageBreadcrumbProps) {\r\n const displayItems = items.length > maxItems \r\n ? [\r\n items[0],\r\n ...items.slice(-(maxItems - 1))\r\n ]\r\n : items\r\n\r\n const hasCollapsed = items.length > maxItems\r\n\r\n return (\r\n <Breadcrumb className={className}>\r\n <BreadcrumbList>\r\n {displayItems.map((item, index) => {\r\n const isLast = index === displayItems.length - 1\r\n const showEllipsis = hasCollapsed && index === 1\r\n\r\n return (\r\n <div key={`${item.label}-${index}`} className=\"flex items-center\">\r\n {showEllipsis && (\r\n <>\r\n <BreadcrumbItem>\r\n <BreadcrumbEllipsis />\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n </>\r\n )}\r\n \r\n <BreadcrumbItem>\r\n {isLast || item.isCurrentPage ? (\r\n <BreadcrumbPage className=\"font-bold text-lg\">{item.label}</BreadcrumbPage>\r\n ) : (\r\n <BreadcrumbLink href={item.href}>\r\n {item.label}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n \r\n {!isLast && <BreadcrumbSeparator />}\r\n </div>\r\n )\r\n })}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n )\r\n}\r\n\r\n// Hook para gerar breadcrumbs automaticamente baseado na rota\r\nexport function useRouteBreadcrumbs() {\r\n const location = useLocation()\r\n \r\n const generateBreadcrumbs = (): BreadcrumbItem[] => {\r\n const pathSegments = location.pathname.split('/').filter(Boolean)\r\n \r\n const breadcrumbs: BreadcrumbItem[] = [\r\n { label: 'Exemplos', href: '/' }\r\n ]\r\n \r\n let currentPath = ''\r\n \r\n pathSegments.forEach((segment, index) => {\r\n currentPath += `/${segment}`\r\n const isLast = index === pathSegments.length - 1\r\n \r\n // Capitalize and replace dashes with spaces\r\n const label = segment\r\n .split('-')\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ')\r\n \r\n breadcrumbs.push({\r\n label,\r\n href: isLast ? undefined : currentPath,\r\n isCurrentPage: isLast\r\n })\r\n })\r\n \r\n return breadcrumbs\r\n }\r\n \r\n return generateBreadcrumbs()\r\n}","import React from 'react';\r\nimport { useAuth } from '../contexts/AuthContext';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card';\r\nimport { isDevEnvironment } from '../../config';\r\nimport { AuthService } from '../services/AuthService';\r\n\r\ninterface ProtectedRouteProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ children }) => {\r\n const { isAuthenticated, isLoading } = useAuth();\r\n\r\n // Loading durante inicialização\r\n if (isLoading) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Carregando...\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4\"></div>\r\n <p className=\"text-muted-foreground\">\r\n Verificando autenticação...\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n // Não autenticado - login automático\r\n if (!isAuthenticated) {\r\n // Verificar se já tem tokens na URL (evitar loop)\r\n const hasTokensInUrl = new URLSearchParams(window.location.search).has('access_token') ||\r\n new URLSearchParams(window.location.hash.substring(1)).has('access_token');\r\n if (hasTokensInUrl) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Processando...\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4\"></div>\r\n <p className=\"text-muted-foreground\">\r\n Processando tokens...\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n \r\n // Login automático baseado no ambiente\r\n React.useEffect(() => {\r\n const performAutoLogin = async () => {\r\n const isDev = isDevEnvironment();\r\n \r\n if (isDev) {\r\n // Em desenvolvimento: fazer login automático\r\n await AuthService.loginDev();\r\n } else {\r\n // Em produção: redirecionar para Qualiex\r\n AuthService.loginProd();\r\n }\r\n };\r\n \r\n performAutoLogin();\r\n }, []);\r\n \r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 to-secondary/5\">\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl font-semibold\">\r\n Iniciando...\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"text-center\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4\"></div>\r\n <p className=\"text-muted-foreground\">\r\n {isDevEnvironment() \r\n ? 'Fazendo login automático...' \r\n : 'Redirecionando para autenticação...'}\r\n </p>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n }\r\n\r\n return <>{children}</>;\r\n};","import { useToast } from \"../../hooks/use-toast\"\r\nimport {\r\n Toast,\r\n ToastClose,\r\n ToastDescription,\r\n ToastProvider,\r\n ToastTitle,\r\n ToastViewport,\r\n} from \"./toast\"\r\n\r\nexport function Toaster() {\r\n const { toasts } = useToast()\r\n\r\n return (\r\n <ToastProvider>\r\n {toasts.map(function ({ id, title, description, action, ...props }) {\r\n return (\r\n <Toast key={id} {...props}>\r\n <div className=\"grid gap-1\">\r\n {title && <ToastTitle>{title}</ToastTitle>}\r\n {description && (\r\n <ToastDescription>{description}</ToastDescription>\r\n )}\r\n </div>\r\n {action}\r\n <ToastClose />\r\n </Toast>\r\n )\r\n })}\r\n <ToastViewport />\r\n </ToastProvider>\r\n )\r\n}\r\n","import { QueryClient } from '@tanstack/react-query';\r\n\r\ninterface QualiexCoreConfig {\r\n supabase: {\r\n url: string;\r\n anonKey: string;\r\n };\r\n theme?: 'light' | 'dark' | 'system';\r\n queryClient?: QueryClient;\r\n}\r\n\r\nexport function setupQualiexCore(config: QualiexCoreConfig) {\r\n // Setup automático do pacote\r\n const queryClient = config.queryClient || new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n retry: 1,\r\n refetchOnWindowFocus: false,\r\n },\r\n },\r\n });\r\n\r\n return {\r\n queryClient,\r\n config\r\n };\r\n}","/**\r\n * Hook genérico para operações CRUD com React Query\r\n */\r\n\r\nimport { useCallback, useMemo } from 'react';\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { useSearchParams } from 'react-router-dom';\r\n\r\nimport { toast } from 'sonner';\r\nimport { CRUD_CONFIG, MESSAGES } from '../../config';\r\n\r\ninterface CrudService<T, TInsert = Partial<T>, TUpdate = Partial<T>> {\r\n getAll: (params: any) => Promise<any>;\r\n create: (data: TInsert) => Promise<T>;\r\n update: (id: string, data: TUpdate) => Promise<T>;\r\n delete: (id: string) => Promise<void>;\r\n}\r\n\r\ninterface CrudConfig<T, TInsert = Partial<T>, TUpdate = Partial<T>> {\r\n queryKey: string;\r\n service: CrudService<T, TInsert, TUpdate>;\r\n entityName: string;\r\n searchFields?: string[];\r\n additionalFilters?: Record<string, any>;\r\n onSuccess?: () => void; // ✅ Callback para fechar modal\r\n}\r\n\r\nexport function useCrud<T extends { id: string }, TInsert = Partial<T>, TUpdate = Partial<T>>({\r\n queryKey,\r\n service,\r\n entityName,\r\n searchFields,\r\n additionalFilters = {},\r\n onSuccess // ✅ Callback para fechar modal\r\n}: CrudConfig<T, TInsert, TUpdate>) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const queryClient = useQueryClient();\r\n \r\n // Extract state from URL params\r\n const searchTerm = searchParams.get('search') || '';\r\n const sortField = searchParams.get('sortField') || CRUD_CONFIG.sorting.defaultField;\r\n const sortDirection = (searchParams.get('sortDirection') as 'asc' | 'desc') || CRUD_CONFIG.sorting.defaultDirection;\r\n const page = parseInt(searchParams.get('page') || '1');\r\n const limit = parseInt(searchParams.get('limit') || String(CRUD_CONFIG.pagination.defaultPageSize));\r\n \r\n const debouncedSearch = searchTerm;\r\n \r\n // Build query params with memoization to prevent excessive re-renders\r\n const queryParams = useMemo(() => ({\r\n search: debouncedSearch,\r\n sortField,\r\n sortDirection,\r\n page,\r\n limit,\r\n ...additionalFilters,\r\n }), [debouncedSearch, sortField, sortDirection, page, limit, additionalFilters]);\r\n\r\n // Memoize query function to prevent unnecessary re-creation\r\n const queryFn = useCallback(() => service.getAll(queryParams), [service, queryParams]);\r\n \r\n // Data query\r\n const query = useQuery({\r\n queryKey: [queryKey, queryParams],\r\n queryFn,\r\n });\r\n\r\n // Mutations\r\n const createMutation = useMutation({\r\n mutationFn: service.create,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [queryKey] });\r\n toast.success(MESSAGES.success.created(entityName));\r\n onSuccess?.(); // ✅ Fechar modal após sucesso\r\n },\r\n onError: (error: any) => {\r\n toast.error(`${MESSAGES.error.create(entityName)}: ${error.message}`);\r\n },\r\n });\r\n\r\n const updateMutation = useMutation({\r\n mutationFn: ({ id, data }: { id: string; data: TUpdate }) => \r\n service.update(id, data),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [queryKey] });\r\n toast.success(MESSAGES.success.updated(entityName));\r\n onSuccess?.(); // ✅ Fechar modal após sucesso\r\n },\r\n onError: (error: any) => {\r\n toast.error(`${MESSAGES.error.update(entityName)}: ${error.message}`);\r\n },\r\n });\r\n\r\n const deleteMutation = useMutation({\r\n mutationFn: service.delete,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [queryKey] });\r\n toast.success(MESSAGES.success.deleted(entityName));\r\n },\r\n onError: (error: any) => {\r\n toast.error(`${MESSAGES.error.delete(entityName)}: ${error.message}`);\r\n },\r\n });\r\n\r\n // Update URL params helper\r\n const updateParams = useCallback((newParams: Record<string, string | number>) => {\r\n const current = Object.fromEntries(searchParams);\r\n const updated = { ...current };\r\n \r\n Object.entries(newParams).forEach(([key, value]) => {\r\n if (value === '' || value === 0) {\r\n delete updated[key];\r\n } else {\r\n updated[key] = String(value);\r\n }\r\n });\r\n \r\n setSearchParams(updated);\r\n }, [searchParams, setSearchParams]);\r\n\r\n // Handlers\r\n const handleSearch = useCallback((search: string) => {\r\n updateParams({ search, page: 1 });\r\n }, [updateParams]);\r\n\r\n const handleSort = useCallback((field: string) => {\r\n const newDirection = sortField === field && sortDirection === 'asc' ? 'desc' : 'asc';\r\n updateParams({ sortField: field, sortDirection: newDirection, page: 1 });\r\n }, [sortField, sortDirection, updateParams]);\r\n\r\n const handlePageChange = useCallback((newPage: number) => {\r\n updateParams({ page: newPage });\r\n }, [updateParams]);\r\n\r\n const handleLimitChange = useCallback((newLimit: number) => {\r\n updateParams({ limit: newLimit, page: 1 });\r\n }, [updateParams]);\r\n\r\n const clearFilters = useCallback(() => {\r\n setSearchParams({});\r\n }, [setSearchParams]);\r\n\r\n return {\r\n // Data\r\n entities: query.data?.data || [],\r\n pagination: {\r\n currentPage: query.data?.currentPage || 1,\r\n totalPages: query.data?.totalPages || 1,\r\n totalItems: query.data?.totalItems || 0,\r\n itemsPerPage: query.data?.itemsPerPage || CRUD_CONFIG.pagination.defaultPageSize,\r\n hasNextPage: query.data?.hasNextPage || false,\r\n hasPreviousPage: query.data?.hasPreviousPage || false,\r\n },\r\n \r\n // Loading states\r\n isLoading: query.isLoading,\r\n isCreating: createMutation.isPending,\r\n isUpdating: updateMutation.isPending,\r\n isDeleting: deleteMutation.isPending,\r\n \r\n // Error\r\n error: query.error,\r\n \r\n // Current state\r\n searchTerm,\r\n sortField,\r\n sortDirection,\r\n currentPage: page,\r\n itemsPerPage: limit,\r\n \r\n // Actions\r\n createEntity: createMutation.mutate,\r\n updateEntity: (id: string, data: TUpdate) => updateMutation.mutate({ id, data }),\r\n deleteEntity: deleteMutation.mutate,\r\n \r\n // Handlers\r\n handleSearch,\r\n handleSort,\r\n handlePageChange,\r\n handleItemsPerPageChange: handleLimitChange,\r\n clearFilters,\r\n refetch: query.refetch,\r\n };\r\n}"],"names":["process","env","NODE_ENV","React","require$$0","REACT_ELEMENT_TYPE","Symbol","for","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","iterator","ReactSharedInternals","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","error","format","_len2","arguments","length","args","Array","_key2","level","ReactDebugCurrentFrame","stack","getStackAddendum","concat","argsWithFormat","map","item","String","unshift","Function","prototype","apply","call","console","printWarning","REACT_MODULE_REFERENCE","getContextName","type","displayName","getComponentNameFromType","tag","name","$$typeof","_context","outerType","innerType","wrapperName","functionName","getWrappedName","render","outerName","lazyComponent","payload","_payload","init","_init","x","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","assign","Object","disabledDepth","disabledLog","__reactDisabledLog","prefix","ReactCurrentDispatcher","describeBuiltInComponentFrame","source","ownerFn","undefined","Error","match","trim","componentFrameCache","reentry","PossiblyWeakMap","WeakMap","Map","describeNativeComponentFrame","fn","construct","control","frame","get","previousDispatcher","previousPrepareStackTrace","prepareStackTrace","current","log","info","warn","group","groupCollapsed","groupEnd","props","configurable","enumerable","value","writable","defineProperties","disableLogs","Fake","defineProperty","set","Reflect","sample","sampleLines","split","controlLines","s","c","_frame","replace","includes","reenableLogs","syntheticFrame","describeUnknownElementTypeFrameInDEV","isReactComponent","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","_owner","_source","setExtraStackFrame","isArrayImpl","isArray","a","testStringCoercion","checkKeyStringCoercion","e","willCoercionThrow","toStringTag","constructor","typeName","specialPropKeyWarningShown","specialPropRefWarningShown","ReactCurrentOwner","RESERVED_PROPS","key","ref","__self","__source","jsxDEV","config","maybeKey","self","propName","getter","getOwnPropertyDescriptor","isReactWarning","hasValidKey","hasValidRef","warnIfStringRefCannotBeAutoConverted","defaultProps","warnAboutAccessingKey","defineKeyPropWarningGetter","warnAboutAccessingRef","defineRefPropWarningGetter","_store","freeze","ReactElement","propTypesMisspellWarningShown","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","isValidElement","object","getDeclarationErrorAddendum","ownerHasKeyUseWarning","validateExplicitKey","parentType","validated","currentComponentErrorInfo","parentName","getCurrentComponentErrorInfo","childOwner","validateChildKeys","node","i","child","iteratorFn","maybeIterable","maybeIterator","getIteratorFn","entries","step","next","done","validatePropTypes","propTypes","typeSpecs","values","location","componentName","has","bind","typeSpecName","error$1","err","ex","message","checkPropTypes","PropTypes","getDefaultProps","isReactClassApproved","didWarnAboutKeySpread","jsxWithValidation","isStaticChildren","validType","getModuleId","isValidElementType","keys","typeString","children","filter","k","beforeExample","join","fragment","validateFragmentProps","jsx","jsxs","reactJsxRuntime_development","Fragment","jsxRuntimeModule","exports","f","l","m","n","p","q","g","b","d","h","reactJsxRuntime_production_min","require$$1","cn","inputs","twMerge","clsx","trimTextFields","data","trimmed","buttonVariants","cva","variants","variant","default","destructive","outline","secondary","ghost","link","size","sm","lg","icon","defaultVariants","Button","forwardRef","className","asChild","Comp","Slot","AlertDialog","AlertDialogPrimitive","Root","AlertDialogTrigger","Trigger","AlertDialogPortal","Portal","AlertDialogOverlay","Overlay","AlertDialogContent","Content","AlertDialogHeader","AlertDialogFooter","AlertDialogTitle","Title","AlertDialogDescription","Description","AlertDialogAction","Action","AlertDialogCancel","Cancel","alertVariants","Alert","role","AlertTitle","AlertDescription","badgeVariants","success","warning","Badge","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbPage","BreadcrumbSeparator","ChevronRight","BreadcrumbEllipsis","MoreHorizontal","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Input","labelVariants","Label","LabelPrimitive","Popover","PopoverPrimitive","PopoverTrigger","PopoverContent","align","sideOffset","PRESET_COLORS","ColorPicker","onChange","label","style","backgroundColor","htmlFor","id","target","color","onClick","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","disabled","onSelect","CommandShortcut","DataList","Item","Field","DeleteConfirmationDialog","open","onOpenChange","onConfirm","entityName","isDeleting","confirmationText","setConfirmationText","useState","useEffect","handleCancel","isConfirmationValid","title","placeholder","Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","Close","DialogOverlay","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuGroup","Group","DropdownMenuPortal","DropdownMenuSub","Sub","DropdownMenuRadioGroup","RadioGroup","DropdownMenuSubTrigger","inset","SubTrigger","DropdownMenuSubContent","SubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","CheckboxItem","ItemIndicator","Check","DropdownMenuRadioItem","RadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","Separator","DropdownMenuShortcut","variantIcons","FileX","search","Search","AlertCircle","EmptyState","description","action","IconComponent","STORAGE_KEYS","TokenManager","setAccessToken","token","localStorage","setItem","getAccessToken","getItem","setIdToken","getIdToken","setSupabaseToken","getSupabaseToken","setOAuthState","state","sessionStorage","getOAuthState","clearOAuthState","removeItem","setOAuthNonce","nonce","getOAuthNonce","clearOAuthNonce","setSelectedAlias","alias","getSelectedAlias","clearSelectedAlias","generateOAuthState","generateOAuthNonce","randomBytes","Uint8Array","crypto","getRandomValues","btoa","fromCharCode","hasAllTokens","clearAll","isTokenExpired","JSON","parse","atob","exp","Date","now","isSupabaseTokenValid","getValidSupabaseToken","extractTokenData","user_alias","companyId","company_id","startsWith","test","coField","parts","count","toastTimeouts","addToRemoveQueue","toastId","timeout","setTimeout","delete","dispatch","reducer","toasts","toast","slice","t","forEach","listeners","memoryState","listener","Number","MAX_SAFE_INTEGER","toString","dismiss","update","useToast","setState","push","index","indexOf","splice","errorService","__publicField","this","handleError","showToast","errors","timestamp","shouldShowToast","lastToastTime","toastCount","getErrors","clearErrors","SUPABASE_URL","VITE_SUPABASE_URL","SUPABASE_PUBLISHABLE_KEY","VITE_SUPABASE_PUBLISHABLE_KEY","_SupabaseSingleton","instanceCount","client","createClientWithToken","headers","apikey","isTokenValid","createClient","auth","persistSession","autoRefreshToken","global","getInstance","instance","getClient","currentToken","Math","floor","SupabaseSingleton","getSupabaseClient","AUTH_CONFIG","oauth","authUrl","VITE_OAUTH_AUTH_URL","clientId","VITE_OAUTH_CLIENT_ID","responseType","scope","CRUD_CONFIG","pagination","defaultPageSize","pageSizeOptions","sorting","defaultField","defaultDirection","SEARCH_CONFIG","debounceDelay","isDevEnvironment","origin","window","DEV","MESSAGES","created","entity","updated","deleted","create","load","AuthService","initialize","isAuthenticated","isLoading","user","companies","storedAccessToken","storedIdToken","extractUserFromIdToken","extractCompaniesFromIdToken","defaultAlias","extractAliasFromAccessToken","storedSelectedAlias","selectedAlias","some","newSupabaseToken","generateSupabaseToken","loginDev","supabase","functions","invoke","body","environment","access_token","id_token","callbackUrl","URL","hash","href","loginProd","redirectUri","searchParams","processCallback","storedAccess","aliasFromAccess","aliasFallback","supa","hashParams","URLSearchParams","substring","getParam","accessToken","idToken","supabaseToken","firstAlias","logout","decodeToken","decoded","bytes","charCodeAt","utf8String","TextDecoder","decode","subNewId","email","identifier","AuthContext","createContext","useAuth","context","useContext","FeedbackDialog","setOpen","selectedUnit","find","company","feedbackUrl","VITE_FEEDBACK_APP_URL","module","buildFeedbackUrl","TriggerButton","MessageCircle","src","width","height","loading","Form","FormProvider","FormFieldContext","useFormField","fieldContext","itemContext","FormItemContext","getFieldState","formState","useFormContext","fieldState","formItemId","formDescriptionId","formMessageId","FormItem","useId","Provider","FormLabel","FormControl","FormDescription","FormMessage","colsClasses","gapClasses","xs","md","xl","Grid","cols","gap","ScrollArea","ScrollAreaPrimitive","Viewport","ScrollBar","Corner","orientation","ScrollAreaScrollbar","ScrollAreaThumb","ICONS","Star","Heart","Home","User","Settings","Mail","Phone","Calendar","MapPin","Camera","Image","Music","Video","Book","Bookmark","Filter","Edit","Trash2","Plus","Minus","ChevronDown","ChevronUp","ChevronLeft","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Clock","Bell","Info","HelpCircle","Download","Upload","Share","Copy","Save","FileText","Folder","FolderOpen","Archive","Lock","Unlock","Eye","EyeOff","Shield","Key","Zap","Flame","Sparkles","Award","Trophy","Target","IconPicker","searchTerm","setSearchTerm","filteredIcons","toLowerCase","SelectedIcon","InputOTP","containerClassName","OTPInput","InputOTPGroup","InputOTPSlot","inputOTPContext","OTPInputContext","char","hasFakeCaret","isActive","slots","InputOTPSeparator","Dot","sizeClasses","Spinner","Loader2","Pagination","PaginationContent","PaginationItem","PaginationLink","PaginationPrevious","PaginationNext","PaginationEllipsis","Select","SelectPrimitive","SelectGroup","SelectValue","Value","SelectTrigger","Icon","SelectScrollUpButton","ScrollUpButton","SelectScrollDownButton","ScrollDownButton","SelectContent","position","SelectLabel","SelectItem","ItemText","SelectSeparator","decorative","SeparatorPrimitive","Sheet","SheetPrimitive","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","sheetVariants","side","top","bottom","left","right","SheetContent","SheetHeader","SheetFooter","SheetTitle","SheetDescription","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","SIDEBAR_STORAGE_KEY","SidebarContext","useSidebar","SidebarProvider","defaultOpen","openProp","setOpenProp","isMobile","setIsMobile","checkMobile","innerWidth","addEventListener","removeEventListener","openMobile","setOpenMobile","_open","_setOpen","stored","useCallback","openState","toggleSidebar","handleKeyDown","event","metaKey","ctrlKey","preventDefault","contextValue","useMemo","delayDuration","Sidebar","collapsible","SidebarTrigger","PanelLeft","SidebarRail","tabIndex","SidebarInset","SidebarInput","SidebarHeader","SidebarFooter","SidebarSeparator","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarGroupAction","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","SidebarMenuButton","tooltip","button","hidden","SidebarMenuAction","showOnHover","SidebarMenuBadge","SidebarMenuSkeleton","showIcon","random","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton","Skeleton","TableSkeleton","rows","columns","from","_","j","CardSkeleton","alignClasses","start","center","end","stretch","justifyClasses","between","around","evenly","Stack","direction","justify","wrap","Table","TableHeader","TableBody","TableRow","TableHead","TableCell","TableCaption","Textarea","ToastProvider","ToastPrimitives","ToastViewport","toastVariants","Toast","ToastAction","ToastClose","ToastTitle","ToastDescription","NavigationContext","NavigationProvider","navigation","useNavigation","usePageTitle","useLocation","currentRoute","path","pathname","UserInfo","memo","propSelectedUnit","onUnitChange","switchUnit","defaultCompany","authSelectedUnit","availableUnits","currentUnit","handleUnitChange","unit","uniqueSortedUnits","uniqueUnitsMap","uniqueUnits","currentUnitInList","otherUnits","sort","localeCompare","sensitivity","UserContent","Building2","RefreshCw","LogOut","useDebounce","delay","debouncedValue","setDebouncedValue","timeoutRef","useRef","cancel","clearTimeout","AppHeader","actions","pageTitle","isSearchVisible","clearSearch","refreshData","setSearchParams","useSearchParams","inputValue","setInputValue","debouncedSearchValue","cancelDebounce","newParams","handleSearchChange","useActiveModules","options","enabled","useQuery","queryKey","queryFn","async","schema","select","eq","order","DEFAULT_SUPABASE_PROJECT_ID","VITE_SUPABASE_PROJECT_ID","assets","logo","smallLogo","logoSrc","smallLogoSrc","AppSidebar","dropdownOpen","setDropdownOpen","modules","getColorVariant","colors","appName","moduleUrl","url","handleModuleClick","ExternalLink","alt","Link","to","ErrorBoundary","Component","super","hasError","getDerivedStateFromError","componentDidCatch","errorInfo","fallback","AlertTriangle","reload","useBaseForm","fields","initialData","onFormDataChange","formData","setFormData","setErrors","memoizedFields","isValidDate","isNaN","getTime","getDefaultFieldValue","field","defaultValue","calculateComputedValue","currentFormData","computedValue","validateField","required","validation","validator","custom","result","getAllFields","fieldList","allFields","newFormData","fieldValue","date","toISOString","validateForm","newErrors","updateField","fieldName","prevData","newData","updatedData","changedFieldName","dependsOn","updateDependentFields","prevErrors","handleSubmit","onSubmit","stopPropagation","qualiexApi","VITE_QUALIEX_API_URL","makeApiCall","endpoint","params","baseUrl","append","response","fetch","method","Authorization","Accept","ok","status","statusText","json","mapToQualiexUser","userData","userId","ID","userName","userEmail","fetchUsers","filterStatus","fetchUserById","getUsers","tokenData","useQualiexUsers","companyAlias","retry","retryDelay","QualiexUserField","users","onValueChange","QualiexResponsibleSelectField","BaseForm","sections","onCancel","submitButtonText","usersData","activeSection","setActiveSection","flatMap","section","availableSections","condition","validActiveSection","currentSection","firstAvailable","renderField","rawValue","layout","subField","newValue","option","selectedResponsible","iconName","min","readOnly","renderSectionContent","fill","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","component","SectionComponent","formContent","sectionId","handleSectionChange","buildFormatLongFn","defaultWidth","formats","buildLocalizeFn","valuesArray","formattingValues","defaultFormattingWidth","argumentCallback","buildMatchFn","string","matchPattern","matchPatterns","defaultMatchWidth","matchResult","matchedString","parsePatterns","defaultParseWidth","array","predicate","findIndex","pattern","findKey","valueCallback","rest","formatDistanceLocale","lessThanXSeconds","one","other","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","formatLong","full","long","medium","short","time","dateTime","formatRelativeLocale","lastWeek","weekday","getDay","yesterday","today","tomorrow","nextWeek","ptBR","code","formatDistance","tokenValue","addSuffix","comparison","formatRelative","_baseDate","_options","localize","ordinalNumber","dirtyNumber","number","era","narrow","abbreviated","wide","quarter","month","day","dayPeriod","am","pm","midnight","noon","morning","afternoon","evening","night","parsePattern","parseInt","parseResult","any","weekStartsOn","firstWeekContainsDate","ActionMenuItems","onEdit","onDelete","onToggleStatus","canDelete","renderAs","items","editItem","toggleItem","PowerOff","Power","deleteItem","TableRowActions","EllipsisVertical","CrudTable","manager","onView","renderActions","contextMenu","setContextMenu","handleClickOutside","document","columnWidths","totalMinWidth","columnConfigs","column","calculatedWidth","isFixed","minWidth","weight","calculateColumnWidths","entities","onContextMenu","clientX","y","clientY","header","is_actived","sortable","handleSort","columnKey","sortField","ArrowUpDown","sortDirection","CrudForm","TableFooter","totalItems","totalPages","currentPage","itemsPerPage","handlePageChange","handleItemsPerPageChange","startItem","endItem","ChevronsLeft","max","ChevronsRight","CrudPage","formSections","onSave","FormComponent","TableComponent","isFormOpen","setIsFormOpen","editingEntity","setEditingEntity","deleteConfirmation","setDeleteConfirmation","isOpen","entityId","handleEdit","handleSaveWithClose","handleDeleteClick","deleteEntity","QualiexEnrichmentService","enrichWithResponsibleNames","responsible_name","id_user","qualiexUsers","entitiesWithResponsibleNames","responsibleUser","VIRTUAL_FIELDS","sidebar","sidebarConfig","showHeader","sidebarComponent","authState","setAuthState","queryClient","useQueryClient","setIsSearchVisible","refreshTrigger","setRefreshTrigger","updateAuthState","newState","prev","setLoading","resetAuthState","invalidateQueries","clear","setSearchVisible","visible","Promise","resolve","authResult","initializeAuth","setError","isRetrying","setIsRetrying","history","replaceState","returnUrl","handleCallback","handleRetry","handleGoHome","created_at","locale","newWindow","closed","navigator","clipboard","writeText","handleExternalLink","cardFields","filters","hasActiveFilters","handleSearch","CustomComponent","clearFilters","Controller","editTitle","transformData","processedData","maxItems","displayItems","hasCollapsed","isLast","showEllipsis","isCurrentPage","performAutoLogin","crud","list","detail","searchFields","schemaName","tableName","configSearchFields","configSchemaName","enableQualiexEnrichment","createQuery","getAll","page","limit","additionalFilters","query","in","operator","not","searchConditions","or","buildSearchQuery","ascending","range","buildPaginatedQuery","ceil","hasNextPage","hasPreviousPage","createPaginatedResponse","largeParams","largeResponse","sortedData","aValue","bValue","sortData","paginatedResult","startIndex","endIndex","paginatedData","totalCount","paginateData","enrichedData","getById","maybeSingle","trimmedPayload","cleanPayload","reduce","acc","insert","single","updateData","updated_at","is_removed","func","wait","dateString","parseISO","isValid","toLocaleDateString","year","toLocaleTimeString","hour","minute","QueryClient","defaultOptions","queries","refetchOnWindowFocus","service","onSuccess","debouncedSearch","queryParams","createMutation","useMutation","mutationFn","onError","updateMutation","deleteMutation","updateParams","fromEntries","newPage","handleLimitChange","newLimit","isCreating","isPending","isUpdating","createEntity","mutate","updateEntity","refetch","pathSegments","Boolean","breadcrumbs","currentPath","segment","word","charAt","toUpperCase","generateBreadcrumbs"],"mappings":"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","x_google_ignoreList":[0,1,2,61,62,63,64,65,66,67,68,69,70]}