[{"data":1,"prerenderedAt":3252},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-first-auth":265,"-getting-started-first-auth-surround":3247},[4,35,49,89,117,164,193,235,253,257,261],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"/getting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","/getting-started/introduction","1.getting-started/2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/getting-started/installation","1.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","/getting-started/quick-start","1.getting-started/4.quick-start","i-lucide-rocket",{"title":26,"path":27,"stem":28,"icon":29},"Configuration","/getting-started/configuration","1.getting-started/5.configuration","i-lucide-sliders-horizontal",{"title":31,"path":32,"stem":33,"icon":34},"First Auth","/getting-started/first-auth","1.getting-started/6.first-auth","i-lucide-key-round",{"title":36,"path":37,"stem":38,"children":39,"page":6},"Migration","/migration","10.migration",[40,45],{"title":41,"path":42,"stem":43,"icon":44},"Migration depuis Firebase Auth","/migration/from-firebase","10.migration/1.from-firebase","i-lucide-arrow-right-left",{"title":46,"path":47,"stem":48,"icon":44},"Migration depuis Supabase Auth","/migration/from-supabase","10.migration/2.from-supabase",{"title":50,"path":51,"stem":52,"children":53,"page":6},"Core Concepts","/core-concepts","2.core-concepts",[54,59,64,69,74,79,84],{"title":55,"path":56,"stem":57,"icon":58},"Architecture","/core-concepts/architecture","2.core-concepts/1.architecture","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Providers","/core-concepts/providers","2.core-concepts/2.providers","i-lucide-plug",{"title":65,"path":66,"stem":67,"icon":68},"Sessions","/core-concepts/sessions","2.core-concepts/3.sessions","i-lucide-timer",{"title":70,"path":71,"stem":72,"icon":73},"Storage","/core-concepts/storage","2.core-concepts/4.storage","i-lucide-database",{"title":75,"path":76,"stem":77,"icon":78},"Reactivity","/core-concepts/reactivity","2.core-concepts/5.reactivity","i-lucide-activity",{"title":80,"path":81,"stem":82,"icon":83},"Callbacks","/core-concepts/callbacks","2.core-concepts/6.callbacks","i-lucide-shield-check",{"title":85,"path":86,"stem":87,"icon":88},"Events","/core-concepts/events","2.core-concepts/7.events","i-lucide-radio",{"title":60,"path":90,"stem":91,"children":92,"page":6},"/providers","3.providers",[93,97,101,105,109,113],{"title":94,"path":95,"stem":96},"Credentials Provider","/providers/credentials","3.providers/1.credentials",{"title":98,"path":99,"stem":100},"OAuth2 Provider","/providers/oauth2","3.providers/2.oauth2",{"title":102,"path":103,"stem":104},"Google Provider","/providers/google","3.providers/3.google",{"title":106,"path":107,"stem":108},"GitHub Provider","/providers/github","3.providers/4.github",{"title":110,"path":111,"stem":112},"Apple Provider","/providers/apple","3.providers/5.apple",{"title":114,"path":115,"stem":116},"Proxy OAuth Provider","/providers/proxy-oauth","3.providers/6.proxy-oauth",{"title":118,"path":119,"stem":120,"children":121,"page":6},"Guides","/guides","4.guides",[122,126,131,136,141,146,151,155,159],{"title":123,"path":124,"stem":125},"Email / Password Auth","/guides/email-auth","4.guides/1.email-auth",{"title":127,"path":128,"stem":129,"icon":130},"Custom OAuth2 Flow","/guides/oauth2-flow","4.guides/2.oauth2-flow","i-lucide-workflow",{"title":132,"path":133,"stem":134,"icon":135},"Deep Links & OAuth2 Callbacks","/guides/deep-links","4.guides/3.deep-links","i-lucide-link",{"title":137,"path":138,"stem":139,"icon":140},"Token Refresh","/guides/token-refresh","4.guides/4.token-refresh","i-lucide-refresh-cw",{"title":142,"path":143,"stem":144,"icon":145},"Multi-Account","/guides/multi-account","4.guides/5.multi-account","i-lucide-users",{"title":147,"path":148,"stem":149,"icon":150},"Route Protection","/guides/route-protection","4.guides/6.route-protection","i-lucide-lock",{"title":152,"path":153,"stem":154,"icon":63},"Custom Provider","/guides/custom-provider","4.guides/7.custom-provider",{"title":156,"path":157,"stem":158,"icon":73},"Custom Storage","/guides/custom-storage","4.guides/8.custom-storage",{"title":160,"path":161,"stem":162,"icon":163},"Testing","/guides/testing","4.guides/9.testing","i-lucide-flask-conical",{"title":165,"path":166,"stem":167,"children":168,"page":6},"Flutter","/flutter","5.flutter",[169,173,178,183,188],{"title":170,"path":171,"stem":172},"Flutter Setup","/flutter/setup","5.flutter/1.setup",{"title":174,"path":175,"stem":176,"icon":177},"Secure Storage","/flutter/secure-storage","5.flutter/2.secure-storage","i-lucide-vault",{"title":179,"path":180,"stem":181,"icon":182},"Widgets","/flutter/widgets","5.flutter/3.widgets","i-lucide-layout",{"title":184,"path":185,"stem":186,"icon":187},"Router Guard","/flutter/router-guard","5.flutter/4.router-guard","i-lucide-signpost",{"title":189,"path":190,"stem":191,"icon":192},"App Binding","/flutter/app-binding","5.flutter/5.app-binding","i-lucide-cpu",{"title":194,"path":195,"stem":196,"children":197,"page":6},"API Reference","/api-reference","6.api-reference",[198,202,206,211,216,221,225,230],{"title":199,"path":200,"stem":201},"AuthyraClient","/api-reference/authyra-client","6.api-reference/1.authyra-client",{"title":203,"path":204,"stem":205},"AuthyraInstance","/api-reference/authyra-instance","6.api-reference/2.authyra-instance",{"title":207,"path":208,"stem":209,"icon":210},"AccountManager","/api-reference/account-manager","6.api-reference/3.account-manager","i-lucide-users-round",{"title":212,"path":213,"stem":214,"icon":215},"AuthProvider","/api-reference/auth-provider","6.api-reference/4.auth-provider","i-lucide-plug-zap",{"title":217,"path":218,"stem":219,"icon":220},"AuthStorage","/api-reference/auth-storage","6.api-reference/5.auth-storage","i-lucide-hard-drive",{"title":222,"path":223,"stem":224,"icon":68},"AuthSession","/api-reference/auth-session","6.api-reference/6.auth-session",{"title":226,"path":227,"stem":228,"icon":229},"AuthState","/api-reference/auth-state","6.api-reference/7.auth-state","i-lucide-toggle-right",{"title":231,"path":232,"stem":233,"icon":234},"Exceptions","/api-reference/auth-exceptions","6.api-reference/8.auth-exceptions","i-lucide-triangle-alert",{"title":236,"path":237,"stem":238,"children":239,"page":6},"Examples","/examples","7.examples",[240,244,249],{"title":241,"path":242,"stem":243},"Flutter App Example","/examples/flutter-app","7.examples/1.flutter-app",{"title":245,"path":246,"stem":247,"icon":248},"Dart Backend","/examples/dart-backend","7.examples/2.dart-backend","i-lucide-server",{"title":250,"path":251,"stem":252,"icon":163},"Testing Setup","/examples/testing-setup","7.examples/3.testing-setup",{"title":254,"path":255,"stem":256},"Troubleshooting","/troubleshooting","8.troubleshooting",{"title":258,"path":259,"stem":260},"FAQ","/faq","9.faq",{"title":262,"path":263,"stem":264},"Changelog","/changelog","changelog",{"id":266,"title":31,"body":267,"description":3238,"extension":3239,"links":3240,"meta":3241,"navigation":3242,"path":32,"seo":3243,"stem":33,"__hash__":3246},"docs/1.getting-started/6.first-auth.md",{"type":268,"value":269,"toc":3228},"minimark",[270,283,290,293,298,334,353,355,359,875,881,883,887,896,1228,1234,1236,1240,2311,2313,2317,2746,2762,2764,2768,2771,2793,2803,2805,2809,2815,3178,3192,3194,3198,3224],[271,272,273,274,278,279,282],"p",{},"Build a working sign-in from scratch in one page. You'll have a configured ",[275,276,277],"code",{},"CredentialsProvider",", a persisted session, and a reactive ",[275,280,281],{},"StreamBuilder"," before you reach the end.",[271,284,285,286,289],{},"This page uses a mocked ",[275,287,288],{},"authorize"," callback so you can follow along without a real backend. Swap the mock for your actual API call when you're ready.",[291,292],"hr",{},[294,295,297],"h2",{"id":296},"_1-install","1. Install",[299,300,306],"pre",{"className":301,"code":302,"filename":303,"language":304,"meta":305,"style":305},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  authyra_flutter: ^0.1.0\n","pubspec.yaml","yaml","",[275,307,308,321],{"__ignoreMap":305},[309,310,313,317],"span",{"class":311,"line":312},"line",1,[309,314,316],{"class":315},"swJcz","dependencies",[309,318,320],{"class":319},"sMK4o",":\n",[309,322,324,327,330],{"class":311,"line":323},2,[309,325,326],{"class":315},"  authyra_flutter",[309,328,329],{"class":319},":",[309,331,333],{"class":332},"sfazB"," ^0.1.0\n",[299,335,339],{"className":336,"code":337,"language":338,"meta":305,"style":305},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flutter pub get\n","bash",[275,340,341],{"__ignoreMap":305},[309,342,343,347,350],{"class":311,"line":312},[309,344,346],{"class":345},"sBMFI","flutter",[309,348,349],{"class":332}," pub",[309,351,352],{"class":332}," get\n",[291,354],{},[294,356,358],{"id":357},"_2-initialize-at-startup","2. Initialize at startup",[299,360,365],{"className":361,"code":362,"filename":363,"language":364,"meta":305,"style":305},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:authyra_flutter/authyra_flutter.dart';\nimport 'package:flutter/material.dart';\n\nFuture\u003Cvoid> main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  await Authyra.initialize(\n    client: AuthyraClient(\n      providers: [\n        CredentialsProvider.withTokens(\n          id: 'email',\n          authorize: (creds) async {\n            // Replace this mock with your real API call:\n            //   final res = await myApi.post('/auth/login', body: creds);\n            if (creds?['email'] == 'demo@example.com' &&\n                creds?['password'] == 'password') {\n              return AuthSignInResult(\n                user: AuthUser(id: '1', email: creds!['email'] as String, name: 'Demo User'),\n                accessToken:  'demo-access-token',\n                refreshToken: 'demo-refresh-token',\n                expiresAt:    DateTime.now().add(const Duration(hours: 1)),\n              );\n            }\n            return null; // wrong credentials → throws AuthenticationFailedException\n          },\n        ),\n      ],\n      storage: SecureAuthStorage(),\n      config: const AuthConfig(autoRefresh: true),\n    ),\n  );\n\n  runApp(const MyApp());\n}\n","lib/main.dart","dart",[275,366,367,379,388,395,426,443,448,465,478,489,502,516,531,538,544,574,597,608,668,681,694,739,747,753,765,773,781,789,804,830,838,846,851,869],{"__ignoreMap":305},[309,368,369,373,376],{"class":311,"line":312},[309,370,372],{"class":371},"sbssI","import",[309,374,375],{"class":332}," 'package:authyra_flutter/authyra_flutter.dart'",[309,377,378],{"class":319},";\n",[309,380,381,383,386],{"class":311,"line":323},[309,382,372],{"class":371},[309,384,385],{"class":332}," 'package:flutter/material.dart'",[309,387,378],{"class":319},[309,389,391],{"class":311,"line":390},3,[309,392,394],{"emptyLinePlaceholder":393},true,"\n",[309,396,398,401,405,409,412,416,419,423],{"class":311,"line":397},4,[309,399,400],{"class":345},"Future",[309,402,404],{"class":403},"sTEyZ","\u003C",[309,406,408],{"class":407},"spNyl","void",[309,410,411],{"class":403},"> ",[309,413,415],{"class":414},"s2Zo4","main",[309,417,418],{"class":403},"() ",[309,420,422],{"class":421},"s7zQu","async",[309,424,425],{"class":403}," {\n",[309,427,429,432,435,438,441],{"class":311,"line":428},5,[309,430,431],{"class":345},"  WidgetsFlutterBinding",[309,433,434],{"class":319},".",[309,436,437],{"class":414},"ensureInitialized",[309,439,440],{"class":403},"()",[309,442,378],{"class":319},[309,444,446],{"class":311,"line":445},6,[309,447,394],{"emptyLinePlaceholder":393},[309,449,451,454,457,459,462],{"class":311,"line":450},7,[309,452,453],{"class":421},"  await",[309,455,456],{"class":345}," Authyra",[309,458,434],{"class":319},[309,460,461],{"class":414},"initialize",[309,463,464],{"class":403},"(\n",[309,466,468,471,473,476],{"class":311,"line":467},8,[309,469,470],{"class":403},"    client",[309,472,329],{"class":319},[309,474,475],{"class":345}," AuthyraClient",[309,477,464],{"class":403},[309,479,481,484,486],{"class":311,"line":480},9,[309,482,483],{"class":403},"      providers",[309,485,329],{"class":319},[309,487,488],{"class":403}," [\n",[309,490,492,495,497,500],{"class":311,"line":491},10,[309,493,494],{"class":345},"        CredentialsProvider",[309,496,434],{"class":319},[309,498,499],{"class":414},"withTokens",[309,501,464],{"class":403},[309,503,505,508,510,513],{"class":311,"line":504},11,[309,506,507],{"class":403},"          id",[309,509,329],{"class":319},[309,511,512],{"class":332}," 'email'",[309,514,515],{"class":319},",\n",[309,517,519,522,524,527,529],{"class":311,"line":518},12,[309,520,521],{"class":403},"          authorize",[309,523,329],{"class":319},[309,525,526],{"class":403}," (creds) ",[309,528,422],{"class":421},[309,530,425],{"class":403},[309,532,534],{"class":311,"line":533},13,[309,535,537],{"class":536},"sHwdD","            // Replace this mock with your real API call:\n",[309,539,541],{"class":311,"line":540},14,[309,542,543],{"class":536},"            //   final res = await myApi.post('/auth/login', body: creds);\n",[309,545,547,550,553,556,559,562,565,568,571],{"class":311,"line":546},15,[309,548,549],{"class":421},"            if",[309,551,552],{"class":403}," (creds",[309,554,555],{"class":319},"?",[309,557,558],{"class":403},"[",[309,560,561],{"class":332},"'email'",[309,563,564],{"class":403},"] ",[309,566,567],{"class":319},"==",[309,569,570],{"class":332}," 'demo@example.com'",[309,572,573],{"class":319}," &&\n",[309,575,577,580,582,584,587,589,591,594],{"class":311,"line":576},16,[309,578,579],{"class":403},"                creds",[309,581,555],{"class":319},[309,583,558],{"class":403},[309,585,586],{"class":332},"'password'",[309,588,564],{"class":403},[309,590,567],{"class":319},[309,592,593],{"class":332}," 'password'",[309,595,596],{"class":403},") {\n",[309,598,600,603,606],{"class":311,"line":599},17,[309,601,602],{"class":421},"              return",[309,604,605],{"class":345}," AuthSignInResult",[309,607,464],{"class":403},[309,609,611,614,616,619,622,624,627,630,633,635,638,641,643,645,647,650,653,655,658,660,663,666],{"class":311,"line":610},18,[309,612,613],{"class":403},"                user",[309,615,329],{"class":319},[309,617,618],{"class":345}," AuthUser",[309,620,621],{"class":403},"(id",[309,623,329],{"class":319},[309,625,626],{"class":332}," '1'",[309,628,629],{"class":319},",",[309,631,632],{"class":403}," email",[309,634,329],{"class":319},[309,636,637],{"class":403}," creds",[309,639,640],{"class":319},"!",[309,642,558],{"class":403},[309,644,561],{"class":332},[309,646,564],{"class":403},[309,648,649],{"class":319},"as",[309,651,652],{"class":345}," String",[309,654,629],{"class":319},[309,656,657],{"class":403}," name",[309,659,329],{"class":319},[309,661,662],{"class":332}," 'Demo User'",[309,664,665],{"class":403},")",[309,667,515],{"class":319},[309,669,671,674,676,679],{"class":311,"line":670},19,[309,672,673],{"class":403},"                accessToken",[309,675,329],{"class":319},[309,677,678],{"class":332},"  'demo-access-token'",[309,680,515],{"class":319},[309,682,684,687,689,692],{"class":311,"line":683},20,[309,685,686],{"class":403},"                refreshToken",[309,688,329],{"class":319},[309,690,691],{"class":332}," 'demo-refresh-token'",[309,693,515],{"class":319},[309,695,697,700,702,705,707,710,712,714,717,720,723,726,729,731,734,737],{"class":311,"line":696},21,[309,698,699],{"class":403},"                expiresAt",[309,701,329],{"class":319},[309,703,704],{"class":345},"    DateTime",[309,706,434],{"class":319},[309,708,709],{"class":414},"now",[309,711,440],{"class":403},[309,713,434],{"class":319},[309,715,716],{"class":414},"add",[309,718,719],{"class":403},"(",[309,721,722],{"class":407},"const",[309,724,725],{"class":345}," Duration",[309,727,728],{"class":403},"(hours",[309,730,329],{"class":319},[309,732,733],{"class":371}," 1",[309,735,736],{"class":403},"))",[309,738,515],{"class":319},[309,740,742,745],{"class":311,"line":741},22,[309,743,744],{"class":403},"              )",[309,746,378],{"class":319},[309,748,750],{"class":311,"line":749},23,[309,751,752],{"class":403},"            }\n",[309,754,756,759,762],{"class":311,"line":755},24,[309,757,758],{"class":421},"            return",[309,760,761],{"class":319}," null;",[309,763,764],{"class":536}," // wrong credentials → throws AuthenticationFailedException\n",[309,766,768,771],{"class":311,"line":767},25,[309,769,770],{"class":403},"          }",[309,772,515],{"class":319},[309,774,776,779],{"class":311,"line":775},26,[309,777,778],{"class":403},"        )",[309,780,515],{"class":319},[309,782,784,787],{"class":311,"line":783},27,[309,785,786],{"class":403},"      ]",[309,788,515],{"class":319},[309,790,792,795,797,800,802],{"class":311,"line":791},28,[309,793,794],{"class":403},"      storage",[309,796,329],{"class":319},[309,798,799],{"class":345}," SecureAuthStorage",[309,801,440],{"class":403},[309,803,515],{"class":319},[309,805,807,810,812,815,818,821,823,826,828],{"class":311,"line":806},29,[309,808,809],{"class":403},"      config",[309,811,329],{"class":319},[309,813,814],{"class":407}," const",[309,816,817],{"class":345}," AuthConfig",[309,819,820],{"class":403},"(autoRefresh",[309,822,329],{"class":319},[309,824,825],{"class":319}," true",[309,827,665],{"class":403},[309,829,515],{"class":319},[309,831,833,836],{"class":311,"line":832},30,[309,834,835],{"class":403},"    )",[309,837,515],{"class":319},[309,839,841,844],{"class":311,"line":840},31,[309,842,843],{"class":403},"  )",[309,845,378],{"class":319},[309,847,849],{"class":311,"line":848},32,[309,850,394],{"emptyLinePlaceholder":393},[309,852,854,857,859,861,864,867],{"class":311,"line":853},33,[309,855,856],{"class":414},"  runApp",[309,858,719],{"class":403},[309,860,722],{"class":407},[309,862,863],{"class":345}," MyApp",[309,865,866],{"class":403},"())",[309,868,378],{"class":319},[309,870,872],{"class":311,"line":871},34,[309,873,874],{"class":403},"}\n",[271,876,877,880],{},[275,878,879],{},"Authyra.initialize"," restores any previously persisted session, so returning users are authenticated immediately on next launch.",[291,882],{},[294,884,886],{"id":885},"_3-react-to-auth-state","3. React to auth state",[271,888,889,890,892,893,329],{},"Wrap your root widget in a ",[275,891,281],{}," on ",[275,894,895],{},"authStateChanges",[299,897,900],{"className":361,"code":898,"filename":899,"language":364,"meta":305,"style":305},"class MyApp extends StatelessWidget {\n  const MyApp({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: StreamBuilder\u003CAuthState>(\n        stream: Authyra.instance.authStateChanges,\n        builder: (context, snapshot) {\n          final state = snapshot.data ?? AuthState.unauthenticated();\n          return switch (state.type) {\n            AuthStateType.authenticated   => HomePage(user: state.user!),\n            AuthStateType.unauthenticated => const LoginPage(),\n            AuthStateType.error           => Scaffold(\n                body: Center(child: Text('Error: ${state.error}')),\n              ),\n          };\n        },\n      ),\n    );\n  }\n}\n","lib/main.dart (continued)",[275,901,902,917,934,938,943,959,969,986,1006,1021,1055,1071,1106,1126,1142,1187,1193,1199,1206,1213,1219,1224],{"__ignoreMap":305},[309,903,904,907,909,912,915],{"class":311,"line":312},[309,905,906],{"class":319},"class",[309,908,863],{"class":345},[309,910,911],{"class":319}," extends",[309,913,914],{"class":345}," StatelessWidget",[309,916,425],{"class":403},[309,918,919,922,924,927,929,932],{"class":311,"line":323},[309,920,921],{"class":407},"  const",[309,923,863],{"class":345},[309,925,926],{"class":403},"({super",[309,928,434],{"class":319},[309,930,931],{"class":403},"key})",[309,933,378],{"class":319},[309,935,936],{"class":311,"line":390},[309,937,394],{"emptyLinePlaceholder":393},[309,939,940],{"class":311,"line":397},[309,941,942],{"class":407},"  @override\n",[309,944,945,948,951,953,956],{"class":311,"line":428},[309,946,947],{"class":345},"  Widget",[309,949,950],{"class":414}," build",[309,952,719],{"class":403},[309,954,955],{"class":345},"BuildContext",[309,957,958],{"class":403}," context) {\n",[309,960,961,964,967],{"class":311,"line":445},[309,962,963],{"class":421},"    return",[309,965,966],{"class":345}," MaterialApp",[309,968,464],{"class":403},[309,970,971,974,976,979,981,983],{"class":311,"line":450},[309,972,973],{"class":403},"      home",[309,975,329],{"class":319},[309,977,978],{"class":345}," StreamBuilder",[309,980,404],{"class":403},[309,982,226],{"class":345},[309,984,985],{"class":403},">(\n",[309,987,988,991,993,995,997,1000,1002,1004],{"class":311,"line":467},[309,989,990],{"class":403},"        stream",[309,992,329],{"class":319},[309,994,456],{"class":345},[309,996,434],{"class":319},[309,998,999],{"class":403},"instance",[309,1001,434],{"class":319},[309,1003,895],{"class":403},[309,1005,515],{"class":319},[309,1007,1008,1011,1013,1016,1018],{"class":311,"line":480},[309,1009,1010],{"class":403},"        builder",[309,1012,329],{"class":319},[309,1014,1015],{"class":403}," (context",[309,1017,629],{"class":319},[309,1019,1020],{"class":403}," snapshot) {\n",[309,1022,1023,1026,1029,1032,1035,1037,1040,1043,1046,1048,1051,1053],{"class":311,"line":491},[309,1024,1025],{"class":407},"          final",[309,1027,1028],{"class":403}," state ",[309,1030,1031],{"class":319},"=",[309,1033,1034],{"class":403}," snapshot",[309,1036,434],{"class":319},[309,1038,1039],{"class":403},"data ",[309,1041,1042],{"class":319},"??",[309,1044,1045],{"class":345}," AuthState",[309,1047,434],{"class":319},[309,1049,1050],{"class":414},"unauthenticated",[309,1052,440],{"class":403},[309,1054,378],{"class":319},[309,1056,1057,1060,1063,1066,1068],{"class":311,"line":504},[309,1058,1059],{"class":421},"          return",[309,1061,1062],{"class":421}," switch",[309,1064,1065],{"class":403}," (state",[309,1067,434],{"class":319},[309,1069,1070],{"class":403},"type) {\n",[309,1072,1073,1076,1078,1081,1084,1087,1090,1092,1095,1097,1100,1102,1104],{"class":311,"line":518},[309,1074,1075],{"class":345},"            AuthStateType",[309,1077,434],{"class":319},[309,1079,1080],{"class":403},"authenticated   ",[309,1082,1083],{"class":319},"=>",[309,1085,1086],{"class":345}," HomePage",[309,1088,1089],{"class":403},"(user",[309,1091,329],{"class":319},[309,1093,1094],{"class":403}," state",[309,1096,434],{"class":319},[309,1098,1099],{"class":403},"user",[309,1101,640],{"class":319},[309,1103,665],{"class":403},[309,1105,515],{"class":319},[309,1107,1108,1110,1112,1115,1117,1119,1122,1124],{"class":311,"line":533},[309,1109,1075],{"class":345},[309,1111,434],{"class":319},[309,1113,1114],{"class":403},"unauthenticated ",[309,1116,1083],{"class":319},[309,1118,814],{"class":407},[309,1120,1121],{"class":345}," LoginPage",[309,1123,440],{"class":403},[309,1125,515],{"class":319},[309,1127,1128,1130,1132,1135,1137,1140],{"class":311,"line":540},[309,1129,1075],{"class":345},[309,1131,434],{"class":319},[309,1133,1134],{"class":403},"error           ",[309,1136,1083],{"class":319},[309,1138,1139],{"class":345}," Scaffold",[309,1141,464],{"class":403},[309,1143,1144,1147,1149,1152,1155,1157,1160,1162,1165,1168,1172,1174,1177,1180,1183,1185],{"class":311,"line":546},[309,1145,1146],{"class":403},"                body",[309,1148,329],{"class":319},[309,1150,1151],{"class":345}," Center",[309,1153,1154],{"class":403},"(child",[309,1156,329],{"class":319},[309,1158,1159],{"class":345}," Text",[309,1161,719],{"class":403},[309,1163,1164],{"class":332},"'Error: ",[309,1166,1167],{"class":403},"${",[309,1169,1171],{"class":1170},"sHdIc","state",[309,1173,434],{"class":403},[309,1175,1176],{"class":1170},"error",[309,1178,1179],{"class":403},"}",[309,1181,1182],{"class":332},"'",[309,1184,736],{"class":403},[309,1186,515],{"class":319},[309,1188,1189,1191],{"class":311,"line":576},[309,1190,744],{"class":403},[309,1192,515],{"class":319},[309,1194,1195,1197],{"class":311,"line":599},[309,1196,770],{"class":403},[309,1198,378],{"class":319},[309,1200,1201,1204],{"class":311,"line":610},[309,1202,1203],{"class":403},"        }",[309,1205,515],{"class":319},[309,1207,1208,1211],{"class":311,"line":670},[309,1209,1210],{"class":403},"      )",[309,1212,515],{"class":319},[309,1214,1215,1217],{"class":311,"line":683},[309,1216,835],{"class":403},[309,1218,378],{"class":319},[309,1220,1221],{"class":311,"line":696},[309,1222,1223],{"class":403},"  }\n",[309,1225,1226],{"class":311,"line":741},[309,1227,874],{"class":403},[271,1229,1230,1231,1233],{},"The ",[275,1232,281],{}," re-renders whenever the auth state changes — no manual navigation calls needed.",[291,1235],{},[294,1237,1239],{"id":1238},"_4-build-the-login-form","4. Build the login form",[299,1241,1244],{"className":361,"code":1242,"filename":1243,"language":364,"meta":305,"style":305},"import 'package:authyra_flutter/authyra_flutter.dart';\nimport 'package:flutter/material.dart';\n\nclass LoginPage extends StatefulWidget {\n  const LoginPage({super.key});\n\n  @override\n  State\u003CLoginPage> createState() => _LoginPageState();\n}\n\nclass _LoginPageState extends State\u003CLoginPage> {\n  final _email    = TextEditingController();\n  final _password = TextEditingController();\n  bool    _loading = false;\n  String? _error;\n\n  Future\u003Cvoid> _signIn() async {\n    setState(() { _loading = true; _error = null; });\n    try {\n      await Authyra.instance.signIn('email', params: {\n        'email':    _email.text.trim(),\n        'password': _password.text,\n      });\n      // StreamBuilder above detects the new AuthState and renders HomePage.\n    } on AuthenticationFailedException {\n      setState(() => _error = 'Invalid email or password.');\n    } catch (_) {\n      setState(() => _error = 'Something went wrong. Try again.');\n    } finally {\n      setState(() => _loading = false);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Padding(\n        padding: const EdgeInsets.all(24),\n        child: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          crossAxisAlignment: CrossAxisAlignment.stretch,\n          children: [\n            const Text('Sign in',\n                style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold)),\n            const SizedBox(height: 32),\n            TextField(\n              controller: _email,\n              decoration: const InputDecoration(\n                labelText: 'Email',\n                border: OutlineInputBorder(),\n              ),\n              keyboardType: TextInputType.emailAddress,\n            ),\n            const SizedBox(height: 12),\n            TextField(\n              controller: _password,\n              decoration: const InputDecoration(\n                labelText: 'Password',\n                border: OutlineInputBorder(),\n              ),\n              obscureText: true,\n            ),\n            if (_error != null) ...[\n              const SizedBox(height: 12),\n              Text(_error!, style: const TextStyle(color: Colors.red)),\n            ],\n            const SizedBox(height: 24),\n            FilledButton(\n              onPressed: _loading ? null : _signIn,\n              child: _loading\n                  ? const SizedBox.square(\n                      dimension: 20,\n                      child: CircularProgressIndicator(strokeWidth: 2),\n                    )\n                  : const Text('Sign in'),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n","lib/pages/login_page.dart",[275,1245,1246,1254,1262,1266,1279,1293,1297,1301,1327,1331,1335,1353,1370,1385,1398,1410,1414,1434,1459,1466,1495,1519,1535,1542,1547,1560,1581,1591,1610,1619,1639,1644,1648,1652,1656,1669,1678,1691,1718,1731,1749,1767,1777,1792,1828,1848,1856,1869,1884,1897,1912,1919,1937,1945,1963,1970,1981,1994,2006,2019,2026,2037,2044,2067,2085,2121,2129,2147,2155,2177,2188,2205,2218,2241,2247,2265,2272,2280,2287,2294,2301,2306],{"__ignoreMap":305},[309,1247,1248,1250,1252],{"class":311,"line":312},[309,1249,372],{"class":371},[309,1251,375],{"class":332},[309,1253,378],{"class":319},[309,1255,1256,1258,1260],{"class":311,"line":323},[309,1257,372],{"class":371},[309,1259,385],{"class":332},[309,1261,378],{"class":319},[309,1263,1264],{"class":311,"line":390},[309,1265,394],{"emptyLinePlaceholder":393},[309,1267,1268,1270,1272,1274,1277],{"class":311,"line":397},[309,1269,906],{"class":319},[309,1271,1121],{"class":345},[309,1273,911],{"class":319},[309,1275,1276],{"class":345}," StatefulWidget",[309,1278,425],{"class":403},[309,1280,1281,1283,1285,1287,1289,1291],{"class":311,"line":428},[309,1282,921],{"class":407},[309,1284,1121],{"class":345},[309,1286,926],{"class":403},[309,1288,434],{"class":319},[309,1290,931],{"class":403},[309,1292,378],{"class":319},[309,1294,1295],{"class":311,"line":445},[309,1296,394],{"emptyLinePlaceholder":393},[309,1298,1299],{"class":311,"line":450},[309,1300,942],{"class":407},[309,1302,1303,1306,1308,1311,1313,1316,1318,1320,1323,1325],{"class":311,"line":467},[309,1304,1305],{"class":345},"  State",[309,1307,404],{"class":403},[309,1309,1310],{"class":345},"LoginPage",[309,1312,411],{"class":403},[309,1314,1315],{"class":414},"createState",[309,1317,418],{"class":403},[309,1319,1083],{"class":319},[309,1321,1322],{"class":345}," _LoginPageState",[309,1324,440],{"class":403},[309,1326,378],{"class":319},[309,1328,1329],{"class":311,"line":480},[309,1330,874],{"class":403},[309,1332,1333],{"class":311,"line":491},[309,1334,394],{"emptyLinePlaceholder":393},[309,1336,1337,1339,1341,1343,1346,1348,1350],{"class":311,"line":504},[309,1338,906],{"class":319},[309,1340,1322],{"class":345},[309,1342,911],{"class":319},[309,1344,1345],{"class":345}," State",[309,1347,404],{"class":403},[309,1349,1310],{"class":345},[309,1351,1352],{"class":403},"> {\n",[309,1354,1355,1358,1361,1363,1366,1368],{"class":311,"line":518},[309,1356,1357],{"class":407},"  final",[309,1359,1360],{"class":403}," _email    ",[309,1362,1031],{"class":319},[309,1364,1365],{"class":345}," TextEditingController",[309,1367,440],{"class":403},[309,1369,378],{"class":319},[309,1371,1372,1374,1377,1379,1381,1383],{"class":311,"line":533},[309,1373,1357],{"class":407},[309,1375,1376],{"class":403}," _password ",[309,1378,1031],{"class":319},[309,1380,1365],{"class":345},[309,1382,440],{"class":403},[309,1384,378],{"class":319},[309,1386,1387,1390,1393,1395],{"class":311,"line":540},[309,1388,1389],{"class":345},"  bool",[309,1391,1392],{"class":403},"    _loading ",[309,1394,1031],{"class":319},[309,1396,1397],{"class":319}," false;\n",[309,1399,1400,1403,1405,1408],{"class":311,"line":546},[309,1401,1402],{"class":345},"  String",[309,1404,555],{"class":319},[309,1406,1407],{"class":403}," _error",[309,1409,378],{"class":319},[309,1411,1412],{"class":311,"line":576},[309,1413,394],{"emptyLinePlaceholder":393},[309,1415,1416,1419,1421,1423,1425,1428,1430,1432],{"class":311,"line":599},[309,1417,1418],{"class":345},"  Future",[309,1420,404],{"class":403},[309,1422,408],{"class":407},[309,1424,411],{"class":403},[309,1426,1427],{"class":414},"_signIn",[309,1429,418],{"class":403},[309,1431,422],{"class":421},[309,1433,425],{"class":403},[309,1435,1436,1439,1442,1444,1447,1450,1452,1454,1457],{"class":311,"line":610},[309,1437,1438],{"class":414},"    setState",[309,1440,1441],{"class":403},"(() { _loading ",[309,1443,1031],{"class":319},[309,1445,1446],{"class":319}," true;",[309,1448,1449],{"class":403}," _error ",[309,1451,1031],{"class":319},[309,1453,761],{"class":319},[309,1455,1456],{"class":403}," })",[309,1458,378],{"class":319},[309,1460,1461,1464],{"class":311,"line":670},[309,1462,1463],{"class":421},"    try",[309,1465,425],{"class":403},[309,1467,1468,1471,1473,1475,1477,1479,1482,1484,1486,1488,1491,1493],{"class":311,"line":683},[309,1469,1470],{"class":421},"      await",[309,1472,456],{"class":345},[309,1474,434],{"class":319},[309,1476,999],{"class":403},[309,1478,434],{"class":319},[309,1480,1481],{"class":414},"signIn",[309,1483,719],{"class":403},[309,1485,561],{"class":332},[309,1487,629],{"class":319},[309,1489,1490],{"class":403}," params",[309,1492,329],{"class":319},[309,1494,425],{"class":403},[309,1496,1497,1500,1502,1505,1507,1510,1512,1515,1517],{"class":311,"line":696},[309,1498,1499],{"class":332},"        'email'",[309,1501,329],{"class":319},[309,1503,1504],{"class":403},"    _email",[309,1506,434],{"class":319},[309,1508,1509],{"class":403},"text",[309,1511,434],{"class":319},[309,1513,1514],{"class":414},"trim",[309,1516,440],{"class":403},[309,1518,515],{"class":319},[309,1520,1521,1524,1526,1529,1531,1533],{"class":311,"line":741},[309,1522,1523],{"class":332},"        'password'",[309,1525,329],{"class":319},[309,1527,1528],{"class":403}," _password",[309,1530,434],{"class":319},[309,1532,1509],{"class":403},[309,1534,515],{"class":319},[309,1536,1537,1540],{"class":311,"line":749},[309,1538,1539],{"class":403},"      })",[309,1541,378],{"class":319},[309,1543,1544],{"class":311,"line":755},[309,1545,1546],{"class":536},"      // StreamBuilder above detects the new AuthState and renders HomePage.\n",[309,1548,1549,1552,1555,1558],{"class":311,"line":767},[309,1550,1551],{"class":403},"    } ",[309,1553,1554],{"class":421},"on",[309,1556,1557],{"class":345}," AuthenticationFailedException",[309,1559,425],{"class":403},[309,1561,1562,1565,1568,1570,1572,1574,1577,1579],{"class":311,"line":775},[309,1563,1564],{"class":414},"      setState",[309,1566,1567],{"class":403},"(() ",[309,1569,1083],{"class":319},[309,1571,1449],{"class":403},[309,1573,1031],{"class":319},[309,1575,1576],{"class":332}," 'Invalid email or password.'",[309,1578,665],{"class":403},[309,1580,378],{"class":319},[309,1582,1583,1585,1588],{"class":311,"line":783},[309,1584,1551],{"class":403},[309,1586,1587],{"class":421},"catch",[309,1589,1590],{"class":403}," (_) {\n",[309,1592,1593,1595,1597,1599,1601,1603,1606,1608],{"class":311,"line":791},[309,1594,1564],{"class":414},[309,1596,1567],{"class":403},[309,1598,1083],{"class":319},[309,1600,1449],{"class":403},[309,1602,1031],{"class":319},[309,1604,1605],{"class":332}," 'Something went wrong. Try again.'",[309,1607,665],{"class":403},[309,1609,378],{"class":319},[309,1611,1612,1614,1617],{"class":311,"line":806},[309,1613,1551],{"class":403},[309,1615,1616],{"class":421},"finally",[309,1618,425],{"class":403},[309,1620,1621,1623,1625,1627,1630,1632,1635,1637],{"class":311,"line":832},[309,1622,1564],{"class":414},[309,1624,1567],{"class":403},[309,1626,1083],{"class":319},[309,1628,1629],{"class":403}," _loading ",[309,1631,1031],{"class":319},[309,1633,1634],{"class":319}," false",[309,1636,665],{"class":403},[309,1638,378],{"class":319},[309,1640,1641],{"class":311,"line":840},[309,1642,1643],{"class":403},"    }\n",[309,1645,1646],{"class":311,"line":848},[309,1647,1223],{"class":403},[309,1649,1650],{"class":311,"line":853},[309,1651,394],{"emptyLinePlaceholder":393},[309,1653,1654],{"class":311,"line":871},[309,1655,942],{"class":407},[309,1657,1659,1661,1663,1665,1667],{"class":311,"line":1658},35,[309,1660,947],{"class":345},[309,1662,950],{"class":414},[309,1664,719],{"class":403},[309,1666,955],{"class":345},[309,1668,958],{"class":403},[309,1670,1672,1674,1676],{"class":311,"line":1671},36,[309,1673,963],{"class":421},[309,1675,1139],{"class":345},[309,1677,464],{"class":403},[309,1679,1681,1684,1686,1689],{"class":311,"line":1680},37,[309,1682,1683],{"class":403},"      body",[309,1685,329],{"class":319},[309,1687,1688],{"class":345}," Padding",[309,1690,464],{"class":403},[309,1692,1694,1697,1699,1701,1704,1706,1709,1711,1714,1716],{"class":311,"line":1693},38,[309,1695,1696],{"class":403},"        padding",[309,1698,329],{"class":319},[309,1700,814],{"class":407},[309,1702,1703],{"class":345}," EdgeInsets",[309,1705,434],{"class":319},[309,1707,1708],{"class":414},"all",[309,1710,719],{"class":403},[309,1712,1713],{"class":371},"24",[309,1715,665],{"class":403},[309,1717,515],{"class":319},[309,1719,1721,1724,1726,1729],{"class":311,"line":1720},39,[309,1722,1723],{"class":403},"        child",[309,1725,329],{"class":319},[309,1727,1728],{"class":345}," Column",[309,1730,464],{"class":403},[309,1732,1734,1737,1739,1742,1744,1747],{"class":311,"line":1733},40,[309,1735,1736],{"class":403},"          mainAxisAlignment",[309,1738,329],{"class":319},[309,1740,1741],{"class":345}," MainAxisAlignment",[309,1743,434],{"class":319},[309,1745,1746],{"class":403},"center",[309,1748,515],{"class":319},[309,1750,1752,1755,1757,1760,1762,1765],{"class":311,"line":1751},41,[309,1753,1754],{"class":403},"          crossAxisAlignment",[309,1756,329],{"class":319},[309,1758,1759],{"class":345}," CrossAxisAlignment",[309,1761,434],{"class":319},[309,1763,1764],{"class":403},"stretch",[309,1766,515],{"class":319},[309,1768,1770,1773,1775],{"class":311,"line":1769},42,[309,1771,1772],{"class":403},"          children",[309,1774,329],{"class":319},[309,1776,488],{"class":403},[309,1778,1780,1783,1785,1787,1790],{"class":311,"line":1779},43,[309,1781,1782],{"class":407},"            const",[309,1784,1159],{"class":345},[309,1786,719],{"class":403},[309,1788,1789],{"class":332},"'Sign in'",[309,1791,515],{"class":319},[309,1793,1795,1798,1800,1803,1806,1808,1811,1813,1816,1818,1821,1823,1826],{"class":311,"line":1794},44,[309,1796,1797],{"class":403},"                style",[309,1799,329],{"class":319},[309,1801,1802],{"class":345}," TextStyle",[309,1804,1805],{"class":403},"(fontSize",[309,1807,329],{"class":319},[309,1809,1810],{"class":371}," 28",[309,1812,629],{"class":319},[309,1814,1815],{"class":403}," fontWeight",[309,1817,329],{"class":319},[309,1819,1820],{"class":345}," FontWeight",[309,1822,434],{"class":319},[309,1824,1825],{"class":403},"bold))",[309,1827,515],{"class":319},[309,1829,1831,1833,1836,1839,1841,1844,1846],{"class":311,"line":1830},45,[309,1832,1782],{"class":407},[309,1834,1835],{"class":345}," SizedBox",[309,1837,1838],{"class":403},"(height",[309,1840,329],{"class":319},[309,1842,1843],{"class":371}," 32",[309,1845,665],{"class":403},[309,1847,515],{"class":319},[309,1849,1851,1854],{"class":311,"line":1850},46,[309,1852,1853],{"class":345},"            TextField",[309,1855,464],{"class":403},[309,1857,1859,1862,1864,1867],{"class":311,"line":1858},47,[309,1860,1861],{"class":403},"              controller",[309,1863,329],{"class":319},[309,1865,1866],{"class":403}," _email",[309,1868,515],{"class":319},[309,1870,1872,1875,1877,1879,1882],{"class":311,"line":1871},48,[309,1873,1874],{"class":403},"              decoration",[309,1876,329],{"class":319},[309,1878,814],{"class":407},[309,1880,1881],{"class":345}," InputDecoration",[309,1883,464],{"class":403},[309,1885,1887,1890,1892,1895],{"class":311,"line":1886},49,[309,1888,1889],{"class":403},"                labelText",[309,1891,329],{"class":319},[309,1893,1894],{"class":332}," 'Email'",[309,1896,515],{"class":319},[309,1898,1900,1903,1905,1908,1910],{"class":311,"line":1899},50,[309,1901,1902],{"class":403},"                border",[309,1904,329],{"class":319},[309,1906,1907],{"class":345}," OutlineInputBorder",[309,1909,440],{"class":403},[309,1911,515],{"class":319},[309,1913,1915,1917],{"class":311,"line":1914},51,[309,1916,744],{"class":403},[309,1918,515],{"class":319},[309,1920,1922,1925,1927,1930,1932,1935],{"class":311,"line":1921},52,[309,1923,1924],{"class":403},"              keyboardType",[309,1926,329],{"class":319},[309,1928,1929],{"class":345}," TextInputType",[309,1931,434],{"class":319},[309,1933,1934],{"class":403},"emailAddress",[309,1936,515],{"class":319},[309,1938,1940,1943],{"class":311,"line":1939},53,[309,1941,1942],{"class":403},"            )",[309,1944,515],{"class":319},[309,1946,1948,1950,1952,1954,1956,1959,1961],{"class":311,"line":1947},54,[309,1949,1782],{"class":407},[309,1951,1835],{"class":345},[309,1953,1838],{"class":403},[309,1955,329],{"class":319},[309,1957,1958],{"class":371}," 12",[309,1960,665],{"class":403},[309,1962,515],{"class":319},[309,1964,1966,1968],{"class":311,"line":1965},55,[309,1967,1853],{"class":345},[309,1969,464],{"class":403},[309,1971,1973,1975,1977,1979],{"class":311,"line":1972},56,[309,1974,1861],{"class":403},[309,1976,329],{"class":319},[309,1978,1528],{"class":403},[309,1980,515],{"class":319},[309,1982,1984,1986,1988,1990,1992],{"class":311,"line":1983},57,[309,1985,1874],{"class":403},[309,1987,329],{"class":319},[309,1989,814],{"class":407},[309,1991,1881],{"class":345},[309,1993,464],{"class":403},[309,1995,1997,1999,2001,2004],{"class":311,"line":1996},58,[309,1998,1889],{"class":403},[309,2000,329],{"class":319},[309,2002,2003],{"class":332}," 'Password'",[309,2005,515],{"class":319},[309,2007,2009,2011,2013,2015,2017],{"class":311,"line":2008},59,[309,2010,1902],{"class":403},[309,2012,329],{"class":319},[309,2014,1907],{"class":345},[309,2016,440],{"class":403},[309,2018,515],{"class":319},[309,2020,2022,2024],{"class":311,"line":2021},60,[309,2023,744],{"class":403},[309,2025,515],{"class":319},[309,2027,2029,2032,2034],{"class":311,"line":2028},61,[309,2030,2031],{"class":403},"              obscureText",[309,2033,329],{"class":319},[309,2035,2036],{"class":319}," true,\n",[309,2038,2040,2042],{"class":311,"line":2039},62,[309,2041,1942],{"class":403},[309,2043,515],{"class":319},[309,2045,2047,2049,2052,2055,2058,2061,2064],{"class":311,"line":2046},63,[309,2048,549],{"class":421},[309,2050,2051],{"class":403}," (_error ",[309,2053,2054],{"class":319},"!=",[309,2056,2057],{"class":319}," null",[309,2059,2060],{"class":403},") ",[309,2062,2063],{"class":319},"...",[309,2065,2066],{"class":403},"[\n",[309,2068,2070,2073,2075,2077,2079,2081,2083],{"class":311,"line":2069},64,[309,2071,2072],{"class":407},"              const",[309,2074,1835],{"class":345},[309,2076,1838],{"class":403},[309,2078,329],{"class":319},[309,2080,1958],{"class":371},[309,2082,665],{"class":403},[309,2084,515],{"class":319},[309,2086,2088,2091,2094,2097,2100,2102,2104,2106,2109,2111,2114,2116,2119],{"class":311,"line":2087},65,[309,2089,2090],{"class":345},"              Text",[309,2092,2093],{"class":403},"(_error",[309,2095,2096],{"class":319},"!,",[309,2098,2099],{"class":403}," style",[309,2101,329],{"class":319},[309,2103,814],{"class":407},[309,2105,1802],{"class":345},[309,2107,2108],{"class":403},"(color",[309,2110,329],{"class":319},[309,2112,2113],{"class":345}," Colors",[309,2115,434],{"class":319},[309,2117,2118],{"class":403},"red))",[309,2120,515],{"class":319},[309,2122,2124,2127],{"class":311,"line":2123},66,[309,2125,2126],{"class":403},"            ]",[309,2128,515],{"class":319},[309,2130,2132,2134,2136,2138,2140,2143,2145],{"class":311,"line":2131},67,[309,2133,1782],{"class":407},[309,2135,1835],{"class":345},[309,2137,1838],{"class":403},[309,2139,329],{"class":319},[309,2141,2142],{"class":371}," 24",[309,2144,665],{"class":403},[309,2146,515],{"class":319},[309,2148,2150,2153],{"class":311,"line":2149},68,[309,2151,2152],{"class":345},"            FilledButton",[309,2154,464],{"class":403},[309,2156,2158,2161,2163,2165,2167,2169,2172,2175],{"class":311,"line":2157},69,[309,2159,2160],{"class":403},"              onPressed",[309,2162,329],{"class":319},[309,2164,1629],{"class":403},[309,2166,555],{"class":319},[309,2168,2057],{"class":319},[309,2170,2171],{"class":319}," :",[309,2173,2174],{"class":403}," _signIn",[309,2176,515],{"class":319},[309,2178,2180,2183,2185],{"class":311,"line":2179},70,[309,2181,2182],{"class":403},"              child",[309,2184,329],{"class":319},[309,2186,2187],{"class":403}," _loading\n",[309,2189,2191,2194,2196,2198,2200,2203],{"class":311,"line":2190},71,[309,2192,2193],{"class":319},"                  ?",[309,2195,814],{"class":407},[309,2197,1835],{"class":345},[309,2199,434],{"class":319},[309,2201,2202],{"class":414},"square",[309,2204,464],{"class":403},[309,2206,2208,2211,2213,2216],{"class":311,"line":2207},72,[309,2209,2210],{"class":403},"                      dimension",[309,2212,329],{"class":319},[309,2214,2215],{"class":371}," 20",[309,2217,515],{"class":319},[309,2219,2221,2224,2226,2229,2232,2234,2237,2239],{"class":311,"line":2220},73,[309,2222,2223],{"class":403},"                      child",[309,2225,329],{"class":319},[309,2227,2228],{"class":345}," CircularProgressIndicator",[309,2230,2231],{"class":403},"(strokeWidth",[309,2233,329],{"class":319},[309,2235,2236],{"class":371}," 2",[309,2238,665],{"class":403},[309,2240,515],{"class":319},[309,2242,2244],{"class":311,"line":2243},74,[309,2245,2246],{"class":403},"                    )\n",[309,2248,2250,2253,2255,2257,2259,2261,2263],{"class":311,"line":2249},75,[309,2251,2252],{"class":319},"                  :",[309,2254,814],{"class":407},[309,2256,1159],{"class":345},[309,2258,719],{"class":403},[309,2260,1789],{"class":332},[309,2262,665],{"class":403},[309,2264,515],{"class":319},[309,2266,2268,2270],{"class":311,"line":2267},76,[309,2269,1942],{"class":403},[309,2271,515],{"class":319},[309,2273,2275,2278],{"class":311,"line":2274},77,[309,2276,2277],{"class":403},"          ]",[309,2279,515],{"class":319},[309,2281,2283,2285],{"class":311,"line":2282},78,[309,2284,778],{"class":403},[309,2286,515],{"class":319},[309,2288,2290,2292],{"class":311,"line":2289},79,[309,2291,1210],{"class":403},[309,2293,515],{"class":319},[309,2295,2297,2299],{"class":311,"line":2296},80,[309,2298,835],{"class":403},[309,2300,378],{"class":319},[309,2302,2304],{"class":311,"line":2303},81,[309,2305,1223],{"class":403},[309,2307,2309],{"class":311,"line":2308},82,[309,2310,874],{"class":403},[291,2312],{},[294,2314,2316],{"id":2315},"_5-build-the-home-page","5. Build the home page",[299,2318,2321],{"className":361,"code":2319,"filename":2320,"language":364,"meta":305,"style":305},"import 'package:authyra_flutter/authyra_flutter.dart';\nimport 'package:flutter/material.dart';\n\nclass HomePage extends StatelessWidget {\n  final AuthUser user;\n  const HomePage({super.key, required this.user});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Hello, ${user.name ?? user.email ?? 'there'}!'),\n        actions: [\n          IconButton(\n            icon: const Icon(Icons.logout),\n            tooltip: 'Sign out',\n            onPressed: () => Authyra.instance.signOut(),\n          ),\n        ],\n      ),\n      body: Padding(\n        padding: const EdgeInsets.all(24),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text('User ID: ${user.id}'),\n            if (user.email != null) Text('Email: ${user.email}'),\n          ],\n        ),\n      ),\n    );\n  }\n}\n","lib/pages/home_page.dart",[275,2322,2323,2331,2339,2343,2355,2366,2394,2398,2402,2414,2422,2434,2481,2490,2497,2521,2533,2560,2567,2574,2580,2590,2612,2622,2637,2645,2672,2714,2720,2726,2732,2738,2742],{"__ignoreMap":305},[309,2324,2325,2327,2329],{"class":311,"line":312},[309,2326,372],{"class":371},[309,2328,375],{"class":332},[309,2330,378],{"class":319},[309,2332,2333,2335,2337],{"class":311,"line":323},[309,2334,372],{"class":371},[309,2336,385],{"class":332},[309,2338,378],{"class":319},[309,2340,2341],{"class":311,"line":390},[309,2342,394],{"emptyLinePlaceholder":393},[309,2344,2345,2347,2349,2351,2353],{"class":311,"line":397},[309,2346,906],{"class":319},[309,2348,1086],{"class":345},[309,2350,911],{"class":319},[309,2352,914],{"class":345},[309,2354,425],{"class":403},[309,2356,2357,2359,2361,2364],{"class":311,"line":428},[309,2358,1357],{"class":407},[309,2360,618],{"class":345},[309,2362,2363],{"class":403}," user",[309,2365,378],{"class":319},[309,2367,2368,2370,2372,2374,2376,2379,2381,2384,2387,2389,2392],{"class":311,"line":445},[309,2369,921],{"class":407},[309,2371,1086],{"class":345},[309,2373,926],{"class":403},[309,2375,434],{"class":319},[309,2377,2378],{"class":403},"key",[309,2380,629],{"class":319},[309,2382,2383],{"class":407}," required",[309,2385,2386],{"class":403}," this",[309,2388,434],{"class":319},[309,2390,2391],{"class":403},"user})",[309,2393,378],{"class":319},[309,2395,2396],{"class":311,"line":450},[309,2397,394],{"emptyLinePlaceholder":393},[309,2399,2400],{"class":311,"line":467},[309,2401,942],{"class":407},[309,2403,2404,2406,2408,2410,2412],{"class":311,"line":480},[309,2405,947],{"class":345},[309,2407,950],{"class":414},[309,2409,719],{"class":403},[309,2411,955],{"class":345},[309,2413,958],{"class":403},[309,2415,2416,2418,2420],{"class":311,"line":491},[309,2417,963],{"class":421},[309,2419,1139],{"class":345},[309,2421,464],{"class":403},[309,2423,2424,2427,2429,2432],{"class":311,"line":504},[309,2425,2426],{"class":403},"      appBar",[309,2428,329],{"class":319},[309,2430,2431],{"class":345}," AppBar",[309,2433,464],{"class":403},[309,2435,2436,2439,2441,2443,2445,2448,2450,2452,2454,2457,2460,2462,2464,2467,2469,2472,2474,2477,2479],{"class":311,"line":518},[309,2437,2438],{"class":403},"        title",[309,2440,329],{"class":319},[309,2442,1159],{"class":345},[309,2444,719],{"class":403},[309,2446,2447],{"class":332},"'Hello, ",[309,2449,1167],{"class":403},[309,2451,1099],{"class":1170},[309,2453,434],{"class":403},[309,2455,2456],{"class":1170},"name",[309,2458,2459],{"class":403}," ?? ",[309,2461,1099],{"class":1170},[309,2463,434],{"class":403},[309,2465,2466],{"class":1170},"email",[309,2468,2459],{"class":403},[309,2470,2471],{"class":332},"'there'",[309,2473,1179],{"class":403},[309,2475,2476],{"class":332},"!'",[309,2478,665],{"class":403},[309,2480,515],{"class":319},[309,2482,2483,2486,2488],{"class":311,"line":533},[309,2484,2485],{"class":403},"        actions",[309,2487,329],{"class":319},[309,2489,488],{"class":403},[309,2491,2492,2495],{"class":311,"line":540},[309,2493,2494],{"class":345},"          IconButton",[309,2496,464],{"class":403},[309,2498,2499,2502,2504,2506,2509,2511,2514,2516,2519],{"class":311,"line":546},[309,2500,2501],{"class":403},"            icon",[309,2503,329],{"class":319},[309,2505,814],{"class":407},[309,2507,2508],{"class":345}," Icon",[309,2510,719],{"class":403},[309,2512,2513],{"class":345},"Icons",[309,2515,434],{"class":319},[309,2517,2518],{"class":403},"logout)",[309,2520,515],{"class":319},[309,2522,2523,2526,2528,2531],{"class":311,"line":576},[309,2524,2525],{"class":403},"            tooltip",[309,2527,329],{"class":319},[309,2529,2530],{"class":332}," 'Sign out'",[309,2532,515],{"class":319},[309,2534,2535,2538,2540,2543,2545,2547,2549,2551,2553,2556,2558],{"class":311,"line":599},[309,2536,2537],{"class":403},"            onPressed",[309,2539,329],{"class":319},[309,2541,2542],{"class":403}," () ",[309,2544,1083],{"class":319},[309,2546,456],{"class":345},[309,2548,434],{"class":319},[309,2550,999],{"class":403},[309,2552,434],{"class":319},[309,2554,2555],{"class":414},"signOut",[309,2557,440],{"class":403},[309,2559,515],{"class":319},[309,2561,2562,2565],{"class":311,"line":610},[309,2563,2564],{"class":403},"          )",[309,2566,515],{"class":319},[309,2568,2569,2572],{"class":311,"line":670},[309,2570,2571],{"class":403},"        ]",[309,2573,515],{"class":319},[309,2575,2576,2578],{"class":311,"line":683},[309,2577,1210],{"class":403},[309,2579,515],{"class":319},[309,2581,2582,2584,2586,2588],{"class":311,"line":696},[309,2583,1683],{"class":403},[309,2585,329],{"class":319},[309,2587,1688],{"class":345},[309,2589,464],{"class":403},[309,2591,2592,2594,2596,2598,2600,2602,2604,2606,2608,2610],{"class":311,"line":741},[309,2593,1696],{"class":403},[309,2595,329],{"class":319},[309,2597,814],{"class":407},[309,2599,1703],{"class":345},[309,2601,434],{"class":319},[309,2603,1708],{"class":414},[309,2605,719],{"class":403},[309,2607,1713],{"class":371},[309,2609,665],{"class":403},[309,2611,515],{"class":319},[309,2613,2614,2616,2618,2620],{"class":311,"line":749},[309,2615,1723],{"class":403},[309,2617,329],{"class":319},[309,2619,1728],{"class":345},[309,2621,464],{"class":403},[309,2623,2624,2626,2628,2630,2632,2635],{"class":311,"line":755},[309,2625,1754],{"class":403},[309,2627,329],{"class":319},[309,2629,1759],{"class":345},[309,2631,434],{"class":319},[309,2633,2634],{"class":403},"start",[309,2636,515],{"class":319},[309,2638,2639,2641,2643],{"class":311,"line":767},[309,2640,1772],{"class":403},[309,2642,329],{"class":319},[309,2644,488],{"class":403},[309,2646,2647,2650,2652,2655,2657,2659,2661,2664,2666,2668,2670],{"class":311,"line":775},[309,2648,2649],{"class":345},"            Text",[309,2651,719],{"class":403},[309,2653,2654],{"class":332},"'User ID: ",[309,2656,1167],{"class":403},[309,2658,1099],{"class":1170},[309,2660,434],{"class":403},[309,2662,2663],{"class":1170},"id",[309,2665,1179],{"class":403},[309,2667,1182],{"class":332},[309,2669,665],{"class":403},[309,2671,515],{"class":319},[309,2673,2674,2676,2679,2681,2684,2686,2688,2690,2693,2695,2698,2700,2702,2704,2706,2708,2710,2712],{"class":311,"line":783},[309,2675,549],{"class":421},[309,2677,2678],{"class":403}," (user",[309,2680,434],{"class":319},[309,2682,2683],{"class":403},"email ",[309,2685,2054],{"class":319},[309,2687,2057],{"class":319},[309,2689,2060],{"class":403},[309,2691,2692],{"class":345},"Text",[309,2694,719],{"class":403},[309,2696,2697],{"class":332},"'Email: ",[309,2699,1167],{"class":403},[309,2701,1099],{"class":1170},[309,2703,434],{"class":403},[309,2705,2466],{"class":1170},[309,2707,1179],{"class":403},[309,2709,1182],{"class":332},[309,2711,665],{"class":403},[309,2713,515],{"class":319},[309,2715,2716,2718],{"class":311,"line":791},[309,2717,2277],{"class":403},[309,2719,515],{"class":319},[309,2721,2722,2724],{"class":311,"line":806},[309,2723,778],{"class":403},[309,2725,515],{"class":319},[309,2727,2728,2730],{"class":311,"line":832},[309,2729,1210],{"class":403},[309,2731,515],{"class":319},[309,2733,2734,2736],{"class":311,"line":840},[309,2735,835],{"class":403},[309,2737,378],{"class":319},[309,2739,2740],{"class":311,"line":848},[309,2741,1223],{"class":403},[309,2743,2744],{"class":311,"line":853},[309,2745,874],{"class":403},[271,2747,2748,2751,2752,2755,2756,2758,2759,2761],{},[275,2749,2750],{},"Authyra.instance.signOut()"," clears the session and emits ",[275,2753,2754],{},"AuthState.unauthenticated()",". The ",[275,2757,281],{}," re-renders ",[275,2760,1310],{}," automatically.",[291,2763],{},[294,2765,2767],{"id":2766},"try-it","Try it",[271,2769,2770],{},"Run the app and sign in with:",[2772,2773,2774,2785],"ul",{},[2775,2776,2777,2781,2782],"li",{},[2778,2779,2780],"strong",{},"Email",": ",[275,2783,2784],{},"demo@example.com",[2775,2786,2787,2781,2790],{},[2778,2788,2789],{},"Password",[275,2791,2792],{},"password",[271,2794,2795,2796,2799,2800,434],{},"Close the app and reopen it — the session is restored from ",[275,2797,2798],{},"SecureAuthStorage"," and you land directly on ",[275,2801,2802],{},"HomePage",[291,2804],{},[294,2806,2808],{"id":2807},"connect-to-a-real-backend","Connect to a real backend",[271,2810,2811,2812,2814],{},"Replace the mock ",[275,2813,288],{}," callback with your actual API:",[299,2816,2818],{"className":361,"code":2817,"language":364,"meta":305,"style":305},"authorize: (creds) async {\n  final res = await myApi.post('/auth/login', body: {\n    'email':    creds!['email'],\n    'password': creds['password'],\n  });\n\n  if (res.statusCode == 401) return null;          // wrong credentials\n  if (res.statusCode != 200) throw AuthenticationFailedException(\n    'Login failed: HTTP ${res.statusCode}',\n    providerName: 'email',\n  );\n\n  return AuthSignInResult(\n    user: AuthUser(\n      id:    res.data['id'],\n      email: res.data['email'],\n      name:  res.data['name'],\n    ),\n    accessToken:  res.data['accessToken'],\n    refreshToken: res.data['refreshToken'],\n    expiresAt:    DateTime.parse(res.data['expiresAt']),\n  );\n},\n",[275,2819,2820,2832,2866,2887,2903,2910,2914,2942,2966,2987,2998,3004,3008,3017,3028,3050,3070,3091,3097,3117,3137,3166,3172],{"__ignoreMap":305},[309,2821,2822,2824,2826,2828,2830],{"class":311,"line":312},[309,2823,288],{"class":403},[309,2825,329],{"class":319},[309,2827,526],{"class":403},[309,2829,422],{"class":421},[309,2831,425],{"class":403},[309,2833,2834,2836,2839,2841,2844,2847,2849,2852,2854,2857,2859,2862,2864],{"class":311,"line":323},[309,2835,1357],{"class":407},[309,2837,2838],{"class":403}," res ",[309,2840,1031],{"class":319},[309,2842,2843],{"class":421}," await",[309,2845,2846],{"class":403}," myApi",[309,2848,434],{"class":319},[309,2850,2851],{"class":414},"post",[309,2853,719],{"class":403},[309,2855,2856],{"class":332},"'/auth/login'",[309,2858,629],{"class":319},[309,2860,2861],{"class":403}," body",[309,2863,329],{"class":319},[309,2865,425],{"class":403},[309,2867,2868,2871,2873,2876,2878,2880,2882,2885],{"class":311,"line":390},[309,2869,2870],{"class":332},"    'email'",[309,2872,329],{"class":319},[309,2874,2875],{"class":403},"    creds",[309,2877,640],{"class":319},[309,2879,558],{"class":403},[309,2881,561],{"class":332},[309,2883,2884],{"class":403},"]",[309,2886,515],{"class":319},[309,2888,2889,2892,2894,2897,2899,2901],{"class":311,"line":397},[309,2890,2891],{"class":332},"    'password'",[309,2893,329],{"class":319},[309,2895,2896],{"class":403}," creds[",[309,2898,586],{"class":332},[309,2900,2884],{"class":403},[309,2902,515],{"class":319},[309,2904,2905,2908],{"class":311,"line":428},[309,2906,2907],{"class":403},"  })",[309,2909,378],{"class":319},[309,2911,2912],{"class":311,"line":445},[309,2913,394],{"emptyLinePlaceholder":393},[309,2915,2916,2919,2922,2924,2927,2929,2932,2934,2937,2939],{"class":311,"line":450},[309,2917,2918],{"class":421},"  if",[309,2920,2921],{"class":403}," (res",[309,2923,434],{"class":319},[309,2925,2926],{"class":403},"statusCode ",[309,2928,567],{"class":319},[309,2930,2931],{"class":371}," 401",[309,2933,2060],{"class":403},[309,2935,2936],{"class":421},"return",[309,2938,761],{"class":319},[309,2940,2941],{"class":536},"          // wrong credentials\n",[309,2943,2944,2946,2948,2950,2952,2954,2957,2959,2962,2964],{"class":311,"line":467},[309,2945,2918],{"class":421},[309,2947,2921],{"class":403},[309,2949,434],{"class":319},[309,2951,2926],{"class":403},[309,2953,2054],{"class":319},[309,2955,2956],{"class":371}," 200",[309,2958,2060],{"class":403},[309,2960,2961],{"class":421},"throw",[309,2963,1557],{"class":345},[309,2965,464],{"class":403},[309,2967,2968,2971,2973,2976,2978,2981,2983,2985],{"class":311,"line":480},[309,2969,2970],{"class":332},"    'Login failed: HTTP ",[309,2972,1167],{"class":403},[309,2974,2975],{"class":1170},"res",[309,2977,434],{"class":403},[309,2979,2980],{"class":1170},"statusCode",[309,2982,1179],{"class":403},[309,2984,1182],{"class":332},[309,2986,515],{"class":319},[309,2988,2989,2992,2994,2996],{"class":311,"line":491},[309,2990,2991],{"class":403},"    providerName",[309,2993,329],{"class":319},[309,2995,512],{"class":332},[309,2997,515],{"class":319},[309,2999,3000,3002],{"class":311,"line":504},[309,3001,843],{"class":403},[309,3003,378],{"class":319},[309,3005,3006],{"class":311,"line":518},[309,3007,394],{"emptyLinePlaceholder":393},[309,3009,3010,3013,3015],{"class":311,"line":533},[309,3011,3012],{"class":421},"  return",[309,3014,605],{"class":345},[309,3016,464],{"class":403},[309,3018,3019,3022,3024,3026],{"class":311,"line":540},[309,3020,3021],{"class":403},"    user",[309,3023,329],{"class":319},[309,3025,618],{"class":345},[309,3027,464],{"class":403},[309,3029,3030,3033,3035,3038,3040,3043,3046,3048],{"class":311,"line":546},[309,3031,3032],{"class":403},"      id",[309,3034,329],{"class":319},[309,3036,3037],{"class":403},"    res",[309,3039,434],{"class":319},[309,3041,3042],{"class":403},"data[",[309,3044,3045],{"class":332},"'id'",[309,3047,2884],{"class":403},[309,3049,515],{"class":319},[309,3051,3052,3055,3057,3060,3062,3064,3066,3068],{"class":311,"line":576},[309,3053,3054],{"class":403},"      email",[309,3056,329],{"class":319},[309,3058,3059],{"class":403}," res",[309,3061,434],{"class":319},[309,3063,3042],{"class":403},[309,3065,561],{"class":332},[309,3067,2884],{"class":403},[309,3069,515],{"class":319},[309,3071,3072,3075,3077,3080,3082,3084,3087,3089],{"class":311,"line":599},[309,3073,3074],{"class":403},"      name",[309,3076,329],{"class":319},[309,3078,3079],{"class":403},"  res",[309,3081,434],{"class":319},[309,3083,3042],{"class":403},[309,3085,3086],{"class":332},"'name'",[309,3088,2884],{"class":403},[309,3090,515],{"class":319},[309,3092,3093,3095],{"class":311,"line":610},[309,3094,835],{"class":403},[309,3096,515],{"class":319},[309,3098,3099,3102,3104,3106,3108,3110,3113,3115],{"class":311,"line":670},[309,3100,3101],{"class":403},"    accessToken",[309,3103,329],{"class":319},[309,3105,3079],{"class":403},[309,3107,434],{"class":319},[309,3109,3042],{"class":403},[309,3111,3112],{"class":332},"'accessToken'",[309,3114,2884],{"class":403},[309,3116,515],{"class":319},[309,3118,3119,3122,3124,3126,3128,3130,3133,3135],{"class":311,"line":683},[309,3120,3121],{"class":403},"    refreshToken",[309,3123,329],{"class":319},[309,3125,3059],{"class":403},[309,3127,434],{"class":319},[309,3129,3042],{"class":403},[309,3131,3132],{"class":332},"'refreshToken'",[309,3134,2884],{"class":403},[309,3136,515],{"class":319},[309,3138,3139,3142,3144,3146,3148,3151,3154,3156,3158,3161,3164],{"class":311,"line":696},[309,3140,3141],{"class":403},"    expiresAt",[309,3143,329],{"class":319},[309,3145,704],{"class":345},[309,3147,434],{"class":319},[309,3149,3150],{"class":414},"parse",[309,3152,3153],{"class":403},"(res",[309,3155,434],{"class":319},[309,3157,3042],{"class":403},[309,3159,3160],{"class":332},"'expiresAt'",[309,3162,3163],{"class":403},"])",[309,3165,515],{"class":319},[309,3167,3168,3170],{"class":311,"line":741},[309,3169,843],{"class":403},[309,3171,378],{"class":319},[309,3173,3174,3176],{"class":311,"line":749},[309,3175,1179],{"class":403},[309,3177,515],{"class":319},[271,3179,3180,3181,3184,3185,3187,3188,3191],{},"Returning ",[275,3182,3183],{},"null"," causes ",[275,3186,1481],{}," to throw ",[275,3189,3190],{},"AuthenticationFailedException",". Throw it explicitly for non-credential errors (network, server 5xx).",[291,3193],{},[294,3195,3197],{"id":3196},"next-steps","Next steps",[2772,3199,3200,3207,3213,3219],{},[2775,3201,3202,3206],{},[3203,3204,3205],"a",{"href":124},"Email Auth guide →"," — full walkthrough with tests and token access",[2775,3208,3209,3212],{},[3203,3210,3211],{"href":103},"Google Sign-In →"," — add OAuth2 alongside email/password",[2775,3214,3215,3218],{},[3203,3216,3217],{"href":27},"Configuration →"," — tune token lifetime and auto-refresh",[2775,3220,3221],{},[3203,3222,3223],{"href":242},"Full Flutter App Example →",[3225,3226,3227],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":305,"searchDepth":323,"depth":323,"links":3229},[3230,3231,3232,3233,3234,3235,3236,3237],{"id":296,"depth":323,"text":297},{"id":357,"depth":323,"text":358},{"id":885,"depth":323,"text":886},{"id":1238,"depth":323,"text":1239},{"id":2315,"depth":323,"text":2316},{"id":2766,"depth":323,"text":2767},{"id":2807,"depth":323,"text":2808},{"id":3196,"depth":323,"text":3197},"Your first end-to-end sign-in — email/password in under 50 lines.","md",null,{},{"icon":34},{"title":3244,"description":3245},"First Auth | Authyra","Build your first working sign-in with Authyra — email/password credentials provider, session storage, and reactive UI in one page.","9yBFkl91DFLZ5ntKoIWMAi3ATmq2RsAOlD7OkUaJZfo",[3248,3250],{"title":26,"path":27,"stem":28,"description":3249,"icon":29,"children":-1},"AuthConfig options — token lifetime, auto-refresh, and refresh threshold.",{"title":41,"path":42,"stem":43,"description":3251,"icon":44,"children":-1},"Mapping Firebase Auth → Authyra — équivalences d'API, stratégie de migration et différences clés.",1782700506039]