@tree-ia/design-system 1.3.0 → 1.3.1

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.d.mts CHANGED
@@ -744,6 +744,8 @@ interface AuthLink {
744
744
  label: string;
745
745
  /** URL or click handler */
746
746
  href?: string;
747
+ /** Link target (e.g., '_blank' for new tab) */
748
+ target?: string;
747
749
  /** Custom click handler (takes precedence over href) */
748
750
  onClick?: () => void;
749
751
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/components/Dropdown/index.tsx","../src/components/Table/index.tsx","../src/components/Modal/index.tsx","../src/components/Card/index.tsx","../src/components/Toast/index.tsx","../src/components/Loading/index.tsx","../src/components/Pagination/index.tsx","../src/components/FormField/index.tsx","../src/components/Tabs/index.tsx","../src/components/DateRangePicker/index.tsx","../src/components/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/index.tsx","../src/components/ThemeSwitcher/index.tsx","../src/components/KPICard/index.tsx","../src/components/PageLayout/index.tsx","../src/components/ComparisonLineChart/index.tsx","../src/components/HorizontalBarChart/index.tsx","../src/components/VerticalBarChart/index.tsx","../src/components/ProgressBarList/index.tsx","../src/components/MetricPanel/index.tsx","../src/components/FilterBar/index.tsx","../src/components/AuthLayout/index.tsx","../src/components/CodeInput/index.tsx","../src/components/Checkbox/index.tsx","../src/config/types.ts","../src/providers/DashboardProvider.tsx","../src/providers/ThemeProvider.tsx","../src/providers/LoadingProvider.tsx","../src/providers/NotificationsProvider.tsx","../src/hooks/useTheme.ts","../src/hooks/useConfig.ts","../src/hooks/useLoading.ts","../src/hooks/useNotifications.ts","../src/config/createConfig.ts","../src/config/defaults.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/components/Dropdown/index.tsx","../src/components/Table/index.tsx","../src/components/Modal/index.tsx","../src/components/Card/index.tsx","../src/components/Toast/index.tsx","../src/components/Loading/index.tsx","../src/components/Pagination/index.tsx","../src/components/FormField/index.tsx","../src/components/Tabs/index.tsx","../src/components/DateRangePicker/index.tsx","../src/components/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/index.tsx","../src/components/ThemeSwitcher/index.tsx","../src/components/KPICard/index.tsx","../src/components/PageLayout/index.tsx","../src/components/ComparisonLineChart/index.tsx","../src/components/HorizontalBarChart/index.tsx","../src/components/VerticalBarChart/index.tsx","../src/components/ProgressBarList/index.tsx","../src/components/MetricPanel/index.tsx","../src/components/FilterBar/index.tsx","../src/components/AuthLayout/index.tsx","../src/components/CodeInput/index.tsx","../src/components/Checkbox/index.tsx","../src/config/types.ts","../src/providers/DashboardProvider.tsx","../src/providers/ThemeProvider.tsx","../src/providers/LoadingProvider.tsx","../src/providers/NotificationsProvider.tsx","../src/hooks/useTheme.ts","../src/hooks/useConfig.ts","../src/hooks/useLoading.ts","../src/hooks/useNotifications.ts","../src/config/createConfig.ts","../src/config/defaults.ts"],"mappings":";;;;UAGiB,WAAA,SAAoB,KAAA,CAAM,oBAAA,CAAqB,iBAAA;EAC9D,OAAA;EACA,IAAA;EACA,SAAA;EACA,IAAA,GAAO,KAAA,CAAM,SAAA;EACb,YAAA;AAAA;AAAA,iBAMc,MAAA,CAAA;EACd,QAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;EACA,IAAA;EACA,YAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,WAAA,GAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCpBG,UAAA,SAAmB,KAAA,CAAM,mBAAA,CAAoB,gBAAA;EAC5D,KAAA;EACA,KAAA;EACA,QAAA,GAAW,SAAA;AAAA;AAAA,cAMA,KAAA,EAAK,KAAA,CAAA,yBAAA,CAAA,UAAA,GAAA,KAAA,CAAA,aAAA,CAAA,gBAAA;;;UCPD,cAAA;EACf,KAAA;EACA,KAAA;EACA,KAAA;EACA,eAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA,EAAS,cAAA;EACT,KAAA;EACA,QAAA,GAAW,KAAA;EACX,KAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA;EACA,kBAAA;EACA,SAAA;EACA,IAAA;EACA,KAAA;EACA,OAAA;EACA,oBAAA;EACA,IAAA,GAAO,KAAA,CAAM,SAAA;EACb,UAAA;EACA,QAAA;AAAA;AAAA,iBAGc,QAAA,CAAA;EACd,OAAA;EACA,KAAA;EACA,QAAA;EACA,KAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA;EACA,kBAAA;EACA,SAAA;EACA,IAAA;EACA,KAAA;EACA,OAAA;EACA,oBAAA;EACA,IAAA;EACA,UAAA;EACA;AAAA,GACC,aAAA,GAAa,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC9CC,WAAA;EACf,GAAA;EACA,MAAA;EACA,MAAA,GAAS,IAAA,EAAM,CAAA,KAAM,SAAA;EACrB,KAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,UAGe,UAAA;EACf,OAAA,EAAS,WAAA,CAAY,CAAA;EACrB,IAAA,EAAM,CAAA;EACN,UAAA,IAAc,IAAA,EAAM,CAAA;EACpB,SAAA;EACA,YAAA;EACA,SAAA,GAAY,SAAA;EACZ,gBAAA,GAAmB,SAAA;EACnB,cAAA,GAAiB,SAAA;EACjB,YAAA,GAAe,IAAA,EAAM,CAAA;EACrB,SAAA;AAAA;AAAA,iBAGc,KAAA,GAAA,CAAA;EACd,OAAA;EACA,IAAA;EACA,UAAA;EACA,SAAA;EACA,YAAA;EACA,SAAA;EACA,gBAAA;EACA,cAAA;EACA,YAAA;EACA;AAAA,GACC,UAAA,CAAW,CAAA,IAAE,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA8BA,WAAA,GAAA,CAAA;EAAiB;AAAA;EAAa,OAAA,EAAS,WAAA,CAAY,CAAA;AAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA2BzD,SAAA,GAAA,CAAA;EACd,OAAA;EACA,IAAA;EACA,UAAA;EACA;AAAA;EAEA,OAAA,EAAS,WAAA,CAAY,CAAA;EACrB,IAAA,EAAM,CAAA;EACN,UAAA,IAAc,IAAA,EAAM,CAAA;EACpB,YAAA,GAAe,IAAA,EAAM,CAAA;AAAA,IACtB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAgCe,aAAA,CAAA,GAAa,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAUb,UAAA,CAAA;EACd,OAAA;EACA;AAAA;EAEA,OAAA;EACA,IAAA,GAAO,SAAA;AAAA,IACR,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCjJgB,UAAA;EACf,MAAA;EACA,OAAA;EACA,MAAA;EACA,KAAA;EACA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,UAAA;EACA,cAAA;EACA,gBAAA;EACA,IAAA;EACA,iBAAA;EACA,iBAAA;EACA,aAAA;EACA,mBAAA;AAAA;AAAA,iBAGc,KAAA,CAAA;EACd,MAAA;EACA,OAAA;EACA,MAAA;EACA,KAAA;EACA,QAAA;EACA,UAAA;EACA,cAAA;EACA,gBAAA;EACA,IAAA;EACA,iBAAA;EACA,iBAAA;EACA,aAAA;EACA;AAAA,GACC,UAAA,GAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UClCI,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,SAAA;EACA,KAAA;EACA,QAAA;EACA,IAAA,GAAO,KAAA,CAAM,SAAA;EACb,aAAA,GAAgB,KAAA,CAAM,SAAA;EACtB,WAAA;AAAA;AAAA,iBAGc,IAAA,CAAA;EACd,QAAA;EACA,SAAA;EACA,KAAA;EACA,QAAA;EACA,IAAA;EACA,aAAA;EACA;AAAA,GACC,SAAA,GAAS,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCfK,UAAA;EACf,KAAA;EACA,QAAA;EACA,IAAA;EACA,QAAA;EACA,OAAA;EACA,YAAA;AAAA;AAAA,iBAsBc,KAAA,CAAA;EACd,KAAA;EACA,QAAA;EACA,IAAA;EACA,QAAA;EACA,OAAA;EACA;AAAA,GACC,UAAA,GAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCtCI,YAAA;EACf,IAAA;EACA,SAAA;EACA,IAAA;EACA,SAAA;EACA,KAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,iBASc,OAAA,CAAA;EACd,IAAA;EACA,SAAA;EACA,IAAA;EACA,SAAA;EACA,KAAA;EACA,OAAA;EACA;AAAA,GACC,YAAA,GAAY,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCdE,eAAA;EACf,WAAA;EACA,UAAA;EACA,YAAA,GAAe,IAAA;EACf,YAAA;EACA,UAAA;EACA,oBAAA,IAAwB,YAAA;EACxB,mBAAA;EACA,YAAA;EACA,OAAA;EACA,SAAA;AAAA;AAAA,iBAGc,UAAA,CAAA;EACd,WAAA;EACA,UAAA;EACA,YAAA;EACA,YAAA;EACA,UAAA;EACA,oBAAA;EACA,mBAAA;EACA,YAAA;EACA,OAAA;EACA;AAAA,GACC,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCjCD,cAAA;EACf,KAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;EACA,QAAA,GAAW,KAAA;EACX,KAAA;EACA,QAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,iBAGc,SAAA,CAAA;EACd,KAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;EACA,QAAA;EACA,KAAA;EACA,QAAA;EACA,WAAA;EACA,QAAA;EACA;AAAA,GACC,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCzBA,GAAA;EACf,EAAA;EACA,KAAA;EACA,KAAA;EACA,IAAA,GAAO,SAAA;AAAA;AAAA,UAGQ,SAAA;EACf,IAAA,EAAM,GAAA;EACN,SAAA;EACA,QAAA,GAAW,KAAA;EVTkD;EUW7D,OAAA;EACA,SAAA;AAAA;AAAA,iBAMc,IAAA,CAAA;EAAO,IAAA;EAAM,SAAA;EAAW,QAAA;EAAU,OAAA;EAAuB;AAAA,GAAa,SAAA,GAAS,kBAAA,CAAA,GAAA,CAAA,OAAA;;;KChBnF,SAAA;EACV,KAAA,EAAO,IAAA;EACP,GAAA,EAAK,IAAA;AAAA;AAAA,UAGU,oBAAA;EACf,KAAA,EAAO,SAAA;EACP,QAAA,GAAW,KAAA,EAAO,SAAA;EAClB,MAAA;EACA,SAAA;AAAA;AAAA,iBA2Bc,eAAA,CAAA;EACd,KAAA;EACA,QAAA;EACA,MAAA;EACA;AAAA,GACC,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC5CN,UAAA,SAAmB,KAAA,CAAM,cAAA,CAAe,kBAAA;EACvD,KAAA;EACA,IAAA;EACA,MAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,iBAuCc,KAAA,CAAA;EACd,QAAA;EACA,KAAA;EACA,IAAA;EACA,MAAA;EACA,KAAA;EACA,KAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,UAAA,GAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCrDI,iBAAA;EACf,OAAA;EACA,QAAA,GAAW,OAAA;EACX,QAAA;EACA,IAAA;EACA,KAAA;EACA,SAAA;AAAA;AAAA,iBA2Bc,YAAA,CAAA;EACd,OAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,KAAA;EACA;AAAA,GACC,iBAAA,GAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCxCH,gBAAA;EACf,KAAA;EACA,OAAA;EACA,KAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;AAAA;AAAA,iBAkCc,WAAA,CAAA;EACd,KAAA;EACA,OAAA;EACA,KAAA;EACA,OAAA;EACA,IAAA;EACA;AAAA,GACC,gBAAA,GAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC5CF,eAAA;EACf,EAAA;EACA,KAAA;EACA,IAAA;EACA,IAAA,EAAM,KAAA,CAAM,aAAA;IAAgB,IAAA;IAAe,SAAA;IAAoB,KAAA,GAAQ,KAAA,CAAM,aAAA;EAAA;AAAA;AAAA,UAG9D,WAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,UAGe,YAAA;EACf,SAAA,EAAW,eAAA;EACX,IAAA,EAAM,SAAA;EACN,aAAA,GAAgB,SAAA;EAChB,WAAA;EACA,aAAA,GAAgB,KAAA,CAAM,aAAA;IACpB,IAAA;IACA,SAAA;IACA,QAAA,EAAU,SAAA;EAAA;EAEZ,WAAA;EACA,gBAAA;EACA,IAAA,GAAO,WAAA;EACP,WAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,iBAsBc,OAAA,CAAA;EACd,SAAA;EACA,IAAA;EACA,aAAA;EACA,WAAA;EACA,aAAA,EAAe,aAAA;EACf,WAAA;EACA,gBAAA;EACA,IAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA;EACA;AAAA,GACC,YAAA,GAAY,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC/DE,kBAAA;EACf,SAAA;AAAA;AAAA,iBAMc,aAAA,CAAA;EAAgB;AAAA,GAAa,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;KCTnD,cAAA;AAAA,UAEK,YAAA;EACf,KAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA,MAAA,GAAS,cAAA;EACT,SAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,iBAwCc,OAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA,MAAA;EACA,SAAA;EACA,SAAA;EACA;AAAA,GACC,YAAA,GAAY,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC3DE,eAAA;;EAEf,KAAA;ElBHe;EkBKf,WAAA;;EAEA,aAAA,GAAgB,SAAA;ElBHT;EkBKP,QAAA,EAAU,SAAA;ElBTmD;EkBW7D,cAAA;ElBXmC;EkBanC,OAAA,GAAU,SAAA;ElBboD;EkBe9D,gBAAA;ElBbA;EkBeA,YAAA;ElBbA;EkBeA,qBAAA;EACA,SAAA;AAAA;AAAA,iBAMc,UAAA,CAAA;EACd,KAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA;EACA,cAAA;EACA,OAAA;EACA,gBAAA;EACA,YAAA;EACA,qBAAA;EACA;AAAA,GACC,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCbD,wBAAA;;EAEf,MAAA;;EAEA,iBAAA;EnB5B2B;EmB8B3B,kBAAA;EnB9B8D;EmBgC9D,kBAAA;EnBhCmC;EmBkCnC,mBAAA;EnBlC6D;EmBoC7D,KAAA;EnBpCyC;EmBsCzC,KAAA;EnBrCA;EmBuCA,MAAA;EACA,SAAA;AAAA;AAAA,iBAMc,mBAAA,CAAA;EACd,MAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;EACA,mBAAA;EACA,KAAA;EACA,KAAA;EACA,MAAA;EACA;AAAA,GACC,wBAAA,GAAwB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCrCV,qBAAA;EACf,EAAA;EACA,KAAA;AAAA;AAAA,UAGe,uBAAA;;EAEf,MAAA;EpBvBO;EoByBP,QAAA,EAAU,MAAA;EpB7BmD;EoB+B7D,IAAA,GAAO,qBAAA;EpB/B4B;EoBiCnC,KAAA;EpBjC8D;EoBmC9D,SAAA,GAAY,KAAA,CAAM,SAAA;EpBjClB;EoBmCA,KAAA;EpBjCA;EoBmCA,UAAA;EpBnCa;EoBqCb,kBAAA;EpBpCY;EoBsCZ,aAAA;EACA,SAAA;AAAA;AAAA,iBAMc,kBAAA,CAAA;EACd,MAAA;EACA,QAAA;EACA,IAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA,UAAA;EACA,kBAAA;EACA,aAAA;EACA;AAAA,GACC,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCzCT,qBAAA;;EAEf,MAAA;ErBtBe;EqBwBf,IAAA;;EAEA,KAAA;ErBtBO;EqBwBP,SAAA,GAAY,KAAA,CAAM,SAAA;ErB5B2C;EqB8B7D,KAAA;ErB9BmC;EqBgCnC,UAAA;ErBhC8D;EqBkC9D,kBAAA;ErBhCA;EqBkCA,aAAA;ErBhCA;EqBkCA,aAAA;EACA,SAAA;AAAA;AAAA,iBAMc,gBAAA,CAAA;EACd,MAAA;EACA,IAAA,EAAM,MAAA;EACN,KAAA;EACA,SAAA;EACA,KAAA;EACA,UAAA;EACA,kBAAA;EACA,aAAA;EACA,aAAA;EACA;AAAA,GACC,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCvDP,mBAAA;;EAEf,KAAA;EtBHe;EsBKf,KAAA;;EAEA,IAAA,GAAO,SAAA;AAAA;AAAA,UAGQ,oBAAA;EtBV8C;EsBY7D,KAAA,EAAO,mBAAA;EtBZ4B;EsBcnC,KAAA;EtBd8D;EsBgB9D,SAAA,GAAY,SAAA;EtBdZ;EsBgBA,KAAA;EtBdA;EsBgBA,UAAA;EtBhBa;EsBkBb,kBAAA;EtBjBY;EsBmBZ,WAAA;EtBbc;EsBed,WAAA,IAAe,KAAA;EACf,SAAA;AAAA;AAAA,iBAMc,eAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;EACA,WAAA;EACA;AAAA,GACC,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UChBN,iBAAA;;EAEf,GAAA;EvB7B2B;EuB+B3B,KAAA;EvB/B8D;EuBiC9D,IAAA,EAAM,KAAA,CAAM,aAAA;IAAgB,SAAA;EAAA;EvBjCiC;EuBmC7D,YAAA;EvBnCyC;EuBqCzC,aAAA;EvBpCA;EuBsCA,MAAA,EAAQ,cAAA;EvBpCR;EuBsCA,IAAA;EvBrCO;EuBuCP,QAAA;IACE,OAAA;IACA,QAAA;IACA,SAAA;IACA,KAAA;EAAA;AAAA;AAAA,UAIa,oBAAA;EACf,MAAA;EACA,OAAA,EAAS,MAAA;IAEL,aAAA;IAAyB,cAAA;EAAA;AAAA;AAAA,UAId,gBAAA;EvBtCd;EuBwCD,KAAA;EvBxCY;EuB0CZ,SAAA,EAAW,KAAA,CAAM,aAAA;IAAgB,SAAA;EAAA;EvBlDjC;EuBoDA,OAAA,EAAS,iBAAA;EvBnDT;EuBqDA,SAAA,EAAW,oBAAA;EvBpDX;EuBsDA,KAAA;EvBrDA;EuBuDA,cAAA;EvBtDA;EuBwDA,aAAA;EvBvDA;EuByDA,WAAA;EvBxDA;EuB0DA,SAAA;EACA,SAAA;AAAA;AAAA,iBAMc,WAAA,CAAA;EACd,KAAA;EACA,SAAA,EAAW,SAAA;EACX,OAAA;EACA,SAAA;EACA,KAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;EACA,SAAA;EACA;AAAA,GACC,gBAAA,GAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC9FF,cAAA;;EAEf,WAAA;ExBHe;EwBKf,cAAA,IAAkB,KAAA;;EAElB,iBAAA;ExBHO;EwBKP,QAAA,GAAW,SAAA;ExBTkD;EwBW7D,OAAA,GAAU,SAAA;EACV,SAAA;AAAA;AAAA,iBAMc,SAAA,CAAA;EACd,WAAA;EACA,cAAA;EACA,iBAAA;EACA,QAAA;EACA,OAAA;EACA;AAAA,GACC,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCnBA,SAAA;;EAEf,IAAA;EzBRe;EyBUf,KAAA;;EAEA,IAAA;EzBRO;EyBUP,WAAA;EzBd6D;EyBgB7D,QAAA;EzBhBmC;EyBkBnC,SAAA;EzBlB8D;EyBoB9D,KAAA;AAAA;AAAA,UAGe,QAAA;EzBnBf;EyBqBA,KAAA;EzBrBa;EyBuBb,IAAA;EzBtBY;EyBwBZ,MAAA;EzBlBc;EyBoBd,OAAA;AAAA;AAAA,UAGe,YAAA;EzBrBf;EyBuBA,IAAA;EzBrBA;EyBuBA,KAAA;EzBrBA;EyBuBA,OAAA;EzBrBA;EyBuBA,QAAA,IAAY,OAAA;AAAA;AAAA,UAGG,cAAA;EzBxBH;EyB0BZ,KAAA;EzBnCA;EyBqCA,KAAA;EzBpCA;EyBsCA,YAAA,GAAe,SAAA;EzBrCf;EyBuCA,cAAA;EzBtCA;EyBwCA,KAAA,GAAQ,KAAA,CAAM,aAAA;AAAA;AAAA,UAGC,YAAA;EzBzCf;EyB2CA,IAAA;EzB1CA;EyB4CA,SAAA;EzB3CA;EyB6CA,KAAA;EzB3CC;EyB6CD,cAAA;AAAA;AAAA,UAGe,YAAA;EzBhDH;EyBkDZ,KAAA,EAAO,SAAA;AAAA;AAAA,UAGQ,aAAA;ExBzEA;EwB2Ef,UAAA;;EAEA,YAAA;ExB1EW;EwB4EX,MAAA;ExB/E2D;EwBiF3D,QAAA;ExBjFkC;EwBmFlC,OAAA;ExBnF4D;EwBqF5D,MAAA;AAAA;AAAA,UAGe,eAAA;ExBrFJ;EwBwFX,IAAA,GAAO,SAAA;ExBxFa;EwB0FpB,KAAA;ExB/CD;EwBiDC,QAAA,GAAW,SAAA;ExBtFK;EwBwFhB,KAAA;ExBxFgB;EwB0FhB,OAAA;ExB1FgB;EwB8FhB,MAAA,EAAQ,SAAA;ExB9FQ;EwBgGhB,MAAA,EAAQ,MAAA;ExBhGQ;EwBkGhB,aAAA,GAAgB,IAAA,UAAc,KAAA;ExBlGd;EwBoGhB,QAAA,GAAW,MAAA,EAAQ,MAAA;ExBpGH;EwBsGhB,WAAA;;EAEA,YAAA;;EAEA,SAAA;EvBjH6B;EuBmH7B,QAAA,GAAW,YAAA;EvBnHkB;EuBuH7B,WAAA,GAAc,QAAA;EvBrHd;EuBuHA,aAAA,GAAgB,QAAA;IAAa,MAAA;EAAA;EvBrHd;EuByHf,YAAA,GAAe,SAAA;EvBtHa;EuBwH5B,aAAA,GAAgB,SAAA;EvB1GM;EuB4GtB,mBAAA,GAAsB,SAAA;EvBzHb;EuB2HT,aAAA,GAAgB,SAAA;EvBzHhB;EuB6HA,QAAA,GAAW,YAAA;EvB5HX;EuB8HA,QAAA,GAAW,YAAA;EvB5HX;EuB8HA,YAAA;EvB5HA;EuB8HA,eAAA;EvB5HA;EuBgIA,UAAA,GAAa,cAAA;EvB9Hb;EuBgIA,SAAA,GAAY,aAAA;EvB9HZ;EuBgIA,YAAA;EvBhIa;EuBkIb,UAAA;EvBhIA;EuBkIA,UAAA;EvBlIQ;EuBqIR,SAAA;AAAA;AAAA,iBAgPc,UAAA,CAAA;EACd,IAAA;EACA,KAAA;EACA,QAAA;EACA,KAAA;EACA,OAAA;EACA,MAAA;EACA,MAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,YAAA;EACA,SAAA;EACA,QAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,aAAA;EACA,QAAA;EACA,QAAA;EACA,YAAA;EACA,eAAA;EACA,UAAA;EACA,SAAA;EACA,YAAA;EACA,UAAA;EACA,UAAA;EACA;AAAA,GACC,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCxaD,cAAA;;EAEf,MAAA;;EAEA,KAAA;E1BT2B;E0BW3B,QAAA,GAAW,KAAA;E1BXmD;E0Ba9D,QAAA;E1BbmC;E0BenC,KAAA;E1Bf6D;E0BiB7D,YAAA;E1BjByC;E0BmBzC,SAAA;AAAA;AAAA,iBAOc,SAAA,CAAA;EACd,MAAA;EACA,KAAA;EACA,QAAA;EACA,QAAA;EACA,KAAA;EACA,YAAA;EACA;AAAA,GACC,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC7BA,aAAA;;EAEf,IAAA;E3BPe;E2BSf,EAAA;;EAEA,KAAA;E3BPO;E2BSP,OAAA;E3Bb6D;E2Be7D,QAAA,IAAY,OAAA;E3BfuB;E2BiBnC,QAAA;E3BjB8D;E2BmB9D,IAAA;E3BjBA;E2BmBA,YAAA;E3BjBA;E2BmBA,SAAA;E3BnBa;E2BqBb,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA;AAAA,iBAwBH,QAAA,CAAA;EACd,IAAA;EACA,EAAA;EACA,KAAA;EACA,OAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,YAAA;EACA,SAAA;EACA;AAAA,GACC,aAAA,GAAa,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC/DC,WAAA;EACf,OAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,WAAA;EACA,aAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,aAAA;AAAA;AAAA,UAGe,gBAAA;EACf,KAAA;IACE,aAAA;IACA,mBAAA;EAAA;EAEF,KAAA;IACE,QAAA;IACA,QAAA;EAAA;EAEF,YAAA;IACE,QAAA;EAAA;EAEF,UAAA;IACE,mBAAA;IACA,mBAAA;EAAA;AAAA;AAAA,UAIa,eAAA;EACf,IAAA;EACA,MAAA,EAAQ,WAAA;EACR,UAAA,EAAY,gBAAA;AAAA;;;KCzBT,aAAA,oBACS,CAAA,IAAK,CAAA,CAAE,CAAA,mBAAoB,aAAA,CAAY,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,CAAA;AAAA,UAGrD,sBAAA;EACR,MAAA,GAAS,aAAA,CAAY,eAAA;EACrB,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA;AAAA,iBAsCF,iBAAA,CAAA;EACd,MAAA,EAAQ,eAAA;EACR;AAAA,GACC,sBAAA,GAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;iBCnDT,aAAA,CAAA;EAAgB;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;;;iBCAzD,eAAA,CAAA;EAAkB;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;;;iBCE3D,qBAAA,CAAA;EACd;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IACjB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;KCRW,KAAA;AAAA,UAEK,gBAAA;EACf,KAAA,EAAO,KAAA;EACP,QAAA,GAAW,KAAA,EAAO,KAAA;EAClB,aAAA;AAAA;AAAA,iBAKc,QAAA,CAAA,GAAY,gBAAA;;;iBCPZ,SAAA,CAAA,GAAa,eAAA;;;UCHZ,kBAAA;EACf,SAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,iBAKc,UAAA,CAAA,GAAc,kBAAA;;;UCRb,YAAA;EACf,EAAA;EACA,KAAA;EACA,QAAA;EACA,IAAA;AAAA;AAAA,UAGe,wBAAA;EACf,aAAA,EAAe,YAAA;EACf,eAAA,GAAkB,YAAA,EAAc,IAAA,CAAK,YAAA;EACrC,kBAAA,GAAqB,EAAA;EACrB,kBAAA;AAAA;AAAA,iBAMc,gBAAA,CAAA,GAAoB,wBAAA;;;KClB/B,WAAA,oBACS,CAAA,IAAK,CAAA,CAAE,CAAA,mBAAoB,WAAA,CAAY,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,CAAA;AAAA,iBAgC/C,YAAA,CACd,SAAA,GAAW,WAAA,CAAY,eAAA,IACtB,eAAA;;;cCpCU,aAAA,EAAe,eAAA"}
package/dist/index.mjs CHANGED
@@ -2395,6 +2395,8 @@ function AuthLayout({ logo, title, subtitle, error, success, fields, values, onF
2395
2395
  });
2396
2396
  return /* @__PURE__ */ jsx("a", {
2397
2397
  href: link.href,
2398
+ target: link.target,
2399
+ rel: link.target === "_blank" ? "noopener noreferrer" : void 0,
2398
2400
  className: cn("hover:opacity-80 text-sm font-semibold transition-colors", extraClass),
2399
2401
  style,
2400
2402
  children: link.label
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["cn","cn","cn","cn","cn","cn","sizeConfig","cn","cn","cn","cn","cn","ChartJS","Title","cn","ChartJS","Title","cn","ChartJS","Title","cn","cn","ChartJS","Title","cn","cn","cn"],"sources":["../src/components/Loading/index.tsx","../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/components/Dropdown/index.tsx","../src/components/Table/index.tsx","../src/components/Modal/index.tsx","../src/components/Card/index.tsx","../src/components/Toast/index.tsx","../src/components/Pagination/index.tsx","../src/components/FormField/index.tsx","../src/components/Tabs/index.tsx","../src/components/DateRangePicker/index.tsx","../src/components/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/index.tsx","../src/hooks/useTheme.ts","../src/components/ThemeSwitcher/index.tsx","../src/components/KPICard/index.tsx","../src/components/PageLayout/index.tsx","../src/components/ComparisonLineChart/index.tsx","../src/components/HorizontalBarChart/index.tsx","../src/components/VerticalBarChart/index.tsx","../src/components/ProgressBarList/index.tsx","../src/components/MetricPanel/index.tsx","../src/components/FilterBar/index.tsx","../src/components/Checkbox/index.tsx","../src/components/AuthLayout/index.tsx","../src/components/CodeInput/index.tsx","../src/config/defaults.ts","../src/config/createConfig.ts","../src/hooks/useConfig.ts","../src/providers/ThemeProvider.tsx","../src/hooks/useLoading.ts","../src/providers/LoadingProvider.tsx","../src/hooks/useNotifications.ts","../src/providers/NotificationsProvider.tsx","../src/providers/DashboardProvider.tsx"],"sourcesContent":["import React from \"react\";\n\nexport interface LoadingProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n text?: string;\n textColor?: string;\n color?: string;\n variant?: \"spinner\" | \"border\";\n fullscreen?: boolean;\n}\n\nconst sizeMap = {\n sm: \"dashboard-spinner-sm\",\n md: \"dashboard-spinner-md\",\n lg: \"dashboard-spinner-lg\",\n};\n\nexport function Loading({\n size = \"md\",\n className = \"\",\n text,\n textColor,\n color,\n variant = \"spinner\",\n fullscreen = false,\n}: LoadingProps) {\n const variantClass = variant === \"border\" ? \"dashboard-spinner-border\" : \"dashboard-spinner\";\n\n const spinnerStyle = color ? { borderTopColor: color } : undefined;\n\n const spinner = (\n <div\n className={`flex flex-col items-center justify-center gap-4 ${className}`}\n >\n <div\n className={`${variantClass} ${sizeMap[size]}`}\n style={spinnerStyle}\n />\n {text && (\n <p\n className=\"text-sm font-medium animate-pulse\"\n style={{ color: textColor || color || \"var(--dashboard-primary)\" }}\n >\n {text}\n </p>\n )}\n </div>\n );\n\n if (fullscreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--dashboard-background,#f2f2f2)]/80 backdrop-blur-sm\">\n {spinner}\n </div>\n );\n }\n\n return spinner;\n}\n","import React from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n isLoading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Button({\n children,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n icon,\n iconPosition = \"left\",\n className,\n disabled,\n ...props\n}: ButtonProps) {\n const baseStyles =\n \"font-medium rounded-lg transition-all duration-200 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center\";\n\n const variantStyles = {\n primary: \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\",\n secondary:\n \"bg-[var(--dashboard-text-secondary,#6b7280)]/20 text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/30\",\n danger: \"bg-[var(--dashboard-status-danger,#EF4444)] text-white hover:opacity-90\",\n ghost:\n \"bg-transparent hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-primary,#2d2d2d)]\",\n };\n\n const sizeStyles = {\n sm: \"px-2 py-1 text-xs sm:px-3 sm:py-1.5 sm:text-sm\",\n md: \"px-3 py-1.5 text-sm sm:px-4 sm:py-2 sm:text-base\",\n lg: \"px-4 py-2 text-base sm:px-6 sm:py-3 sm:text-lg\",\n };\n\n const iconOnlySizeStyles = {\n sm: \"w-7 h-7 sm:w-8 sm:h-8\",\n md: \"w-9 h-9 sm:w-10 sm:h-10\",\n lg: \"w-10 h-10 sm:w-12 sm:h-12\",\n };\n\n const isIconOnly =\n !!icon &&\n (children === undefined ||\n children === null ||\n (typeof children === \"string\" && children.trim() === \"\"));\n\n return (\n <button\n className={cn(\n baseStyles,\n variantStyles[variant],\n isIconOnly ? iconOnlySizeStyles[size] : sizeStyles[size],\n className,\n )}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading ? (\n <span className=\"flex items-center gap-2\">\n <Loading size=\"sm\" color=\"currentColor\" />\n Carregando...\n </span>\n ) : isIconOnly ? (\n icon\n ) : (\n <>\n {icon && iconPosition === \"left\" && (\n <span className=\"mr-2\">{icon}</span>\n )}\n {children}\n {icon && iconPosition === \"right\" && (\n <span className=\"ml-2\">{icon}</span>\n )}\n </>\n )}\n </button>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n children?: ReactNode;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", label, error, children, id, ...props }, ref) => {\n const inputId = id || (label ? `input-${label.toLowerCase().replace(/\\s+/g, \"-\")}` : undefined);\n\n return (\n <div className=\"w-full\">\n {label && (\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label}\n </label>\n )}\n <div className=\"relative flex items-center w-full\">\n <input\n type={type}\n id={inputId}\n className={cn(\n \"flex h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] px-3 py-2 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : undefined,\n children ? \"pr-10\" : undefined,\n className,\n )}\n ref={ref}\n {...props}\n />\n {children && (\n <div className=\"absolute right-3 flex items-center\">{children}</div>\n )}\n </div>\n {error && (\n <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown, Check } from \"lucide-react\";\n\nexport interface DropdownOption {\n value: string;\n label: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport interface DropdownProps {\n options: DropdownOption[];\n value?: string;\n onChange: (value: string) => void;\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n containerClassName?: string;\n fullWidth?: boolean;\n size?: \"small\" | \"medium\" | \"large\";\n error?: string;\n variant?: \"default\" | \"underline\" | \"simple\" | \"compact\";\n customDropdownHeight?: string;\n icon?: React.ReactNode;\n fitContent?: boolean;\n isActive?: boolean;\n}\n\nexport function Dropdown({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione uma opção\",\n disabled = false,\n className = \"\",\n containerClassName = \"\",\n fullWidth = false,\n size = \"medium\",\n error,\n variant = \"default\",\n customDropdownHeight,\n icon,\n fitContent = false,\n isActive = false,\n}: DropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0, width: 0 });\n const dropdownRef = useRef<HTMLDivElement>(null);\n const selectedOption = options.find((option) => option.value === value);\n\n const sizeStyles = {\n small: {\n container: \"h-8 px-2\",\n text: \"text-xs\",\n wrapper: \"space-y-1\",\n label: \"text-sm\",\n iconPadding: \"pl-8\",\n },\n medium: {\n container: \"h-10 px-3\",\n text: \"text-sm\",\n wrapper: \"space-y-2\",\n label: \"text-base\",\n iconPadding: \"pl-10\",\n },\n large: {\n container: \"h-12 px-4\",\n text: \"text-lg\",\n wrapper: \"space-y-3\",\n label: \"text-lg\",\n iconPadding: \"pl-12\",\n },\n };\n\n const selectedStyle = sizeStyles[size];\n\n const variantStyles = {\n default:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50 focus:outline-none focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)] focus:border-transparent\",\n underline: \"border-b border-[var(--dashboard-text-secondary,#6b7280)]/30 rounded-none hover:border-b-[var(--dashboard-text-secondary,#6b7280)]/50\",\n simple:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 hover:border-[var(--dashboard-text-secondary,#6b7280)]/30 focus:outline-none\",\n compact:\n \"rounded-full hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 focus:outline-none\",\n };\n\n const variantBackgrounds = {\n default: \"bg-[var(--dashboard-surface,#ffffff)]\",\n underline: \"bg-transparent\",\n simple: \"bg-[var(--dashboard-surface,#ffffff)]\",\n compact: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n };\n\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const rect = dropdownRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled) {\n if (isOpen) {\n handleClose();\n } else {\n calculatePosition();\n setIsVisible(true);\n setTimeout(() => setIsOpen(true), 10);\n }\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n setTimeout(() => setIsVisible(false), 150);\n };\n\n const handleSelect = (option: DropdownOption) => {\n onChange(option.value);\n handleClose();\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (portal && !portal.contains(event.target as Node)) {\n if (isOpen) handleClose();\n }\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n useEffect(() => {\n const handleResize = () => {\n if (isOpen) calculatePosition();\n };\n\n const handleScroll = (event: Event) => {\n if (isOpen) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (!portal || !portal.contains(event.target as Node)) {\n handleClose();\n }\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleScroll, true);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleScroll, true);\n };\n }, [isOpen]);\n\n return (\n <div\n className={`${selectedStyle.wrapper} ${containerClassName} ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"\"\n }`}\n >\n {label && (\n <label\n className={`block text-[var(--dashboard-text-primary,#2d2d2d)] ${selectedStyle.label}`}\n >\n {label}\n </label>\n )}\n\n <div ref={dropdownRef} className=\"relative\">\n {icon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-[var(--dashboard-text-secondary,#6b7280)] h-4 w-4 pointer-events-none\">\n {icon}\n </div>\n )}\n <div\n onClick={toggleDropdown}\n className={`flex ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"w-full\"\n } items-center justify-between ${selectedStyle.container} ${\n icon ? selectedStyle.iconPadding : \"\"\n } ${\n error\n ? \"rounded-lg border border-[var(--dashboard-status-danger,#EF4444)]\"\n : disabled\n ? \"border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : isActive\n ? \"rounded-lg border border-[var(--dashboard-primary,#37a501)]\"\n : variantStyles[variant]\n } ${className} cursor-pointer transition-colors duration-200 ${\n disabled\n ? \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : selectedOption?.backgroundColor || variantBackgrounds[variant]\n }`}\n style={\n selectedOption?.backgroundColor\n ? { backgroundColor: selectedOption.backgroundColor }\n : undefined\n }\n >\n <span\n className={`block truncate select-none ${selectedStyle.text} ${\n selectedOption\n ? selectedOption.color\n ? \"\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\"\n } ${disabled ? \"text-[var(--dashboard-text-secondary,#6b7280)] opacity-50\" : \"\"}`}\n style={\n selectedOption?.color\n ? { color: selectedOption.color }\n : undefined\n }\n >\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDown\n className={`h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] transition-transform duration-200 ${\n isOpen ? \"rotate-180 transform\" : \"\"\n }`}\n />\n </div>\n\n {isVisible &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n className={`dashboard-dropdown-portal overflow-y-auto rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg transition-all duration-200 ease-in-out ${\n isOpen\n ? `opacity-100 ${customDropdownHeight || \"max-h-60\"}`\n : \"max-h-0 opacity-0\"\n }`}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n width: position.width,\n zIndex: 9999,\n }}\n >\n <ul className=\"py-1\">\n {options.length > 0 ? (\n options.map((option) => {\n const isSelected = option.value === value;\n return (\n <li\n data-modal-ignore\n key={option.value}\n onClick={() => handleSelect(option)}\n className={`cursor-pointer px-3 py-2 text-left select-none hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors flex items-center justify-between ${\n isSelected\n ? \"text-[var(--dashboard-primary,#37a501)] font-medium\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n } ${selectedStyle.text}`}\n >\n <span>{option.label}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 text-[var(--dashboard-primary,#37a501)]\" />\n )}\n </li>\n );\n })\n ) : (\n <li\n className={`px-3 py-2 text-[var(--dashboard-text-secondary,#6b7280)] italic ${selectedStyle.text}`}\n >\n Não há opções disponíveis\n </li>\n )}\n </ul>\n </div>,\n document.body,\n )}\n </div>\n\n {error && (\n <p className={`mt-1 ${selectedStyle.text} text-[var(--dashboard-status-danger,#EF4444)]`}>{error}</p>\n )}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface TableColumn<T> {\n key: string;\n header: string;\n render: (item: T) => ReactNode;\n width?: string;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n isLoading?: boolean;\n emptyMessage?: string;\n emptyIcon?: ReactNode;\n loadingComponent?: ReactNode;\n emptyComponent?: ReactNode;\n keyExtractor: (item: T) => string;\n className?: string;\n}\n\nexport function Table<T>({\n columns,\n data,\n onRowClick,\n isLoading = false,\n emptyMessage = \"Nenhum registro encontrado\",\n emptyIcon,\n loadingComponent,\n emptyComponent,\n keyExtractor,\n className = \"\",\n}: TableProps<T>) {\n if (isLoading) {\n return loadingComponent ? <>{loadingComponent}</> : <TableSkeleton />;\n }\n\n if (data.length === 0) {\n return emptyComponent ? (\n <>{emptyComponent}</>\n ) : (\n <TableEmpty message={emptyMessage} icon={emptyIcon} />\n );\n }\n\n return (\n <div\n className={`overflow-x-auto bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <TableHeader columns={columns} />\n <TableBody\n columns={columns}\n data={data}\n onRowClick={onRowClick}\n keyExtractor={keyExtractor}\n />\n </table>\n </div>\n );\n}\n\nexport function TableHeader<T>({ columns }: { columns: TableColumn<T>[] }) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <thead className=\"bg-[var(--dashboard-text-secondary,#6b7280)]/5\">\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n className={`px-6 py-3 text-xs font-semibold text-[var(--dashboard-text-secondary,#6b7280)] uppercase tracking-wider ${alignClass(column.align)} ${\n column.width ? `w-[${column.width}]` : \"\"\n }`}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n );\n}\n\nexport function TableBody<T>({\n columns,\n data,\n onRowClick,\n keyExtractor,\n}: {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n keyExtractor: (item: T) => string;\n}) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <tbody className=\"bg-[var(--dashboard-surface,#ffffff)] divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n {data.map((item) => (\n <tr\n key={keyExtractor(item)}\n onClick={() => onRowClick?.(item)}\n className={`hover:bg-[var(--dashboard-text-secondary,#6b7280)]/5 transition-colors duration-150 ${\n onRowClick ? \"cursor-pointer\" : \"\"\n }`}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={`px-6 py-4 whitespace-nowrap text-sm ${alignClass(column.align)}`}\n >\n {column.render(item)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n );\n}\n\nexport function TableSkeleton() {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\">\n <div className=\"flex items-center justify-center h-64\">\n <Loading size=\"lg\" text=\"Carregando dados...\" />\n </div>\n </div>\n );\n}\n\nexport function TableEmpty({\n message,\n icon,\n}: {\n message: string;\n icon?: ReactNode;\n}) {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-12\">\n <div className=\"text-center\">\n {icon || (\n <svg\n className=\"mx-auto h-12 w-12 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )}\n <p className=\"mt-4 text-[var(--dashboard-text-secondary,#6b7280)]\">{message}</p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"../Button\";\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave?: () => void;\n title?: string;\n children: React.ReactNode;\n showFooter?: boolean;\n saveButtonText?: string;\n cancelButtonText?: string;\n size?: \"small\" | \"medium\" | \"large\" | \"extraLarge\" | \"largeXl\";\n disableSaveButton?: boolean;\n saveButtonVariant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n closeOnEscape?: boolean;\n closeOnOverlayClick?: boolean;\n}\n\nexport function Modal({\n isOpen,\n onClose,\n onSave,\n title = \"\",\n children,\n showFooter = false,\n saveButtonText = \"Salvar\",\n cancelButtonText = \"Cancelar\",\n size = \"medium\",\n disableSaveButton = false,\n saveButtonVariant = \"primary\",\n closeOnEscape = true,\n closeOnOverlayClick = true,\n}: ModalProps) {\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n const modalRef = useRef<HTMLDivElement>(null);\n const prevIsOpenRef = useRef(false);\n\n const sizeClasses = {\n small: \"max-w-sm\",\n medium: \"max-w-md\",\n large: \"max-w-lg\",\n largeXl: \"max-w-4xl\",\n extraLarge: \"max-w-screen-xl\",\n };\n\n useEffect(() => {\n if (isOpen && !prevIsOpenRef.current) {\n setShouldRender(true);\n setIsClosing(false);\n } else if (!isOpen && prevIsOpenRef.current) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n }, 150);\n return () => clearTimeout(timer);\n }\n prevIsOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => {\n setIsClosing(false);\n onClose();\n }, 150);\n }, [onClose]);\n\n useEffect(() => {\n if (!closeOnOverlayClick) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n modalRef.current &&\n !modalRef.current.contains(event.target as Node) &&\n !target.closest(\"[data-modal-ignore]\")\n ) {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n if (!shouldRender) {\n document.body.style.overflow = \"auto\";\n }\n };\n }, [shouldRender, isClosing, handleClose, closeOnOverlayClick]);\n\n useEffect(() => {\n if (!closeOnEscape) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"keydown\", handleEscKey);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscKey);\n };\n }, [shouldRender, isClosing, handleClose, closeOnEscape]);\n\n if (!shouldRender && !isOpen) return null;\n\n return (\n <div\n className={`fixed inset-0 z-[10000] flex items-center justify-center bg-black/50 backdrop-blur-sm p-4 ${\n isClosing ? \"dashboard-animate-fade-out\" : \"dashboard-animate-fade-in\"\n }`}\n aria-modal=\"true\"\n role=\"dialog\"\n aria-labelledby={title ? \"modal-title\" : undefined}\n >\n <div\n ref={modalRef}\n className={`w-full rounded-lg bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#6b7280)]/20 shadow-xl ${\n sizeClasses[size]\n } flex max-h-[90vh] flex-col transition-transform duration-200 ease-in-out ${\n isClosing ? \"scale-95 opacity-0\" : \"scale-100 opacity-100\"\n }`}\n >\n <div className=\"flex h-fit items-center justify-between border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 p-4\">\n {title && (\n <h2\n id=\"modal-title\"\n className=\"text-xl font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\"\n >\n {title}\n </h2>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClose}\n className=\"ml-auto rounded-md\"\n aria-label=\"Fechar modal\"\n icon={<X className=\"h-5 w-5\" />}\n />\n </div>\n\n <div className=\"flex-grow overflow-y-auto p-6\">{children}</div>\n\n {showFooter && (\n <div className=\"flex justify-end gap-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 p-4\">\n <Button variant=\"secondary\" onClick={handleClose} size=\"md\">\n {cancelButtonText}\n </Button>\n <Button\n variant={saveButtonVariant}\n onClick={onSave}\n disabled={disableSaveButton}\n size=\"md\"\n >\n {saveButtonText}\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface CardProps {\n children: React.ReactNode;\n className?: string;\n title?: string;\n subtitle?: string;\n icon?: React.ReactNode;\n headerActions?: React.ReactNode;\n showDivider?: boolean;\n}\n\nexport function Card({\n children,\n className = \"\",\n title,\n subtitle,\n icon,\n headerActions,\n showDivider = false,\n}: CardProps) {\n return (\n <div\n className={`bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n <div className=\"p-4\">\n {title && (\n <div className={showDivider ? \"mb-4\" : \"mb-3\"}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {icon && (\n <div className=\"text-[var(--dashboard-text-secondary,#6b7280)]\">{icon}</div>\n )}\n <h3\n className={`${showDivider ? \"font-medium\" : \"text-base font-semibold\"} text-[var(--dashboard-text-primary,#2d2d2d)] truncate`}\n >\n {title}\n </h3>\n </div>\n {headerActions && (\n <div className=\"flex gap-2\">{headerActions}</div>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mt-1\">\n {subtitle}\n </p>\n )}\n {showDivider && (\n <div className=\"w-full h-px bg-[var(--dashboard-text-secondary,#6b7280)]/20 mt-4\" />\n )}\n </div>\n )}\n {children}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState, useCallback } from \"react\";\nimport { X, CheckCircle, XCircle, AlertTriangle, Info } from \"lucide-react\";\n\nexport interface ToastProps {\n title: string;\n subtitle?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n duration?: number;\n onClose: () => void;\n showProgress?: boolean;\n}\n\nconst typeConfig = {\n success: {\n bg: \"bg-[var(--dashboard-status-success,#10B981)]\",\n icon: CheckCircle,\n },\n error: {\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]\",\n icon: XCircle,\n },\n warning: {\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: AlertTriangle,\n },\n info: {\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]\",\n icon: Info,\n },\n};\n\nexport function Toast({\n title,\n subtitle,\n type = \"success\",\n duration = 4000,\n onClose,\n showProgress = true,\n}: ToastProps) {\n const [exiting, setExiting] = useState(false);\n\n const handleClose = useCallback(() => {\n setExiting(true);\n setTimeout(onClose, 200);\n }, [onClose]);\n\n useEffect(() => {\n if (duration <= 0) return;\n\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration, handleClose]);\n\n const { bg, icon: Icon } = typeConfig[type];\n\n return (\n <div\n className={`${bg} text-white rounded-lg shadow-xl shadow-black/15 overflow-hidden ${\n exiting ? \"dashboard-toast-exit\" : \"dashboard-toast-enter\"\n }`}\n role=\"alert\"\n >\n <div className=\"flex items-start gap-3 p-4\">\n <Icon className=\"w-5 h-5 mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-sm\">{title}</p>\n {subtitle && <p className=\"text-xs opacity-90 mt-0.5\">{subtitle}</p>}\n </div>\n <button\n onClick={handleClose}\n className=\"shrink-0 hover:opacity-75 transition-opacity cursor-pointer\"\n aria-label=\"Fechar\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {showProgress && duration > 0 && !exiting && (\n <div className=\"h-0.5 bg-white/20\">\n <div\n className=\"h-full bg-white/60\"\n style={{\n animation: `dashboard-toast-progress ${duration}ms linear forwards`,\n }}\n />\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from \"lucide-react\";\nimport { Button } from \"../Button\";\nimport { Dropdown } from \"../Dropdown\";\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n itemsPerPage: number;\n totalItems: number;\n onItemsPerPageChange?: (itemsPerPage: number) => void;\n itemsPerPageOptions?: number[];\n showPageInfo?: boolean;\n compact?: boolean;\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n onItemsPerPageChange,\n itemsPerPageOptions = [10, 20, 30, 50],\n showPageInfo = true,\n compact = false,\n className = \"\",\n}: PaginationProps) {\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisible = compact ? 3 : 5;\n const halfVisible = Math.floor(maxVisible / 2);\n\n if (totalPages <= maxVisible + 2) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, currentPage - halfVisible);\n let endPage = Math.min(totalPages - 1, currentPage + halfVisible);\n\n if (currentPage <= halfVisible + 1) {\n endPage = maxVisible;\n } else if (currentPage >= totalPages - halfVisible) {\n startPage = totalPages - maxVisible + 1;\n }\n\n if (startPage > 2) pages.push(\"...\");\n for (let i = startPage; i <= endPage; i++) pages.push(i);\n if (endPage < totalPages - 1) pages.push(\"...\");\n if (totalPages > 1) pages.push(totalPages);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const canGoPrevious = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n\n const handlePageClick = (page: number | string) => {\n if (typeof page === \"number\" && page !== currentPage) {\n onPageChange(page);\n }\n };\n\n const dropdownOptions = itemsPerPageOptions.map((opt) => ({\n value: String(opt),\n label: String(opt),\n }));\n\n return (\n <div\n className={`flex items-center justify-between gap-4 flex-wrap px-4 py-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n {onItemsPerPageChange && !compact && (\n <div className=\"hidden md:flex items-center gap-2\">\n <Dropdown\n options={dropdownOptions}\n value={String(itemsPerPage)}\n onChange={(val) => onItemsPerPageChange(Number(val))}\n size=\"small\"\n variant=\"compact\"\n fitContent\n />\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n Itens por página\n </span>\n </div>\n )}\n\n {showPageInfo && (\n <div className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {totalItems > 0 ? (\n <>\n <span className=\"hidden sm:inline\">\n Mostrando {startItem} - {endItem} de {totalItems} itens\n </span>\n <span className=\"sm:hidden\">\n {startItem}-{endItem} de {totalItems}\n </span>\n </>\n ) : (\n <span>Nenhum item encontrado</span>\n )}\n </div>\n )}\n\n <div className=\"flex items-center gap-1\">\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(1)}\n disabled={!canGoPrevious}\n icon={<ChevronsLeft size={16} />}\n aria-label=\"Primeira página\"\n />\n </div>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage - 1)}\n disabled={!canGoPrevious}\n icon={<ChevronLeft size={16} />}\n aria-label=\"Página anterior\"\n />\n\n <div className=\"flex items-center gap-1\">\n {pageNumbers.map((page, index) => (\n <React.Fragment key={`${page}-${index}`}>\n {page === \"...\" ? (\n <span className=\"px-2 text-[var(--dashboard-text-secondary,#6b7280)]\">...</span>\n ) : (\n <Button\n variant={page === currentPage ? \"primary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => handlePageClick(page)}\n className={`min-w-[32px] h-8 !px-2 ${\n page === currentPage ? \"font-medium\" : \"\"\n }`}\n aria-label={`Página ${page}`}\n aria-current={page === currentPage ? \"page\" : undefined}\n >\n {page}\n </Button>\n )}\n </React.Fragment>\n ))}\n </div>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage + 1)}\n disabled={!canGoNext}\n icon={<ChevronRight size={16} />}\n aria-label=\"Próxima página\"\n />\n\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(totalPages)}\n disabled={!canGoNext}\n icon={<ChevronsRight size={16} />}\n aria-label=\"Última página\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { Input } from \"../Input\";\n\nexport interface FormFieldProps {\n label: string;\n name: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\" | \"tel\";\n value: string;\n onChange: (value: string) => void;\n error?: string;\n required?: boolean;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function FormField({\n label,\n name,\n type = \"text\",\n value,\n onChange,\n error,\n required = false,\n placeholder,\n disabled = false,\n className = \"\",\n}: FormFieldProps) {\n return (\n <div className={className}>\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label} {required && <span className=\"text-[var(--dashboard-status-danger,#EF4444)]\">*</span>}\n </label>\n <Input\n type={type}\n id={name}\n name={name}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={placeholder}\n className={error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : \"\"}\n />\n {error && <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\n\nexport interface Tab {\n id: string;\n label: string;\n count?: number;\n icon?: ReactNode;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n activeTab: string;\n onChange: (tabId: string) => void;\n /** Estilo visual das tabs. Default: \"underline\" */\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Tabs({ tabs, activeTab, onChange, variant = \"underline\", className }: TabsProps) {\n if (variant === \"pill\") {\n return (\n <div className={cn(\"flex flex-wrap gap-2\", className)} role=\"tablist\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"flex items-center gap-2 px-4 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-white/20 text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className={cn(\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20\", className)}>\n <nav className=\"flex gap-6\" aria-label=\"Tabs\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"relative pb-3 px-1 text-sm font-medium transition-colors border-b-2 flex items-center gap-2 cursor-pointer\",\n isActive\n ? \"text-[var(--dashboard-primary,#37a501)] border-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:text-[var(--dashboard-text-primary,#2d2d2d)] border-transparent\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </nav>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport type DateRange = {\n start: Date | null;\n end: Date | null;\n};\n\nexport interface DateRangePickerProps {\n value: DateRange;\n onChange: (range: DateRange) => void;\n locale?: \"pt\" | \"en\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst locales = {\n pt: {\n months: [\n \"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\",\n \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\",\n ],\n weekDays: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n prevMonth: \"Mês anterior\",\n nextMonth: \"Próximo mês\",\n },\n en: {\n months: [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n ],\n weekDays: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n prevMonth: \"Previous month\",\n nextMonth: \"Next month\",\n },\n};\n\nexport function DateRangePicker({\n value,\n onChange,\n locale = \"pt\",\n className,\n}: DateRangePickerProps) {\n const [currentMonth, setCurrentMonth] = useState(new Date());\n const l = locales[locale];\n\n const getDaysInMonth = (date: Date) => {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const startDayOfWeek = firstDay.getDay();\n\n const days: (number | null)[] = [];\n for (let i = 0; i < startDayOfWeek; i++) {\n days.push(null);\n }\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n return days;\n };\n\n const handleDayClick = (day: number) => {\n const selectedDate = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n\n if (!value.start || (value.start && value.end)) {\n onChange({ start: selectedDate, end: null });\n } else if (value.start && !value.end) {\n if (selectedDate >= value.start) {\n onChange({ start: value.start, end: selectedDate });\n } else {\n onChange({ start: selectedDate, end: value.start });\n }\n }\n };\n\n const isDateInRange = (day: number) => {\n if (!value.start || !value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date > value.start && date < value.end;\n };\n\n const isStartDate = (day: number) => {\n if (!value.start) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.start.getTime();\n };\n\n const isEndDate = (day: number) => {\n if (!value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.end.getTime();\n };\n\n const previousMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1),\n );\n };\n\n const nextMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),\n );\n };\n\n const days = getDaysInMonth(currentMonth);\n\n return (\n <div\n className={cn(\n \"w-64 bg-[var(--dashboard-surface,#ffffff)] rounded-lg p-4 shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={previousMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.prevMonth}\n >\n <ChevronLeft className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n\n <h2 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {l.months[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h2>\n\n <button\n onClick={nextMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.nextMonth}\n >\n <ChevronRight className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-7\">\n {l.weekDays.map((day, index) => (\n <div\n key={index}\n className=\"h-8 w-8 flex items-center justify-center text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\"\n >\n {day}\n </div>\n ))}\n\n {days.map((day, index) => {\n if (day === null) {\n return <div key={`empty-${index}`} className=\"h-8 w-8\" />;\n }\n\n const inRange = isDateInRange(day);\n const isStart = isStartDate(day);\n const isEnd = isEndDate(day);\n const isSelected = isStart || isEnd;\n const hasCompletePeriod = value.start && value.end;\n\n return (\n <div key={day} className=\"relative h-8 w-8\">\n {hasCompletePeriod && (inRange || isStart || isEnd) && (\n <div\n className={cn(\n \"absolute inset-0 bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n isStart && \"rounded-l-full\",\n isEnd && \"rounded-r-full\",\n )}\n />\n )}\n <button\n onClick={() => handleDayClick(day)}\n className={cn(\n \"relative h-8 w-8 flex items-center justify-center text-xs font-medium transition-colors z-10 rounded-full cursor-pointer\",\n isSelected\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {day}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n weight?: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | \"extrabold\";\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst defaultSizeByLevel: Record<number, string> = {\n 1: \"text-2xl sm:text-3xl md:text-4xl lg:text-5xl\",\n 2: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl\",\n 3: \"text-lg sm:text-xl md:text-2xl lg:text-3xl\",\n 4: \"text-base sm:text-lg md:text-xl lg:text-2xl\",\n 5: \"text-sm sm:text-base md:text-lg lg:text-xl\",\n 6: \"text-xs sm:text-sm md:text-base lg:text-lg\",\n};\n\nconst customSizes: Record<string, string> = {\n xs: \"text-xs sm:text-sm\",\n sm: \"text-sm sm:text-base\",\n md: \"text-base sm:text-lg\",\n lg: \"text-lg sm:text-xl md:text-2xl\",\n xl: \"text-xl sm:text-2xl md:text-3xl\",\n \"2xl\": \"text-2xl sm:text-3xl md:text-4xl\",\n \"3xl\": \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl\",\n};\n\nconst weightStyles: Record<string, string> = {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n extrabold: \"font-extrabold\",\n};\n\nconst alignStyles: Record<string, string> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\nexport function Title({\n children,\n level = 1,\n size,\n weight = \"bold\",\n align = \"left\",\n color,\n className,\n ...props\n}: TitleProps) {\n const Tag = `h${level}` as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n const sizeClass = size ? customSizes[size] : defaultSizeByLevel[level];\n const colorClass = color || \"text-[var(--dashboard-text-primary,#2d2d2d)]\";\n\n return (\n <Tag\n className={cn(\n sizeClass,\n weightStyles[weight],\n alignStyles[align],\n colorClass,\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n );\n}\n","import React from \"react\";\n\nexport interface ToggleSwitchProps {\n enabled: boolean;\n onChange: (enabled: boolean) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst sizeConfig = {\n sm: {\n track: \"h-5 w-9\",\n thumb: \"h-3 w-3\",\n translateOn: \"translate-x-5\",\n translateOff: \"translate-x-1\",\n },\n md: {\n track: \"h-6 w-11\",\n thumb: \"h-4 w-4\",\n translateOn: \"translate-x-6\",\n translateOff: \"translate-x-1\",\n },\n lg: {\n track: \"h-7 w-14\",\n thumb: \"h-5 w-5\",\n translateOn: \"translate-x-8\",\n translateOff: \"translate-x-1\",\n },\n};\n\nexport function ToggleSwitch({\n enabled,\n onChange,\n disabled = false,\n size = \"md\",\n label,\n className,\n}: ToggleSwitchProps) {\n const config = sizeConfig[size];\n\n return (\n <div className={cn(\"inline-flex items-center gap-2\", className)}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n disabled={disabled}\n onClick={() => onChange(!enabled)}\n className={cn(\n \"relative inline-flex items-center rounded-full transition-colors outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--dashboard-primary,#37a501)]\",\n config.track,\n enabled\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/30\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <span\n className={cn(\n \"inline-block transform rounded-full bg-white shadow-sm transition-transform\",\n config.thumb,\n enabled ? config.translateOn : config.translateOff,\n )}\n />\n </button>\n {label && (\n <span\n className={cn(\n \"text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\",\n disabled && \"opacity-50\",\n )}\n >\n {label}\n </span>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface BadgeStatusProps {\n label: string;\n variant?: \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n color?: string;\n bgColor?: string;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantStyles: Record<string, { color: string; bgColor: string }> = {\n success: {\n color: \"text-[var(--dashboard-status-success,#10B981)]\",\n bgColor: \"bg-[var(--dashboard-status-success,#10B981)]/10\",\n },\n warning: {\n color: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n bgColor: \"bg-[var(--dashboard-status-warning,#f59e0b)]/10\",\n },\n danger: {\n color: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n bgColor: \"bg-[var(--dashboard-status-danger,#EF4444)]/10\",\n },\n info: {\n color: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n bgColor: \"bg-[var(--dashboard-status-info,#3b82f6)]/10\",\n },\n neutral: {\n color: \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n bgColor: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n },\n};\n\nconst sizeClasses: Record<string, string> = {\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-3 py-1 text-sm\",\n};\n\nexport function BadgeStatus({\n label,\n variant = \"neutral\",\n color,\n bgColor,\n size = \"md\",\n className,\n}: BadgeStatusProps) {\n const styles = variantStyles[variant];\n const useCustomColors = color || bgColor;\n\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full font-medium whitespace-nowrap\",\n sizeClasses[size],\n !useCustomColors && styles.color,\n !useCustomColors && styles.bgColor,\n className,\n )}\n style={\n useCustomColors\n ? {\n color: color || undefined,\n backgroundColor: bgColor || undefined,\n }\n : undefined\n }\n >\n {label}\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useState, ReactNode } from \"react\";\nimport { LogOut, ChevronDown, User } from \"lucide-react\";\n\nexport interface SidebarMenuItem {\n id: string;\n label: string;\n href: string;\n icon: React.ComponentType<{ size?: number; className?: string; style?: React.CSSProperties }>;\n}\n\nexport interface SidebarUser {\n name: string;\n email: string;\n subtitle?: string;\n}\n\nexport interface SidebarProps {\n menuItems: SidebarMenuItem[];\n logo: ReactNode;\n collapsedLogo?: ReactNode;\n currentPath: string;\n linkComponent?: React.ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n }>;\n isCollapsed?: boolean;\n onToggleCollapse?: () => void;\n user?: SidebarUser;\n onUserClick?: () => void;\n onLogout?: () => void;\n logoutLabel?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction DefaultLink({\n href,\n className,\n children,\n}: {\n href: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <a href={href} className={className}>\n {children}\n </a>\n );\n}\n\nexport function Sidebar({\n menuItems,\n logo,\n collapsedLogo,\n currentPath,\n linkComponent: LinkComponent = DefaultLink,\n isCollapsed = false,\n onToggleCollapse,\n user,\n onUserClick,\n onLogout,\n logoutLabel = \"Sair\",\n className,\n}: SidebarProps) {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n const cubicBezier = \"cubic-bezier(0.4, 0, 0.2, 1)\";\n\n return (\n <>\n {/* Mobile Header */}\n <header className=\"xl:hidden fixed top-0 left-0 right-0 z-40 bg-[var(--dashboard-background,#f2f2f2)] border-b border-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <div className=\"flex items-center justify-center px-4 h-16 relative\">\n <div className=\"flex items-center\">{logo}</div>\n\n <button\n onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n className=\"absolute right-4 inline-flex items-center justify-center rounded-lg text-sm font-medium transition-colors cursor-pointer bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/20 h-10 w-10\"\n aria-label=\"Menu\"\n aria-expanded={isMobileMenuOpen}\n >\n <ChevronDown\n size={24}\n className={`transition-transform duration-200 ${\n isMobileMenuOpen ? \"rotate-180\" : \"\"\n }`}\n />\n </button>\n </div>\n\n <nav\n className={`absolute top-16 left-0 right-0 bg-[var(--dashboard-background,#f2f2f2)] border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 shadow-lg transition-all duration-200 overflow-hidden ${\n isMobileMenuOpen ? \"max-h-[500px]\" : \"max-h-0\"\n }`}\n >\n <div className=\"px-4 py-2\">\n {menuItems.map((item) => {\n const Icon = item.icon;\n const isActive = currentPath === item.href;\n\n return (\n <LinkComponent\n key={item.id}\n href={item.href}\n className=\"block\"\n >\n <div\n className={cn(\n \"w-full flex items-center justify-start px-4 py-3 rounded-lg text-sm font-medium transition-colors mb-1 cursor-pointer\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/15 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\",\n )}\n >\n <Icon size={20} className=\"mr-3 flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{item.label}</span>\n </div>\n </LinkComponent>\n );\n })}\n\n <div className=\"mt-2 pt-2 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className=\"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#37a501)]/20 text-[var(--dashboard-text-primary,#2d2d2d)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div className=\"ml-3 text-left\">\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"w-full flex items-center justify-start px-4 py-3 rounded-lg text-sm font-medium transition-colors cursor-pointer text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\"\n >\n <LogOut size={20} className=\"mr-3 flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{logoutLabel}</span>\n </button>\n )}\n </div>\n </div>\n </nav>\n </header>\n\n {/* Desktop Sidebar */}\n <aside\n className={cn(\n \"hidden xl:flex xl:flex-col xl:fixed xl:left-0 xl:top-0 xl:h-screen bg-[var(--dashboard-background,#f2f2f2)] border-r border-[var(--dashboard-text-secondary,#6b7280)]/20 overflow-visible\",\n isCollapsed ? \"xl:w-[109px]\" : \"xl:w-[280px]\",\n className,\n )}\n style={{ transition: `width 400ms ${cubicBezier}` }}\n >\n {/* Toggle Button */}\n {onToggleCollapse && (\n <button\n onClick={onToggleCollapse}\n className=\"absolute top-16 -right-[18px] -translate-y-1/2 z-50 flex items-center justify-center cursor-pointer\"\n aria-label={isCollapsed ? \"Expandir sidebar\" : \"Recolher sidebar\"}\n style={{ width: \"20px\", height: \"193px\" }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"193\"\n viewBox=\"0 0 20 193\"\n fill=\"none\"\n className=\"absolute inset-0\"\n >\n <path\n d=\"M10.2036 118.86C14.8518 115.918 19.5 107.801 19.5 95.9116C19.5 84.0223 15.672 76.4939 10.2036 72.9634C4.73505 69.4329 2.54765 63.5488 1.72738 55.8994L1.72738 136.512C2.82108 125.921 5.55533 121.802 10.2036 118.86Z\"\n fill=\"var(--dashboard-background,#f2f2f2)\"\n />\n </svg>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className={`relative z-10 ${isCollapsed ? \"\" : \"rotate-180\"}`}\n style={{\n transition: `transform 400ms ${cubicBezier}`,\n }}\n >\n <path\n d=\"M4.5 2L8.5 6L4.5 10\"\n stroke=\"var(--dashboard-text-primary,#2d2d2d)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div className=\"flex flex-col h-full overflow-y-auto\">\n {/* Logo */}\n <div className=\"flex justify-center items-center py-6 px-4 border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 overflow-hidden relative\">\n {collapsedLogo && (\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{\n opacity: isCollapsed ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents: isCollapsed ? \"auto\" : \"none\",\n }}\n >\n {collapsedLogo}\n </div>\n )}\n <div\n className=\"flex items-center justify-center\"\n style={{\n opacity: !isCollapsed || !collapsedLogo ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents:\n !isCollapsed || !collapsedLogo ? \"auto\" : \"none\",\n }}\n >\n {logo}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 px-4 py-4 space-y-2 overflow-y-auto\">\n {menuItems.map((item) => {\n const Icon = item.icon;\n const isActive = currentPath === item.href;\n\n return (\n <LinkComponent\n key={item.id}\n href={item.href}\n className=\"block\"\n >\n <div\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/15 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\",\n )}\n style={{\n transition: \"background-color 200ms, color 200ms\",\n }}\n title={isCollapsed ? item.label : undefined}\n >\n <Icon\n size={20}\n style={{\n marginRight: isCollapsed ? 0 : \"0.75rem\",\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {item.label}\n </span>\n </div>\n </LinkComponent>\n );\n })}\n </nav>\n\n {/* Footer */}\n <footer className=\"p-4 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 transition-colors cursor-pointer\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n title={\n isCollapsed\n ? `${user.subtitle ? user.subtitle + \" - \" : \"\"}${user.name}`\n : undefined\n }\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#37a501)]/20 text-[var(--dashboard-text-primary,#2d2d2d)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div\n className=\"ml-3 overflow-hidden text-left\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n style={{ transition: \"background-color 200ms\" }}\n title={isCollapsed ? logoutLabel : undefined}\n >\n <LogOut\n size={20}\n style={{\n marginRight: isCollapsed ? 0 : \"0.75rem\",\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {logoutLabel}\n </span>\n </button>\n )}\n </footer>\n </div>\n </aside>\n </>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeContextType {\n theme: Theme;\n setTheme: (theme: Theme) => void;\n resolvedTheme: \"light\" | \"dark\";\n}\n\nexport const ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport function useTheme(): ThemeContextType {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useTheme must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Moon, Sun } from \"lucide-react\";\nimport { useTheme } from \"../../hooks/useTheme\";\n\nexport interface ThemeSwitcherProps {\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ThemeSwitcher({ className }: ThemeSwitcherProps) {\n const { resolvedTheme, setTheme } = useTheme();\n\n const toggle = () => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={cn(\n \"relative inline-flex items-center justify-center h-9 w-9 rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] shadow-sm transition-colors cursor-pointer hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--dashboard-primary,#37a501)] focus-visible:ring-offset-2\",\n className,\n )}\n aria-label=\"Alternar tema\"\n >\n <Sun className=\"h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n <span className=\"sr-only\">Alternar tema</span>\n </button>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nexport type KPIValueFormat = \"currency\" | \"number\" | \"percentage\" | \"rating\";\n\nexport interface KPICardProps {\n title: string;\n value: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n format?: KPIValueFormat;\n benchmark?: string;\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatValue(value: number, format: KPIValueFormat): string {\n switch (format) {\n case \"currency\":\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n case \"percentage\":\n return `${value.toFixed(1)}%`;\n case \"rating\":\n return `${value.toFixed(1)}/5.0`;\n default:\n return new Intl.NumberFormat(\"pt-BR\").format(value);\n }\n}\n\nconst trendConfigs = {\n up: {\n icon: \"\\u2191\",\n color:\n \"text-[var(--dashboard-status-success,#10B981)] bg-[var(--dashboard-status-success,#10B981)]/10\",\n },\n down: {\n icon: \"\\u2193\",\n color:\n \"text-[var(--dashboard-status-danger,#EF4444)] bg-[var(--dashboard-status-danger,#EF4444)]/10\",\n },\n stable: {\n icon: \"\\u2192\",\n color:\n \"text-[var(--dashboard-text-secondary,#6b7280)] bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n },\n};\n\nexport function KPICard({\n title,\n value,\n variation,\n trend,\n format = \"number\",\n benchmark,\n isLoading,\n className,\n}: KPICardProps) {\n if (isLoading) return <KPICardSkeleton className={className} />;\n\n const trendConfig = trendConfigs[trend];\n\n return (\n <div\n className={cn(\n \"h-full w-full bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm p-6 border border-[var(--dashboard-text-secondary,#6b7280)]/20 hover:shadow-md transition-all duration-200 flex flex-col\",\n className,\n )}\n >\n <div className=\"flex justify-between items-start mb-4\">\n <h3 className=\"text-sm font-medium text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap\">\n {title}\n </h3>\n {benchmark && (\n <span\n className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]/60 ml-2 whitespace-nowrap flex-shrink-0\"\n title=\"Benchmark de referência\"\n >\n {benchmark}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-3 flex-1\">\n <p className=\"text-3xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap\">\n {formatValue(value, format)}\n </p>\n <div\n className={cn(\n \"inline-flex items-center gap-1 px-2 py-1 rounded-md flex-shrink-0\",\n trendConfig.color,\n )}\n >\n <span className=\"text-lg\">{trendConfig.icon}</span>\n <span className=\"text-sm font-medium whitespace-nowrap\">\n {Math.abs(variation).toFixed(1)}%\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nfunction KPICardSkeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\n \"h-full bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm p-6 border border-[var(--dashboard-text-secondary,#6b7280)]/20 animate-pulse flex flex-col\",\n className,\n )}\n >\n <div className=\"h-4 bg-[var(--dashboard-text-secondary,#6b7280)]/20 rounded w-2/3 mb-4\" />\n <div className=\"flex items-center gap-3 flex-1\">\n <div className=\"h-8 bg-[var(--dashboard-text-secondary,#6b7280)]/20 rounded w-1/2\" />\n <div className=\"h-6 bg-[var(--dashboard-text-secondary,#6b7280)]/20 rounded w-1/4\" />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface PageLayoutProps {\n /** Titulo principal da pagina */\n title: string;\n /** Descricao opcional da pagina (aparece abaixo do titulo) */\n description?: string;\n /** Componentes de filtros ou acoes para o header (ex: PeriodFilter, botoes) */\n headerActions?: ReactNode;\n /** Conteudo principal da pagina */\n children: ReactNode;\n /** Se true, aplica padding no conteudo. Default: true */\n contentPadding?: boolean;\n /** Componente de sidebar a ser renderizado */\n sidebar?: ReactNode;\n /** Se a sidebar esta recolhida */\n sidebarCollapsed?: boolean;\n /** Largura da sidebar expandida em px. Default: 280 */\n sidebarWidth?: number;\n /** Largura da sidebar recolhida em px. Default: 109 */\n sidebarCollapsedWidth?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function PageLayout({\n title,\n description,\n headerActions,\n children,\n contentPadding = true,\n sidebar,\n sidebarCollapsed = false,\n sidebarWidth = 280,\n sidebarCollapsedWidth = 109,\n className,\n}: PageLayoutProps) {\n const marginLeft = sidebar\n ? sidebarCollapsed\n ? `max(0px, ${sidebarCollapsedWidth}px)`\n : `max(0px, ${sidebarWidth}px)`\n : \"0px\";\n\n return (\n <div className={cn(\"min-h-screen bg-[var(--dashboard-background,#f2f2f2)]\", className)}>\n {sidebar}\n <main\n className={cn(\"pt-16 xl:pt-0\", !sidebar && \"pt-0\")}\n style={{\n marginLeft,\n transition: \"margin-left 400ms cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <style>{`\n @media (max-width: 1279px) {\n main {\n margin-left: 0 !important;\n }\n }\n `}</style>\n\n {/* Header com titulo e acoes */}\n <div className=\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-6 py-4 bg-[var(--dashboard-surface,#ffffff)]\">\n <div className=\"mb-4\">\n <h1 className=\"text-2xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h1>\n {description && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mt-1\">\n {description}\n </p>\n )}\n </div>\n\n {headerActions && <div>{headerActions}</div>}\n </div>\n\n {/* Conteudo principal */}\n <div className={contentPadding ? \"p-6\" : \"\"}>{children}</div>\n </main>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n);\n\nexport interface ComparisonLineChartProps {\n /** Labels do eixo X (ex: datas) */\n labels: string[];\n /** Dados do periodo atual */\n currentPeriodData: number[];\n /** Dados do periodo anterior */\n previousPeriodData: number[];\n /** Label da legenda do periodo atual */\n currentPeriodLabel?: string;\n /** Label da legenda do periodo anterior */\n previousPeriodLabel?: string;\n /** Titulo do grafico */\n title?: string;\n /** Cor principal (default: --dashboard-primary) */\n color?: string;\n /** Altura do container do grafico em px. Default: 300 */\n height?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ComparisonLineChart({\n labels,\n currentPeriodData,\n previousPeriodData,\n currentPeriodLabel = \"Período atual\",\n previousPeriodLabel = \"Período anterior\",\n title,\n color,\n height = 300,\n className,\n}: ComparisonLineChartProps) {\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const data = {\n labels,\n datasets: [\n {\n label: currentPeriodLabel,\n data: currentPeriodData,\n borderColor: primaryColor,\n backgroundColor: `${primaryColor}1a`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n {\n label: previousPeriodLabel,\n data: previousPeriodData,\n borderColor: `${primaryColor}66`,\n backgroundColor: `${primaryColor}0d`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: `${primaryColor}66`,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: true,\n position: \"bottom\" as const,\n labels: {\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n padding: 15,\n font: { size: 11 },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: true,\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n },\n },\n y: {\n beginAtZero: true,\n grid: { color: \"rgba(0, 0, 0, 0.05)\", drawBorder: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n precision: 0,\n },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\" as const,\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\",\n className,\n )}\n >\n {title && (\n <h3 className=\"text-base font-semibold mb-4 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n )}\n <div style={{ height }}>\n <Line data={data} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface HorizontalBarChartTab {\n id: string;\n label: string;\n}\n\nexport interface HorizontalBarChartProps {\n /** Labels do eixo Y (ex: horarios) */\n labels: string[];\n /** Dados por tab. Chave = tab.id, valor = array de numeros */\n datasets: Record<string, number[]>;\n /** Tabs para alternar entre datasets */\n tabs?: HorizontalBarChartTab[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label para tooltip (ex: \"vendas\", \"pedidos\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\", \"pedido\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor horário\") */\n bestItemLabel?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function HorizontalBarChart({\n labels,\n datasets,\n tabs,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n className,\n}: HorizontalBarChartProps) {\n const tabKeys = tabs ? tabs.map((t) => t.id) : Object.keys(datasets);\n const [activeTab, setActiveTab] = useState(tabKeys[0]);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 640);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\n }, []);\n\n const activeData = datasets[activeTab] || [];\n const maxValue = Math.max(...activeData);\n const bestIndex = activeData.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const minBarValue = maxValue > 0 ? maxValue * 0.02 : 0.05;\n const displayData = activeData.map((v) => (v === 0 ? minBarValue : v));\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: displayData,\n backgroundColor: primaryColor,\n borderRadius: isMobile ? 8 : 4,\n barThickness: isMobile ? 36 : 24,\n },\n ],\n };\n\n const options = {\n indexAxis: \"y\" as const,\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n right: isMobile ? 35 : 30,\n left: isMobile ? 10 : 0,\n top: isMobile ? 15 : 0,\n bottom: isMobile ? 15 : 0,\n },\n },\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: isMobile ? 6 : 12,\n displayColors: false,\n titleFont: { size: isMobile ? 10 : 12, weight: \"bold\" as const },\n bodyFont: { size: isMobile ? 9 : 11 },\n callbacks: {\n label: (context: { dataIndex: number }) => {\n const realValue = activeData[context.dataIndex];\n return realValue === 1\n ? `${realValue} ${singular}`\n : `${realValue} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n y: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 16 : 13 },\n padding: isMobile ? 12 : 4,\n },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-5 sm:p-6 min-h-[850px] sm:h-full flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {tabs && tabs.length > 1 && (\n <div className=\"flex gap-2 mb-4 flex-wrap\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n \"px-3.5 py-2 sm:px-4 sm:py-2 rounded-full text-sm font-medium transition-colors whitespace-nowrap cursor-pointer\",\n activeTab === tab.id\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n )}\n\n {maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm sm:text-base text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-xl sm:text-2xl font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-base font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0\">\n <Bar key={`chart-${isMobile ? \"m\" : \"d\"}`} data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface VerticalBarChartProps {\n /** Labels do eixo X (ex: dias da semana) */\n labels: string[];\n /** Valores para cada label */\n data: number[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label do tooltip (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor dia\") */\n bestItemLabel?: string;\n /** Maximo de caracteres dos labels. Default: 3 */\n labelMaxChars?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function VerticalBarChart({\n labels,\n data: values,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n labelMaxChars = 3,\n className,\n}: VerticalBarChartProps) {\n const maxValue = Math.max(...values);\n const bestIndex = values.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: values,\n backgroundColor: primaryColor,\n borderRadius: { topLeft: 4, topRight: 4 },\n barThickness: 40,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: false,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n callbacks: {\n label: (context: { parsed: { y: number | null } }) => {\n const v = context.parsed.y ?? 0;\n return v === 1 ? `${v} ${singular}` : `${v} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n callback: (_value: number | string, index: number): string => {\n return labels[index]\n ? labels[index].substring(0, labelMaxChars)\n : String(_value);\n },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {bestLabel && maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-sm font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 relative\">\n <Bar data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface ProgressBarListItem {\n /** Label do item */\n label: string;\n /** Valor numerico */\n value: number;\n /** Icone opcional */\n icon?: ReactNode;\n}\n\nexport interface ProgressBarListProps {\n /** Itens da lista */\n items: ProgressBarListItem[];\n /** Titulo da lista */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: ReactNode;\n /** Cor da barra de progresso (default: --dashboard-primary) */\n color?: string;\n /** Label do valor (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Ordenar automaticamente por valor desc. Default: true */\n sortByValue?: boolean;\n /** Formatar valor customizado */\n formatValue?: (value: number) => string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ProgressBarList({\n items,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n sortByValue = true,\n formatValue,\n className,\n}: ProgressBarListProps) {\n const sortedItems = sortByValue\n ? [...items].sort((a, b) => b.value - a.value)\n : items;\n const maxValue = Math.max(...items.map((i) => i.value));\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const defaultFormat = (v: number) =>\n `${v} ${v === 1 ? singular : valueLabel}`;\n\n const fmt = formatValue || defaultFormat;\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n <div className=\"space-y-6 flex-1 flex flex-col justify-center\">\n {sortedItems.map((item, index) => (\n <div key={index} className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-4 min-w-[180px]\">\n {item.icon && (\n <div\n className=\"w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: primaryColor }}\n >\n <div className=\"w-6 h-6 text-white\">{item.icon}</div>\n </div>\n )}\n <span className=\"text-base font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {item.label}\n </span>\n </div>\n <div className=\"flex items-center gap-4 flex-1\">\n <div className=\"flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded-full h-3 overflow-hidden\">\n <div\n className=\"h-full transition-all duration-500 rounded-full\"\n style={{\n width:\n maxValue > 0\n ? `${(item.value / maxValue) * 100}%`\n : \"0%\",\n backgroundColor: primaryColor,\n }}\n />\n </div>\n <span\n className=\"text-base font-bold min-w-[90px] text-right\"\n style={{ color: primaryColor }}\n >\n {fmt(item.value)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n ChartData,\n ChartOptions,\n} from \"chart.js\";\nimport { KPICard, KPIValueFormat } from \"../KPICard\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n);\n\nexport interface MetricPanelMetric {\n /** Chave unica da metrica */\n key: string;\n /** Label exibida na tab e KPI */\n label: string;\n /** Icone da tab */\n icon: React.ComponentType<{ className?: string }>;\n /** Label da legenda do periodo atual */\n currentLabel: string;\n /** Label da legenda do periodo anterior */\n previousLabel: string;\n /** Formato do valor */\n format: KPIValueFormat;\n /** Unidade opcional (ex: \"pedidos\") */\n unit?: string;\n /** Valores do KPI */\n kpiValue: {\n current: number;\n previous: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n };\n}\n\nexport interface MetricPanelChartData {\n labels: string[];\n metrics: Record<\n string,\n { currentPeriod: number[]; previousPeriod: number[] }\n >;\n}\n\nexport interface MetricPanelProps {\n /** Titulo do painel */\n title: string;\n /** Icone do titulo */\n titleIcon: React.ComponentType<{ className?: string }>;\n /** Configuracoes das metricas */\n metrics: MetricPanelMetric[];\n /** Dados do grafico */\n chartData: MetricPanelChartData;\n /** Cor principal */\n color?: string;\n /** Cor secundaria (periodo anterior) */\n secondaryColor?: string;\n /** Callback do botao de acao */\n onActionClick?: () => void;\n /** Label do botao de acao */\n actionLabel?: string;\n /** Estado de loading */\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function MetricPanel({\n title,\n titleIcon: TitleIcon,\n metrics,\n chartData,\n color,\n secondaryColor,\n onActionClick,\n actionLabel,\n isLoading = false,\n className,\n}: MetricPanelProps) {\n const [selectedMetricKey, setSelectedMetricKey] = useState(metrics[0]?.key);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 768);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\n }, []);\n\n const currentMetric =\n metrics.find((m) => m.key === selectedMetricKey) || metrics[0];\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const secColor = secondaryColor || `${primaryColor}66`;\n\n const data: ChartData<\"line\"> = {\n labels: chartData.labels,\n datasets: [\n {\n label: currentMetric.currentLabel,\n data: chartData.metrics[currentMetric.key]?.currentPeriod || [],\n borderColor: primaryColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: isMobile ? 10 : 8,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 3,\n },\n {\n label: currentMetric.previousLabel,\n data: chartData.metrics[currentMetric.key]?.previousPeriod || [],\n borderColor: secColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: 0,\n },\n ],\n };\n\n const options: ChartOptions<\"line\"> = {\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n left: isMobile ? 10 : 50,\n right: isMobile ? 10 : 50,\n top: isMobile ? 20 : 40,\n bottom: isMobile ? 10 : 20,\n },\n },\n plugins: {\n legend: {\n display: true,\n position: \"bottom\",\n onClick: () => {},\n labels: {\n usePointStyle: true,\n boxWidth: isMobile ? 8 : 6,\n boxHeight: isMobile ? 8 : 6,\n padding: isMobile ? 12 : 15,\n font: {\n size: isMobile ? 13 : 11,\n weight: isMobile ? \"bold\" : \"normal\",\n },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n },\n },\n scales: {\n x: {\n border: { display: false },\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 12 : 11 },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { color: \"rgba(0, 0, 0, 0.05)\" },\n ticks: { display: false, count: 5 },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\",\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n style={{ overflow: \"visible\" }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 md:p-6 pb-3 md:pb-4 border-b border-[var(--dashboard-text-secondary,#6b7280)]/10\">\n <h2 className=\"flex items-center gap-2 text-lg md:text-xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <TitleIcon className=\"w-5 h-5 md:w-6 md:h-6\" />\n {title}\n </h2>\n {onActionClick && actionLabel && (\n <button\n onClick={onActionClick}\n className=\"px-3 md:px-4 py-1.5 md:py-2 text-xs md:text-sm font-medium border rounded-lg transition-colors cursor-pointer\"\n style={{\n color: primaryColor,\n borderColor: primaryColor,\n }}\n >\n {actionLabel}\n </button>\n )}\n </div>\n\n {/* KPI Cards */}\n <div className=\"p-4 md:p-6 pb-3 md:pb-4\">\n <div\n className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 md:gap-4\"\n style={{\n gridTemplateColumns:\n !isMobile && metrics.length <= 4\n ? `repeat(${metrics.length}, minmax(min-content, 1fr))`\n : undefined,\n }}\n >\n {metrics.map((metric) => (\n <KPICard\n key={metric.key}\n title={metric.label}\n value={metric.kpiValue.current}\n variation={metric.kpiValue.variation}\n trend={metric.kpiValue.trend}\n format={metric.format}\n isLoading={isLoading}\n />\n ))}\n </div>\n </div>\n\n {/* Metric Tabs */}\n <div className=\"px-4 md:px-6 pt-3 md:pt-4\">\n <div className=\"flex flex-wrap justify-center gap-2 md:gap-3\">\n {metrics.map((metric) => {\n const Icon = metric.icon;\n return (\n <button\n key={metric.key}\n onClick={() => setSelectedMetricKey(metric.key)}\n className={cn(\n \"flex items-center gap-2 px-4 md:px-6 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n selectedMetricKey === metric.key\n ? \"bg-[var(--dashboard-surface,#ffffff)] border-2 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#6b7280)]/30 text-[var(--dashboard-text-secondary,#6b7280)] hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n )}\n style={\n selectedMetricKey === metric.key\n ? { borderColor: primaryColor, color: primaryColor }\n : undefined\n }\n >\n <Icon className=\"w-4 h-4\" />\n {metric.label}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Chart */}\n <div\n className=\"px-4 md:px-6 pb-4 md:pb-6\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n <div\n className=\"h-[260px]\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div\n className=\"animate-spin rounded-full h-12 w-12 border-b-2 mx-auto mb-4\"\n style={{ borderColor: primaryColor }}\n />\n <p className=\"text-[var(--dashboard-text-secondary,#6b7280)]\">\n Carregando gráfico...\n </p>\n </div>\n </div>\n ) : (\n <Line data={data} options={options} />\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface FilterBarProps {\n /** Valor do campo de busca */\n searchValue?: string;\n /** Callback de mudanca do campo de busca */\n onSearchChange?: (value: string) => void;\n /** Placeholder do campo de busca */\n searchPlaceholder?: string;\n /** Slot para dropdowns, date pickers e outros filtros */\n children?: ReactNode;\n /** Slot para acoes extras (ex: botao de exportar) */\n actions?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function FilterBar({\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Buscar...\",\n children,\n actions,\n className,\n}: FilterBarProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:items-center sm:flex-wrap\",\n className,\n )}\n >\n {onSearchChange !== undefined && (\n <div className=\"flex-1 min-w-[200px]\">\n <div className=\"relative flex items-center w-full\">\n <svg\n className=\"absolute left-3 h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={searchValue || \"\"}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"flex h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] pl-10 pr-3 py-2 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none\"\n />\n </div>\n </div>\n )}\n\n {children && (\n <div className=\"flex flex-wrap items-center gap-2\">{children}</div>\n )}\n\n {actions && (\n <div className=\"flex items-center gap-2 sm:ml-auto\">{actions}</div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxProps {\n /** Input name */\n name?: string;\n /** Input id (defaults to name) */\n id?: string;\n /** Label text next to the checkbox */\n label?: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n /** Disable the checkbox */\n disabled?: boolean;\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Primary color override for checked state. Defaults to --dashboard-primary / #ff521d */\n primaryColor?: string;\n /** Additional className on the wrapper label */\n className?: string;\n /** Children rendered as label (takes precedence over label prop) */\n children?: React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n// Exact values from dashboard.eaigarcom.com LoginForm.tsx:\n// h-4 w-4 (16px) rounded (4px)\n// after:left-[3px] after:top-0 after:w-[6px] after:h-[10px] after:border-r-2 after:border-b-2 after:rotate-45\n// Scaled proportionally for md (22px) and lg (28px)\nconst sizeConfig = {\n sm: { box: 16, radius: 4, icon: { w: 6, h: 10, left: 3, top: 0, border: 2 }, gap: 8, text: 13 },\n md: { box: 22, radius: 6, icon: { w: 8, h: 14, left: 4.5, top: 0, border: 2 }, gap: 10, text: 14 },\n lg: { box: 28, radius: 7, icon: { w: 10, h: 17, left: 6, top: 0, border: 2.5 }, gap: 12, text: 15 },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Checkbox({\n name,\n id,\n label,\n checked = false,\n onChange,\n disabled = false,\n size = \"md\",\n primaryColor,\n className,\n children,\n}: CheckboxProps) {\n const inputId = id || name;\n const cfg = sizeConfig[size];\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #37A501)\";\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n \"inline-flex items-center cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n style={{ gap: cfg.gap }}\n >\n {/* Hidden native input for form submission & accessibility */}\n <input\n type=\"checkbox\"\n id={inputId}\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n className=\"sr-only peer\"\n />\n\n {/* Custom checkbox box */}\n <span\n className=\"relative shrink-0 transition-all duration-200\"\n style={{\n width: cfg.box,\n height: cfg.box,\n borderRadius: cfg.radius,\n backgroundColor: checked ? resolvedColor : \"transparent\",\n border: checked\n ? `2px solid ${resolvedColor}`\n : \"2px solid rgba(45,45,45,0.2)\",\n boxShadow: checked\n ? `0 1px 3px color-mix(in srgb, ${resolvedColor} 25%, transparent)`\n : \"none\",\n }}\n aria-hidden=\"true\"\n >\n {/* Checkmark — CSS-only via rotated border trick */}\n <span\n className=\"absolute transition-opacity duration-150\"\n style={{\n opacity: checked ? 1 : 0,\n left: cfg.icon.left,\n top: cfg.icon.top,\n width: cfg.icon.w,\n height: cfg.icon.h,\n borderRight: `${cfg.icon.border}px solid #fff`,\n borderBottom: `${cfg.icon.border}px solid #fff`,\n transform: \"rotate(45deg)\",\n }}\n />\n </span>\n\n {/* Label text */}\n {(children || label) && (\n <span\n className=\"leading-none\"\n style={{\n fontSize: cfg.text,\n color: \"var(--dashboard-text-primary, #2d2d2d)\",\n }}\n >\n {children || label}\n </span>\n )}\n </label>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode, useState, useEffect } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AuthField {\n /** Unique name / id for the field */\n name: string;\n /** Label displayed above the input (omit for placeholder-only mode) */\n label?: string;\n /** HTML input type */\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"number\";\n /** Placeholder text */\n placeholder?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Minimum length for validation */\n minLength?: number;\n /** Field-level error message */\n error?: string;\n}\n\nexport interface AuthLink {\n /** Link text */\n label: string;\n /** URL or click handler */\n href?: string;\n /** Custom click handler (takes precedence over href) */\n onClick?: () => void;\n}\n\nexport interface AuthCheckbox {\n /** Checkbox name */\n name: string;\n /** Checkbox label */\n label: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n}\n\nexport interface AuthBackground {\n /** Solid color, gradient, or CSS value for the page background */\n color?: string;\n /** Background image URL or element (for Next.js Image support) */\n image?: string;\n /** React element for the background (e.g., next/image with fill) */\n imageElement?: ReactNode;\n /** Overlay opacity (0-1) — rendered as bg-black/{opacity} */\n overlayOpacity?: number;\n /** Custom CSS for the background container */\n style?: React.CSSProperties;\n}\n\nexport interface AuthHeadline {\n /** Main headline text */\n text: string;\n /** Highlighted / accent portion (rendered on new line if not found inside text) */\n highlight?: string;\n /** Color of the main text (defaults to #faf3e1) */\n color?: string;\n /** Color of the highlighted text (defaults to primaryColor) */\n highlightColor?: string;\n}\n\nexport interface AuthBranding {\n /** Array of logo elements to render at the bottom-left */\n logos: ReactNode[];\n}\n\nexport interface AuthCardStyle {\n /** Card background color (defaults to #faf3e1) */\n background?: string;\n /** Card border radius in px (defaults to 16 = rounded-2xl) */\n borderRadius?: number;\n /** Card box shadow CSS */\n shadow?: string;\n /** Card max width in px (defaults to 420) */\n maxWidth?: number;\n /** Card padding in px (defaults to 32 = p-8) */\n padding?: number;\n /** Card border */\n border?: string;\n}\n\nexport interface AuthLayoutProps {\n // --- Content ---\n /** Logo element displayed at top of card */\n logo?: ReactNode;\n /** Page title (e.g., \"Painel de Controle\") */\n title: string;\n /** Subtitle / description below the title (supports ReactNode for inline formatting) */\n subtitle?: ReactNode;\n /** Global error message displayed above the form */\n error?: string;\n /** Global success message displayed above the form */\n success?: string;\n\n // --- Form ---\n /** Form field definitions */\n fields: AuthField[];\n /** Current field values keyed by field name */\n values: Record<string, string>;\n /** Callback when a field value changes */\n onFieldChange: (name: string, value: string) => void;\n /** Submit handler */\n onSubmit: (values: Record<string, string>) => void;\n /** Submit button label */\n submitLabel?: string;\n /** Loading label while submitting */\n loadingLabel?: string;\n /** Whether the form is currently submitting */\n isLoading?: boolean;\n /** Checkbox between fields and submit (e.g., \"Lembrar conta\") */\n checkbox?: AuthCheckbox;\n\n // --- Links ---\n /** Primary link below the form */\n primaryLink?: AuthLink;\n /** Secondary link / text (e.g., \"Ainda nao tem cadastro? Cadastre-se\") */\n secondaryLink?: AuthLink & { prefix?: string };\n\n // --- Extra content ---\n /** Content rendered between the submit button and the links */\n extraContent?: ReactNode;\n /** Content rendered above the form (below title/subtitle) */\n headerContent?: ReactNode;\n /** Content rendered just above the submit button (e.g., resend code link) */\n beforeSubmitContent?: ReactNode;\n /** Content rendered at the very bottom of the card */\n footerContent?: ReactNode;\n\n // --- Layout ---\n /** Headline text displayed over the background (top-left, hidden on mobile) */\n headline?: AuthHeadline;\n /** Branding logos at the bottom-left over the background (hidden on mobile) */\n branding?: AuthBranding;\n /** Card horizontal position */\n cardPosition?: \"left\" | \"center\" | \"right\";\n /** Right padding for the card container on lg screens (defaults to 256 = pr-64) */\n cardOffsetRight?: number;\n\n // --- Theming ---\n /** Background configuration */\n background?: AuthBackground;\n /** Card styling overrides */\n cardStyle?: AuthCardStyle;\n /** Primary color (buttons, links, focus rings, checkbox). Defaults to #ff521d */\n primaryColor?: string;\n /** Text color for the title */\n titleColor?: string;\n /** Text alignment for the card header (title + subtitle). Defaults to \"center\" */\n titleAlign?: \"left\" | \"center\" | \"right\";\n\n /** Additional class name for the outermost container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n/** Resolves a CSS color value (including var() references) to a computed hex/rgb string */\nfunction useResolvedColor(cssValue: string): string {\n const [resolved, setResolved] = useState(cssValue);\n\n useEffect(() => {\n // If it's already a plain color (not a var()), use as-is\n if (!cssValue.startsWith(\"var(\")) {\n setResolved(cssValue);\n return;\n }\n\n // Create a hidden probe element to read the computed value\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n }, [cssValue]);\n\n // Re-resolve when CSS vars change (DashboardProvider updates style on root)\n useEffect(() => {\n if (!cssValue.startsWith(\"var(\")) return;\n\n const observer = new MutationObserver(() => {\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"style\"],\n });\n\n return () => observer.disconnect();\n }, [cssValue]);\n\n return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// AuthInput — matches Eai Garcom: h-12 rounded-lg border-2 bg-transparent\n// ---------------------------------------------------------------------------\n\nfunction AuthInput({\n name,\n label,\n type = \"text\",\n placeholder,\n required,\n minLength,\n value,\n onChange,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n name: string;\n label?: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n return (\n <div>\n {label && (\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[#2d2d2d] mb-1.5\"\n >\n {label}\n </label>\n )}\n <input\n type={type}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n ...(error\n ? { borderColor: \"var(--dashboard-status-danger, #EF4444)\" }\n : {}),\n }}\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PasswordInput — h-12 with eye toggle, same border style\n// ---------------------------------------------------------------------------\n\nfunction PasswordInput({\n value,\n onChange,\n placeholder,\n name,\n required,\n minLength,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder?: string;\n name: string;\n required?: boolean;\n minLength?: number;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n const [visible, setVisible] = useState(false);\n\n return (\n <div>\n <div className=\"relative\">\n <input\n type={visible ? \"text\" : \"password\"}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 pr-11 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((v) => !v)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-[#2d2d2d]/50 hover:text-[#2d2d2d] transition-colors cursor-pointer bg-transparent border-none p-0\"\n tabIndex={-1}\n aria-label={visible ? \"Ocultar senha\" : \"Mostrar senha\"}\n disabled={disabled}\n >\n {visible ? (\n // EyeOff icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n // Eye icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AuthLayout({\n logo,\n title,\n subtitle,\n error,\n success,\n fields,\n values,\n onFieldChange,\n onSubmit,\n submitLabel = \"Acessar\",\n loadingLabel = \"Entrando...\",\n isLoading = false,\n checkbox,\n primaryLink,\n secondaryLink,\n extraContent,\n headerContent,\n beforeSubmitContent,\n footerContent,\n headline,\n branding,\n cardPosition = \"right\",\n cardOffsetRight = 256,\n background,\n cardStyle,\n primaryColor,\n titleColor,\n titleAlign = \"center\",\n className,\n}: AuthLayoutProps) {\n // CSS var string for style props (e.g., backgroundColor, color)\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n // Computed hex/rgb value for JS string concatenation (e.g., focus ring shadow with opacity)\n const computedColor = useResolvedColor(resolvedColor);\n\n // Background\n const bgCss: React.CSSProperties = {\n backgroundColor: background?.color || \"#1a1a1a\",\n ...background?.style,\n };\n\n // Card\n const cardBg = cardStyle?.background || \"var(--dashboard-secondary, #faf3e1)\";\n const cardCss: React.CSSProperties = {\n backgroundColor: cardBg,\n borderRadius: cardStyle?.borderRadius ?? 16,\n boxShadow:\n cardStyle?.shadow ??\n \"0 0 0 1px rgb(0 0 0 / 0.08), 0 0 12px 4px rgb(0 0 0 / 0.25), 0 0 28px 10px rgb(0 0 0 / 0.20)\",\n maxWidth: cardStyle?.maxWidth ?? 420,\n padding: cardStyle?.padding ?? 32,\n border: cardStyle?.border || \"none\",\n width: \"100%\",\n };\n\n\n\n\n function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n onSubmit(values);\n }\n\n function renderLink(link: AuthLink, extraClass?: string) {\n const style: React.CSSProperties = { color: resolvedColor };\n if (link.onClick) {\n return (\n <button\n type=\"button\"\n onClick={link.onClick}\n className={cn(\n \"bg-transparent border-none cursor-pointer hover:opacity-80 text-sm font-semibold p-0 transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </button>\n );\n }\n return (\n <a\n href={link.href}\n className={cn(\n \"hover:opacity-80 text-sm font-semibold transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </a>\n );\n }\n\n return (\n <div\n className={cn(\"fixed inset-0 flex select-none overflow-hidden\", className)}\n style={bgCss}\n >\n {/* Background left spacer for branding (hidden on mobile) */}\n {branding && branding.logos.length > 0 && (\n <div className=\"relative hidden w-1/3 lg:block\">\n <div className=\"absolute bottom-12 left-12 z-20\">\n <div className=\"flex gap-4 items-center\">\n {branding.logos.map((brandLogo, i) => (\n <React.Fragment key={i}>{brandLogo}</React.Fragment>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Background image */}\n {background?.imageElement ? (\n <div className=\"absolute inset-0 z-0\">{background.imageElement}</div>\n ) : background?.image ? (\n <img\n src={background.image}\n alt=\"\"\n className=\"absolute inset-0 z-0 h-full w-full object-cover\"\n draggable={false}\n />\n ) : null}\n\n {/* Background overlay — bg-black/20 by default */}\n {(background?.image || background?.imageElement) && (\n <div\n className=\"absolute inset-0 z-10\"\n style={{\n backgroundColor: `rgba(0,0,0,${background?.overlayOpacity ?? 0.2})`,\n }}\n />\n )}\n\n {/* Headline — top-left, hidden on mobile */}\n {headline && (\n <div className=\"absolute top-12 left-8 z-20 max-w-md hidden lg:block\">\n <h1\n className=\"text-4xl font-bold mb-4 leading-tight\"\n style={{ color: headline.color || \"#faf3e1\" }}\n >\n {headline.highlight\n ? (() => {\n const idx = headline.text.indexOf(headline.highlight);\n if (idx === -1) {\n return (\n <>\n {headline.text}\n <br />\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n </>\n );\n }\n const before = headline.text.slice(0, idx);\n const after = headline.text.slice(\n idx + headline.highlight.length,\n );\n return (\n <>\n {before}\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n {after}\n </>\n );\n })()\n : headline.text}\n </h1>\n </div>\n )}\n\n {/* Responsive offset CSS — only applies on lg+ */}\n <style>{`\n .auth-card-container {\n padding-left: 1rem;\n padding-right: 1rem;\n justify-content: center;\n align-content: center;\n }\n @media (min-width: 1024px) {\n .auth-card-container[data-position=\"right\"] {\n justify-content: flex-end;\n padding-right: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"left\"] {\n justify-content: flex-start;\n padding-left: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"center\"] {\n justify-content: center;\n }\n }\n `}</style>\n\n {/* Card container — z-30, flex w-full items-center */}\n <div\n className=\"auth-card-container relative z-30 flex w-full items-center py-8\"\n data-position={cardPosition}\n >\n <div style={{ ...cardCss, maxHeight: \"calc(100vh - 64px)\", overflowY: \"auto\" }}>\n {/* Card header: logo + title + subtitle */}\n <div className={`mb-8 ${titleAlign === \"center\" ? \"text-center\" : titleAlign === \"right\" ? \"text-right\" : \"text-left\"}`}>\n {/* Logo */}\n {logo && (\n <div className={`mb-4 flex ${titleAlign === \"center\" ? \"justify-center\" : titleAlign === \"right\" ? \"justify-end\" : \"justify-start\"}`}>\n {logo}\n </div>\n )}\n\n {/* Title — text-2xl font-bold text-gray-900 mb-2 */}\n <h2\n className=\"text-2xl font-bold mb-2\"\n style={{\n color: titleColor || \"var(--dashboard-text-primary, #111827)\",\n }}\n >\n {title}\n </h2>\n\n {/* Subtitle — text-sm text-gray-600 */}\n {subtitle && (\n <p className=\"text-sm text-gray-600\">{subtitle}</p>\n )}\n </div>\n\n {/* Header content */}\n {headerContent}\n\n {/* Alerts */}\n {error && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-red-50 text-red-700 border border-red-200\">\n {error}\n </div>\n )}\n\n {success && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-green-50 text-green-700 border border-green-200\">\n {success}\n </div>\n )}\n\n {/* Form — space-y-5 */}\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {fields.map((field) =>\n field.type === \"password\" ? (\n <PasswordInput\n key={field.name}\n name={field.name}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ) : (\n <AuthInput\n key={field.name}\n name={field.name}\n label={field.label}\n type={field.type || \"text\"}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ),\n )}\n\n {/* Checkbox */}\n {checkbox && (\n <Checkbox\n name={checkbox.name}\n label={checkbox.label}\n checked={checkbox.checked || false}\n onChange={(val) => checkbox.onChange?.(val)}\n disabled={isLoading}\n primaryColor={resolvedColor}\n size=\"sm\"\n />\n )}\n\n {/* Before submit content (e.g., resend code) */}\n {beforeSubmitContent}\n\n {/* Submit button — h-12 rounded-lg font-bold text-base shadow-lg */}\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full h-12 rounded-lg px-5 text-base font-bold text-white transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed shadow-lg hover:shadow-xl hover:opacity-90\"\n style={{\n backgroundColor: resolvedColor,\n \"--tw-ring-color\": resolvedColor,\n } as React.CSSProperties}\n >\n {isLoading ? loadingLabel : submitLabel}\n </button>\n </form>\n\n {/* Extra content */}\n {extraContent && <div className=\"mt-5\">{extraContent}</div>}\n\n {/* Links */}\n {(primaryLink || secondaryLink) && (\n <div className=\"mt-6 text-center\">\n {primaryLink && (\n <p className=\"text-sm text-gray-600\">\n {renderLink(primaryLink)}\n </p>\n )}\n {secondaryLink && (\n <p className={`text-sm text-gray-600 ${primaryLink ? \"mt-6\" : \"\"}`}>\n {secondaryLink.prefix && (\n <>{secondaryLink.prefix}{\" \"}</>\n )}\n {renderLink(secondaryLink)}\n </p>\n )}\n </div>\n )}\n\n {/* Footer content */}\n {footerContent && <div className=\"mt-6\">{footerContent}</div>}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useCallback, KeyboardEvent, ClipboardEvent } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CodeInputProps {\n /** Number of digit boxes (defaults to 6) */\n length?: number;\n /** Current value as a string (e.g. \"12\" for the first two digits filled) */\n value: string;\n /** Called with the full string whenever a digit changes */\n onChange: (value: string) => void;\n /** Disable all inputs */\n disabled?: boolean;\n /** Show error styling */\n error?: boolean;\n /** Primary / accent color for focused box border */\n primaryColor?: string;\n /** Additional className on the container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function CodeInput({\n length = 6,\n value,\n onChange,\n disabled = false,\n error = false,\n primaryColor,\n className = \"\",\n}: CodeInputProps) {\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n\n const digits = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n\n const focusInput = useCallback(\n (idx: number) => {\n const clamped = Math.max(0, Math.min(idx, length - 1));\n inputsRef.current[clamped]?.focus();\n },\n [length],\n );\n\n const updateValue = useCallback(\n (idx: number, digit: string) => {\n const arr = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n arr[idx] = digit;\n // Trim trailing empty strings\n const newVal = arr.join(\"\").replace(/\\s+$/g, \"\");\n onChange(newVal);\n },\n [value, length, onChange],\n );\n\n const handleInput = useCallback(\n (idx: number, char: string) => {\n if (!/^\\d$/.test(char)) return;\n updateValue(idx, char);\n if (idx < length - 1) {\n focusInput(idx + 1);\n }\n },\n [updateValue, focusInput, length],\n );\n\n const handleKeyDown = useCallback(\n (idx: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\") {\n e.preventDefault();\n if (digits[idx] && digits[idx] !== \"\") {\n updateValue(idx, \"\");\n } else if (idx > 0) {\n updateValue(idx - 1, \"\");\n focusInput(idx - 1);\n }\n } else if (e.key === \"ArrowLeft\" && idx > 0) {\n e.preventDefault();\n focusInput(idx - 1);\n } else if (e.key === \"ArrowRight\" && idx < length - 1) {\n e.preventDefault();\n focusInput(idx + 1);\n }\n },\n [digits, updateValue, focusInput, length],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData(\"text\").replace(/\\D/g, \"\").slice(0, length);\n if (pasted.length > 0) {\n onChange(pasted);\n focusInput(Math.min(pasted.length, length - 1));\n }\n },\n [length, onChange, focusInput],\n );\n\n return (\n <div className={`flex justify-center gap-2 sm:gap-3 ${className}`}>\n {Array.from({ length }).map((_, idx) => (\n <input\n key={idx}\n ref={(el) => { inputsRef.current[idx] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n disabled={disabled}\n value={digits[idx] || \"\"}\n onChange={(e) => {\n const char = e.target.value.slice(-1);\n handleInput(idx, char);\n }}\n onKeyDown={(e) => handleKeyDown(idx, e)}\n onPaste={handlePaste}\n onFocus={(e) => {\n e.target.select();\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${resolvedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n className=\"w-10 h-11 sm:w-11 sm:h-12 text-center text-lg sm:text-xl font-bold rounded-lg border-2 bg-transparent text-[#2d2d2d] transition-all focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n borderColor: error\n ? \"var(--dashboard-status-danger, #EF4444)\"\n : \"rgba(45,45,45,0.2)\",\n }}\n />\n ))}\n </div>\n );\n}\n","import type { DashboardConfig } from \"./types\";\n\nexport const defaultConfig: DashboardConfig = {\n name: \"Dashboard\",\n colors: {\n primary: \"#37A501\",\n secondary: \"#f0f0f0\",\n background: \"#F2F2F2\",\n surface: \"#FFFFFF\",\n textPrimary: \"#2d2d2d\",\n textSecondary: \"#6b7280\",\n statusSuccess: \"#10B981\",\n statusDanger: \"#EF4444\",\n statusWarning: \"#F59E0B\",\n statusInfo: \"#3B82F6\",\n statusNeutral: \"#6B7280\",\n },\n components: {\n modal: {\n closeOnEscape: true,\n closeOnOverlayClick: true,\n },\n toast: {\n duration: 3000,\n position: \"top-right\",\n },\n notification: {\n duration: 5000,\n },\n pagination: {\n itemsPerPageOptions: [10, 20, 30, 50],\n defaultItemsPerPage: 10,\n },\n },\n};\n","import type { DashboardConfig } from \"./types\";\nimport { defaultConfig } from \"./defaults\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nfunction deepMerge<T>(target: T, source: DeepPartial<T>): T {\n const result = { ...target } as Record<string, unknown>;\n const src = source as Record<string, unknown>;\n\n for (const key in src) {\n const sourceVal = src[key];\n const targetVal = result[key];\n\n if (\n sourceVal !== null &&\n sourceVal !== undefined &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === \"object\" &&\n targetVal !== null &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal,\n sourceVal as DeepPartial<typeof targetVal>,\n );\n } else if (sourceVal !== undefined) {\n result[key] = sourceVal;\n }\n }\n\n return result as T;\n}\n\nexport function createConfig(\n overrides: DeepPartial<DashboardConfig> = {},\n): DashboardConfig {\n return deepMerge(defaultConfig, overrides);\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\n\nexport const ConfigContext = createContext<DashboardConfig | null>(null);\n\nexport function useConfig(): DashboardConfig {\n const config = useContext(ConfigContext);\n if (!config) {\n throw new Error(\"useConfig must be used within a DashboardProvider\");\n }\n return config;\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { ThemeContext } from \"../hooks/useTheme\";\nimport type { Theme } from \"../hooks/useTheme\";\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [theme, setThemeState] = useState<Theme>(\"system\");\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n const savedTheme = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (savedTheme) {\n setThemeState(savedTheme);\n }\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const currentTheme = savedTheme || \"system\";\n const resolved =\n currentTheme === \"system\" ? systemPreference : currentTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = (e: MediaQueryListEvent) => {\n const current = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (!current || current === \"system\") {\n const newResolved = e.matches ? \"dark\" : \"light\";\n setResolvedTheme(newResolved);\n document.documentElement.classList.toggle(\n \"dark\",\n newResolved === \"dark\",\n );\n }\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n localStorage.setItem(\"dashboard-theme\", newTheme);\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const resolved = newTheme === \"system\" ? systemPreference : newTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n };\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme, resolvedTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface LoadingContextType {\n isLoading: boolean;\n showLoading: () => void;\n hideLoading: () => void;\n}\n\nexport const LoadingContext = createContext<LoadingContextType | null>(null);\n\nexport function useLoading(): LoadingContextType {\n const context = useContext(LoadingContext);\n if (!context) {\n throw new Error(\"useLoading must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { LoadingContext } from \"../hooks/useLoading\";\nimport { Loading } from \"../components/Loading\";\n\nexport function LoadingProvider({ children }: { children: React.ReactNode }) {\n const [isLoading, setIsLoading] = useState(false);\n\n const showLoading = () => setIsLoading(true);\n const hideLoading = () => setIsLoading(false);\n\n return (\n <LoadingContext.Provider value={{ isLoading, showLoading, hideLoading }}>\n {children}\n {isLoading && <Loading size=\"lg\" text=\"Carregando...\" fullscreen />}\n </LoadingContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface Notification {\n id: string;\n title: string;\n subtitle: string;\n type: \"success\" | \"error\" | \"warning\" | \"info\";\n}\n\nexport interface NotificationsContextType {\n notifications: Notification[];\n addNotification: (notification: Omit<Notification, \"id\">) => void;\n removeNotification: (id: string) => void;\n clearNotifications: () => void;\n}\n\nexport const NotificationsContext =\n createContext<NotificationsContextType | null>(null);\n\nexport function useNotifications(): NotificationsContextType {\n const context = useContext(NotificationsContext);\n if (!context) {\n throw new Error(\"useNotifications must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { NotificationsContext } from \"../hooks/useNotifications\";\nimport type { Notification } from \"../hooks/useNotifications\";\nimport { useConfig } from \"../hooks/useConfig\";\nimport { Toast } from \"../components/Toast\";\n\nexport function NotificationsProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [notifications, setNotifications] = useState<Notification[]>([]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n const config = useConfig();\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n };\n }, []);\n\n const removeNotification = useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setNotifications((prev) => prev.filter((n) => n.id !== id));\n }, []);\n\n const addNotification = useCallback(\n (notification: Omit<Notification, \"id\">) => {\n const id = Math.random().toString(36).substring(2, 9);\n const newNotification: Notification = { ...notification, id };\n setNotifications((prev) => [...prev, newNotification]);\n },\n [],\n );\n\n const clearNotifications = useCallback(() => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n setNotifications([]);\n }, []);\n\n const duration = config.components.notification.duration;\n\n return (\n <NotificationsContext.Provider\n value={{\n notifications,\n addNotification,\n removeNotification,\n clearNotifications,\n }}\n >\n {children}\n {notifications.length > 0 && (\n <div className=\"fixed w-full max-w-[400px] px-4 z-50 top-4 left-1/2 -translate-x-1/2 sm:top-5 sm:right-4 sm:left-auto sm:translate-x-0 flex flex-col gap-2\">\n {notifications.map((notification) => (\n <Toast\n key={notification.id}\n title={notification.title}\n subtitle={notification.subtitle}\n type={notification.type}\n duration={duration}\n onClose={() => removeNotification(notification.id)}\n />\n ))}\n </div>\n )}\n </NotificationsContext.Provider>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\nimport { createConfig } from \"../config/createConfig\";\nimport { ConfigContext } from \"../hooks/useConfig\";\nimport { ThemeProvider } from \"./ThemeProvider\";\nimport { LoadingProvider } from \"./LoadingProvider\";\nimport { NotificationsProvider } from \"./NotificationsProvider\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ninterface DashboardProviderProps {\n config?: DeepPartial<DashboardConfig>;\n children: React.ReactNode;\n}\n\nfunction CSSVarsInjector({ config }: { config: DashboardConfig }) {\n useEffect(() => {\n const root = document.documentElement;\n const { colors } = config;\n\n root.style.setProperty(\"--dashboard-primary\", colors.primary);\n root.style.setProperty(\"--dashboard-secondary\", colors.secondary);\n root.style.setProperty(\"--dashboard-background\", colors.background);\n root.style.setProperty(\"--dashboard-surface\", colors.surface);\n root.style.setProperty(\"--dashboard-text-primary\", colors.textPrimary);\n root.style.setProperty(\"--dashboard-text-secondary\", colors.textSecondary);\n root.style.setProperty(\"--dashboard-status-success\", colors.statusSuccess);\n root.style.setProperty(\"--dashboard-status-danger\", colors.statusDanger);\n root.style.setProperty(\"--dashboard-status-warning\", colors.statusWarning);\n root.style.setProperty(\"--dashboard-status-info\", colors.statusInfo);\n root.style.setProperty(\"--dashboard-status-neutral\", colors.statusNeutral);\n\n return () => {\n root.style.removeProperty(\"--dashboard-primary\");\n root.style.removeProperty(\"--dashboard-secondary\");\n root.style.removeProperty(\"--dashboard-background\");\n root.style.removeProperty(\"--dashboard-surface\");\n root.style.removeProperty(\"--dashboard-text-primary\");\n root.style.removeProperty(\"--dashboard-text-secondary\");\n root.style.removeProperty(\"--dashboard-status-success\");\n root.style.removeProperty(\"--dashboard-status-danger\");\n root.style.removeProperty(\"--dashboard-status-warning\");\n root.style.removeProperty(\"--dashboard-status-info\");\n root.style.removeProperty(\"--dashboard-status-neutral\");\n };\n }, [config]);\n\n return null;\n}\n\nexport function DashboardProvider({\n config: configOverrides,\n children,\n}: DashboardProviderProps) {\n const config = useMemo(\n () => createConfig(configOverrides),\n [configOverrides],\n );\n\n return (\n <ConfigContext.Provider value={config}>\n <CSSVarsInjector config={config} />\n <ThemeProvider>\n <LoadingProvider>\n <NotificationsProvider>{children}</NotificationsProvider>\n </LoadingProvider>\n </ThemeProvider>\n </ConfigContext.Provider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["cn","cn","cn","cn","cn","cn","sizeConfig","cn","cn","cn","cn","cn","ChartJS","Title","cn","ChartJS","Title","cn","ChartJS","Title","cn","cn","ChartJS","Title","cn","cn","cn"],"sources":["../src/components/Loading/index.tsx","../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/components/Dropdown/index.tsx","../src/components/Table/index.tsx","../src/components/Modal/index.tsx","../src/components/Card/index.tsx","../src/components/Toast/index.tsx","../src/components/Pagination/index.tsx","../src/components/FormField/index.tsx","../src/components/Tabs/index.tsx","../src/components/DateRangePicker/index.tsx","../src/components/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/index.tsx","../src/hooks/useTheme.ts","../src/components/ThemeSwitcher/index.tsx","../src/components/KPICard/index.tsx","../src/components/PageLayout/index.tsx","../src/components/ComparisonLineChart/index.tsx","../src/components/HorizontalBarChart/index.tsx","../src/components/VerticalBarChart/index.tsx","../src/components/ProgressBarList/index.tsx","../src/components/MetricPanel/index.tsx","../src/components/FilterBar/index.tsx","../src/components/Checkbox/index.tsx","../src/components/AuthLayout/index.tsx","../src/components/CodeInput/index.tsx","../src/config/defaults.ts","../src/config/createConfig.ts","../src/hooks/useConfig.ts","../src/providers/ThemeProvider.tsx","../src/hooks/useLoading.ts","../src/providers/LoadingProvider.tsx","../src/hooks/useNotifications.ts","../src/providers/NotificationsProvider.tsx","../src/providers/DashboardProvider.tsx"],"sourcesContent":["import React from \"react\";\n\nexport interface LoadingProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n text?: string;\n textColor?: string;\n color?: string;\n variant?: \"spinner\" | \"border\";\n fullscreen?: boolean;\n}\n\nconst sizeMap = {\n sm: \"dashboard-spinner-sm\",\n md: \"dashboard-spinner-md\",\n lg: \"dashboard-spinner-lg\",\n};\n\nexport function Loading({\n size = \"md\",\n className = \"\",\n text,\n textColor,\n color,\n variant = \"spinner\",\n fullscreen = false,\n}: LoadingProps) {\n const variantClass = variant === \"border\" ? \"dashboard-spinner-border\" : \"dashboard-spinner\";\n\n const spinnerStyle = color ? { borderTopColor: color } : undefined;\n\n const spinner = (\n <div\n className={`flex flex-col items-center justify-center gap-4 ${className}`}\n >\n <div\n className={`${variantClass} ${sizeMap[size]}`}\n style={spinnerStyle}\n />\n {text && (\n <p\n className=\"text-sm font-medium animate-pulse\"\n style={{ color: textColor || color || \"var(--dashboard-primary)\" }}\n >\n {text}\n </p>\n )}\n </div>\n );\n\n if (fullscreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--dashboard-background,#f2f2f2)]/80 backdrop-blur-sm\">\n {spinner}\n </div>\n );\n }\n\n return spinner;\n}\n","import React from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n isLoading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Button({\n children,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n icon,\n iconPosition = \"left\",\n className,\n disabled,\n ...props\n}: ButtonProps) {\n const baseStyles =\n \"font-medium rounded-lg transition-all duration-200 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center\";\n\n const variantStyles = {\n primary: \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\",\n secondary:\n \"bg-[var(--dashboard-text-secondary,#6b7280)]/20 text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/30\",\n danger: \"bg-[var(--dashboard-status-danger,#EF4444)] text-white hover:opacity-90\",\n ghost:\n \"bg-transparent hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-primary,#2d2d2d)]\",\n };\n\n const sizeStyles = {\n sm: \"px-2 py-1 text-xs sm:px-3 sm:py-1.5 sm:text-sm\",\n md: \"px-3 py-1.5 text-sm sm:px-4 sm:py-2 sm:text-base\",\n lg: \"px-4 py-2 text-base sm:px-6 sm:py-3 sm:text-lg\",\n };\n\n const iconOnlySizeStyles = {\n sm: \"w-7 h-7 sm:w-8 sm:h-8\",\n md: \"w-9 h-9 sm:w-10 sm:h-10\",\n lg: \"w-10 h-10 sm:w-12 sm:h-12\",\n };\n\n const isIconOnly =\n !!icon &&\n (children === undefined ||\n children === null ||\n (typeof children === \"string\" && children.trim() === \"\"));\n\n return (\n <button\n className={cn(\n baseStyles,\n variantStyles[variant],\n isIconOnly ? iconOnlySizeStyles[size] : sizeStyles[size],\n className,\n )}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading ? (\n <span className=\"flex items-center gap-2\">\n <Loading size=\"sm\" color=\"currentColor\" />\n Carregando...\n </span>\n ) : isIconOnly ? (\n icon\n ) : (\n <>\n {icon && iconPosition === \"left\" && (\n <span className=\"mr-2\">{icon}</span>\n )}\n {children}\n {icon && iconPosition === \"right\" && (\n <span className=\"ml-2\">{icon}</span>\n )}\n </>\n )}\n </button>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n children?: ReactNode;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", label, error, children, id, ...props }, ref) => {\n const inputId = id || (label ? `input-${label.toLowerCase().replace(/\\s+/g, \"-\")}` : undefined);\n\n return (\n <div className=\"w-full\">\n {label && (\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label}\n </label>\n )}\n <div className=\"relative flex items-center w-full\">\n <input\n type={type}\n id={inputId}\n className={cn(\n \"flex h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] px-3 py-2 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : undefined,\n children ? \"pr-10\" : undefined,\n className,\n )}\n ref={ref}\n {...props}\n />\n {children && (\n <div className=\"absolute right-3 flex items-center\">{children}</div>\n )}\n </div>\n {error && (\n <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown, Check } from \"lucide-react\";\n\nexport interface DropdownOption {\n value: string;\n label: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport interface DropdownProps {\n options: DropdownOption[];\n value?: string;\n onChange: (value: string) => void;\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n containerClassName?: string;\n fullWidth?: boolean;\n size?: \"small\" | \"medium\" | \"large\";\n error?: string;\n variant?: \"default\" | \"underline\" | \"simple\" | \"compact\";\n customDropdownHeight?: string;\n icon?: React.ReactNode;\n fitContent?: boolean;\n isActive?: boolean;\n}\n\nexport function Dropdown({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione uma opção\",\n disabled = false,\n className = \"\",\n containerClassName = \"\",\n fullWidth = false,\n size = \"medium\",\n error,\n variant = \"default\",\n customDropdownHeight,\n icon,\n fitContent = false,\n isActive = false,\n}: DropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0, width: 0 });\n const dropdownRef = useRef<HTMLDivElement>(null);\n const selectedOption = options.find((option) => option.value === value);\n\n const sizeStyles = {\n small: {\n container: \"h-8 px-2\",\n text: \"text-xs\",\n wrapper: \"space-y-1\",\n label: \"text-sm\",\n iconPadding: \"pl-8\",\n },\n medium: {\n container: \"h-10 px-3\",\n text: \"text-sm\",\n wrapper: \"space-y-2\",\n label: \"text-base\",\n iconPadding: \"pl-10\",\n },\n large: {\n container: \"h-12 px-4\",\n text: \"text-lg\",\n wrapper: \"space-y-3\",\n label: \"text-lg\",\n iconPadding: \"pl-12\",\n },\n };\n\n const selectedStyle = sizeStyles[size];\n\n const variantStyles = {\n default:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50 focus:outline-none focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)] focus:border-transparent\",\n underline: \"border-b border-[var(--dashboard-text-secondary,#6b7280)]/30 rounded-none hover:border-b-[var(--dashboard-text-secondary,#6b7280)]/50\",\n simple:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 hover:border-[var(--dashboard-text-secondary,#6b7280)]/30 focus:outline-none\",\n compact:\n \"rounded-full hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 focus:outline-none\",\n };\n\n const variantBackgrounds = {\n default: \"bg-[var(--dashboard-surface,#ffffff)]\",\n underline: \"bg-transparent\",\n simple: \"bg-[var(--dashboard-surface,#ffffff)]\",\n compact: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n };\n\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const rect = dropdownRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled) {\n if (isOpen) {\n handleClose();\n } else {\n calculatePosition();\n setIsVisible(true);\n setTimeout(() => setIsOpen(true), 10);\n }\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n setTimeout(() => setIsVisible(false), 150);\n };\n\n const handleSelect = (option: DropdownOption) => {\n onChange(option.value);\n handleClose();\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (portal && !portal.contains(event.target as Node)) {\n if (isOpen) handleClose();\n }\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n useEffect(() => {\n const handleResize = () => {\n if (isOpen) calculatePosition();\n };\n\n const handleScroll = (event: Event) => {\n if (isOpen) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (!portal || !portal.contains(event.target as Node)) {\n handleClose();\n }\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleScroll, true);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleScroll, true);\n };\n }, [isOpen]);\n\n return (\n <div\n className={`${selectedStyle.wrapper} ${containerClassName} ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"\"\n }`}\n >\n {label && (\n <label\n className={`block text-[var(--dashboard-text-primary,#2d2d2d)] ${selectedStyle.label}`}\n >\n {label}\n </label>\n )}\n\n <div ref={dropdownRef} className=\"relative\">\n {icon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-[var(--dashboard-text-secondary,#6b7280)] h-4 w-4 pointer-events-none\">\n {icon}\n </div>\n )}\n <div\n onClick={toggleDropdown}\n className={`flex ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"w-full\"\n } items-center justify-between ${selectedStyle.container} ${\n icon ? selectedStyle.iconPadding : \"\"\n } ${\n error\n ? \"rounded-lg border border-[var(--dashboard-status-danger,#EF4444)]\"\n : disabled\n ? \"border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : isActive\n ? \"rounded-lg border border-[var(--dashboard-primary,#37a501)]\"\n : variantStyles[variant]\n } ${className} cursor-pointer transition-colors duration-200 ${\n disabled\n ? \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : selectedOption?.backgroundColor || variantBackgrounds[variant]\n }`}\n style={\n selectedOption?.backgroundColor\n ? { backgroundColor: selectedOption.backgroundColor }\n : undefined\n }\n >\n <span\n className={`block truncate select-none ${selectedStyle.text} ${\n selectedOption\n ? selectedOption.color\n ? \"\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\"\n } ${disabled ? \"text-[var(--dashboard-text-secondary,#6b7280)] opacity-50\" : \"\"}`}\n style={\n selectedOption?.color\n ? { color: selectedOption.color }\n : undefined\n }\n >\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDown\n className={`h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] transition-transform duration-200 ${\n isOpen ? \"rotate-180 transform\" : \"\"\n }`}\n />\n </div>\n\n {isVisible &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n className={`dashboard-dropdown-portal overflow-y-auto rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg transition-all duration-200 ease-in-out ${\n isOpen\n ? `opacity-100 ${customDropdownHeight || \"max-h-60\"}`\n : \"max-h-0 opacity-0\"\n }`}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n width: position.width,\n zIndex: 9999,\n }}\n >\n <ul className=\"py-1\">\n {options.length > 0 ? (\n options.map((option) => {\n const isSelected = option.value === value;\n return (\n <li\n data-modal-ignore\n key={option.value}\n onClick={() => handleSelect(option)}\n className={`cursor-pointer px-3 py-2 text-left select-none hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors flex items-center justify-between ${\n isSelected\n ? \"text-[var(--dashboard-primary,#37a501)] font-medium\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n } ${selectedStyle.text}`}\n >\n <span>{option.label}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 text-[var(--dashboard-primary,#37a501)]\" />\n )}\n </li>\n );\n })\n ) : (\n <li\n className={`px-3 py-2 text-[var(--dashboard-text-secondary,#6b7280)] italic ${selectedStyle.text}`}\n >\n Não há opções disponíveis\n </li>\n )}\n </ul>\n </div>,\n document.body,\n )}\n </div>\n\n {error && (\n <p className={`mt-1 ${selectedStyle.text} text-[var(--dashboard-status-danger,#EF4444)]`}>{error}</p>\n )}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface TableColumn<T> {\n key: string;\n header: string;\n render: (item: T) => ReactNode;\n width?: string;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n isLoading?: boolean;\n emptyMessage?: string;\n emptyIcon?: ReactNode;\n loadingComponent?: ReactNode;\n emptyComponent?: ReactNode;\n keyExtractor: (item: T) => string;\n className?: string;\n}\n\nexport function Table<T>({\n columns,\n data,\n onRowClick,\n isLoading = false,\n emptyMessage = \"Nenhum registro encontrado\",\n emptyIcon,\n loadingComponent,\n emptyComponent,\n keyExtractor,\n className = \"\",\n}: TableProps<T>) {\n if (isLoading) {\n return loadingComponent ? <>{loadingComponent}</> : <TableSkeleton />;\n }\n\n if (data.length === 0) {\n return emptyComponent ? (\n <>{emptyComponent}</>\n ) : (\n <TableEmpty message={emptyMessage} icon={emptyIcon} />\n );\n }\n\n return (\n <div\n className={`overflow-x-auto bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <TableHeader columns={columns} />\n <TableBody\n columns={columns}\n data={data}\n onRowClick={onRowClick}\n keyExtractor={keyExtractor}\n />\n </table>\n </div>\n );\n}\n\nexport function TableHeader<T>({ columns }: { columns: TableColumn<T>[] }) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <thead className=\"bg-[var(--dashboard-text-secondary,#6b7280)]/5\">\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n className={`px-6 py-3 text-xs font-semibold text-[var(--dashboard-text-secondary,#6b7280)] uppercase tracking-wider ${alignClass(column.align)} ${\n column.width ? `w-[${column.width}]` : \"\"\n }`}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n );\n}\n\nexport function TableBody<T>({\n columns,\n data,\n onRowClick,\n keyExtractor,\n}: {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n keyExtractor: (item: T) => string;\n}) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <tbody className=\"bg-[var(--dashboard-surface,#ffffff)] divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n {data.map((item) => (\n <tr\n key={keyExtractor(item)}\n onClick={() => onRowClick?.(item)}\n className={`hover:bg-[var(--dashboard-text-secondary,#6b7280)]/5 transition-colors duration-150 ${\n onRowClick ? \"cursor-pointer\" : \"\"\n }`}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={`px-6 py-4 whitespace-nowrap text-sm ${alignClass(column.align)}`}\n >\n {column.render(item)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n );\n}\n\nexport function TableSkeleton() {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\">\n <div className=\"flex items-center justify-center h-64\">\n <Loading size=\"lg\" text=\"Carregando dados...\" />\n </div>\n </div>\n );\n}\n\nexport function TableEmpty({\n message,\n icon,\n}: {\n message: string;\n icon?: ReactNode;\n}) {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-12\">\n <div className=\"text-center\">\n {icon || (\n <svg\n className=\"mx-auto h-12 w-12 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )}\n <p className=\"mt-4 text-[var(--dashboard-text-secondary,#6b7280)]\">{message}</p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"../Button\";\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave?: () => void;\n title?: string;\n children: React.ReactNode;\n showFooter?: boolean;\n saveButtonText?: string;\n cancelButtonText?: string;\n size?: \"small\" | \"medium\" | \"large\" | \"extraLarge\" | \"largeXl\";\n disableSaveButton?: boolean;\n saveButtonVariant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n closeOnEscape?: boolean;\n closeOnOverlayClick?: boolean;\n}\n\nexport function Modal({\n isOpen,\n onClose,\n onSave,\n title = \"\",\n children,\n showFooter = false,\n saveButtonText = \"Salvar\",\n cancelButtonText = \"Cancelar\",\n size = \"medium\",\n disableSaveButton = false,\n saveButtonVariant = \"primary\",\n closeOnEscape = true,\n closeOnOverlayClick = true,\n}: ModalProps) {\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n const modalRef = useRef<HTMLDivElement>(null);\n const prevIsOpenRef = useRef(false);\n\n const sizeClasses = {\n small: \"max-w-sm\",\n medium: \"max-w-md\",\n large: \"max-w-lg\",\n largeXl: \"max-w-4xl\",\n extraLarge: \"max-w-screen-xl\",\n };\n\n useEffect(() => {\n if (isOpen && !prevIsOpenRef.current) {\n setShouldRender(true);\n setIsClosing(false);\n } else if (!isOpen && prevIsOpenRef.current) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n }, 150);\n return () => clearTimeout(timer);\n }\n prevIsOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => {\n setIsClosing(false);\n onClose();\n }, 150);\n }, [onClose]);\n\n useEffect(() => {\n if (!closeOnOverlayClick) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n modalRef.current &&\n !modalRef.current.contains(event.target as Node) &&\n !target.closest(\"[data-modal-ignore]\")\n ) {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n if (!shouldRender) {\n document.body.style.overflow = \"auto\";\n }\n };\n }, [shouldRender, isClosing, handleClose, closeOnOverlayClick]);\n\n useEffect(() => {\n if (!closeOnEscape) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"keydown\", handleEscKey);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscKey);\n };\n }, [shouldRender, isClosing, handleClose, closeOnEscape]);\n\n if (!shouldRender && !isOpen) return null;\n\n return (\n <div\n className={`fixed inset-0 z-[10000] flex items-center justify-center bg-black/50 backdrop-blur-sm p-4 ${\n isClosing ? \"dashboard-animate-fade-out\" : \"dashboard-animate-fade-in\"\n }`}\n aria-modal=\"true\"\n role=\"dialog\"\n aria-labelledby={title ? \"modal-title\" : undefined}\n >\n <div\n ref={modalRef}\n className={`w-full rounded-lg bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#6b7280)]/20 shadow-xl ${\n sizeClasses[size]\n } flex max-h-[90vh] flex-col transition-transform duration-200 ease-in-out ${\n isClosing ? \"scale-95 opacity-0\" : \"scale-100 opacity-100\"\n }`}\n >\n <div className=\"flex h-fit items-center justify-between border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 p-4\">\n {title && (\n <h2\n id=\"modal-title\"\n className=\"text-xl font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\"\n >\n {title}\n </h2>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClose}\n className=\"ml-auto rounded-md\"\n aria-label=\"Fechar modal\"\n icon={<X className=\"h-5 w-5\" />}\n />\n </div>\n\n <div className=\"flex-grow overflow-y-auto p-6\">{children}</div>\n\n {showFooter && (\n <div className=\"flex justify-end gap-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 p-4\">\n <Button variant=\"secondary\" onClick={handleClose} size=\"md\">\n {cancelButtonText}\n </Button>\n <Button\n variant={saveButtonVariant}\n onClick={onSave}\n disabled={disableSaveButton}\n size=\"md\"\n >\n {saveButtonText}\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface CardProps {\n children: React.ReactNode;\n className?: string;\n title?: string;\n subtitle?: string;\n icon?: React.ReactNode;\n headerActions?: React.ReactNode;\n showDivider?: boolean;\n}\n\nexport function Card({\n children,\n className = \"\",\n title,\n subtitle,\n icon,\n headerActions,\n showDivider = false,\n}: CardProps) {\n return (\n <div\n className={`bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n <div className=\"p-4\">\n {title && (\n <div className={showDivider ? \"mb-4\" : \"mb-3\"}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {icon && (\n <div className=\"text-[var(--dashboard-text-secondary,#6b7280)]\">{icon}</div>\n )}\n <h3\n className={`${showDivider ? \"font-medium\" : \"text-base font-semibold\"} text-[var(--dashboard-text-primary,#2d2d2d)] truncate`}\n >\n {title}\n </h3>\n </div>\n {headerActions && (\n <div className=\"flex gap-2\">{headerActions}</div>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mt-1\">\n {subtitle}\n </p>\n )}\n {showDivider && (\n <div className=\"w-full h-px bg-[var(--dashboard-text-secondary,#6b7280)]/20 mt-4\" />\n )}\n </div>\n )}\n {children}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState, useCallback } from \"react\";\nimport { X, CheckCircle, XCircle, AlertTriangle, Info } from \"lucide-react\";\n\nexport interface ToastProps {\n title: string;\n subtitle?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n duration?: number;\n onClose: () => void;\n showProgress?: boolean;\n}\n\nconst typeConfig = {\n success: {\n bg: \"bg-[var(--dashboard-status-success,#10B981)]\",\n icon: CheckCircle,\n },\n error: {\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]\",\n icon: XCircle,\n },\n warning: {\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: AlertTriangle,\n },\n info: {\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]\",\n icon: Info,\n },\n};\n\nexport function Toast({\n title,\n subtitle,\n type = \"success\",\n duration = 4000,\n onClose,\n showProgress = true,\n}: ToastProps) {\n const [exiting, setExiting] = useState(false);\n\n const handleClose = useCallback(() => {\n setExiting(true);\n setTimeout(onClose, 200);\n }, [onClose]);\n\n useEffect(() => {\n if (duration <= 0) return;\n\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration, handleClose]);\n\n const { bg, icon: Icon } = typeConfig[type];\n\n return (\n <div\n className={`${bg} text-white rounded-lg shadow-xl shadow-black/15 overflow-hidden ${\n exiting ? \"dashboard-toast-exit\" : \"dashboard-toast-enter\"\n }`}\n role=\"alert\"\n >\n <div className=\"flex items-start gap-3 p-4\">\n <Icon className=\"w-5 h-5 mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-sm\">{title}</p>\n {subtitle && <p className=\"text-xs opacity-90 mt-0.5\">{subtitle}</p>}\n </div>\n <button\n onClick={handleClose}\n className=\"shrink-0 hover:opacity-75 transition-opacity cursor-pointer\"\n aria-label=\"Fechar\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {showProgress && duration > 0 && !exiting && (\n <div className=\"h-0.5 bg-white/20\">\n <div\n className=\"h-full bg-white/60\"\n style={{\n animation: `dashboard-toast-progress ${duration}ms linear forwards`,\n }}\n />\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from \"lucide-react\";\nimport { Button } from \"../Button\";\nimport { Dropdown } from \"../Dropdown\";\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n itemsPerPage: number;\n totalItems: number;\n onItemsPerPageChange?: (itemsPerPage: number) => void;\n itemsPerPageOptions?: number[];\n showPageInfo?: boolean;\n compact?: boolean;\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n onItemsPerPageChange,\n itemsPerPageOptions = [10, 20, 30, 50],\n showPageInfo = true,\n compact = false,\n className = \"\",\n}: PaginationProps) {\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisible = compact ? 3 : 5;\n const halfVisible = Math.floor(maxVisible / 2);\n\n if (totalPages <= maxVisible + 2) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, currentPage - halfVisible);\n let endPage = Math.min(totalPages - 1, currentPage + halfVisible);\n\n if (currentPage <= halfVisible + 1) {\n endPage = maxVisible;\n } else if (currentPage >= totalPages - halfVisible) {\n startPage = totalPages - maxVisible + 1;\n }\n\n if (startPage > 2) pages.push(\"...\");\n for (let i = startPage; i <= endPage; i++) pages.push(i);\n if (endPage < totalPages - 1) pages.push(\"...\");\n if (totalPages > 1) pages.push(totalPages);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const canGoPrevious = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n\n const handlePageClick = (page: number | string) => {\n if (typeof page === \"number\" && page !== currentPage) {\n onPageChange(page);\n }\n };\n\n const dropdownOptions = itemsPerPageOptions.map((opt) => ({\n value: String(opt),\n label: String(opt),\n }));\n\n return (\n <div\n className={`flex items-center justify-between gap-4 flex-wrap px-4 py-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n {onItemsPerPageChange && !compact && (\n <div className=\"hidden md:flex items-center gap-2\">\n <Dropdown\n options={dropdownOptions}\n value={String(itemsPerPage)}\n onChange={(val) => onItemsPerPageChange(Number(val))}\n size=\"small\"\n variant=\"compact\"\n fitContent\n />\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n Itens por página\n </span>\n </div>\n )}\n\n {showPageInfo && (\n <div className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {totalItems > 0 ? (\n <>\n <span className=\"hidden sm:inline\">\n Mostrando {startItem} - {endItem} de {totalItems} itens\n </span>\n <span className=\"sm:hidden\">\n {startItem}-{endItem} de {totalItems}\n </span>\n </>\n ) : (\n <span>Nenhum item encontrado</span>\n )}\n </div>\n )}\n\n <div className=\"flex items-center gap-1\">\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(1)}\n disabled={!canGoPrevious}\n icon={<ChevronsLeft size={16} />}\n aria-label=\"Primeira página\"\n />\n </div>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage - 1)}\n disabled={!canGoPrevious}\n icon={<ChevronLeft size={16} />}\n aria-label=\"Página anterior\"\n />\n\n <div className=\"flex items-center gap-1\">\n {pageNumbers.map((page, index) => (\n <React.Fragment key={`${page}-${index}`}>\n {page === \"...\" ? (\n <span className=\"px-2 text-[var(--dashboard-text-secondary,#6b7280)]\">...</span>\n ) : (\n <Button\n variant={page === currentPage ? \"primary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => handlePageClick(page)}\n className={`min-w-[32px] h-8 !px-2 ${\n page === currentPage ? \"font-medium\" : \"\"\n }`}\n aria-label={`Página ${page}`}\n aria-current={page === currentPage ? \"page\" : undefined}\n >\n {page}\n </Button>\n )}\n </React.Fragment>\n ))}\n </div>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage + 1)}\n disabled={!canGoNext}\n icon={<ChevronRight size={16} />}\n aria-label=\"Próxima página\"\n />\n\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(totalPages)}\n disabled={!canGoNext}\n icon={<ChevronsRight size={16} />}\n aria-label=\"Última página\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { Input } from \"../Input\";\n\nexport interface FormFieldProps {\n label: string;\n name: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\" | \"tel\";\n value: string;\n onChange: (value: string) => void;\n error?: string;\n required?: boolean;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function FormField({\n label,\n name,\n type = \"text\",\n value,\n onChange,\n error,\n required = false,\n placeholder,\n disabled = false,\n className = \"\",\n}: FormFieldProps) {\n return (\n <div className={className}>\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label} {required && <span className=\"text-[var(--dashboard-status-danger,#EF4444)]\">*</span>}\n </label>\n <Input\n type={type}\n id={name}\n name={name}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={placeholder}\n className={error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : \"\"}\n />\n {error && <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\n\nexport interface Tab {\n id: string;\n label: string;\n count?: number;\n icon?: ReactNode;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n activeTab: string;\n onChange: (tabId: string) => void;\n /** Estilo visual das tabs. Default: \"underline\" */\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Tabs({ tabs, activeTab, onChange, variant = \"underline\", className }: TabsProps) {\n if (variant === \"pill\") {\n return (\n <div className={cn(\"flex flex-wrap gap-2\", className)} role=\"tablist\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"flex items-center gap-2 px-4 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-white/20 text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className={cn(\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20\", className)}>\n <nav className=\"flex gap-6\" aria-label=\"Tabs\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"relative pb-3 px-1 text-sm font-medium transition-colors border-b-2 flex items-center gap-2 cursor-pointer\",\n isActive\n ? \"text-[var(--dashboard-primary,#37a501)] border-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:text-[var(--dashboard-text-primary,#2d2d2d)] border-transparent\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </nav>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport type DateRange = {\n start: Date | null;\n end: Date | null;\n};\n\nexport interface DateRangePickerProps {\n value: DateRange;\n onChange: (range: DateRange) => void;\n locale?: \"pt\" | \"en\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst locales = {\n pt: {\n months: [\n \"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\",\n \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\",\n ],\n weekDays: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n prevMonth: \"Mês anterior\",\n nextMonth: \"Próximo mês\",\n },\n en: {\n months: [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n ],\n weekDays: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n prevMonth: \"Previous month\",\n nextMonth: \"Next month\",\n },\n};\n\nexport function DateRangePicker({\n value,\n onChange,\n locale = \"pt\",\n className,\n}: DateRangePickerProps) {\n const [currentMonth, setCurrentMonth] = useState(new Date());\n const l = locales[locale];\n\n const getDaysInMonth = (date: Date) => {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const startDayOfWeek = firstDay.getDay();\n\n const days: (number | null)[] = [];\n for (let i = 0; i < startDayOfWeek; i++) {\n days.push(null);\n }\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n return days;\n };\n\n const handleDayClick = (day: number) => {\n const selectedDate = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n\n if (!value.start || (value.start && value.end)) {\n onChange({ start: selectedDate, end: null });\n } else if (value.start && !value.end) {\n if (selectedDate >= value.start) {\n onChange({ start: value.start, end: selectedDate });\n } else {\n onChange({ start: selectedDate, end: value.start });\n }\n }\n };\n\n const isDateInRange = (day: number) => {\n if (!value.start || !value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date > value.start && date < value.end;\n };\n\n const isStartDate = (day: number) => {\n if (!value.start) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.start.getTime();\n };\n\n const isEndDate = (day: number) => {\n if (!value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.end.getTime();\n };\n\n const previousMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1),\n );\n };\n\n const nextMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),\n );\n };\n\n const days = getDaysInMonth(currentMonth);\n\n return (\n <div\n className={cn(\n \"w-64 bg-[var(--dashboard-surface,#ffffff)] rounded-lg p-4 shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={previousMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.prevMonth}\n >\n <ChevronLeft className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n\n <h2 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {l.months[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h2>\n\n <button\n onClick={nextMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.nextMonth}\n >\n <ChevronRight className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-7\">\n {l.weekDays.map((day, index) => (\n <div\n key={index}\n className=\"h-8 w-8 flex items-center justify-center text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\"\n >\n {day}\n </div>\n ))}\n\n {days.map((day, index) => {\n if (day === null) {\n return <div key={`empty-${index}`} className=\"h-8 w-8\" />;\n }\n\n const inRange = isDateInRange(day);\n const isStart = isStartDate(day);\n const isEnd = isEndDate(day);\n const isSelected = isStart || isEnd;\n const hasCompletePeriod = value.start && value.end;\n\n return (\n <div key={day} className=\"relative h-8 w-8\">\n {hasCompletePeriod && (inRange || isStart || isEnd) && (\n <div\n className={cn(\n \"absolute inset-0 bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n isStart && \"rounded-l-full\",\n isEnd && \"rounded-r-full\",\n )}\n />\n )}\n <button\n onClick={() => handleDayClick(day)}\n className={cn(\n \"relative h-8 w-8 flex items-center justify-center text-xs font-medium transition-colors z-10 rounded-full cursor-pointer\",\n isSelected\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {day}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n weight?: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | \"extrabold\";\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst defaultSizeByLevel: Record<number, string> = {\n 1: \"text-2xl sm:text-3xl md:text-4xl lg:text-5xl\",\n 2: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl\",\n 3: \"text-lg sm:text-xl md:text-2xl lg:text-3xl\",\n 4: \"text-base sm:text-lg md:text-xl lg:text-2xl\",\n 5: \"text-sm sm:text-base md:text-lg lg:text-xl\",\n 6: \"text-xs sm:text-sm md:text-base lg:text-lg\",\n};\n\nconst customSizes: Record<string, string> = {\n xs: \"text-xs sm:text-sm\",\n sm: \"text-sm sm:text-base\",\n md: \"text-base sm:text-lg\",\n lg: \"text-lg sm:text-xl md:text-2xl\",\n xl: \"text-xl sm:text-2xl md:text-3xl\",\n \"2xl\": \"text-2xl sm:text-3xl md:text-4xl\",\n \"3xl\": \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl\",\n};\n\nconst weightStyles: Record<string, string> = {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n extrabold: \"font-extrabold\",\n};\n\nconst alignStyles: Record<string, string> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\nexport function Title({\n children,\n level = 1,\n size,\n weight = \"bold\",\n align = \"left\",\n color,\n className,\n ...props\n}: TitleProps) {\n const Tag = `h${level}` as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n const sizeClass = size ? customSizes[size] : defaultSizeByLevel[level];\n const colorClass = color || \"text-[var(--dashboard-text-primary,#2d2d2d)]\";\n\n return (\n <Tag\n className={cn(\n sizeClass,\n weightStyles[weight],\n alignStyles[align],\n colorClass,\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n );\n}\n","import React from \"react\";\n\nexport interface ToggleSwitchProps {\n enabled: boolean;\n onChange: (enabled: boolean) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst sizeConfig = {\n sm: {\n track: \"h-5 w-9\",\n thumb: \"h-3 w-3\",\n translateOn: \"translate-x-5\",\n translateOff: \"translate-x-1\",\n },\n md: {\n track: \"h-6 w-11\",\n thumb: \"h-4 w-4\",\n translateOn: \"translate-x-6\",\n translateOff: \"translate-x-1\",\n },\n lg: {\n track: \"h-7 w-14\",\n thumb: \"h-5 w-5\",\n translateOn: \"translate-x-8\",\n translateOff: \"translate-x-1\",\n },\n};\n\nexport function ToggleSwitch({\n enabled,\n onChange,\n disabled = false,\n size = \"md\",\n label,\n className,\n}: ToggleSwitchProps) {\n const config = sizeConfig[size];\n\n return (\n <div className={cn(\"inline-flex items-center gap-2\", className)}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n disabled={disabled}\n onClick={() => onChange(!enabled)}\n className={cn(\n \"relative inline-flex items-center rounded-full transition-colors outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--dashboard-primary,#37a501)]\",\n config.track,\n enabled\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/30\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <span\n className={cn(\n \"inline-block transform rounded-full bg-white shadow-sm transition-transform\",\n config.thumb,\n enabled ? config.translateOn : config.translateOff,\n )}\n />\n </button>\n {label && (\n <span\n className={cn(\n \"text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\",\n disabled && \"opacity-50\",\n )}\n >\n {label}\n </span>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface BadgeStatusProps {\n label: string;\n variant?: \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n color?: string;\n bgColor?: string;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantStyles: Record<string, { color: string; bgColor: string }> = {\n success: {\n color: \"text-[var(--dashboard-status-success,#10B981)]\",\n bgColor: \"bg-[var(--dashboard-status-success,#10B981)]/10\",\n },\n warning: {\n color: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n bgColor: \"bg-[var(--dashboard-status-warning,#f59e0b)]/10\",\n },\n danger: {\n color: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n bgColor: \"bg-[var(--dashboard-status-danger,#EF4444)]/10\",\n },\n info: {\n color: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n bgColor: \"bg-[var(--dashboard-status-info,#3b82f6)]/10\",\n },\n neutral: {\n color: \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n bgColor: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n },\n};\n\nconst sizeClasses: Record<string, string> = {\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-3 py-1 text-sm\",\n};\n\nexport function BadgeStatus({\n label,\n variant = \"neutral\",\n color,\n bgColor,\n size = \"md\",\n className,\n}: BadgeStatusProps) {\n const styles = variantStyles[variant];\n const useCustomColors = color || bgColor;\n\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full font-medium whitespace-nowrap\",\n sizeClasses[size],\n !useCustomColors && styles.color,\n !useCustomColors && styles.bgColor,\n className,\n )}\n style={\n useCustomColors\n ? {\n color: color || undefined,\n backgroundColor: bgColor || undefined,\n }\n : undefined\n }\n >\n {label}\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useState, ReactNode } from \"react\";\nimport { LogOut, ChevronDown, User } from \"lucide-react\";\n\nexport interface SidebarMenuItem {\n id: string;\n label: string;\n href: string;\n icon: React.ComponentType<{ size?: number; className?: string; style?: React.CSSProperties }>;\n}\n\nexport interface SidebarUser {\n name: string;\n email: string;\n subtitle?: string;\n}\n\nexport interface SidebarProps {\n menuItems: SidebarMenuItem[];\n logo: ReactNode;\n collapsedLogo?: ReactNode;\n currentPath: string;\n linkComponent?: React.ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n }>;\n isCollapsed?: boolean;\n onToggleCollapse?: () => void;\n user?: SidebarUser;\n onUserClick?: () => void;\n onLogout?: () => void;\n logoutLabel?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction DefaultLink({\n href,\n className,\n children,\n}: {\n href: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <a href={href} className={className}>\n {children}\n </a>\n );\n}\n\nexport function Sidebar({\n menuItems,\n logo,\n collapsedLogo,\n currentPath,\n linkComponent: LinkComponent = DefaultLink,\n isCollapsed = false,\n onToggleCollapse,\n user,\n onUserClick,\n onLogout,\n logoutLabel = \"Sair\",\n className,\n}: SidebarProps) {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n const cubicBezier = \"cubic-bezier(0.4, 0, 0.2, 1)\";\n\n return (\n <>\n {/* Mobile Header */}\n <header className=\"xl:hidden fixed top-0 left-0 right-0 z-40 bg-[var(--dashboard-background,#f2f2f2)] border-b border-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <div className=\"flex items-center justify-center px-4 h-16 relative\">\n <div className=\"flex items-center\">{logo}</div>\n\n <button\n onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n className=\"absolute right-4 inline-flex items-center justify-center rounded-lg text-sm font-medium transition-colors cursor-pointer bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/20 h-10 w-10\"\n aria-label=\"Menu\"\n aria-expanded={isMobileMenuOpen}\n >\n <ChevronDown\n size={24}\n className={`transition-transform duration-200 ${\n isMobileMenuOpen ? \"rotate-180\" : \"\"\n }`}\n />\n </button>\n </div>\n\n <nav\n className={`absolute top-16 left-0 right-0 bg-[var(--dashboard-background,#f2f2f2)] border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 shadow-lg transition-all duration-200 overflow-hidden ${\n isMobileMenuOpen ? \"max-h-[500px]\" : \"max-h-0\"\n }`}\n >\n <div className=\"px-4 py-2\">\n {menuItems.map((item) => {\n const Icon = item.icon;\n const isActive = currentPath === item.href;\n\n return (\n <LinkComponent\n key={item.id}\n href={item.href}\n className=\"block\"\n >\n <div\n className={cn(\n \"w-full flex items-center justify-start px-4 py-3 rounded-lg text-sm font-medium transition-colors mb-1 cursor-pointer\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/15 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\",\n )}\n >\n <Icon size={20} className=\"mr-3 flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{item.label}</span>\n </div>\n </LinkComponent>\n );\n })}\n\n <div className=\"mt-2 pt-2 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className=\"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#37a501)]/20 text-[var(--dashboard-text-primary,#2d2d2d)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div className=\"ml-3 text-left\">\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"w-full flex items-center justify-start px-4 py-3 rounded-lg text-sm font-medium transition-colors cursor-pointer text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\"\n >\n <LogOut size={20} className=\"mr-3 flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{logoutLabel}</span>\n </button>\n )}\n </div>\n </div>\n </nav>\n </header>\n\n {/* Desktop Sidebar */}\n <aside\n className={cn(\n \"hidden xl:flex xl:flex-col xl:fixed xl:left-0 xl:top-0 xl:h-screen bg-[var(--dashboard-background,#f2f2f2)] border-r border-[var(--dashboard-text-secondary,#6b7280)]/20 overflow-visible\",\n isCollapsed ? \"xl:w-[109px]\" : \"xl:w-[280px]\",\n className,\n )}\n style={{ transition: `width 400ms ${cubicBezier}` }}\n >\n {/* Toggle Button */}\n {onToggleCollapse && (\n <button\n onClick={onToggleCollapse}\n className=\"absolute top-16 -right-[18px] -translate-y-1/2 z-50 flex items-center justify-center cursor-pointer\"\n aria-label={isCollapsed ? \"Expandir sidebar\" : \"Recolher sidebar\"}\n style={{ width: \"20px\", height: \"193px\" }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"193\"\n viewBox=\"0 0 20 193\"\n fill=\"none\"\n className=\"absolute inset-0\"\n >\n <path\n d=\"M10.2036 118.86C14.8518 115.918 19.5 107.801 19.5 95.9116C19.5 84.0223 15.672 76.4939 10.2036 72.9634C4.73505 69.4329 2.54765 63.5488 1.72738 55.8994L1.72738 136.512C2.82108 125.921 5.55533 121.802 10.2036 118.86Z\"\n fill=\"var(--dashboard-background,#f2f2f2)\"\n />\n </svg>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className={`relative z-10 ${isCollapsed ? \"\" : \"rotate-180\"}`}\n style={{\n transition: `transform 400ms ${cubicBezier}`,\n }}\n >\n <path\n d=\"M4.5 2L8.5 6L4.5 10\"\n stroke=\"var(--dashboard-text-primary,#2d2d2d)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div className=\"flex flex-col h-full overflow-y-auto\">\n {/* Logo */}\n <div className=\"flex justify-center items-center py-6 px-4 border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 overflow-hidden relative\">\n {collapsedLogo && (\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{\n opacity: isCollapsed ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents: isCollapsed ? \"auto\" : \"none\",\n }}\n >\n {collapsedLogo}\n </div>\n )}\n <div\n className=\"flex items-center justify-center\"\n style={{\n opacity: !isCollapsed || !collapsedLogo ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents:\n !isCollapsed || !collapsedLogo ? \"auto\" : \"none\",\n }}\n >\n {logo}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 px-4 py-4 space-y-2 overflow-y-auto\">\n {menuItems.map((item) => {\n const Icon = item.icon;\n const isActive = currentPath === item.href;\n\n return (\n <LinkComponent\n key={item.id}\n href={item.href}\n className=\"block\"\n >\n <div\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/15 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\",\n )}\n style={{\n transition: \"background-color 200ms, color 200ms\",\n }}\n title={isCollapsed ? item.label : undefined}\n >\n <Icon\n size={20}\n style={{\n marginRight: isCollapsed ? 0 : \"0.75rem\",\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {item.label}\n </span>\n </div>\n </LinkComponent>\n );\n })}\n </nav>\n\n {/* Footer */}\n <footer className=\"p-4 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 transition-colors cursor-pointer\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n title={\n isCollapsed\n ? `${user.subtitle ? user.subtitle + \" - \" : \"\"}${user.name}`\n : undefined\n }\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#37a501)]/20 text-[var(--dashboard-text-primary,#2d2d2d)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div\n className=\"ml-3 overflow-hidden text-left\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-primary,#37a501)]/5\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n style={{ transition: \"background-color 200ms\" }}\n title={isCollapsed ? logoutLabel : undefined}\n >\n <LogOut\n size={20}\n style={{\n marginRight: isCollapsed ? 0 : \"0.75rem\",\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {logoutLabel}\n </span>\n </button>\n )}\n </footer>\n </div>\n </aside>\n </>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeContextType {\n theme: Theme;\n setTheme: (theme: Theme) => void;\n resolvedTheme: \"light\" | \"dark\";\n}\n\nexport const ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport function useTheme(): ThemeContextType {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useTheme must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Moon, Sun } from \"lucide-react\";\nimport { useTheme } from \"../../hooks/useTheme\";\n\nexport interface ThemeSwitcherProps {\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ThemeSwitcher({ className }: ThemeSwitcherProps) {\n const { resolvedTheme, setTheme } = useTheme();\n\n const toggle = () => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={cn(\n \"relative inline-flex items-center justify-center h-9 w-9 rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] shadow-sm transition-colors cursor-pointer hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--dashboard-primary,#37a501)] focus-visible:ring-offset-2\",\n className,\n )}\n aria-label=\"Alternar tema\"\n >\n <Sun className=\"h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n <span className=\"sr-only\">Alternar tema</span>\n </button>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nexport type KPIValueFormat = \"currency\" | \"number\" | \"percentage\" | \"rating\";\n\nexport interface KPICardProps {\n title: string;\n value: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n format?: KPIValueFormat;\n benchmark?: string;\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatValue(value: number, format: KPIValueFormat): string {\n switch (format) {\n case \"currency\":\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n case \"percentage\":\n return `${value.toFixed(1)}%`;\n case \"rating\":\n return `${value.toFixed(1)}/5.0`;\n default:\n return new Intl.NumberFormat(\"pt-BR\").format(value);\n }\n}\n\nconst trendConfigs = {\n up: {\n icon: \"\\u2191\",\n color:\n \"text-[var(--dashboard-status-success,#10B981)] bg-[var(--dashboard-status-success,#10B981)]/10\",\n },\n down: {\n icon: \"\\u2193\",\n color:\n \"text-[var(--dashboard-status-danger,#EF4444)] bg-[var(--dashboard-status-danger,#EF4444)]/10\",\n },\n stable: {\n icon: \"\\u2192\",\n color:\n \"text-[var(--dashboard-text-secondary,#6b7280)] bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n },\n};\n\nexport function KPICard({\n title,\n value,\n variation,\n trend,\n format = \"number\",\n benchmark,\n isLoading,\n className,\n}: KPICardProps) {\n if (isLoading) return <KPICardSkeleton className={className} />;\n\n const trendConfig = trendConfigs[trend];\n\n return (\n <div\n className={cn(\n \"h-full w-full bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm p-6 border border-[var(--dashboard-text-secondary,#6b7280)]/20 hover:shadow-md transition-all duration-200 flex flex-col\",\n className,\n )}\n >\n <div className=\"flex justify-between items-start mb-4\">\n <h3 className=\"text-sm font-medium text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap\">\n {title}\n </h3>\n {benchmark && (\n <span\n className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]/60 ml-2 whitespace-nowrap flex-shrink-0\"\n title=\"Benchmark de referência\"\n >\n {benchmark}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-3 flex-1\">\n <p className=\"text-3xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap\">\n {formatValue(value, format)}\n </p>\n <div\n className={cn(\n \"inline-flex items-center gap-1 px-2 py-1 rounded-md flex-shrink-0\",\n trendConfig.color,\n )}\n >\n <span className=\"text-lg\">{trendConfig.icon}</span>\n <span className=\"text-sm font-medium whitespace-nowrap\">\n {Math.abs(variation).toFixed(1)}%\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nfunction KPICardSkeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\n \"h-full bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm p-6 border border-[var(--dashboard-text-secondary,#6b7280)]/20 animate-pulse flex flex-col\",\n className,\n )}\n >\n <div className=\"h-4 bg-[var(--dashboard-text-secondary,#6b7280)]/20 rounded w-2/3 mb-4\" />\n <div className=\"flex items-center gap-3 flex-1\">\n <div className=\"h-8 bg-[var(--dashboard-text-secondary,#6b7280)]/20 rounded w-1/2\" />\n <div className=\"h-6 bg-[var(--dashboard-text-secondary,#6b7280)]/20 rounded w-1/4\" />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface PageLayoutProps {\n /** Titulo principal da pagina */\n title: string;\n /** Descricao opcional da pagina (aparece abaixo do titulo) */\n description?: string;\n /** Componentes de filtros ou acoes para o header (ex: PeriodFilter, botoes) */\n headerActions?: ReactNode;\n /** Conteudo principal da pagina */\n children: ReactNode;\n /** Se true, aplica padding no conteudo. Default: true */\n contentPadding?: boolean;\n /** Componente de sidebar a ser renderizado */\n sidebar?: ReactNode;\n /** Se a sidebar esta recolhida */\n sidebarCollapsed?: boolean;\n /** Largura da sidebar expandida em px. Default: 280 */\n sidebarWidth?: number;\n /** Largura da sidebar recolhida em px. Default: 109 */\n sidebarCollapsedWidth?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function PageLayout({\n title,\n description,\n headerActions,\n children,\n contentPadding = true,\n sidebar,\n sidebarCollapsed = false,\n sidebarWidth = 280,\n sidebarCollapsedWidth = 109,\n className,\n}: PageLayoutProps) {\n const marginLeft = sidebar\n ? sidebarCollapsed\n ? `max(0px, ${sidebarCollapsedWidth}px)`\n : `max(0px, ${sidebarWidth}px)`\n : \"0px\";\n\n return (\n <div className={cn(\"min-h-screen bg-[var(--dashboard-background,#f2f2f2)]\", className)}>\n {sidebar}\n <main\n className={cn(\"pt-16 xl:pt-0\", !sidebar && \"pt-0\")}\n style={{\n marginLeft,\n transition: \"margin-left 400ms cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <style>{`\n @media (max-width: 1279px) {\n main {\n margin-left: 0 !important;\n }\n }\n `}</style>\n\n {/* Header com titulo e acoes */}\n <div className=\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-6 py-4 bg-[var(--dashboard-surface,#ffffff)]\">\n <div className=\"mb-4\">\n <h1 className=\"text-2xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h1>\n {description && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mt-1\">\n {description}\n </p>\n )}\n </div>\n\n {headerActions && <div>{headerActions}</div>}\n </div>\n\n {/* Conteudo principal */}\n <div className={contentPadding ? \"p-6\" : \"\"}>{children}</div>\n </main>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n);\n\nexport interface ComparisonLineChartProps {\n /** Labels do eixo X (ex: datas) */\n labels: string[];\n /** Dados do periodo atual */\n currentPeriodData: number[];\n /** Dados do periodo anterior */\n previousPeriodData: number[];\n /** Label da legenda do periodo atual */\n currentPeriodLabel?: string;\n /** Label da legenda do periodo anterior */\n previousPeriodLabel?: string;\n /** Titulo do grafico */\n title?: string;\n /** Cor principal (default: --dashboard-primary) */\n color?: string;\n /** Altura do container do grafico em px. Default: 300 */\n height?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ComparisonLineChart({\n labels,\n currentPeriodData,\n previousPeriodData,\n currentPeriodLabel = \"Período atual\",\n previousPeriodLabel = \"Período anterior\",\n title,\n color,\n height = 300,\n className,\n}: ComparisonLineChartProps) {\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const data = {\n labels,\n datasets: [\n {\n label: currentPeriodLabel,\n data: currentPeriodData,\n borderColor: primaryColor,\n backgroundColor: `${primaryColor}1a`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n {\n label: previousPeriodLabel,\n data: previousPeriodData,\n borderColor: `${primaryColor}66`,\n backgroundColor: `${primaryColor}0d`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: `${primaryColor}66`,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: true,\n position: \"bottom\" as const,\n labels: {\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n padding: 15,\n font: { size: 11 },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: true,\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n },\n },\n y: {\n beginAtZero: true,\n grid: { color: \"rgba(0, 0, 0, 0.05)\", drawBorder: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n precision: 0,\n },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\" as const,\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\",\n className,\n )}\n >\n {title && (\n <h3 className=\"text-base font-semibold mb-4 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n )}\n <div style={{ height }}>\n <Line data={data} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface HorizontalBarChartTab {\n id: string;\n label: string;\n}\n\nexport interface HorizontalBarChartProps {\n /** Labels do eixo Y (ex: horarios) */\n labels: string[];\n /** Dados por tab. Chave = tab.id, valor = array de numeros */\n datasets: Record<string, number[]>;\n /** Tabs para alternar entre datasets */\n tabs?: HorizontalBarChartTab[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label para tooltip (ex: \"vendas\", \"pedidos\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\", \"pedido\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor horário\") */\n bestItemLabel?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function HorizontalBarChart({\n labels,\n datasets,\n tabs,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n className,\n}: HorizontalBarChartProps) {\n const tabKeys = tabs ? tabs.map((t) => t.id) : Object.keys(datasets);\n const [activeTab, setActiveTab] = useState(tabKeys[0]);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 640);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\n }, []);\n\n const activeData = datasets[activeTab] || [];\n const maxValue = Math.max(...activeData);\n const bestIndex = activeData.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const minBarValue = maxValue > 0 ? maxValue * 0.02 : 0.05;\n const displayData = activeData.map((v) => (v === 0 ? minBarValue : v));\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: displayData,\n backgroundColor: primaryColor,\n borderRadius: isMobile ? 8 : 4,\n barThickness: isMobile ? 36 : 24,\n },\n ],\n };\n\n const options = {\n indexAxis: \"y\" as const,\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n right: isMobile ? 35 : 30,\n left: isMobile ? 10 : 0,\n top: isMobile ? 15 : 0,\n bottom: isMobile ? 15 : 0,\n },\n },\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: isMobile ? 6 : 12,\n displayColors: false,\n titleFont: { size: isMobile ? 10 : 12, weight: \"bold\" as const },\n bodyFont: { size: isMobile ? 9 : 11 },\n callbacks: {\n label: (context: { dataIndex: number }) => {\n const realValue = activeData[context.dataIndex];\n return realValue === 1\n ? `${realValue} ${singular}`\n : `${realValue} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n y: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 16 : 13 },\n padding: isMobile ? 12 : 4,\n },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-5 sm:p-6 min-h-[850px] sm:h-full flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {tabs && tabs.length > 1 && (\n <div className=\"flex gap-2 mb-4 flex-wrap\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n \"px-3.5 py-2 sm:px-4 sm:py-2 rounded-full text-sm font-medium transition-colors whitespace-nowrap cursor-pointer\",\n activeTab === tab.id\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n )}\n\n {maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm sm:text-base text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-xl sm:text-2xl font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-base font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0\">\n <Bar key={`chart-${isMobile ? \"m\" : \"d\"}`} data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface VerticalBarChartProps {\n /** Labels do eixo X (ex: dias da semana) */\n labels: string[];\n /** Valores para cada label */\n data: number[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label do tooltip (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor dia\") */\n bestItemLabel?: string;\n /** Maximo de caracteres dos labels. Default: 3 */\n labelMaxChars?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function VerticalBarChart({\n labels,\n data: values,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n labelMaxChars = 3,\n className,\n}: VerticalBarChartProps) {\n const maxValue = Math.max(...values);\n const bestIndex = values.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: values,\n backgroundColor: primaryColor,\n borderRadius: { topLeft: 4, topRight: 4 },\n barThickness: 40,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: false,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n callbacks: {\n label: (context: { parsed: { y: number | null } }) => {\n const v = context.parsed.y ?? 0;\n return v === 1 ? `${v} ${singular}` : `${v} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n callback: (_value: number | string, index: number): string => {\n return labels[index]\n ? labels[index].substring(0, labelMaxChars)\n : String(_value);\n },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {bestLabel && maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-sm font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 relative\">\n <Bar data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface ProgressBarListItem {\n /** Label do item */\n label: string;\n /** Valor numerico */\n value: number;\n /** Icone opcional */\n icon?: ReactNode;\n}\n\nexport interface ProgressBarListProps {\n /** Itens da lista */\n items: ProgressBarListItem[];\n /** Titulo da lista */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: ReactNode;\n /** Cor da barra de progresso (default: --dashboard-primary) */\n color?: string;\n /** Label do valor (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Ordenar automaticamente por valor desc. Default: true */\n sortByValue?: boolean;\n /** Formatar valor customizado */\n formatValue?: (value: number) => string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ProgressBarList({\n items,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n sortByValue = true,\n formatValue,\n className,\n}: ProgressBarListProps) {\n const sortedItems = sortByValue\n ? [...items].sort((a, b) => b.value - a.value)\n : items;\n const maxValue = Math.max(...items.map((i) => i.value));\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const defaultFormat = (v: number) =>\n `${v} ${v === 1 ? singular : valueLabel}`;\n\n const fmt = formatValue || defaultFormat;\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n <div className=\"space-y-6 flex-1 flex flex-col justify-center\">\n {sortedItems.map((item, index) => (\n <div key={index} className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-4 min-w-[180px]\">\n {item.icon && (\n <div\n className=\"w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: primaryColor }}\n >\n <div className=\"w-6 h-6 text-white\">{item.icon}</div>\n </div>\n )}\n <span className=\"text-base font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {item.label}\n </span>\n </div>\n <div className=\"flex items-center gap-4 flex-1\">\n <div className=\"flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded-full h-3 overflow-hidden\">\n <div\n className=\"h-full transition-all duration-500 rounded-full\"\n style={{\n width:\n maxValue > 0\n ? `${(item.value / maxValue) * 100}%`\n : \"0%\",\n backgroundColor: primaryColor,\n }}\n />\n </div>\n <span\n className=\"text-base font-bold min-w-[90px] text-right\"\n style={{ color: primaryColor }}\n >\n {fmt(item.value)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n ChartData,\n ChartOptions,\n} from \"chart.js\";\nimport { KPICard, KPIValueFormat } from \"../KPICard\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n);\n\nexport interface MetricPanelMetric {\n /** Chave unica da metrica */\n key: string;\n /** Label exibida na tab e KPI */\n label: string;\n /** Icone da tab */\n icon: React.ComponentType<{ className?: string }>;\n /** Label da legenda do periodo atual */\n currentLabel: string;\n /** Label da legenda do periodo anterior */\n previousLabel: string;\n /** Formato do valor */\n format: KPIValueFormat;\n /** Unidade opcional (ex: \"pedidos\") */\n unit?: string;\n /** Valores do KPI */\n kpiValue: {\n current: number;\n previous: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n };\n}\n\nexport interface MetricPanelChartData {\n labels: string[];\n metrics: Record<\n string,\n { currentPeriod: number[]; previousPeriod: number[] }\n >;\n}\n\nexport interface MetricPanelProps {\n /** Titulo do painel */\n title: string;\n /** Icone do titulo */\n titleIcon: React.ComponentType<{ className?: string }>;\n /** Configuracoes das metricas */\n metrics: MetricPanelMetric[];\n /** Dados do grafico */\n chartData: MetricPanelChartData;\n /** Cor principal */\n color?: string;\n /** Cor secundaria (periodo anterior) */\n secondaryColor?: string;\n /** Callback do botao de acao */\n onActionClick?: () => void;\n /** Label do botao de acao */\n actionLabel?: string;\n /** Estado de loading */\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function MetricPanel({\n title,\n titleIcon: TitleIcon,\n metrics,\n chartData,\n color,\n secondaryColor,\n onActionClick,\n actionLabel,\n isLoading = false,\n className,\n}: MetricPanelProps) {\n const [selectedMetricKey, setSelectedMetricKey] = useState(metrics[0]?.key);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 768);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\n }, []);\n\n const currentMetric =\n metrics.find((m) => m.key === selectedMetricKey) || metrics[0];\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const secColor = secondaryColor || `${primaryColor}66`;\n\n const data: ChartData<\"line\"> = {\n labels: chartData.labels,\n datasets: [\n {\n label: currentMetric.currentLabel,\n data: chartData.metrics[currentMetric.key]?.currentPeriod || [],\n borderColor: primaryColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: isMobile ? 10 : 8,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 3,\n },\n {\n label: currentMetric.previousLabel,\n data: chartData.metrics[currentMetric.key]?.previousPeriod || [],\n borderColor: secColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: 0,\n },\n ],\n };\n\n const options: ChartOptions<\"line\"> = {\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n left: isMobile ? 10 : 50,\n right: isMobile ? 10 : 50,\n top: isMobile ? 20 : 40,\n bottom: isMobile ? 10 : 20,\n },\n },\n plugins: {\n legend: {\n display: true,\n position: \"bottom\",\n onClick: () => {},\n labels: {\n usePointStyle: true,\n boxWidth: isMobile ? 8 : 6,\n boxHeight: isMobile ? 8 : 6,\n padding: isMobile ? 12 : 15,\n font: {\n size: isMobile ? 13 : 11,\n weight: isMobile ? \"bold\" : \"normal\",\n },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n },\n },\n scales: {\n x: {\n border: { display: false },\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 12 : 11 },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { color: \"rgba(0, 0, 0, 0.05)\" },\n ticks: { display: false, count: 5 },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\",\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n style={{ overflow: \"visible\" }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 md:p-6 pb-3 md:pb-4 border-b border-[var(--dashboard-text-secondary,#6b7280)]/10\">\n <h2 className=\"flex items-center gap-2 text-lg md:text-xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <TitleIcon className=\"w-5 h-5 md:w-6 md:h-6\" />\n {title}\n </h2>\n {onActionClick && actionLabel && (\n <button\n onClick={onActionClick}\n className=\"px-3 md:px-4 py-1.5 md:py-2 text-xs md:text-sm font-medium border rounded-lg transition-colors cursor-pointer\"\n style={{\n color: primaryColor,\n borderColor: primaryColor,\n }}\n >\n {actionLabel}\n </button>\n )}\n </div>\n\n {/* KPI Cards */}\n <div className=\"p-4 md:p-6 pb-3 md:pb-4\">\n <div\n className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 md:gap-4\"\n style={{\n gridTemplateColumns:\n !isMobile && metrics.length <= 4\n ? `repeat(${metrics.length}, minmax(min-content, 1fr))`\n : undefined,\n }}\n >\n {metrics.map((metric) => (\n <KPICard\n key={metric.key}\n title={metric.label}\n value={metric.kpiValue.current}\n variation={metric.kpiValue.variation}\n trend={metric.kpiValue.trend}\n format={metric.format}\n isLoading={isLoading}\n />\n ))}\n </div>\n </div>\n\n {/* Metric Tabs */}\n <div className=\"px-4 md:px-6 pt-3 md:pt-4\">\n <div className=\"flex flex-wrap justify-center gap-2 md:gap-3\">\n {metrics.map((metric) => {\n const Icon = metric.icon;\n return (\n <button\n key={metric.key}\n onClick={() => setSelectedMetricKey(metric.key)}\n className={cn(\n \"flex items-center gap-2 px-4 md:px-6 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n selectedMetricKey === metric.key\n ? \"bg-[var(--dashboard-surface,#ffffff)] border-2 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#6b7280)]/30 text-[var(--dashboard-text-secondary,#6b7280)] hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n )}\n style={\n selectedMetricKey === metric.key\n ? { borderColor: primaryColor, color: primaryColor }\n : undefined\n }\n >\n <Icon className=\"w-4 h-4\" />\n {metric.label}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Chart */}\n <div\n className=\"px-4 md:px-6 pb-4 md:pb-6\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n <div\n className=\"h-[260px]\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div\n className=\"animate-spin rounded-full h-12 w-12 border-b-2 mx-auto mb-4\"\n style={{ borderColor: primaryColor }}\n />\n <p className=\"text-[var(--dashboard-text-secondary,#6b7280)]\">\n Carregando gráfico...\n </p>\n </div>\n </div>\n ) : (\n <Line data={data} options={options} />\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface FilterBarProps {\n /** Valor do campo de busca */\n searchValue?: string;\n /** Callback de mudanca do campo de busca */\n onSearchChange?: (value: string) => void;\n /** Placeholder do campo de busca */\n searchPlaceholder?: string;\n /** Slot para dropdowns, date pickers e outros filtros */\n children?: ReactNode;\n /** Slot para acoes extras (ex: botao de exportar) */\n actions?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function FilterBar({\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Buscar...\",\n children,\n actions,\n className,\n}: FilterBarProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:items-center sm:flex-wrap\",\n className,\n )}\n >\n {onSearchChange !== undefined && (\n <div className=\"flex-1 min-w-[200px]\">\n <div className=\"relative flex items-center w-full\">\n <svg\n className=\"absolute left-3 h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={searchValue || \"\"}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"flex h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] pl-10 pr-3 py-2 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none\"\n />\n </div>\n </div>\n )}\n\n {children && (\n <div className=\"flex flex-wrap items-center gap-2\">{children}</div>\n )}\n\n {actions && (\n <div className=\"flex items-center gap-2 sm:ml-auto\">{actions}</div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxProps {\n /** Input name */\n name?: string;\n /** Input id (defaults to name) */\n id?: string;\n /** Label text next to the checkbox */\n label?: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n /** Disable the checkbox */\n disabled?: boolean;\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Primary color override for checked state. Defaults to --dashboard-primary / #ff521d */\n primaryColor?: string;\n /** Additional className on the wrapper label */\n className?: string;\n /** Children rendered as label (takes precedence over label prop) */\n children?: React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n// Exact values from dashboard.eaigarcom.com LoginForm.tsx:\n// h-4 w-4 (16px) rounded (4px)\n// after:left-[3px] after:top-0 after:w-[6px] after:h-[10px] after:border-r-2 after:border-b-2 after:rotate-45\n// Scaled proportionally for md (22px) and lg (28px)\nconst sizeConfig = {\n sm: { box: 16, radius: 4, icon: { w: 6, h: 10, left: 3, top: 0, border: 2 }, gap: 8, text: 13 },\n md: { box: 22, radius: 6, icon: { w: 8, h: 14, left: 4.5, top: 0, border: 2 }, gap: 10, text: 14 },\n lg: { box: 28, radius: 7, icon: { w: 10, h: 17, left: 6, top: 0, border: 2.5 }, gap: 12, text: 15 },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Checkbox({\n name,\n id,\n label,\n checked = false,\n onChange,\n disabled = false,\n size = \"md\",\n primaryColor,\n className,\n children,\n}: CheckboxProps) {\n const inputId = id || name;\n const cfg = sizeConfig[size];\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #37A501)\";\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n \"inline-flex items-center cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n style={{ gap: cfg.gap }}\n >\n {/* Hidden native input for form submission & accessibility */}\n <input\n type=\"checkbox\"\n id={inputId}\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n className=\"sr-only peer\"\n />\n\n {/* Custom checkbox box */}\n <span\n className=\"relative shrink-0 transition-all duration-200\"\n style={{\n width: cfg.box,\n height: cfg.box,\n borderRadius: cfg.radius,\n backgroundColor: checked ? resolvedColor : \"transparent\",\n border: checked\n ? `2px solid ${resolvedColor}`\n : \"2px solid rgba(45,45,45,0.2)\",\n boxShadow: checked\n ? `0 1px 3px color-mix(in srgb, ${resolvedColor} 25%, transparent)`\n : \"none\",\n }}\n aria-hidden=\"true\"\n >\n {/* Checkmark — CSS-only via rotated border trick */}\n <span\n className=\"absolute transition-opacity duration-150\"\n style={{\n opacity: checked ? 1 : 0,\n left: cfg.icon.left,\n top: cfg.icon.top,\n width: cfg.icon.w,\n height: cfg.icon.h,\n borderRight: `${cfg.icon.border}px solid #fff`,\n borderBottom: `${cfg.icon.border}px solid #fff`,\n transform: \"rotate(45deg)\",\n }}\n />\n </span>\n\n {/* Label text */}\n {(children || label) && (\n <span\n className=\"leading-none\"\n style={{\n fontSize: cfg.text,\n color: \"var(--dashboard-text-primary, #2d2d2d)\",\n }}\n >\n {children || label}\n </span>\n )}\n </label>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode, useState, useEffect } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AuthField {\n /** Unique name / id for the field */\n name: string;\n /** Label displayed above the input (omit for placeholder-only mode) */\n label?: string;\n /** HTML input type */\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"number\";\n /** Placeholder text */\n placeholder?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Minimum length for validation */\n minLength?: number;\n /** Field-level error message */\n error?: string;\n}\n\nexport interface AuthLink {\n /** Link text */\n label: string;\n /** URL or click handler */\n href?: string;\n /** Link target (e.g., '_blank' for new tab) */\n target?: string;\n /** Custom click handler (takes precedence over href) */\n onClick?: () => void;\n}\n\nexport interface AuthCheckbox {\n /** Checkbox name */\n name: string;\n /** Checkbox label */\n label: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n}\n\nexport interface AuthBackground {\n /** Solid color, gradient, or CSS value for the page background */\n color?: string;\n /** Background image URL or element (for Next.js Image support) */\n image?: string;\n /** React element for the background (e.g., next/image with fill) */\n imageElement?: ReactNode;\n /** Overlay opacity (0-1) — rendered as bg-black/{opacity} */\n overlayOpacity?: number;\n /** Custom CSS for the background container */\n style?: React.CSSProperties;\n}\n\nexport interface AuthHeadline {\n /** Main headline text */\n text: string;\n /** Highlighted / accent portion (rendered on new line if not found inside text) */\n highlight?: string;\n /** Color of the main text (defaults to #faf3e1) */\n color?: string;\n /** Color of the highlighted text (defaults to primaryColor) */\n highlightColor?: string;\n}\n\nexport interface AuthBranding {\n /** Array of logo elements to render at the bottom-left */\n logos: ReactNode[];\n}\n\nexport interface AuthCardStyle {\n /** Card background color (defaults to #faf3e1) */\n background?: string;\n /** Card border radius in px (defaults to 16 = rounded-2xl) */\n borderRadius?: number;\n /** Card box shadow CSS */\n shadow?: string;\n /** Card max width in px (defaults to 420) */\n maxWidth?: number;\n /** Card padding in px (defaults to 32 = p-8) */\n padding?: number;\n /** Card border */\n border?: string;\n}\n\nexport interface AuthLayoutProps {\n // --- Content ---\n /** Logo element displayed at top of card */\n logo?: ReactNode;\n /** Page title (e.g., \"Painel de Controle\") */\n title: string;\n /** Subtitle / description below the title (supports ReactNode for inline formatting) */\n subtitle?: ReactNode;\n /** Global error message displayed above the form */\n error?: string;\n /** Global success message displayed above the form */\n success?: string;\n\n // --- Form ---\n /** Form field definitions */\n fields: AuthField[];\n /** Current field values keyed by field name */\n values: Record<string, string>;\n /** Callback when a field value changes */\n onFieldChange: (name: string, value: string) => void;\n /** Submit handler */\n onSubmit: (values: Record<string, string>) => void;\n /** Submit button label */\n submitLabel?: string;\n /** Loading label while submitting */\n loadingLabel?: string;\n /** Whether the form is currently submitting */\n isLoading?: boolean;\n /** Checkbox between fields and submit (e.g., \"Lembrar conta\") */\n checkbox?: AuthCheckbox;\n\n // --- Links ---\n /** Primary link below the form */\n primaryLink?: AuthLink;\n /** Secondary link / text (e.g., \"Ainda nao tem cadastro? Cadastre-se\") */\n secondaryLink?: AuthLink & { prefix?: string };\n\n // --- Extra content ---\n /** Content rendered between the submit button and the links */\n extraContent?: ReactNode;\n /** Content rendered above the form (below title/subtitle) */\n headerContent?: ReactNode;\n /** Content rendered just above the submit button (e.g., resend code link) */\n beforeSubmitContent?: ReactNode;\n /** Content rendered at the very bottom of the card */\n footerContent?: ReactNode;\n\n // --- Layout ---\n /** Headline text displayed over the background (top-left, hidden on mobile) */\n headline?: AuthHeadline;\n /** Branding logos at the bottom-left over the background (hidden on mobile) */\n branding?: AuthBranding;\n /** Card horizontal position */\n cardPosition?: \"left\" | \"center\" | \"right\";\n /** Right padding for the card container on lg screens (defaults to 256 = pr-64) */\n cardOffsetRight?: number;\n\n // --- Theming ---\n /** Background configuration */\n background?: AuthBackground;\n /** Card styling overrides */\n cardStyle?: AuthCardStyle;\n /** Primary color (buttons, links, focus rings, checkbox). Defaults to #ff521d */\n primaryColor?: string;\n /** Text color for the title */\n titleColor?: string;\n /** Text alignment for the card header (title + subtitle). Defaults to \"center\" */\n titleAlign?: \"left\" | \"center\" | \"right\";\n\n /** Additional class name for the outermost container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n/** Resolves a CSS color value (including var() references) to a computed hex/rgb string */\nfunction useResolvedColor(cssValue: string): string {\n const [resolved, setResolved] = useState(cssValue);\n\n useEffect(() => {\n // If it's already a plain color (not a var()), use as-is\n if (!cssValue.startsWith(\"var(\")) {\n setResolved(cssValue);\n return;\n }\n\n // Create a hidden probe element to read the computed value\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n }, [cssValue]);\n\n // Re-resolve when CSS vars change (DashboardProvider updates style on root)\n useEffect(() => {\n if (!cssValue.startsWith(\"var(\")) return;\n\n const observer = new MutationObserver(() => {\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"style\"],\n });\n\n return () => observer.disconnect();\n }, [cssValue]);\n\n return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// AuthInput — matches Eai Garcom: h-12 rounded-lg border-2 bg-transparent\n// ---------------------------------------------------------------------------\n\nfunction AuthInput({\n name,\n label,\n type = \"text\",\n placeholder,\n required,\n minLength,\n value,\n onChange,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n name: string;\n label?: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n return (\n <div>\n {label && (\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[#2d2d2d] mb-1.5\"\n >\n {label}\n </label>\n )}\n <input\n type={type}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n ...(error\n ? { borderColor: \"var(--dashboard-status-danger, #EF4444)\" }\n : {}),\n }}\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PasswordInput — h-12 with eye toggle, same border style\n// ---------------------------------------------------------------------------\n\nfunction PasswordInput({\n value,\n onChange,\n placeholder,\n name,\n required,\n minLength,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder?: string;\n name: string;\n required?: boolean;\n minLength?: number;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n const [visible, setVisible] = useState(false);\n\n return (\n <div>\n <div className=\"relative\">\n <input\n type={visible ? \"text\" : \"password\"}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 pr-11 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((v) => !v)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-[#2d2d2d]/50 hover:text-[#2d2d2d] transition-colors cursor-pointer bg-transparent border-none p-0\"\n tabIndex={-1}\n aria-label={visible ? \"Ocultar senha\" : \"Mostrar senha\"}\n disabled={disabled}\n >\n {visible ? (\n // EyeOff icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n // Eye icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AuthLayout({\n logo,\n title,\n subtitle,\n error,\n success,\n fields,\n values,\n onFieldChange,\n onSubmit,\n submitLabel = \"Acessar\",\n loadingLabel = \"Entrando...\",\n isLoading = false,\n checkbox,\n primaryLink,\n secondaryLink,\n extraContent,\n headerContent,\n beforeSubmitContent,\n footerContent,\n headline,\n branding,\n cardPosition = \"right\",\n cardOffsetRight = 256,\n background,\n cardStyle,\n primaryColor,\n titleColor,\n titleAlign = \"center\",\n className,\n}: AuthLayoutProps) {\n // CSS var string for style props (e.g., backgroundColor, color)\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n // Computed hex/rgb value for JS string concatenation (e.g., focus ring shadow with opacity)\n const computedColor = useResolvedColor(resolvedColor);\n\n // Background\n const bgCss: React.CSSProperties = {\n backgroundColor: background?.color || \"#1a1a1a\",\n ...background?.style,\n };\n\n // Card\n const cardBg = cardStyle?.background || \"var(--dashboard-secondary, #faf3e1)\";\n const cardCss: React.CSSProperties = {\n backgroundColor: cardBg,\n borderRadius: cardStyle?.borderRadius ?? 16,\n boxShadow:\n cardStyle?.shadow ??\n \"0 0 0 1px rgb(0 0 0 / 0.08), 0 0 12px 4px rgb(0 0 0 / 0.25), 0 0 28px 10px rgb(0 0 0 / 0.20)\",\n maxWidth: cardStyle?.maxWidth ?? 420,\n padding: cardStyle?.padding ?? 32,\n border: cardStyle?.border || \"none\",\n width: \"100%\",\n };\n\n\n\n\n function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n onSubmit(values);\n }\n\n function renderLink(link: AuthLink, extraClass?: string) {\n const style: React.CSSProperties = { color: resolvedColor };\n if (link.onClick) {\n return (\n <button\n type=\"button\"\n onClick={link.onClick}\n className={cn(\n \"bg-transparent border-none cursor-pointer hover:opacity-80 text-sm font-semibold p-0 transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </button>\n );\n }\n return (\n <a\n href={link.href}\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n className={cn(\n \"hover:opacity-80 text-sm font-semibold transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </a>\n );\n }\n\n return (\n <div\n className={cn(\"fixed inset-0 flex select-none overflow-hidden\", className)}\n style={bgCss}\n >\n {/* Background left spacer for branding (hidden on mobile) */}\n {branding && branding.logos.length > 0 && (\n <div className=\"relative hidden w-1/3 lg:block\">\n <div className=\"absolute bottom-12 left-12 z-20\">\n <div className=\"flex gap-4 items-center\">\n {branding.logos.map((brandLogo, i) => (\n <React.Fragment key={i}>{brandLogo}</React.Fragment>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Background image */}\n {background?.imageElement ? (\n <div className=\"absolute inset-0 z-0\">{background.imageElement}</div>\n ) : background?.image ? (\n <img\n src={background.image}\n alt=\"\"\n className=\"absolute inset-0 z-0 h-full w-full object-cover\"\n draggable={false}\n />\n ) : null}\n\n {/* Background overlay — bg-black/20 by default */}\n {(background?.image || background?.imageElement) && (\n <div\n className=\"absolute inset-0 z-10\"\n style={{\n backgroundColor: `rgba(0,0,0,${background?.overlayOpacity ?? 0.2})`,\n }}\n />\n )}\n\n {/* Headline — top-left, hidden on mobile */}\n {headline && (\n <div className=\"absolute top-12 left-8 z-20 max-w-md hidden lg:block\">\n <h1\n className=\"text-4xl font-bold mb-4 leading-tight\"\n style={{ color: headline.color || \"#faf3e1\" }}\n >\n {headline.highlight\n ? (() => {\n const idx = headline.text.indexOf(headline.highlight);\n if (idx === -1) {\n return (\n <>\n {headline.text}\n <br />\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n </>\n );\n }\n const before = headline.text.slice(0, idx);\n const after = headline.text.slice(\n idx + headline.highlight.length,\n );\n return (\n <>\n {before}\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n {after}\n </>\n );\n })()\n : headline.text}\n </h1>\n </div>\n )}\n\n {/* Responsive offset CSS — only applies on lg+ */}\n <style>{`\n .auth-card-container {\n padding-left: 1rem;\n padding-right: 1rem;\n justify-content: center;\n align-content: center;\n }\n @media (min-width: 1024px) {\n .auth-card-container[data-position=\"right\"] {\n justify-content: flex-end;\n padding-right: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"left\"] {\n justify-content: flex-start;\n padding-left: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"center\"] {\n justify-content: center;\n }\n }\n `}</style>\n\n {/* Card container — z-30, flex w-full items-center */}\n <div\n className=\"auth-card-container relative z-30 flex w-full items-center py-8\"\n data-position={cardPosition}\n >\n <div style={{ ...cardCss, maxHeight: \"calc(100vh - 64px)\", overflowY: \"auto\" }}>\n {/* Card header: logo + title + subtitle */}\n <div className={`mb-8 ${titleAlign === \"center\" ? \"text-center\" : titleAlign === \"right\" ? \"text-right\" : \"text-left\"}`}>\n {/* Logo */}\n {logo && (\n <div className={`mb-4 flex ${titleAlign === \"center\" ? \"justify-center\" : titleAlign === \"right\" ? \"justify-end\" : \"justify-start\"}`}>\n {logo}\n </div>\n )}\n\n {/* Title — text-2xl font-bold text-gray-900 mb-2 */}\n <h2\n className=\"text-2xl font-bold mb-2\"\n style={{\n color: titleColor || \"var(--dashboard-text-primary, #111827)\",\n }}\n >\n {title}\n </h2>\n\n {/* Subtitle — text-sm text-gray-600 */}\n {subtitle && (\n <p className=\"text-sm text-gray-600\">{subtitle}</p>\n )}\n </div>\n\n {/* Header content */}\n {headerContent}\n\n {/* Alerts */}\n {error && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-red-50 text-red-700 border border-red-200\">\n {error}\n </div>\n )}\n\n {success && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-green-50 text-green-700 border border-green-200\">\n {success}\n </div>\n )}\n\n {/* Form — space-y-5 */}\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {fields.map((field) =>\n field.type === \"password\" ? (\n <PasswordInput\n key={field.name}\n name={field.name}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ) : (\n <AuthInput\n key={field.name}\n name={field.name}\n label={field.label}\n type={field.type || \"text\"}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ),\n )}\n\n {/* Checkbox */}\n {checkbox && (\n <Checkbox\n name={checkbox.name}\n label={checkbox.label}\n checked={checkbox.checked || false}\n onChange={(val) => checkbox.onChange?.(val)}\n disabled={isLoading}\n primaryColor={resolvedColor}\n size=\"sm\"\n />\n )}\n\n {/* Before submit content (e.g., resend code) */}\n {beforeSubmitContent}\n\n {/* Submit button — h-12 rounded-lg font-bold text-base shadow-lg */}\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full h-12 rounded-lg px-5 text-base font-bold text-white transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed shadow-lg hover:shadow-xl hover:opacity-90\"\n style={{\n backgroundColor: resolvedColor,\n \"--tw-ring-color\": resolvedColor,\n } as React.CSSProperties}\n >\n {isLoading ? loadingLabel : submitLabel}\n </button>\n </form>\n\n {/* Extra content */}\n {extraContent && <div className=\"mt-5\">{extraContent}</div>}\n\n {/* Links */}\n {(primaryLink || secondaryLink) && (\n <div className=\"mt-6 text-center\">\n {primaryLink && (\n <p className=\"text-sm text-gray-600\">\n {renderLink(primaryLink)}\n </p>\n )}\n {secondaryLink && (\n <p className={`text-sm text-gray-600 ${primaryLink ? \"mt-6\" : \"\"}`}>\n {secondaryLink.prefix && (\n <>{secondaryLink.prefix}{\" \"}</>\n )}\n {renderLink(secondaryLink)}\n </p>\n )}\n </div>\n )}\n\n {/* Footer content */}\n {footerContent && <div className=\"mt-6\">{footerContent}</div>}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useCallback, KeyboardEvent, ClipboardEvent } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CodeInputProps {\n /** Number of digit boxes (defaults to 6) */\n length?: number;\n /** Current value as a string (e.g. \"12\" for the first two digits filled) */\n value: string;\n /** Called with the full string whenever a digit changes */\n onChange: (value: string) => void;\n /** Disable all inputs */\n disabled?: boolean;\n /** Show error styling */\n error?: boolean;\n /** Primary / accent color for focused box border */\n primaryColor?: string;\n /** Additional className on the container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function CodeInput({\n length = 6,\n value,\n onChange,\n disabled = false,\n error = false,\n primaryColor,\n className = \"\",\n}: CodeInputProps) {\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n\n const digits = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n\n const focusInput = useCallback(\n (idx: number) => {\n const clamped = Math.max(0, Math.min(idx, length - 1));\n inputsRef.current[clamped]?.focus();\n },\n [length],\n );\n\n const updateValue = useCallback(\n (idx: number, digit: string) => {\n const arr = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n arr[idx] = digit;\n // Trim trailing empty strings\n const newVal = arr.join(\"\").replace(/\\s+$/g, \"\");\n onChange(newVal);\n },\n [value, length, onChange],\n );\n\n const handleInput = useCallback(\n (idx: number, char: string) => {\n if (!/^\\d$/.test(char)) return;\n updateValue(idx, char);\n if (idx < length - 1) {\n focusInput(idx + 1);\n }\n },\n [updateValue, focusInput, length],\n );\n\n const handleKeyDown = useCallback(\n (idx: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\") {\n e.preventDefault();\n if (digits[idx] && digits[idx] !== \"\") {\n updateValue(idx, \"\");\n } else if (idx > 0) {\n updateValue(idx - 1, \"\");\n focusInput(idx - 1);\n }\n } else if (e.key === \"ArrowLeft\" && idx > 0) {\n e.preventDefault();\n focusInput(idx - 1);\n } else if (e.key === \"ArrowRight\" && idx < length - 1) {\n e.preventDefault();\n focusInput(idx + 1);\n }\n },\n [digits, updateValue, focusInput, length],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData(\"text\").replace(/\\D/g, \"\").slice(0, length);\n if (pasted.length > 0) {\n onChange(pasted);\n focusInput(Math.min(pasted.length, length - 1));\n }\n },\n [length, onChange, focusInput],\n );\n\n return (\n <div className={`flex justify-center gap-2 sm:gap-3 ${className}`}>\n {Array.from({ length }).map((_, idx) => (\n <input\n key={idx}\n ref={(el) => { inputsRef.current[idx] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n disabled={disabled}\n value={digits[idx] || \"\"}\n onChange={(e) => {\n const char = e.target.value.slice(-1);\n handleInput(idx, char);\n }}\n onKeyDown={(e) => handleKeyDown(idx, e)}\n onPaste={handlePaste}\n onFocus={(e) => {\n e.target.select();\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${resolvedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n className=\"w-10 h-11 sm:w-11 sm:h-12 text-center text-lg sm:text-xl font-bold rounded-lg border-2 bg-transparent text-[#2d2d2d] transition-all focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n borderColor: error\n ? \"var(--dashboard-status-danger, #EF4444)\"\n : \"rgba(45,45,45,0.2)\",\n }}\n />\n ))}\n </div>\n );\n}\n","import type { DashboardConfig } from \"./types\";\n\nexport const defaultConfig: DashboardConfig = {\n name: \"Dashboard\",\n colors: {\n primary: \"#37A501\",\n secondary: \"#f0f0f0\",\n background: \"#F2F2F2\",\n surface: \"#FFFFFF\",\n textPrimary: \"#2d2d2d\",\n textSecondary: \"#6b7280\",\n statusSuccess: \"#10B981\",\n statusDanger: \"#EF4444\",\n statusWarning: \"#F59E0B\",\n statusInfo: \"#3B82F6\",\n statusNeutral: \"#6B7280\",\n },\n components: {\n modal: {\n closeOnEscape: true,\n closeOnOverlayClick: true,\n },\n toast: {\n duration: 3000,\n position: \"top-right\",\n },\n notification: {\n duration: 5000,\n },\n pagination: {\n itemsPerPageOptions: [10, 20, 30, 50],\n defaultItemsPerPage: 10,\n },\n },\n};\n","import type { DashboardConfig } from \"./types\";\nimport { defaultConfig } from \"./defaults\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nfunction deepMerge<T>(target: T, source: DeepPartial<T>): T {\n const result = { ...target } as Record<string, unknown>;\n const src = source as Record<string, unknown>;\n\n for (const key in src) {\n const sourceVal = src[key];\n const targetVal = result[key];\n\n if (\n sourceVal !== null &&\n sourceVal !== undefined &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === \"object\" &&\n targetVal !== null &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal,\n sourceVal as DeepPartial<typeof targetVal>,\n );\n } else if (sourceVal !== undefined) {\n result[key] = sourceVal;\n }\n }\n\n return result as T;\n}\n\nexport function createConfig(\n overrides: DeepPartial<DashboardConfig> = {},\n): DashboardConfig {\n return deepMerge(defaultConfig, overrides);\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\n\nexport const ConfigContext = createContext<DashboardConfig | null>(null);\n\nexport function useConfig(): DashboardConfig {\n const config = useContext(ConfigContext);\n if (!config) {\n throw new Error(\"useConfig must be used within a DashboardProvider\");\n }\n return config;\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { ThemeContext } from \"../hooks/useTheme\";\nimport type { Theme } from \"../hooks/useTheme\";\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [theme, setThemeState] = useState<Theme>(\"system\");\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n const savedTheme = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (savedTheme) {\n setThemeState(savedTheme);\n }\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const currentTheme = savedTheme || \"system\";\n const resolved =\n currentTheme === \"system\" ? systemPreference : currentTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = (e: MediaQueryListEvent) => {\n const current = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (!current || current === \"system\") {\n const newResolved = e.matches ? \"dark\" : \"light\";\n setResolvedTheme(newResolved);\n document.documentElement.classList.toggle(\n \"dark\",\n newResolved === \"dark\",\n );\n }\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n localStorage.setItem(\"dashboard-theme\", newTheme);\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const resolved = newTheme === \"system\" ? systemPreference : newTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n };\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme, resolvedTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface LoadingContextType {\n isLoading: boolean;\n showLoading: () => void;\n hideLoading: () => void;\n}\n\nexport const LoadingContext = createContext<LoadingContextType | null>(null);\n\nexport function useLoading(): LoadingContextType {\n const context = useContext(LoadingContext);\n if (!context) {\n throw new Error(\"useLoading must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { LoadingContext } from \"../hooks/useLoading\";\nimport { Loading } from \"../components/Loading\";\n\nexport function LoadingProvider({ children }: { children: React.ReactNode }) {\n const [isLoading, setIsLoading] = useState(false);\n\n const showLoading = () => setIsLoading(true);\n const hideLoading = () => setIsLoading(false);\n\n return (\n <LoadingContext.Provider value={{ isLoading, showLoading, hideLoading }}>\n {children}\n {isLoading && <Loading size=\"lg\" text=\"Carregando...\" fullscreen />}\n </LoadingContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface Notification {\n id: string;\n title: string;\n subtitle: string;\n type: \"success\" | \"error\" | \"warning\" | \"info\";\n}\n\nexport interface NotificationsContextType {\n notifications: Notification[];\n addNotification: (notification: Omit<Notification, \"id\">) => void;\n removeNotification: (id: string) => void;\n clearNotifications: () => void;\n}\n\nexport const NotificationsContext =\n createContext<NotificationsContextType | null>(null);\n\nexport function useNotifications(): NotificationsContextType {\n const context = useContext(NotificationsContext);\n if (!context) {\n throw new Error(\"useNotifications must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { NotificationsContext } from \"../hooks/useNotifications\";\nimport type { Notification } from \"../hooks/useNotifications\";\nimport { useConfig } from \"../hooks/useConfig\";\nimport { Toast } from \"../components/Toast\";\n\nexport function NotificationsProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [notifications, setNotifications] = useState<Notification[]>([]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n const config = useConfig();\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n };\n }, []);\n\n const removeNotification = useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setNotifications((prev) => prev.filter((n) => n.id !== id));\n }, []);\n\n const addNotification = useCallback(\n (notification: Omit<Notification, \"id\">) => {\n const id = Math.random().toString(36).substring(2, 9);\n const newNotification: Notification = { ...notification, id };\n setNotifications((prev) => [...prev, newNotification]);\n },\n [],\n );\n\n const clearNotifications = useCallback(() => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n setNotifications([]);\n }, []);\n\n const duration = config.components.notification.duration;\n\n return (\n <NotificationsContext.Provider\n value={{\n notifications,\n addNotification,\n removeNotification,\n clearNotifications,\n }}\n >\n {children}\n {notifications.length > 0 && (\n <div className=\"fixed w-full max-w-[400px] px-4 z-50 top-4 left-1/2 -translate-x-1/2 sm:top-5 sm:right-4 sm:left-auto sm:translate-x-0 flex flex-col gap-2\">\n {notifications.map((notification) => (\n <Toast\n key={notification.id}\n title={notification.title}\n subtitle={notification.subtitle}\n type={notification.type}\n duration={duration}\n onClose={() => removeNotification(notification.id)}\n />\n ))}\n </div>\n )}\n </NotificationsContext.Provider>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\nimport { createConfig } from \"../config/createConfig\";\nimport { ConfigContext } from \"../hooks/useConfig\";\nimport { ThemeProvider } from \"./ThemeProvider\";\nimport { LoadingProvider } from \"./LoadingProvider\";\nimport { NotificationsProvider } from \"./NotificationsProvider\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ninterface DashboardProviderProps {\n config?: DeepPartial<DashboardConfig>;\n children: React.ReactNode;\n}\n\nfunction CSSVarsInjector({ config }: { config: DashboardConfig }) {\n useEffect(() => {\n const root = document.documentElement;\n const { colors } = config;\n\n root.style.setProperty(\"--dashboard-primary\", colors.primary);\n root.style.setProperty(\"--dashboard-secondary\", colors.secondary);\n root.style.setProperty(\"--dashboard-background\", colors.background);\n root.style.setProperty(\"--dashboard-surface\", colors.surface);\n root.style.setProperty(\"--dashboard-text-primary\", colors.textPrimary);\n root.style.setProperty(\"--dashboard-text-secondary\", colors.textSecondary);\n root.style.setProperty(\"--dashboard-status-success\", colors.statusSuccess);\n root.style.setProperty(\"--dashboard-status-danger\", colors.statusDanger);\n root.style.setProperty(\"--dashboard-status-warning\", colors.statusWarning);\n root.style.setProperty(\"--dashboard-status-info\", colors.statusInfo);\n root.style.setProperty(\"--dashboard-status-neutral\", colors.statusNeutral);\n\n return () => {\n root.style.removeProperty(\"--dashboard-primary\");\n root.style.removeProperty(\"--dashboard-secondary\");\n root.style.removeProperty(\"--dashboard-background\");\n root.style.removeProperty(\"--dashboard-surface\");\n root.style.removeProperty(\"--dashboard-text-primary\");\n root.style.removeProperty(\"--dashboard-text-secondary\");\n root.style.removeProperty(\"--dashboard-status-success\");\n root.style.removeProperty(\"--dashboard-status-danger\");\n root.style.removeProperty(\"--dashboard-status-warning\");\n root.style.removeProperty(\"--dashboard-status-info\");\n root.style.removeProperty(\"--dashboard-status-neutral\");\n };\n }, [config]);\n\n return null;\n}\n\nexport function DashboardProvider({\n config: configOverrides,\n children,\n}: DashboardProviderProps) {\n const config = useMemo(\n () => createConfig(configOverrides),\n [configOverrides],\n );\n\n return (\n <ConfigContext.Provider value={config}>\n <CSSVarsInjector config={config} />\n <ThemeProvider>\n <LoadingProvider>\n <NotificationsProvider>{children}</NotificationsProvider>\n </LoadingProvider>\n </ThemeProvider>\n </ConfigContext.Provider>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tree-ia/design-system",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Shared UI component library for Tree IA dashboards",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",