// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package google.apps.card.v1;
import "google/type/color.proto";
option csharp_namespace = "Google.Apps.Card.V1";
option go_package = "google.golang.org/genproto/googleapis/apps/card/v1;card";
option java_multiple_files = true;
option java_outer_classname = "CardProto";
option java_package = "com.google.apps.card.v1";
option php_namespace = "Google\\Apps\\Card\\V1";
option ruby_package = "Google::Apps::Card::V1";
// A card interface displayed in a Google Chat message or Google Workspace
// Add-on.
//
// Cards support a defined layout, interactive UI elements like buttons, and
// rich media like images. Use cards to present detailed information,
// gather information from users, and guide users to take a next step.
//
// [Card builder](https://addons.gsuite.google.com/uikit/builder)
//
// To learn how
// to build cards, see the following documentation:
//
// * For Google Chat apps, see [Design the components of a card or
// dialog](https://developers.google.com/workspace/chat/design-components-card-dialog).
// * For Google Workspace Add-ons, see [Card-based
// interfaces](https://developers.google.com/apps-script/add-ons/concepts/cards).
//
// **Example: Card message for a Google Chat app**
//
// ![Example contact
// card](https://developers.google.com/workspace/chat/images/card_api_reference.png)
//
// To create the sample card message in Google Chat, use the following JSON:
//
// ```
// {
// "cardsV2": [
// {
// "cardId": "unique-card-id",
// "card": {
// "header": {
// "title": "Sasha",
// "subtitle": "Software Engineer",
// "imageUrl":
// "https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png",
// "imageType": "CIRCLE",
// "imageAltText": "Avatar for Sasha"
// },
// "sections": [
// {
// "header": "Contact Info",
// "collapsible": true,
// "uncollapsibleWidgetsCount": 1,
// "widgets": [
// {
// "decoratedText": {
// "startIcon": {
// "knownIcon": "EMAIL"
// },
// "text": "sasha@example.com"
// }
// },
// {
// "decoratedText": {
// "startIcon": {
// "knownIcon": "PERSON"
// },
// "text": "Online"
// }
// },
// {
// "decoratedText": {
// "startIcon": {
// "knownIcon": "PHONE"
// },
// "text": "+1 (555) 555-1234"
// }
// },
// {
// "buttonList": {
// "buttons": [
// {
// "text": "Share",
// "onClick": {
// "openLink": {
// "url": "https://example.com/share"
// }
// }
// },
// {
// "text": "Edit",
// "onClick": {
// "action": {
// "function": "goToView",
// "parameters": [
// {
// "key": "viewType",
// "value": "EDIT"
// }
// ]
// }
// }
// }
// ]
// }
// }
// ]
// }
// ]
// }
// }
// ]
// }
// ```
message Card {
// Represents a card header. For an example in Google Chat apps, see [Add a
// header](https://developers.google.com/workspace/chat/design-components-card-dialog#add_a_header).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message CardHeader {
// Required. The title of the card header.
// The header has a fixed height: if both a
// title and subtitle are specified, each takes up one line. If only the
// title is specified, it takes up both lines.
string title = 1;
// The subtitle of the card header. If specified, appears on its own line
// below the `title`.
string subtitle = 2;
// The shape used to crop the image.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
Widget.ImageType image_type = 3;
// The HTTPS URL of the image in the card header.
string image_url = 4;
// The alternative text of this image that's used for accessibility.
string image_alt_text = 5;
}
// A section contains a collection of widgets that are rendered
// vertically in the order that they're specified.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message Section {
// Text that appears at the top of a section.
// Supports simple HTML formatted text. For more information
// about formatting text, see
// [Formatting text in Google Chat
// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
// and
// [Formatting
// text in Google Workspace
// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
string header = 1;
// All the widgets in the section.
// Must contain at least one widget.
repeated Widget widgets = 2;
// Indicates whether this section is collapsible.
//
// Collapsible sections hide some or all widgets, but users can expand the
// section to reveal the hidden widgets by clicking **Show more**. Users
// can hide the widgets again by clicking **Show less**.
//
// To determine which widgets are hidden, specify
// `uncollapsibleWidgetsCount`.
bool collapsible = 5;
// The number of uncollapsible widgets which remain visible even when a
// section is collapsed.
//
// For example, when a section
// contains five widgets and the `uncollapsibleWidgetsCount` is set to `2`,
// the first two widgets are always shown and the last three are collapsed
// by default. The `uncollapsibleWidgetsCount` is taken into account only
// when `collapsible` is `true`.
int32 uncollapsible_widgets_count = 6;
}
// The divider style of a card. Currently only used for dividers betweens card
// sections.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
enum DividerStyle {
// Don't use. Unspecified.
DIVIDER_STYLE_UNSPECIFIED = 0;
// Default option. Render a solid divider between sections.
SOLID_DIVIDER = 1;
// If set, no divider is rendered between sections.
NO_DIVIDER = 2;
}
// A card action is the action associated with the card. For example,
// an invoice card might include actions such as delete invoice, email
// invoice, or open the invoice in a browser.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
message CardAction {
// The label that displays as the action menu item.
string action_label = 1;
// The `onClick` action for this action item.
OnClick on_click = 2;
}
// A persistent (sticky) footer that that appears at the bottom of the card.
//
// Setting `fixedFooter` without specifying a `primaryButton` or a
// `secondaryButton` causes an error.
//
// For Chat apps, you can use fixed footers in
// [dialogs](https://developers.google.com/workspace/chat/dialogs), but not
// [card
// messages](https://developers.google.com/workspace/chat/create-messages#create).
// For an example in Google Chat apps, see [Add a persistent
// footer](https://developers.google.com/workspace/chat/design-components-card-dialog#add_a_persistent_footer).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message CardFixedFooter {
// The primary button of the fixed footer. The button must be a text button
// with text and color set.
Button primary_button = 1;
// The secondary button of the fixed footer. The button must be a text
// button with text and color set.
// If `secondaryButton` is set, you must also set `primaryButton`.
Button secondary_button = 2;
}
// In Google Workspace Add-ons,
// determines how a card is displayed.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
enum DisplayStyle {
// Don't use. Unspecified.
DISPLAY_STYLE_UNSPECIFIED = 0;
// The header of the card appears at the bottom of the
// sidebar, partially covering the current top card of the stack. Clicking
// the header pops the card into the card stack. If the card has no header,
// a generated header is used instead.
PEEK = 1;
// Default value. The card is shown by replacing the view of the top card in
// the card stack.
REPLACE = 2;
}
// The header of the card. A header usually contains a leading image and a
// title. Headers always appear at the top of a card.
CardHeader header = 1;
// Contains a collection of widgets. Each section has its own, optional
// header. Sections are visually separated by a line divider. For an example
// in Google Chat apps, see [Define a section of a
// card](https://developers.google.com/workspace/chat/design-components-card-dialog#define_a_section_of_a_card).
repeated Section sections = 2;
// The divider style between sections.
DividerStyle section_divider_style = 9;
// The card's actions. Actions are added to the card's toolbar menu.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
//
// For example, the following JSON constructs a card action menu with
// `Settings` and `Send Feedback` options:
//
// ```
// "card_actions": [
// {
// "actionLabel": "Settings",
// "onClick": {
// "action": {
// "functionName": "goToView",
// "parameters": [
// {
// "key": "viewType",
// "value": "SETTING"
// }
// ],
// "loadIndicator": "LoadIndicator.SPINNER"
// }
// }
// },
// {
// "actionLabel": "Send Feedback",
// "onClick": {
// "openLink": {
// "url": "https://example.com/feedback"
// }
// }
// }
// ]
// ```
repeated CardAction card_actions = 3;
// Name of the card. Used as a card identifier in card navigation.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
string name = 4;
// The fixed footer shown at the bottom of this card.
//
// Setting `fixedFooter` without specifying a `primaryButton` or a
// `secondaryButton` causes an error. For Chat apps, you can use fixed footers
// in
// [dialogs](https://developers.google.com/workspace/chat/dialogs), but not
// [card
// messages](https://developers.google.com/workspace/chat/create-messages#create).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
CardFixedFooter fixed_footer = 5;
// In Google Workspace Add-ons, sets the display properties of the
// `peekCardHeader`.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
DisplayStyle display_style = 6;
// When displaying contextual content, the peek card header acts as a
// placeholder so that the user can navigate forward between the homepage
// cards and the contextual cards.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
CardHeader peek_card_header = 7;
}
// Each card is made up of widgets.
//
// A widget is a composite object that can represent one of text, images,
// buttons, and other object types.
message Widget {
// The shape used to crop the image.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
enum ImageType {
// Default value. Applies a square mask to the image. For example, a 4x3
// image becomes 3x3.
SQUARE = 0;
// Applies a circular mask to the image. For example, a 4x3 image becomes a
// circle with a diameter of 3.
CIRCLE = 1;
}
// Specifies whether widgets align to the left, right, or center of a column.
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
enum HorizontalAlignment {
// Don't use. Unspecified.
HORIZONTAL_ALIGNMENT_UNSPECIFIED = 0;
// Default value. Aligns widgets to the start position of the column. For
// left-to-right layouts, aligns to the left. For right-to-left layouts,
// aligns to the right.
START = 1;
// Aligns widgets to the center of the column.
CENTER = 2;
// Aligns widgets to the end position of the column. For left-to-right
// layouts, aligns widgets to the right. For right-to-left layouts, aligns
// widgets to the left.
END = 3;
}
// A widget can only have one of the following items. You can use multiple
// widget fields to display more items.
oneof data {
// Displays a text paragraph. Supports simple HTML formatted text. For more
// information about formatting text, see
// [Formatting text in Google Chat
// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
// and
// [Formatting
// text in Google Workspace
// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
//
// For example, the following JSON creates a bolded text:
// ```
// "textParagraph": {
// "text": " bold text"
// }
// ```
TextParagraph text_paragraph = 1;
// Displays an image.
//
// For example, the following JSON creates an image with alternative text:
// ```
// "image": {
// "imageUrl":
// "https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png",
// "altText": "Chat app avatar"
// }
// ```
Image image = 2;
// Displays a decorated text item.
//
// For example, the following JSON creates a decorated text widget showing
// email address:
//
// ```
// "decoratedText": {
// "icon": {
// "knownIcon": "EMAIL"
// },
// "topLabel": "Email Address",
// "text": "sasha@example.com",
// "bottomLabel": "This is a new Email address!",
// "switchControl": {
// "name": "has_send_welcome_email_to_sasha",
// "selected": false,
// "controlType": "CHECKBOX"
// }
// }
// ```
DecoratedText decorated_text = 3;
// A list of buttons.
//
// For example, the following JSON creates two buttons. The first
// is a blue text button and the second is an image button that opens a
// link:
// ```
// "buttonList": {
// "buttons": [
// {
// "text": "Edit",
// "color": {
// "red": 0,
// "green": 0,
// "blue": 1,
// "alpha": 1
// },
// "disabled": true,
// },
// {
// "icon": {
// "knownIcon": "INVITE",
// "altText": "check calendar"
// },
// "onClick": {
// "openLink": {
// "url": "https://example.com/calendar"
// }
// }
// }
// ]
// }
// ```
ButtonList button_list = 4;
// Displays a text box that users can type into.
//
// For example, the following JSON creates a text input for an email
// address:
//
// ```
// "textInput": {
// "name": "mailing_address",
// "label": "Mailing Address"
// }
// ```
//
// As another example, the following JSON creates a text input for a
// programming language with static suggestions:
// ```
// "textInput": {
// "name": "preferred_programing_language",
// "label": "Preferred Language",
// "initialSuggestions": {
// "items": [
// {
// "text": "C++"
// },
// {
// "text": "Java"
// },
// {
// "text": "JavaScript"
// },
// {
// "text": "Python"
// }
// ]
// }
// }
// ```
TextInput text_input = 5;
// Displays a selection control that lets users select items. Selection
// controls can be checkboxes, radio buttons, switches, or dropdown menus.
//
// For example, the following JSON creates a dropdown menu that lets users
// choose a size:
//
// ```
// "selectionInput": {
// "name": "size",
// "label": "Size"
// "type": "DROPDOWN",
// "items": [
// {
// "text": "S",
// "value": "small",
// "selected": false
// },
// {
// "text": "M",
// "value": "medium",
// "selected": true
// },
// {
// "text": "L",
// "value": "large",
// "selected": false
// },
// {
// "text": "XL",
// "value": "extra_large",
// "selected": false
// }
// ]
// }
// ```
SelectionInput selection_input = 6;
// Displays a widget that lets users input a date, time, or date and time.
//
// For example, the following JSON creates a date time picker to schedule an
// appointment:
//
//
// ```
// "dateTimePicker": {
// "name": "appointment_time",
// "label": "Book your appointment at:",
// "type": "DATE_AND_TIME",
// "valueMsEpoch": "796435200000"
// }
// ```
DateTimePicker date_time_picker = 7;
// Displays a horizontal line divider between widgets.
//
// For example, the following JSON creates a divider:
// ```
// "divider": {
// }
// ```
Divider divider = 9;
// Displays a grid with a collection of items.
//
// A grid supports any number of columns and items. The number of rows is
// determined by the upper bounds of the number items divided by the number
// of columns. A grid with 10 items and 2 columns has 5 rows. A grid with 11
// items and 2 columns has 6 rows.
//
// [Google Workspace Add-ons and
// Chat apps](https://developers.google.com/workspace/extend):
//
// For example, the following JSON creates a 2 column grid with a single
// item:
//
// ```
// "grid": {
// "title": "A fine collection of items",
// "columnCount": 2,
// "borderStyle": {
// "type": "STROKE",
// "cornerRadius": 4
// },
// "items": [
// {
// "image": {
// "imageUri": "https://www.example.com/image.png",
// "cropStyle": {
// "type": "SQUARE"
// },
// "borderStyle": {
// "type": "STROKE"
// }
// },
// "title": "An item",
// "textAlignment": "CENTER"
// }
// ],
// "onClick": {
// "openLink": {
// "url": "https://www.example.com"
// }
// }
// }
// ```
Grid grid = 10;
// Displays up to 2 columns.
//
// To include more than 2 columns, or to use rows, use the `Grid` widget.
//
// For example, the following JSON creates 2 columns that each contain
// text paragraphs:
//
// ```
// "columns": {
// "columnItems": [
// {
// "horizontalSizeStyle": "FILL_AVAILABLE_SPACE",
// "horizontalAlignment": "CENTER",
// "verticalAlignment": "CENTER",
// "widgets": [
// {
// "textParagraph": {
// "text": "First column text paragraph"
// }
// }
// ]
// },
// {
// "horizontalSizeStyle": "FILL_AVAILABLE_SPACE",
// "horizontalAlignment": "CENTER",
// "verticalAlignment": "CENTER",
// "widgets": [
// {
// "textParagraph": {
// "text": "Second column text paragraph"
// }
// }
// ]
// }
// ]
// }
// ```
Columns columns = 11;
}
// Specifies whether widgets align to the left, right, or center of a column.
HorizontalAlignment horizontal_alignment = 8;
}
// A paragraph of text that supports formatting. For an example in
// Google Chat apps, see [Add a paragraph of formatted
// text](https://developers.google.com/workspace/chat/add-text-image-card-dialog#add_a_paragraph_of_formatted_text).
// For more information
// about formatting text, see
// [Formatting text in Google Chat
// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
// and
// [Formatting
// text in Google Workspace
// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
//
// [Google Workspace Add-ons and
// Chat apps](https://developers.google.com/workspace/extend):
message TextParagraph {
// The text that's shown in the widget.
string text = 1;
}
// An image that is specified by a URL and can have an `onClick` action. For an
// example, see [Add an
// image](https://developers.google.com/workspace/chat/add-text-image-card-dialog#add_an_image).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message Image {
// The HTTPS URL that hosts the image.
//
// For example:
//
// ```
// https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png
// ```
string image_url = 1;
// When a user clicks the image, the click triggers this action.
OnClick on_click = 2;
// The alternative text of this image that's used for accessibility.
string alt_text = 3;
}
// Displays a divider between widgets as a horizontal line. For an example in
// Google Chat apps, see
// [Add a horizontal divider between
// widgets](https://developers.google.com/workspace/chat/format-structure-card-dialog#add_a_horizontal_divider_between_widgets).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
//
// For example, the following JSON creates a divider:
//
// ```
// "divider": {}
// ```
message Divider {}
// A widget that displays text with optional decorations such as a label above
// or below the text, an icon in front of the text, a selection widget, or a
// button after the text. For an example in
// Google Chat apps, see [Display text with decorative
// text](https://developers.google.com/workspace/chat/add-text-image-card-dialog#display_text_with_decorative_elements).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message DecoratedText {
// Either a toggle-style switch or a checkbox inside a `decoratedText` widget.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
//
// Only supported in the `decoratedText` widget.
message SwitchControl {
// How the switch appears in the user interface.
//
// [Google Workspace Add-ons
// and Chat apps](https://developers.google.com/workspace/extend):
enum ControlType {
// A toggle-style switch.
SWITCH = 0;
// Deprecated in favor of `CHECK_BOX`.
CHECKBOX = 1;
// A checkbox.
CHECK_BOX = 2;
}
// The name by which the switch widget is identified in a form input event.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
string name = 1;
// The value entered by a user, returned as part of a form input event.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
string value = 2;
// When `true`, the switch is selected.
bool selected = 3;
// The action to perform when the switch state is changed, such as what
// function to run.
Action on_change_action = 4;
// How the switch appears in the user interface.
//
// [Google Workspace Add-ons
// and Chat apps](https://developers.google.com/workspace/extend):
ControlType control_type = 5;
}
// Deprecated in favor of `startIcon`.
Icon icon = 1 [deprecated = true];
// The icon displayed in front of the text.
Icon start_icon = 12;
// The text that appears above `text`. Always truncates.
string top_label = 3;
// Required. The primary text.
//
// Supports simple formatting. For more information
// about formatting text, see
// [Formatting text in Google Chat
// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
// and
// [Formatting
// text in Google Workspace
// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
string text = 4;
// The wrap text setting. If `true`, the text wraps and displays on
// multiple lines. Otherwise, the text is truncated.
//
// Only applies to `text`, not `topLabel` and `bottomLabel`.
bool wrap_text = 5;
// The text that appears below `text`. Always wraps.
string bottom_label = 6;
// This action is triggered when users click `topLabel` or `bottomLabel`.
OnClick on_click = 7;
// A button, switch, checkbox, or image that appears to the right-hand side
// of text in the `decoratedText` widget.
oneof control {
// A button that a user can click to trigger an action.
Button button = 8;
// A switch widget that a user can click to change its state and trigger an
// action.
SwitchControl switch_control = 9;
// An icon displayed after the text.
//
// Supports
// [built-in](https://developers.google.com/workspace/chat/format-messages#builtinicons)
// and
// [custom](https://developers.google.com/workspace/chat/format-messages#customicons)
// icons.
Icon end_icon = 11;
}
}
// A field in which users can enter text. Supports suggestions and on-change
// actions. For an example in Google Chat apps, see [Add a field in which a user
// can enter
// text](https://developers.google.com/workspace/chat/design-interactive-card-dialog#add_a_field_in_which_a_user_can_enter_text).
//
// Chat apps receive and can process the value of entered text during form input
// events. For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
//
// When you need to collect undefined or abstract data from users,
// use a text input. To collect defined or enumerated data from users, use the
// [SelectionInput][google.apps.card.v1.SelectionInput] widget.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message TextInput {
// How a text input field appears in the user interface. For example,
// whether it's a single line input field, or a multi-line input. If
// `initialSuggestions` is specified, `type` is always `SINGLE_LINE`,
// even if it's set to `MULTIPLE_LINE`.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
enum Type {
// The text input field has a fixed height of one line.
SINGLE_LINE = 0;
// The text input field has a fixed height of multiple lines.
MULTIPLE_LINE = 1;
}
// The name by which the text input is identified in a form input event.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
string name = 1;
// The text that appears above the text input field in the user interface.
//
// Specify text that helps the user enter the information your app needs.
// For example, if you are asking someone's name, but specifically need their
// surname, write `surname` instead of `name`.
//
// Required if `hintText` is unspecified. Otherwise, optional.
string label = 2;
// Text that appears below the text input field meant to assist users by
// prompting them to enter a certain value. This text is always visible.
//
// Required if `label` is unspecified. Otherwise, optional.
string hint_text = 3;
// The value entered by a user, returned as part of a form input event.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
string value = 4;
// How a text input field appears in the user interface.
// For example, whether the field is single or multi-line.
Type type = 5;
// What to do when a change occurs in the text input field. For example, a
// user adding to the field or deleting text.
//
// Examples of actions to take include running a custom function or opening
// a [dialog](https://developers.google.com/workspace/chat/dialogs)
// in Google Chat.
Action on_change_action = 6;
// Suggested values that users can enter. These values appear when users click
// inside the text input field. As users type, the suggested values
// dynamically filter to match what the users have typed.
//
// For example, a text input field for programming language might suggest
// Java, JavaScript, Python, and C++. When users start typing `Jav`, the list
// of suggestions filters to show just `Java` and `JavaScript`.
//
// Suggested values help guide users to enter values that your app can make
// sense of. When referring to JavaScript, some users might enter `javascript`
// and others `java script`. Suggesting `JavaScript` can standardize how users
// interact with your app.
//
// When specified, `TextInput.type` is always `SINGLE_LINE`, even if it's set
// to `MULTIPLE_LINE`.
//
// [Google Workspace
// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
Suggestions initial_suggestions = 7;
// Optional. Specify what action to take when the text input field provides
// suggestions to users who interact with it.
//
// If unspecified, the suggestions are set by `initialSuggestions` and
// are processed by the client.
//
// If specified, the app takes the action specified here, such as running
// a custom function.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
Action auto_complete_action = 8;
// Text that appears in the text input field when the field is empty.
// Use this text to prompt users to enter a value. For example, `Enter a
// number from 0 to 100`.
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
string placeholder_text = 12;
}
// Suggested values that users can enter. These values appear when users click
// inside the text input field. As users type, the suggested values
// dynamically filter to match what the users have typed.
//
// For example, a text input field for programming language might suggest
// Java, JavaScript, Python, and C++. When users start typing `Jav`, the list
// of suggestions filters to show `Java` and `JavaScript`.
//
// Suggested values help guide users to enter values that your app can make
// sense of. When referring to JavaScript, some users might enter `javascript`
// and others `java script`. Suggesting `JavaScript` can standardize how users
// interact with your app.
//
// When specified, `TextInput.type` is always `SINGLE_LINE`, even if it's set
// to `MULTIPLE_LINE`.
//
// [Google Workspace
// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
message Suggestions {
// One suggested value that users can enter in a text input field.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message SuggestionItem {
oneof content {
// The value of a suggested input to a text input field. This is
// equivalent to what users enter themselves.
string text = 1;
}
}
// A list of suggestions used for autocomplete recommendations in text input
// fields.
repeated SuggestionItem items = 1;
}
// A list of buttons layed out horizontally. For an example in
// Google Chat apps, see
// [Add a
// button](https://developers.google.com/workspace/chat/design-interactive-card-dialog#add_a_button).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message ButtonList {
// An array of buttons.
repeated Button buttons = 1;
}
// A widget that creates one or more UI items that users can select.
// For example, a dropdown menu or checkboxes. You can use this widget to
// collect data that can be predicted or enumerated. For an example in Google
// Chat apps, see [Add selectable UI
// elements](/workspace/chat/design-interactive-card-dialog#add_selectable_ui_elements).
//
// Chat apps can process the value of items that users select or input. For
// details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
//
// To collect undefined or abstract data from users, use
// the [TextInput][google.apps.card.v1.TextInput] widget.
//
// [Google Workspace Add-ons
// and Chat apps](https://developers.google.com/workspace/extend):
message SelectionInput {
// The format for the items that users can select. Different options support
// different types of interactions. For example, users can select multiple
// checkboxes, but can only select one item from a dropdown menu.
//
// Each selection input supports one type of selection. Mixing checkboxes
// and switches, for example, isn't supported.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
enum SelectionType {
// A set of checkboxes. Users can select one or more checkboxes.
CHECK_BOX = 0;
// A set of radio buttons. Users can select one radio button.
RADIO_BUTTON = 1;
// A set of switches. Users can turn on one or more switches.
SWITCH = 2;
// A dropdown menu. Users can select one item from the menu.
DROPDOWN = 3;
// A multiselect menu for static or dynamic data. From the menu bar,
// users select one or more items. Users can also input values to populate
// dynamic data. For example, users can start typing the name of a Google
// Chat space and the widget autosuggests the space.
//
// To populate items for a multiselect menu, you can use one of the
// following types of data sources:
//
// * Static data: Items are specified as `SelectionItem` objects in the
// widget. Up to 100 items.
// * Google Workspace data: Items are populated using data from Google
// Workspace, such as Google Workspace users or Google Chat spaces.
// * External data: Items are populated from an external data
// source outside of Google Workspace.
//
// For examples of how to implement multiselect menus, see
// [Add a multiselect
// menu](https://developers.google.com/workspace/chat/design-interactive-card-dialog#multiselect-menu).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
// Multiselect for Google Workspace Add-ons are in
// Developer Preview.
MULTI_SELECT = 4;
}
// An item that users can select in a selection input, such as a checkbox
// or switch.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message SelectionItem {
// The text that identifies or describes the item to users.
string text = 1;
// The value associated with this item. The client should use this as a form
// input value.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
string value = 2;
// Whether the item is selected by default. If the selection input only
// accepts one value (such as for radio buttons or a dropdown menu), only
// set this field for one item.
bool selected = 3;
// For multiselect menus, the URL for the icon displayed next to
// the item's `text` field. Supports PNG and JPEG files. Must be an `HTTPS`
// URL. For example,
// `https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png`.
string start_icon_uri = 4;
// For multiselect menus, a text description or label that's
// displayed below the item's `text` field.
string bottom_text = 5;
}
// For a
// [`SelectionInput`][google.apps.card.v1.SelectionInput] widget that uses a
// multiselect menu, a data source from Google Workspace. Used to populate
// items in a multiselect menu.
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
message PlatformDataSource {
// A data source shared by all [Google Workspace
// applications]
// (https://developers.google.com/workspace/chat/api/reference/rest/v1/HostApp).
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
enum CommonDataSource {
// Default value. Don't use.
UNKNOWN = 0;
// Google Workspace users. The user can only view and select users from
// their Google Workspace organization.
USER = 1;
}
// The data source.
oneof data_source {
// A data source shared by all Google Workspace applications, such as
// users in a Google Workspace organization.
CommonDataSource common_data_source = 1;
}
}
// The name that identifies the selection input in a form input event.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
string name = 1;
// The text that appears above the selection input field in the user
// interface.
//
// Specify text that helps the user enter the information your app needs.
// For example, if users are selecting the urgency of a work ticket from a
// drop-down menu, the label might be "Urgency" or "Select urgency".
string label = 2;
// The type of items that are displayed to users in a `SelectionInput` widget.
// Selection types support different types of interactions. For example, users
// can select one or more checkboxes, but they can only select one value from
// a dropdown menu.
SelectionType type = 3;
// An array of selectable items. For example, an array of radio buttons or
// checkboxes. Supports up to 100 items.
repeated SelectionItem items = 4;
// If specified, the form is submitted when the selection changes. If not
// specified, you must specify a separate button that submits the form.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
Action on_change_action = 5;
// For multiselect menus, the maximum number of items that a user can select.
// Minimum value is 1 item. If unspecified, defaults to 3 items.
int32 multi_select_max_selected_items = 6;
// For multiselect menus, the number of text characters that a user inputs
// before the app queries autocomplete and displays suggested items
// in the menu.
//
// If unspecified, defaults to 0 characters for static data sources and 3
// characters for external data sources.
int32 multi_select_min_query_length = 7;
// For a multiselect menu, the data source that populates
// selection items.
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
oneof multi_select_data_source {
// An external data source, such as a relational data base.
Action external_data_source = 8;
// A data source from Google Workspace.
PlatformDataSource platform_data_source = 9;
}
}
// Lets users input a date, a time, or both a date and a time. For an example in
// Google Chat apps, see [Let a user pick a date and
// time](https://developers.google.com/workspace/chat/design-interactive-card-dialog#let_a_user_pick_a_date_and_time).
//
// Users can input text or use the picker to select dates and times. If users
// input an invalid date or time, the picker shows an error that prompts users
// to input the information correctly.
//
// [Google Workspace
// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
message DateTimePicker {
// The format for the date and time in the `DateTimePicker` widget.
// Determines whether users can input a date, a time, or both a date and time.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
enum DateTimePickerType {
// Users input a date and time.
DATE_AND_TIME = 0;
// Users input a date.
DATE_ONLY = 1;
// Users input a time.
TIME_ONLY = 2;
}
// The name by which the `DateTimePicker` is identified in a form input event.
//
// For details about working with form inputs, see [Receive form
// data](https://developers.google.com/workspace/chat/read-form-data).
string name = 1;
// The text that prompts users to input a date, a time, or a date and time.
// For example, if users are scheduling an appointment, use a label such as
// `Appointment date` or `Appointment date and time`.
string label = 2;
// Whether the widget supports inputting a date, a time, or the date and time.
DateTimePickerType type = 3;
// The default value displayed in the widget, in milliseconds since [Unix
// epoch time](https://en.wikipedia.org/wiki/Unix_time).
//
// Specify the value based on the type of picker (`DateTimePickerType`):
//
// * `DATE_AND_TIME`: a calendar date and time in UTC. For example, to
// represent January 1, 2023 at 12:00 PM UTC, use `1672574400000`.
// * `DATE_ONLY`: a calendar date at 00:00:00 UTC. For example, to represent
// January 1, 2023, use `1672531200000`.
// * `TIME_ONLY`: a time in UTC. For example, to represent 12:00 PM, use
// `43200000` (or `12 * 60 * 60 * 1000`).
int64 value_ms_epoch = 4;
// The number representing the time zone offset from UTC, in minutes.
// If set, the `value_ms_epoch` is displayed in the specified time zone.
// If unset, the value defaults to the user's time zone setting.
int32 timezone_offset_date = 5;
// Triggered when the user clicks **Save** or **Clear** from the
// `DateTimePicker` interface.
Action on_change_action = 6;
}
// A text, icon, or text and icon button that users can click. For an example in
// Google Chat apps, see
// [Add a
// button](https://developers.google.com/workspace/chat/design-interactive-card-dialog#add_a_button).
//
// To make an image a clickable button, specify an
// [`Image`][google.apps.card.v1.Image] (not an
// [`ImageComponent`][google.apps.card.v1.ImageComponent]) and set an
// `onClick` action.
//
// [Google Workspace
// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
message Button {
// The text displayed inside the button.
string text = 1;
// The icon image. If both `icon` and `text` are set, then the icon appears
// before the text.
Icon icon = 2;
// If set, the button is filled with a solid background color and the font
// color changes to maintain contrast with the background color. For example,
// setting a blue background likely results in white text.
//
// If unset, the image background is white and the font color is blue.
//
// For red, green, and blue, the value of each field is a `float` number that
// you can express in either of two ways: as a number between 0 and 255
// divided by 255 (153/255), or as a value between 0 and 1 (0.6). 0 represents
// the absence of a color and 1 or 255/255 represent the full presence of that
// color on the RGB scale.
//
// Optionally set `alpha`, which sets a level of transparency using this
// equation:
//
// ```
// pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
// ```
//
// For `alpha`, a value of `1` corresponds with a solid color, and a value of
// `0` corresponds with a completely transparent color.
//
// For example, the following color represents a half transparent red:
//
// ```
// "color": {
// "red": 1,
// "green": 0,
// "blue": 0,
// "alpha": 0.5
// }
// ```
google.type.Color color = 3;
// Required. The action to perform when a user clicks the button, such as
// opening a hyperlink or running a custom function.
OnClick on_click = 4;
// If `true`, the button is displayed in an inactive state and doesn't respond
// to user actions.
bool disabled = 5;
// The alternative text that's used for accessibility.
//
// Set descriptive text that lets users know what the button does. For
// example, if a button opens a hyperlink, you might write: "Opens a new
// browser tab and navigates to the Google Chat developer documentation at
// https://developers.google.com/workspace/chat".
string alt_text = 6;
}
// An icon displayed in a widget on a card. For an example in Google Chat apps,
// see [Add an
// icon](https://developers.google.com/workspace/chat/add-text-image-card-dialog#add_an_icon).
//
// Supports
// [built-in](https://developers.google.com/workspace/chat/format-messages#builtinicons)
// and
// [custom](https://developers.google.com/workspace/chat/format-messages#customicons)
// icons.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message Icon {
// The icon displayed in the widget on the card.
oneof icons {
// Display one of the built-in icons provided by Google Workspace.
//
// For example, to display an airplane icon, specify `AIRPLANE`.
// For a bus, specify `BUS`.
//
// For a full list of supported icons, see [built-in
// icons](https://developers.google.com/workspace/chat/format-messages#builtinicons).
string known_icon = 1;
// Display a custom icon hosted at an HTTPS URL.
//
// For example:
//
// ```
// "iconUrl":
// "https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png"
// ```
//
// Supported file types include `.png` and `.jpg`.
string icon_url = 2;
// Display one of the [Google Material
// Icons](https://fonts.google.com/icons).
//
// For example, to display a [checkbox
// icon](https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Acheck_box%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4048),
// use
// ```
// "material_icon": {
// "name": "check_box"
// }
// ```
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
MaterialIcon material_icon = 5;
}
// Optional. A description of the icon used for accessibility.
// If unspecified, the default value `Button` is provided. As a best practice,
// you should set a helpful description for what the icon displays, and if
// applicable, what it does. For example, `A user's account portrait`, or
// `Opens a new browser tab and navigates to the Google Chat developer
// documentation at https://developers.google.com/workspace/chat`.
//
// If the icon is set in a [`Button`][google.apps.card.v1.Button], the
// `altText` appears as helper text when the user hovers over the button.
// However, if the button also sets `text`, the icon's `altText` is ignored.
string alt_text = 3;
// The crop style applied to the image. In some cases, applying a
// `CIRCLE` crop causes the image to be drawn larger than a built-in
// icon.
Widget.ImageType image_type = 4;
}
// A [Google Material Icon](https://fonts.google.com/icons), which includes over
// 2500+ options.
//
// For example, to display a [checkbox
// icon](https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Acheck_box%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4048)
// with customized weight and grade, write the following:
//
// ```
// {
// "name": "check_box",
// "fill": true,
// "weight": 300,
// "grade": -25
// }
// ```
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
message MaterialIcon {
// The icon name defined in the [Google Material
// Icon](https://fonts.google.com/icons), for example, `check_box`. Any
// invalid names are abandoned and replaced with empty string and
// results in the icon failing to render.
string name = 1;
// Whether the icon renders as filled. Default value is false.
//
// To preview different icon settings, go to
// [Google Font Icons](https://fonts.google.com/icons) and adjust the
// settings under **Customize**.
bool fill = 2;
// The stroke weight of the icon. Choose from {100, 200, 300, 400,
// 500, 600, 700}. If absent, default value is 400. If any other value is
// specified, the default value is used.
//
// To preview different icon settings, go to
// [Google Font Icons](https://fonts.google.com/icons) and adjust the
// settings under **Customize**.
int32 weight = 3;
// Weight and grade affect a symbol’s thickness. Adjustments to grade are more
// granular than adjustments to weight and have a small impact on the size of
// the symbol. Choose from {-25, 0, 200}. If absent, default value is 0. If
// any other value is specified, the default value is used.
//
// To preview different icon settings, go to
// [Google Font Icons](https://fonts.google.com/icons) and adjust the
// settings under **Customize**.
int32 grade = 4;
}
// Represents the crop style applied to an image.
//
// [Google Workspace Add-ons and
// Chat apps](https://developers.google.com/workspace/extend):
//
// For example, here's how to apply a 16:9 aspect ratio:
//
// ```
// cropStyle {
// "type": "RECTANGLE_CUSTOM",
// "aspectRatio": 16/9
// }
// ```
message ImageCropStyle {
// Represents the crop style applied to an image.
//
// [Google Workspace Add-ons
// and Chat apps](https://developers.google.com/workspace/extend):
enum ImageCropType {
// Don't use. Unspecified.
IMAGE_CROP_TYPE_UNSPECIFIED = 0;
// Default value. Applies a square crop.
SQUARE = 1;
// Applies a circular crop.
CIRCLE = 2;
// Applies a rectangular crop with a custom aspect ratio. Set the custom
// aspect ratio with `aspectRatio`.
RECTANGLE_CUSTOM = 3;
// Applies a rectangular crop with a 4:3 aspect ratio.
RECTANGLE_4_3 = 4;
}
// The crop type.
ImageCropType type = 1;
// The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
//
// For example, here's how to apply a 16:9 aspect ratio:
//
// ```
// cropStyle {
// "type": "RECTANGLE_CUSTOM",
// "aspectRatio": 16/9
// }
// ```
double aspect_ratio = 2;
}
// The style options for the border of a card or widget, including the border
// type and color.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message BorderStyle {
// Represents the border types applied to widgets.
//
// [Google Workspace Add-ons
// and Chat apps](https://developers.google.com/workspace/extend):
enum BorderType {
// Don't use. Unspecified.
BORDER_TYPE_UNSPECIFIED = 0;
// Default value. No border.
NO_BORDER = 1;
// Outline.
STROKE = 2;
}
// The border type.
BorderType type = 1;
// The colors to use when the type is `BORDER_TYPE_STROKE`.
google.type.Color stroke_color = 2;
// The corner radius for the border.
int32 corner_radius = 3;
}
// Represents an image.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message ImageComponent {
// The image URL.
string image_uri = 1;
// The accessibility label for the image.
string alt_text = 2;
// The crop style to apply to the image.
ImageCropStyle crop_style = 3;
// The border style to apply to the image.
BorderStyle border_style = 4;
}
// Displays a grid with a collection of items. Items can only include text or
// images. For responsive columns, or to include more than text or images, use
// [`Columns`][google.apps.card.v1.Columns]. For an example in Google Chat apps,
// see [Display a Grid with a collection of
// items](https://developers.google.com/workspace/chat/format-structure-card-dialog#display_a_grid_with_a_collection_of_items).
//
// A grid supports any number of columns and items. The number of rows is
// determined by items divided by columns. A grid with
// 10 items and 2 columns has 5 rows. A grid with 11 items and 2 columns
// has 6 rows.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
//
// For example, the following JSON creates a 2 column grid with a single
// item:
//
// ```
// "grid": {
// "title": "A fine collection of items",
// "columnCount": 2,
// "borderStyle": {
// "type": "STROKE",
// "cornerRadius": 4
// },
// "items": [
// {
// "image": {
// "imageUri": "https://www.example.com/image.png",
// "cropStyle": {
// "type": "SQUARE"
// },
// "borderStyle": {
// "type": "STROKE"
// }
// },
// "title": "An item",
// "textAlignment": "CENTER"
// }
// ],
// "onClick": {
// "openLink": {
// "url": "https://www.example.com"
// }
// }
// }
// ```
message Grid {
// Represents an item in a grid layout. Items can contain text, an image, or
// both text and an image.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message GridItem {
// Represents the various layout options available for a grid item.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
enum GridItemLayout {
// Don't use. Unspecified.
GRID_ITEM_LAYOUT_UNSPECIFIED = 0;
// The title and subtitle are shown below the grid item's image.
TEXT_BELOW = 1;
// The title and subtitle are shown above the grid item's image.
TEXT_ABOVE = 2;
}
// A user-specified identifier for this grid item. This identifier is
// returned in the parent grid's `onClick` callback parameters.
string id = 1;
// The image that displays in the grid item.
ImageComponent image = 2;
// The grid item's title.
string title = 3;
// The grid item's subtitle.
string subtitle = 4;
// The layout to use for the grid item.
GridItemLayout layout = 9;
}
// The text that displays in the grid header.
string title = 1;
// The items to display in the grid.
repeated GridItem items = 2;
// The border style to apply to each grid item.
BorderStyle border_style = 3;
// The number of columns to display in the grid. A default value
// is used if this field isn't specified, and that default value is
// different depending on where the grid is shown (dialog versus companion).
int32 column_count = 4;
// This callback is reused by each individual grid item, but with the
// item's identifier and index in the items list added to the callback's
// parameters.
OnClick on_click = 5;
}
// The `Columns` widget displays up to 2 columns in a card or dialog. You can
// add widgets to each column; the widgets appear in the order that they are
// specified. For an example in Google Chat apps, see
// [Display cards and dialogs in
// columns](https://developers.google.com/workspace/chat/format-structure-card-dialog#display_cards_and_dialogs_in_columns).
//
// The height of each column is determined by the taller column. For example, if
// the first column is taller than the second column, both columns have the
// height of the first column. Because each column can contain a different
// number of widgets, you can't define rows or align widgets between the
// columns.
//
// Columns are displayed side-by-side. You can customize the width of each
// column using the `HorizontalSizeStyle` field. If the user's
// screen width is too narrow, the second column wraps below the first:
//
// * On web, the second column wraps if the screen width is less than or equal
// to 480 pixels.
// * On iOS devices, the second column wraps if the screen width is
// less than or equal to 300 pt.
// * On Android devices, the second column wraps if the screen width is
// less than or equal to 320 dp.
//
// To include more than 2 columns, or to use rows, use the
// [`Grid`][google.apps.card.v1.Grid] widget.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
// Columns for Google Workspace Add-ons are in
// Developer Preview.
message Columns {
// A column.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
// Columns for Google Workspace Add-ons are in
// Developer Preview.
message Column {
// Specifies how a column fills the width of the card. The width of each
// column depends on both the `HorizontalSizeStyle` and the width of the
// widgets within the column.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
// Columns for Google Workspace Add-ons are in
// Developer Preview.
enum HorizontalSizeStyle {
// Don't use. Unspecified.
HORIZONTAL_SIZE_STYLE_UNSPECIFIED = 0;
// Default value. Column fills the available space, up to 70% of the
// card's width. If both columns are set to `FILL_AVAILABLE_SPACE`, each
// column fills 50% of the space.
FILL_AVAILABLE_SPACE = 1;
// Column fills the least amount of space possible and no more than 30% of
// the card's width.
FILL_MINIMUM_SPACE = 2;
}
// Specifies whether widgets align to the top, bottom, or center of a
// column.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
// Columns for Google Workspace Add-ons are in
// Developer Preview.
enum VerticalAlignment {
// Don't use. Unspecified.
VERTICAL_ALIGNMENT_UNSPECIFIED = 0;
// Default value. Aligns widgets to the center of a column.
CENTER = 1;
// Aligns widgets to the top of a column.
TOP = 2;
// Aligns widgets to the bottom of a column.
BOTTOM = 3;
}
// The supported widgets that you can include in a column.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
// Columns for Google Workspace Add-ons are in
// Developer Preview.
message Widgets {
oneof data {
// [TextParagraph][google.apps.card.v1.TextParagraph] widget.
TextParagraph text_paragraph = 1;
// [Image][google.apps.card.v1.Image] widget.
Image image = 2;
// [DecoratedText][google.apps.card.v1.DecoratedText] widget.
DecoratedText decorated_text = 3;
// [ButtonList][google.apps.card.v1.ButtonList] widget.
ButtonList button_list = 4;
// [TextInput][google.apps.card.v1.TextInput] widget.
TextInput text_input = 5;
// [SelectionInput][google.apps.card.v1.SelectionInput] widget.
SelectionInput selection_input = 6;
// [DateTimePicker][google.apps.card.v1.DateTimePicker] widget.
DateTimePicker date_time_picker = 7;
}
}
// Specifies how a column fills the width of the card.
HorizontalSizeStyle horizontal_size_style = 1;
// Specifies whether widgets align to the left, right, or center of a
// column.
Widget.HorizontalAlignment horizontal_alignment = 2;
// Specifies whether widgets align to the top, bottom, or center of a
// column.
VerticalAlignment vertical_alignment = 3;
// An array of widgets included in a column. Widgets appear in the order
// that they are specified.
repeated Widgets widgets = 4;
}
// An array of columns. You can include up to 2 columns in a card or dialog.
repeated Column column_items = 2;
}
// Represents how to respond when users click an interactive element on
// a card, such as a button.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message OnClick {
oneof data {
// If specified, an action is triggered by this `onClick`.
Action action = 1;
// If specified, this `onClick` triggers an open link action.
OpenLink open_link = 2;
// An add-on triggers this action when the action needs to open a
// link. This differs from the `open_link` above in that this needs to talk
// to server to get the link. Thus some preparation work is required for
// web client to do before the open link action response comes back.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
Action open_dynamic_link_action = 3;
// A new card is pushed to the card stack after clicking if specified.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
Card card = 4;
}
}
// Represents an `onClick` event that opens a hyperlink.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message OpenLink {
// When an `OnClick` action opens a link, then the client can either open it
// as a full-size window (if that's the frame used by the client), or an
// overlay (such as a pop-up). The implementation depends on the client
// platform capabilities, and the value selected might be ignored if the
// client doesn't support it. `FULL_SIZE` is supported by all clients.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
enum OpenAs {
// The link opens as a full-size window (if that's the frame used by the
// client).
FULL_SIZE = 0;
// The link opens as an overlay, such as a pop-up.
OVERLAY = 1;
}
// What the client does when a link opened by an `OnClick` action is closed.
//
// Implementation depends on client platform capabilities. For example, a web
// browser might open a link in a pop-up window with an `OnClose` handler.
//
// If both `OnOpen` and `OnClose` handlers are set, and the client platform
// can't support both values, `OnClose` takes precedence.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
enum OnClose {
// Default value. The card doesn't reload; nothing happens.
NOTHING = 0;
// Reloads the card after the child window closes.
//
// If used in conjunction with
// [`OpenAs.OVERLAY`](https://developers.google.com/workspace/add-ons/reference/rpc/google.apps.card.v1#openas),
// the child window acts as a modal dialog and the parent card is blocked
// until the child window closes.
RELOAD = 1;
}
// The URL to open.
string url = 1;
// How to open a link.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
OpenAs open_as = 2;
// Whether the client forgets about a link after opening it, or observes it
// until the window closes.
//
// [Google Workspace
// Add-ons](https://developers.google.com/workspace/add-ons):
OnClose on_close = 3;
}
// An action that describes the behavior when the form is submitted.
// For example, you can invoke an Apps Script script to handle the form.
// If the action is triggered, the form values are sent to the server.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message Action {
// List of string parameters to supply when the action method is invoked.
// For example, consider three snooze buttons: snooze now, snooze one day,
// or snooze next week. You might use `action method = snooze()`, passing the
// snooze type and snooze time in the list of string parameters.
//
// To learn more, see
// [`CommonEventObject`](https://developers.google.com/workspace/chat/api/reference/rest/v1/Event#commoneventobject).
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
message ActionParameter {
// The name of the parameter for the action script.
string key = 1;
// The value of the parameter.
string value = 2;
}
// Specifies the loading indicator that the action displays while
// making the call to the action.
//
// [Google Workspace Add-ons and Chat
// apps](https://developers.google.com/workspace/extend):
enum LoadIndicator {
// Displays a spinner to indicate that content is loading.
SPINNER = 0;
// Nothing is displayed.
NONE = 1;
}
// Optional. Required when opening a
// [dialog](https://developers.google.com/workspace/chat/dialogs).
//
// What to do in response to an interaction with a user, such as a user
// clicking a button in a card message.
//
// If unspecified, the app responds by executing an `action`—like opening a
// link or running a function—as normal.
//
// By specifying an `interaction`, the app can respond in special interactive
// ways. For example, by setting `interaction` to `OPEN_DIALOG`, the app can
// open a [dialog](https://developers.google.com/workspace/chat/dialogs).
//
// When specified, a loading indicator isn't shown. If specified for
// an add-on, the entire card is stripped and nothing is shown in the client.
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
enum Interaction {
// Default value. The `action` executes as normal.
INTERACTION_UNSPECIFIED = 0;
// Opens a [dialog](https://developers.google.com/workspace/chat/dialogs), a
// windowed, card-based interface that Chat apps use to interact with users.
//
// Only supported by Chat apps in response to button-clicks on card
// messages. If specified for
// an add-on, the entire card is stripped and nothing is shown in the
// client.
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
OPEN_DIALOG = 1;
}
// A custom function to invoke when the containing element is
// clicked or othrwise activated.
//
// For example usage, see [Read form
// data](https://developers.google.com/workspace/chat/read-form-data).
string function = 1;
// List of action parameters.
repeated ActionParameter parameters = 2;
// Specifies the loading indicator that the action displays while
// making the call to the action.
LoadIndicator load_indicator = 3;
// Indicates whether form values persist after the action. The default value
// is `false`.
//
// If `true`, form values remain after the action is triggered. To let the
// user make changes while the action is being processed, set
// [`LoadIndicator`](https://developers.google.com/workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator)
// to `NONE`. For [card
// messages](https://developers.google.com/workspace/chat/api/guides/v1/messages/create#create)
// in Chat apps, you must also set the action's
// [`ResponseType`](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages#responsetype)
// to `UPDATE_MESSAGE` and use the same
// [`card_id`](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages#CardWithId)
// from the card that contained the action.
//
// If `false`, the form values are cleared when the action is triggered.
// To prevent the user from making changes while the action is being
// processed, set
// [`LoadIndicator`](https://developers.google.com/workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator)
// to `SPINNER`.
bool persist_values = 4;
// Optional. Required when opening a
// [dialog](https://developers.google.com/workspace/chat/dialogs).
//
// What to do in response to an interaction with a user, such as a user
// clicking a button in a card message.
//
// If unspecified, the app responds by executing an `action`—like opening a
// link or running a function—as normal.
//
// By specifying an `interaction`, the app can respond in special interactive
// ways. For example, by setting `interaction` to `OPEN_DIALOG`, the app can
// open a [dialog](https://developers.google.com/workspace/chat/dialogs). When
// specified, a loading indicator isn't shown. If specified for
// an add-on, the entire card is stripped and nothing is shown in the client.
//
// [Google Chat apps](https://developers.google.com/workspace/chat):
Interaction interaction = 5;
}