@adea-ai/ui 0.102.0 → 0.103.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.
Files changed (56) hide show
  1. package/README.md +27 -11
  2. package/dist/components/composites/appearance-editor/appearance-choices.d.ts +7 -0
  3. package/dist/components/composites/appearance-editor/appearance-choices.d.ts.map +1 -1
  4. package/dist/components/composites/appearance-editor/appearance-choices.js +44 -3
  5. package/dist/components/composites/appearance-editor/appearance-choices.js.map +1 -1
  6. package/dist/components/composites/appearance-editor/appearance-editor.d.ts.map +1 -1
  7. package/dist/components/composites/appearance-editor/appearance-editor.js +7 -3
  8. package/dist/components/composites/appearance-editor/appearance-editor.js.map +1 -1
  9. package/dist/components/composites/appearance-editor/appearance-types.d.ts +8 -0
  10. package/dist/components/composites/appearance-editor/appearance-types.d.ts.map +1 -1
  11. package/dist/components/composites/update-dialog/update-dialog.d.ts +15 -2
  12. package/dist/components/composites/update-dialog/update-dialog.d.ts.map +1 -1
  13. package/dist/components/composites/update-dialog/update-dialog.js +80 -16
  14. package/dist/components/composites/update-dialog/update-dialog.js.map +1 -1
  15. package/dist/components/theme/appearance-panel.d.ts +2 -1
  16. package/dist/components/theme/appearance-panel.d.ts.map +1 -1
  17. package/dist/components/theme/appearance-panel.js +62 -22
  18. package/dist/components/theme/appearance-panel.js.map +1 -1
  19. package/dist/components/theme/theme-provider.d.ts +13 -2
  20. package/dist/components/theme/theme-provider.d.ts.map +1 -1
  21. package/dist/components/theme/theme-provider.js +9 -5
  22. package/dist/components/theme/theme-provider.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -2
  26. package/dist/lib/theme-accents.d.ts +9 -0
  27. package/dist/lib/theme-accents.d.ts.map +1 -0
  28. package/dist/lib/theme-accents.js +41 -0
  29. package/dist/lib/theme-accents.js.map +1 -0
  30. package/dist/lib/themes.d.ts +69 -5
  31. package/dist/lib/themes.d.ts.map +1 -1
  32. package/dist/lib/themes.js +100 -7
  33. package/dist/lib/themes.js.map +1 -1
  34. package/dist/r/appearance-editor.json +1 -1
  35. package/dist/r/lib.json +6 -1
  36. package/dist/r/registry.json +8 -2
  37. package/dist/r/src/components/composites/appearance-editor/appearance-choices.tsx +41 -4
  38. package/dist/r/src/components/composites/appearance-editor/appearance-editor.tsx +12 -6
  39. package/dist/r/src/components/composites/appearance-editor/appearance-types.ts +8 -0
  40. package/dist/r/src/components/composites/update-dialog/update-dialog.tsx +90 -10
  41. package/dist/r/src/components/theme/appearance-panel.tsx +60 -29
  42. package/dist/r/src/components/theme/theme-provider.tsx +35 -7
  43. package/dist/r/src/lib/theme-accents.ts +44 -0
  44. package/dist/r/src/lib/themes.ts +116 -5
  45. package/dist/r/theming.json +1 -0
  46. package/package.json +2 -2
  47. package/registry.json +8 -2
  48. package/src/components/composites/appearance-editor/appearance-choices.tsx +41 -4
  49. package/src/components/composites/appearance-editor/appearance-editor.tsx +12 -6
  50. package/src/components/composites/appearance-editor/appearance-types.ts +8 -0
  51. package/src/components/composites/update-dialog/update-dialog.tsx +90 -10
  52. package/src/components/theme/appearance-panel.tsx +60 -29
  53. package/src/components/theme/theme-provider.tsx +35 -7
  54. package/src/index.ts +7 -0
  55. package/src/lib/theme-accents.ts +44 -0
  56. package/src/lib/themes.ts +116 -5
package/README.md CHANGED
@@ -233,26 +233,35 @@ provider takes an initial selection and every axis is a plain value:
233
233
  appearance: 'system', // 'light' | 'dark' | 'system'
234
234
  lightThemeId: 'adea-light',
235
235
  darkThemeId: 'adea-dark',
236
- accent: 'theme', // or 'violet' | 'blue' | 'green' | 'amber' | 'cyan' | 'pink'
236
+ accent: 'theme', // or 'violet' | 'blue' | 'green' | 'amber' | 'cyan' | 'pink',
237
+ // or a theme-carried accent such as 'ansi-blue'
237
238
  font: 'space-grotesk', // or 'system' | 'geist' | 'geist-mono' | 'jetbrains-mono'
238
239
  }}
239
240
  >
240
241
  ```
241
242
 
242
- | Axis | Values | How it is applied |
243
- | ---------- | -------------------------------------------------- | -------------------------------------------------------------- |
244
- | Appearance | `light`, `dark`, `system` | a `dark` class plus `color-scheme` on `<html>` |
245
- | Theme | any of the 34 catalogue ids | the variant's tokens, written as custom properties on `<html>` |
246
- | Accent | `theme` (follow the variant) or one of six presets | a `data-accent` attribute on `<html>` |
247
- | Typeface | five options | a `data-font` attribute on `<html>` |
243
+ | Axis | Values | How it is applied |
244
+ | ---------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
245
+ | Appearance | `light`, `dark`, `system` | a `dark` class plus `color-scheme` on `<html>` |
246
+ | Theme | any of the 34 catalogue ids | the variant's tokens, written as custom properties on `<html>` |
247
+ | Accent | `theme` (follow the variant), one of six presets, or an accent the theme pair carries (`ansi-blue`…) | a `data-accent` attribute on `<html>`, plus the resolved roles as custom properties |
248
+ | Typeface | five options | a `data-font` attribute on `<html>` |
248
249
 
249
250
  Read and change the current selection with `useTheme()`:
250
251
 
251
252
  ```tsx
252
- const { selection, resolvedAppearance, setSelection, themes } = useTheme()
253
+ const { selection, resolvedAppearance, setSelection, themes, themeAccents } = useTheme()
253
254
  setSelection({ accent: 'amber' })
