afonsocraposo / buttons_tabbar Goto Github PK
View Code? Open in Web Editor NEWA Flutter package that implements a TabBar where each label is a toggle button.
Home Page: http://afonsoraposo.com/buttons_tabbar/
License: MIT License
A Flutter package that implements a TabBar where each label is a toggle button.
Home Page: http://afonsoraposo.com/buttons_tabbar/
License: MIT License
Running into this issue, see video.
Container(
height: 50,
child: ButtonsTabBar(
radius: 30,
physics: NeverScrollableScrollPhysics(),
contentPadding: EdgeInsets.only(left: 12, right: 12, top: 5, bottom: 5),
controller: this.controller,
labelSpacing: 5,
backgroundColor: Styles.MAIN_COLOR_ACCENT,
unselectedBackgroundColor: Styles.MAIN_COLOR_LIGHT,
unselectedLabelStyle: TextStyle(color: Colors.black),
labelStyle: TextStyle(color: Colors.white, fontSize: 14),
tabs: [
Tab(
text: "YouTube",
),
Tab(
text: "Reddit",
),
Tab(
text: "Twitter",
),
],
),
),
I am using this widget inside a vertical listview as one of the children.
labelStyle text color not work in material3
class _ExampleState extends State {
@OverRide
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: DefaultTabController(
length: 3,
child: Column(
children: [
ButtonsTabBar(
labelStyle: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
tabs: const [
Tab(
icon: Icon(Icons.directions_car),
text: "car",
),
Tab(
icon: Icon(Icons.directions_transit),
text: "transit",
),
Tab(icon: Icon(Icons.directions_bike)),
],
),
const Expanded(
child: TabBarView(
children: [
Center(
child: Icon(Icons.directions_car),
),
Center(
child: Icon(Icons.directions_transit),
),
Center(
child: Icon(Icons.directions_bike),
),
],
),
),
],
),
),
),
);
}
}
So i made a button to move to another tab, but i don't know how to move it. Does this package have some trigger or something? Because i can't use Navigator.push or similiar
Need to upgrade to support null safety and flutter2
Hi, @afonsocraposo thanks for your great package.
I want to confirm before switching. This is my listening event code.
void _onTabChanged() async {
if (_mController.indexIsChanging) {
if (_currentIndex < _mController.index) {
bool? jump = await _openAlertDialog();
if (jump == null) {
setState(() {
_mController.index = _currentIndex;
});
} else {
setState(() {
_currentIndex = _mController.index;
});
}
} else {
setState(() {
_currentIndex = _mController.index;
});
}
}
print("index:${_mController.index}");
}
When I give up switching:_mController.index = _currentIndex, TabBarView responds to the change in tabController.index, but ButtonsTabBar does not respond. When I use the TabBar,it's correct.
Look forward to your reply!
When I generate tab like this,
List<Tab> _pickys = <Tab>[];
for(int i = 0; i < _nitemPicky.length; i++) {
_pickys.add(
Tab(
icon: Image.network('$img_url${_nitemPicky[i].imgLinkTb}', width: Du.mw(30), height: Du.mw(30),),
text: "${_nitemPicky[i].name}",
),
);
}
or like this,
List<Tab> _pickys2 = List<Tab>.generate(_nitemPicky.length, (int index3) {
print(_nitemPicky[index3]);
return new Tab(
icon: Image.network('$img_url${_nitemPicky[index3].imgLinkTb}', width: Du.mw(30), height: Du.mw(30),),
text: "${_nitemPicky[index3].name}",
);
});
Generate tab is good.
But when I touch list[1] to list[2]
tapping gonna failed and returned this issue.
I/flutter ( 2283): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter ( 2283): The following NoSuchMethodError was thrown while handling a gesture:
I/flutter ( 2283): The method 'findRenderObject' was called on null.
I/flutter ( 2283): Receiver: null
I/flutter ( 2283): Tried calling: findRenderObject()
I/flutter ( 2283):
I/flutter ( 2283): When the exception was thrown, this was the stack:
I/flutter ( 2283): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
I/flutter ( 2283): #1 _ButtonsTabBarState._scrollTo (package:buttons_tabbar/buttons_tabbar.dart:378:48)
I/flutter ( 2283): #2 _ButtonsTabBarState._setCurrentIndex. (package:buttons_tabbar/buttons_tabbar.dart:336:7)
I/flutter ( 2283): #3 State.setState (package:flutter/src/widgets/framework.dart:1240:30)
I/flutter ( 2283): #4 _ButtonsTabBarState._setCurrentIndex (package:buttons_tabbar/buttons_tabbar.dart:332:5)
I/flutter ( 2283): #5 _ButtonsTabBarState._goToIndex (package:buttons_tabbar/buttons_tabbar.dart:326:7)
I/flutter ( 2283): #6 _ButtonsTabBarState._buildButton. (package:buttons_tabbar/buttons_tabbar.dart:255:11)
I/flutter ( 2283): #7 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
I/flutter ( 2283): #8 _InkResponseState.build. (package:flutter/src/material/ink_well.dart:1098:38)
I/flutter ( 2283): #9 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
I/flutter ( 2283): #10 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
I/flutter ( 2283): #11 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
I/flutter ( 2283): #12 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:256:7)
I/flutter ( 2283): #13 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:158:27)
I/flutter ( 2283): #14 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:224:20)
I/flutter ( 2283): #15 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
I/flutter ( 2283): #16 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
I/flutter ( 2283): #17 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
I/flutter ( 2283): #18 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
I/flutter ( 2283): #22 _invoke1 (dart:ui/hooks.dart:267:10)
I/flutter ( 2283): #23 _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
I/flutter ( 2283): (elided 3 frames from dart:async)
I/flutter ( 2283):
I/flutter ( 2283): Handler: "onTap"
I/flutter ( 2283): Recognizer:
I/flutter ( 2283): TapGestureRecognizer#fbbeb
I/flutter ( 2283): ════════════════════════════════════════════════════════════════════════════════════════════════════
Also, when I generate list statically,
like this.
List<Tab> tabs = <Tab>[
Tab(
icon: Image.asset('assets/circle_you.png', width: Du.mw(30), height: Du.mw(30),),
text: "김꽃날",
),
Tab(
icon: Image.asset('assets/circle_you.png', width: Du.mw(30), height: Du.mw(30),),
text: "하티",
),
Tab(
icon: Image.asset('assets/circle_you.png', width: Du.mw(30), height: Du.mw(30),),
text: "오구리",
),
Tab(
icon: Image.asset('assets/circle_you.png', width: Du.mw(30), height: Du.mw(30),),
text: "민주티디",
),
Tab(
icon: Image.asset('assets/circle_you.png', width: Du.mw(30), height: Du.mw(30),),
text: "옥개",
),
Tab(
icon: Image.asset('assets/circle_you.png', width: Du.mw(30), height: Du.mw(30),),
text: "지토",
),
];
No error returned and working properly.
So, I want generate list dynamically.
How can I implement?
Hi, @afonsocraposo thanks for your great package, can you please add a feature to display label text only if the tab is selected, I tried with the current index page like: text: _indexPagCurrent == 0 ? 'My Title' : '',
, but this way it doesn't work :( .
Thanks in advance!
same code + test in 2 devices same time: https://youtu.be/rC64n_P87R8
Assign a TabController to ButtonsTabBar, but the TabController animateTo(1) and the TabController(initialIndex:1) is not working.
TabController _tabController;
@override
void initState() {
_tabController = TabController(length: 2, vsync: this, initialIndex: 1);
super.initState();
}
...
ButtonsTabBar(
controller: _tabController,
...
)
ButtonsTabBar( buttonMargin: EdgeInsets.only(left: 25), backgroundColor: Colors.brown[800], unselectedBackgroundColor: Colors.white, unselectedLabelStyle: TextStyle(color: Colors.black), labelStyle: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), radius: 70, labelSpacing: 15, tabs: [ Tab.... )
This is my code which should show White Text on selected Tab and black Text on others. But it just shows black text everywhere. Please, Solve it or provide the solution.
When using a decoration to change border radius, the hover decoration doesn't get updated to match.
The hover decoration should match the border radius of the applied decoration.
The hover decoration defaults to the default value of 4.
It would be nice to just have the decoration exposed for hover so that additional changes could be made.
import 'package:buttons_tabbar/buttons_tabbar.dart';
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Example(),
);
}
}
class Example extends StatefulWidget {
const Example({Key? key}) : super(key: key);
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: DefaultTabController(
length: 3,
child: Column(
children: <Widget>[
ButtonsTabBar(
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(4),
topRight: Radius.circular(4),
bottomLeft: Radius.circular(4),
bottomRight: Radius.zero,
),
color: Colors.amber,
),
unselectedDecoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(4),
topRight: Radius.circular(4),
bottomLeft: Radius.circular(4),
bottomRight: Radius.zero,
),
color: Colors.white,
),
tabs: const [
Tab(
icon: Icon(Icons.directions_car),
text: "car",
),
Tab(
icon: Icon(Icons.directions_transit),
text: "transit",
),
Tab(icon: Icon(Icons.directions_bike)),
],
),
const Expanded(
child: TabBarView(
children: <Widget>[
Center(
child: Icon(Icons.directions_car),
),
Center(
child: Icon(Icons.directions_transit),
),
Center(
child: Icon(Icons.directions_bike),
),
],
),
),
],
),
),
),
);
}
}
Thank you for reporting this bug! We appreciate your contribution to improving our Flutter package.
By adding a BoxDecoration property with a BoxShadow property, the shadow stays inside the button block and does not go outside of it. Is it possible to add a property like the elevation property to material objects?
ButtonsTabBar( decoration: BoxDecoration( color: EtalogColors.primary, borderRadius: BorderRadius.circular(50), boxShadow:[ BoxShadow( color: Colors.grey.withOpacity(0.5), spreadRadius: 1, blurRadius: 10, offset: Offset(0, 15), ), //you can set more BoxShadow() here ], ), radius: 0, tabs: [ Tab(text: 'Все'), Tab(text: 'В пути'), Tab(text: 'Под разгрузкой'), ], ),
i cant get the TabBar on the bottom of the screen.
any one solutions?
如何获取currentIndex
Please add support to having no icon in tab. Now it is possible to use Colors.transparent for icon's color but there is a gap...
[Provide a clear and concise description of the bug you encountered.]
[Describe what you expected to happen.]
[Describe what actually happened.]
[Provide any additional information that may be helpful in understanding and reproducing the issue.]
[Provide a minimal, complete, and verifiable example that reproduces the issue. Use code blocks to preserve the formatting.]
import 'package:buttons_tabbar/buttons_tabbar.dart';
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Example(),
);
}
}
class Example extends StatefulWidget {
const Example({Key? key}) : super(key: key);
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: DefaultTabController(
length: 3,
child: Column(
children: <Widget>[
ButtonsTabBar(
tabs: const [
Tab(
icon: Icon(Icons.directions_car),
text: "car",
),
Tab(
icon: Icon(Icons.directions_transit),
text: "transit",
),
Tab(icon: Icon(Icons.directions_bike)),
],
),
const Expanded(
child: TabBarView(
children: <Widget>[
Center(
child: Icon(Icons.directions_car),
),
Center(
child: Icon(Icons.directions_transit),
),
Center(
child: Icon(Icons.directions_bike),
),
],
),
),
],
),
),
),
);
}
}
Please make sure to include a working example code that can reproduce the bug. You can use the provided code snippet as a starting point.
Thank you for reporting this bug! We appreciate your contribution to improving our Flutter package.
I am a Flutter novice, so forgive me if I am doing somethign wrong. I am getting the following error when switching between tabs (all of which build a relatively complex grouped list view). The views show up no problem, but the log will have this error:
The following NoSuchMethodError was thrown while dispatching notifications for TabController:
The method 'findRenderObject' was called on null.
Receiver: null
Tried calling: findRenderObject()
When the exception was thrown, this was the stack:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1 _ButtonsTabBarState._scrollTo (package:buttons_tabbar/buttons_tabbar.dart:446:48)
#2 _ButtonsTabBarState._setCurrentIndex (package:buttons_tabbar/buttons_tabbar.dart:405:5)
#3 _ButtonsTabBarState._goToIndex (package:buttons_tabbar/buttons_tabbar.dart:394:7)
#4 _ButtonsTabBarState._handleController (package:buttons_tabbar/buttons_tabbar.dart:264:7)
...
The TabController sending notification was: Instance of 'TabController'
Code that builds the tabs:
return DefaultTabController(
length: 9,
child: Column(
children: <Widget>[
ButtonsTabBar(
contentPadding: EdgeInsets.all(1),
backgroundColor: Theme.of(context).primaryColor,
unselectedBackgroundColor: Colors.white,
labelStyle: TextStyle(color: Colors.white),
unselectedLabelStyle:
TextStyle(color: Theme.of(context).primaryColor),
radius: 50,
tabs: [
Tab(
icon: Icon(
FontAwesomeIcons.xxxx,
),
text: "xxxx",
),
Tab(
icon: Icon(
FontAwesomeIcons.xxxx,
),
text: "xxxx",
),
Tab(
icon: Icon(FontAwesomeIcons.xxxx),
text: "xxxx",
),
Tab(
icon: Icon(FontAwesomeIcons.xxxx),
text: "xxxx",
),
Tab(
icon: Icon(FontAwesomeIcons.xxxx),
text: "xxxx",
),
Tab(
icon: Icon(FontAwesomeIcons.xxxx),
text: "xxxxx",
),
Tab(
icon: Icon(FontAwesomeIcons.xxxx),
text: "xxxx",
),
Tab(
icon: Icon(FontAwesomeIcons.smile),
text: "Viselkedés",
),
Tab(
icon: Icon(FontAwesomeIcons.questionCircle),
text: "Egyéb",
),
],
),
Expanded(
child: TabBarView(
children: <Widget>[
buildListWithFilter(database, null),
buildListWithFilter(database, 'xxxx'),
buildListWithFilter(database, 'xxxxx'),
buildListWithFilter(database, 'xxxxx'),
buildListWithFilter(database, 'xxxx'),
buildListWithFilter(database, 'xxxx'),
buildListWithFilter(database, 'xxxx'),
buildListWithFilter(database, 'xxxx'),
buildListWithFilter(database, 'other'),
],
),
),
],
),
);
}
StreamBuilder<List<Entry>> buildListWithFilter(
Database database, String entryType) {
return StreamBuilder<List<Entry>>(
stream: database.entriesStream(entryType: entryType),
builder: (context, snapshot) {
return snapshot.hasData
? StickyGroupedListView<dynamic, String>(
elements: snapshot.data,
groupBy: (dynamic element) =>
DateFormat.yMd().format(element.date.toDate()).toString(),
separator: _buildSeparator(),
groupSeparatorBuilder: (dynamic element) =>
_buildGroupSeparator(context, element),
itemBuilder: (context, entry) => MainListTile(
entry: entry,
),
order: StickyGroupedListOrder.DESC, // optional
)
: Container();
});
}
Any suggestions?
Hey there!
Great library you have here!
I would like more customization over the tab design. I was able to do everything I want with the parameters you provided, except for the tab badge.
Basically I want to show a badge on the top right corner.
There are two possible solutions for this:
Widget
objects for tabs
parameter. Currently only Tab
is allowed and not Widget
: buttons_tabbar/lib/buttons_tabbar.dart
Line 408 in 2cebd78
Stack
and exposed externally to us with a an overlay
parameter of type Widget
.Hello, I see no onTap function on this lib, use .addListener doesn't work as expected and takes a lot of work for styling. I try to get a callback from the tab button tapped. thanks.
Is it possible to expose parameters that would make it possible to specify the height of the tabbar? Thanks a lot! :)
can you add to ButtonTabBar onTap functionality ? for example onTap is have in TabBar
See below video for reference
current situation :
what we need :
my Code : https://pastebin.ubuntu.com/p/PFSSmVx9dW/
appBar: AppBar( brightness: Brightness.dark, title: Text('PRAY'), centerTitle: true, backgroundColor: Color(0xff16112a), bottom: ButtonsTabBar( height: 70, decoration: BoxDecoration( gradient: LinearGradient( colors: <Color>[ Color(0xFF0D47A1), Color(0xFF1976D2), Color(0xFF42A5F5), ], ), ), radius: 100, contentPadding: EdgeInsets.symmetric(horizontal: 30), buttonMargin: EdgeInsets.only(top: 10, bottom: 17, left: 20, right: 10), unselectedBackgroundColor: Color(0xff1c1b20), unselectedLabelStyle: TextStyle(color: Colors.white), labelStyle: TextStyle(color: Colors.white, fontSize: 20, fontWeight: FontWeight.w600), controller: _tabController, tabs: newsTabs, ), ),
Sorry for reopening, but I am no sure how to specify that the issue might still be valid.
#9
I have provided some additional details in the last commment...
Thanks a lot!
Howto change the initialindex of tab
can you add a scrollable option? like: https://stackoverflow.com/questions/54230115/horizontally-scrollable-tabs-focus-on-center-with-snap-in-flutter
isScrollable: true, or isScrollable: false.
Border radius does not work when using the decoration property
Need to set "onSwipe" callback in TabBarView paramaters like setting "onTap" to buttonsBar, so I can call an async function to update the view dynamically
../../../Documents/flutter/.pub-cache/hosted/pub.dartlang.org/buttons_tabbar-1.3.4/lib/buttons_tabbar.dart:180:20: Warning: Operand of null-aware operation '?.' has type 'WidgetsBinding' which excludes null.
Hi great plugin, very useful. Will be nice add a property to define same width to all tabs.
[Provide a clear and concise description of the bug you encountered.]
I got this error in Firebase Crashlytics
I do not really not what step to reproduce this issue. This happens on Production release and I see it on Firebase Crashlytics
No errors.
Got error: FlutterError - Null check operator used on a null value: _ButtonsTabBarState.initState.
[Provide any additional information that may be helpful in understanding and reproducing the issue.]
buttons_tabbar: 1.3.7+1
[!] Flutter (Channel stable, 3.10.6, on macOS 13.2 22D49 darwin-arm64, locale en)
• Flutter version 3.10.6 on channel stable at /Users/efzet/fvm/versions/3.10.6
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision f468f3366c (7 weeks ago), 2023-07-12 15:19:05 -0700
• Engine revision cdbeda788a
• Dart version 3.0.6
• DevTools version 2.23.1
• If those were intentional, you can disregard the above warnings; however it is recommended to use "git" directly to perform update checks and upgrades.
[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
• Android SDK at /Users/efzet/Library/Android/sdk
• Platform android-33, build-tools 31.0.0
• ANDROID_HOME = /Users/efzet/Library/Android/sdk
• Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Build 14C18
• CocoaPods version 1.12.1
[✓] Chrome - develop for the web
• CHROME_EXECUTABLE = /Applications/Brave Browser.app/Contents/MacOS/Brave Browser
[✓] Android Studio (version 2021.3)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/6351-dart
• Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
[✓] IntelliJ IDEA Ultimate Edition (version 2021.2.4)
• IntelliJ at /Applications/IntelliJ IDEA.app
• Flutter plugin version 71.2.2
• Dart plugin version 212.5744
[✓] VS Code (version 1.81.1)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.70.0
[✓] Connected device (2 available)
• macOS (desktop) • macos • darwin-arm64 • macOS 13.2 22D49 darwin-arm64
• Chrome (web) • chrome • web-javascript • Brave Browser 116.1.57.53
[✓] Network resources
• All expected network resources are available.
! Doctor found issues in 1 category.
Hi, It will be great if we can get border implemented in this package.
Use case example:
Maybe we could add something like this in the API:
ButtonsTabBar(
borderWidth: 1.0,
borderColor: Colors.blueAccent,
unselectedBorderWidth: 1.0,
unselectedborderColor: Colors.red,
)
Thanks for your consideration !
Hi, thanks for the package!
What is the correct way to provide a listener to buttons_tabbar that can change some other state? If I need to create a new controller, can you provide an example?
Property to set the color of splash when a button is pressed.
Hi,
Thanks for this clean and useful package.
I want to use this package in a web dashboard where the user can add and delete tabs dynamically, like the ones in Google Chrome.
Would it be possible to do the following with TabBarView and ButtonsTabBar?
Thanks :)
Hello everyone,
I have an issue that I hope can be resolved. I have divided my tabbar button into two vertical sections. You can refer to the attached image for reference. When I click on the top text "Active," it triggers a response upon tapping. However, if I click on the bottom text, which is the number "2" as shown in the image, there is no response. How can I make the response cover all the entire content of the tabbar button?
Thank you.
I'm getting this error A TabController was used after being disposed, when i leave from page.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.