diff --git a/.cspell.json b/.cspell.json
index 83aacba3aec4..ae62d0cdf843 100644
--- a/.cspell.json
+++ b/.cspell.json
@@ -32,7 +32,8 @@
"tcrm",
"scrollbars",
"callout",
- "retrowave"
+ "retrowave",
+ "replicants"
],
"ignoreRegExpList": ["\\(https?://.*?\\)", "\\/{1}.+\\/{1}", "\\%2F.+", "\\%2C.+", "\\ɵ.+", "\\ыва.+"],
"overrides": [
diff --git a/projects/core/components/loader/loader.style.less b/projects/core/components/loader/loader.style.less
index da0d83f8bd08..30aa06605923 100644
--- a/projects/core/components/loader/loader.style.less
+++ b/projects/core/components/loader/loader.style.less
@@ -44,6 +44,7 @@
:host {
position: relative;
display: flex;
+ min-width: 1.5rem;
&._loading {
overflow: hidden;
diff --git a/projects/core/styles/theme/variables.less b/projects/core/styles/theme/variables.less
index ee726726ab47..40206b6a5414 100644
--- a/projects/core/styles/theme/variables.less
+++ b/projects/core/styles/theme/variables.less
@@ -21,6 +21,7 @@
--tui-font-text-s: normal 0.8125rem/1.25rem var(--tui-font-text);
--tui-font-text-s-2: normal 0.8125rem/1rem var(--tui-font-text);
--tui-font-text-xs: normal 0.6875rem/1rem var(--tui-font-text);
+ --tui-font-text-xs-2: normal 0.6875rem/0.8125rem var(--tui-font-text);
// Sizes
--tui-radius-xs: 0.25rem;
--tui-radius-s: 0.5rem;
diff --git a/projects/demo-playwright/utils/mock-images.ts b/projects/demo-playwright/utils/mock-images.ts
index 481a0fdd8c72..c04e171d1850 100644
--- a/projects/demo-playwright/utils/mock-images.ts
+++ b/projects/demo-playwright/utils/mock-images.ts
@@ -5,6 +5,7 @@ const DEFAULT_MOCKS = [
patterns: [
/.*avatar.jpg/,
/.*avatars.githubusercontent.com.*/,
+ /https:\/\/github.com\/.*.png.*/,
/.*bf2e94ae58ee713717faf397958a8e3d.jpg/, // filename - MD5 hash value of file content (waterplea avatar)
],
mockImage: `${__dirname}/../stubs/github-avatar.jpeg`,
diff --git a/projects/demo/src/modules/app/app.routes.ts b/projects/demo/src/modules/app/app.routes.ts
index 4eca2812033c..40a7cfc87b64 100644
--- a/projects/demo/src/modules/app/app.routes.ts
+++ b/projects/demo/src/modules/app/app.routes.ts
@@ -207,14 +207,6 @@ export const ROUTES: Routes = [
title: `BlockStatus`,
},
},
- {
- path: `layout/title`,
- loadChildren: async () =>
- (await import(`../directives/title/title.module`)).ExampleTuiTitleModule,
- data: {
- title: `Title`,
- },
- },
{
path: `experimental/avatar`,
loadChildren: async () =>
@@ -240,6 +232,14 @@ export const ROUTES: Routes = [
title: `Radio `,
},
},
+ {
+ path: `experimental/title`,
+ loadChildren: async () =>
+ (await import(`../experimental/title/title.module`)).ExampleTuiTitleModule,
+ data: {
+ title: `Title`,
+ },
+ },
{
path: `experimental/toggle`,
loadChildren: async () =>
@@ -282,6 +282,14 @@ export const ROUTES: Routes = [
title: `Button `,
},
},
+ {
+ path: `experimental/cell`,
+ loadChildren: async () =>
+ (await import(`../experimental/cell/cell.module`)).ExampleTuiCellModule,
+ data: {
+ title: `Cell`,
+ },
+ },
{
path: `experimental/compass`,
loadChildren: async () =>
diff --git a/projects/demo/src/modules/app/pages.ts b/projects/demo/src/modules/app/pages.ts
index 830214ca1561..0882131b1f61 100644
--- a/projects/demo/src/modules/app/pages.ts
+++ b/projects/demo/src/modules/app/pages.ts
@@ -172,12 +172,6 @@ export const pages: TuiDocPages = [
keywords: `блок, статус, block, status, block-status, blockstatus, layout`,
route: `/layout/block-status`,
},
- {
- section: `Layout`,
- title: `Title`,
- keywords: `subtitle, заголовок, caption, description, подзаголовок`,
- route: `/layout/title`,
- },
{
section: `Components`,
title: `Button`,
@@ -859,6 +853,12 @@ export const pages: TuiDocPages = [
keywords: `кнопка, button, icon-button, иконка`,
route: `/experimental/button`,
},
+ {
+ section: `Experimental`,
+ title: `Cell`,
+ keywords: `cell, feed, item`,
+ route: `/experimental/cell`,
+ },
{
section: `Experimental`,
title: `Compass`,
@@ -889,6 +889,12 @@ export const pages: TuiDocPages = [
keywords: `card, container, wrapper, image, blur, overlay`,
route: `/experimental/surface`,
},
+ {
+ section: `Experimental`,
+ title: `Title`,
+ keywords: `subtitle, заголовок, caption, description, подзаголовок`,
+ route: `/experimental/title`,
+ },
{
section: `Experimental`,
title: `ThumbnailCard `,
diff --git a/projects/demo/src/modules/experimental/cell/cell.component.ts b/projects/demo/src/modules/experimental/cell/cell.component.ts
new file mode 100644
index 000000000000..9e466d8ed8a0
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/cell.component.ts
@@ -0,0 +1,55 @@
+import {Component, ViewEncapsulation} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {
+ TuiDocExample,
+ tuiDocExampleOptionsProvider,
+ TuiRawLoaderContent,
+} from '@taiga-ui/addon-doc';
+
+@Component({
+ selector: 'example-cell',
+ templateUrl: './cell.template.html',
+ styleUrls: ['./cell.styles.less'],
+ providers: [tuiDocExampleOptionsProvider({fullsize: true})],
+ encapsulation: ViewEncapsulation.None,
+ changeDetection,
+})
+export class ExampleTuiCellComponent {
+ readonly exampleModule: TuiRawLoaderContent = import(
+ './examples/import/import-module.md?raw'
+ );
+
+ readonly exampleHtml: TuiRawLoaderContent = import(
+ './examples/import/insert-template.md?raw'
+ );
+
+ readonly example1: TuiDocExample = {
+ HTML: import('./examples/1/index.html?raw'),
+ };
+
+ readonly example2: TuiDocExample = {
+ HTML: import('./examples/2/index.html?raw'),
+ };
+
+ readonly example3: TuiDocExample = {
+ HTML: import('./examples/3/index.html?raw'),
+ };
+
+ readonly example4: TuiDocExample = {
+ HTML: import('./examples/4/index.html?raw'),
+ };
+
+ readonly example5: TuiDocExample = {
+ HTML: import('./examples/5/index.html?raw'),
+ };
+
+ readonly example6: TuiDocExample = {
+ HTML: import('./examples/6/index.html?raw'),
+ TypeScript: import('./examples/6/index.ts?raw'),
+ };
+
+ readonly example7: TuiDocExample = {
+ HTML: import('./examples/7/index.html?raw'),
+ LESS: import('./examples/7/index.less?raw'),
+ };
+}
diff --git a/projects/demo/src/modules/experimental/cell/cell.module.ts b/projects/demo/src/modules/experimental/cell/cell.module.ts
new file mode 100644
index 000000000000..a535b011c6bb
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/cell.module.ts
@@ -0,0 +1,96 @@
+import {CommonModule} from '@angular/common';
+import {NgModule} from '@angular/core';
+import {FormsModule} from '@angular/forms';
+import {tuiGetDocModules} from '@taiga-ui/addon-doc';
+import {
+ TuiGroupModule,
+ TuiHostedDropdownModule,
+ TuiLabelModule,
+ TuiLinkModule,
+ TuiLoaderModule,
+ TuiModeModule,
+ TuiNotificationModule,
+ TuiSvgModule,
+ TuiTextfieldControllerModule,
+ TuiTooltipModule,
+ TuiWrapperModule,
+} from '@taiga-ui/core';
+import {
+ TuiAvatarModule,
+ TuiAvatarStackModule,
+ TuiBadgedContentModule,
+ TuiBadgeModule,
+ TuiBadgeNotificationModule,
+ TuiButtonModule,
+ TuiCellModule,
+ TuiCheckboxModule,
+ TuiFadeModule,
+ TuiSensitiveModule,
+ TuiSurfaceModule,
+ TuiThumbnailCardModule,
+ TuiTitleModule,
+ TuiToggleModule,
+} from '@taiga-ui/experimental';
+import {
+ TuiDataListWrapperModule,
+ TuiProgressModule,
+ TuiSelectModule,
+} from '@taiga-ui/kit';
+
+import {ExampleTuiCellComponent} from './cell.component';
+import {TuiCellExample1} from './examples/1';
+import {TuiCellExample2} from './examples/2';
+import {TuiCellExample3} from './examples/3';
+import {TuiCellExample4} from './examples/4';
+import {TuiCellExample5} from './examples/5';
+import {TuiCellExample6} from './examples/6';
+import {TuiCellExample7} from './examples/7';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ TuiWrapperModule,
+ TuiAvatarModule,
+ TuiAvatarStackModule,
+ TuiBadgeModule,
+ TuiBadgeNotificationModule,
+ TuiBadgedContentModule,
+ TuiCellModule,
+ TuiFadeModule,
+ TuiLinkModule,
+ TuiNotificationModule,
+ TuiProgressModule,
+ TuiThumbnailCardModule,
+ TuiToggleModule,
+ TuiTooltipModule,
+ TuiTitleModule,
+ TuiToggleModule,
+ TuiSvgModule,
+ TuiCheckboxModule,
+ TuiLoaderModule,
+ TuiSensitiveModule,
+ TuiSurfaceModule,
+ TuiSelectModule,
+ TuiDataListWrapperModule,
+ TuiTextfieldControllerModule,
+ TuiLabelModule,
+ TuiButtonModule,
+ TuiHostedDropdownModule,
+ TuiGroupModule,
+ tuiGetDocModules(ExampleTuiCellComponent),
+ TuiModeModule,
+ ],
+ declarations: [
+ ExampleTuiCellComponent,
+ TuiCellExample1,
+ TuiCellExample2,
+ TuiCellExample3,
+ TuiCellExample4,
+ TuiCellExample5,
+ TuiCellExample6,
+ TuiCellExample7,
+ ],
+ exports: [ExampleTuiCellComponent],
+})
+export class ExampleTuiCellModule {}
diff --git a/projects/demo/src/modules/experimental/cell/cell.styles.less b/projects/demo/src/modules/experimental/cell/cell.styles.less
new file mode 100644
index 000000000000..6fbd78f1fbfb
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/cell.styles.less
@@ -0,0 +1,5 @@
+@import 'taiga-ui-local';
+
+example-cell [tuiCell] {
+ max-width: 25rem;
+}
diff --git a/projects/demo/src/modules/experimental/cell/cell.template.html b/projects/demo/src/modules/experimental/cell/cell.template.html
new file mode 100644
index 000000000000..5c2a7a52c493
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/cell.template.html
@@ -0,0 +1,91 @@
+
+
+
+ This code is
+ experimental
+ and is a subject to change. Expect final solution to be shipped in the next major version
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Import module:
+
+
+
+
+
+ Add to the template:
+
+
+
+
+
+
diff --git a/projects/demo/src/modules/experimental/cell/examples/1/index.html b/projects/demo/src/modules/experimental/cell/examples/1/index.html
new file mode 100644
index 000000000000..b7dd72d1cb87
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/1/index.html
@@ -0,0 +1,18 @@
+
+
+
+
+ Secondary title
+
Another description
+
+
diff --git a/projects/demo/src/modules/directives/title/examples/1/index.less b/projects/demo/src/modules/experimental/cell/examples/1/index.less
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/1/index.less
rename to projects/demo/src/modules/experimental/cell/examples/1/index.less
diff --git a/projects/demo/src/modules/experimental/cell/examples/1/index.ts b/projects/demo/src/modules/experimental/cell/examples/1/index.ts
new file mode 100644
index 000000000000..dd84de0e9e24
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/1/index.ts
@@ -0,0 +1,14 @@
+import {Component} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {encapsulation} from '@demo/emulate/encapsulation';
+
+@Component({
+ selector: 'tui-cell-example-1',
+ templateUrl: './index.html',
+ styleUrls: ['./index.less'],
+ changeDetection,
+ encapsulation,
+})
+export class TuiCellExample1 {
+ readonly sizes = ['s', 'm', 'l'] as const;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/2/index.html b/projects/demo/src/modules/experimental/cell/examples/2/index.html
new file mode 100644
index 000000000000..46e159b2c75d
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/2/index.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+ Allow incoming
+
Why would you?
+
+
+
+
+
+
+
+
+
+
+ Allow outgoing
+
+
diff --git a/projects/demo/src/modules/experimental/cell/examples/2/index.less b/projects/demo/src/modules/experimental/cell/examples/2/index.less
new file mode 100644
index 000000000000..23d25a3bb0a1
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/2/index.less
@@ -0,0 +1,5 @@
+:host {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/2/index.ts b/projects/demo/src/modules/experimental/cell/examples/2/index.ts
new file mode 100644
index 000000000000..fffe698fd33e
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/2/index.ts
@@ -0,0 +1,15 @@
+import {Component} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {encapsulation} from '@demo/emulate/encapsulation';
+
+@Component({
+ selector: 'tui-cell-example-2',
+ templateUrl: './index.html',
+ styleUrls: ['./index.less'],
+ changeDetection,
+ encapsulation,
+})
+export class TuiCellExample2 {
+ incoming = false;
+ outgoing = true;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/3/index.html b/projects/demo/src/modules/experimental/cell/examples/3/index.html
new file mode 100644
index 000000000000..a86581e2fb20
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/3/index.html
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
$30 our of $100
+
Saving for a Benjamin Franklin portrait
+
+
+
+
+
+
+
+
+ +2
+
+
+ Waterplea
+
+
+
+ 100 ₽
+
+ Music
+
+
+
+
+
+
+ Buy
+
+
+
+
+
+
+ 1234
+
+
+ Primary Card
+
**** **** **** 1234
+
+
+
+
+
+
+
Ridley Scott, 1982
+ Blade Runner
+
+ A blade runner must pursue and terminate four replicants who stole a ship in space and have returned to
+ Earth to find their creator.
+
+
+
diff --git a/projects/demo/src/modules/experimental/cell/examples/3/index.less b/projects/demo/src/modules/experimental/cell/examples/3/index.less
new file mode 100644
index 000000000000..23d25a3bb0a1
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/3/index.less
@@ -0,0 +1,5 @@
+:host {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/3/index.ts b/projects/demo/src/modules/experimental/cell/examples/3/index.ts
new file mode 100644
index 000000000000..af9b1337704b
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/3/index.ts
@@ -0,0 +1,14 @@
+import {Component} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {encapsulation} from '@demo/emulate/encapsulation';
+
+@Component({
+ selector: 'tui-cell-example-3',
+ templateUrl: './index.html',
+ styleUrls: ['./index.less'],
+ changeDetection,
+ encapsulation,
+})
+export class TuiCellExample3 {
+ value = false;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/4/index.html b/projects/demo/src/modules/experimental/cell/examples/4/index.html
new file mode 100644
index 000000000000..486dbf6dc730
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/4/index.html
@@ -0,0 +1,59 @@
+
+ Notifications
+ 3
+
+
+ Read
+
+
+
+
+
+
+ A label
+
Clicking it will toggle checkbox
+
+
+
+
+
+
+
+
+ For sale
+ •
+ ebay
+
+ It can be a button
+
In stock
+
+
+
+
+
+
+
Salary
+
+
+ Enough
+
+
Sky's the limit
+
+
diff --git a/projects/demo/src/modules/experimental/cell/examples/4/index.less b/projects/demo/src/modules/experimental/cell/examples/4/index.less
new file mode 100644
index 000000000000..23d25a3bb0a1
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/4/index.less
@@ -0,0 +1,5 @@
+:host {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/4/index.ts b/projects/demo/src/modules/experimental/cell/examples/4/index.ts
new file mode 100644
index 000000000000..baccb9b03928
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/4/index.ts
@@ -0,0 +1,14 @@
+import {Component} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {encapsulation} from '@demo/emulate/encapsulation';
+
+@Component({
+ selector: 'tui-cell-example-4',
+ templateUrl: './index.html',
+ styleUrls: ['./index.less'],
+ changeDetection,
+ encapsulation,
+})
+export class TuiCellExample4 {
+ value = false;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/5/index.html b/projects/demo/src/modules/experimental/cell/examples/5/index.html
new file mode 100644
index 000000000000..0abd9110e62a
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/5/index.html
@@ -0,0 +1,102 @@
+
+
+
+ Long title in a cell will wrap to multiple lines and so will the subtitle
+
+ Use
+ tuiCellSide
+ to keep your side content properly aligned if you have many lines of text
+
+
+
+
+
+
+
+
+
+ Alternatively you can use fade to hide extra text using nowrap CSS
+
Works the same for subtitle when fade directive is applied to the top
+
+
Works with the right side
+
+
+
+
+
+ Works with fade on both sides
+
You can control proportions
+
+
+ Proportions are controlled with flex
+
Flex shrink is set to 70-30 by default
+
+
+
+
+
+
+
+ Alexander
+
Taiga UI developer
+
+
+
+$1000
+
Bonus for tuiCell component
+
Awesome!
+
+
+
+
+
+
+
Main account
+
USD
+
By default unless arrested
+
+
+ $123 456
+
Careful, content may overlap
+
+
diff --git a/projects/demo/src/modules/experimental/cell/examples/5/index.less b/projects/demo/src/modules/experimental/cell/examples/5/index.less
new file mode 100644
index 000000000000..23d25a3bb0a1
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/5/index.less
@@ -0,0 +1,5 @@
+:host {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/5/index.ts b/projects/demo/src/modules/experimental/cell/examples/5/index.ts
new file mode 100644
index 000000000000..f988cd382612
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/5/index.ts
@@ -0,0 +1,12 @@
+import {Component} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {encapsulation} from '@demo/emulate/encapsulation';
+
+@Component({
+ selector: 'tui-cell-example-5',
+ templateUrl: './index.html',
+ styleUrls: ['./index.less'],
+ changeDetection,
+ encapsulation,
+})
+export class TuiCellExample5 {}
diff --git a/projects/demo/src/modules/experimental/cell/examples/6/index.html b/projects/demo/src/modules/experimental/cell/examples/6/index.html
new file mode 100644
index 000000000000..a64abba4a9d3
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/6/index.html
@@ -0,0 +1,61 @@
+
+
+ Single action
+
Description of the action
+
+
Action
+
+
+
+
+ Multiple actions
+
With no content on the right
+
+
+
+ Action
+
+
+
+
+
+
+
+
+
+ Multiple actions
+
When there's content on the right
+
+
+
+ {{ item }}
+
+
+
+ Hover over
+
Put it before the right side
+
+
diff --git a/projects/demo/src/modules/experimental/cell/examples/6/index.less b/projects/demo/src/modules/experimental/cell/examples/6/index.less
new file mode 100644
index 000000000000..23d25a3bb0a1
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/6/index.less
@@ -0,0 +1,5 @@
+:host {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/6/index.ts b/projects/demo/src/modules/experimental/cell/examples/6/index.ts
new file mode 100644
index 000000000000..6d6db20b9cdf
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/6/index.ts
@@ -0,0 +1,27 @@
+import {Component} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {encapsulation} from '@demo/emulate/encapsulation';
+
+@Component({
+ selector: 'tui-cell-example-6',
+ templateUrl: './index.html',
+ styleUrls: ['./index.less'],
+ changeDetection,
+ encapsulation,
+})
+export class TuiCellExample6 {
+ readonly items = [
+ {
+ icon: 'tuiIconPhone',
+ toString: () => 'Call now',
+ },
+ {
+ icon: 'tuiIconStar',
+ toString: () => 'Add to favorites',
+ },
+ {
+ icon: 'tuiIconTrash',
+ toString: () => 'Remove item',
+ },
+ ];
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/7/index.html b/projects/demo/src/modules/experimental/cell/examples/7/index.html
new file mode 100644
index 000000000000..67f5931689af
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/7/index.html
@@ -0,0 +1,50 @@
+
+
Inside a block
+
+
+
+
+ {{ item.title }}
+ {{ item.subtitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.subtitle }}
+
+
+
+
+
diff --git a/projects/demo/src/modules/experimental/cell/examples/7/index.less b/projects/demo/src/modules/experimental/cell/examples/7/index.less
new file mode 100644
index 000000000000..3b7d879d2e89
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/7/index.less
@@ -0,0 +1,19 @@
+:host {
+ display: flex;
+ flex-direction: column;
+ max-width: 20rem;
+ gap: 1rem;
+}
+
+.actions {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ margin: 1rem -0.5rem -0.5rem;
+}
+
+.action {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+ border-radius: 0.75rem;
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/7/index.ts b/projects/demo/src/modules/experimental/cell/examples/7/index.ts
new file mode 100644
index 000000000000..58d2792dcb96
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/7/index.ts
@@ -0,0 +1,32 @@
+import {Component} from '@angular/core';
+import {changeDetection} from '@demo/emulate/change-detection';
+import {encapsulation} from '@demo/emulate/encapsulation';
+
+@Component({
+ selector: 'tui-cell-example-7',
+ templateUrl: './index.html',
+ styleUrls: ['./index.less'],
+ changeDetection,
+ encapsulation,
+})
+export class TuiCellExample7 {
+ readonly items = [
+ {
+ icon: 'tuiIconEyeLarge',
+ title: 'Show more',
+ subtitle: 'Ctrl + Shift + M',
+ },
+ {
+ icon: 'tuiIconMailLarge',
+ title: 'Send message',
+ subtitle: 'Keep it short',
+ },
+ {
+ icon: 'tuiIconLockLarge',
+ title: 'Access',
+ subtitle: 'Block your account',
+ },
+ ];
+
+ value = this.items[0];
+}
diff --git a/projects/demo/src/modules/experimental/cell/examples/import/import-module.md b/projects/demo/src/modules/experimental/cell/examples/import/import-module.md
new file mode 100644
index 000000000000..e5e01c04cb6a
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/import/import-module.md
@@ -0,0 +1,13 @@
+```ts
+import {NgModule} from '@angular/core';
+import {TuiCellModule} from '@taiga-ui/experimental';
+// ...
+
+@NgModule({
+ imports: [
+ // ...
+ TuiCellModule,
+ ],
+})
+export class MyModule {}
+```
diff --git a/projects/demo/src/modules/experimental/cell/examples/import/insert-template.md b/projects/demo/src/modules/experimental/cell/examples/import/insert-template.md
new file mode 100644
index 000000000000..dabca51107b4
--- /dev/null
+++ b/projects/demo/src/modules/experimental/cell/examples/import/insert-template.md
@@ -0,0 +1,10 @@
+```html
+
+```
diff --git a/projects/demo/src/modules/directives/title/examples/1/index.html b/projects/demo/src/modules/experimental/title/examples/1/index.html
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/1/index.html
rename to projects/demo/src/modules/experimental/title/examples/1/index.html
diff --git a/projects/demo/src/modules/directives/title/examples/2/index.less b/projects/demo/src/modules/experimental/title/examples/1/index.less
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/2/index.less
rename to projects/demo/src/modules/experimental/title/examples/1/index.less
diff --git a/projects/demo/src/modules/directives/title/examples/1/index.ts b/projects/demo/src/modules/experimental/title/examples/1/index.ts
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/1/index.ts
rename to projects/demo/src/modules/experimental/title/examples/1/index.ts
diff --git a/projects/demo/src/modules/directives/title/examples/2/index.html b/projects/demo/src/modules/experimental/title/examples/2/index.html
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/2/index.html
rename to projects/demo/src/modules/experimental/title/examples/2/index.html
diff --git a/projects/demo/src/modules/experimental/title/examples/2/index.less b/projects/demo/src/modules/experimental/title/examples/2/index.less
new file mode 100644
index 000000000000..dc3140046ad7
--- /dev/null
+++ b/projects/demo/src/modules/experimental/title/examples/2/index.less
@@ -0,0 +1,5 @@
+:host {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+}
diff --git a/projects/demo/src/modules/directives/title/examples/2/index.ts b/projects/demo/src/modules/experimental/title/examples/2/index.ts
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/2/index.ts
rename to projects/demo/src/modules/experimental/title/examples/2/index.ts
diff --git a/projects/demo/src/modules/directives/title/examples/3/index.html b/projects/demo/src/modules/experimental/title/examples/3/index.html
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/3/index.html
rename to projects/demo/src/modules/experimental/title/examples/3/index.html
diff --git a/projects/demo/src/modules/directives/title/examples/3/index.less b/projects/demo/src/modules/experimental/title/examples/3/index.less
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/3/index.less
rename to projects/demo/src/modules/experimental/title/examples/3/index.less
diff --git a/projects/demo/src/modules/directives/title/examples/3/index.ts b/projects/demo/src/modules/experimental/title/examples/3/index.ts
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/3/index.ts
rename to projects/demo/src/modules/experimental/title/examples/3/index.ts
diff --git a/projects/demo/src/modules/directives/title/examples/import/import-module.md b/projects/demo/src/modules/experimental/title/examples/import/import-module.md
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/import/import-module.md
rename to projects/demo/src/modules/experimental/title/examples/import/import-module.md
diff --git a/projects/demo/src/modules/directives/title/examples/import/insert-template.md b/projects/demo/src/modules/experimental/title/examples/import/insert-template.md
similarity index 100%
rename from projects/demo/src/modules/directives/title/examples/import/insert-template.md
rename to projects/demo/src/modules/experimental/title/examples/import/insert-template.md
diff --git a/projects/demo/src/modules/directives/title/title.component.ts b/projects/demo/src/modules/experimental/title/title.component.ts
similarity index 100%
rename from projects/demo/src/modules/directives/title/title.component.ts
rename to projects/demo/src/modules/experimental/title/title.component.ts
diff --git a/projects/demo/src/modules/directives/title/title.module.ts b/projects/demo/src/modules/experimental/title/title.module.ts
similarity index 75%
rename from projects/demo/src/modules/directives/title/title.module.ts
rename to projects/demo/src/modules/experimental/title/title.module.ts
index fa84c491296d..29b5e8830a89 100644
--- a/projects/demo/src/modules/directives/title/title.module.ts
+++ b/projects/demo/src/modules/experimental/title/title.module.ts
@@ -1,9 +1,8 @@
import {CommonModule} from '@angular/common';
import {NgModule} from '@angular/core';
import {tuiGetDocModules} from '@taiga-ui/addon-doc';
-import {TuiLinkModule, TuiWrapperModule} from '@taiga-ui/core';
-import {TuiAvatarModule, TuiCheckboxModule} from '@taiga-ui/experimental';
-import {TuiTitleModule} from '@taiga-ui/layout';
+import {TuiLinkModule, TuiNotificationModule} from '@taiga-ui/core';
+import {TuiAvatarModule, TuiTitleModule} from '@taiga-ui/experimental';
import {TuiTitleExample1} from './examples/1';
import {TuiTitleExample2} from './examples/2';
@@ -14,11 +13,10 @@ import {ExampleTuiTitleComponent} from './title.component';
imports: [
CommonModule,
TuiTitleModule,
- tuiGetDocModules(ExampleTuiTitleComponent),
TuiLinkModule,
- TuiCheckboxModule,
- TuiWrapperModule,
TuiAvatarModule,
+ TuiNotificationModule,
+ tuiGetDocModules(ExampleTuiTitleComponent),
],
declarations: [
ExampleTuiTitleComponent,
diff --git a/projects/demo/src/modules/directives/title/title.template.html b/projects/demo/src/modules/experimental/title/title.template.html
similarity index 83%
rename from projects/demo/src/modules/directives/title/title.template.html
rename to projects/demo/src/modules/experimental/title/title.template.html
index 93d7457089c9..f3bd23b5d609 100644
--- a/projects/demo/src/modules/directives/title/title.template.html
+++ b/projects/demo/src/modules/experimental/title/title.template.html
@@ -1,9 +1,15 @@
+
+ This code is
+ experimental
+ and is a subject to change. Expect final solution to be shipped in the next major version
+
+
A directive for title with optional subtitle
*:not(:first-child),
+ & > [tuiCellSide] > *:not(:first-child) {
+ margin-inline-start: 0.5rem;
+ }
+
+ & > tui-avatar,
+ & > tui-avatar-stack tui-avatar,
+ & > [tuiCellSide] tui-avatar,
+ & > [tuiCellSide] tui-avatar-stack tui-avatar {
+ --t-size: 1.5rem;
+ }
+ }
+
+ &[data-size='m'] {
+ --t-height: calc(var(--tui-height-m) - 0.75rem);
+ --t-padding: 0.375rem 1rem;
+
+ [tuiTitle] {
+ font: var(--tui-font-text-s-2);
+ gap: 0.125rem;
+ }
+
+ [tuiSubtitle] {
+ font: var(--tui-font-text-xs-2);
+ }
+
+ & > *:not(:first-child),
+ & > [tuiCellSide] > *:not(:first-child) {
+ margin-inline-start: 0.75rem;
+ }
+
+ & > tui-avatar,
+ & > tui-avatar-stack tui-avatar,
+ & > [tuiCellSide] tui-avatar,
+ & > [tuiCellSide] tui-avatar-stack tui-avatar {
+ --t-size: 2rem;
+ }
+ }
+
+ &[data-size='l'] {
+ --t-height: calc(var(--tui-height-l) - 1rem);
+ --t-padding: 0.5rem 1rem;
+
+ & > *:not(:first-child),
+ & > [tuiCellSide] > *:not(:first-child) {
+ margin-inline-start: 1rem;
+ }
+
+ & > tui-avatar,
+ & > tui-avatar-stack tui-avatar,
+ & > [tuiCellSide] tui-avatar,
+ & > [tuiCellSide] tui-avatar-stack tui-avatar {
+ --t-size: 2.5rem;
+ }
+ }
+
+ &:hover [tuiCellActions] ~ * {
+ opacity: 0;
+ }
+
+ &:hover [tuiCellActions] button,
+ &:hover [tuiCellActions] a {
+ opacity: 1;
+ }
+
+ [tuiOption] &,
+ tui-primitive-textfield & {
+ padding: 0;
+ }
+}
+
+@media (hover: hover) and (pointer: fine) {
+ a[tuiCell]:hover,
+ button[tuiCell]:hover {
+ background: var(--tui-clear);
+ cursor: pointer;
+ }
+}
diff --git a/projects/experimental/directives/cell/index.ts b/projects/experimental/directives/cell/index.ts
new file mode 100644
index 000000000000..a61848642896
--- /dev/null
+++ b/projects/experimental/directives/cell/index.ts
@@ -0,0 +1,3 @@
+export * from './cell.component';
+export * from './cell.directive';
+export * from './cell.module';
diff --git a/projects/layout/components/title/ng-package.json b/projects/experimental/directives/cell/ng-package.json
similarity index 100%
rename from projects/layout/components/title/ng-package.json
rename to projects/experimental/directives/cell/ng-package.json
diff --git a/projects/experimental/directives/index.ts b/projects/experimental/directives/index.ts
index 5758f3fd140a..f7a099c4fdd9 100644
--- a/projects/experimental/directives/index.ts
+++ b/projects/experimental/directives/index.ts
@@ -1,3 +1,5 @@
+export * from '@taiga-ui/experimental/directives/cell';
export * from '@taiga-ui/experimental/directives/fade';
export * from '@taiga-ui/experimental/directives/sensitive';
export * from '@taiga-ui/experimental/directives/surface';
+export * from '@taiga-ui/experimental/directives/title';
diff --git a/projects/experimental/directives/sensitive/sensitive.style.less b/projects/experimental/directives/sensitive/sensitive.style.less
index e6b368574dcb..54cab64e97ba 100644
--- a/projects/experimental/directives/sensitive/sensitive.style.less
+++ b/projects/experimental/directives/sensitive/sensitive.style.less
@@ -19,6 +19,6 @@
}
&.tui-sensitive {
- text-indent: -10000%;
+ -webkit-text-fill-color: transparent;
}
}
diff --git a/projects/layout/components/title/index.ts b/projects/experimental/directives/title/index.ts
similarity index 100%
rename from projects/layout/components/title/index.ts
rename to projects/experimental/directives/title/index.ts
diff --git a/projects/experimental/directives/title/ng-package.json b/projects/experimental/directives/title/ng-package.json
new file mode 100644
index 000000000000..bab5ebcdb74a
--- /dev/null
+++ b/projects/experimental/directives/title/ng-package.json
@@ -0,0 +1,8 @@
+{
+ "lib": {
+ "entryFile": "index.ts",
+ "styleIncludePaths": [
+ "../../../core/styles"
+ ]
+ }
+}
diff --git a/projects/layout/components/title/title.component.ts b/projects/experimental/directives/title/title.component.ts
similarity index 100%
rename from projects/layout/components/title/title.component.ts
rename to projects/experimental/directives/title/title.component.ts
diff --git a/projects/layout/components/title/title.directive.ts b/projects/experimental/directives/title/title.directive.ts
similarity index 93%
rename from projects/layout/components/title/title.directive.ts
rename to projects/experimental/directives/title/title.directive.ts
index e16ab2fff036..3c7b97a6e10f 100644
--- a/projects/layout/components/title/title.directive.ts
+++ b/projects/experimental/directives/title/title.directive.ts
@@ -5,8 +5,9 @@ import {TuiSizeL, TuiSizeS} from '@taiga-ui/core';
import {TuiTitleComponent} from './title.component';
@Directive({
- selector: '[tuiTitle], [tuiSubtitle]',
+ selector: '[tuiTitle]',
host: {
+ tuiTitle: '',
'[attr.data-size]': 'size || null',
'[attr.data-platform]': 'platform',
},
diff --git a/projects/layout/components/title/title.module.ts b/projects/experimental/directives/title/title.module.ts
similarity index 100%
rename from projects/layout/components/title/title.module.ts
rename to projects/experimental/directives/title/title.module.ts
diff --git a/projects/layout/components/title/title.style.less b/projects/experimental/directives/title/title.style.less
similarity index 94%
rename from projects/layout/components/title/title.style.less
rename to projects/experimental/directives/title/title.style.less
index fc78c49710f3..ad0159f87edd 100644
--- a/projects/layout/components/title/title.style.less
+++ b/projects/experimental/directives/title/title.style.less
@@ -1,6 +1,8 @@
[tuiTitle] {
+ position: relative;
display: flex;
flex-direction: column;
+ text-align: left;
gap: 0.25rem;
margin: 0;
font: var(--tui-font-text-m-2);
diff --git a/projects/kit/components/data-list-wrapper/data-list-group-wrapper.template.html b/projects/kit/components/data-list-wrapper/data-list-group-wrapper.template.html
index 7e00c5ee97eb..066ff48b26fa 100644
--- a/projects/kit/components/data-list-wrapper/data-list-group-wrapper.template.html
+++ b/projects/kit/components/data-list-wrapper/data-list-group-wrapper.template.html
@@ -16,6 +16,7 @@
tuiOption
[disabled]="disabledItemHandler(item)"
[value]="item"
+ (click)="itemClick.emit(item)"
>
{{ text }}
diff --git a/projects/kit/components/data-list-wrapper/data-list-wrapper.template.html b/projects/kit/components/data-list-wrapper/data-list-wrapper.template.html
index 25f831f9e3ae..009f05d7e50a 100644
--- a/projects/kit/components/data-list-wrapper/data-list-wrapper.template.html
+++ b/projects/kit/components/data-list-wrapper/data-list-wrapper.template.html
@@ -12,6 +12,7 @@
tuiOption
[disabled]="disabledItemHandler(item)"
[value]="item"
+ (click)="itemClick.emit(item)"
>
diff --git a/projects/kit/components/data-list-wrapper/data-list-wrapper.ts b/projects/kit/components/data-list-wrapper/data-list-wrapper.ts
index e912a474a2bc..ccd091d15358 100644
--- a/projects/kit/components/data-list-wrapper/data-list-wrapper.ts
+++ b/projects/kit/components/data-list-wrapper/data-list-wrapper.ts
@@ -1,8 +1,10 @@
import {
Directive,
ElementRef,
+ EventEmitter,
forwardRef,
Input,
+ Output,
QueryList,
ViewChildren,
} from '@angular/core';
@@ -31,6 +33,9 @@ export abstract class AbstractTuiDataListWrapper {
@Input()
size: TuiSizeL | TuiSizeXS = this.defaultSize;
+ @Output()
+ readonly itemClick = new EventEmitter();
+
constructor(
protected readonly itemsHandlers: TuiItemsHandlers,
protected readonly defaultSize: TuiSizeL | TuiSizeXS,
diff --git a/projects/layout/components/index.ts b/projects/layout/components/index.ts
index 8becae85e0aa..45b3c6d90361 100644
--- a/projects/layout/components/index.ts
+++ b/projects/layout/components/index.ts
@@ -1,2 +1 @@
export * from '@taiga-ui/layout/components/block-status';
-export * from '@taiga-ui/layout/components/title';