254
255
  ```
255
256
 
257
+ `themeAccents()` lists the accents the selected light/dark theme pair carries
258
+ itself (`@adea-ai/themes`' `themeAccentPresets`): the palette's own blue,
259
+ magenta, cyan and green, offered only when both themes clear the catalogue's
260
+ accent floors. Their ids are role-shaped, so `ansi-blue` follows a theme switch
261
+ to the new theme's blue; a slot the new pair cannot offer falls back to the
262
+ theme's own primary. `AppearancePanel` and `AppearanceEditor` offer them after
263
+ the six presets.
264
+
256
265
  Two components ship for the settings surface: `AppearancePanel` is the whole
257
266
  appearance view, and `ThemeToggle` is the light/dark switch on its own.
258
267
 
@@ -671,9 +680,16 @@ its menus prevent Tab, the theme row carries Tab and Shift+Tab through the enclo
671
680
  dialog's focus order. `DropdownMenuContent.portalMount` keeps the theme menu within
672
681
  its enclosing modal's accessible subtree.
673
682
 
674
- Supply canonical `AdeaTheme` previews and `AdeaThemeRecord` choices from
675
- `@adea-ai/themes`, including any validated accent overlay. The editor imports
676
- only their types. Hosts own saved-ID recovery, validation, draft snapshots,
683
+ Supply canonical `AdeaTheme` previews and `AdeaThemeRecord` choices.
684
+ `themeRecords`/`themeRecordById` export those records, and
685
+ `appearancePreviewThemes({ lightThemeId, darkThemeId, accent })` resolves a
686
+ draft's ids and accent — a preset or a theme-carried accent — into the two
687
+ preview themes, exactly as `ThemeProvider` would apply them; `withAccent` is the
688
+ overlay on its own. `builtinThemes` is the shadcn projection a document is
689
+ painted with, not an editor input. Pass `themeAccentOptions` —
690
+ `themeAccentsFor(lightThemeId, darkThemeId)` — to offer the accents the previewed
691
+ pair carries after the presets; the editor itself loads no catalogue or
692
+ normalization. Hosts own saved-ID recovery, validation, draft snapshots,
677
693
  System appearance resolution, native transparency, live application tokens,
678
694
  Save persistence and restoration on Cancel/dismissal. `saving`,
679
695
  `saveDisabledReason`, `recoveryNotice`, `customAccentError`, and
@@ -1,5 +1,12 @@
1
1
  import type { AppearanceEditorProps } from './appearance-types';
2
2
  export declare function ModeChoices(props: AppearanceEditorProps): import("solid-js").JSX.Element;
3
+ /**
4
+ * Whether the draft accent is the host's custom colour: not the theme default,
5
+ * not a preset, and not a theme accent id. A theme accent id counts as known even
6
+ * when the current pair cannot offer it — it is a stored role, not a colour the
7
+ * user typed, and showing it in the custom field would invite editing `ansi-blue`.
8
+ */
9
+ export declare function isCustomAccent(props: AppearanceEditorProps): boolean;
3
10
  export declare function AccentChoices(props: AppearanceEditorProps): import("solid-js").JSX.Element;
4
11
  export declare function GlassChoices(props: AppearanceEditorProps): import("solid-js").JSX.Element;
5
12
  //# sourceMappingURL=appearance-choices.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"appearance-choices.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/appearance-editor/appearance-choices.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAc/D,wBAAgB,WAAW,CAAC,KAAK,EAAE,qBAAqB,kCAyCvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,qBAAqB,kCA+EzD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,qBAAqB,kCA6BxD"}
1
+ {"version":3,"file":"appearance-choices.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/appearance-editor/appearance-choices.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAc/D,wBAAgB,WAAW,CAAC,KAAK,EAAE,qBAAqB,kCAyCvD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAOpE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,qBAAqB,kCAoGzD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,qBAAqB,kCA6BxD"}
@@ -1,3 +1,4 @@
1
+ import { isThemeAccentId } from "../../../lib/theme-accents.js";
1
2
  import { ThemeMiniature, ThemeMiniatureSplit } from "./theme-preview.js";
2
3
  import { createComponent, effect, insert, memo, setStyleProperty, template } from "solid-js/web";
3
4
  import { For, Show } from "solid-js";
@@ -103,10 +104,20 @@ function ModeChoices(props) {
103
104
  }
104
105
  });
105
106
  }
107
+ /**
108
+ * Whether the draft accent is the host's custom colour: not the theme default,
109
+ * not a preset, and not a theme accent id. A theme accent id counts as known even
110
+ * when the current pair cannot offer it — it is a stored role, not a colour the
111
+ * user typed, and showing it in the custom field would invite editing `ansi-blue`.
112
+ */
113
+ function isCustomAccent(props) {
114
+ const accent = props.draft.accent;
115
+ return accent !== "theme" && !props.accentOptions.some((option) => option.id === accent) && !isThemeAccentId(accent);
116
+ }
106
117
  function AccentChoices(props) {
107
118
  const resolvedAppearance = () => props.draft.mode === "system" ? props.resolvedAppearance : props.draft.mode;
108
- const custom = () => props.draft.accent !== "theme" && !props.accentOptions.some((option) => option.id === props.draft.accent);
109
- const accentSelection = () => custom() ? "custom" : props.draft.accent;
119
+ const themeAccents = () => props.themeAccentOptions ?? [];
120
+ const accentSelection = () => isCustomAccent(props) ? "custom" : props.draft.accent;
110
121
  return createComponent(RadioGroup, {
111
122
  get value() {
112
123
  return accentSelection();
@@ -164,6 +175,36 @@ function AccentChoices(props) {
164
175
  }
165
176
  })
166
177
  }), null);
178
+ insert(_el$3, createComponent(For, {
179
+ get each() {
180
+ return themeAccents();
181
+ },
182
+ children: (option) => createComponent(RadioGroup.Item, {
183
+ get value() {
184
+ return option.id;
185
+ },
186
+ get ["data-theme-accent"]() {
187
+ return option.id;
188
+ },
189
+ "class": "rounded-full focus-within:ring-3 focus-within:ring-ring/50",
190
+ get children() {
191
+ return [createComponent(RadioGroup.ItemInput, {}), createComponent(RadioGroup.ItemLabel, {
192
+ "class": "block size-7 cursor-pointer rounded-full border border-dashed p-0.5 data-[checked]:border-solid data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary",
193
+ get children() {
194
+ return [(() => {
195
+ var _el$8 = _tmpl$3();
196
+ effect((_$p) => setStyleProperty(_el$8, "background-color", resolvedAppearance() === "light" ? option.light : option.dark));
197
+ return _el$8;
198
+ })(), (() => {
199
+ var _el$9 = _tmpl$6();
200
+ insert(_el$9, () => `Theme ${option.label.toLowerCase()}`);
201
+ return _el$9;
202
+ })()];
203
+ }
204
+ })];
205
+ }
206
+ })
207
+ }), null);
167
208
  return _el$3;
168
209
  })(), createComponent(RadioGroup.Item, {
169
210
  value: "custom",
@@ -217,6 +258,6 @@ function GlassChoices(props) {
217
258
  });
218
259
  }
219
260
  //#endregion
220
- export { AccentChoices, GlassChoices, ModeChoices };
261
+ export { AccentChoices, GlassChoices, ModeChoices, isCustomAccent };
221
262
 
222
263
  //# sourceMappingURL=appearance-choices.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appearance-choices.js","names":["RadioGroup","Radio","For","Show","AppearanceEditorProps","ThemeMiniature","ThemeMiniatureSplit","MODES","value","label","const","SURFACES","ModeChoices","props","_$createComponent","draft","mode","disabled","saving","orientation","onChange","option","find","candidate","children","each","Item","data-mode","ItemInput","ItemLabel","_el$","_tmpl$","_$insert","when","fallback","theme","_$memo","lightTheme","darkTheme","light","dark","_el$2","_tmpl$2","AccentChoices","resolvedAppearance","custom","accent","accentOptions","some","id","accentSelection","customAccentValue","_el$3","_tmpl$5","_el$4","_tmpl$3","_$effect","_$p","_$setStyleProperty","colors","_tmpl$4","_el$6","_el$7","_tmpl$6","GlassChoices","surface","surfaceCapability","frosted","_$createComponent","Radio","_$memo","_$setStyleProperty"],"sources":["../../../../src/components/composites/appearance-editor/appearance-choices.tsx"],"sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2026 Wing\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// Pinned mode-card, accent-swatch, and glass-chip composition. Kobalte replaces\n// the app port's manual roving focus; it does not replace the donor hierarchy.\nimport { RadioGroup as Radio } from '@kobalte/core/radio-group'\nimport { For, Show } from 'solid-js'\nimport type { AppearanceEditorProps } from './appearance-types'\nimport { ThemeMiniature, ThemeMiniatureSplit } from './theme-preview'\n\nconst MODES = [\n { value: 'system', label: 'System' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n] as const\nconst SURFACES = [\n { value: 'theme', label: 'Theme default' },\n { value: 'frosted', label: 'Frosted' },\n { value: 'opaque', label: 'Opaque' },\n] as const\n\nexport function ModeChoices(props: AppearanceEditorProps) {\n return (\n <Radio\n value={props.draft.mode}\n disabled={props.saving}\n orientation=\"horizontal\"\n aria-label=\"Appearance mode\"\n onChange={(mode) => {\n const option = MODES.find((candidate) => candidate.value === mode)\n if (option) props.onChange({ mode: option.value })\n }}\n class=\"grid grid-cols-1 gap-3 px-4 py-4 sm:grid-cols-3\"\n >\n <For each={MODES}>\n {(option) => (\n <Radio.Item\n value={option.value}\n data-mode={option.value}\n class=\"min-w-0 rounded-lg focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"flex cursor-pointer flex-col gap-2 rounded-lg border p-2 text-center text-xs data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\">\n <span class=\"block h-20 w-full\">\n <Show\n when={option.value === 'system'}\n fallback={\n <ThemeMiniature\n theme={option.value === 'light' ? props.lightTheme : props.darkTheme}\n />\n }\n >\n <ThemeMiniatureSplit light={props.lightTheme} dark={props.darkTheme} />\n </Show>\n </span>\n <span>{option.label}</span>\n </Radio.ItemLabel>\n </Radio.Item>\n )}\n </For>\n </Radio>\n )\n}\n\nexport function AccentChoices(props: AppearanceEditorProps) {\n // The resolved appearance decides which side of a preset pair — and which\n // theme accent — the swatches paint, so the row previews each choice as the\n // user will see it.\n const resolvedAppearance = () =>\n props.draft.mode === 'system' ? props.resolvedAppearance : props.draft.mode\n const custom = () =>\n props.draft.accent !== 'theme' &&\n !props.accentOptions.some((option) => option.id === props.draft.accent)\n const accentSelection = () => (custom() ? 'custom' : props.draft.accent)\n return (\n <Radio\n value={accentSelection()}\n disabled={props.saving}\n orientation=\"horizontal\"\n aria-label=\"Accent\"\n // One chip (custom) beside a capped swatch grid: a chip-per-state column\n // beside a full-width swatch line overflowed the settings sidebar's\n // control column, so the pair stays a narrow chip plus a wrapped grid.\n class=\"flex items-center gap-3\"\n onChange={(accent) =>\n props.onChange({\n accent: accent === 'custom' ? (props.customAccentValue ?? '') : accent,\n })\n }\n >\n <div class=\"grid grid-cols-4 gap-2\">\n {/* The theme's own accent is the first swatch. Picking it is the same\n act the old dedicated \"Theme default\" chip performed, without a\n second control for the state the row starts in. */}\n <Radio.Item\n value=\"theme\"\n class=\"rounded-full focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"block size-7 cursor-pointer rounded-full border p-0.5 data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary\">\n <span\n class=\"block size-full rounded-full\"\n aria-hidden=\"true\"\n style={{\n 'background-color':\n resolvedAppearance() === 'light'\n ? props.lightTheme.colors.accent\n : props.darkTheme.colors.accent,\n }}\n />\n <span class=\"sr-only\">Theme default</span>\n </Radio.ItemLabel>\n </Radio.Item>\n <For each={props.accentOptions}>\n {(option) => (\n <Radio.Item\n value={option.id}\n class=\"rounded-full focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"block size-7 cursor-pointer rounded-full border p-0.5 data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary\">\n <span\n class=\"block size-full rounded-full\"\n aria-hidden=\"true\"\n style={{\n 'background-color':\n resolvedAppearance() === 'light' ? option.light : option.dark,\n }}\n />\n <span class=\"sr-only\">{option.label}</span>\n </Radio.ItemLabel>\n </Radio.Item>\n )}\n </For>\n </div>\n <Radio.Item value=\"custom\">\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"flex h-7 cursor-pointer items-center rounded-md border px-2 text-xs whitespace-nowrap data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary\">\n Custom\n </Radio.ItemLabel>\n </Radio.Item>\n </Radio>\n )\n}\n\nexport function GlassChoices(props: AppearanceEditorProps) {\n return (\n <Radio\n value={props.draft.surface}\n disabled={props.saving}\n orientation=\"horizontal\"\n aria-label=\"Glass\"\n class=\"flex flex-wrap gap-1\"\n onChange={(surface) => {\n const option = SURFACES.find((candidate) => candidate.value === surface)\n if (option) props.onChange({ surface: option.value })\n }}\n >\n <For each={SURFACES}>\n {(option) => (\n <Radio.Item\n value={option.value}\n disabled={option.value === 'frosted' && !props.surfaceCapability.frosted}\n class=\"rounded-md focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"flex h-7 cursor-pointer items-center rounded-md border px-2 text-xs data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\">\n {option.label}\n </Radio.ItemLabel>\n </Radio.Item>\n )}\n </For>\n </Radio>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"appearance-choices.js","names":["RadioGroup","Radio","For","Show","isThemeAccentId","AppearanceEditorProps","ThemeMiniature","ThemeMiniatureSplit","MODES","value","label","const","SURFACES","ModeChoices","props","_$createComponent","draft","mode","disabled","saving","orientation","onChange","option","find","candidate","children","each","Item","data-mode","ItemInput","ItemLabel","_el$","_tmpl$","_$insert","when","fallback","theme","_$memo","lightTheme","darkTheme","light","dark","_el$2","_tmpl$2","isCustomAccent","accent","accentOptions","some","id","AccentChoices","resolvedAppearance","themeAccents","themeAccentOptions","accentSelection","customAccentValue","_el$3","_tmpl$5","_el$4","_tmpl$3","_$effect","_$p","_$setStyleProperty","colors","_tmpl$4","_el$6","_el$7","_tmpl$6","data-theme-accent","_el$8","_el$9","toLowerCase","GlassChoices","surface","surfaceCapability","frosted","_$createComponent","Radio","_$memo","_$setStyleProperty"],"sources":["../../../../src/components/composites/appearance-editor/appearance-choices.tsx"],"sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2026 Wing\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// Pinned mode-card, accent-swatch, and glass-chip composition. Kobalte replaces\n// the app port's manual roving focus; it does not replace the donor hierarchy.\nimport { RadioGroup as Radio } from '@kobalte/core/radio-group'\nimport { For, Show } from 'solid-js'\nimport { isThemeAccentId } from '#lib/theme-accents'\nimport type { AppearanceEditorProps } from './appearance-types'\nimport { ThemeMiniature, ThemeMiniatureSplit } from './theme-preview'\n\nconst MODES = [\n { value: 'system', label: 'System' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n] as const\nconst SURFACES = [\n { value: 'theme', label: 'Theme default' },\n { value: 'frosted', label: 'Frosted' },\n { value: 'opaque', label: 'Opaque' },\n] as const\n\nexport function ModeChoices(props: AppearanceEditorProps) {\n return (\n <Radio\n value={props.draft.mode}\n disabled={props.saving}\n orientation=\"horizontal\"\n aria-label=\"Appearance mode\"\n onChange={(mode) => {\n const option = MODES.find((candidate) => candidate.value === mode)\n if (option) props.onChange({ mode: option.value })\n }}\n class=\"grid grid-cols-1 gap-3 px-4 py-4 sm:grid-cols-3\"\n >\n <For each={MODES}>\n {(option) => (\n <Radio.Item\n value={option.value}\n data-mode={option.value}\n class=\"min-w-0 rounded-lg focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"flex cursor-pointer flex-col gap-2 rounded-lg border p-2 text-center text-xs data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\">\n <span class=\"block h-20 w-full\">\n <Show\n when={option.value === 'system'}\n fallback={\n <ThemeMiniature\n theme={option.value === 'light' ? props.lightTheme : props.darkTheme}\n />\n }\n >\n <ThemeMiniatureSplit light={props.lightTheme} dark={props.darkTheme} />\n </Show>\n </span>\n <span>{option.label}</span>\n </Radio.ItemLabel>\n </Radio.Item>\n )}\n </For>\n </Radio>\n )\n}\n\n/**\n * Whether the draft accent is the host's custom colour: not the theme default,\n * not a preset, and not a theme accent id. A theme accent id counts as known even\n * when the current pair cannot offer it — it is a stored role, not a colour the\n * user typed, and showing it in the custom field would invite editing `ansi-blue`.\n */\nexport function isCustomAccent(props: AppearanceEditorProps): boolean {\n const accent = props.draft.accent\n return (\n accent !== 'theme' &&\n !props.accentOptions.some((option) => option.id === accent) &&\n !isThemeAccentId(accent)\n )\n}\n\nexport function AccentChoices(props: AppearanceEditorProps) {\n // The resolved appearance decides which side of a preset pair — and which\n // theme accent — the swatches paint, so the row previews each choice as the\n // user will see it.\n const resolvedAppearance = () =>\n props.draft.mode === 'system' ? props.resolvedAppearance : props.draft.mode\n // The accents the previewed theme pair carries, offered after the presets.\n const themeAccents = () => props.themeAccentOptions ?? []\n const accentSelection = () => (isCustomAccent(props) ? 'custom' : props.draft.accent)\n return (\n <Radio\n value={accentSelection()}\n disabled={props.saving}\n orientation=\"horizontal\"\n aria-label=\"Accent\"\n // One chip (custom) beside a capped swatch grid: a chip-per-state column\n // beside a full-width swatch line overflowed the settings sidebar's\n // control column, so the pair stays a narrow chip plus a wrapped grid.\n class=\"flex items-center gap-3\"\n onChange={(accent) =>\n props.onChange({\n accent: accent === 'custom' ? (props.customAccentValue ?? '') : accent,\n })\n }\n >\n <div class=\"grid grid-cols-4 gap-2\">\n {/* The theme's own accent is the first swatch. Picking it is the same\n act the old dedicated \"Theme default\" chip performed, without a\n second control for the state the row starts in. */}\n <Radio.Item\n value=\"theme\"\n class=\"rounded-full focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"block size-7 cursor-pointer rounded-full border p-0.5 data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary\">\n <span\n class=\"block size-full rounded-full\"\n aria-hidden=\"true\"\n style={{\n 'background-color':\n resolvedAppearance() === 'light'\n ? props.lightTheme.colors.accent\n : props.darkTheme.colors.accent,\n }}\n />\n <span class=\"sr-only\">Theme default</span>\n </Radio.ItemLabel>\n </Radio.Item>\n <For each={props.accentOptions}>\n {(option) => (\n <Radio.Item\n value={option.id}\n class=\"rounded-full focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"block size-7 cursor-pointer rounded-full border p-0.5 data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary\">\n <span\n class=\"block size-full rounded-full\"\n aria-hidden=\"true\"\n style={{\n 'background-color':\n resolvedAppearance() === 'light' ? option.light : option.dark,\n }}\n />\n <span class=\"sr-only\">{option.label}</span>\n </Radio.ItemLabel>\n </Radio.Item>\n )}\n </For>\n <For each={themeAccents()}>\n {(option) => (\n <Radio.Item\n value={option.id}\n data-theme-accent={option.id}\n class=\"rounded-full focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"block size-7 cursor-pointer rounded-full border border-dashed p-0.5 data-[checked]:border-solid data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary\">\n <span\n class=\"block size-full rounded-full\"\n aria-hidden=\"true\"\n style={{\n 'background-color':\n resolvedAppearance() === 'light' ? option.light : option.dark,\n }}\n />\n <span class=\"sr-only\">{`Theme ${option.label.toLowerCase()}`}</span>\n </Radio.ItemLabel>\n </Radio.Item>\n )}\n </For>\n </div>\n <Radio.Item value=\"custom\">\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"flex h-7 cursor-pointer items-center rounded-md border px-2 text-xs whitespace-nowrap data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary\">\n Custom\n </Radio.ItemLabel>\n </Radio.Item>\n </Radio>\n )\n}\n\nexport function GlassChoices(props: AppearanceEditorProps) {\n return (\n <Radio\n value={props.draft.surface}\n disabled={props.saving}\n orientation=\"horizontal\"\n aria-label=\"Glass\"\n class=\"flex flex-wrap gap-1\"\n onChange={(surface) => {\n const option = SURFACES.find((candidate) => candidate.value === surface)\n if (option) props.onChange({ surface: option.value })\n }}\n >\n <For each={SURFACES}>\n {(option) => (\n <Radio.Item\n value={option.value}\n disabled={option.value === 'frosted' && !props.surfaceCapability.frosted}\n class=\"rounded-md focus-within:ring-3 focus-within:ring-ring/50\"\n >\n <Radio.ItemInput />\n <Radio.ItemLabel class=\"flex h-7 cursor-pointer items-center rounded-md border px-2 text-xs data-[checked]:border-primary data-[checked]:ring-1 data-[checked]:ring-primary data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\">\n {option.label}\n </Radio.ItemLabel>\n </Radio.Item>\n )}\n </For>\n </Radio>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"appearance-editor.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/appearance-editor/appearance-editor.tsx"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAIvF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kCA+J5D;AAED;;6DAE6D;AAC7D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,kCAyB9D"}
1
+ {"version":3,"file":"appearance-editor.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/appearance-editor/appearance-editor.tsx"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAIvF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kCAqK5D;AAED;;6DAE6D;AAC7D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,kCAyB9D"}
@@ -3,7 +3,7 @@ import { Button } from "../../ui/button/button.js";
3
3
  import { Input } from "../../ui/input/input.js";
4
4
  import { Popover, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger } from "../../ui/popover/popover.js";
5
5
  import { Switch } from "../../ui/switch/switch.js";
6
- import { AccentChoices, GlassChoices, ModeChoices } from "./appearance-choices.js";
6
+ import { AccentChoices, GlassChoices, ModeChoices, isCustomAccent } from "./appearance-choices.js";
7
7
  import { SettingsRow, TerminalRow, ThemeRow } from "./appearance-rows.js";
8
8
  import { className, createComponent, effect, insert, memo, setAttribute, template } from "solid-js/web";
9
9
  import { EyeOff, Palette, PanelsTopLeft, SlidersHorizontal } from "lucide-solid";
@@ -26,10 +26,14 @@ var _tmpl$6 = /*#__PURE__*/ template(`<div data-appearance-editor><div class="di
26
26
  function AppearanceEditor(props) {
27
27
  const errorId = createUniqueId();
28
28
  const saveReasonId = createUniqueId();
29
- const custom = () => props.draft.accent !== "theme" && !props.accentOptions.some((option) => option.id === props.draft.accent);
29
+ const custom = () => isCustomAccent(props);
30
30
  const accentDescription = () => {
31
31
  if (props.draft.accent === "theme") return "Theme default · Uses the palette's intended color.";
32
- return `${props.accentOptions.find((option) => option.id === props.draft.accent)?.label ?? "Custom"} · Controls, glyphs, selections, code, and activity.`;
32
+ const preset = props.accentOptions.find((option) => option.id === props.draft.accent);
33
+ if (preset) return `${preset.label} · Controls, glyphs, selections, code, and activity.`;
34
+ if (custom()) return "Custom · Controls, glyphs, selections, code, and activity.";
35
+ const offered = props.themeAccentOptions?.find((option) => option.id === props.draft.accent);
36
+ return offered ? `Theme ${offered.label.toLowerCase()} · The theme's own color, on controls and activity.` : "Theme default · This theme does not carry that accent, so it uses the palette's intended color.";
33
37
  };
34
38
  const glassDescription = () => props.draft.surface === "opaque" ? "Solid surfaces for every theme." : props.draft.surface === "frosted" ? "Theme-colored glass where supported." : props.surfaceCapability.themeDefaultDescription ?? "Uses this theme's default surface.";
35
39
  return (() => {
@@ -1 +1 @@
1
- {"version":3,"file":"appearance-editor.js","names":["EyeOff","Palette","PanelsTopLeft","SlidersHorizontal","Show","createUniqueId","cn","Button","Input","Switch","Popover","PopoverContent","PopoverDescription","PopoverTitle","PopoverTrigger","AppearanceEditorProps","AppearancePopoverProps","ModeChoices","AccentChoices","GlassChoices","SettingsRow","TerminalRow","ThemeRow","AppearanceEditor","props","errorId","saveReasonId","custom","draft","accent","accentOptions","some","option","id","accentDescription","name","find","label","glassDescription","surface","surfaceCapability","themeDefaultDescription","_el$","_tmpl$6","_el$3","firstChild","_el$9","nextSibling","_el$0","_$insert","_$createComponent","when","recoveryNotice","children","_el$2","_tmpl$","appearance","selectedId","lightThemeId","preview","lightTheme","themes","disabled","saving","onSelect","onChange","darkThemeId","darkTheme","terminalThemeId","undefined","_$memo","resolvedAppearance","title","icon","description","_el$4","_tmpl$3","_el$5","_$setAttribute","value","aria-invalid","customAccentError","aria-describedby","onInput","event","currentTarget","_el$6","_tmpl$2","frosted","reason","_el$7","_tmpl$4","checked","reduceTransparency","onManageThemes","type","size","variant","onClick","saveDisabledReason","_el$8","_tmpl$5","onReset","onCancel","aria-busy","onSave","_$effect","_$className","class","AppearancePopover","open","modal","onOpenChange","onOpen","onDismiss","as","_$createComponent","_$memo","_$className"],"sources":["../../../../src/components/composites/appearance-editor/appearance-editor.tsx"],"sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2026 Wing\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/*\n * Composition substantially translated from Zeron settings/appearance.rs and\n * settings/widgets.rs, pinned at 30a9a9537c5ec96226c87f4bf349b6f77c5dfb59,\n * preserving Adea's existing appearance-surface.tsx port: System/Light/Dark\n * miniatures, compact independent theme rows, accent swatches and helper copy,\n * glass chips, and theme library affordance. Kobalte replaces the port's manual\n * radio keyboard model. The controlled draft and explicit action ports replace\n * GPUI globals and app-specific storage/native authority. Save/Cancel/Reset and\n * custom accent/reduced-transparency are accepted Adea divergences (#425).\n */\nimport { EyeOff, Palette, PanelsTopLeft, SlidersHorizontal } from 'lucide-solid'\nimport { Show, createUniqueId } from 'solid-js'\nimport { cn } from '#lib/utils'\nimport { Button } from '../../ui/button/button'\nimport { Input } from '../../ui/input/input'\n\nimport { Switch } from '../../ui/switch/switch'\nimport {\n Popover,\n PopoverContent,\n PopoverDescription,\n PopoverTitle,\n PopoverTrigger,\n} from '../../ui/popover/popover'\nimport type { AppearanceEditorProps, AppearancePopoverProps } from './appearance-types'\nimport { ModeChoices, AccentChoices, GlassChoices } from './appearance-choices'\nimport { SettingsRow, TerminalRow, ThemeRow } from './appearance-rows'\n\n/**\n * A live editor whose persistence and preview authority belong to its host.\n * No ThemeProvider is required, and no catalogue, renderer engine or storage is\n * imported. Hosts normalize unknown IDs and custom colors, report recovery,\n * snapshot on open, preview on changes, commit on Save, and restore on dismissal.\n * Both theme rows remain mounted when mode changes. Typeface/density axes are\n * deliberately absent from Adea #425's accepted surface.\n */\nexport function AppearanceEditor(props: AppearanceEditorProps) {\n const errorId = createUniqueId()\n const saveReasonId = createUniqueId()\n const custom = () =>\n props.draft.accent !== 'theme' &&\n !props.accentOptions.some((option) => option.id === props.draft.accent)\n const accentDescription = () => {\n if (props.draft.accent === 'theme') return \"Theme default · Uses the palette's intended color.\"\n const name = props.accentOptions.find((option) => option.id === props.draft.accent)?.label\n return `${name ?? 'Custom'} · Controls, glyphs, selections, code, and activity.`\n }\n const glassDescription = () =>\n props.draft.surface === 'opaque'\n ? 'Solid surfaces for every theme.'\n : props.draft.surface === 'frosted'\n ? 'Theme-colored glass where supported.'\n : (props.surfaceCapability.themeDefaultDescription ?? \"Uses this theme's default surface.\")\n return (\n <div data-appearance-editor class={cn('min-w-0', props.class)}>\n <Show when={props.recoveryNotice}>\n <p role=\"status\" class=\"px-4 py-2 text-sm text-muted-foreground\">\n {props.recoveryNotice}\n </p>\n </Show>\n <ModeChoices {...props} />\n <div class=\"divide-y divide-border rounded-lg border\">\n <ThemeRow\n appearance=\"light\"\n selectedId={props.draft.lightThemeId}\n preview={props.lightTheme}\n themes={props.themes}\n disabled={props.saving}\n onSelect={(lightThemeId) => props.onChange({ lightThemeId })}\n />\n <ThemeRow\n appearance=\"dark\"\n selectedId={props.draft.darkThemeId}\n preview={props.darkTheme}\n themes={props.themes}\n disabled={props.saving}\n onSelect={(darkThemeId) => props.onChange({ darkThemeId })}\n />\n {/* The row exists only when the host carries a terminal preference:\n the draft field is the show/hide switch, so the editor can never\n render a terminal row that writes nothing. */}\n <Show when={props.draft.terminalThemeId !== undefined}>\n <TerminalRow\n selectedId={props.draft.terminalThemeId ?? 'theme'}\n preview={props.resolvedAppearance === 'dark' ? props.darkTheme : props.lightTheme}\n themes={props.themes}\n disabled={props.saving}\n onSelect={(terminalThemeId) => props.onChange({ terminalThemeId })}\n />\n </Show>\n <SettingsRow title=\"Accent\" icon={<SlidersHorizontal />} description={accentDescription()}>\n <AccentChoices {...props} />\n </SettingsRow>\n <Show when={custom()}>\n <div class=\"px-4 py-3\">\n <label class=\"mb-2 block text-xs font-medium\" for={`${errorId}-input`}>\n Custom accent\n </label>\n <Input\n id={`${errorId}-input`}\n value={props.draft.accent}\n disabled={props.saving}\n aria-invalid={!!props.customAccentError}\n aria-describedby={props.customAccentError ? errorId : undefined}\n onInput={(event) => props.onChange({ accent: event.currentTarget.value })}\n />\n <Show when={props.customAccentError}>\n <p id={errorId} role=\"alert\" class=\"mt-1 text-xs text-foreground\">\n {props.customAccentError}\n </p>\n </Show>\n </div>\n </Show>\n <SettingsRow title=\"Glass\" icon={<PanelsTopLeft />} description={glassDescription()}>\n <GlassChoices {...props} />\n </SettingsRow>\n <Show when={!props.surfaceCapability.frosted && props.surfaceCapability.reason}>\n <p role=\"status\" class=\"px-4 py-2 text-xs text-muted-foreground\">\n {props.surfaceCapability.reason}\n </p>\n </Show>\n <SettingsRow\n title=\"Reduce transparency\"\n icon={<EyeOff />}\n description=\"Prefer solid surfaces, including during live preview.\"\n >\n <Switch\n checked={props.draft.reduceTransparency}\n disabled={props.saving}\n onChange={(reduceTransparency: boolean) => props.onChange({ reduceTransparency })}\n aria-label=\"Reduce transparency\"\n />\n </SettingsRow>\n <SettingsRow\n title=\"Theme library\"\n icon={<Palette />}\n description={\n props.onManageThemes\n ? 'Manage themes through the application.'\n : 'Theme import is unavailable.'\n }\n >\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!props.onManageThemes || props.saving}\n onClick={() => props.onManageThemes?.()}\n >\n Manage themes\n </Button>\n </SettingsRow>\n </div>\n <Show when={props.saveDisabledReason}>\n <p id={saveReasonId} role=\"status\" class=\"px-4 pt-3 text-xs text-muted-foreground\">\n {props.saveDisabledReason}\n </p>\n </Show>\n {/* Sticky so Save/Cancel stay reachable in a tall scroll container: the\n editor scrolls with its host panel, and actions parked at the bottom\n of a long form were unreachable without scrolling past every row. */}\n <div class=\"sticky bottom-0 z-10 mt-2 flex flex-wrap items-center gap-2 border-t bg-background px-4 py-3\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={props.saving}\n onClick={() => props.onReset()}\n >\n Reset\n </Button>\n <div class=\"ml-auto flex gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={props.saving}\n onClick={() => props.onCancel()}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={props.saving || !!props.customAccentError || !!props.saveDisabledReason}\n aria-busy={props.saving}\n aria-describedby={props.saveDisabledReason ? saveReasonId : undefined}\n onClick={() => props.onSave()}\n >\n {props.saving ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\n/** Modal anchoring/dismissal and nested-menu behavior come from Kobalte.\n * Its measured available height also bounds scrolling, keeping footer actions\n * reachable when a narrow popup begins below its trigger. */\nexport function AppearancePopover(props: AppearancePopoverProps) {\n return (\n <Popover\n open={props.open}\n modal\n onOpenChange={(open) => (open ? props.onOpen() : props.onDismiss())}\n >\n <PopoverTrigger\n as={Button}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Appearance settings\"\n >\n <Palette />\n </PopoverTrigger>\n <PopoverContent class=\"w-lg max-w-[calc(100vw-2rem)] max-h-(--kb-popper-content-available-height) overflow-y-auto\">\n <PopoverTitle>Appearance</PopoverTitle>\n <PopoverDescription>\n Changes preview immediately. Save keeps them; Cancel restores the previous appearance.\n </PopoverDescription>\n <AppearanceEditor {...props} />\n </PopoverContent>\n </Popover>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"appearance-editor.js","names":["EyeOff","Palette","PanelsTopLeft","SlidersHorizontal","Show","createUniqueId","cn","Button","Input","Switch","Popover","PopoverContent","PopoverDescription","PopoverTitle","PopoverTrigger","AppearanceEditorProps","AppearancePopoverProps","ModeChoices","AccentChoices","GlassChoices","isCustomAccent","SettingsRow","TerminalRow","ThemeRow","AppearanceEditor","props","errorId","saveReasonId","custom","accentDescription","draft","accent","preset","accentOptions","find","option","id","label","offered","themeAccentOptions","toLowerCase","glassDescription","surface","surfaceCapability","themeDefaultDescription","_el$","_tmpl$6","_el$3","firstChild","_el$9","nextSibling","_el$0","_$insert","_$createComponent","when","recoveryNotice","children","_el$2","_tmpl$","appearance","selectedId","lightThemeId","preview","lightTheme","themes","disabled","saving","onSelect","onChange","darkThemeId","darkTheme","terminalThemeId","undefined","_$memo","resolvedAppearance","title","icon","description","_el$4","_tmpl$3","_el$5","_$setAttribute","value","aria-invalid","customAccentError","aria-describedby","onInput","event","currentTarget","_el$6","_tmpl$2","frosted","reason","_el$7","_tmpl$4","checked","reduceTransparency","onManageThemes","type","size","variant","onClick","saveDisabledReason","_el$8","_tmpl$5","onReset","onCancel","aria-busy","onSave","_$effect","_$className","class","AppearancePopover","open","modal","onOpenChange","onOpen","onDismiss","as","_$createComponent","_$memo","_$className"],"sources":["../../../../src/components/composites/appearance-editor/appearance-editor.tsx"],"sourcesContent":["/*\n * MIT License\n *\n * Copyright (c) 2026 Wing\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/*\n * Composition substantially translated from Zeron settings/appearance.rs and\n * settings/widgets.rs, pinned at 30a9a9537c5ec96226c87f4bf349b6f77c5dfb59,\n * preserving Adea's existing appearance-surface.tsx port: System/Light/Dark\n * miniatures, compact independent theme rows, accent swatches and helper copy,\n * glass chips, and theme library affordance. Kobalte replaces the port's manual\n * radio keyboard model. The controlled draft and explicit action ports replace\n * GPUI globals and app-specific storage/native authority. Save/Cancel/Reset and\n * custom accent/reduced-transparency are accepted Adea divergences (#425).\n */\nimport { EyeOff, Palette, PanelsTopLeft, SlidersHorizontal } from 'lucide-solid'\nimport { Show, createUniqueId } from 'solid-js'\nimport { cn } from '#lib/utils'\nimport { Button } from '../../ui/button/button'\nimport { Input } from '../../ui/input/input'\n\nimport { Switch } from '../../ui/switch/switch'\nimport {\n Popover,\n PopoverContent,\n PopoverDescription,\n PopoverTitle,\n PopoverTrigger,\n} from '../../ui/popover/popover'\nimport type { AppearanceEditorProps, AppearancePopoverProps } from './appearance-types'\nimport { ModeChoices, AccentChoices, GlassChoices, isCustomAccent } from './appearance-choices'\nimport { SettingsRow, TerminalRow, ThemeRow } from './appearance-rows'\n\n/**\n * A live editor whose persistence and preview authority belong to its host.\n * No ThemeProvider is required, and no catalogue, renderer engine or storage is\n * imported. Hosts normalize unknown IDs and custom colors, report recovery,\n * snapshot on open, preview on changes, commit on Save, and restore on dismissal.\n * Both theme rows remain mounted when mode changes. Typeface/density axes are\n * deliberately absent from Adea #425's accepted surface.\n */\nexport function AppearanceEditor(props: AppearanceEditorProps) {\n const errorId = createUniqueId()\n const saveReasonId = createUniqueId()\n const custom = () => isCustomAccent(props)\n const accentDescription = () => {\n if (props.draft.accent === 'theme') return \"Theme default · Uses the palette's intended color.\"\n const preset = props.accentOptions.find((option) => option.id === props.draft.accent)\n if (preset) return `${preset.label} · Controls, glyphs, selections, code, and activity.`\n if (custom()) return 'Custom · Controls, glyphs, selections, code, and activity.'\n const offered = props.themeAccentOptions?.find((option) => option.id === props.draft.accent)\n // A stored theme accent survives a theme switch by id; when the new pair\n // cannot offer that slot the host falls back to the theme's own primary,\n // and the description says so rather than naming a colour not on screen.\n return offered\n ? `Theme ${offered.label.toLowerCase()} · The theme's own color, on controls and activity.`\n : \"Theme default · This theme does not carry that accent, so it uses the palette's intended color.\"\n }\n const glassDescription = () =>\n props.draft.surface === 'opaque'\n ? 'Solid surfaces for every theme.'\n : props.draft.surface === 'frosted'\n ? 'Theme-colored glass where supported.'\n : (props.surfaceCapability.themeDefaultDescription ?? \"Uses this theme's default surface.\")\n return (\n <div data-appearance-editor class={cn('min-w-0', props.class)}>\n <Show when={props.recoveryNotice}>\n <p role=\"status\" class=\"px-4 py-2 text-sm text-muted-foreground\">\n {props.recoveryNotice}\n </p>\n </Show>\n <ModeChoices {...props} />\n <div class=\"divide-y divide-border rounded-lg border\">\n <ThemeRow\n appearance=\"light\"\n selectedId={props.draft.lightThemeId}\n preview={props.lightTheme}\n themes={props.themes}\n disabled={props.saving}\n onSelect={(lightThemeId) => props.onChange({ lightThemeId })}\n />\n <ThemeRow\n appearance=\"dark\"\n selectedId={props.draft.darkThemeId}\n preview={props.darkTheme}\n themes={props.themes}\n disabled={props.saving}\n onSelect={(darkThemeId) => props.onChange({ darkThemeId })}\n />\n {/* The row exists only when the host carries a terminal preference:\n the draft field is the show/hide switch, so the editor can never\n render a terminal row that writes nothing. */}\n <Show when={props.draft.terminalThemeId !== undefined}>\n <TerminalRow\n selectedId={props.draft.terminalThemeId ?? 'theme'}\n preview={props.resolvedAppearance === 'dark' ? props.darkTheme : props.lightTheme}\n themes={props.themes}\n disabled={props.saving}\n onSelect={(terminalThemeId) => props.onChange({ terminalThemeId })}\n />\n </Show>\n <SettingsRow title=\"Accent\" icon={<SlidersHorizontal />} description={accentDescription()}>\n <AccentChoices {...props} />\n </SettingsRow>\n <Show when={custom()}>\n <div class=\"px-4 py-3\">\n <label class=\"mb-2 block text-xs font-medium\" for={`${errorId}-input`}>\n Custom accent\n </label>\n <Input\n id={`${errorId}-input`}\n value={props.draft.accent}\n disabled={props.saving}\n aria-invalid={!!props.customAccentError}\n aria-describedby={props.customAccentError ? errorId : undefined}\n onInput={(event) => props.onChange({ accent: event.currentTarget.value })}\n />\n <Show when={props.customAccentError}>\n <p id={errorId} role=\"alert\" class=\"mt-1 text-xs text-foreground\">\n {props.customAccentError}\n </p>\n </Show>\n </div>\n </Show>\n <SettingsRow title=\"Glass\" icon={<PanelsTopLeft />} description={glassDescription()}>\n <GlassChoices {...props} />\n </SettingsRow>\n <Show when={!props.surfaceCapability.frosted && props.surfaceCapability.reason}>\n <p role=\"status\" class=\"px-4 py-2 text-xs text-muted-foreground\">\n {props.surfaceCapability.reason}\n </p>\n </Show>\n <SettingsRow\n title=\"Reduce transparency\"\n icon={<EyeOff />}\n description=\"Prefer solid surfaces, including during live preview.\"\n >\n <Switch\n checked={props.draft.reduceTransparency}\n disabled={props.saving}\n onChange={(reduceTransparency: boolean) => props.onChange({ reduceTransparency })}\n aria-label=\"Reduce transparency\"\n />\n </SettingsRow>\n <SettingsRow\n title=\"Theme library\"\n icon={<Palette />}\n description={\n props.onManageThemes\n ? 'Manage themes through the application.'\n : 'Theme import is unavailable.'\n }\n >\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!props.onManageThemes || props.saving}\n onClick={() => props.onManageThemes?.()}\n >\n Manage themes\n </Button>\n </SettingsRow>\n </div>\n <Show when={props.saveDisabledReason}>\n <p id={saveReasonId} role=\"status\" class=\"px-4 pt-3 text-xs text-muted-foreground\">\n {props.saveDisabledReason}\n </p>\n </Show>\n {/* Sticky so Save/Cancel stay reachable in a tall scroll container: the\n editor scrolls with its host panel, and actions parked at the bottom\n of a long form were unreachable without scrolling past every row. */}\n <div class=\"sticky bottom-0 z-10 mt-2 flex flex-wrap items-center gap-2 border-t bg-background px-4 py-3\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={props.saving}\n onClick={() => props.onReset()}\n >\n Reset\n </Button>\n <div class=\"ml-auto flex gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={props.saving}\n onClick={() => props.onCancel()}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={props.saving || !!props.customAccentError || !!props.saveDisabledReason}\n aria-busy={props.saving}\n aria-describedby={props.saveDisabledReason ? saveReasonId : undefined}\n onClick={() => props.onSave()}\n >\n {props.saving ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\n/** Modal anchoring/dismissal and nested-menu behavior come from Kobalte.\n * Its measured available height also bounds scrolling, keeping footer actions\n * reachable when a narrow popup begins below its trigger. */\nexport function AppearancePopover(props: AppearancePopoverProps) {\n return (\n <Popover\n open={props.open}\n modal\n onOpenChange={(open) => (open ? props.onOpen() : props.onDismiss())}\n >\n <PopoverTrigger\n as={Button}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Appearance settings\"\n >\n <Palette />\n </PopoverTrigger>\n <PopoverContent class=\"w-lg max-w-[calc(100vw-2rem)] max-h-(--kb-popper-content-available-height) overflow-y-auto\">\n <PopoverTitle>Appearance</PopoverTitle>\n <PopoverDescription>\n Changes preview immediately. Save keeps them; Cancel restores the previous appearance.\n </PopoverDescription>\n <AppearanceEditor {...props} />\n </PopoverContent>\n </Popover>\n )\n}\n"],"mappings":"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"}
@@ -23,6 +23,14 @@ export type AppearanceEditorProps = {
23
23
  resolvedAppearance: 'light' | 'dark';
24
24
  themes: readonly AdeaThemeRecord[];
25
25
  accentOptions: readonly AccentPreset[];
26
+ /**
27
+ * The accents the previewed light/dark pair carries itself, offered after
28
+ * `accentOptions` — `themeAccentsFor(lightThemeId, darkThemeId)` from
29
+ * `@adea-ai/ui`. Supplied by the host because computing them measures through
30
+ * the catalogue's normalization, which the editor does not load. Omitted, the
31
+ * row offers the presets only.
32
+ */
33
+ themeAccentOptions?: readonly AccentPreset[];
26
34
  onChange: (patch: Partial<AppearanceDraft>) => void;
27
35
  onSave: () => void;
28
36
  onCancel: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"appearance-types.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/appearance-editor/appearance-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/E,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA;IACvC,kBAAkB,EAAE,OAAO,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,eAAe,CAAA;IACtB,8EAA8E;IAC9E,UAAU,EAAE,SAAS,CAAA;IACrB,SAAS,EAAE,SAAS,CAAA;IACpB,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAA;IACpC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAClC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAA;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IACnD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1F,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,GAAG;IAC3D,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA"}
1
+ {"version":3,"file":"appearance-types.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/appearance-editor/appearance-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE/E,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA;IACvC,kBAAkB,EAAE,OAAO,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,eAAe,CAAA;IACtB,8EAA8E;IAC9E,UAAU,EAAE,SAAS,CAAA;IACrB,SAAS,EAAE,SAAS,CAAA;IACpB,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAA;IACpC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAClC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAA;IACtC;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IACnD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1F,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,GAAG;IAC3D,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { Accessor } from 'solid-js';
1
+ import type { Accessor, JSX } from 'solid-js';
2
2
  /**
3
3
  * UpdateDialog.
4
4
  *
@@ -95,6 +95,12 @@ export type UpdateAdapter = Readonly<{
95
95
  /** False in a browser build, where there is no installer to drive. */
96
96
  isDesktopRuntime(): boolean;
97
97
  }>;
98
+ type ChannelControlActions = Readonly<{
99
+ /** Disabled while the app is checking, downloading, installing, or saving a channel. */
100
+ disabled: Accessor<boolean>;
101
+ /** Persist a channel change, then check that channel without retaining a stale offer. */
102
+ recheck(beforeCheck?: () => Promise<void>): Promise<void>;
103
+ }>;
98
104
  export type UpdateDialogProps = {
99
105
  adapter: UpdateAdapter;
100
106
  /** The application's name, used in the title and the copy. */
@@ -107,6 +113,12 @@ export type UpdateDialogProps = {
107
113
  fallbackVersion?: string;
108
114
  /** Copy for the adapter's non-desktop case. */
109
115
  desktopOnlyMessage?: string;
116
+ /**
117
+ * Optional host-owned release-channel control, rendered in the version status
118
+ * card. The host owns its accessible label and calls `recheck` after a selection;
119
+ * the optional callback persists that selection before the dialog checks it.
120
+ */
121
+ channelControl?: (actions: ChannelControlActions) => JSX.Element;
110
122
  /** A controlled open state. Omit for the trigger to manage its own. */
111
123
  open?: boolean;
112
124
  /**
@@ -125,5 +137,6 @@ export type UpdateDialogProps = {
125
137
  /** Render only the panel, for a caller that provides its own dialog. */
126
138
  class?: string;
127
139
  };
128
- export declare function UpdateDialog(props: UpdateDialogProps): import("solid-js").JSX.Element;
140
+ export declare function UpdateDialog(props: UpdateDialogProps): JSX.Element;
141
+ export {};
129
142
  //# sourceMappingURL=update-dialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-dialog.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/update-dialog/update-dialog.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AA8BxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,iEAAiE;AACjE,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,UAAU,GACV,SAAS,GACT,WAAW,GACX,aAAa,GACb,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,WAAW,GACX,aAAa,GACb,QAAQ,CAAA;AAEZ,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,KAAK,EAAE,WAAW,CAAA;IAClB,uCAAuC;IACvC,cAAc,EAAE,MAAM,CAAA;IACtB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,wDAAwD;IACxD,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,iEAAiE;IACjE,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IACjC,8DAA8D;IAC9D,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACtD,4EAA4E;IAC5E,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IAC/B,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iEAAiE;IACjE,YAAY,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,sEAAsE;IACtE,gBAAgB,IAAI,OAAO,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,aAAa,CAAA;IACtB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC;;;;OAIG;IACH,eAAe,CAAC,EAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,CAAA;IACnD,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAmCD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,kCAinBpD"}
1
+ {"version":3,"file":"update-dialog.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/update-dialog/update-dialog.tsx"],"names":[],"mappings":"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"}