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 bbca8accc..601d1d172 100644 Binary files a/tokens/sdds-sbcom-compose/screenshots-compose/testDropdownMenuStrictClippedPlacementStartAlignmentCenter_light.png and b/tokens/sdds-sbcom-compose/screenshots-compose/testDropdownMenuStrictClippedPlacementStartAlignmentCenter_light.png differ diff --git a/tokens/sdds-sbcom-compose/screenshots-compose/testPopoverStrictClippedPlacementEndAlignmentEnd_light.png b/tokens/sdds-sbcom-compose/screenshots-compose/testPopoverStrictClippedPlacementEndAlignmentEnd_light.png index 8ecc47b51..7e7fe5567 100644 Binary files a/tokens/sdds-sbcom-compose/screenshots-compose/testPopoverStrictClippedPlacementEndAlignmentEnd_light.png and b/tokens/sdds-sbcom-compose/screenshots-compose/testPopoverStrictClippedPlacementEndAlignmentEnd_light.png differ 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)