From f73781bea3ba19dc3a6e6585c3edb320ea3133b9 Mon Sep 17 00:00:00 2001 From: SerraMorec Date: Fri, 19 Jun 2026 14:34:21 +0300 Subject: [PATCH] feat(sdds-acore/uikit-compose): AiUserMessage was implemented --- .../docs/components/AiUserMessageUsage.md | 60 + .../main/kotlin/com/sdds/sandbox/Component.kt | 3 + .../aiusermessage/AiUserMessageSamples.kt | 213 ++ .../aiusermessage/AiUserMessageStory.kt | 190 ++ .../internal/components/ComponentDelegates.kt | 1 + .../com/sdds/compose/uikit/ai/AiAnswer.kt | 4 +- .../sdds/compose/uikit/ai/AiUserMessage.kt | 168 ++ .../compose/uikit/ai/AiUserMessageStyle.kt | 707 +++++ .../motion/{ => aianswer}/AiAnswerMotion.kt | 2 +- .../{ => aianswer}/AiAnswerMotionStyle.kt | 2 +- .../aiusermessage/AiUserMessageMotion.kt | 23 + .../aiusermessage/AiUserMessageMotionStyle.kt | 119 + .../uikit/internal/ai/AiAnswerContent.kt | 2 +- ...pedPlacementStartAlignmentCenter_light.png | Bin 49633 -> 49633 bytes ...tClippedPlacementEndAlignmentEnd_light.png | Bin 45309 -> 45309 bytes .../config-info-compose.json | 2531 ++++++++++++++++- ...vAiUserMessageEditableVariationsCompose.kt | 54 + .../SddsServAiUserMessageVariationsCompose.kt | 368 +++ .../integration/SddsServComposeComponents.kt | 7 + .../SddsServEditableVariationsCompose.kt | 26 +- .../styles/aiusermessage/AiUserMessage.kt | 7 + .../aiusermessage/AiUserMessageStyles.kt | 596 ++++ .../AiUserMessageStylesCollection.kt | 777 +++++ .../AiUserMessageEmbeddedIconButtonGroup.kt | 7 + ...serMessageEmbeddedIconButtonGroupStyles.kt | 71 + .../ButtonGroupStylesCollection.kt | 44 + .../styles/editable/AiUserMessageEditable.kt | 7 + .../editable/AiUserMessageEditableStyles.kt | 112 + .../editable/EditableStylesCollection.kt | 90 +- 29 files changed, 6149 insertions(+), 42 deletions(-) create mode 100644 build-system/docs-template/compose-template/docs/components/AiUserMessageUsage.md create mode 100644 integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessageSamples.kt create mode 100644 integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/stories/aiusermessage/AiUserMessageStory.kt create mode 100644 sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessage.kt create mode 100644 sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessageStyle.kt rename sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/{ => aianswer}/AiAnswerMotion.kt (96%) rename sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/{ => aianswer}/AiAnswerMotionStyle.kt (99%) create mode 100644 sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotion.kt create mode 100644 sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotionStyle.kt create mode 100644 tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageEditableVariationsCompose.kt create mode 100644 tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageVariationsCompose.kt create mode 100644 tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessage.kt create mode 100644 tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStyles.kt create mode 100644 tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStylesCollection.kt create mode 100644 tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroup.kt create mode 100644 tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroupStyles.kt create mode 100644 tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditable.kt create mode 100644 tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditableStyles.kt diff --git a/build-system/docs-template/compose-template/docs/components/AiUserMessageUsage.md b/build-system/docs-template/compose-template/docs/components/AiUserMessageUsage.md new file mode 100644 index 000000000..423ae6153 --- /dev/null +++ b/build-system/docs-template/compose-template/docs/components/AiUserMessageUsage.md @@ -0,0 +1,60 @@ +--- +title: AiUserMessage +--- + +Компонент AiUserMessage используется для отображения запроса пользователя в ИИ-сценариях. + +В `isInEdit` отображает редактируемое поле в виде компонента [Editable](EditableUsage.md), +при переходе в этот режим, Editable захватывает фокус и активизируется ввод текста. +В обычном режиме текст отображается посредстов мкомпонента [Text](TextUsage.md). С помощью `actions` +и `editableActions` передайте контент для взаимодействия [ButtonGroup](ButtonGroupUsage.md) кнопки в +группах стилизуются автоматически. Для отображения загружаемого пользователем контента используйте +`uploadingContent` компоненты File и Image так же будут стилизованы автоматически. + + +## Простой пример использования + +```kotlin +// @sample: com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessage_Simple.kt +``` + +## Пример использования с контентом для взаимодействия + +```kotlin +// @sample: com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessage_WithActions.kt +``` + +## Пример использования с контентом для взаимодействия отображающимся в редактируемом режиме + +```kotlin +// @sample: com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessage_WithEditableActions.kt +``` + +## Полный пример использования + +```kotlin +// @sample: com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessage_FullUsage.kt +``` + + +## Стиль AiUserMessage + +В большинстве случаев можно использовать готовые сгенерированные стили, а при необходимости создать +собственный стиль через метод `builder()`. Подробнее о том, как работают `Style`, `StyleBuilder` +и параметры стиля с состояниями, см. в разделе [Стилизация компонентов](../theme/Styles.md). + + + +### Создание стиля с помощью builder() + +```kotlin +// @sample: com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessage_Style.kt +``` + +## Слоты + +- `value` - начальное значение отображаемого текста. +- `onValueChange` - поведение при изменении текстового значания. +- `isInEdit` - переводит компонент в режим редактирования. +- `actions` и `editableActions` - слоты с областью видимости `ButtonGroupScope`, каждый отрисовывается в отдельном ButtonGroup. +- `uploadingContent` - слот с областью видимости `ColumnScope`, отрисовывается внутри Column. diff --git a/integration-core/sandbox-core/src/main/kotlin/com/sdds/sandbox/Component.kt b/integration-core/sandbox-core/src/main/kotlin/com/sdds/sandbox/Component.kt index ccb2d9747..72b3114a1 100644 --- a/integration-core/sandbox-core/src/main/kotlin/com/sdds/sandbox/Component.kt +++ b/integration-core/sandbox-core/src/main/kotlin/com/sdds/sandbox/Component.kt @@ -149,6 +149,7 @@ data class ComponentKey( val DropZone = ComponentKey(CoreComponentName.DROP_ZONE) val AiHeader = ComponentKey(CoreComponentName.AI_HEADER) val Splitter = ComponentKey(CoreComponentName.SPLITTER) + val AiUserMessage = ComponentKey(CoreComponentName.AI_USER_MESSAGE) } } @@ -261,6 +262,7 @@ private enum class CoreComponentName(displayName: String? = null) { EDITABLE, AI_HEADER, DROP_ZONE, + AI_USER_MESSAGE, SPLITTER, ; @@ -369,6 +371,7 @@ private fun CoreComponentName.group(): ComponentGroup { CoreComponentName.FLOW -> CoreComponentGroup.LAYOUT CoreComponentName.AI_HEADER, CoreComponentName.AI_ANSWER, + CoreComponentName.AI_USER_MESSAGE, -> CoreComponentGroup.AI_KIT }.let { ComponentGroup(it.displayName, it.ordinal) } } diff --git a/integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessageSamples.kt b/integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessageSamples.kt new file mode 100644 index 000000000..55c0b7acf --- /dev/null +++ b/integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/samples/aiusermessage/AiUserMessageSamples.kt @@ -0,0 +1,213 @@ +package com.sdds.compose.uikit.fixtures.samples.aiusermessage + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.dp +import com.sdds.compose.docs.composableCodeSnippet +import com.sdds.compose.uikit.Button +import com.sdds.compose.uikit.ButtonGroupStyle +import com.sdds.compose.uikit.EditableStyle +import com.sdds.compose.uikit.File +import com.sdds.compose.uikit.FileActionPlacement +import com.sdds.compose.uikit.FileStyle +import com.sdds.compose.uikit.Icon +import com.sdds.compose.uikit.IconButton +import com.sdds.compose.uikit.ImageStyle +import com.sdds.compose.uikit.ai.AiUserMessage +import com.sdds.compose.uikit.ai.AiUserMessageStyle +import com.sdds.docs.DocSample +import com.sdds.icons.R + +@Composable +@DocSample(needScreenshot = true) +fun AiUserMessage_Simple() { + composableCodeSnippet { + var text by remember { mutableStateOf("text") } + AiUserMessage( + modifier = Modifier.fillMaxWidth(), + value = text, + onValueChange = { text = it }, + ) + } +} + +@Composable +@DocSample(needScreenshot = true) +fun AiUserMessage_WithActions() { + composableCodeSnippet { + var text by remember { mutableStateOf("text") } + AiUserMessage( + modifier = Modifier.fillMaxWidth(), + value = text, + onValueChange = { text = it }, + actions = { + button { IconButton(iconRes = R.drawable.ic_backward_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_copy_outline_24, onClick = {}) } + }, + ) + } +} + +@Composable +@DocSample(needScreenshot = true) +fun AiUserMessage_WithEditableActions() { + composableCodeSnippet { + var text by remember { mutableStateOf("text") } + AiUserMessage( + modifier = Modifier.fillMaxWidth(), + value = text, + isInEdit = true, + onValueChange = { text = it }, + editableActions = { + button { + Button(label = "Сохранить", onClick = {}) + } + button { + Button(label = "Отменить", onClick = {}) + } + }, + actions = { + button { IconButton(iconRes = R.drawable.ic_backward_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_copy_outline_24, onClick = {}) } + }, + ) + } +} + +@Composable +@DocSample(needScreenshot = true) +fun AiUserMessage_FullUsage() { + composableCodeSnippet { + var editMode by remember { mutableStateOf(false) } + var message by remember { mutableStateOf("Text") } + var draftMessage by remember { mutableStateOf("") } + + AiUserMessage( + modifier = Modifier.fillMaxWidth(), + value = if (editMode) draftMessage else message, + onValueChange = { draftMessage = it }, + isInEdit = editMode, + uploadingContent = + { + repeat(5) { + File( + modifier = Modifier.width(200.dp), + label = "some_file$it.pdf", + isLoading = false, + image = { + Icon( + painterResource(R.drawable.ic_file_check_fill_24), + contentDescription = "", + ) + }, + action = { + IconButton( + iconRes = R.drawable.ic_close_16, + onClick = {}, + ) + }, + actionPlacement = FileActionPlacement.End, + ) + } + }, + editableActions = + { + button { + Button(label = "Сохранить", onClick = { + message = draftMessage + editMode = false + }) + } + button { + Button(label = "Отменить", onClick = { + draftMessage = message + editMode = false + }) + } + }, + actions = + { + button { IconButton(iconRes = R.drawable.ic_backward_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_copy_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_plasma_24, onClick = {}) } + button { + IconButton(iconRes = R.drawable.ic_edit_outline_24, onClick = { + draftMessage = message + editMode = true + }) + } + }, + ) + } +} + +@Composable +@DocSample(needScreenshot = false) +fun AiUserMessage_Style() { + composableCodeSnippet { + AiUserMessageStyle.builder() + .uploadingShape(placeholder(RoundedCornerShape(0.dp), "/** Токен формы (скругления) */")) + .messageShape(placeholder(RoundedCornerShape(0.dp), "/** Токен формы (скругления) */")) + .textStyle(placeholder(TextStyle.Default, "/** Токен типографики */")) + .editableStyle( + placeholder( + EditableStyle.builder().style(), + "/** Стиль редактируемого поля */", + ), + ) + .actionsButtonGroupStyle( + placeholder( + ButtonGroupStyle.builder().style(), + "/** Стиль группы кнопок, расположенных внизу */", + ), + ) + .editableActionsButtonGroupStyle( + placeholder( + ButtonGroupStyle.builder().style(), + "/** Стиль группы кнопок, отображающихся в режиме редактирования */", + ), + ) + .uploadingImageStyle( + placeholder( + ImageStyle.builder().style(), + "/** Стиль загружаемых изображений */", + ), + ) + .uploadingFileStyle( + placeholder( + FileStyle.builder().style(), + "/** Стиль загружаемых файлов */", + ), + ) + .colors { + textColor(placeholder(Color.White, "/** Токен цвета */")) + uploadingBackground(placeholder(Color.White, "/** Токен цвета */")) + messageBackground(placeholder(Color.White, "/** Токен цвета */")) + } + .dimensions { + uploadingPaddingStart(0.0.dp) + uploadingPaddingEnd(0.0.dp) + uploadingPaddingTop(0.0.dp) + uploadingPaddingBottom(0.0.dp) + messagePaddingStart(18.0.dp) + messagePaddingEnd(18.0.dp) + messagePaddingTop(21.0.dp) + messagePaddingBottom(21.0.dp) + uploadingGroupGap(10.0.dp) + uploadingFilesGap(0.0.dp) + actionsGap(12.0.dp) + editableActionsGap(16.0.dp) + } + .style() + } +} diff --git a/integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/stories/aiusermessage/AiUserMessageStory.kt b/integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/stories/aiusermessage/AiUserMessageStory.kt new file mode 100644 index 000000000..28cc12cd4 --- /dev/null +++ b/integration-core/uikit-compose-fixtures/src/main/kotlin/com/sdds/compose/uikit/fixtures/stories/aiusermessage/AiUserMessageStory.kt @@ -0,0 +1,190 @@ +package com.sdds.compose.uikit.fixtures.stories.aiusermessage + +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.sdds.compose.sandbox.ComposeBaseStory +import com.sdds.compose.uikit.Button +import com.sdds.compose.uikit.File +import com.sdds.compose.uikit.FileActionPlacement +import com.sdds.compose.uikit.Icon +import com.sdds.compose.uikit.IconButton +import com.sdds.compose.uikit.ai.AiUserMessage +import com.sdds.compose.uikit.ai.AiUserMessageStyle +import com.sdds.compose.uikit.fixtures.stories.AiUserMessageUiStatePropertiesProducer +import com.sdds.compose.uikit.fixtures.stories.AiUserMessageUiStateTransformer +import com.sdds.icons.R +import com.sdds.sandbox.ComponentKey +import com.sdds.sandbox.Story +import com.sdds.sandbox.StoryUiState +import com.sdds.sandbox.UiState + +@StoryUiState +data class AiUserMessageUiState( + override val variant: String = "", + override val appearance: String = "", + val hasActions: Boolean = true, + val hasEditableActions: Boolean = true, + val hasUploadingContent: Boolean = true, + val isInEdit: Boolean = false, + val filesGroup: Boolean = false, +) : UiState { + override fun updateVariant(appearance: String, variant: String): UiState { + return copy(appearance = appearance, variant = variant) + } +} + +@Story +object AiUserMessageStory : ComposeBaseStory( + ComponentKey.AiUserMessage, + AiUserMessageUiState(), + AiUserMessageUiStatePropertiesProducer, + AiUserMessageUiStateTransformer, +) { + @Composable + override fun BoxScope.Content( + style: AiUserMessageStyle, + state: AiUserMessageUiState, + ) { + var editMode by remember(state.isInEdit) { mutableStateOf(state.isInEdit) } + var message by remember { mutableStateOf("Сообщение пользователя") } + var draftMessage by remember { mutableStateOf(message) } + + AiUserMessage( + modifier = Modifier.fillMaxWidth(), + style = style, + value = if (editMode) draftMessage else message, + onValueChange = { draftMessage = it }, + isInEdit = editMode, + uploadingContent = if (state.hasUploadingContent) { + { + if (state.variant.contains("File", true)) { + UploadingFile(state.filesGroup) + } else { + UploadingImage() + } + } + } else { + null + }, + editableActions = if (state.hasEditableActions) { + { + button { + Button( + label = "Сохранить", + onClick = { + message = draftMessage + editMode = false + updateState(state.copy(isInEdit = false)) + }, + ) + } + button { + Button( + label = "Отменить", + onClick = { + draftMessage = message + editMode = false + updateState(state.copy(isInEdit = false)) + }, + ) + } + } + } else { + null + }, + actions = if (state.hasActions) { + { + button { IconButton(iconRes = R.drawable.ic_backward_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_copy_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_plasma_24, onClick = {}) } + button { + IconButton( + iconRes = R.drawable.ic_edit_outline_24, + onClick = { + draftMessage = message + editMode = true + updateState(state.copy(isInEdit = true)) + }, + ) + } + } + } else { + null + }, + ) + } + + @Composable + override fun Preview( + style: AiUserMessageStyle, + key: ComponentKey, + ) { + AiUserMessage( + modifier = Modifier.fillMaxWidth(), + style = style, + value = "Text", + onValueChange = {}, + isInEdit = false, + actions = + { + button { IconButton(iconRes = R.drawable.ic_backward_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_copy_outline_24, onClick = {}) } + button { IconButton(iconRes = R.drawable.ic_plasma_24, onClick = {}) } + }, + ) + } +} + +@Composable +private fun UploadingFile(group: Boolean = false) { + if (group) { + repeat(5) { + FileExample(count = it) + } + } else { + FileExample() + } +} + +@Composable +private fun UploadingImage() { + AsyncImage( + modifier = Modifier, + contentScale = ContentScale.Fit, + model = "https://cdn.costumewall.com/wp-content/uploads/2018/09/michael-scott.jpg", + contentDescription = "FileImage", + ) +} + +@Composable +private fun FileExample(count: Int = 1) { + File( + modifier = Modifier.width(200.dp), + label = "some_file$count.pdf", + isLoading = false, + image = { + Icon( + painterResource(R.drawable.ic_file_check_fill_24), + contentDescription = "", + ) + }, + action = { + IconButton( + iconRes = R.drawable.ic_close_16, + onClick = {}, + ) + }, + actionPlacement = FileActionPlacement.End, + ) +} diff --git a/sdds-core/plugin_theme_builder/src/main/kotlin/com/sdds/plugin/themebuilder/internal/components/ComponentDelegates.kt b/sdds-core/plugin_theme_builder/src/main/kotlin/com/sdds/plugin/themebuilder/internal/components/ComponentDelegates.kt index 35f38dce4..5ed94f9a8 100644 --- a/sdds-core/plugin_theme_builder/src/main/kotlin/com/sdds/plugin/themebuilder/internal/components/ComponentDelegates.kt +++ b/sdds-core/plugin_theme_builder/src/main/kotlin/com/sdds/plugin/themebuilder/internal/components/ComponentDelegates.kt @@ -176,6 +176,7 @@ internal fun componentDelegates(allMeta: List, allComponents: Lis "combo-box" to universal("ComboBox") { ComboBoxConfigDelegate() }, "drop-zone" to universal("DropZone") { DropZoneConfigDelegate() }, "splitter" to universal("Splitter") { SplitterConfigDelegate() }, + "ai-user-message" to universal("AiUserMessage"), ) } diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiAnswer.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiAnswer.kt index 4cc92c9a4..d2f56ceb4 100644 --- a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiAnswer.kt +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiAnswer.kt @@ -5,8 +5,8 @@ import androidx.compose.ui.Modifier import com.sdds.api.info.compose.ApiName import com.sdds.api.info.compose.ApiStateSet import com.sdds.compose.uikit.ButtonGroupScope -import com.sdds.compose.uikit.ai.motion.AiAnswerMotionStyle -import com.sdds.compose.uikit.ai.motion.rememberAiAnswerMotion +import com.sdds.compose.uikit.ai.motion.aianswer.AiAnswerMotionStyle +import com.sdds.compose.uikit.ai.motion.aianswer.rememberAiAnswerMotion import com.sdds.compose.uikit.interactions.ValueState import com.sdds.compose.uikit.internal.ai.AiAnswerContent import com.sdds.compose.uikit.internal.ai.AiAnswerError diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessage.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessage.kt new file mode 100644 index 000000000..a1716906c --- /dev/null +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessage.kt @@ -0,0 +1,168 @@ +package com.sdds.compose.uikit.ai + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.text.TextLayoutResult +import com.sdds.compose.uikit.ButtonGroup +import com.sdds.compose.uikit.ButtonGroupScope +import com.sdds.compose.uikit.Editable +import com.sdds.compose.uikit.LocalFileStyle +import com.sdds.compose.uikit.LocalImageStyle +import com.sdds.compose.uikit.Text +import com.sdds.compose.uikit.ai.motion.aiusermessage.AiUserMessageMotionStyle +import com.sdds.compose.uikit.ai.motion.aiusermessage.rememberAiUserMessageMotion +import com.sdds.compose.uikit.graphics.backgroundBrush +import com.sdds.compose.uikit.interactions.getValueAsState +import com.sdds.compose.uikit.motion.Motion +import com.sdds.compose.uikit.motion.getBrushAsState +import com.sdds.compose.uikit.motion.getTextStyleAsState +import kotlinx.coroutines.android.awaitFrame + +/** + * Компонент AiUserMessage используется для отображения запроса пользователя в ИИ-сценариях. + * + * @param value значение в поле ввода + * @param onValueChange callback для изменения текста при вводе + * @param modifier модификатор + * @param style стиль компонента + * @param isInEdit находится ли компонент в режиме редактирования текста + * @param uploadingContent загружаемый пользователем контент + * @param actions действия внутри отдельного [com.sdds.compose.uikit.ButtonGroup] + * @param editableActions действия внутри отдельного [com.sdds.compose.uikit.ButtonGroup], + * отображающиеся в режиме редактирования + * @param keyboardOptions для настройки клавиатуры, например [KeyboardType] или [ImeAction] + * @param keyboardActions когда на ввод подается [ImeAction] вызывается соответствующий callback + * @param onTextLayout колбэк, сигнализирующий об окончания лэйаута текста + * @param motion объект анимаций + */ +@Composable +fun AiUserMessage( + value: String, + onValueChange: (String) -> Unit, + modifier: Modifier = Modifier, + style: AiUserMessageStyle = LocalAiUserMessageStyle.current, + isInEdit: Boolean = false, + uploadingContent: (@Composable ColumnScope.() -> Unit)? = null, + actions: (ButtonGroupScope.() -> Unit)? = null, + editableActions: (ButtonGroupScope.() -> Unit)? = null, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, + onTextLayout: (TextLayoutResult) -> Unit = {}, + motion: Motion = rememberAiUserMessageMotion(), +) { + val uploadingBackground = + style.colors.uploadingBackground.getBrushAsState(motion.context, motion.style.uploadingBackground) + val uploadingShape = style.uploadingShape.getValueAsState(motion.context) + val messageBackground = + style.colors.messageBackground.getBrushAsState(motion.context, motion.style.messageBackground) + val messageShape = style.messageShape.getValueAsState(motion.context) + val editableActionsGap by style.dimensions.editableActionsGap.getValueAsState(motion.context) + val actionGap by style.dimensions.actionsGap.getValueAsState(motion.context) + val uploadingGap by style.dimensions.uploadingGroupGap.getValueAsState(motion.context) + val uploadingFilesGap by style.dimensions.uploadingFilesGap.getValueAsState(motion.context) + val titleBrush = style.colors.text.getBrushAsState(motion.context, motion.style.textColor) + val focusRequester = remember { FocusRequester() } + LaunchedEffect(isInEdit) { + if (isInEdit) { + awaitFrame() + focusRequester.requestFocus() + } + } + Column( + modifier = modifier, + horizontalAlignment = Alignment.End, + ) { + uploadingContent?.let { + Column( + modifier = Modifier + .clip(uploadingShape.value) + .backgroundBrush( + brushProducer = { uploadingBackground.value }, + shape = uploadingShape.value, + ) + .padding(style.dimensions.getUploadingPaddings(motion)), + verticalArrangement = Arrangement.spacedBy(uploadingFilesGap), + ) { + CompositionLocalProvider( + LocalFileStyle provides style.uploadingFileStyle, + LocalImageStyle provides style.uploadingImageStyle, + ) { + it.invoke(this) + } + } + Spacer(modifier = Modifier.height(uploadingGap)) + } + Column( + modifier = Modifier + .backgroundBrush( + brushProducer = { messageBackground.value }, + shape = messageShape.value, + ) + .padding(style.dimensions.getMessagePaddings(motion)), + verticalArrangement = Arrangement.spacedBy(editableActionsGap), + ) { + if (isInEdit) { + Editable( + modifier = Modifier.focusRequester(focusRequester), + style = style.editableStyle, + value = value, + onValueChange = onValueChange, + keyboardActions = keyboardActions, + keyboardOptions = keyboardOptions, + onTextLayout = onTextLayout, + ) + editableActions?.let { + ButtonGroup(style = style.editableActionsButtonGroupStyle, content = it) + } + } else { + val textStyle by style.textStyle.getTextStyleAsState(motion.context, motion.style.textStyle) + Text( + text = value, + brush = { titleBrush.value }, + style = textStyle, + ) + } + } + actions?.let { + Spacer(modifier = Modifier.height(actionGap)) + ButtonGroup(style = style.actionsButtonGroupStyle, content = it) + } + } +} + +@Composable +private fun AiUserMessageDimensions.getUploadingPaddings( + motion: Motion, +) = PaddingValues( + uploadingPaddingStart.getValueAsState(motion.context).value, + uploadingPaddingTop.getValueAsState(motion.context).value, + uploadingPaddingEnd.getValueAsState(motion.context).value, + uploadingPaddingBottom.getValueAsState(motion.context).value, +) + +@Composable +private fun AiUserMessageDimensions.getMessagePaddings( + motion: Motion, +) = PaddingValues( + messagePaddingStart.getValueAsState(motion.context).value, + messagePaddingTop.getValueAsState(motion.context).value, + messagePaddingEnd.getValueAsState(motion.context).value, + messagePaddingBottom.getValueAsState(motion.context).value, +) diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessageStyle.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessageStyle.kt new file mode 100644 index 000000000..22c2ea4d6 --- /dev/null +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/AiUserMessageStyle.kt @@ -0,0 +1,707 @@ +package com.sdds.compose.uikit.ai + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.structuralEqualityPolicy +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.sdds.api.info.compose.ApiInfo +import com.sdds.compose.uikit.ButtonGroupStyle +import com.sdds.compose.uikit.EditableStyle +import com.sdds.compose.uikit.FileStyle +import com.sdds.compose.uikit.ImageStyle +import com.sdds.compose.uikit.graphics.brush.asStatefulBrush +import com.sdds.compose.uikit.interactions.InteractiveColor +import com.sdds.compose.uikit.interactions.StatefulValue +import com.sdds.compose.uikit.interactions.asInteractive +import com.sdds.compose.uikit.interactions.asStatefulBrush +import com.sdds.compose.uikit.interactions.asStatefulValue +import com.sdds.compose.uikit.style.Style +import com.sdds.compose.uikit.style.StyleBuilder + +/** + * CompositionLocal, предоставляющий текущий [AiUserMessageStyle]. + */ +val LocalAiUserMessageStyle = compositionLocalOf(structuralEqualityPolicy()) { + AiUserMessageStyle.builder().style() +} + +/** + * Стиль компонента [AiUserMessage]. + */ +@Stable +interface AiUserMessageStyle : Style { + + /** + * Цвета компонента. + */ + val colors: AiUserMessageColors + + /** + * Размеры и отступы компонента. + */ + val dimensions: AiUserMessageDimensions + + /** + * Стиль текста в редактируемом текстовом поле. + */ + val textStyle: StatefulValue + + /** + * Формы контейнера с uploading файлами. + */ + val uploadingShape: StatefulValue + + /** + * Формы контейнера с текстовым полем. + */ + val messageShape: StatefulValue + + /** + * Стиль редактируемого поля. + */ + val editableStyle: EditableStyle + + /** + * Стиль группы действий, расположенной внизу компонента. + */ + val actionsButtonGroupStyle: ButtonGroupStyle + + /** + * Стиль группы действий, расположенной под редактируемым текстовым полем, + * отображающейся в момент радктирования сообщения. + */ + val editableActionsButtonGroupStyle: ButtonGroupStyle + + /** + * Стиль загружаемых файлов. + */ + val uploadingFileStyle: FileStyle + + /** + * Стиль загружаемых файлов в виде изображения. + */ + val uploadingImageStyle: ImageStyle + + companion object { + /** + * Возвращает builder для [AiUserMessageStyle]. + */ + fun builder(receiver: Any? = null): AiUserMessageStyleBuilder = DefaultAiUserMessageStyle.Builder(receiver) + } +} + +/** + * Цвета компонента [AiUserMessage]. + */ +@Stable +interface AiUserMessageColors { + /** + * Фон контейнера с текстовым полем. + */ + val messageBackground: StatefulValue + + /** + * Фон контейнера с uploading файлами. + */ + val uploadingBackground: StatefulValue + + /** + * Цвет текста в редактируемом текстовом поле. + */ + val text: StatefulValue +} + +/** + * Размеры компонента [AiUserMessage]. + */ +@Stable +interface AiUserMessageDimensions { + /** + * Отступ в начале внутри контейнера с uploading файлами. + */ + val uploadingPaddingStart: StatefulValue + + /** + * Отступ в конце внутри контейнера с uploading файлами. + */ + val uploadingPaddingEnd: StatefulValue + + /** + * Отступ сверху внутри контейнера с uploading файлами. + */ + val uploadingPaddingTop: StatefulValue + + /** + * Отступ снизу внутри контейнера с uploading файлами. + */ + val uploadingPaddingBottom: StatefulValue + + /** + * Отступ в начале внутри контейнера с текстовым полем. + */ + val messagePaddingStart: StatefulValue + + /** + * Отступ в конце внутри контейнера с текстовым полем. + */ + val messagePaddingEnd: StatefulValue + + /** + * Отступ сверху внутри контейнера с текстовым полем. + */ + val messagePaddingTop: StatefulValue + + /** + * Отступ снизу внутри контейнера с текстовым полем. + */ + val messagePaddingBottom: StatefulValue + + /** + * Отступ между контейнером с uploading файлами и контейнером с текстовым полем. + */ + val uploadingGroupGap: StatefulValue + + /** + * Отступ между контентом внутри контейнера с uploading файлами. + */ + val uploadingFilesGap: StatefulValue + + /** + * Отступ между редактируемым текстовым полем и группой действий, расположенной под + * редактируемым текстовым полем, отображающейся в момент радктирования сообщения. + */ + val editableActionsGap: StatefulValue + + /** + * Отступ между контейнером с текстовым полем и группой действий внизу. + */ + val actionsGap: StatefulValue +} + +/** + * Builder [AiUserMessageStyle]. + */ +@ApiInfo +interface AiUserMessageStyleBuilder : StyleBuilder { + /** + * Устанавливает цвета компонента. + */ + @Composable + fun colors(builder: @Composable AiUserMessageColorsBuilder.() -> Unit): AiUserMessageStyleBuilder + + /** + * Устанавливает размеры компонента. + */ + @Composable + fun dimensions(builder: @Composable AiUserMessageDimensionsBuilder.() -> Unit): AiUserMessageStyleBuilder + + /** + * Устанавливает стиль [textStyle] текста в редактируемом текстовом поле. + */ + fun textStyle(textStyle: TextStyle): AiUserMessageStyleBuilder = + textStyle(textStyle.asStatefulValue()) + + /** + * Устанавливает stateful стиль [textStyle] текста в редактируемом текстовом поле. + */ + fun textStyle(textStyle: StatefulValue): AiUserMessageStyleBuilder + + /** + * Устанавливает stateful форму контейнера с uploading файлами. + */ + fun uploadingShape(uploadingShape: StatefulValue): AiUserMessageStyleBuilder + + /** + * Устанавливает форму контейнера с uploading файлами. + */ + fun uploadingShape(uploadingShape: Shape): AiUserMessageStyleBuilder = + uploadingShape(uploadingShape.asStatefulValue()) + + /** + * Устанавливает stateful форму контейнера с текстовым полем. + */ + fun messageShape(messageShape: StatefulValue): AiUserMessageStyleBuilder + + /** + * Устанавливает форму контейнера с текстовым полем. + */ + fun messageShape(messageShape: Shape): AiUserMessageStyleBuilder = + messageShape(messageShape.asStatefulValue()) + + /** + * Устанавливает стиль [com.sdds.compose.uikit.Editable]. + */ + fun editableStyle(editableStyle: EditableStyle): AiUserMessageStyleBuilder + + /** + * Устанавливает стиль [com.sdds.compose.uikit.ButtonGroup] внизу компонента. + */ + fun actionsButtonGroupStyle(actionsButtonGroupStyle: ButtonGroupStyle): AiUserMessageStyleBuilder + + /** + * Устанавливает стиль [com.sdds.compose.uikit.ButtonGroup] расположенной под редактируемым текстовым полем, + * отображающейся в момент радктирования сообщения. + */ + fun editableActionsButtonGroupStyle(editableActionsButtonGroupStyle: ButtonGroupStyle): AiUserMessageStyleBuilder + + /** + * Устанавливает стиль загружаемых [com.sdds.compose.uikit.File] в контейнере с uploading файлами. + */ + fun uploadingFileStyle(uploadingFileStyle: FileStyle): AiUserMessageStyleBuilder + + /** + * Устанавливает стиль загружаемых [com.sdds.compose.uikit.Image] в контейнере с uploading файлами. + */ + fun uploadingImageStyle(uploadingImageStyle: ImageStyle): AiUserMessageStyleBuilder +} + +/** + * Builder цветов [AiUserMessage]. + */ +interface AiUserMessageColorsBuilder { + /** + * Устанавливает stateful кисть фона [background] контейнера с текстовым полем. + */ + fun messageBackground(background: StatefulValue): AiUserMessageColorsBuilder + + /** + * Устанавливает кисть фона [background] контейнера с текстовым полем. + */ + fun messageBackground(background: Brush): AiUserMessageColorsBuilder = + messageBackground(background.asStatefulValue()) + + /** + * Устанавливает цвет фона [background] контейнера с текстовым полем. + */ + fun messageBackground(background: Color): AiUserMessageColorsBuilder = + messageBackground(background.asStatefulBrush()) + + /** + * Устанавливает интерактивный цвет фона [background] контейнера с текстовым полем. + * @see InteractiveColor + */ + fun messageBackground(background: InteractiveColor): AiUserMessageColorsBuilder = + messageBackground(background.asStatefulBrush()) + + /** + * Устанавливает stateful кисть фона [background] контейнера с uploading файлами. + */ + fun uploadingBackground(background: StatefulValue): AiUserMessageColorsBuilder + + /** + * Устанавливает кисть фона [background] контейнера с uploading файлами. + */ + fun uploadingBackground(background: Brush): AiUserMessageColorsBuilder = + uploadingBackground(background.asStatefulValue()) + + /** + * Устанавливает цвет фона [background] контейнера с uploading файлами. + */ + fun uploadingBackground(background: Color): AiUserMessageColorsBuilder = + uploadingBackground(background.asStatefulBrush()) + + /** + * Устанавливает интерактивный цвет фона [background] контейнера с uploading файлами. + * @see InteractiveColor + */ + fun uploadingBackground(background: InteractiveColor): AiUserMessageColorsBuilder = + uploadingBackground(background.asStatefulBrush()) + + /** + * Устанавливает stateful цвет [textColor] кисти текста в редактируемом текстовом поле. + */ + fun textColor(textColor: StatefulValue): AiUserMessageColorsBuilder + + /** + * Устанавливает цвет [textColor] кисти текста в редактируемом текстовом поле. + */ + fun textColor(textColor: Brush): AiUserMessageColorsBuilder = + textColor(textColor.asStatefulValue()) + + /** + * Устанавливает цвет [textColor] текста в редактируемом текстовом поле. + */ + fun textColor(textColor: Color): AiUserMessageColorsBuilder = + textColor(textColor.asInteractive()) + + /** + * Устанавливает интерактивный цвет [textColor] текста в редактируемом текстовом поле. + * @see InteractiveColor + */ + fun textColor(textColor: InteractiveColor): AiUserMessageColorsBuilder = + textColor(textColor.asStatefulBrush()) + + /** + * Возвращает готовые цвета. + */ + fun build(): AiUserMessageColors +} + +/** + * Builder размеров [AiUserMessage]. + */ +interface AiUserMessageDimensionsBuilder { + /** + * Устанавливает stateful отступ в начале [paddingStart] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingStart(paddingStart: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ в начале [paddingStart] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingStart(paddingStart: Dp): AiUserMessageDimensionsBuilder = + uploadingPaddingStart(paddingStart.asStatefulValue()) + + /** + * Устанавливает stateful отступ в конце [paddingEnd] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingEnd(paddingEnd: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ в конце [paddingEnd] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingEnd(paddingEnd: Dp): AiUserMessageDimensionsBuilder = + uploadingPaddingEnd(paddingEnd.asStatefulValue()) + + /** + * Устанавливает stateful отступ сверху [paddingTop] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingTop(paddingTop: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ сверху [paddingTop] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingTop(paddingTop: Dp): AiUserMessageDimensionsBuilder = + uploadingPaddingTop(paddingTop.asStatefulValue()) + + /** + * Устанавливает stateful отступ снизу [paddingBottom] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingBottom(paddingBottom: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ снизу [paddingBottom] внутри контейнера с uploading файлами. + */ + fun uploadingPaddingBottom(paddingBottom: Dp): AiUserMessageDimensionsBuilder = + uploadingPaddingBottom(paddingBottom.asStatefulValue()) + + /** + * Устанавливает stateful отступ в начале [paddingStart] внутри контейнера с текстовым полем. + */ + fun messagePaddingStart(paddingStart: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ в начале [paddingStart] внутри контейнера с текстовым полем. + */ + fun messagePaddingStart(paddingStart: Dp): AiUserMessageDimensionsBuilder = + messagePaddingStart(paddingStart.asStatefulValue()) + + /** + * Устанавливает stateful отступ в конце [paddingEnd] внутри контейнера с текстовым полем. + */ + fun messagePaddingEnd(paddingEnd: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ в конце [paddingEnd] внутри контейнера с текстовым полем. + */ + fun messagePaddingEnd(paddingEnd: Dp): AiUserMessageDimensionsBuilder = + messagePaddingEnd(paddingEnd.asStatefulValue()) + + /** + * Устанавливает stateful отступ сверху [paddingTop] внутри контейнера с текстовым полем. + */ + fun messagePaddingTop(paddingTop: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ сверху [paddingTop] внутри контейнера с текстовым полем. + */ + fun messagePaddingTop(paddingTop: Dp): AiUserMessageDimensionsBuilder = + messagePaddingTop(paddingTop.asStatefulValue()) + + /** + * Устанавливает stateful отступ снизу [paddingBottom] внутри контейнера с текстовым полем. + */ + fun messagePaddingBottom(paddingBottom: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ снизу [paddingBottom] внутри контейнера с текстовым полем. + */ + fun messagePaddingBottom(paddingBottom: Dp): AiUserMessageDimensionsBuilder = + messagePaddingBottom(paddingBottom.asStatefulValue()) + + /** + * Устанавливает stateful отступ [gap] между контейнером с uploading файлами + * и контейнером с текстовым полем. + */ + fun uploadingGroupGap(gap: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ [gap] между контейнером с uploading файлами + * и контейнером с текстовым полем. + */ + fun uploadingGroupGap(gap: Dp): AiUserMessageDimensionsBuilder = + uploadingGroupGap(gap.asStatefulValue()) + + /** + * Устанавливает stateful отступ [gap] между контентом внутри контейнера с uploading файлами.. + */ + fun uploadingFilesGap(gap: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ [gap] между между контентом внутри контейнера с uploading файлами. + */ + fun uploadingFilesGap(gap: Dp): AiUserMessageDimensionsBuilder = + uploadingFilesGap(gap.asStatefulValue()) + + /** + * Устанавливает stateful отступ [gap] между контейнером с текстовым полем + * и группой действий внизу. + */ + fun actionsGap(gap: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ [gap] между контейнером с текстовым полем + * и группой действий внизу. + */ + fun actionsGap(gap: Dp): AiUserMessageDimensionsBuilder = + actionsGap(gap.asStatefulValue()) + + /** + * Устанавливает stateful отступ [gap] между редактируемым текстовым полем и группой действий, + * расположенной под редактируемым текстовым полем, отображающейся в момент радктирования сообщения. + */ + fun editableActionsGap(gap: StatefulValue): AiUserMessageDimensionsBuilder + + /** + * Устанавливает отступ [gap] между редактируемым текстовым полем и группой действий, + * расположенной под редактируемым текстовым полем, отображающейся в момент радктирования сообщения. + */ + fun editableActionsGap(gap: Dp): AiUserMessageDimensionsBuilder = + editableActionsGap(gap.asStatefulValue()) + + /** + * Возвращает готовые размеры. + */ + fun build(): AiUserMessageDimensions +} + +@Immutable +private data class DefaultAiUserMessageStyle( + override val colors: AiUserMessageColors, + override val dimensions: AiUserMessageDimensions, + override val textStyle: StatefulValue, + override val actionsButtonGroupStyle: ButtonGroupStyle, + override val editableActionsButtonGroupStyle: ButtonGroupStyle, + override val uploadingFileStyle: FileStyle, + override val uploadingShape: StatefulValue, + override val messageShape: StatefulValue, + override val editableStyle: EditableStyle, + override val uploadingImageStyle: ImageStyle, +) : AiUserMessageStyle { + class Builder(receiver: Any?) : AiUserMessageStyleBuilder { + private var colorsBuilder: AiUserMessageColorsBuilder = DefaultAiUserMessageColors.Builder() + private var dimensionsBuilder: AiUserMessageDimensionsBuilder = DefaultAiUserMessageDimensions.Builder() + private var textStyle: StatefulValue? = null + private var editableStyle: EditableStyle? = null + private var actionsButtonGroupStyle: ButtonGroupStyle? = null + private var editableActionsButtonGroupStyle: ButtonGroupStyle? = null + private var uploadingFileStyle: FileStyle? = null + private var uploadingImageStyle: ImageStyle? = null + private var uploadingShape: StatefulValue? = null + private var messageShape: StatefulValue? = null + + @Composable + override fun colors(builder: @Composable AiUserMessageColorsBuilder.() -> Unit) = apply { + colorsBuilder.builder() + } + + @Composable + override fun dimensions(builder: @Composable AiUserMessageDimensionsBuilder.() -> Unit) = apply { + dimensionsBuilder.builder() + } + + override fun textStyle(textStyle: StatefulValue) = apply { + this.textStyle = textStyle + } + + override fun uploadingShape(uploadingShape: StatefulValue) = apply { + this.uploadingShape = uploadingShape + } + + override fun messageShape(messageShape: StatefulValue) = apply { + this.messageShape = messageShape + } + + override fun editableStyle(editableStyle: EditableStyle) = apply { + this.editableStyle = editableStyle + } + + override fun actionsButtonGroupStyle(actionsButtonGroupStyle: ButtonGroupStyle) = apply { + this.actionsButtonGroupStyle = actionsButtonGroupStyle + } + + override fun editableActionsButtonGroupStyle(editableActionsButtonGroupStyle: ButtonGroupStyle) = apply { + this.editableActionsButtonGroupStyle = editableActionsButtonGroupStyle + } + + override fun uploadingFileStyle(uploadingFileStyle: FileStyle) = apply { + this.uploadingFileStyle = uploadingFileStyle + } + + override fun uploadingImageStyle(uploadingImageStyle: ImageStyle) = apply { + this.uploadingImageStyle = uploadingImageStyle + } + + override fun style(): AiUserMessageStyle { + return DefaultAiUserMessageStyle( + colors = colorsBuilder.build(), + dimensions = dimensionsBuilder.build(), + textStyle = textStyle ?: TextStyle.Default.asStatefulValue(), + editableStyle = editableStyle ?: EditableStyle.builder().style(), + actionsButtonGroupStyle = actionsButtonGroupStyle ?: ButtonGroupStyle.builder().style(), + editableActionsButtonGroupStyle = editableActionsButtonGroupStyle ?: ButtonGroupStyle.builder().style(), + uploadingFileStyle = uploadingFileStyle ?: FileStyle.builder().style(), + uploadingShape = uploadingShape ?: RoundedCornerShape(15).asStatefulValue(), + messageShape = messageShape ?: RoundedCornerShape(15).asStatefulValue(), + uploadingImageStyle = uploadingImageStyle ?: ImageStyle.builder().style(), + ) + } + } +} + +@Immutable +private data class DefaultAiUserMessageColors( + override val messageBackground: StatefulValue, + override val text: StatefulValue, + override val uploadingBackground: StatefulValue, +) : AiUserMessageColors { + class Builder : AiUserMessageColorsBuilder { + private var messageBackground: StatefulValue? = null + private var textColor: StatefulValue? = null + private var uploadingBackground: StatefulValue? = null + + override fun messageBackground(background: StatefulValue) = apply { + this.messageBackground = background + } + + override fun uploadingBackground(background: StatefulValue) = apply { + this.uploadingBackground = background + } + + override fun textColor(textColor: StatefulValue) = apply { + this.textColor = textColor + } + + override fun build(): AiUserMessageColors { + return DefaultAiUserMessageColors( + messageBackground = messageBackground ?: Color.Transparent.asStatefulBrush(), + text = textColor ?: Color.Black.asStatefulBrush(), + uploadingBackground = uploadingBackground ?: Color.Transparent.asStatefulBrush(), + ) + } + } +} + +@Immutable +private data class DefaultAiUserMessageDimensions( + override val uploadingPaddingStart: StatefulValue, + override val uploadingPaddingEnd: StatefulValue, + override val uploadingPaddingTop: StatefulValue, + override val uploadingPaddingBottom: StatefulValue, + override val uploadingGroupGap: StatefulValue, + override val editableActionsGap: StatefulValue, + override val actionsGap: StatefulValue, + override val uploadingFilesGap: StatefulValue, + override val messagePaddingStart: StatefulValue, + override val messagePaddingEnd: StatefulValue, + override val messagePaddingTop: StatefulValue, + override val messagePaddingBottom: StatefulValue, +) : AiUserMessageDimensions { + class Builder : AiUserMessageDimensionsBuilder { + private var paddingStart: StatefulValue? = null + private var paddingEnd: StatefulValue? = null + private var paddingTop: StatefulValue? = null + private var paddingBottom: StatefulValue? = null + private var uploadingGroupGap: StatefulValue? = null + private var actionsGap: StatefulValue? = null + private var editableActionsGap: StatefulValue? = null + private var uploadingFilesGap: StatefulValue? = null + private var messagePaddingStart: StatefulValue? = null + private var messagePaddingEnd: StatefulValue? = null + private var messagePaddingTop: StatefulValue? = null + private var messagePaddingBottom: StatefulValue? = null + + override fun uploadingPaddingStart(paddingStart: StatefulValue) = apply { + this.paddingStart = paddingStart + } + + override fun uploadingPaddingEnd(paddingEnd: StatefulValue) = apply { + this.paddingEnd = paddingEnd + } + + override fun uploadingPaddingTop(paddingTop: StatefulValue) = apply { + this.paddingTop = paddingTop + } + + override fun uploadingPaddingBottom(paddingBottom: StatefulValue) = apply { + this.paddingBottom = paddingBottom + } + + override fun messagePaddingStart(paddingStart: StatefulValue) = apply { + this.messagePaddingStart = paddingStart + } + + override fun messagePaddingEnd(paddingEnd: StatefulValue) = apply { + this.messagePaddingEnd = paddingEnd + } + + override fun messagePaddingTop(paddingTop: StatefulValue) = apply { + this.messagePaddingTop = paddingTop + } + + override fun messagePaddingBottom(paddingBottom: StatefulValue) = apply { + this.messagePaddingBottom = paddingBottom + } + + override fun uploadingGroupGap(gap: StatefulValue) = apply { + this.uploadingGroupGap = gap + } + + override fun uploadingFilesGap(gap: StatefulValue) = apply { + this.uploadingFilesGap = gap + } + + override fun actionsGap(gap: StatefulValue) = apply { + this.actionsGap = gap + } + + override fun editableActionsGap(gap: StatefulValue) = apply { + this.editableActionsGap = gap + } + + override fun build(): AiUserMessageDimensions { + return DefaultAiUserMessageDimensions( + uploadingPaddingStart = paddingStart ?: 2.dp.asStatefulValue(), + uploadingPaddingEnd = paddingEnd ?: 2.dp.asStatefulValue(), + uploadingPaddingTop = paddingTop ?: 2.dp.asStatefulValue(), + uploadingPaddingBottom = paddingBottom ?: 2.dp.asStatefulValue(), + uploadingGroupGap = uploadingGroupGap ?: 10.dp.asStatefulValue(), + editableActionsGap = actionsGap ?: 10.dp.asStatefulValue(), + actionsGap = actionsGap ?: 10.dp.asStatefulValue(), + uploadingFilesGap = uploadingFilesGap ?: 4.dp.asStatefulValue(), + messagePaddingStart = messagePaddingStart ?: 10.dp.asStatefulValue(), + messagePaddingEnd = messagePaddingEnd ?: 10.dp.asStatefulValue(), + messagePaddingTop = messagePaddingTop ?: 10.dp.asStatefulValue(), + messagePaddingBottom = messagePaddingBottom ?: 10.dp.asStatefulValue(), + ) + } + } +} diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/AiAnswerMotion.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aianswer/AiAnswerMotion.kt similarity index 96% rename from sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/AiAnswerMotion.kt rename to sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aianswer/AiAnswerMotion.kt index 1bbecaf85..29b3ece27 100644 --- a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/AiAnswerMotion.kt +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aianswer/AiAnswerMotion.kt @@ -1,4 +1,4 @@ -package com.sdds.compose.uikit.ai.motion +package com.sdds.compose.uikit.ai.motion.aianswer import androidx.compose.runtime.Composable import androidx.compose.runtime.NonRestartableComposable diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/AiAnswerMotionStyle.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aianswer/AiAnswerMotionStyle.kt similarity index 99% rename from sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/AiAnswerMotionStyle.kt rename to sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aianswer/AiAnswerMotionStyle.kt index e9efefdea..3974e92a0 100644 --- a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/AiAnswerMotionStyle.kt +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aianswer/AiAnswerMotionStyle.kt @@ -1,4 +1,4 @@ -package com.sdds.compose.uikit.ai.motion +package com.sdds.compose.uikit.ai.motion.aianswer import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotion.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotion.kt new file mode 100644 index 000000000..c53678eed7 --- /dev/null +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotion.kt @@ -0,0 +1,23 @@ +package com.sdds.compose.uikit.ai.motion.aiusermessage + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.NonRestartableComposable +import com.sdds.compose.uikit.motion.Motion +import com.sdds.compose.uikit.motion.MotionContext +import com.sdds.compose.uikit.motion.rememberMotion +import com.sdds.compose.uikit.motion.rememberMotionContext + +/** + * Создаёт [Motion] для компонента AiUserMessage. + * + * @param style стиль анимации [AiUserMessageMotionStyle] + * @param motionContext контекст анимации + */ +@Composable +@NonRestartableComposable +fun rememberAiUserMessageMotion( + style: AiUserMessageMotionStyle = LocalAiUserMessageMotionStyle.current, + motionContext: MotionContext = rememberMotionContext(), +): Motion { + return rememberMotion(style, motionContext) +} diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotionStyle.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotionStyle.kt new file mode 100644 index 000000000..9c3ccd411 --- /dev/null +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/ai/motion/aiusermessage/AiUserMessageMotionStyle.kt @@ -0,0 +1,119 @@ +package com.sdds.compose.uikit.ai.motion.aiusermessage + +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.text.TextStyle +import com.sdds.compose.uikit.ai.AiUserMessage +import com.sdds.compose.uikit.motion.MotionProperty +import com.sdds.compose.uikit.motion.MotionStyle +import com.sdds.compose.uikit.motion.MotionStyleBuilder +import com.sdds.compose.uikit.motion.noMotion + +/** + * CompositionLocal, предоставляющий текущий [AiUserMessageMotionStyle]. + */ +val LocalAiUserMessageMotionStyle = compositionLocalOf { + AiUserMessageMotionStyle.builder().style() +} + +/** + * Motion-стиль компонента [AiUserMessage]. + */ +@Stable +interface AiUserMessageMotionStyle : MotionStyle { + /** + * Анимация фона контейнера с uploading файлами. + */ + val uploadingBackground: MotionProperty + + /** + * Анимация фона контейнера с редактируемым текстовым полем. + */ + val messageBackground: MotionProperty + + /** + * Анимация цвета редактируемого текста. + */ + val textColor: MotionProperty + + /** + * Анимация стиля редактируемого текста. + */ + val textStyle: MotionProperty + + companion object { + /** + * Возвращает builder для [AiUserMessageMotionStyle]. + */ + fun builder(): AiUserMessageMotionStyleBuilder = DefaultAiUserMessageMotionStyle.Builder() + } +} + +/** + * Builder [AiUserMessageMotionStyle]. + */ +interface AiUserMessageMotionStyleBuilder : MotionStyleBuilder { + + /** + * Устанавливает анимацию фона контейнера с uploading файлами. + */ + fun uploadingBackground(background: MotionProperty): AiUserMessageMotionStyleBuilder + + /** + * Устанавливает анимацию фона контейнера с редактируемым текстовым полем. + */ + fun messageBackground(background: MotionProperty): AiUserMessageMotionStyleBuilder + + /** + * Устанавливает анимацию цвета редактируемого текста. + */ + fun textColor(textColor: MotionProperty): AiUserMessageMotionStyleBuilder + + /** + * Устанавливает анимацию стиля редактируемого текста. + */ + fun textStyle(textStyle: MotionProperty): AiUserMessageMotionStyleBuilder +} + +@Immutable +private data class DefaultAiUserMessageMotionStyle( + override val uploadingBackground: MotionProperty, + override val messageBackground: MotionProperty, + override val textColor: MotionProperty, + override val textStyle: MotionProperty, +) : AiUserMessageMotionStyle { + class Builder : AiUserMessageMotionStyleBuilder { + private var uploadingBackground: MotionProperty? = null + private var messageBackground: MotionProperty? = null + private var textColor: MotionProperty? = null + private var textStyle: MotionProperty? = null + + override fun messageBackground(background: MotionProperty) = apply { + this.messageBackground = background + } + + override fun textColor(textColor: MotionProperty) = apply { + this.textColor = textColor + } + + override fun uploadingBackground(background: MotionProperty) = apply { + this.uploadingBackground = background + } + + override fun textStyle(textStyle: MotionProperty) = apply { + this.textStyle = textStyle + } + + @Suppress("CyclomaticComplexMethod") + override fun style(): AiUserMessageMotionStyle { + return DefaultAiUserMessageMotionStyle( + uploadingBackground = uploadingBackground ?: noMotion(), + messageBackground = messageBackground ?: noMotion(), + textColor = textColor ?: noMotion(), + textStyle = textStyle ?: noMotion(), + ) + } + } +} diff --git a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/internal/ai/AiAnswerContent.kt b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/internal/ai/AiAnswerContent.kt index dde99d66e..5f05313ab 100644 --- a/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/internal/ai/AiAnswerContent.kt +++ b/sdds-core/uikit-compose/src/main/kotlin/com/sdds/compose/uikit/internal/ai/AiAnswerContent.kt @@ -32,7 +32,7 @@ import com.sdds.compose.uikit.ai.AiAnswerErrorScope import com.sdds.compose.uikit.ai.AiAnswerLoadingScope import com.sdds.compose.uikit.ai.AiAnswerState import com.sdds.compose.uikit.ai.AiAnswerStyle -import com.sdds.compose.uikit.ai.motion.AiAnswerMotionStyle +import com.sdds.compose.uikit.ai.motion.aianswer.AiAnswerMotionStyle import com.sdds.compose.uikit.graphics.backgroundBrush import com.sdds.compose.uikit.internal.common.FlowRowScope import com.sdds.compose.uikit.internal.common.LocalFlowRowMaxItemsInEachRow diff --git a/tokens/sdds-sbcom-compose/screenshots-compose/testDropdownMenuStrictClippedPlacementStartAlignmentCenter_light.png b/tokens/sdds-sbcom-compose/screenshots-compose/testDropdownMenuStrictClippedPlacementStartAlignmentCenter_light.png index bbca8acccdb0f6e6f5ffd4d889637d4f52577536..601d1d1724cd2f11a14e46034b73361c23b7cdc5 100644 GIT binary patch literal 49633 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
51=R;EmfhCtJ5 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 X*Z==up!VOzsvj?X46ppZ9q9i6qRS00 literal 45309 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 Fe*oE}-UI*u diff --git a/tokens/sdds.serv.compose/config-info-compose.json b/tokens/sdds.serv.compose/config-info-compose.json index 6fb2047b4..f9d0f5f6a 100644 --- a/tokens/sdds.serv.compose/config-info-compose.json +++ b/tokens/sdds.serv.compose/config-info-compose.json @@ -49347,6 +49347,78 @@ } ] }, + { + "key": "button-group", + "coreName": "ButtonGroup", + "styleName": "AiUserMessageEmbeddedIconButtonGroup", + "props": [ + { + "name": "size", + "values": [ + "s", + "m" + ], + "defaultValue": "m" + } + ], + "styleApi": { + "packageName": "com.sdds.serv.styles.buttongroup", + "stylesClassName": "ButtonGroupStyles", + "stylesClassQualifiedName": "com.sdds.serv.styles.buttongroup.ButtonGroupStyles", + "receiverClassName": "ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroup", + "receiverClassQualifiedName": "com.sdds.serv.styles.buttongroup.ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroup", + "returnTypeName": "ButtonGroupStyle", + "returnTypeQualifiedName": "com.sdds.compose.uikit.ButtonGroupStyle", + "modifyReceiverTypeName": "ButtonGroupStyleBuilder", + "modifyReceiverTypeQualifiedName": "com.sdds.compose.uikit.ButtonGroupStyleBuilder", + "holderName": "AiUserMessageEmbeddedIconButtonGroup", + "params": [ + { + "name": "size", + "type": "enum", + "required": false, + "typeName": "AiUserMessageEmbeddedIconButtonGroupSize", + "typeQualifiedName": "com.sdds.serv.styles.buttongroup.AiUserMessageEmbeddedIconButtonGroupSize", + "defaultValue": { + "value": "m", + "codeName": "M" + }, + "values": [ + { + "value": "s", + "codeName": "S" + }, + { + "value": "m", + "codeName": "M" + } + ] + } + ] + }, + "variations": [ + { + "name": "s", + "composeReference": "AiUserMessageEmbeddedIconButtonGroup.S", + "props": [ + { + "name": "size", + "value": "s" + } + ] + }, + { + "name": "m", + "composeReference": "AiUserMessageEmbeddedIconButtonGroup.M", + "props": [ + { + "name": "size", + "value": "m" + } + ] + } + ] + }, { "key": "tab-bar", "coreName": "TabBar", @@ -60800,19 +60872,20 @@ "packageName": "com.sdds.serv.styles.editable", "stylesClassName": "EditableStyles", "stylesClassQualifiedName": "com.sdds.serv.styles.editable.EditableStyles", - "receiverClassName": "EditableStyles.Companion", - "receiverClassQualifiedName": "com.sdds.serv.styles.editable.EditableStyles.Companion", + "receiverClassName": "EditableStyles.Default", + "receiverClassQualifiedName": "com.sdds.serv.styles.editable.EditableStyles.Default", "returnTypeName": "EditableStyle", "returnTypeQualifiedName": "com.sdds.compose.uikit.EditableStyle", "modifyReceiverTypeName": "EditableStyleBuilder", "modifyReceiverTypeQualifiedName": "com.sdds.compose.uikit.EditableStyleBuilder", + "holderName": "Default", "params": [ { "name": "size", "type": "enum", "required": false, - "typeName": "EditableSize", - "typeQualifiedName": "com.sdds.serv.styles.editable.EditableSize", + "typeName": "EditableDefaultSize", + "typeQualifiedName": "com.sdds.serv.styles.editable.EditableDefaultSize", "defaultValue": { "value": "h1", "codeName": "H1" @@ -60965,6 +61038,123 @@ } ] }, + { + "key": "editable", + "coreName": "Editable", + "styleName": "AiUserMessageEditable", + "props": [ + { + "name": "size", + "values": [ + "xl", + "l", + "m", + "s", + "xs" + ], + "defaultValue": "m" + } + ], + "styleApi": { + "packageName": "com.sdds.serv.styles.editable", + "stylesClassName": "EditableStyles", + "stylesClassQualifiedName": "com.sdds.serv.styles.editable.EditableStyles", + "receiverClassName": "EditableStyles.AiUserMessageEditable", + "receiverClassQualifiedName": "com.sdds.serv.styles.editable.EditableStyles.AiUserMessageEditable", + "returnTypeName": "EditableStyle", + "returnTypeQualifiedName": "com.sdds.compose.uikit.EditableStyle", + "modifyReceiverTypeName": "EditableStyleBuilder", + "modifyReceiverTypeQualifiedName": "com.sdds.compose.uikit.EditableStyleBuilder", + "holderName": "AiUserMessageEditable", + "params": [ + { + "name": "size", + "type": "enum", + "required": false, + "typeName": "AiUserMessageEditableSize", + "typeQualifiedName": "com.sdds.serv.styles.editable.AiUserMessageEditableSize", + "defaultValue": { + "value": "m", + "codeName": "M" + }, + "values": [ + { + "value": "xl", + "codeName": "Xl" + }, + { + "value": "l", + "codeName": "L" + }, + { + "value": "m", + "codeName": "M" + }, + { + "value": "s", + "codeName": "S" + }, + { + "value": "xs", + "codeName": "Xs" + } + ] + } + ] + }, + "variations": [ + { + "name": "xl", + "composeReference": "AiUserMessageEditable.Xl", + "props": [ + { + "name": "size", + "value": "xl" + } + ] + }, + { + "name": "l", + "composeReference": "AiUserMessageEditable.L", + "props": [ + { + "name": "size", + "value": "l" + } + ] + }, + { + "name": "m", + "composeReference": "AiUserMessageEditable.M", + "props": [ + { + "name": "size", + "value": "m" + } + ] + }, + { + "name": "s", + "composeReference": "AiUserMessageEditable.S", + "props": [ + { + "name": "size", + "value": "s" + } + ] + }, + { + "name": "xs", + "composeReference": "AiUserMessageEditable.Xs", + "props": [ + { + "name": "size", + "value": "xs" + } + ] + } + ] + }, { "key": "select", "coreName": "Select", @@ -63026,6 +63216,2339 @@ "composeReference": "Splitter.Default" } ] + }, + { + "key": "ai-user-message", + "coreName": "AiUserMessage", + "styleName": "AiUserMessage", + "props": [ + { + "name": "size", + "values": [ + "xl", + "l", + "m", + "s", + "xs" + ], + "defaultValue": "m" + }, + { + "name": "content-type", + "values": [ + "image", + "file" + ], + "defaultValue": "image" + }, + { + "name": "content-view", + "values": [ + "default", + "secondary" + ], + "defaultValue": "default" + }, + { + "name": "view", + "values": [ + "default", + "secondary", + "accent", + "positive", + "negative", + "warning" + ], + "defaultValue": "default" + } + ], + "styleApi": { + "packageName": "com.sdds.serv.styles.aiusermessage", + "stylesClassName": "AiUserMessageStyles", + "stylesClassQualifiedName": "com.sdds.serv.styles.aiusermessage.AiUserMessageStyles", + "receiverClassName": "AiUserMessageStyles.Companion", + "receiverClassQualifiedName": "com.sdds.serv.styles.aiusermessage.AiUserMessageStyles.Companion", + "returnTypeName": "AiUserMessageStyle", + "returnTypeQualifiedName": "com.sdds.compose.uikit.ai.AiUserMessageStyle", + "modifyReceiverTypeName": "AiUserMessageStyleBuilder", + "modifyReceiverTypeQualifiedName": "com.sdds.compose.uikit.ai.AiUserMessageStyleBuilder", + "params": [ + { + "name": "size", + "type": "enum", + "required": false, + "typeName": "AiUserMessageSize", + "typeQualifiedName": "com.sdds.serv.styles.aiusermessage.AiUserMessageSize", + "defaultValue": { + "value": "m", + "codeName": "M" + }, + "values": [ + { + "value": "xl", + "codeName": "Xl" + }, + { + "value": "l", + "codeName": "L" + }, + { + "value": "m", + "codeName": "M" + }, + { + "value": "s", + "codeName": "S" + }, + { + "value": "xs", + "codeName": "Xs" + } + ] + }, + { + "name": "contentType", + "type": "enum", + "required": false, + "typeName": "AiUserMessageContentType", + "typeQualifiedName": "com.sdds.serv.styles.aiusermessage.AiUserMessageContentType", + "defaultValue": { + "value": "image", + "codeName": "Image" + }, + "values": [ + { + "value": "image", + "codeName": "Image" + }, + { + "value": "file", + "codeName": "File" + } + ] + }, + { + "name": "contentView", + "type": "enum", + "required": false, + "typeName": "AiUserMessageContentView", + "typeQualifiedName": "com.sdds.serv.styles.aiusermessage.AiUserMessageContentView", + "defaultValue": { + "value": "default", + "codeName": "Default" + }, + "values": [ + { + "value": "default", + "codeName": "Default" + }, + { + "value": "secondary", + "codeName": "Secondary" + } + ] + }, + { + "name": "view", + "type": "enum", + "required": false, + "typeName": "AiUserMessageView", + "typeQualifiedName": "com.sdds.serv.styles.aiusermessage.AiUserMessageView", + "defaultValue": { + "value": "default", + "codeName": "Default" + }, + "values": [ + { + "value": "default", + "codeName": "Default" + }, + { + "value": "secondary", + "codeName": "Secondary" + }, + { + "value": "accent", + "codeName": "Accent" + }, + { + "value": "positive", + "codeName": "Positive" + }, + { + "value": "negative", + "codeName": "Negative" + }, + { + "value": "warning", + "codeName": "Warning" + } + ] + } + ] + }, + "variations": [ + { + "name": "xl.default", + "composeReference": "AiUserMessage.Xl.Default", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xl.secondary", + "composeReference": "AiUserMessage.Xl.Secondary", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xl.accent", + "composeReference": "AiUserMessage.Xl.Accent", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xl.positive", + "composeReference": "AiUserMessage.Xl.Positive", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xl.negative", + "composeReference": "AiUserMessage.Xl.Negative", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xl.warning", + "composeReference": "AiUserMessage.Xl.Warning", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "xl.content-view-secondary.default", + "composeReference": "AiUserMessage.Xl.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xl.content-view-secondary.secondary", + "composeReference": "AiUserMessage.Xl.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xl.content-view-secondary.accent", + "composeReference": "AiUserMessage.Xl.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xl.content-view-secondary.positive", + "composeReference": "AiUserMessage.Xl.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xl.content-view-secondary.negative", + "composeReference": "AiUserMessage.Xl.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xl.content-view-secondary.warning", + "composeReference": "AiUserMessage.Xl.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "xl.content-type-file.default", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.Default", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xl.content-type-file.secondary", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.Secondary", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xl.content-type-file.accent", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.Accent", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xl.content-type-file.positive", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.Positive", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xl.content-type-file.negative", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.Negative", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xl.content-type-file.warning", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.Warning", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "xl.content-type-file.content-view-secondary.default", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xl.content-type-file.content-view-secondary.secondary", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xl.content-type-file.content-view-secondary.accent", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xl.content-type-file.content-view-secondary.positive", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xl.content-type-file.content-view-secondary.negative", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xl.content-type-file.content-view-secondary.warning", + "composeReference": "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "xl" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "l.default", + "composeReference": "AiUserMessage.L.Default", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "l.secondary", + "composeReference": "AiUserMessage.L.Secondary", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "l.accent", + "composeReference": "AiUserMessage.L.Accent", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "l.positive", + "composeReference": "AiUserMessage.L.Positive", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "l.negative", + "composeReference": "AiUserMessage.L.Negative", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "l.warning", + "composeReference": "AiUserMessage.L.Warning", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "l.content-view-secondary.default", + "composeReference": "AiUserMessage.L.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "l.content-view-secondary.secondary", + "composeReference": "AiUserMessage.L.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "l.content-view-secondary.accent", + "composeReference": "AiUserMessage.L.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "l.content-view-secondary.positive", + "composeReference": "AiUserMessage.L.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "l.content-view-secondary.negative", + "composeReference": "AiUserMessage.L.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "l.content-view-secondary.warning", + "composeReference": "AiUserMessage.L.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "l.content-type-file.default", + "composeReference": "AiUserMessage.L.ContentTypeFile.Default", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "l.content-type-file.secondary", + "composeReference": "AiUserMessage.L.ContentTypeFile.Secondary", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "l.content-type-file.accent", + "composeReference": "AiUserMessage.L.ContentTypeFile.Accent", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "l.content-type-file.positive", + "composeReference": "AiUserMessage.L.ContentTypeFile.Positive", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "l.content-type-file.negative", + "composeReference": "AiUserMessage.L.ContentTypeFile.Negative", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "l.content-type-file.warning", + "composeReference": "AiUserMessage.L.ContentTypeFile.Warning", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "l.content-type-file.content-view-secondary.default", + "composeReference": "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "l.content-type-file.content-view-secondary.secondary", + "composeReference": "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "l.content-type-file.content-view-secondary.accent", + "composeReference": "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "l.content-type-file.content-view-secondary.positive", + "composeReference": "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "l.content-type-file.content-view-secondary.negative", + "composeReference": "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "l.content-type-file.content-view-secondary.warning", + "composeReference": "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "l" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "m.default", + "composeReference": "AiUserMessage.M.Default", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "m.secondary", + "composeReference": "AiUserMessage.M.Secondary", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "m.accent", + "composeReference": "AiUserMessage.M.Accent", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "m.positive", + "composeReference": "AiUserMessage.M.Positive", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "m.negative", + "composeReference": "AiUserMessage.M.Negative", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "m.warning", + "composeReference": "AiUserMessage.M.Warning", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "m.content-view-secondary.default", + "composeReference": "AiUserMessage.M.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "m.content-view-secondary.secondary", + "composeReference": "AiUserMessage.M.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "m.content-view-secondary.accent", + "composeReference": "AiUserMessage.M.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "m.content-view-secondary.positive", + "composeReference": "AiUserMessage.M.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "m.content-view-secondary.negative", + "composeReference": "AiUserMessage.M.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "m.content-view-secondary.warning", + "composeReference": "AiUserMessage.M.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "m.content-type-file.default", + "composeReference": "AiUserMessage.M.ContentTypeFile.Default", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "m.content-type-file.secondary", + "composeReference": "AiUserMessage.M.ContentTypeFile.Secondary", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "m.content-type-file.accent", + "composeReference": "AiUserMessage.M.ContentTypeFile.Accent", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "m.content-type-file.positive", + "composeReference": "AiUserMessage.M.ContentTypeFile.Positive", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "m.content-type-file.negative", + "composeReference": "AiUserMessage.M.ContentTypeFile.Negative", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "m.content-type-file.warning", + "composeReference": "AiUserMessage.M.ContentTypeFile.Warning", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "m.content-type-file.content-view-secondary.default", + "composeReference": "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "m.content-type-file.content-view-secondary.secondary", + "composeReference": "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "m.content-type-file.content-view-secondary.accent", + "composeReference": "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "m.content-type-file.content-view-secondary.positive", + "composeReference": "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "m.content-type-file.content-view-secondary.negative", + "composeReference": "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "m.content-type-file.content-view-secondary.warning", + "composeReference": "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "m" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "s.default", + "composeReference": "AiUserMessage.S.Default", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "s.secondary", + "composeReference": "AiUserMessage.S.Secondary", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "s.accent", + "composeReference": "AiUserMessage.S.Accent", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "s.positive", + "composeReference": "AiUserMessage.S.Positive", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "s.negative", + "composeReference": "AiUserMessage.S.Negative", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "s.warning", + "composeReference": "AiUserMessage.S.Warning", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "s.content-view-secondary.default", + "composeReference": "AiUserMessage.S.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "s.content-view-secondary.secondary", + "composeReference": "AiUserMessage.S.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "s.content-view-secondary.accent", + "composeReference": "AiUserMessage.S.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "s.content-view-secondary.positive", + "composeReference": "AiUserMessage.S.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "s.content-view-secondary.negative", + "composeReference": "AiUserMessage.S.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "s.content-view-secondary.warning", + "composeReference": "AiUserMessage.S.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "s.content-type-file.default", + "composeReference": "AiUserMessage.S.ContentTypeFile.Default", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "s.content-type-file.secondary", + "composeReference": "AiUserMessage.S.ContentTypeFile.Secondary", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "s.content-type-file.accent", + "composeReference": "AiUserMessage.S.ContentTypeFile.Accent", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "s.content-type-file.positive", + "composeReference": "AiUserMessage.S.ContentTypeFile.Positive", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "s.content-type-file.negative", + "composeReference": "AiUserMessage.S.ContentTypeFile.Negative", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "s.content-type-file.warning", + "composeReference": "AiUserMessage.S.ContentTypeFile.Warning", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "s.content-type-file.content-view-secondary.default", + "composeReference": "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "s.content-type-file.content-view-secondary.secondary", + "composeReference": "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "s.content-type-file.content-view-secondary.accent", + "composeReference": "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "s.content-type-file.content-view-secondary.positive", + "composeReference": "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "s.content-type-file.content-view-secondary.negative", + "composeReference": "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "s.content-type-file.content-view-secondary.warning", + "composeReference": "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "s" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "xs.default", + "composeReference": "AiUserMessage.Xs.Default", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xs.secondary", + "composeReference": "AiUserMessage.Xs.Secondary", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xs.accent", + "composeReference": "AiUserMessage.Xs.Accent", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xs.positive", + "composeReference": "AiUserMessage.Xs.Positive", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xs.negative", + "composeReference": "AiUserMessage.Xs.Negative", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xs.warning", + "composeReference": "AiUserMessage.Xs.Warning", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "xs.content-view-secondary.default", + "composeReference": "AiUserMessage.Xs.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xs.content-view-secondary.secondary", + "composeReference": "AiUserMessage.Xs.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xs.content-view-secondary.accent", + "composeReference": "AiUserMessage.Xs.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xs.content-view-secondary.positive", + "composeReference": "AiUserMessage.Xs.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xs.content-view-secondary.negative", + "composeReference": "AiUserMessage.Xs.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xs.content-view-secondary.warning", + "composeReference": "AiUserMessage.Xs.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "xs.content-type-file.default", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.Default", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xs.content-type-file.secondary", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.Secondary", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xs.content-type-file.accent", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.Accent", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xs.content-type-file.positive", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.Positive", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xs.content-type-file.negative", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.Negative", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xs.content-type-file.warning", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.Warning", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "view", + "value": "warning" + } + ] + }, + { + "name": "xs.content-type-file.content-view-secondary.default", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Default", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "default" + } + ] + }, + { + "name": "xs.content-type-file.content-view-secondary.secondary", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Secondary", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "secondary" + } + ] + }, + { + "name": "xs.content-type-file.content-view-secondary.accent", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Accent", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "accent" + } + ] + }, + { + "name": "xs.content-type-file.content-view-secondary.positive", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Positive", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "positive" + } + ] + }, + { + "name": "xs.content-type-file.content-view-secondary.negative", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Negative", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "negative" + } + ] + }, + { + "name": "xs.content-type-file.content-view-secondary.warning", + "composeReference": "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Warning", + "props": [ + { + "name": "size", + "value": "xs" + }, + { + "name": "content-type", + "value": "file" + }, + { + "name": "content-view", + "value": "secondary" + }, + { + "name": "view", + "value": "warning" + } + ] + } + ] } ] } \ No newline at end of file diff --git a/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageEditableVariationsCompose.kt b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageEditableVariationsCompose.kt new file mode 100644 index 000000000..abff34a36 --- /dev/null +++ b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageEditableVariationsCompose.kt @@ -0,0 +1,54 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +@file:Suppress( + "UndocumentedPublicClass", + "UndocumentedPublicProperty", + "UndocumentedPublicFunction", + "CyclomaticComplexMethod", + "ktlint:standard:max-line-length", +) + +package com.sdds.serv.integration + +import com.sdds.compose.sandbox.ComposeStyleProvider +import com.sdds.compose.sandbox.ComposeStyleReference +import com.sdds.compose.uikit.EditableStyle +import com.sdds.compose.uikit.style.style +import com.sdds.sandbox.Property +import com.sdds.serv.styles.editable.AiUserMessageEditable +import com.sdds.serv.styles.editable.AiUserMessageEditableSize +import com.sdds.serv.styles.editable.EditableStyles +import com.sdds.serv.styles.editable.L +import com.sdds.serv.styles.editable.M +import com.sdds.serv.styles.editable.S +import com.sdds.serv.styles.editable.Xl +import com.sdds.serv.styles.editable.Xs +import com.sdds.serv.styles.editable.resolve + +internal object SddsServAiUserMessageEditableVariationsCompose : ComposeStyleProvider() { + override val bindings: Set> = + setOf( + Property.SingleChoiceProperty(name = "size", value = "M", variants = listOf("Xl", "L", "M", "S", "Xs")), + ) + + override val variations: Map> = + mapOf( + "AiUserMessageEditable.Xl" to ComposeStyleReference { AiUserMessageEditable.Xl.style() }, + "AiUserMessageEditable.L" to ComposeStyleReference { AiUserMessageEditable.L.style() }, + "AiUserMessageEditable.M" to ComposeStyleReference { AiUserMessageEditable.M.style() }, + "AiUserMessageEditable.S" to ComposeStyleReference { AiUserMessageEditable.S.style() }, + "AiUserMessageEditable.Xs" to ComposeStyleReference { AiUserMessageEditable.Xs.style() }, + ) + + override fun resolveStyleKey(bindings: Map): String { + return EditableStyles.AiUserMessageEditable.resolve( + size = when (bindings["size"]?.toString()) { + "Xl" -> AiUserMessageEditableSize.Xl + "L" -> AiUserMessageEditableSize.L + "M" -> AiUserMessageEditableSize.M + "S" -> AiUserMessageEditableSize.S + "Xs" -> AiUserMessageEditableSize.Xs + else -> AiUserMessageEditableSize.M + }, + ).key + } +} diff --git a/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageVariationsCompose.kt b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageVariationsCompose.kt new file mode 100644 index 000000000..1ed685601 --- /dev/null +++ b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServAiUserMessageVariationsCompose.kt @@ -0,0 +1,368 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +@file:Suppress( + "UndocumentedPublicClass", + "UndocumentedPublicProperty", + "UndocumentedPublicFunction", + "CyclomaticComplexMethod", + "ktlint:standard:max-line-length", +) + +package com.sdds.serv.integration + +import com.sdds.compose.sandbox.ComposeStyleProvider +import com.sdds.compose.sandbox.ComposeStyleReference +import com.sdds.compose.uikit.ai.AiUserMessageStyle +import com.sdds.compose.uikit.style.style +import com.sdds.sandbox.Property +import com.sdds.serv.styles.aiusermessage.Accent +import com.sdds.serv.styles.aiusermessage.AiUserMessage +import com.sdds.serv.styles.aiusermessage.AiUserMessageContentType +import com.sdds.serv.styles.aiusermessage.AiUserMessageContentView +import com.sdds.serv.styles.aiusermessage.AiUserMessageSize +import com.sdds.serv.styles.aiusermessage.AiUserMessageStyles +import com.sdds.serv.styles.aiusermessage.AiUserMessageView +import com.sdds.serv.styles.aiusermessage.ContentTypeFile +import com.sdds.serv.styles.aiusermessage.ContentViewSecondary +import com.sdds.serv.styles.aiusermessage.Default +import com.sdds.serv.styles.aiusermessage.L +import com.sdds.serv.styles.aiusermessage.M +import com.sdds.serv.styles.aiusermessage.Negative +import com.sdds.serv.styles.aiusermessage.Positive +import com.sdds.serv.styles.aiusermessage.S +import com.sdds.serv.styles.aiusermessage.Secondary +import com.sdds.serv.styles.aiusermessage.Warning +import com.sdds.serv.styles.aiusermessage.Xl +import com.sdds.serv.styles.aiusermessage.Xs +import com.sdds.serv.styles.aiusermessage.resolve + +internal object SddsServAiUserMessageVariationsCompose : ComposeStyleProvider() { + override val bindings: Set> = + setOf( + Property.SingleChoiceProperty(name = "size", value = "M", variants = listOf("Xl", "L", "M", "S", "Xs")), + Property.SingleChoiceProperty(name = "contentType", value = "Image", variants = listOf("Image", "File")), + Property.SingleChoiceProperty( + name = "contentView", + value = "Default", + variants = listOf("Default", "Secondary"), + ), + Property.SingleChoiceProperty( + name = "view", + value = "Default", + variants = listOf("Default", "Secondary", "Accent", "Positive", "Negative", "Warning"), + ), + ) + + override val variations: Map> = + mapOf( + "AiUserMessage.Xl.Default" to ComposeStyleReference { AiUserMessage.Xl.Default.style() }, + "AiUserMessage.Xl.Secondary" to ComposeStyleReference { AiUserMessage.Xl.Secondary.style() }, + "AiUserMessage.Xl.Accent" to ComposeStyleReference { AiUserMessage.Xl.Accent.style() }, + "AiUserMessage.Xl.Positive" to ComposeStyleReference { AiUserMessage.Xl.Positive.style() }, + "AiUserMessage.Xl.Negative" to ComposeStyleReference { AiUserMessage.Xl.Negative.style() }, + "AiUserMessage.Xl.Warning" to ComposeStyleReference { AiUserMessage.Xl.Warning.style() }, + "AiUserMessage.Xl.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.Xl.ContentViewSecondary.Default.style() + }, + "AiUserMessage.Xl.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.Xl.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.Xl.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.Xl.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.Xl.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.Xl.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.Xl.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.Xl.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.Xl.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.Xl.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.Xl.ContentTypeFile.Default" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.Default.style() + }, + "AiUserMessage.Xl.ContentTypeFile.Secondary" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.Secondary.style() + }, + "AiUserMessage.Xl.ContentTypeFile.Accent" to ComposeStyleReference { AiUserMessage.Xl.ContentTypeFile.Accent.style() }, + "AiUserMessage.Xl.ContentTypeFile.Positive" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.Positive.style() + }, + "AiUserMessage.Xl.ContentTypeFile.Negative" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.Negative.style() + }, + "AiUserMessage.Xl.ContentTypeFile.Warning" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.Warning.style() + }, + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Default.style() + }, + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.L.Default" to ComposeStyleReference { AiUserMessage.L.Default.style() }, + "AiUserMessage.L.Secondary" to ComposeStyleReference { AiUserMessage.L.Secondary.style() }, + "AiUserMessage.L.Accent" to ComposeStyleReference { AiUserMessage.L.Accent.style() }, + "AiUserMessage.L.Positive" to ComposeStyleReference { AiUserMessage.L.Positive.style() }, + "AiUserMessage.L.Negative" to ComposeStyleReference { AiUserMessage.L.Negative.style() }, + "AiUserMessage.L.Warning" to ComposeStyleReference { AiUserMessage.L.Warning.style() }, + "AiUserMessage.L.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.L.ContentViewSecondary.Default.style() + }, + "AiUserMessage.L.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.L.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.L.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.L.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.L.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.L.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.L.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.L.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.L.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.L.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.L.ContentTypeFile.Default" to ComposeStyleReference { AiUserMessage.L.ContentTypeFile.Default.style() }, + "AiUserMessage.L.ContentTypeFile.Secondary" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.Secondary.style() + }, + "AiUserMessage.L.ContentTypeFile.Accent" to ComposeStyleReference { AiUserMessage.L.ContentTypeFile.Accent.style() }, + "AiUserMessage.L.ContentTypeFile.Positive" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.Positive.style() + }, + "AiUserMessage.L.ContentTypeFile.Negative" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.Negative.style() + }, + "AiUserMessage.L.ContentTypeFile.Warning" to ComposeStyleReference { AiUserMessage.L.ContentTypeFile.Warning.style() }, + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Default.style() + }, + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.M.Default" to ComposeStyleReference { AiUserMessage.M.Default.style() }, + "AiUserMessage.M.Secondary" to ComposeStyleReference { AiUserMessage.M.Secondary.style() }, + "AiUserMessage.M.Accent" to ComposeStyleReference { AiUserMessage.M.Accent.style() }, + "AiUserMessage.M.Positive" to ComposeStyleReference { AiUserMessage.M.Positive.style() }, + "AiUserMessage.M.Negative" to ComposeStyleReference { AiUserMessage.M.Negative.style() }, + "AiUserMessage.M.Warning" to ComposeStyleReference { AiUserMessage.M.Warning.style() }, + "AiUserMessage.M.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.M.ContentViewSecondary.Default.style() + }, + "AiUserMessage.M.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.M.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.M.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.M.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.M.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.M.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.M.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.M.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.M.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.M.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.M.ContentTypeFile.Default" to ComposeStyleReference { AiUserMessage.M.ContentTypeFile.Default.style() }, + "AiUserMessage.M.ContentTypeFile.Secondary" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.Secondary.style() + }, + "AiUserMessage.M.ContentTypeFile.Accent" to ComposeStyleReference { AiUserMessage.M.ContentTypeFile.Accent.style() }, + "AiUserMessage.M.ContentTypeFile.Positive" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.Positive.style() + }, + "AiUserMessage.M.ContentTypeFile.Negative" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.Negative.style() + }, + "AiUserMessage.M.ContentTypeFile.Warning" to ComposeStyleReference { AiUserMessage.M.ContentTypeFile.Warning.style() }, + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Default.style() + }, + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.S.Default" to ComposeStyleReference { AiUserMessage.S.Default.style() }, + "AiUserMessage.S.Secondary" to ComposeStyleReference { AiUserMessage.S.Secondary.style() }, + "AiUserMessage.S.Accent" to ComposeStyleReference { AiUserMessage.S.Accent.style() }, + "AiUserMessage.S.Positive" to ComposeStyleReference { AiUserMessage.S.Positive.style() }, + "AiUserMessage.S.Negative" to ComposeStyleReference { AiUserMessage.S.Negative.style() }, + "AiUserMessage.S.Warning" to ComposeStyleReference { AiUserMessage.S.Warning.style() }, + "AiUserMessage.S.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.S.ContentViewSecondary.Default.style() + }, + "AiUserMessage.S.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.S.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.S.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.S.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.S.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.S.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.S.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.S.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.S.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.S.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.S.ContentTypeFile.Default" to ComposeStyleReference { AiUserMessage.S.ContentTypeFile.Default.style() }, + "AiUserMessage.S.ContentTypeFile.Secondary" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.Secondary.style() + }, + "AiUserMessage.S.ContentTypeFile.Accent" to ComposeStyleReference { AiUserMessage.S.ContentTypeFile.Accent.style() }, + "AiUserMessage.S.ContentTypeFile.Positive" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.Positive.style() + }, + "AiUserMessage.S.ContentTypeFile.Negative" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.Negative.style() + }, + "AiUserMessage.S.ContentTypeFile.Warning" to ComposeStyleReference { AiUserMessage.S.ContentTypeFile.Warning.style() }, + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Default.style() + }, + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.Xs.Default" to ComposeStyleReference { AiUserMessage.Xs.Default.style() }, + "AiUserMessage.Xs.Secondary" to ComposeStyleReference { AiUserMessage.Xs.Secondary.style() }, + "AiUserMessage.Xs.Accent" to ComposeStyleReference { AiUserMessage.Xs.Accent.style() }, + "AiUserMessage.Xs.Positive" to ComposeStyleReference { AiUserMessage.Xs.Positive.style() }, + "AiUserMessage.Xs.Negative" to ComposeStyleReference { AiUserMessage.Xs.Negative.style() }, + "AiUserMessage.Xs.Warning" to ComposeStyleReference { AiUserMessage.Xs.Warning.style() }, + "AiUserMessage.Xs.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.Xs.ContentViewSecondary.Default.style() + }, + "AiUserMessage.Xs.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.Xs.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.Xs.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.Xs.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.Xs.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.Xs.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.Xs.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.Xs.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.Xs.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.Xs.ContentViewSecondary.Warning.style() + }, + "AiUserMessage.Xs.ContentTypeFile.Default" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.Default.style() + }, + "AiUserMessage.Xs.ContentTypeFile.Secondary" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.Secondary.style() + }, + "AiUserMessage.Xs.ContentTypeFile.Accent" to ComposeStyleReference { AiUserMessage.Xs.ContentTypeFile.Accent.style() }, + "AiUserMessage.Xs.ContentTypeFile.Positive" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.Positive.style() + }, + "AiUserMessage.Xs.ContentTypeFile.Negative" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.Negative.style() + }, + "AiUserMessage.Xs.ContentTypeFile.Warning" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.Warning.style() + }, + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Default" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Default.style() + }, + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Secondary" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Secondary.style() + }, + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Accent" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Accent.style() + }, + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Positive" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Positive.style() + }, + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Negative" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Negative.style() + }, + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Warning" to ComposeStyleReference { + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Warning.style() + }, + ) + + override fun resolveStyleKey(bindings: Map): String { + return AiUserMessageStyles.resolve( + size = when (bindings["size"]?.toString()) { + "Xl" -> AiUserMessageSize.Xl + "L" -> AiUserMessageSize.L + "M" -> AiUserMessageSize.M + "S" -> AiUserMessageSize.S + "Xs" -> AiUserMessageSize.Xs + else -> AiUserMessageSize.M + }, + contentType = when (bindings["contentType"]?.toString()) { + "Image" -> AiUserMessageContentType.Image + "File" -> AiUserMessageContentType.File + else -> AiUserMessageContentType.Image + }, + contentView = when (bindings["contentView"]?.toString()) { + "Default" -> AiUserMessageContentView.Default + "Secondary" -> AiUserMessageContentView.Secondary + else -> AiUserMessageContentView.Default + }, + view = when (bindings["view"]?.toString()) { + "Default" -> AiUserMessageView.Default + "Secondary" -> AiUserMessageView.Secondary + "Accent" -> AiUserMessageView.Accent + "Positive" -> AiUserMessageView.Positive + "Negative" -> AiUserMessageView.Negative + "Warning" -> AiUserMessageView.Warning + else -> AiUserMessageView.Default + }, + ).key + } +} diff --git a/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServComposeComponents.kt b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServComposeComponents.kt index 27d60b8ac..4a2246032 100644 --- a/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServComposeComponents.kt +++ b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServComposeComponents.kt @@ -467,6 +467,7 @@ object SddsServComposeComponents : ComponentProvider() { ComponentKey.Editable, mapOf( "Editable" to SddsServEditableVariationsCompose, + "AiUserMessageEditable" to SddsServAiUserMessageEditableVariationsCompose, ), ), Component( @@ -520,5 +521,11 @@ object SddsServComposeComponents : ComponentProvider() { "Splitter" to SddsServSplitterVariationsCompose, ), ), + Component( + ComponentKey.AiUserMessage, + mapOf( + "AiUserMessage" to SddsServAiUserMessageVariationsCompose, + ), + ), ).associateBy { it.key } } diff --git a/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServEditableVariationsCompose.kt b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServEditableVariationsCompose.kt index 114a2f428..dc31127d1 100644 --- a/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServEditableVariationsCompose.kt +++ b/tokens/sdds.serv.compose/integration/src/main/kotlin/com/sdds/serv/integration/SddsServEditableVariationsCompose.kt @@ -20,7 +20,7 @@ import com.sdds.serv.styles.editable.BodyS import com.sdds.serv.styles.editable.BodyXs import com.sdds.serv.styles.editable.BodyXxs import com.sdds.serv.styles.editable.Editable -import com.sdds.serv.styles.editable.EditableSize +import com.sdds.serv.styles.editable.EditableDefaultSize import com.sdds.serv.styles.editable.EditableStyles import com.sdds.serv.styles.editable.H1 import com.sdds.serv.styles.editable.H2 @@ -54,19 +54,19 @@ internal object SddsServEditableVariationsCompose : ComposeStyleProvider): String { - return EditableStyles.resolve( + return EditableStyles.Default.resolve( size = when (bindings["size"]?.toString()) { - "H1" -> EditableSize.H1 - "H2" -> EditableSize.H2 - "H3" -> EditableSize.H3 - "H4" -> EditableSize.H4 - "H5" -> EditableSize.H5 - "BodyL" -> EditableSize.BodyL - "BodyM" -> EditableSize.BodyM - "BodyS" -> EditableSize.BodyS - "BodyXs" -> EditableSize.BodyXs - "BodyXxs" -> EditableSize.BodyXxs - else -> EditableSize.H1 + "H1" -> EditableDefaultSize.H1 + "H2" -> EditableDefaultSize.H2 + "H3" -> EditableDefaultSize.H3 + "H4" -> EditableDefaultSize.H4 + "H5" -> EditableDefaultSize.H5 + "BodyL" -> EditableDefaultSize.BodyL + "BodyM" -> EditableDefaultSize.BodyM + "BodyS" -> EditableDefaultSize.BodyS + "BodyXs" -> EditableDefaultSize.BodyXs + "BodyXxs" -> EditableDefaultSize.BodyXxs + else -> EditableDefaultSize.H1 }, ).key } diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessage.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessage.kt new file mode 100644 index 000000000..2074dc18d --- /dev/null +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessage.kt @@ -0,0 +1,7 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +package com.sdds.serv.styles.aiusermessage + +/** + * Вспомогательный объект для описания API и стиля компонента AiUserMessage + */ +public object AiUserMessage diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStyles.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStyles.kt new file mode 100644 index 000000000..9470f387b --- /dev/null +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStyles.kt @@ -0,0 +1,596 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +@file:Suppress( + "UndocumentedPublicClass", + "UndocumentedPublicProperty", + "ktlint:standard:max-line-length", +) + +package com.sdds.serv.styles.aiusermessage + +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.unit.dp +import com.sdds.compose.uikit.adjustBy +import com.sdds.compose.uikit.ai.AiUserMessageStyle +import com.sdds.compose.uikit.ai.AiUserMessageStyleBuilder +import com.sdds.compose.uikit.interactions.asStatefulValue +import com.sdds.compose.uikit.style.BuilderWrapper +import com.sdds.compose.uikit.style.style +import com.sdds.compose.uikit.style.wrap +import com.sdds.serv.styles.buttongroup.AiUserMessageEmbeddedIconButtonGroup +import com.sdds.serv.styles.buttongroup.BasicButtonGroup +import com.sdds.serv.styles.buttongroup.Default +import com.sdds.serv.styles.buttongroup.Dense +import com.sdds.serv.styles.buttongroup.M +import com.sdds.serv.styles.buttongroup.S +import com.sdds.serv.styles.buttongroup.Xxs +import com.sdds.serv.styles.editable.AiUserMessageEditable +import com.sdds.serv.styles.editable.L +import com.sdds.serv.styles.editable.M +import com.sdds.serv.styles.editable.S +import com.sdds.serv.styles.editable.Xl +import com.sdds.serv.styles.editable.Xs +import com.sdds.serv.styles.`file`.FileCircularProgress +import com.sdds.serv.styles.`file`.L +import com.sdds.serv.styles.`file`.M +import com.sdds.serv.styles.`file`.S +import com.sdds.serv.styles.`file`.Xs +import com.sdds.serv.styles.image.Image +import com.sdds.serv.styles.image.Ratio1x1 +import com.sdds.serv.theme.SddsServTheme +import kotlin.Suppress +import kotlin.jvm.JvmInline +import kotlin.jvm.JvmName + +/** + * Базовый интерфейс для всех оберток этого стиля + */ +public interface WrapperAiUserMessage : + BuilderWrapper + +/** + * Интерфейс, который реализуют все обертки вариаций корневого уровня + * и обертки их подвариаций. + * Является ресивером для extension-функций view, + * применимых к этим оберткам. + */ +public interface WrapperAiUserMessageView : WrapperAiUserMessage + +/** + * Терминальная обертка + */ +@JvmInline +public value class WrapperAiUserMessageTerminate( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessage + +/** + * Обертка для вариации Xl + */ +@JvmInline +public value class WrapperAiUserMessageXl( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации XlContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageXlContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации XlContentTypeFile + */ +@JvmInline +public value class WrapperAiUserMessageXlContentTypeFile( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации XlContentTypeFileContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageXlContentTypeFileContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации L + */ +@JvmInline +public value class WrapperAiUserMessageL( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации LContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageLContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации LContentTypeFile + */ +@JvmInline +public value class WrapperAiUserMessageLContentTypeFile( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации LContentTypeFileContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageLContentTypeFileContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации M + */ +@JvmInline +public value class WrapperAiUserMessageM( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации MContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageMContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации MContentTypeFile + */ +@JvmInline +public value class WrapperAiUserMessageMContentTypeFile( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации MContentTypeFileContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageMContentTypeFileContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации S + */ +@JvmInline +public value class WrapperAiUserMessageS( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации SContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageSContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации SContentTypeFile + */ +@JvmInline +public value class WrapperAiUserMessageSContentTypeFile( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации SContentTypeFileContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageSContentTypeFileContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации Xs + */ +@JvmInline +public value class WrapperAiUserMessageXs( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации XsContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageXsContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации XsContentTypeFile + */ +@JvmInline +public value class WrapperAiUserMessageXsContentTypeFile( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +/** + * Обертка для вариации XsContentTypeFileContentViewSecondary + */ +@JvmInline +public value class WrapperAiUserMessageXsContentTypeFileContentViewSecondary( + public override val builder: AiUserMessageStyleBuilder, +) : WrapperAiUserMessageView + +public val WrapperAiUserMessageView.Default: WrapperAiUserMessageTerminate + @Composable + get() = builder + .colors { + messageBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidCard).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageTerminate) + +public val WrapperAiUserMessageView.Secondary: WrapperAiUserMessageTerminate + @Composable + get() = builder + .colors { + messageBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageTerminate) + +public val WrapperAiUserMessageView.Accent: WrapperAiUserMessageTerminate + @Composable + get() = builder + .colors { + messageBackground(SolidColor(SddsServTheme.colors.surfaceDefaultTransparentAccent).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageTerminate) + +public val WrapperAiUserMessageView.Positive: WrapperAiUserMessageTerminate + @Composable + get() = builder + .colors { + messageBackground(SolidColor(SddsServTheme.colors.surfaceDefaultTransparentPositive).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageTerminate) + +public val WrapperAiUserMessageView.Negative: WrapperAiUserMessageTerminate + @Composable + get() = builder + .colors { + messageBackground(SolidColor(SddsServTheme.colors.surfaceDefaultTransparentNegative).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageTerminate) + +public val WrapperAiUserMessageView.Warning: WrapperAiUserMessageTerminate + @Composable + get() = builder + .colors { + messageBackground(SolidColor(SddsServTheme.colors.surfaceDefaultTransparentWarning).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageTerminate) + +private val AiUserMessageStyleBuilder.invariantProps: AiUserMessageStyleBuilder + @Composable + get() = this + .uploadingImageStyle(Image.Ratio1x1.style()) + .colors { + textColor(SolidColor(SddsServTheme.colors.textDefaultPrimary).asStatefulValue()) + } + +public val AiUserMessage.Xl: WrapperAiUserMessageXl + @Composable + @JvmName("WrapperAiUserMessageXl") + get() = AiUserMessageStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyLNormal) + .uploadingShape(SddsServTheme.shapes.roundL) + .messageShape(SddsServTheme.shapes.roundL) + .editableStyle(AiUserMessageEditable.Xl.style()) + .actionsButtonGroupStyle(AiUserMessageEmbeddedIconButtonGroup.M.style()) + .editableActionsButtonGroupStyle(BasicButtonGroup.M.Dense.Default.style()) + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidCard).asStatefulValue()) + } + .dimensions { + uploadingPaddingStart(0.0.dp) + uploadingPaddingEnd(0.0.dp) + uploadingPaddingTop(0.0.dp) + uploadingPaddingBottom(0.0.dp) + messagePaddingStart(18.0.dp) + messagePaddingEnd(18.0.dp) + messagePaddingTop(21.0.dp) + messagePaddingBottom(21.0.dp) + uploadingGroupGap(10.0.dp) + uploadingFilesGap(0.0.dp) + actionsGap(12.0.dp) + editableActionsGap(16.0.dp) + } + .wrap(::WrapperAiUserMessageXl) + +public val WrapperAiUserMessageXl.ContentViewSecondary: WrapperAiUserMessageXlContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageXlContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageXlContentViewSecondary) + +public val WrapperAiUserMessageXl.ContentTypeFile: WrapperAiUserMessageXlContentTypeFile + @Composable + @JvmName("WrapperAiUserMessageXlContentTypeFile") + get() = builder + .uploadingFileStyle(FileCircularProgress.L.style()) + .dimensions { + uploadingPaddingStart(14.0.dp) + uploadingPaddingEnd(14.0.dp) + uploadingPaddingTop(12.0.dp) + uploadingPaddingBottom(12.0.dp) + uploadingFilesGap(10.0.dp) + } + .wrap(::WrapperAiUserMessageXlContentTypeFile) + +public val WrapperAiUserMessageXlContentTypeFile.ContentViewSecondary: + WrapperAiUserMessageXlContentTypeFileContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageXlContentTypeFileContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageXlContentTypeFileContentViewSecondary) + +public val AiUserMessage.L: WrapperAiUserMessageL + @Composable + @JvmName("WrapperAiUserMessageL") + get() = AiUserMessageStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyLNormal) + .uploadingShape(SddsServTheme.shapes.roundL.adjustBy(all = -2.0.dp)) + .messageShape(SddsServTheme.shapes.roundL.adjustBy(all = -2.0.dp)) + .editableStyle(AiUserMessageEditable.L.style()) + .actionsButtonGroupStyle(AiUserMessageEmbeddedIconButtonGroup.M.style()) + .editableActionsButtonGroupStyle(BasicButtonGroup.M.Dense.Default.style()) + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidCard).asStatefulValue()) + } + .dimensions { + uploadingPaddingStart(0.0.dp) + uploadingPaddingEnd(0.0.dp) + uploadingPaddingTop(0.0.dp) + uploadingPaddingBottom(0.0.dp) + messagePaddingStart(16.0.dp) + messagePaddingEnd(16.0.dp) + messagePaddingTop(17.0.dp) + messagePaddingBottom(17.0.dp) + uploadingGroupGap(10.0.dp) + uploadingFilesGap(0.0.dp) + actionsGap(12.0.dp) + editableActionsGap(16.0.dp) + } + .wrap(::WrapperAiUserMessageL) + +public val WrapperAiUserMessageL.ContentViewSecondary: WrapperAiUserMessageLContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageLContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageLContentViewSecondary) + +public val WrapperAiUserMessageL.ContentTypeFile: WrapperAiUserMessageLContentTypeFile + @Composable + @JvmName("WrapperAiUserMessageLContentTypeFile") + get() = builder + .uploadingFileStyle(FileCircularProgress.M.style()) + .dimensions { + uploadingPaddingStart(8.0.dp) + uploadingPaddingEnd(8.0.dp) + uploadingPaddingTop(10.0.dp) + uploadingPaddingBottom(10.0.dp) + uploadingFilesGap(10.0.dp) + } + .wrap(::WrapperAiUserMessageLContentTypeFile) + +public val WrapperAiUserMessageLContentTypeFile.ContentViewSecondary: + WrapperAiUserMessageLContentTypeFileContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageLContentTypeFileContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageLContentTypeFileContentViewSecondary) + +public val AiUserMessage.M: WrapperAiUserMessageM + @Composable + @JvmName("WrapperAiUserMessageM") + get() = AiUserMessageStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyMNormal) + .uploadingShape(SddsServTheme.shapes.roundM) + .messageShape(SddsServTheme.shapes.roundM) + .editableStyle(AiUserMessageEditable.M.style()) + .actionsButtonGroupStyle(AiUserMessageEmbeddedIconButtonGroup.M.style()) + .editableActionsButtonGroupStyle(BasicButtonGroup.S.Dense.Default.style()) + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidCard).asStatefulValue()) + } + .dimensions { + uploadingPaddingStart(0.0.dp) + uploadingPaddingEnd(0.0.dp) + uploadingPaddingTop(0.0.dp) + uploadingPaddingBottom(0.0.dp) + messagePaddingStart(14.0.dp) + messagePaddingEnd(14.0.dp) + messagePaddingTop(14.0.dp) + messagePaddingBottom(14.0.dp) + uploadingGroupGap(8.0.dp) + uploadingFilesGap(0.0.dp) + actionsGap(12.0.dp) + editableActionsGap(14.0.dp) + } + .wrap(::WrapperAiUserMessageM) + +public val WrapperAiUserMessageM.ContentViewSecondary: WrapperAiUserMessageMContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageMContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageMContentViewSecondary) + +public val WrapperAiUserMessageM.ContentTypeFile: WrapperAiUserMessageMContentTypeFile + @Composable + @JvmName("WrapperAiUserMessageMContentTypeFile") + get() = builder + .uploadingFileStyle(FileCircularProgress.S.style()) + .dimensions { + uploadingPaddingStart(8.0.dp) + uploadingPaddingEnd(8.0.dp) + uploadingPaddingTop(7.0.dp) + uploadingPaddingBottom(7.0.dp) + uploadingFilesGap(8.0.dp) + } + .wrap(::WrapperAiUserMessageMContentTypeFile) + +public val WrapperAiUserMessageMContentTypeFile.ContentViewSecondary: + WrapperAiUserMessageMContentTypeFileContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageMContentTypeFileContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageMContentTypeFileContentViewSecondary) + +public val AiUserMessage.S: WrapperAiUserMessageS + @Composable + @JvmName("WrapperAiUserMessageS") + get() = AiUserMessageStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodySNormal) + .uploadingShape(SddsServTheme.shapes.roundM.adjustBy(all = -2.0.dp)) + .messageShape(SddsServTheme.shapes.roundM.adjustBy(all = -2.0.dp)) + .editableStyle(AiUserMessageEditable.S.style()) + .actionsButtonGroupStyle(AiUserMessageEmbeddedIconButtonGroup.S.style()) + .editableActionsButtonGroupStyle(BasicButtonGroup.S.Dense.Default.style()) + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidCard).asStatefulValue()) + } + .dimensions { + uploadingPaddingStart(0.0.dp) + uploadingPaddingEnd(0.0.dp) + uploadingPaddingTop(0.0.dp) + uploadingPaddingBottom(0.0.dp) + messagePaddingStart(12.0.dp) + messagePaddingEnd(12.0.dp) + messagePaddingTop(11.0.dp) + messagePaddingBottom(11.0.dp) + uploadingGroupGap(6.0.dp) + uploadingFilesGap(0.0.dp) + actionsGap(12.0.dp) + editableActionsGap(14.0.dp) + } + .wrap(::WrapperAiUserMessageS) + +public val WrapperAiUserMessageS.ContentViewSecondary: WrapperAiUserMessageSContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageSContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageSContentViewSecondary) + +public val WrapperAiUserMessageS.ContentTypeFile: WrapperAiUserMessageSContentTypeFile + @Composable + @JvmName("WrapperAiUserMessageSContentTypeFile") + get() = builder + .uploadingFileStyle(FileCircularProgress.Xs.style()) + .dimensions { + uploadingPaddingStart(6.0.dp) + uploadingPaddingEnd(6.0.dp) + uploadingPaddingTop(5.0.dp) + uploadingPaddingBottom(5.0.dp) + uploadingFilesGap(6.0.dp) + } + .wrap(::WrapperAiUserMessageSContentTypeFile) + +public val WrapperAiUserMessageSContentTypeFile.ContentViewSecondary: + WrapperAiUserMessageSContentTypeFileContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageSContentTypeFileContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageSContentTypeFileContentViewSecondary) + +public val AiUserMessage.Xs: WrapperAiUserMessageXs + @Composable + @JvmName("WrapperAiUserMessageXs") + get() = AiUserMessageStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyXsNormal) + .uploadingShape(SddsServTheme.shapes.roundS) + .messageShape(SddsServTheme.shapes.roundS) + .editableStyle(AiUserMessageEditable.Xs.style()) + .actionsButtonGroupStyle(AiUserMessageEmbeddedIconButtonGroup.S.style()) + .editableActionsButtonGroupStyle(BasicButtonGroup.Xxs.Dense.Default.style()) + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidCard).asStatefulValue()) + } + .dimensions { + uploadingPaddingStart(0.0.dp) + uploadingPaddingEnd(0.0.dp) + uploadingPaddingTop(0.0.dp) + uploadingPaddingBottom(0.0.dp) + messagePaddingStart(10.0.dp) + messagePaddingEnd(10.0.dp) + messagePaddingTop(9.0.dp) + messagePaddingBottom(9.0.dp) + uploadingGroupGap(4.0.dp) + uploadingFilesGap(0.0.dp) + actionsGap(10.0.dp) + editableActionsGap(10.0.dp) + } + .wrap(::WrapperAiUserMessageXs) + +public val WrapperAiUserMessageXs.ContentViewSecondary: WrapperAiUserMessageXsContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageXsContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageXsContentViewSecondary) + +public val WrapperAiUserMessageXs.ContentTypeFile: WrapperAiUserMessageXsContentTypeFile + @Composable + @JvmName("WrapperAiUserMessageXsContentTypeFile") + get() = builder + .uploadingFileStyle(FileCircularProgress.Xs.style()) + .dimensions { + uploadingPaddingStart(4.0.dp) + uploadingPaddingEnd(4.0.dp) + uploadingPaddingTop(3.0.dp) + uploadingPaddingBottom(3.0.dp) + uploadingFilesGap(4.0.dp) + } + .wrap(::WrapperAiUserMessageXsContentTypeFile) + +public val WrapperAiUserMessageXsContentTypeFile.ContentViewSecondary: + WrapperAiUserMessageXsContentTypeFileContentViewSecondary + @Composable + @JvmName("WrapperAiUserMessageXsContentTypeFileContentViewSecondary") + get() = builder + .colors { + uploadingBackground(SolidColor(SddsServTheme.colors.surfaceDefaultSolidSecondary).asStatefulValue()) + } + .wrap(::WrapperAiUserMessageXsContentTypeFileContentViewSecondary) diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStylesCollection.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStylesCollection.kt new file mode 100644 index 000000000..4fe91f007 --- /dev/null +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/aiusermessage/AiUserMessageStylesCollection.kt @@ -0,0 +1,777 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +@file:Suppress( + "UndocumentedPublicClass", + "UndocumentedPublicProperty", + "ktlint:standard:max-line-length", + "MatchingDeclarationName", + "CyclomaticComplexMethod", + "LongMethod", +) + +package com.sdds.serv.styles.aiusermessage + +import androidx.compose.runtime.Composable +import com.sdds.compose.uikit.ai.AiUserMessageStyle +import com.sdds.compose.uikit.ai.AiUserMessageStyleBuilder +import com.sdds.compose.uikit.style.modify +import com.sdds.compose.uikit.style.style +import kotlin.String +import kotlin.Suppress +import kotlin.Unit + +/** + * Вспомогательный объект для описания всех стилей компонента AiUserMessage + */ +public enum class AiUserMessageStyles( + public val key: String, +) { + AiUserMessageXlDefault("AiUserMessage.Xl.Default"), + AiUserMessageXlSecondary("AiUserMessage.Xl.Secondary"), + AiUserMessageXlAccent("AiUserMessage.Xl.Accent"), + AiUserMessageXlPositive("AiUserMessage.Xl.Positive"), + AiUserMessageXlNegative("AiUserMessage.Xl.Negative"), + AiUserMessageXlWarning("AiUserMessage.Xl.Warning"), + AiUserMessageXlContentViewSecondaryDefault("AiUserMessage.Xl.ContentViewSecondary.Default"), + AiUserMessageXlContentViewSecondarySecondary("AiUserMessage.Xl.ContentViewSecondary.Secondary"), + AiUserMessageXlContentViewSecondaryAccent("AiUserMessage.Xl.ContentViewSecondary.Accent"), + AiUserMessageXlContentViewSecondaryPositive("AiUserMessage.Xl.ContentViewSecondary.Positive"), + AiUserMessageXlContentViewSecondaryNegative("AiUserMessage.Xl.ContentViewSecondary.Negative"), + AiUserMessageXlContentViewSecondaryWarning("AiUserMessage.Xl.ContentViewSecondary.Warning"), + AiUserMessageXlContentTypeFileDefault("AiUserMessage.Xl.ContentTypeFile.Default"), + AiUserMessageXlContentTypeFileSecondary("AiUserMessage.Xl.ContentTypeFile.Secondary"), + AiUserMessageXlContentTypeFileAccent("AiUserMessage.Xl.ContentTypeFile.Accent"), + AiUserMessageXlContentTypeFilePositive("AiUserMessage.Xl.ContentTypeFile.Positive"), + AiUserMessageXlContentTypeFileNegative("AiUserMessage.Xl.ContentTypeFile.Negative"), + AiUserMessageXlContentTypeFileWarning("AiUserMessage.Xl.ContentTypeFile.Warning"), + AiUserMessageXlContentTypeFileContentViewSecondaryDefault( + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Default", + ), + AiUserMessageXlContentTypeFileContentViewSecondarySecondary( + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Secondary", + ), + AiUserMessageXlContentTypeFileContentViewSecondaryAccent( + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Accent", + ), + AiUserMessageXlContentTypeFileContentViewSecondaryPositive( + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Positive", + ), + AiUserMessageXlContentTypeFileContentViewSecondaryNegative( + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Negative", + ), + AiUserMessageXlContentTypeFileContentViewSecondaryWarning( + "AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Warning", + ), + AiUserMessageLDefault("AiUserMessage.L.Default"), + AiUserMessageLSecondary("AiUserMessage.L.Secondary"), + AiUserMessageLAccent("AiUserMessage.L.Accent"), + AiUserMessageLPositive("AiUserMessage.L.Positive"), + AiUserMessageLNegative("AiUserMessage.L.Negative"), + AiUserMessageLWarning("AiUserMessage.L.Warning"), + AiUserMessageLContentViewSecondaryDefault("AiUserMessage.L.ContentViewSecondary.Default"), + AiUserMessageLContentViewSecondarySecondary("AiUserMessage.L.ContentViewSecondary.Secondary"), + AiUserMessageLContentViewSecondaryAccent("AiUserMessage.L.ContentViewSecondary.Accent"), + AiUserMessageLContentViewSecondaryPositive("AiUserMessage.L.ContentViewSecondary.Positive"), + AiUserMessageLContentViewSecondaryNegative("AiUserMessage.L.ContentViewSecondary.Negative"), + AiUserMessageLContentViewSecondaryWarning("AiUserMessage.L.ContentViewSecondary.Warning"), + AiUserMessageLContentTypeFileDefault("AiUserMessage.L.ContentTypeFile.Default"), + AiUserMessageLContentTypeFileSecondary("AiUserMessage.L.ContentTypeFile.Secondary"), + AiUserMessageLContentTypeFileAccent("AiUserMessage.L.ContentTypeFile.Accent"), + AiUserMessageLContentTypeFilePositive("AiUserMessage.L.ContentTypeFile.Positive"), + AiUserMessageLContentTypeFileNegative("AiUserMessage.L.ContentTypeFile.Negative"), + AiUserMessageLContentTypeFileWarning("AiUserMessage.L.ContentTypeFile.Warning"), + AiUserMessageLContentTypeFileContentViewSecondaryDefault( + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Default", + ), + AiUserMessageLContentTypeFileContentViewSecondarySecondary( + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Secondary", + ), + AiUserMessageLContentTypeFileContentViewSecondaryAccent( + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Accent", + ), + AiUserMessageLContentTypeFileContentViewSecondaryPositive( + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Positive", + ), + AiUserMessageLContentTypeFileContentViewSecondaryNegative( + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Negative", + ), + AiUserMessageLContentTypeFileContentViewSecondaryWarning( + "AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Warning", + ), + AiUserMessageMDefault("AiUserMessage.M.Default"), + AiUserMessageMSecondary("AiUserMessage.M.Secondary"), + AiUserMessageMAccent("AiUserMessage.M.Accent"), + AiUserMessageMPositive("AiUserMessage.M.Positive"), + AiUserMessageMNegative("AiUserMessage.M.Negative"), + AiUserMessageMWarning("AiUserMessage.M.Warning"), + AiUserMessageMContentViewSecondaryDefault("AiUserMessage.M.ContentViewSecondary.Default"), + AiUserMessageMContentViewSecondarySecondary("AiUserMessage.M.ContentViewSecondary.Secondary"), + AiUserMessageMContentViewSecondaryAccent("AiUserMessage.M.ContentViewSecondary.Accent"), + AiUserMessageMContentViewSecondaryPositive("AiUserMessage.M.ContentViewSecondary.Positive"), + AiUserMessageMContentViewSecondaryNegative("AiUserMessage.M.ContentViewSecondary.Negative"), + AiUserMessageMContentViewSecondaryWarning("AiUserMessage.M.ContentViewSecondary.Warning"), + AiUserMessageMContentTypeFileDefault("AiUserMessage.M.ContentTypeFile.Default"), + AiUserMessageMContentTypeFileSecondary("AiUserMessage.M.ContentTypeFile.Secondary"), + AiUserMessageMContentTypeFileAccent("AiUserMessage.M.ContentTypeFile.Accent"), + AiUserMessageMContentTypeFilePositive("AiUserMessage.M.ContentTypeFile.Positive"), + AiUserMessageMContentTypeFileNegative("AiUserMessage.M.ContentTypeFile.Negative"), + AiUserMessageMContentTypeFileWarning("AiUserMessage.M.ContentTypeFile.Warning"), + AiUserMessageMContentTypeFileContentViewSecondaryDefault( + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Default", + ), + AiUserMessageMContentTypeFileContentViewSecondarySecondary( + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Secondary", + ), + AiUserMessageMContentTypeFileContentViewSecondaryAccent( + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Accent", + ), + AiUserMessageMContentTypeFileContentViewSecondaryPositive( + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Positive", + ), + AiUserMessageMContentTypeFileContentViewSecondaryNegative( + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Negative", + ), + AiUserMessageMContentTypeFileContentViewSecondaryWarning( + "AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Warning", + ), + AiUserMessageSDefault("AiUserMessage.S.Default"), + AiUserMessageSSecondary("AiUserMessage.S.Secondary"), + AiUserMessageSAccent("AiUserMessage.S.Accent"), + AiUserMessageSPositive("AiUserMessage.S.Positive"), + AiUserMessageSNegative("AiUserMessage.S.Negative"), + AiUserMessageSWarning("AiUserMessage.S.Warning"), + AiUserMessageSContentViewSecondaryDefault("AiUserMessage.S.ContentViewSecondary.Default"), + AiUserMessageSContentViewSecondarySecondary("AiUserMessage.S.ContentViewSecondary.Secondary"), + AiUserMessageSContentViewSecondaryAccent("AiUserMessage.S.ContentViewSecondary.Accent"), + AiUserMessageSContentViewSecondaryPositive("AiUserMessage.S.ContentViewSecondary.Positive"), + AiUserMessageSContentViewSecondaryNegative("AiUserMessage.S.ContentViewSecondary.Negative"), + AiUserMessageSContentViewSecondaryWarning("AiUserMessage.S.ContentViewSecondary.Warning"), + AiUserMessageSContentTypeFileDefault("AiUserMessage.S.ContentTypeFile.Default"), + AiUserMessageSContentTypeFileSecondary("AiUserMessage.S.ContentTypeFile.Secondary"), + AiUserMessageSContentTypeFileAccent("AiUserMessage.S.ContentTypeFile.Accent"), + AiUserMessageSContentTypeFilePositive("AiUserMessage.S.ContentTypeFile.Positive"), + AiUserMessageSContentTypeFileNegative("AiUserMessage.S.ContentTypeFile.Negative"), + AiUserMessageSContentTypeFileWarning("AiUserMessage.S.ContentTypeFile.Warning"), + AiUserMessageSContentTypeFileContentViewSecondaryDefault( + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Default", + ), + AiUserMessageSContentTypeFileContentViewSecondarySecondary( + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Secondary", + ), + AiUserMessageSContentTypeFileContentViewSecondaryAccent( + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Accent", + ), + AiUserMessageSContentTypeFileContentViewSecondaryPositive( + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Positive", + ), + AiUserMessageSContentTypeFileContentViewSecondaryNegative( + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Negative", + ), + AiUserMessageSContentTypeFileContentViewSecondaryWarning( + "AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Warning", + ), + AiUserMessageXsDefault("AiUserMessage.Xs.Default"), + AiUserMessageXsSecondary("AiUserMessage.Xs.Secondary"), + AiUserMessageXsAccent("AiUserMessage.Xs.Accent"), + AiUserMessageXsPositive("AiUserMessage.Xs.Positive"), + AiUserMessageXsNegative("AiUserMessage.Xs.Negative"), + AiUserMessageXsWarning("AiUserMessage.Xs.Warning"), + AiUserMessageXsContentViewSecondaryDefault("AiUserMessage.Xs.ContentViewSecondary.Default"), + AiUserMessageXsContentViewSecondarySecondary("AiUserMessage.Xs.ContentViewSecondary.Secondary"), + AiUserMessageXsContentViewSecondaryAccent("AiUserMessage.Xs.ContentViewSecondary.Accent"), + AiUserMessageXsContentViewSecondaryPositive("AiUserMessage.Xs.ContentViewSecondary.Positive"), + AiUserMessageXsContentViewSecondaryNegative("AiUserMessage.Xs.ContentViewSecondary.Negative"), + AiUserMessageXsContentViewSecondaryWarning("AiUserMessage.Xs.ContentViewSecondary.Warning"), + AiUserMessageXsContentTypeFileDefault("AiUserMessage.Xs.ContentTypeFile.Default"), + AiUserMessageXsContentTypeFileSecondary("AiUserMessage.Xs.ContentTypeFile.Secondary"), + AiUserMessageXsContentTypeFileAccent("AiUserMessage.Xs.ContentTypeFile.Accent"), + AiUserMessageXsContentTypeFilePositive("AiUserMessage.Xs.ContentTypeFile.Positive"), + AiUserMessageXsContentTypeFileNegative("AiUserMessage.Xs.ContentTypeFile.Negative"), + AiUserMessageXsContentTypeFileWarning("AiUserMessage.Xs.ContentTypeFile.Warning"), + AiUserMessageXsContentTypeFileContentViewSecondaryDefault( + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Default", + ), + AiUserMessageXsContentTypeFileContentViewSecondarySecondary( + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Secondary", + ), + AiUserMessageXsContentTypeFileContentViewSecondaryAccent( + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Accent", + ), + AiUserMessageXsContentTypeFileContentViewSecondaryPositive( + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Positive", + ), + AiUserMessageXsContentTypeFileContentViewSecondaryNegative( + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Negative", + ), + AiUserMessageXsContentTypeFileContentViewSecondaryWarning( + "AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Warning", + ), + ; + + /** + * Typed API для подбора стиля ai-user-message + */ + public companion object +} + +/** + * Возможные значения свойства size для ai-user-message + */ +public enum class AiUserMessageSize { + Xl, + L, + M, + S, + Xs, +} + +/** + * Возможные значения свойства content-type для ai-user-message + */ +public enum class AiUserMessageContentType { + Image, + File, +} + +/** + * Возможные значения свойства content-view для ai-user-message + */ +public enum class AiUserMessageContentView { + Default, + Secondary, +} + +/** + * Возможные значения свойства view для ai-user-message + */ +public enum class AiUserMessageView { + Default, + Secondary, + Accent, + Positive, + Negative, + Warning, +} + +/** + * Возвращает [AiUserMessageStyle] для [AiUserMessageStyles] + */ +@Composable +public fun AiUserMessageStyles.style(modify: @Composable AiUserMessageStyleBuilder.() -> Unit = {}): + AiUserMessageStyle { + val builder = when (this) { + AiUserMessageStyles.AiUserMessageXlDefault -> AiUserMessage.Xl.Default + AiUserMessageStyles.AiUserMessageXlSecondary -> AiUserMessage.Xl.Secondary + AiUserMessageStyles.AiUserMessageXlAccent -> AiUserMessage.Xl.Accent + AiUserMessageStyles.AiUserMessageXlPositive -> AiUserMessage.Xl.Positive + AiUserMessageStyles.AiUserMessageXlNegative -> AiUserMessage.Xl.Negative + AiUserMessageStyles.AiUserMessageXlWarning -> AiUserMessage.Xl.Warning + AiUserMessageStyles.AiUserMessageXlContentViewSecondaryDefault -> + AiUserMessage.Xl.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageXlContentViewSecondarySecondary -> + AiUserMessage.Xl.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageXlContentViewSecondaryAccent -> + AiUserMessage.Xl.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageXlContentViewSecondaryPositive -> + AiUserMessage.Xl.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageXlContentViewSecondaryNegative -> + AiUserMessage.Xl.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageXlContentViewSecondaryWarning -> + AiUserMessage.Xl.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageXlContentTypeFileDefault -> + AiUserMessage.Xl.ContentTypeFile.Default + AiUserMessageStyles.AiUserMessageXlContentTypeFileSecondary -> + AiUserMessage.Xl.ContentTypeFile.Secondary + AiUserMessageStyles.AiUserMessageXlContentTypeFileAccent -> + AiUserMessage.Xl.ContentTypeFile.Accent + AiUserMessageStyles.AiUserMessageXlContentTypeFilePositive -> + AiUserMessage.Xl.ContentTypeFile.Positive + AiUserMessageStyles.AiUserMessageXlContentTypeFileNegative -> + AiUserMessage.Xl.ContentTypeFile.Negative + AiUserMessageStyles.AiUserMessageXlContentTypeFileWarning -> + AiUserMessage.Xl.ContentTypeFile.Warning + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryDefault -> + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondarySecondary -> + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryAccent -> + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryPositive -> + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryNegative -> + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryWarning -> + AiUserMessage.Xl.ContentTypeFile.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageLDefault -> AiUserMessage.L.Default + AiUserMessageStyles.AiUserMessageLSecondary -> AiUserMessage.L.Secondary + AiUserMessageStyles.AiUserMessageLAccent -> AiUserMessage.L.Accent + AiUserMessageStyles.AiUserMessageLPositive -> AiUserMessage.L.Positive + AiUserMessageStyles.AiUserMessageLNegative -> AiUserMessage.L.Negative + AiUserMessageStyles.AiUserMessageLWarning -> AiUserMessage.L.Warning + AiUserMessageStyles.AiUserMessageLContentViewSecondaryDefault -> + AiUserMessage.L.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageLContentViewSecondarySecondary -> + AiUserMessage.L.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageLContentViewSecondaryAccent -> + AiUserMessage.L.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageLContentViewSecondaryPositive -> + AiUserMessage.L.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageLContentViewSecondaryNegative -> + AiUserMessage.L.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageLContentViewSecondaryWarning -> + AiUserMessage.L.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageLContentTypeFileDefault -> + AiUserMessage.L.ContentTypeFile.Default + AiUserMessageStyles.AiUserMessageLContentTypeFileSecondary -> + AiUserMessage.L.ContentTypeFile.Secondary + AiUserMessageStyles.AiUserMessageLContentTypeFileAccent -> + AiUserMessage.L.ContentTypeFile.Accent + AiUserMessageStyles.AiUserMessageLContentTypeFilePositive -> + AiUserMessage.L.ContentTypeFile.Positive + AiUserMessageStyles.AiUserMessageLContentTypeFileNegative -> + AiUserMessage.L.ContentTypeFile.Negative + AiUserMessageStyles.AiUserMessageLContentTypeFileWarning -> + AiUserMessage.L.ContentTypeFile.Warning + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryDefault -> + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondarySecondary -> + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryAccent -> + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryPositive -> + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryNegative -> + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryWarning -> + AiUserMessage.L.ContentTypeFile.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageMDefault -> AiUserMessage.M.Default + AiUserMessageStyles.AiUserMessageMSecondary -> AiUserMessage.M.Secondary + AiUserMessageStyles.AiUserMessageMAccent -> AiUserMessage.M.Accent + AiUserMessageStyles.AiUserMessageMPositive -> AiUserMessage.M.Positive + AiUserMessageStyles.AiUserMessageMNegative -> AiUserMessage.M.Negative + AiUserMessageStyles.AiUserMessageMWarning -> AiUserMessage.M.Warning + AiUserMessageStyles.AiUserMessageMContentViewSecondaryDefault -> + AiUserMessage.M.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageMContentViewSecondarySecondary -> + AiUserMessage.M.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageMContentViewSecondaryAccent -> + AiUserMessage.M.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageMContentViewSecondaryPositive -> + AiUserMessage.M.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageMContentViewSecondaryNegative -> + AiUserMessage.M.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageMContentViewSecondaryWarning -> + AiUserMessage.M.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageMContentTypeFileDefault -> + AiUserMessage.M.ContentTypeFile.Default + AiUserMessageStyles.AiUserMessageMContentTypeFileSecondary -> + AiUserMessage.M.ContentTypeFile.Secondary + AiUserMessageStyles.AiUserMessageMContentTypeFileAccent -> + AiUserMessage.M.ContentTypeFile.Accent + AiUserMessageStyles.AiUserMessageMContentTypeFilePositive -> + AiUserMessage.M.ContentTypeFile.Positive + AiUserMessageStyles.AiUserMessageMContentTypeFileNegative -> + AiUserMessage.M.ContentTypeFile.Negative + AiUserMessageStyles.AiUserMessageMContentTypeFileWarning -> + AiUserMessage.M.ContentTypeFile.Warning + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryDefault -> + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondarySecondary -> + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryAccent -> + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryPositive -> + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryNegative -> + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryWarning -> + AiUserMessage.M.ContentTypeFile.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageSDefault -> AiUserMessage.S.Default + AiUserMessageStyles.AiUserMessageSSecondary -> AiUserMessage.S.Secondary + AiUserMessageStyles.AiUserMessageSAccent -> AiUserMessage.S.Accent + AiUserMessageStyles.AiUserMessageSPositive -> AiUserMessage.S.Positive + AiUserMessageStyles.AiUserMessageSNegative -> AiUserMessage.S.Negative + AiUserMessageStyles.AiUserMessageSWarning -> AiUserMessage.S.Warning + AiUserMessageStyles.AiUserMessageSContentViewSecondaryDefault -> + AiUserMessage.S.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageSContentViewSecondarySecondary -> + AiUserMessage.S.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageSContentViewSecondaryAccent -> + AiUserMessage.S.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageSContentViewSecondaryPositive -> + AiUserMessage.S.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageSContentViewSecondaryNegative -> + AiUserMessage.S.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageSContentViewSecondaryWarning -> + AiUserMessage.S.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageSContentTypeFileDefault -> + AiUserMessage.S.ContentTypeFile.Default + AiUserMessageStyles.AiUserMessageSContentTypeFileSecondary -> + AiUserMessage.S.ContentTypeFile.Secondary + AiUserMessageStyles.AiUserMessageSContentTypeFileAccent -> + AiUserMessage.S.ContentTypeFile.Accent + AiUserMessageStyles.AiUserMessageSContentTypeFilePositive -> + AiUserMessage.S.ContentTypeFile.Positive + AiUserMessageStyles.AiUserMessageSContentTypeFileNegative -> + AiUserMessage.S.ContentTypeFile.Negative + AiUserMessageStyles.AiUserMessageSContentTypeFileWarning -> + AiUserMessage.S.ContentTypeFile.Warning + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryDefault -> + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondarySecondary -> + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryAccent -> + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryPositive -> + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryNegative -> + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryWarning -> + AiUserMessage.S.ContentTypeFile.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageXsDefault -> AiUserMessage.Xs.Default + AiUserMessageStyles.AiUserMessageXsSecondary -> AiUserMessage.Xs.Secondary + AiUserMessageStyles.AiUserMessageXsAccent -> AiUserMessage.Xs.Accent + AiUserMessageStyles.AiUserMessageXsPositive -> AiUserMessage.Xs.Positive + AiUserMessageStyles.AiUserMessageXsNegative -> AiUserMessage.Xs.Negative + AiUserMessageStyles.AiUserMessageXsWarning -> AiUserMessage.Xs.Warning + AiUserMessageStyles.AiUserMessageXsContentViewSecondaryDefault -> + AiUserMessage.Xs.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageXsContentViewSecondarySecondary -> + AiUserMessage.Xs.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageXsContentViewSecondaryAccent -> + AiUserMessage.Xs.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageXsContentViewSecondaryPositive -> + AiUserMessage.Xs.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageXsContentViewSecondaryNegative -> + AiUserMessage.Xs.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageXsContentViewSecondaryWarning -> + AiUserMessage.Xs.ContentViewSecondary.Warning + AiUserMessageStyles.AiUserMessageXsContentTypeFileDefault -> + AiUserMessage.Xs.ContentTypeFile.Default + AiUserMessageStyles.AiUserMessageXsContentTypeFileSecondary -> + AiUserMessage.Xs.ContentTypeFile.Secondary + AiUserMessageStyles.AiUserMessageXsContentTypeFileAccent -> + AiUserMessage.Xs.ContentTypeFile.Accent + AiUserMessageStyles.AiUserMessageXsContentTypeFilePositive -> + AiUserMessage.Xs.ContentTypeFile.Positive + AiUserMessageStyles.AiUserMessageXsContentTypeFileNegative -> + AiUserMessage.Xs.ContentTypeFile.Negative + AiUserMessageStyles.AiUserMessageXsContentTypeFileWarning -> + AiUserMessage.Xs.ContentTypeFile.Warning + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryDefault -> + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Default + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondarySecondary -> + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Secondary + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryAccent -> + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Accent + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryPositive -> + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Positive + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryNegative -> + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Negative + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryWarning -> + AiUserMessage.Xs.ContentTypeFile.ContentViewSecondary.Warning + } + return builder.modify(modify).style() +} + +/** + * Возвращает экземпляр [AiUserMessageStyles] для ai-user-message + */ +public fun AiUserMessageStyles.Companion.resolve( + size: AiUserMessageSize = AiUserMessageSize.M, + contentType: AiUserMessageContentType = AiUserMessageContentType.Image, + contentView: AiUserMessageContentView = AiUserMessageContentView.Default, + view: AiUserMessageView = AiUserMessageView.Default, +): AiUserMessageStyles = when { + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryDefault + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondarySecondary + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryAccent + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryPositive + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryNegative + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageXlContentTypeFileContentViewSecondaryWarning + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryDefault + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondarySecondary + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryAccent + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryPositive + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryNegative + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageLContentTypeFileContentViewSecondaryWarning + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryDefault + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondarySecondary + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryAccent + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryPositive + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryNegative + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageMContentTypeFileContentViewSecondaryWarning + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryDefault + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondarySecondary + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryAccent + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryPositive + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryNegative + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageSContentTypeFileContentViewSecondaryWarning + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryDefault + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondarySecondary + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryAccent + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryPositive + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryNegative + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && contentView == + AiUserMessageContentView.Secondary && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageXsContentTypeFileContentViewSecondaryWarning + size == AiUserMessageSize.Xl && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageXlContentViewSecondaryDefault + size == AiUserMessageSize.Xl && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageXlContentViewSecondarySecondary + size == AiUserMessageSize.Xl && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageXlContentViewSecondaryAccent + size == AiUserMessageSize.Xl && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageXlContentViewSecondaryPositive + size == AiUserMessageSize.Xl && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageXlContentViewSecondaryNegative + size == AiUserMessageSize.Xl && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageXlContentViewSecondaryWarning + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageXlContentTypeFileDefault + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Secondary -> AiUserMessageStyles.AiUserMessageXlContentTypeFileSecondary + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageXlContentTypeFileAccent + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageXlContentTypeFilePositive + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageXlContentTypeFileNegative + size == AiUserMessageSize.Xl && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageXlContentTypeFileWarning + size == AiUserMessageSize.L && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageLContentViewSecondaryDefault + size == AiUserMessageSize.L && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageLContentViewSecondarySecondary + size == AiUserMessageSize.L && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageLContentViewSecondaryAccent + size == AiUserMessageSize.L && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageLContentViewSecondaryPositive + size == AiUserMessageSize.L && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageLContentViewSecondaryNegative + size == AiUserMessageSize.L && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageLContentViewSecondaryWarning + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageLContentTypeFileDefault + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Secondary -> AiUserMessageStyles.AiUserMessageLContentTypeFileSecondary + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageLContentTypeFileAccent + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageLContentTypeFilePositive + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageLContentTypeFileNegative + size == AiUserMessageSize.L && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageLContentTypeFileWarning + size == AiUserMessageSize.M && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageMContentViewSecondaryDefault + size == AiUserMessageSize.M && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageMContentViewSecondarySecondary + size == AiUserMessageSize.M && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageMContentViewSecondaryAccent + size == AiUserMessageSize.M && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageMContentViewSecondaryPositive + size == AiUserMessageSize.M && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageMContentViewSecondaryNegative + size == AiUserMessageSize.M && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageMContentViewSecondaryWarning + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageMContentTypeFileDefault + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Secondary -> AiUserMessageStyles.AiUserMessageMContentTypeFileSecondary + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageMContentTypeFileAccent + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageMContentTypeFilePositive + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageMContentTypeFileNegative + size == AiUserMessageSize.M && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageMContentTypeFileWarning + size == AiUserMessageSize.S && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageSContentViewSecondaryDefault + size == AiUserMessageSize.S && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageSContentViewSecondarySecondary + size == AiUserMessageSize.S && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageSContentViewSecondaryAccent + size == AiUserMessageSize.S && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageSContentViewSecondaryPositive + size == AiUserMessageSize.S && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageSContentViewSecondaryNegative + size == AiUserMessageSize.S && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageSContentViewSecondaryWarning + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageSContentTypeFileDefault + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Secondary -> AiUserMessageStyles.AiUserMessageSContentTypeFileSecondary + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageSContentTypeFileAccent + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageSContentTypeFilePositive + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageSContentTypeFileNegative + size == AiUserMessageSize.S && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageSContentTypeFileWarning + size == AiUserMessageSize.Xs && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageXsContentViewSecondaryDefault + size == AiUserMessageSize.Xs && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageXsContentViewSecondarySecondary + size == AiUserMessageSize.Xs && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageXsContentViewSecondaryAccent + size == AiUserMessageSize.Xs && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageXsContentViewSecondaryPositive + size == AiUserMessageSize.Xs && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageXsContentViewSecondaryNegative + size == AiUserMessageSize.Xs && contentView == AiUserMessageContentView.Secondary && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageXsContentViewSecondaryWarning + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Default -> AiUserMessageStyles.AiUserMessageXsContentTypeFileDefault + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Secondary -> AiUserMessageStyles.AiUserMessageXsContentTypeFileSecondary + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Accent -> AiUserMessageStyles.AiUserMessageXsContentTypeFileAccent + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Positive -> AiUserMessageStyles.AiUserMessageXsContentTypeFilePositive + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Negative -> AiUserMessageStyles.AiUserMessageXsContentTypeFileNegative + size == AiUserMessageSize.Xs && contentType == AiUserMessageContentType.File && view == + AiUserMessageView.Warning -> AiUserMessageStyles.AiUserMessageXsContentTypeFileWarning + size == AiUserMessageSize.Xl && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageXlDefault + size == AiUserMessageSize.Xl && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageXlSecondary + size == AiUserMessageSize.Xl && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageXlAccent + size == AiUserMessageSize.Xl && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageXlPositive + size == AiUserMessageSize.Xl && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageXlNegative + size == AiUserMessageSize.Xl && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageXlWarning + size == AiUserMessageSize.L && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageLDefault + size == AiUserMessageSize.L && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageLSecondary + size == AiUserMessageSize.L && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageLAccent + size == AiUserMessageSize.L && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageLPositive + size == AiUserMessageSize.L && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageLNegative + size == AiUserMessageSize.L && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageLWarning + size == AiUserMessageSize.M && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageMDefault + size == AiUserMessageSize.M && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageMSecondary + size == AiUserMessageSize.M && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageMAccent + size == AiUserMessageSize.M && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageMPositive + size == AiUserMessageSize.M && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageMNegative + size == AiUserMessageSize.M && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageMWarning + size == AiUserMessageSize.S && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageSDefault + size == AiUserMessageSize.S && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageSSecondary + size == AiUserMessageSize.S && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageSAccent + size == AiUserMessageSize.S && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageSPositive + size == AiUserMessageSize.S && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageSNegative + size == AiUserMessageSize.S && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageSWarning + size == AiUserMessageSize.Xs && view == AiUserMessageView.Default -> + AiUserMessageStyles.AiUserMessageXsDefault + size == AiUserMessageSize.Xs && view == AiUserMessageView.Secondary -> + AiUserMessageStyles.AiUserMessageXsSecondary + size == AiUserMessageSize.Xs && view == AiUserMessageView.Accent -> + AiUserMessageStyles.AiUserMessageXsAccent + size == AiUserMessageSize.Xs && view == AiUserMessageView.Positive -> + AiUserMessageStyles.AiUserMessageXsPositive + size == AiUserMessageSize.Xs && view == AiUserMessageView.Negative -> + AiUserMessageStyles.AiUserMessageXsNegative + size == AiUserMessageSize.Xs && view == AiUserMessageView.Warning -> + AiUserMessageStyles.AiUserMessageXsWarning + else -> error("Unsupported ai-user-message style combination") +} + +/** + * Возвращает [AiUserMessageStyle] для ai-user-message + */ +@Composable +public fun AiUserMessageStyles.Companion.style( + size: AiUserMessageSize = AiUserMessageSize.M, + contentType: AiUserMessageContentType = AiUserMessageContentType.Image, + contentView: AiUserMessageContentView = AiUserMessageContentView.Default, + view: AiUserMessageView = AiUserMessageView.Default, + modify: @Composable AiUserMessageStyleBuilder.() -> Unit = {}, +): AiUserMessageStyle = resolve(size, contentType, contentView, view).style(modify) diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroup.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroup.kt new file mode 100644 index 000000000..d4aa09108 --- /dev/null +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroup.kt @@ -0,0 +1,7 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +package com.sdds.serv.styles.buttongroup + +/** + * Вспомогательный объект для описания API и стиля компонента AiUserMessageEmbeddedIconButtonGroup + */ +public object AiUserMessageEmbeddedIconButtonGroup diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroupStyles.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroupStyles.kt new file mode 100644 index 000000000..3fff29e21 --- /dev/null +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/AiUserMessageEmbeddedIconButtonGroupStyles.kt @@ -0,0 +1,71 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +@file:Suppress( + "UndocumentedPublicClass", + "UndocumentedPublicProperty", + "ktlint:standard:max-line-length", +) + +package com.sdds.serv.styles.buttongroup + +import androidx.compose.runtime.Composable +import androidx.compose.ui.unit.dp +import com.sdds.compose.uikit.ButtonGroupStyle +import com.sdds.compose.uikit.ButtonGroupStyleBuilder +import com.sdds.compose.uikit.style.BuilderWrapper +import com.sdds.compose.uikit.style.style +import com.sdds.compose.uikit.style.wrap +import com.sdds.serv.styles.iconbutton.EmbeddedIconButton +import com.sdds.serv.styles.iconbutton.M +import com.sdds.serv.styles.iconbutton.S +import com.sdds.serv.styles.iconbutton.Secondary +import kotlin.Suppress +import kotlin.jvm.JvmInline +import kotlin.jvm.JvmName + +/** + * Базовый интерфейс для всех оберток этого стиля + */ +public interface WrapperAiUserMessageEmbeddedIconButtonGroup : + BuilderWrapper + +/** + * Обертка для вариации S + */ +@JvmInline +public value class WrapperAiUserMessageEmbeddedIconButtonGroupS( + public override val builder: ButtonGroupStyleBuilder, +) : WrapperAiUserMessageEmbeddedIconButtonGroup + +/** + * Обертка для вариации M + */ +@JvmInline +public value class WrapperAiUserMessageEmbeddedIconButtonGroupM( + public override val builder: ButtonGroupStyleBuilder, +) : WrapperAiUserMessageEmbeddedIconButtonGroup + +private val ButtonGroupStyleBuilder.invariantProps: ButtonGroupStyleBuilder + @Composable + get() = this + +public val AiUserMessageEmbeddedIconButtonGroup.S: WrapperAiUserMessageEmbeddedIconButtonGroupS + @Composable + @JvmName("WrapperAiUserMessageEmbeddedIconButtonGroupS") + get() = ButtonGroupStyle.builder(this) + .invariantProps + .buttonStyle(EmbeddedIconButton.S.Secondary.style()) + .dimensions { + spacing(8.0.dp) + } + .wrap(::WrapperAiUserMessageEmbeddedIconButtonGroupS) + +public val AiUserMessageEmbeddedIconButtonGroup.M: WrapperAiUserMessageEmbeddedIconButtonGroupM + @Composable + @JvmName("WrapperAiUserMessageEmbeddedIconButtonGroupM") + get() = ButtonGroupStyle.builder(this) + .invariantProps + .buttonStyle(EmbeddedIconButton.M.Secondary.style()) + .dimensions { + spacing(8.0.dp) + } + .wrap(::WrapperAiUserMessageEmbeddedIconButtonGroupM) diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/ButtonGroupStylesCollection.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/ButtonGroupStylesCollection.kt index 3c2382c8b..ee9c470be 100644 --- a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/ButtonGroupStylesCollection.kt +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/buttongroup/ButtonGroupStylesCollection.kt @@ -155,6 +155,8 @@ public enum class ButtonGroupStyles( AiAnswerBasicButtonGroupS("AiAnswerBasicButtonGroup.S"), AiAnswerBasicButtonGroupM("AiAnswerBasicButtonGroup.M"), AiAnswerBasicButtonGroupL("AiAnswerBasicButtonGroup.L"), + AiUserMessageEmbeddedIconButtonGroupS("AiUserMessageEmbeddedIconButtonGroup.S"), + AiUserMessageEmbeddedIconButtonGroupM("AiUserMessageEmbeddedIconButtonGroup.M"), ; /** @@ -186,6 +188,11 @@ public enum class ButtonGroupStyles( * Typed API для подбора стиля ai-answer-basic-button-group */ public object AiAnswerBasicButtonGroup + + /** + * Typed API для подбора стиля ai-user-message-embedded-icon-button-group + */ + public object AiUserMessageEmbeddedIconButtonGroup } /** @@ -293,6 +300,14 @@ public enum class AiAnswerBasicButtonGroupSize { L, } +/** + * Возможные значения свойства size для ai-user-message-embedded-icon-button-group + */ +public enum class AiUserMessageEmbeddedIconButtonGroupSize { + S, + M, +} + /** * Возвращает [ButtonGroupStyle] для [ButtonGroupStyles] */ @@ -429,6 +444,10 @@ public fun ButtonGroupStyles.style(modify: @Composable ButtonGroupStyleBuilder.( ButtonGroupStyles.AiAnswerBasicButtonGroupS -> AiAnswerBasicButtonGroup.S ButtonGroupStyles.AiAnswerBasicButtonGroupM -> AiAnswerBasicButtonGroup.M ButtonGroupStyles.AiAnswerBasicButtonGroupL -> AiAnswerBasicButtonGroup.L + ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroupS -> + AiUserMessageEmbeddedIconButtonGroup.S + ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroupM -> + AiUserMessageEmbeddedIconButtonGroup.M } return builder.modify(modify).style() } @@ -799,3 +818,28 @@ public fun ButtonGroupStyles.AiAnswerBasicButtonGroup.style( modify: @Composable ButtonGroupStyleBuilder.() -> Unit = {}, ): ButtonGroupStyle = resolve(size).style(modify) + +/** + * Возвращает экземпляр [ButtonGroupStyles] для ai-user-message-embedded-icon-button-group + */ +public fun ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroup.resolve( + size: AiUserMessageEmbeddedIconButtonGroupSize = + AiUserMessageEmbeddedIconButtonGroupSize.M, +): ButtonGroupStyles = when { + size == AiUserMessageEmbeddedIconButtonGroupSize.S -> + ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroupS + size == AiUserMessageEmbeddedIconButtonGroupSize.M -> + ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroupM + else -> error("Unsupported ai-user-message-embedded-icon-button-group style combination") +} + +/** + * Возвращает [ButtonGroupStyle] для ai-user-message-embedded-icon-button-group + */ +@Composable +public fun ButtonGroupStyles.AiUserMessageEmbeddedIconButtonGroup.style( + size: AiUserMessageEmbeddedIconButtonGroupSize = + AiUserMessageEmbeddedIconButtonGroupSize.M, + modify: @Composable + ButtonGroupStyleBuilder.() -> Unit = {}, +): ButtonGroupStyle = resolve(size).style(modify) diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditable.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditable.kt new file mode 100644 index 000000000..524a33fa1 --- /dev/null +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditable.kt @@ -0,0 +1,7 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +package com.sdds.serv.styles.editable + +/** + * Вспомогательный объект для описания API и стиля компонента AiUserMessageEditable + */ +public object AiUserMessageEditable diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditableStyles.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditableStyles.kt new file mode 100644 index 000000000..f2db2cfe2 --- /dev/null +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/AiUserMessageEditableStyles.kt @@ -0,0 +1,112 @@ +// AUTO-GENERATED. DO NOT MODIFY this file. +@file:Suppress( + "UndocumentedPublicClass", + "UndocumentedPublicProperty", + "ktlint:standard:max-line-length", +) + +package com.sdds.serv.styles.editable + +import androidx.compose.runtime.Composable +import com.sdds.compose.uikit.EditableStyle +import com.sdds.compose.uikit.EditableStyleBuilder +import com.sdds.compose.uikit.interactions.asStatefulValue +import com.sdds.compose.uikit.style.BuilderWrapper +import com.sdds.compose.uikit.style.wrap +import com.sdds.serv.theme.SddsServTheme +import kotlin.Suppress +import kotlin.jvm.JvmInline +import kotlin.jvm.JvmName + +/** + * Базовый интерфейс для всех оберток этого стиля + */ +public interface WrapperAiUserMessageEditable : BuilderWrapper + +/** + * Обертка для вариации Xl + */ +@JvmInline +public value class WrapperAiUserMessageEditableXl( + public override val builder: EditableStyleBuilder, +) : WrapperAiUserMessageEditable + +/** + * Обертка для вариации L + */ +@JvmInline +public value class WrapperAiUserMessageEditableL( + public override val builder: EditableStyleBuilder, +) : WrapperAiUserMessageEditable + +/** + * Обертка для вариации M + */ +@JvmInline +public value class WrapperAiUserMessageEditableM( + public override val builder: EditableStyleBuilder, +) : WrapperAiUserMessageEditable + +/** + * Обертка для вариации S + */ +@JvmInline +public value class WrapperAiUserMessageEditableS( + public override val builder: EditableStyleBuilder, +) : WrapperAiUserMessageEditable + +/** + * Обертка для вариации Xs + */ +@JvmInline +public value class WrapperAiUserMessageEditableXs( + public override val builder: EditableStyleBuilder, +) : WrapperAiUserMessageEditable + +private val EditableStyleBuilder.invariantProps: EditableStyleBuilder + @Composable + get() = this + .colors { + textColor(SddsServTheme.colors.textDefaultPrimary.asStatefulValue()) + cursorColor(SddsServTheme.colors.textDefaultAccent.asStatefulValue()) + } + +public val AiUserMessageEditable.Xl: WrapperAiUserMessageEditableXl + @Composable + @JvmName("WrapperAiUserMessageEditableXl") + get() = EditableStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyLNormal) + .wrap(::WrapperAiUserMessageEditableXl) + +public val AiUserMessageEditable.L: WrapperAiUserMessageEditableL + @Composable + @JvmName("WrapperAiUserMessageEditableL") + get() = EditableStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyLNormal) + .wrap(::WrapperAiUserMessageEditableL) + +public val AiUserMessageEditable.M: WrapperAiUserMessageEditableM + @Composable + @JvmName("WrapperAiUserMessageEditableM") + get() = EditableStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyMNormal) + .wrap(::WrapperAiUserMessageEditableM) + +public val AiUserMessageEditable.S: WrapperAiUserMessageEditableS + @Composable + @JvmName("WrapperAiUserMessageEditableS") + get() = EditableStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodySNormal) + .wrap(::WrapperAiUserMessageEditableS) + +public val AiUserMessageEditable.Xs: WrapperAiUserMessageEditableXs + @Composable + @JvmName("WrapperAiUserMessageEditableXs") + get() = EditableStyle.builder(this) + .invariantProps + .textStyle(SddsServTheme.typography.bodyXsNormal) + .wrap(::WrapperAiUserMessageEditableXs) diff --git a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/EditableStylesCollection.kt b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/EditableStylesCollection.kt index 97e8d5d5c..6f9a55d7b 100644 --- a/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/EditableStylesCollection.kt +++ b/tokens/sdds.serv.compose/src/main/kotlin/com/sdds/serv/styles/editable/EditableStylesCollection.kt @@ -35,18 +35,28 @@ public enum class EditableStyles( EditableBodyS("Editable.BodyS"), EditableBodyXs("Editable.BodyXs"), EditableBodyXxs("Editable.BodyXxs"), + AiUserMessageEditableXl("AiUserMessageEditable.Xl"), + AiUserMessageEditableL("AiUserMessageEditable.L"), + AiUserMessageEditableM("AiUserMessageEditable.M"), + AiUserMessageEditableS("AiUserMessageEditable.S"), + AiUserMessageEditableXs("AiUserMessageEditable.Xs"), ; /** * Typed API для подбора стиля editable */ - public companion object + public object Default + + /** + * Typed API для подбора стиля ai-user-message-editable + */ + public object AiUserMessageEditable } /** * Возможные значения свойства size для editable */ -public enum class EditableSize { +public enum class EditableDefaultSize { H1, H2, H3, @@ -59,6 +69,17 @@ public enum class EditableSize { BodyXxs, } +/** + * Возможные значения свойства size для ai-user-message-editable + */ +public enum class AiUserMessageEditableSize { + Xl, + L, + M, + S, + Xs, +} + /** * Возвращает [EditableStyle] для [EditableStyles] */ @@ -75,6 +96,11 @@ public fun EditableStyles.style(modify: @Composable EditableStyleBuilder.() -> U EditableStyles.EditableBodyS -> Editable.BodyS EditableStyles.EditableBodyXs -> Editable.BodyXs EditableStyles.EditableBodyXxs -> Editable.BodyXxs + EditableStyles.AiUserMessageEditableXl -> AiUserMessageEditable.Xl + EditableStyles.AiUserMessageEditableL -> AiUserMessageEditable.L + EditableStyles.AiUserMessageEditableM -> AiUserMessageEditable.M + EditableStyles.AiUserMessageEditableS -> AiUserMessageEditable.S + EditableStyles.AiUserMessageEditableXs -> AiUserMessageEditable.Xs } return builder.modify(modify).style() } @@ -82,27 +108,51 @@ public fun EditableStyles.style(modify: @Composable EditableStyleBuilder.() -> U /** * Возвращает экземпляр [EditableStyles] для editable */ -public fun EditableStyles.Companion.resolve(size: EditableSize = EditableSize.H1): EditableStyles = - when { - size == EditableSize.H1 -> EditableStyles.EditableH1 - size == EditableSize.H2 -> EditableStyles.EditableH2 - size == EditableSize.H3 -> EditableStyles.EditableH3 - size == EditableSize.H4 -> EditableStyles.EditableH4 - size == EditableSize.H5 -> EditableStyles.EditableH5 - size == EditableSize.BodyL -> EditableStyles.EditableBodyL - size == EditableSize.BodyM -> EditableStyles.EditableBodyM - size == EditableSize.BodyS -> EditableStyles.EditableBodyS - size == EditableSize.BodyXs -> EditableStyles.EditableBodyXs - size == EditableSize.BodyXxs -> EditableStyles.EditableBodyXxs - else -> error("Unsupported editable style combination") - } +public fun EditableStyles.Default.resolve(size: EditableDefaultSize = EditableDefaultSize.H1): EditableStyles = when { + size == EditableDefaultSize.H1 -> EditableStyles.EditableH1 + size == EditableDefaultSize.H2 -> EditableStyles.EditableH2 + size == EditableDefaultSize.H3 -> EditableStyles.EditableH3 + size == EditableDefaultSize.H4 -> EditableStyles.EditableH4 + size == EditableDefaultSize.H5 -> EditableStyles.EditableH5 + size == EditableDefaultSize.BodyL -> EditableStyles.EditableBodyL + size == EditableDefaultSize.BodyM -> EditableStyles.EditableBodyM + size == EditableDefaultSize.BodyS -> EditableStyles.EditableBodyS + size == EditableDefaultSize.BodyXs -> EditableStyles.EditableBodyXs + size == EditableDefaultSize.BodyXxs -> EditableStyles.EditableBodyXxs + else -> error("Unsupported editable style combination") +} /** * Возвращает [EditableStyle] для editable */ @Composable -public fun EditableStyles.Companion.style( - size: EditableSize = EditableSize.H1, - modify: @Composable - EditableStyleBuilder.() -> Unit = {}, +public fun EditableStyles.Default.style( + size: EditableDefaultSize = EditableDefaultSize.H1, + modify: @Composable EditableStyleBuilder.() -> Unit = {}, +): EditableStyle = + resolve(size).style(modify) + +/** + * Возвращает экземпляр [EditableStyles] для ai-user-message-editable + */ +public fun EditableStyles.AiUserMessageEditable.resolve( + size: AiUserMessageEditableSize = + AiUserMessageEditableSize.M, +): EditableStyles = when { + size == AiUserMessageEditableSize.Xl -> EditableStyles.AiUserMessageEditableXl + size == AiUserMessageEditableSize.L -> EditableStyles.AiUserMessageEditableL + size == AiUserMessageEditableSize.M -> EditableStyles.AiUserMessageEditableM + size == AiUserMessageEditableSize.S -> EditableStyles.AiUserMessageEditableS + size == AiUserMessageEditableSize.Xs -> EditableStyles.AiUserMessageEditableXs + else -> error("Unsupported ai-user-message-editable style combination") +} + +/** + * Возвращает [EditableStyle] для ai-user-message-editable + */ +@Composable +public fun EditableStyles.AiUserMessageEditable.style( + size: AiUserMessageEditableSize = + AiUserMessageEditableSize.M, + modify: @Composable EditableStyleBuilder.() -> Unit = {}, ): EditableStyle = resolve(size).style(modify)