datocms-plugin-alt-text-ai 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Alt Text AI
2
2
 
3
- Generate alt text for image assets directly from DatoCMS `file` and `gallery` fields. Choose [AltText.ai](https://alttext.ai), OpenAI, Anthropic Claude, or Google Gemini, then review the generated text in the record form before saving it.
3
+ Generate alt text for image assets from DatoCMS `file` and `gallery` fields or directly in the Media Area. Choose [AltText.ai](https://alttext.ai), OpenAI, Anthropic Claude, or Google Gemini.
4
4
 
5
5
  ## Supported providers
6
6
 
@@ -15,7 +15,7 @@ For direct model providers, the plugin loads every model ID returned by the prov
15
15
 
16
16
  ## Configuration
17
17
 
18
- 1. Grant the plugin the `currentUserAccessToken` permission when installing it. The plugin needs this permission to retrieve the selected asset from the current DatoCMS environment.
18
+ 1. Grant the plugin the `currentUserAccessToken` permission when installing it. The plugin needs this permission to retrieve selected assets and update their default metadata in the current DatoCMS environment.
19
19
  2. Open the plugin settings and choose an alt text provider.
20
20
  3. Enter that provider's API key.
21
21
  4. For OpenAI, Anthropic, or Gemini, select or enter a vision-capable model and review the prompt template.
@@ -23,7 +23,7 @@ For direct model providers, the plugin loads every model ID returned by the prov
23
23
 
24
24
  The prompt template for direct model providers supports these placeholders:
25
25
 
26
- - `{locale}`: the active locale in the record editor.
26
+ - `{locale}`: the active record locale for field actions, or the project locale being generated in Media Area actions.
27
27
  - `{filename}`: the asset filename, supplied as supporting context.
28
28
 
29
29
  Keep an instruction in the prompt that asks the provider to return only the alt text. AltText.ai uses its own generation configuration rather than this prompt template.
@@ -32,24 +32,52 @@ Keep an instruction in the prompt that asks the provider to return only the alt
32
32
 
33
33
  Existing installations are migrated automatically. A previously saved `apiKey` remains associated with AltText.ai, and AltText.ai remains the selected provider until you choose another one.
34
34
 
35
- ## Usage
35
+ ## Where to generate alt text
36
36
 
37
- The plugin adds two actions to the dropdown menu of every populated `file` and `gallery` field:
37
+ The plugin adds the same two actions in three places: **Generate missing alt texts** and **Regenerate all alt texts**.
38
+
39
+ ### 1. A file or gallery field
40
+
41
+ Open the actions menu on a populated `file` or `gallery` field.
42
+
43
+ ![Alt text generation actions in a populated DatoCMS file field](docs/generate-alt-text-field.jpg)
44
+
45
+ ### 2. Selected assets in the Media Area
46
+
47
+ Select one or more images, then open the bulk actions menu in the selection bar.
48
+
49
+ ![Alt text generation actions for selected assets in the DatoCMS Media Area](docs/generate-alt-text-media-selection.jpg)
50
+
51
+ ### 3. An open asset in the Media Area
52
+
53
+ Open an image asset, then use the asset actions menu beside its filename.
54
+
55
+ ![Alt text generation actions on an open DatoCMS image asset](docs/generate-alt-text-single-asset.jpg)
56
+
57
+ ## How the actions work
58
+
59
+ All three locations offer the same choices:
38
60
 
39
61
  - **Generate missing alt texts** fills assets whose alt text is empty and leaves existing alt text unchanged.
40
- - **Regenerate all alt texts** generates alt text for every asset in the field and overwrites existing values.
62
+ - **Regenerate all alt texts** generates alt text for every targeted image and overwrites existing values.
41
63
 
42
- Generated values update the current record form; they are not saved automatically. Review the output, make any necessary edits, and save the record.
64
+ In a record field, generated values update the current form and are not saved automatically. Review the output, make any necessary edits, and save the record.
43
65
 
44
66
  For localized fields, the plugin reads and updates only the field value for the active locale. Run the action separately in each locale that needs alt text. It does not update asset metadata globally or change other fields and records that reference the same upload.
45
67
 
68
+ In the Media Area, the same actions are available after selecting multiple uploads and inside an individual asset. The plugin generates default alt text for every project locale and saves it immediately to each upload. Non-image files are skipped. **Regenerate all alt texts** asks for confirmation before replacing saved upload defaults.
69
+
70
+ For larger Media Area runs, the plugin shows occasional aggregate progress updates with the number of locale versions processed and assets finished. Updates are throttled so they remain useful without creating a notification for every image or locale.
71
+
72
+ Media Area actions change the upload's global default metadata. They do not replace explicit alt text overrides already stored in record fields.
73
+
46
74
  ## Security and privacy
47
75
 
48
76
  Provider API keys are stored in the plugin parameters and used by client-side requests from the DatoCMS editor. Anyone who can run or inspect the plugin in that project may be able to retrieve those keys. Use dedicated keys with the narrowest available permissions, quotas, billing limits, and origin or API restrictions, and rotate them regularly. If your organization's policy prohibits browser-exposed credentials, do not configure a direct provider key.
49
77
 
50
78
  The data sent depends on the selected provider. AltText.ai receives a transformed public image URL, the active locale, and a stable identifier derived from the DatoCMS upload ID. OpenAI and Anthropic receive the transformed public image URL plus the expanded prompt. Gemini receives the image bytes plus the expanded prompt. The expanded prompt contains the locale or filename only when its template includes the corresponding placeholder. Review the selected provider's data-handling terms before processing sensitive assets.
51
79
 
52
- The editor's DatoCMS current-user access token is used only to retrieve upload information through the Content Management API for the current environment. It is never sent to AltText.ai, OpenAI, Anthropic, or Google.
80
+ The editor's DatoCMS current-user access token is used only to retrieve uploads and update their default metadata through the Content Management API for the current environment. It is never sent to AltText.ai, OpenAI, Anthropic, or Google.
53
81
 
54
82
  ## Limitations and accessibility notes
55
83
 
@@ -58,7 +86,7 @@ The editor's DatoCMS current-user access token is used only to retrieve upload i
58
86
  - Each asset-generation request times out after 60 seconds without changing that asset's alt text.
59
87
  - AI-generated descriptions can be inaccurate. Always review them in the context where the image appears.
60
88
  - Empty alt text can be intentional for decorative images. **Generate missing alt texts** cannot distinguish an intentional empty value from a missing one, so review decorative images before saving.
61
- - A single asset can need different alt text in different contexts. The plugin updates the current field occurrence rather than every reference to the upload.
89
+ - A single asset can need different alt text in different contexts. Field actions update only the current occurrence; Media Area actions update the upload defaults inherited where no explicit field-level override exists.
62
90
 
63
91
  ## Development
64
92
 
@@ -0,0 +1 @@
1
+ ._intro_z1rey_1{margin:0 0 var(--spacing-m);color:var(--color--ink-subtle);font-size:var(--font-size-m);line-height:1.5}._documentationHint_z1rey_8{margin:0 0 var(--spacing-l);padding:var(--spacing-m);border:1px solid var(--color--border);border-radius:4px;background:var(--color--surface-muted);color:var(--color--ink-subtle);font-size:var(--font-size-s);line-height:1.45}._documentationHint_z1rey_8 a{color:var(--color--ink-link);font-weight:var(--font-weight-bold);text-decoration:none}._documentationHint_z1rey_8 a:hover{text-decoration:underline}._documentationHint_z1rey_8 a:focus-visible{border-radius:2px;outline:2px solid var(--color--focus--outline);outline-offset:2px}._readOnlyNotice_z1rey_35,._externalChangeNotice_z1rey_36{margin-bottom:var(--spacing-l);padding:var(--spacing-m);border:1px solid var(--color--warning-soft--border);border-radius:4px;background:var(--color--warning-soft--surface);color:var(--color--warning-soft--ink)}._externalChangeNotice_z1rey_36{display:flex;gap:var(--spacing-m);align-items:center;justify-content:space-between}._fieldHelp_z1rey_52,._sectionHelp_z1rey_53{color:var(--color--ink-subtle);font-size:var(--font-size-s);line-height:1.45}._fieldHelp_z1rey_52{margin:var(--spacing-s) 0 0}._sectionHelp_z1rey_53{margin:0 0 var(--spacing-l)}._fieldHelp_z1rey_52 a{color:var(--color--ink-link)}@font-face{font-display:auto;font-family:colfax-web;font-style:normal;font-weight:700;src:url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff2"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:italic;font-weight:700;src:url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff2"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:normal;font-weight:500;src:url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff2"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:italic;font-weight:500;src:url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff2"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:normal;font-weight:400;src:url(https://use.typekit.net/af/bac079/00000000000000003b9acde4/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3) format("woff2"),url(https://use.typekit.net/af/bac079/00000000000000003b9acde4/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3) format("woff"),url(https://use.typekit.net/af/bac079/00000000000000003b9acde4/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:italic;font-weight:400;src:url(https://use.typekit.net/af/c1cc04/00000000000000003b9acde5/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3) format("woff2"),url(https://use.typekit.net/af/c1cc04/00000000000000003b9acde5/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3) format("woff"),url(https://use.typekit.net/af/c1cc04/00000000000000003b9acde5/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3) format("opentype")}html{font-size:16px;height:auto}body,html{margin:0;padding:0}@layer datocms-react-ui{html{scrollbar-color:var(--color--scrollbar--fill) transparent}}._button_nnl9b_1{-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;border-radius:4px;box-sizing:border-box;color:var(--color--ink);cursor:pointer;display:inline-block;font-family:inherit;font-weight:var(--font-weight-bold);line-height:inherit;opacity:1;text-decoration:none;transition:all .3s var(--material-ease);vertical-align:middle;white-space:nowrap}._button_nnl9b_1:focus,._button_nnl9b_1:hover{opacity:.8}._button_nnl9b_1:active{opacity:.7}._disabled_nnl9b_30{cursor:not-allowed}._buttonType-muted_nnl9b_34{background-color:var(--color--primary-soft--surface);color:var(--color--primary-soft--ink)}._buttonType-muted_nnl9b_34._disabled_nnl9b_30{background-color:var(--color--disabled--surface);color:var(--color--disabled--ink)}._buttonType-muted_nnl9b_34._disabled_nnl9b_30:active,._buttonType-muted_nnl9b_34._disabled_nnl9b_30:focus,._buttonType-muted_nnl9b_34._disabled_nnl9b_30:hover{color:var(--color--disabled--ink)}._buttonType-primary_nnl9b_50{background-color:var(--color--primary--surface)}._buttonType-primary_nnl9b_50,._buttonType-primary_nnl9b_50:active,._buttonType-primary_nnl9b_50:focus,._buttonType-primary_nnl9b_50:hover{color:var(--color--primary--ink)}._buttonType-primary_nnl9b_50:hover{background-color:var(--color--primary--surface-hover)}._buttonType-primary_nnl9b_50:active,._buttonType-primary_nnl9b_50:focus{background-color:var(--color--primary--surface-active)}._buttonType-primary_nnl9b_50._disabled_nnl9b_30{background-color:var(--color--disabled--surface);color:var(--color--disabled--ink)}._buttonType-primary_nnl9b_50._disabled_nnl9b_30:active,._buttonType-primary_nnl9b_50._disabled_nnl9b_30:focus,._buttonType-primary_nnl9b_50._disabled_nnl9b_30:hover{color:var(--color--disabled--ink)}._buttonType-negative_nnl9b_80,._buttonType-negative_nnl9b_80:active,._buttonType-negative_nnl9b_80:focus,._buttonType-negative_nnl9b_80:hover{background-color:var(--color--danger--surface);color:var(--color--danger--ink)}._buttonType-negative_nnl9b_80._disabled_nnl9b_30{background-color:var(--color--disabled--surface);color:var(--color--disabled--ink)}._buttonSize-xxs_nnl9b_97{font-size:.9em;padding:.4em .8em}._buttonSize-xs_nnl9b_102{font-size:1em;padding:.6em .8em}._buttonSize-s_nnl9b_107{font-size:1em;padding:.7em 1em}._buttonSize-m_nnl9b_112{font-size:1.1em;padding:.7em 1em}._buttonSize-l_nnl9b_117{font-size:1.2em;padding:.7em 1em}._buttonSize-xl_nnl9b_122{font-size:1.2em;padding:1em}._fullWidth_nnl9b_127{display:block;text-align:center;width:100%}._button__leftIcon_nnl9b_133,._button__rightIcon_nnl9b_134{display:inline-block;line-height:.6;vertical-align:middle}._button__leftIcon_nnl9b_133 svg,._button__rightIcon_nnl9b_134 svg{fill:var(--color--ink-link);color:var(--color--ink-link)}._button__leftIcon_nnl9b_133{margin-right:.5em}._button__leftIcon_nnl9b_133:last-child{margin-right:0}._button__rightIcon_nnl9b_134{margin-left:.5em}._button__rightIcon_nnl9b_134:first-child{margin-left:0}._Button_a50of_1{justify-column:center;align-items:center;-webkit-appearance:none;-moz-appearance:none;background-color:var(--color--surface);border:0;border:1px solid var(--color--border);box-sizing:border-box;color:var(--color--ink);color:var(--color--ink-subtle);cursor:pointer;display:flex;font-family:inherit;font-size:inherit;line-height:inherit;padding:7px 13px}._Button_a50of_1:hover{background-color:var(--color--surface-hover)}._Button_a50of_1 svg{fill:var(--color--ink-subtle);color:var(--color--ink-subtle)}._Button--s_a50of_31{padding:3px 10px}._Button--disabled_a50of_35{color:var(--color--disabled--ink);cursor:not-allowed}._Button--disabled_a50of_35:hover{background:var(--color--surface)}._Button--selected_a50of_44{background-color:var(--color--primary--surface-secondary);color:var(--color--primary--ink)}._Button--selected_a50of_44 svg{fill:var(--color--primary--ink);color:var(--color--primary--ink)}._Button--selected_a50of_44._Button--disabled_a50of_35,._Button--selected_a50of_44:hover{background-color:var(--color--primary--surface-secondary)}._Button_a50of_1:first-child{border-left-width:1px;border-radius:4px 0 0 4px}._Button_a50of_1:last-child{border-radius:0 4px 4px 0}._Group_1b5yn_1{align-items:stretch;background-color:var(--color--surface);display:flex;overflow:hidden}._themeVariables_11af8_1{--base-body-color-rgb-components:52,54,58;--base-body-color:var(--color--ink);--light-body-color-rgb-components:132,132,132;--light-body-color:var(--color--ink-subtle);--placeholder-body-color-rgb-components:198,198,198;--placeholder-body-color:var(--color--ink-placeholder);--light-bg-color-rgb-components:245,245,245;--light-bg-color:var(--color--surface-muted);--lighter-bg-color-rgb-components:248,248,248;--lighter-bg-color:var(--color--surface-muted);--disabled-bg-color-rgb-components:237,237,237;--disabled-bg-color:var(--color--disabled--surface);--border-color-rgb-components:240,240,240;--border-color:var(--color--border);--darker-border-color-rgb-components:215,215,215;--darker-border-color:var(--color--border-hover);--alert-color-rgb-components:255,94,73;--alert-color:var(--color--ink-danger);--warning-color-rgb-components:255,215,0;--warning-color:var(--color--ink-warning);--notice-color-rgb-components:70,215,0;--notice-color:var(--color--ink-success);--warning-bg-color-rgb-components:255,255,229;--warning-bg-color:var(--color--warning-soft--surface);--add-color-rgb-components:76,176,109;--add-color:var(--color--diff-added--surface);--remove-color-rgb-components:235,87,106;--remove-color:var(--color--diff-removed--surface);--base-font-family:"colfax-web","Roboto","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;--monospaced-font-family:"Roboto Mono","Menlo","Bitstream Vera Sans Mono",Consolas,Courier,monospace;--font-weight-bold:500;--spacing-xs:.1875rem;--spacing-s:.375rem;--spacing-m:.75rem;--spacing-l:1.5rem;--spacing-xl:2.25rem;--spacing-xxl:3.75rem;--spacing-xxxl:6rem;--negative-spacing-xs:-.1875rem;--negative-spacing-s:-.375rem;--negative-spacing-m:-.75rem;--negative-spacing-l:-1.5rem;--negative-spacing-xl:-2.25rem;--negative-spacing-xxl:-3.75rem;--negative-spacing-xxxl:-6rem;--font-size-xxs:.6875rem;--font-size-xs:.75rem;--font-size-s:.875rem;--font-size-m:.9375rem;--font-size-l:1.0625rem;--font-size-xl:1.1875rem;--font-size-xxl:1.5625rem;--font-size-xxxl:1.875rem;--material-ease:cubic-bezier(.55,0,.1,1);--inertial-ease:cubic-bezier(.19,1,.22,1)}._canvas_11af8_85{-webkit-text-size-adjust:100%;text-rendering:optimizeLegibility;color:var(--color--ink);font-family:var(--base-font-family);font-size:var(--font-size-m);line-height:1.5}._inspector_4pnoo_1{margin:var(--spacing-l) 0}._panel_4pnoo_5{border-bottom:1px solid var(--color--border)}._panelHandle_4pnoo_9{all:inherit;background:var(--color--surface-muted);border:0;box-sizing:border-box;cursor:pointer;display:block;font-weight:var(--font-weight-bold);padding:5px 10px;width:100%}._panelHandle_4pnoo_9:hover{background:var(--color--surface-hover)}._panelBody_4pnoo_25{border-left:1px solid var(--color--border);border-right:1px solid var(--color--border);padding:20px}._groupDescription_4pnoo_31{font-size:var(--font-size-s);line-height:1.2;margin-bottom:20px}._propertyGroup_4pnoo_37{border:1px solid var(--color--border);border-radius:5px}._propertyOrMethod_4pnoo_42{border-bottom:1px solid var(--color--border);line-height:1.2}._propertyOrMethod_4pnoo_42 p{margin:0}._propertyOrMethodBody_4pnoo_51{padding:15px}._propertyOrMethodExample_4pnoo_55{position:relative}._propertyOrMethodExample_4pnoo_55 pre{background:var(--color--surface-muted);font-size:.8em;margin:0;max-height:240px;overflow:auto;padding:15px}._propertyOrMethodName_4pnoo_68{color:var(--color--ink-subtle);display:block;font-family:var(--monospaced-font-family);font-size:.9em;font-weight:700;margin-bottom:5px;text-decoration:none}._propertyOrMethodName_4pnoo_68:hover{text-decoration:underline}._propertyOrMethodExampleActions_4pnoo_82{background:var(--color--surface);display:flex;padding:15px}._propertyOrMethodExampleActions_4pnoo_82>*{margin-right:10px}._fieldError_kqzsn_1{color:var(--color--ink-danger);font-size:var(--font-size-xs);line-height:1.2;margin-top:var(--spacing-s)}._FieldGroup_uz9ju_1{display:block}._FieldGroup__item_uz9ju_5{display:block;margin-bottom:var(--spacing-l)}._FieldGroup__item_uz9ju_5:last-child{margin-bottom:0}._fieldHint_1q1d1_1{color:var(--color--ink-subtle);font-size:var(--font-size-xs);line-height:1.2;margin-top:var(--spacing-s)}._fieldHint_1q1d1_1 a{color:inherit}._fieldHint_1q1d1_1 a:hover{text-decoration:none}._Form_5qspp_1,._Form__item_5qspp_5{display:block}._Form__item_5qspp_5:last-child{margin-bottom:0}._Form__item--default_5qspp_13{margin-bottom:var(--spacing-l)}._Form__item--condensed_5qspp_17{margin-bottom:var(--spacing-m)}._formLabel_12h4v_1{align-items:center;color:var(--color--ink-subtle);display:flex;margin-bottom:var(--spacing-s)}._formLabel_12h4v_1:hover ._formLabel__code_12h4v_8{opacity:1}._formLabel--error_12h4v_14{color:var(--color--ink-danger)}._formLabel__label_12h4v_18{flex:1}._formLabel__code_12h4v_8{font-family:var(--monospaced-font-family);font-size:.95em;opacity:0;position:absolute;transition:opacity .2s var(--material-ease)}._hotKey_17bh5_1{align-items:center;display:inline-flex;gap:15px}._label_17bh5_7{align-items:center;display:flex}._keys_17bh5_12{align-items:center;display:inline-flex;gap:4px}._hotKeyKey_17bh5_18{background:var(--color--primary-soft--surface);border-radius:3px;padding:5px 8px}._Section_12uz1_1{display:flex;flex-direction:column;gap:var(--spacing-m);position:relative}._Section--highlighted_12uz1_8:before{animation:_pageContentSectionHighligh_12uz1_1 4s ease-in-out .25s forwards;border-radius:4px;box-shadow:0 0 0 4px var(--color--focus--border);content:"";inset:-20px -30px;pointer-events:none;position:absolute;z-index:10}._Section__header_12uz1_22{margin-left:var(--negative-spacing-l);margin-right:var(--negative-spacing-l)}._Section__header--clickable_12uz1_27{cursor:pointer;-webkit-user-select:none;user-select:none}._Section__header--clickable_12uz1_27:hover ._Section__arrow_12uz1_31:before{opacity:.7}._Section__title_12uz1_36{align-items:center;display:flex;gap:var(--spacing-m)}._Section__title_12uz1_36:after,._Section__title_12uz1_36:before{background-color:var(--color--border);content:"";height:1px}._Section__title_12uz1_36:before{width:calc(var(--spacing-l) - var(--spacing-m))}._Section__title_12uz1_36:after{flex:1;margin-right:var(--spacing-l)}._Section__title__content_12uz1_58{align-items:center;display:inline-flex;flex-shrink:0;font-size:var(--font-size-l);font-weight:var(--font-weight-bold)}._Section__arrow_12uz1_31{align-self:stretch;margin-right:.3em;position:relative;width:15px}._Section__arrow_12uz1_31:before{border-bottom:6px solid transparent;border-left:6px solid var(--color--ink);border-top:6px solid transparent;content:"";height:0;left:6px;margin-top:-6px;position:absolute;top:50%;transform-origin:50% 50%;transition:transform .2s ease-out;width:0}._Section__arrow--is-open_12uz1_88:before{transform:rotate(90deg)}@keyframes _pageContentSectionHighligh_12uz1_1{0%{box-shadow:0 0 0 4px var(--color--focus--border),0 0 0 4px var(--color--focus--outline)}15%{box-shadow:0 0 0 4px var(--color--focus--border),0 0 0 80px transparent}75%{box-shadow:0 0 0 4px var(--color--focus--border),0 0 0 80px transparent}to{box-shadow:0 0 0 4px transparent,0 0 0 80px transparent}}._SidebarPanel_a4c7y_1{border-bottom:1px solid var(--color--border)}._SidebarPanel__header_a4c7y_5{align-items:center;-webkit-appearance:none;-moz-appearance:none;background-color:var(--color--surface);background-color:var(--color--surface-muted);border:0;box-sizing:border-box;color:var(--color--ink);cursor:pointer;display:flex;font-family:inherit;font-size:inherit;line-height:inherit;padding:0;text-align:left;-webkit-user-select:none;user-select:none;width:100%}._SidebarPanel__header_a4c7y_5:focus,._SidebarPanel__header_a4c7y_5:hover{background-color:var(--color--surface-hover)}._SidebarPanel__header__title_a4c7y_30{flex:1;font-weight:500;padding:0 20px}._SidebarPanel__header__chevron_a4c7y_36{align-items:center;display:flex;padding:13px 15px}._SidebarPanel__content_a4c7y_42{padding:20px}._SidebarPanel__content--no-padding_a4c7y_46{padding:0}._Spinner--inline_1u42l_1{display:inline-block;position:relative;vertical-align:middle}._Spinner--centered_1u42l_7{left:50%;position:absolute;top:50%}._Spinner__bar_1u42l_13{animation:_Spinner__spin_1u42l_1 1.2s linear infinite;background-color:var(--color--ink-subtle);height:14%;left:-20%;position:absolute;top:0;width:40%}@keyframes _Spinner__spin_1u42l_1{0%{opacity:1}to{opacity:.15}}._switchField__flex_ietsf_1{align-items:center;display:flex}._switchField__switchInput_ietsf_6{width:55px}._switchField__label_ietsf_10{color:var(--color--ink);flex:1;line-height:1.1;line-height:20px;margin-bottom:0;pointer-events:none;-moz-user-select:text;-ms-user-select:text;-webkit-user-select:text;user-select:text}._switchField__below_ietsf_22{margin-left:55px;margin-top:var(--spacing-s)}._switchInput__inner_vh6pt_1{color:var(--color--primary--ink);font-size:12px;left:24px;position:absolute;transition:left .3s cubic-bezier(.35,0,.25,1)}._switchInput_vh6pt_1{background-color:var(--color--ink-muted);border:1px solid var(--color--border);border-radius:20px;box-sizing:border-box;cursor:pointer;display:inline-block;height:22px;line-height:20px;position:relative;transition:all .3s cubic-bezier(.35,0,.25,1);vertical-align:middle;width:44px}._switchInput_vh6pt_1:after{animation-duration:.3s;animation-name:_switchInput__off_vh6pt_1;animation-timing-function:cubic-bezier(.35,0,.25,1);background-color:var(--color--surface);border-radius:50%;box-shadow:var(--shadow--raised);content:" ";cursor:pointer;height:18px;left:2px;position:absolute;top:1px;transform:scale(1);transition:left .3s cubic-bezier(.35,0,.25,1),transform .3s cubic-bezier(.35,0,.25,1);width:18px}._switchInput_vh6pt_1:focus:after,._switchInput_vh6pt_1:hover:after{animation-name:_switchInput__on_vh6pt_1;transform:scale(1.1)}._switchInput__checked_vh6pt_50{background-color:var(--color--primary--surface);border-color:var(--color--primary--surface)}._switchInput__checked_vh6pt_50 ._switchInput__inner_vh6pt_1{left:6px}._switchInput__checked_vh6pt_50:after{left:22px}._switchInput__disabled_vh6pt_63{background:var(--color--disabled--surface);border-color:var(--color--border);cursor:no-drop}._switchInput__disabled_vh6pt_63:after{animation-name:_none_vh6pt_1;background:var(--color--disabled--ink);cursor:no-drop}._switchInput__disabled_vh6pt_63:focus:after,._switchInput__disabled_vh6pt_63:hover:after{animation-name:_none_vh6pt_1;transform:scale(1)}@keyframes _switchInput__on_vh6pt_1{0%{transform:scale(1)}50%{transform:scale(1.25)}to{transform:scale(1.1)}}@keyframes _switchInput__off_vh6pt_1{0%{transform:scale(1.1)}to{transform:scale(1)}}._TextInput_1kqkh_1{appearance:none;background-color:var(--color--surface);background-image:none;border:1px solid var(--color--border);border-radius:0;box-sizing:border-box;color:inherit;display:block;font-family:inherit;font-size:var(--font-size-m);padding:10px;resize:none;transition:border .2s var(--material-ease);width:100%}._TextInput_1kqkh_1::placeholder{color:var(--color--ink-placeholder)}._TextInput_1kqkh_1:hover{border-color:var(--color--border-hover)}._TextInput_1kqkh_1:focus{border-color:var(--color--focus--border);box-shadow:0 0 0 4px var(--color--focus--outline);outline:0}._TextInput--monospaced_1kqkh_32{font-family:var(--monospaced-font-family);font-size:var(--font-size-s)}._TextInput--disabled_1kqkh_37{background:var(--color--disabled--surface);border-color:var(--color--border);color:var(--color--disabled--ink)}._TextInput--error_1kqkh_43,._TextInput--error_1kqkh_43:focus,._TextInput--error_1kqkh_43:hover{border-color:var(--color--danger-soft--border)}._TextInput--error_1kqkh_43:focus{box-shadow:0 0 0 4px var(--color--danger-soft--outline)}._TextareaInput_1xr0a_1{appearance:none;background-color:var(--color--surface);background-image:none;border:1px solid var(--color--border);border-radius:0;box-sizing:border-box;color:inherit;display:block;font-family:inherit;font-size:var(--font-size-m);padding:10px;resize:none;transition:border .2s var(--material-ease);width:100%}._TextareaInput_1xr0a_1::placeholder{color:var(--color--ink-placeholder)}._TextareaInput_1xr0a_1:hover{border-color:var(--color--border-hover)}._TextareaInput_1xr0a_1:focus{border-color:var(--color--focus--border);box-shadow:0 0 0 4px var(--color--focus--outline);outline:0}._TextareaInput--monospaced_1xr0a_32{font-family:var(--monospaced-font-family);font-size:var(--font-size-s)}._TextareaInput--disabled_1xr0a_37{background:var(--color--disabled--surface);border-color:var(--color--border);color:var(--color--disabled--ink)}._TextareaInput--error_1xr0a_43,._TextareaInput--error_1xr0a_43:focus,._TextareaInput--error_1xr0a_43:hover{border-color:var(--color--danger-soft--border)}._TextareaInput--error_1xr0a_43:focus{box-shadow:0 0 0 4px var(--color--danger-soft--outline)}._Button_36kvr_1{align-items:center;-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;border-left:1px solid var(--color--border);border-right:1px solid var(--color--border);box-sizing:border-box;color:var(--color--ink);cursor:pointer;display:flex;font-family:inherit;justify-content:center;line-height:inherit;min-height:49px;padding:0;width:49px}._Button_36kvr_1:focus,._Button_36kvr_1:hover{background-color:var(--color--surface-hover)}._Button_36kvr_1:first-child{border-left:0}._Button_36kvr_1:last-child{border-right:0}@media screen and (min-width:380px){._Button_36kvr_1{min-height:59px;width:59px}._Button_36kvr_1 svg{font-size:20px}}._Stack_1nnzo_1{align-items:center;display:flex;flex:1;flex-direction:row;justify-content:center;padding:10px 15px}._Stack--s_1nnzo_10{padding-bottom:var(--spacing-s);padding-top:var(--spacing-s)}._Stack--l_1nnzo_15{padding-left:var(--spacing-xl);padding-right:var(--spacing-xl)}._Title_1dx5n_1{font-size:var(--font-size-l);font-weight:500;line-height:1.1;margin-right:15px}@media screen and (min-width:380px){._Title_1dx5n_1{font-size:var(--font-size-xl)}}._Toolbar_50246_1{align-items:stretch;border-bottom:1px solid var(--color--border);border-top:1px solid var(--color--border);display:flex;position:relative}._Toolbar_50246_1:first-child{border-top-width:0}._Toolbar_50246_1:last-child{border-bottom-width:0}._tooltip_6pcmg_1{word-wrap:break-word;background:var(--color--tooltip--surface);border-radius:4px;box-shadow:var(--shadow--floating);color:var(--color--tooltip--ink);-webkit-hyphens:auto;hyphens:auto;max-width:400px;overflow-wrap:break-word;padding:10px 15px}._Dropdown_1051c_1{position:relative}._Dropdown__spacer_1051c_5{inset:0;pointer-events:none;position:absolute}._Dropdown__menu__search_1051c_11{border-bottom:1px solid var(--color--border);padding:7px}._Dropdown__menu__search__input_1051c_16{appearance:none;background-color:var(--color--surface);background-image:none;border:1px solid var(--color--border);border-radius:3px;box-sizing:border-box;color:inherit;display:block;font-family:inherit;font-size:.9em;padding:8px;resize:none;transition:border .2s var(--material-ease);width:100%}._Dropdown__menu__search__input_1051c_16::placeholder{color:var(--color--ink-placeholder)}._Dropdown__menu__search__input_1051c_16:hover{border-color:var(--color--border-hover)}._Dropdown__menu__search__input_1051c_16:focus{border-color:var(--color--focus--border);box-shadow:0 0 0 4px var(--color--focus--outline);outline:0}._Dropdown__menu-container_1051c_47{position:fixed;visibility:hidden}._Dropdown__menu_1051c_11{background-color:var(--color--surface-raised);border-radius:4px;box-shadow:var(--shadow--floating);margin-bottom:var(--spacing-xl);margin-top:10px;min-width:200px;padding:1px 0;text-align:initial}._Dropdown__menu__inner_1051c_63{margin:7px 0}._Dropdown__menu__group__title_1051c_67{background-color:var(--color--surface-muted);color:var(--color--ink-subtle);font-size:var(--font-size-xs);padding:5px 15px 3px;text-transform:uppercase}._Dropdown__menu__group__content_1051c_75{margin:8px 0}._Dropdown__menu__text_1051c_79{color:var(--color--ink-subtle);display:block;line-height:1.2;padding:4px 15px;position:relative;text-align:left}._Dropdown__menu__option_1051c_88{align-items:center;color:var(--color--ink);display:flex;padding:4px 15px;position:relative;text-align:left;text-decoration:none;white-space:nowrap}._Dropdown__menu__option_1051c_88:focus,._Dropdown__menu__option_1051c_88:hover{background-color:var(--color--surface-hover)}._Dropdown__menu__option_1051c_88>a{color:inherit;display:block;text-decoration:none}._Dropdown__menu__option--is-selected_1051c_110{background-color:var(--color--selected--surface)}._Dropdown__menu__option--is-disabled_1051c_114{opacity:.5}._Dropdown__menu__option--is-disabled_1051c_114 ._Dropdown__menu__option__content_1051c_117{cursor:not-allowed}._Dropdown__menu__option--is-dangerous_1051c_122:focus,._Dropdown__menu__option--is-dangerous_1051c_122:hover{background-color:var(--color--danger--surface);color:var(--color--danger--ink)}._Dropdown__menu__option--is-dangerous_1051c_122:focus svg,._Dropdown__menu__option--is-dangerous_1051c_122:hover svg{fill:var(--color--danger--ink);color:var(--color--danger--ink)}._Dropdown__menu__option--is-active_1051c_135{font-weight:500}._Dropdown__menu__option--is-active_1051c_135:focus,._Dropdown__menu__option--is-active_1051c_135:hover{background-color:none}._Dropdown__menu__option--is-invalid_1051c_148,._Dropdown__menu__option--is-valid_1051c_144{padding-left:35px}._Dropdown__menu__option--is-invalid_1051c_148:before{background-color:var(--color--danger--surface);border-radius:4px;content:"";font-size:12px;height:8px;left:15px;position:absolute;top:50%;transform:translateY(-50%);width:8px}._Dropdown__menu__option__content_1051c_117{-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;box-sizing:border-box;color:inherit;cursor:pointer;flex:1;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0;text-align:left}._Dropdown__menu__option__content_1051c_117>svg{fill:var(--color--ink-subtle);color:var(--color--ink-subtle);display:inline-block;font-size:13px;padding-right:8px;vertical-align:middle}._Dropdown__menu__option__icons_1051c_191{align-items:center;display:flex;padding-left:15px}._Dropdown__menu__option__icon_1051c_191{-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;box-sizing:border-box;color:var(--color--ink);color:var(--color--ink-subtle);cursor:pointer;display:inline-block;font-family:inherit;font-size:inherit;font-size:13px;line-height:inherit;line-height:10px;opacity:0;padding:3px;position:relative;top:-1px;transition:transform .1s ease-in-out;width:100%;width:auto}._Dropdown__menu__option_1051c_88:focus ._Dropdown__menu__option__icon_1051c_191,._Dropdown__menu__option_1051c_88:hover ._Dropdown__menu__option__icon_1051c_191{opacity:1}._Dropdown__menu__option__icon_1051c_191:focus,._Dropdown__menu__option__icon_1051c_191:hover{transform:scale(1.2)}._Dropdown__menu__option__icon_1051c_191 svg{fill:var(--color--ink-subtle);color:var(--color--ink-subtle)}._Dropdown__menu__option__icon--delete_1051c_239{color:var(--color--danger--ink)}._Dropdown__menu__option__icon--delete_1051c_239 svg{fill:var(--color--danger--ink);color:var(--color--danger--ink)}._Dropdown__menu__separator_1051c_247{background-color:var(--color--border);height:1px;margin:8px 0}._Dropdown__menu_1051c_11{overflow-y:auto}._SplitViewPane_1cl1f_1{height:100%;overflow-y:auto;position:absolute;width:100%}._SplitViewSash_9ds0h_1{align-items:center;background-color:transparent;display:flex;height:100%;justify-content:center;position:absolute;top:0;transition:background-color .2s .15s;width:100%;z-index:2}._SplitViewSash--dragging_9ds0h_15,._SplitViewSash_9ds0h_1:hover{background-color:var(--color--primary-soft--surface)}._SplitViewSash--dragging_9ds0h_15:has(._SplitViewSash__content_9ds0h_19:hover),._SplitViewSash_9ds0h_1:hover:has(._SplitViewSash__content_9ds0h_19:hover){background-color:transparent}._SplitViewSash--no-resize_9ds0h_24{pointer-events:none}._SplitViewSash--vertical_9ds0h_28{cursor:col-resize}._SplitViewSash--horizontal_9ds0h_32{cursor:row-resize}._SplitViewSash__content_9ds0h_19{cursor:pointer;left:50%;padding:15px 0;pointer-events:auto;position:absolute;top:50%;transform:translate(-50%,-50%)}._SplitViewSash__content__button_9ds0h_46{align-items:center;background:var(--color--surface);border:1px solid var(--color--border);border-radius:6px;color:var(--color--ink-subtle);display:flex;font-size:10px;height:20px;justify-content:center;width:20px;z-index:2}._SplitViewSash__content__button_9ds0h_46 svg{fill:currentColor;display:block}._SplitViewSash__content_9ds0h_19:hover ._SplitViewSash__content__button_9ds0h_46{background:var(--color--surface-hover);color:var(--color--ink)}._SplitView_1oi17_1{flex:1;height:100%;position:relative;width:100%}._SplitView--dragging_1oi17_8._SplitView--vertical_1oi17_8{cursor:col-resize}._SplitView--dragging_1oi17_8._SplitView--horizontal_1oi17_12{cursor:row-resize}._SplitView--disable-select_1oi17_16{-webkit-user-select:none;user-select:none}._SplitView--disable-select_1oi17_16 ._SplitViewPane_1oi17_20{pointer-events:none}._VerticalSplitPane__expand_28erb_1{background:var(--color--surface);cursor:pointer;inset:0;position:absolute;transition:all .3s cubic-bezier(.55,0,.1,1)}._VerticalSplitPane__expand_28erb_1:hover{animation:_VerticalSplitPane__expand_28erb_1 .6s cubic-bezier(.55,0,.1,1);background:var(--color--surface-hover)}._VerticalSplitPane__expand_28erb_1._VerticalSplitPane__expand_28erb_1{border-right:1px solid var(--color--border);transform-origin:left}._VerticalSplitPane__expand_28erb_1._VerticalSplitPane__expand--right_28erb_25{border-left:1px solid var(--color--border);transform-origin:right}@keyframes _VerticalSplitPane__expand_28erb_1{0%{transform:scaleX(1)}50%{transform:scaleX(2)}to{transform:scaleX(1)}}._VerticalSplitPaneOverlay_28erb_42{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:var(--color--backdrop--surface);height:100%;inset:0;overflow:hidden;position:absolute;z-index:12}._VerticalSplitPaneOverlay__primary_28erb_55{inset:0;position:absolute;z-index:1}._VerticalSplitPaneOverlay__primary--left_28erb_64{margin-right:20px}._VerticalSplitPaneOverlay__primary--right_28erb_68{margin-left:20px}._VerticalSplitPaneOverlay__secondary_28erb_72{background:var(--color--surface);bottom:0;box-shadow:var(--shadow--ambient);position:absolute;top:0}._VerticalSplitPaneOverlay__secondary--left_28erb_80{left:0}._VerticalSplitPaneOverlay__secondary--right_28erb_84{right:0}._VerticalSplitPaneOverlay__sash_28erb_88{height:100%;position:absolute;top:0}._VerticalSplitPaneOverlay__secondary--left_28erb_80 ._VerticalSplitPaneOverlay__sash_28erb_88{right:0}._VerticalSplitPaneOverlay__secondary--right_28erb_84 ._VerticalSplitPaneOverlay__sash_28erb_88{left:0}