@dxos/plugin-settings 0.6.11 → 0.6.12-main.568932b

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.
@@ -4,7 +4,6 @@ import {
4
4
  } from "./chunk-JKQMH66V.mjs";
5
5
 
6
6
  // packages/plugins/plugin-settings/src/SettingsPlugin.tsx
7
- import { Gear } from "@phosphor-icons/react";
8
7
  import React3 from "react";
9
8
  import { parseIntentPlugin, resolvePlugin, LayoutAction, SettingsAction } from "@dxos/app-framework";
10
9
  import { LocalStorageStore } from "@dxos/local-storage";
@@ -29,8 +28,9 @@ var SettingsDialog = ({ selected, onSelected }) => {
29
28
  "dxos.org/plugin/observability",
30
29
  "dxos.org/plugin/registry"
31
30
  ];
32
- const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(nonNullable);
33
- const filteredPlugins = enabled.filter((id) => !core.includes(id)).map((id) => plugins.find((plugin) => plugin.meta.id === id)).filter((plugin) => plugin?.provides?.settings).map((plugin) => plugin.meta).sort(({ name: a }, { name: b }) => a?.localeCompare(b ?? "") ?? 0);
31
+ const sortPlugin = ({ name: a }, { name: b }) => a?.localeCompare(b ?? "") ?? 0;
32
+ const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(nonNullable).sort(sortPlugin);
33
+ const filteredPlugins = enabled.filter((id) => !core.includes(id)).map((id) => plugins.find((plugin) => plugin.meta.id === id)).filter((plugin) => plugin?.provides?.settings).map((plugin) => plugin.meta).sort(sortPlugin);
34
34
  const [tabsActivePart, setTabsActivePart] = useState("list");
35
35
  return /* @__PURE__ */ React.createElement(Dialog.Content, {
36
36
  classNames: "p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden"
@@ -72,14 +72,13 @@ var SettingsDialog = ({ selected, onSelected }) => {
72
72
  role: "none",
73
73
  className: "overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator"
74
74
  }, /* @__PURE__ */ React.createElement(Tabs.Tablist, {
75
- classNames: "max-bs-none overflow-y-visible"
75
+ classNames: "flex flex-col gap-4 max-bs-none overflow-y-visible"
76
76
  }, /* @__PURE__ */ React.createElement(PluginList, {
77
77
  title: "Options",
78
78
  plugins: corePlugins
79
79
  }), filteredPlugins.length > 0 && /* @__PURE__ */ React.createElement(PluginList, {
80
80
  title: "Plugins",
81
- plugins: filteredPlugins,
82
- gap: true
81
+ plugins: filteredPlugins
83
82
  }))), corePlugins.map((plugin) => /* @__PURE__ */ React.createElement(Tabs.Tabpanel, {
84
83
  key: plugin.id,
85
84
  value: plugin.id,
@@ -100,13 +99,17 @@ var SettingsDialog = ({ selected, onSelected }) => {
100
99
  }
101
100
  }))))));
102
101
  };
103
- var PluginList = ({ title, plugins, gap }) => {
104
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tabs.TabGroupHeading, {
105
- classNames: gap ? "mbs-4" : "mbs-4 @md:mbs-2"
106
- }, title), plugins.map((plugin) => /* @__PURE__ */ React.createElement(Tabs.Tab, {
102
+ var PluginList = ({ title, plugins }) => {
103
+ return /* @__PURE__ */ React.createElement("div", {
104
+ role: "none"
105
+ }, /* @__PURE__ */ React.createElement(Tabs.TabGroupHeading, {
106
+ classNames: "pli-1 mlb-2 mbs-4 @md:mbs-2"
107
+ }, title), /* @__PURE__ */ React.createElement("div", {
108
+ className: "flex flex-col ml-1"
109
+ }, plugins.map((plugin) => /* @__PURE__ */ React.createElement(Tabs.Tab, {
107
110
  key: plugin.id,
108
111
  value: plugin.id
109
- }, plugin.name)));
112
+ }, plugin.name))));
110
113
  };
111
114
 
112
115
  // packages/plugins/plugin-settings/src/components/SettingsValue.tsx
@@ -227,8 +230,7 @@ var SettingsPlugin = () => {
227
230
  ns: SETTINGS_PLUGIN
228
231
  }
229
232
  ],
230
- icon: (props) => /* @__PURE__ */ React3.createElement(Gear, props),
231
- iconSymbol: "ph--gear--regular",
233
+ icon: "ph--gear--regular",
232
234
  keyBinding: {
233
235
  macos: "meta+,",
234
236
  windows: "alt+,"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/SettingsPlugin.tsx", "../../../src/components/SettingsDialog.tsx", "../../../src/components/SettingsValue.tsx", "../../../src/translations.ts", "../../../src/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Gear, type IconProps } from '@phosphor-icons/react';\nimport React from 'react';\n\nimport {\n type IntentResolverProvides,\n type PluginDefinition,\n type SurfaceProvides,\n parseIntentPlugin,\n resolvePlugin,\n LayoutAction,\n SettingsAction,\n type GraphBuilderProvides,\n type TranslationsProvides,\n} from '@dxos/app-framework';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\n\nimport { SettingsDialog } from './components';\nimport meta, { SETTINGS_PLUGIN } from './meta';\nimport translations from './translations';\n\nconst DEFAULT_PLUGIN = 'dxos.org/plugin/registry';\n\nexport type SettingsPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n TranslationsProvides;\n\ntype SettingsSettingsProps = {\n selected: string;\n};\n\n/**\n * Plugin for aggregating and rendering plugin settings.\n */\nexport const SettingsPlugin = (): PluginDefinition<SettingsPluginProvides> => {\n const settings = new LocalStorageStore<SettingsSettingsProps>(SETTINGS_PLUGIN, { selected: DEFAULT_PLUGIN });\n\n return {\n meta,\n ready: async () => {\n settings.prop({ key: 'selected', type: LocalStorageStore.string() });\n },\n provides: {\n surface: {\n component: ({ data }) => {\n switch (data.component) {\n case `${SETTINGS_PLUGIN}/Settings`:\n return (\n <SettingsDialog\n selected={settings.values.selected}\n onSelected={(selected) => (settings.values.selected = selected)}\n />\n );\n\n default:\n return null;\n }\n },\n },\n intent: {\n resolver: (intent) => {\n switch (intent.action) {\n case SettingsAction.OPEN: {\n if (intent.data?.plugin) {\n settings.values.selected = intent.data?.plugin;\n }\n\n return {\n intents: [\n [\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'dialog',\n component: `${SETTINGS_PLUGIN}/Settings`,\n dialogBlockAlign: 'start',\n },\n },\n ],\n ],\n };\n }\n }\n },\n },\n graph: {\n builder: (plugins) => {\n const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n\n return createExtension({\n id: SETTINGS_PLUGIN,\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SETTINGS_PLUGIN,\n data: async () => {\n await intentPlugin?.provides.intent.dispatch({\n plugin: SETTINGS_PLUGIN,\n action: SettingsAction.OPEN,\n });\n },\n properties: {\n label: ['open settings label', { ns: SETTINGS_PLUGIN }],\n icon: (props: IconProps) => <Gear {...props} />,\n iconSymbol: 'ph--gear--regular',\n keyBinding: {\n macos: 'meta+,',\n windows: 'alt+,',\n },\n },\n },\n ],\n });\n },\n },\n translations,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type Plugin, Surface, usePlugins } from '@dxos/app-framework';\nimport { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';\nimport { Tabs, type TabsActivePart } from '@dxos/react-ui-tabs';\nimport { getSize } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { SETTINGS_PLUGIN } from '../meta';\n\nexport const SettingsDialog = ({\n selected,\n onSelected,\n}: {\n selected: string;\n onSelected: (plugin: string) => void;\n}) => {\n const { t } = useTranslation(SETTINGS_PLUGIN);\n const { plugins, enabled } = usePlugins();\n\n // TODO(burdon): Factor out common defs?\n const core = [\n 'dxos.org/plugin/layout',\n 'dxos.org/plugin/deck',\n 'dxos.org/plugin/files',\n 'dxos.org/plugin/space',\n 'dxos.org/plugin/stack',\n 'dxos.org/plugin/observability',\n 'dxos.org/plugin/registry',\n ];\n\n const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(nonNullable);\n\n const filteredPlugins = enabled\n .filter((id) => !core.includes(id))\n .map((id) => plugins.find((plugin) => plugin.meta.id === id))\n .filter((plugin) => (plugin?.provides as any)?.settings)\n .map((plugin) => plugin!.meta)\n .sort(({ name: a }, { name: b }) => a?.localeCompare(b ?? '') ?? 0);\n\n const [tabsActivePart, setTabsActivePart] = useState<TabsActivePart>('list');\n\n return (\n <Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>\n <div role='none' className='flex justify-between mbe-1 pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5'>\n <Dialog.Title\n onClick={() => setTabsActivePart('list')}\n aria-description={t('click to return to tablist description')}\n classNames='flex cursor-pointer items-center group/title'\n >\n <Icon\n icon='ph--caret-left--regular'\n classNames={['@md:hidden', getSize(4), tabsActivePart === 'list' && 'invisible']}\n />\n <span\n className={\n tabsActivePart !== 'list'\n ? 'group-hover/title:underline @md:group-hover/title:no-underline underline-offset-4 decoration-1'\n : ''\n }\n >\n {t('settings dialog title')}\n </span>\n </Dialog.Title>\n <Dialog.Close asChild>\n <Button density='fine' variant='ghost' autoFocus>\n <Icon icon='ph--x--regular' size={3} />\n </Button>\n </Dialog.Close>\n </div>\n\n <Tabs.Root\n orientation='vertical'\n value={selected}\n onValueChange={(nextSelected) => onSelected(nextSelected)}\n activePart={tabsActivePart}\n onActivePartChange={setTabsActivePart}\n classNames='flex flex-col flex-1 mbs-2'\n >\n <Tabs.Viewport classNames='flex-1 min-bs-0'>\n <div role='none' className='overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator'>\n <Tabs.Tablist classNames='max-bs-none overflow-y-visible'>\n <PluginList title='Options' plugins={corePlugins} />\n {filteredPlugins.length > 0 && <PluginList title='Plugins' plugins={filteredPlugins} gap />}\n </Tabs.Tablist>\n </div>\n\n {corePlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n {filteredPlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n </Tabs.Viewport>\n </Tabs.Root>\n </Dialog.Content>\n );\n};\n\nconst PluginList = ({ title, plugins, gap }: { title: string; plugins: Plugin['meta'][]; gap?: boolean }) => {\n return (\n <>\n <Tabs.TabGroupHeading classNames={gap ? 'mbs-4' : 'mbs-4 @md:mbs-2'}>{title}</Tabs.TabGroupHeading>\n {plugins.map((plugin) => (\n <Tabs.Tab key={plugin.id} value={plugin.id}>\n {plugin.name}\n </Tabs.Tab>\n ))}\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren } from 'react';\n\nimport { Input } from '@dxos/react-ui';\n\ntype SettingValueProps = {\n label: string;\n description?: JSX.Element;\n secondary?: JSX.Element;\n};\n\nexport const SettingsValue = ({ label, description, secondary, children }: PropsWithChildren<SettingValueProps>) => {\n const primary = (\n <div role='none' className='flex w-full gap-4 py-1'>\n <Input.Root>\n <div role='none' className='flex flex-col w-full'>\n {/* TODO(burdon): Consistent height for controls (e.g., Select, Textbox, and Checkbox are all different). */}\n <Input.Label classNames='flex min-h-[40px] items-center'>{label}</Input.Label>\n {description && (\n <Input.DescriptionAndValidation classNames='mbs-0.5'>\n <Input.Description>{description}</Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n\n <div role='none'>\n <div role='none' className='flex min-h-[40px] items-center'>\n {children}\n </div>\n </div>\n </Input.Root>\n </div>\n );\n\n if (secondary) {\n // console.log(secondary);\n return (\n <div role='none' className='flex flex-col w-full'>\n {primary}\n {secondary}\n </div>\n );\n }\n\n return primary;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SETTINGS_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [SETTINGS_PLUGIN]: {\n 'open settings label': 'Show settings',\n 'settings dialog title': 'Settings',\n 'back label': 'Back',\n 'click to return to tablist description': 'Click the title to return to the settings menu',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SettingsPlugin } from './SettingsPlugin';\n\nexport default SettingsPlugin;\n\nexport * from './SettingsPlugin';\n\n// TODO(wittjosiah): Remove.\n// Settings should be exposed from plugins as state and intents rather than components.\nexport * from './components';\n"],
5
- "mappings": "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",
6
- "names": ["Gear", "React", "parseIntentPlugin", "resolvePlugin", "LayoutAction", "SettingsAction", "LocalStorageStore", "createExtension", "React", "useState", "Surface", "usePlugins", "Button", "Dialog", "Icon", "useTranslation", "Tabs", "getSize", "nonNullable", "SettingsDialog", "selected", "onSelected", "t", "useTranslation", "SETTINGS_PLUGIN", "plugins", "enabled", "usePlugins", "core", "corePlugins", "map", "id", "find", "plugin", "meta", "filter", "nonNullable", "filteredPlugins", "includes", "provides", "settings", "sort", "name", "a", "b", "localeCompare", "tabsActivePart", "setTabsActivePart", "useState", "Dialog", "Content", "classNames", "div", "role", "className", "Title", "onClick", "aria-description", "Icon", "icon", "getSize", "span", "Close", "asChild", "Button", "density", "variant", "autoFocus", "size", "Tabs", "Root", "orientation", "value", "onValueChange", "nextSelected", "activePart", "onActivePartChange", "Viewport", "Tablist", "PluginList", "title", "length", "gap", "Tabpanel", "key", "Surface", "data", "TabGroupHeading", "Tab", "React", "Input", "SettingsValue", "label", "description", "secondary", "children", "primary", "React", "div", "role", "className", "Input", "Root", "Label", "classNames", "DescriptionAndValidation", "Description", "SETTINGS_PLUGIN", "DEFAULT_PLUGIN", "SettingsPlugin", "settings", "LocalStorageStore", "SETTINGS_PLUGIN", "selected", "meta", "ready", "prop", "key", "type", "string", "provides", "surface", "component", "data", "React", "SettingsDialog", "values", "onSelected", "intent", "resolver", "action", "SettingsAction", "OPEN", "plugin", "intents", "LayoutAction", "SET_LAYOUT", "element", "dialogBlockAlign", "graph", "builder", "plugins", "intentPlugin", "resolvePlugin", "parseIntentPlugin", "createExtension", "id", "filter", "node", "actions", "dispatch", "properties", "label", "ns", "icon", "props", "Gear", "iconSymbol", "keyBinding", "macos", "windows", "translations", "SettingsPlugin"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport {\n type IntentResolverProvides,\n type PluginDefinition,\n type SurfaceProvides,\n parseIntentPlugin,\n resolvePlugin,\n LayoutAction,\n SettingsAction,\n type GraphBuilderProvides,\n type TranslationsProvides,\n} from '@dxos/app-framework';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\n\nimport { SettingsDialog } from './components';\nimport meta, { SETTINGS_PLUGIN } from './meta';\nimport translations from './translations';\n\nconst DEFAULT_PLUGIN = 'dxos.org/plugin/registry';\n\nexport type SettingsPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n TranslationsProvides;\n\ntype SettingsSettingsProps = {\n selected: string;\n};\n\n/**\n * Plugin for aggregating and rendering plugin settings.\n */\nexport const SettingsPlugin = (): PluginDefinition<SettingsPluginProvides> => {\n const settings = new LocalStorageStore<SettingsSettingsProps>(SETTINGS_PLUGIN, { selected: DEFAULT_PLUGIN });\n\n return {\n meta,\n ready: async () => {\n settings.prop({ key: 'selected', type: LocalStorageStore.string() });\n },\n provides: {\n surface: {\n component: ({ data }) => {\n switch (data.component) {\n case `${SETTINGS_PLUGIN}/Settings`:\n return (\n <SettingsDialog\n selected={settings.values.selected}\n onSelected={(selected) => (settings.values.selected = selected)}\n />\n );\n\n default:\n return null;\n }\n },\n },\n intent: {\n resolver: (intent) => {\n switch (intent.action) {\n case SettingsAction.OPEN: {\n if (intent.data?.plugin) {\n settings.values.selected = intent.data?.plugin;\n }\n\n return {\n intents: [\n [\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'dialog',\n component: `${SETTINGS_PLUGIN}/Settings`,\n dialogBlockAlign: 'start',\n },\n },\n ],\n ],\n };\n }\n }\n },\n },\n graph: {\n builder: (plugins) => {\n const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n\n return createExtension({\n id: SETTINGS_PLUGIN,\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SETTINGS_PLUGIN,\n data: async () => {\n await intentPlugin?.provides.intent.dispatch({\n plugin: SETTINGS_PLUGIN,\n action: SettingsAction.OPEN,\n });\n },\n properties: {\n label: ['open settings label', { ns: SETTINGS_PLUGIN }],\n icon: 'ph--gear--regular',\n keyBinding: {\n macos: 'meta+,',\n windows: 'alt+,',\n },\n },\n },\n ],\n });\n },\n },\n translations,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type Plugin, Surface, usePlugins } from '@dxos/app-framework';\nimport { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';\nimport { Tabs, type TabsActivePart } from '@dxos/react-ui-tabs';\nimport { getSize } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { SETTINGS_PLUGIN } from '../meta';\n\nexport const SettingsDialog = ({\n selected,\n onSelected,\n}: {\n selected: string;\n onSelected: (plugin: string) => void;\n}) => {\n const { t } = useTranslation(SETTINGS_PLUGIN);\n const { plugins, enabled } = usePlugins();\n\n // TODO(burdon): Factor out common defs?\n const core = [\n 'dxos.org/plugin/layout',\n 'dxos.org/plugin/deck',\n 'dxos.org/plugin/files',\n 'dxos.org/plugin/space',\n 'dxos.org/plugin/stack',\n 'dxos.org/plugin/observability',\n 'dxos.org/plugin/registry',\n ];\n\n const sortPlugin = ({ name: a }: Plugin['meta'], { name: b }: Plugin['meta']) => a?.localeCompare(b ?? '') ?? 0;\n\n const corePlugins = core\n .map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta)\n .filter(nonNullable)\n .sort(sortPlugin);\n\n const filteredPlugins = enabled\n .filter((id) => !core.includes(id))\n .map((id) => plugins.find((plugin) => plugin.meta.id === id))\n .filter((plugin) => (plugin?.provides as any)?.settings)\n .map((plugin) => plugin!.meta)\n .sort(sortPlugin);\n\n const [tabsActivePart, setTabsActivePart] = useState<TabsActivePart>('list');\n\n return (\n <Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>\n <div role='none' className='flex justify-between mbe-1 pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5'>\n <Dialog.Title\n onClick={() => setTabsActivePart('list')}\n aria-description={t('click to return to tablist description')}\n classNames='flex cursor-pointer items-center group/title'\n >\n <Icon\n icon='ph--caret-left--regular'\n classNames={['@md:hidden', getSize(4), tabsActivePart === 'list' && 'invisible']}\n />\n <span\n className={\n tabsActivePart !== 'list'\n ? 'group-hover/title:underline @md:group-hover/title:no-underline underline-offset-4 decoration-1'\n : ''\n }\n >\n {t('settings dialog title')}\n </span>\n </Dialog.Title>\n <Dialog.Close asChild>\n <Button density='fine' variant='ghost' autoFocus>\n <Icon icon='ph--x--regular' size={3} />\n </Button>\n </Dialog.Close>\n </div>\n\n <Tabs.Root\n orientation='vertical'\n value={selected}\n onValueChange={(nextSelected) => onSelected(nextSelected)}\n activePart={tabsActivePart}\n onActivePartChange={setTabsActivePart}\n classNames='flex flex-col flex-1 mbs-2'\n >\n <Tabs.Viewport classNames='flex-1 min-bs-0'>\n <div role='none' className='overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator'>\n <Tabs.Tablist classNames='flex flex-col gap-4 max-bs-none overflow-y-visible'>\n <PluginList title='Options' plugins={corePlugins} />\n {filteredPlugins.length > 0 && <PluginList title='Plugins' plugins={filteredPlugins} />}\n </Tabs.Tablist>\n </div>\n\n {corePlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n {filteredPlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n </Tabs.Viewport>\n </Tabs.Root>\n </Dialog.Content>\n );\n};\n\nconst PluginList = ({ title, plugins }: { title: string; plugins: Plugin['meta'][] }) => {\n return (\n <div role='none'>\n <Tabs.TabGroupHeading classNames={'pli-1 mlb-2 mbs-4 @md:mbs-2'}>{title}</Tabs.TabGroupHeading>\n <div className='flex flex-col ml-1'>\n {plugins.map((plugin) => (\n <Tabs.Tab key={plugin.id} value={plugin.id}>\n {plugin.name}\n </Tabs.Tab>\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren } from 'react';\n\nimport { Input } from '@dxos/react-ui';\n\ntype SettingValueProps = {\n label: string;\n description?: JSX.Element;\n secondary?: JSX.Element;\n};\n\nexport const SettingsValue = ({ label, description, secondary, children }: PropsWithChildren<SettingValueProps>) => {\n const primary = (\n <div role='none' className='flex w-full gap-4 py-1'>\n <Input.Root>\n <div role='none' className='flex flex-col w-full'>\n {/* TODO(burdon): Consistent height for controls (e.g., Select, Textbox, and Checkbox are all different). */}\n <Input.Label classNames='flex min-h-[40px] items-center'>{label}</Input.Label>\n {description && (\n <Input.DescriptionAndValidation classNames='mbs-0.5'>\n <Input.Description>{description}</Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n\n <div role='none'>\n <div role='none' className='flex min-h-[40px] items-center'>\n {children}\n </div>\n </div>\n </Input.Root>\n </div>\n );\n\n if (secondary) {\n // console.log(secondary);\n return (\n <div role='none' className='flex flex-col w-full'>\n {primary}\n {secondary}\n </div>\n );\n }\n\n return primary;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SETTINGS_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [SETTINGS_PLUGIN]: {\n 'open settings label': 'Show settings',\n 'settings dialog title': 'Settings',\n 'back label': 'Back',\n 'click to return to tablist description': 'Click the title to return to the settings menu',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SettingsPlugin } from './SettingsPlugin';\n\nexport default SettingsPlugin;\n\nexport * from './SettingsPlugin';\n\n// TODO(wittjosiah): Remove.\n// Settings should be exposed from plugins as state and intents rather than components.\nexport * from './components';\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "parseIntentPlugin", "resolvePlugin", "LayoutAction", "SettingsAction", "LocalStorageStore", "createExtension", "React", "useState", "Surface", "usePlugins", "Button", "Dialog", "Icon", "useTranslation", "Tabs", "getSize", "nonNullable", "SettingsDialog", "selected", "onSelected", "t", "useTranslation", "SETTINGS_PLUGIN", "plugins", "enabled", "usePlugins", "core", "sortPlugin", "name", "a", "b", "localeCompare", "corePlugins", "map", "id", "find", "plugin", "meta", "filter", "nonNullable", "sort", "filteredPlugins", "includes", "provides", "settings", "tabsActivePart", "setTabsActivePart", "useState", "Dialog", "Content", "classNames", "div", "role", "className", "Title", "onClick", "aria-description", "Icon", "icon", "getSize", "span", "Close", "asChild", "Button", "density", "variant", "autoFocus", "size", "Tabs", "Root", "orientation", "value", "onValueChange", "nextSelected", "activePart", "onActivePartChange", "Viewport", "Tablist", "PluginList", "title", "length", "Tabpanel", "key", "Surface", "data", "TabGroupHeading", "Tab", "React", "Input", "SettingsValue", "label", "description", "secondary", "children", "primary", "React", "div", "role", "className", "Input", "Root", "Label", "classNames", "DescriptionAndValidation", "Description", "SETTINGS_PLUGIN", "DEFAULT_PLUGIN", "SettingsPlugin", "settings", "LocalStorageStore", "SETTINGS_PLUGIN", "selected", "meta", "ready", "prop", "key", "type", "string", "provides", "surface", "component", "data", "React", "SettingsDialog", "values", "onSelected", "intent", "resolver", "action", "SettingsAction", "OPEN", "plugin", "intents", "LayoutAction", "SET_LAYOUT", "element", "dialogBlockAlign", "graph", "builder", "plugins", "intentPlugin", "resolvePlugin", "parseIntentPlugin", "createExtension", "id", "filter", "node", "actions", "dispatch", "properties", "label", "ns", "icon", "keyBinding", "macos", "windows", "translations", "SettingsPlugin"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytes":778,"imports":[],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytes":15320,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytes":4471,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/plugin-settings/src/components/index.ts":{"bytes":634,"imports":[{"path":"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx","kind":"import-statement","original":"./SettingsDialog"},{"path":"packages/plugins/plugin-settings/src/components/SettingsValue.tsx","kind":"import-statement","original":"./SettingsValue"}],"format":"esm"},"packages/plugins/plugin-settings/src/translations.ts":{"bytes":1571,"imports":[{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytes":12747,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/plugin-settings/src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/plugins/plugin-settings/src/index.ts":{"bytes":1216,"imports":[{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"packages/plugins/plugin-settings/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":16980},"packages/plugins/plugin-settings/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs","kind":"import-statement"},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["SettingsDialog","SettingsPlugin","SettingsValue","default"],"entryPoint":"packages/plugins/plugin-settings/src/index.ts","inputs":{"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytesInOutput":2968},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytesInOutput":4288},"packages/plugins/plugin-settings/src/components/index.ts":{"bytesInOutput":0},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytesInOutput":1125},"packages/plugins/plugin-settings/src/translations.ts":{"bytesInOutput":318},"packages/plugins/plugin-settings/src/index.ts":{"bytesInOutput":34}},"bytes":9300},"packages/plugins/plugin-settings/dist/lib/browser/meta.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/plugin-settings/dist/lib/browser/meta.mjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs","kind":"import-statement"}],"exports":["SETTINGS_PLUGIN","default"],"entryPoint":"packages/plugins/plugin-settings/src/meta.ts","inputs":{},"bytes":165},"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":338},"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs":{"imports":[],"exports":["SETTINGS_PLUGIN","meta_default"],"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytesInOutput":96}},"bytes":235}}}
1
+ {"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytes":778,"imports":[],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytes":15790,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytes":4471,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/plugin-settings/src/components/index.ts":{"bytes":634,"imports":[{"path":"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx","kind":"import-statement","original":"./SettingsDialog"},{"path":"packages/plugins/plugin-settings/src/components/SettingsValue.tsx","kind":"import-statement","original":"./SettingsValue"}],"format":"esm"},"packages/plugins/plugin-settings/src/translations.ts":{"bytes":1571,"imports":[{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytes":12272,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/plugin-settings/src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/plugins/plugin-settings/src/index.ts":{"bytes":1216,"imports":[{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"packages/plugins/plugin-settings/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":16977},"packages/plugins/plugin-settings/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["SettingsDialog","SettingsPlugin","SettingsValue","default"],"entryPoint":"packages/plugins/plugin-settings/src/index.ts","inputs":{"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytesInOutput":2830},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytesInOutput":4430},"packages/plugins/plugin-settings/src/components/index.ts":{"bytesInOutput":0},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytesInOutput":1125},"packages/plugins/plugin-settings/src/translations.ts":{"bytesInOutput":318},"packages/plugins/plugin-settings/src/index.ts":{"bytesInOutput":34}},"bytes":9304},"packages/plugins/plugin-settings/dist/lib/browser/meta.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/plugin-settings/dist/lib/browser/meta.mjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs","kind":"import-statement"}],"exports":["SETTINGS_PLUGIN","default"],"entryPoint":"packages/plugins/plugin-settings/src/meta.ts","inputs":{},"bytes":165},"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":338},"packages/plugins/plugin-settings/dist/lib/browser/chunk-JKQMH66V.mjs":{"imports":[],"exports":["SETTINGS_PLUGIN","meta_default"],"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytesInOutput":96}},"bytes":235}}}
@@ -35,18 +35,17 @@ __export(node_exports, {
35
35
  });
36
36
  module.exports = __toCommonJS(node_exports);
37
37
  var import_chunk_LZVHLML4 = require("./chunk-LZVHLML4.cjs");
38
- var import_react = require("@phosphor-icons/react");
39
- var import_react2 = __toESM(require("react"));
38
+ var import_react = __toESM(require("react"));
40
39
  var import_app_framework = require("@dxos/app-framework");
41
40
  var import_local_storage = require("@dxos/local-storage");
42
41
  var import_plugin_graph = require("@dxos/plugin-graph");
43
- var import_react3 = __toESM(require("react"));
42
+ var import_react2 = __toESM(require("react"));
44
43
  var import_app_framework2 = require("@dxos/app-framework");
45
44
  var import_react_ui = require("@dxos/react-ui");
46
45
  var import_react_ui_tabs = require("@dxos/react-ui-tabs");
47
46
  var import_react_ui_theme = require("@dxos/react-ui-theme");
48
47
  var import_util = require("@dxos/util");
49
- var import_react4 = __toESM(require("react"));
48
+ var import_react3 = __toESM(require("react"));
50
49
  var import_react_ui2 = require("@dxos/react-ui");
51
50
  var SettingsDialog = ({ selected, onSelected }) => {
52
51
  const { t } = (0, import_react_ui.useTranslation)(import_chunk_LZVHLML4.SETTINGS_PLUGIN);
@@ -60,104 +59,108 @@ var SettingsDialog = ({ selected, onSelected }) => {
60
59
  "dxos.org/plugin/observability",
61
60
  "dxos.org/plugin/registry"
62
61
  ];
63
- const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(import_util.nonNullable);
64
- const filteredPlugins = enabled.filter((id) => !core.includes(id)).map((id) => plugins.find((plugin) => plugin.meta.id === id)).filter((plugin) => plugin?.provides?.settings).map((plugin) => plugin.meta).sort(({ name: a }, { name: b }) => a?.localeCompare(b ?? "") ?? 0);
65
- const [tabsActivePart, setTabsActivePart] = (0, import_react3.useState)("list");
66
- return /* @__PURE__ */ import_react3.default.createElement(import_react_ui.Dialog.Content, {
62
+ const sortPlugin = ({ name: a }, { name: b }) => a?.localeCompare(b ?? "") ?? 0;
63
+ const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(import_util.nonNullable).sort(sortPlugin);
64
+ const filteredPlugins = enabled.filter((id) => !core.includes(id)).map((id) => plugins.find((plugin) => plugin.meta.id === id)).filter((plugin) => plugin?.provides?.settings).map((plugin) => plugin.meta).sort(sortPlugin);
65
+ const [tabsActivePart, setTabsActivePart] = (0, import_react2.useState)("list");
66
+ return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Dialog.Content, {
67
67
  classNames: "p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden"
68
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
68
+ }, /* @__PURE__ */ import_react2.default.createElement("div", {
69
69
  role: "none",
70
70
  className: "flex justify-between mbe-1 pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5"
71
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui.Dialog.Title, {
71
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Dialog.Title, {
72
72
  onClick: () => setTabsActivePart("list"),
73
73
  "aria-description": t("click to return to tablist description"),
74
74
  classNames: "flex cursor-pointer items-center group/title"
75
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui.Icon, {
75
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Icon, {
76
76
  icon: "ph--caret-left--regular",
77
77
  classNames: [
78
78
  "@md:hidden",
79
79
  (0, import_react_ui_theme.getSize)(4),
80
80
  tabsActivePart === "list" && "invisible"
81
81
  ]
82
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
82
+ }), /* @__PURE__ */ import_react2.default.createElement("span", {
83
83
  className: tabsActivePart !== "list" ? "group-hover/title:underline @md:group-hover/title:no-underline underline-offset-4 decoration-1" : ""
84
- }, t("settings dialog title"))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui.Dialog.Close, {
84
+ }, t("settings dialog title"))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Dialog.Close, {
85
85
  asChild: true
86
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui.Button, {
86
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Button, {
87
87
  density: "fine",
88
88
  variant: "ghost",
89
89
  autoFocus: true
90
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui.Icon, {
90
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Icon, {
91
91
  icon: "ph--x--regular",
92
92
  size: 3
93
- })))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Root, {
93
+ })))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_tabs.Tabs.Root, {
94
94
  orientation: "vertical",
95
95
  value: selected,
96
96
  onValueChange: (nextSelected) => onSelected(nextSelected),
97
97
  activePart: tabsActivePart,
98
98
  onActivePartChange: setTabsActivePart,
99
99
  classNames: "flex flex-col flex-1 mbs-2"
100
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Viewport, {
100
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_tabs.Tabs.Viewport, {
101
101
  classNames: "flex-1 min-bs-0"
102
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
102
+ }, /* @__PURE__ */ import_react2.default.createElement("div", {
103
103
  role: "none",
104
104
  className: "overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator"
105
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Tablist, {
106
- classNames: "max-bs-none overflow-y-visible"
107
- }, /* @__PURE__ */ import_react3.default.createElement(PluginList, {
105
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_tabs.Tabs.Tablist, {
106
+ classNames: "flex flex-col gap-4 max-bs-none overflow-y-visible"
107
+ }, /* @__PURE__ */ import_react2.default.createElement(PluginList, {
108
108
  title: "Options",
109
109
  plugins: corePlugins
110
- }), filteredPlugins.length > 0 && /* @__PURE__ */ import_react3.default.createElement(PluginList, {
110
+ }), filteredPlugins.length > 0 && /* @__PURE__ */ import_react2.default.createElement(PluginList, {
111
111
  title: "Plugins",
112
- plugins: filteredPlugins,
113
- gap: true
114
- }))), corePlugins.map((plugin) => /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Tabpanel, {
112
+ plugins: filteredPlugins
113
+ }))), corePlugins.map((plugin) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_tabs.Tabs.Tabpanel, {
115
114
  key: plugin.id,
116
115
  value: plugin.id,
117
116
  classNames: "pli-3 @md:pli-5 max-bs-dvh overflow-y-auto"
118
- }, /* @__PURE__ */ import_react3.default.createElement(import_app_framework2.Surface, {
117
+ }, /* @__PURE__ */ import_react2.default.createElement(import_app_framework2.Surface, {
119
118
  role: "settings",
120
119
  data: {
121
120
  plugin: plugin.id
122
121
  }
123
- }))), filteredPlugins.map((plugin) => /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Tabpanel, {
122
+ }))), filteredPlugins.map((plugin) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_tabs.Tabs.Tabpanel, {
124
123
  key: plugin.id,
125
124
  value: plugin.id,
126
125
  classNames: "pli-3 @md:pli-5 max-bs-dvh overflow-y-auto"
127
- }, /* @__PURE__ */ import_react3.default.createElement(import_app_framework2.Surface, {
126
+ }, /* @__PURE__ */ import_react2.default.createElement(import_app_framework2.Surface, {
128
127
  role: "settings",
129
128
  data: {
130
129
  plugin: plugin.id
131
130
  }
132
131
  }))))));
133
132
  };
134
- var PluginList = ({ title, plugins, gap }) => {
135
- return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.TabGroupHeading, {
136
- classNames: gap ? "mbs-4" : "mbs-4 @md:mbs-2"
137
- }, title), plugins.map((plugin) => /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Tab, {
133
+ var PluginList = ({ title, plugins }) => {
134
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
135
+ role: "none"
136
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_tabs.Tabs.TabGroupHeading, {
137
+ classNames: "pli-1 mlb-2 mbs-4 @md:mbs-2"
138
+ }, title), /* @__PURE__ */ import_react2.default.createElement("div", {
139
+ className: "flex flex-col ml-1"
140
+ }, plugins.map((plugin) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_tabs.Tabs.Tab, {
138
141
  key: plugin.id,
139
142
  value: plugin.id
140
- }, plugin.name)));
143
+ }, plugin.name))));
141
144
  };
142
145
  var SettingsValue = ({ label, description, secondary, children }) => {
143
- const primary = /* @__PURE__ */ import_react4.default.createElement("div", {
146
+ const primary = /* @__PURE__ */ import_react3.default.createElement("div", {
144
147
  role: "none",
145
148
  className: "flex w-full gap-4 py-1"
146
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Input.Root, null, /* @__PURE__ */ import_react4.default.createElement("div", {
149
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Input.Root, null, /* @__PURE__ */ import_react3.default.createElement("div", {
147
150
  role: "none",
148
151
  className: "flex flex-col w-full"
149
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Input.Label, {
152
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Input.Label, {
150
153
  classNames: "flex min-h-[40px] items-center"
151
- }, label), description && /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Input.DescriptionAndValidation, {
154
+ }, label), description && /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Input.DescriptionAndValidation, {
152
155
  classNames: "mbs-0.5"
153
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Input.Description, null, description))), /* @__PURE__ */ import_react4.default.createElement("div", {
156
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Input.Description, null, description))), /* @__PURE__ */ import_react3.default.createElement("div", {
154
157
  role: "none"
155
- }, /* @__PURE__ */ import_react4.default.createElement("div", {
158
+ }, /* @__PURE__ */ import_react3.default.createElement("div", {
156
159
  role: "none",
157
160
  className: "flex min-h-[40px] items-center"
158
161
  }, children))));
159
162
  if (secondary) {
160
- return /* @__PURE__ */ import_react4.default.createElement("div", {
163
+ return /* @__PURE__ */ import_react3.default.createElement("div", {
161
164
  role: "none",
162
165
  className: "flex flex-col w-full"
163
166
  }, primary, secondary);
@@ -194,7 +197,7 @@ var SettingsPlugin = () => {
194
197
  component: ({ data }) => {
195
198
  switch (data.component) {
196
199
  case `${import_chunk_LZVHLML4.SETTINGS_PLUGIN}/Settings`:
197
- return /* @__PURE__ */ import_react2.default.createElement(SettingsDialog, {
200
+ return /* @__PURE__ */ import_react.default.createElement(SettingsDialog, {
198
201
  selected: settings.values.selected,
199
202
  onSelected: (selected) => settings.values.selected = selected
200
203
  });
@@ -250,8 +253,7 @@ var SettingsPlugin = () => {
250
253
  ns: import_chunk_LZVHLML4.SETTINGS_PLUGIN
251
254
  }
252
255
  ],
253
- icon: (props) => /* @__PURE__ */ import_react2.default.createElement(import_react.Gear, props),
254
- iconSymbol: "ph--gear--regular",
256
+ icon: "ph--gear--regular",
255
257
  keyBinding: {
256
258
  macos: "meta+,",
257
259
  windows: "alt+,"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/SettingsPlugin.tsx", "../../../src/components/SettingsDialog.tsx", "../../../src/components/SettingsValue.tsx", "../../../src/translations.ts", "../../../src/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Gear, type IconProps } from '@phosphor-icons/react';\nimport React from 'react';\n\nimport {\n type IntentResolverProvides,\n type PluginDefinition,\n type SurfaceProvides,\n parseIntentPlugin,\n resolvePlugin,\n LayoutAction,\n SettingsAction,\n type GraphBuilderProvides,\n type TranslationsProvides,\n} from '@dxos/app-framework';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\n\nimport { SettingsDialog } from './components';\nimport meta, { SETTINGS_PLUGIN } from './meta';\nimport translations from './translations';\n\nconst DEFAULT_PLUGIN = 'dxos.org/plugin/registry';\n\nexport type SettingsPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n TranslationsProvides;\n\ntype SettingsSettingsProps = {\n selected: string;\n};\n\n/**\n * Plugin for aggregating and rendering plugin settings.\n */\nexport const SettingsPlugin = (): PluginDefinition<SettingsPluginProvides> => {\n const settings = new LocalStorageStore<SettingsSettingsProps>(SETTINGS_PLUGIN, { selected: DEFAULT_PLUGIN });\n\n return {\n meta,\n ready: async () => {\n settings.prop({ key: 'selected', type: LocalStorageStore.string() });\n },\n provides: {\n surface: {\n component: ({ data }) => {\n switch (data.component) {\n case `${SETTINGS_PLUGIN}/Settings`:\n return (\n <SettingsDialog\n selected={settings.values.selected}\n onSelected={(selected) => (settings.values.selected = selected)}\n />\n );\n\n default:\n return null;\n }\n },\n },\n intent: {\n resolver: (intent) => {\n switch (intent.action) {\n case SettingsAction.OPEN: {\n if (intent.data?.plugin) {\n settings.values.selected = intent.data?.plugin;\n }\n\n return {\n intents: [\n [\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'dialog',\n component: `${SETTINGS_PLUGIN}/Settings`,\n dialogBlockAlign: 'start',\n },\n },\n ],\n ],\n };\n }\n }\n },\n },\n graph: {\n builder: (plugins) => {\n const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n\n return createExtension({\n id: SETTINGS_PLUGIN,\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SETTINGS_PLUGIN,\n data: async () => {\n await intentPlugin?.provides.intent.dispatch({\n plugin: SETTINGS_PLUGIN,\n action: SettingsAction.OPEN,\n });\n },\n properties: {\n label: ['open settings label', { ns: SETTINGS_PLUGIN }],\n icon: (props: IconProps) => <Gear {...props} />,\n iconSymbol: 'ph--gear--regular',\n keyBinding: {\n macos: 'meta+,',\n windows: 'alt+,',\n },\n },\n },\n ],\n });\n },\n },\n translations,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type Plugin, Surface, usePlugins } from '@dxos/app-framework';\nimport { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';\nimport { Tabs, type TabsActivePart } from '@dxos/react-ui-tabs';\nimport { getSize } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { SETTINGS_PLUGIN } from '../meta';\n\nexport const SettingsDialog = ({\n selected,\n onSelected,\n}: {\n selected: string;\n onSelected: (plugin: string) => void;\n}) => {\n const { t } = useTranslation(SETTINGS_PLUGIN);\n const { plugins, enabled } = usePlugins();\n\n // TODO(burdon): Factor out common defs?\n const core = [\n 'dxos.org/plugin/layout',\n 'dxos.org/plugin/deck',\n 'dxos.org/plugin/files',\n 'dxos.org/plugin/space',\n 'dxos.org/plugin/stack',\n 'dxos.org/plugin/observability',\n 'dxos.org/plugin/registry',\n ];\n\n const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(nonNullable);\n\n const filteredPlugins = enabled\n .filter((id) => !core.includes(id))\n .map((id) => plugins.find((plugin) => plugin.meta.id === id))\n .filter((plugin) => (plugin?.provides as any)?.settings)\n .map((plugin) => plugin!.meta)\n .sort(({ name: a }, { name: b }) => a?.localeCompare(b ?? '') ?? 0);\n\n const [tabsActivePart, setTabsActivePart] = useState<TabsActivePart>('list');\n\n return (\n <Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>\n <div role='none' className='flex justify-between mbe-1 pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5'>\n <Dialog.Title\n onClick={() => setTabsActivePart('list')}\n aria-description={t('click to return to tablist description')}\n classNames='flex cursor-pointer items-center group/title'\n >\n <Icon\n icon='ph--caret-left--regular'\n classNames={['@md:hidden', getSize(4), tabsActivePart === 'list' && 'invisible']}\n />\n <span\n className={\n tabsActivePart !== 'list'\n ? 'group-hover/title:underline @md:group-hover/title:no-underline underline-offset-4 decoration-1'\n : ''\n }\n >\n {t('settings dialog title')}\n </span>\n </Dialog.Title>\n <Dialog.Close asChild>\n <Button density='fine' variant='ghost' autoFocus>\n <Icon icon='ph--x--regular' size={3} />\n </Button>\n </Dialog.Close>\n </div>\n\n <Tabs.Root\n orientation='vertical'\n value={selected}\n onValueChange={(nextSelected) => onSelected(nextSelected)}\n activePart={tabsActivePart}\n onActivePartChange={setTabsActivePart}\n classNames='flex flex-col flex-1 mbs-2'\n >\n <Tabs.Viewport classNames='flex-1 min-bs-0'>\n <div role='none' className='overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator'>\n <Tabs.Tablist classNames='max-bs-none overflow-y-visible'>\n <PluginList title='Options' plugins={corePlugins} />\n {filteredPlugins.length > 0 && <PluginList title='Plugins' plugins={filteredPlugins} gap />}\n </Tabs.Tablist>\n </div>\n\n {corePlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n {filteredPlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n </Tabs.Viewport>\n </Tabs.Root>\n </Dialog.Content>\n );\n};\n\nconst PluginList = ({ title, plugins, gap }: { title: string; plugins: Plugin['meta'][]; gap?: boolean }) => {\n return (\n <>\n <Tabs.TabGroupHeading classNames={gap ? 'mbs-4' : 'mbs-4 @md:mbs-2'}>{title}</Tabs.TabGroupHeading>\n {plugins.map((plugin) => (\n <Tabs.Tab key={plugin.id} value={plugin.id}>\n {plugin.name}\n </Tabs.Tab>\n ))}\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren } from 'react';\n\nimport { Input } from '@dxos/react-ui';\n\ntype SettingValueProps = {\n label: string;\n description?: JSX.Element;\n secondary?: JSX.Element;\n};\n\nexport const SettingsValue = ({ label, description, secondary, children }: PropsWithChildren<SettingValueProps>) => {\n const primary = (\n <div role='none' className='flex w-full gap-4 py-1'>\n <Input.Root>\n <div role='none' className='flex flex-col w-full'>\n {/* TODO(burdon): Consistent height for controls (e.g., Select, Textbox, and Checkbox are all different). */}\n <Input.Label classNames='flex min-h-[40px] items-center'>{label}</Input.Label>\n {description && (\n <Input.DescriptionAndValidation classNames='mbs-0.5'>\n <Input.Description>{description}</Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n\n <div role='none'>\n <div role='none' className='flex min-h-[40px] items-center'>\n {children}\n </div>\n </div>\n </Input.Root>\n </div>\n );\n\n if (secondary) {\n // console.log(secondary);\n return (\n <div role='none' className='flex flex-col w-full'>\n {primary}\n {secondary}\n </div>\n );\n }\n\n return primary;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SETTINGS_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [SETTINGS_PLUGIN]: {\n 'open settings label': 'Show settings',\n 'settings dialog title': 'Settings',\n 'back label': 'Back',\n 'click to return to tablist description': 'Click the title to return to the settings menu',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SettingsPlugin } from './SettingsPlugin';\n\nexport default SettingsPlugin;\n\nexport * from './SettingsPlugin';\n\n// TODO(wittjosiah): Remove.\n// Settings should be exposed from plugins as state and intents rather than components.\nexport * from './components';\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "import_app_framework", "import_react_ui", "SettingsDialog", "selected", "onSelected", "t", "useTranslation", "SETTINGS_PLUGIN", "plugins", "enabled", "usePlugins", "core", "corePlugins", "map", "id", "find", "plugin", "meta", "filter", "nonNullable", "filteredPlugins", "includes", "provides", "settings", "sort", "name", "a", "b", "localeCompare", "tabsActivePart", "setTabsActivePart", "useState", "React", "Dialog", "Content", "classNames", "div", "role", "className", "Title", "onClick", "aria-description", "Icon", "icon", "getSize", "span", "Close", "asChild", "Button", "density", "variant", "autoFocus", "size", "Tabs", "Root", "orientation", "value", "onValueChange", "nextSelected", "activePart", "onActivePartChange", "Viewport", "Tablist", "PluginList", "title", "length", "gap", "Tabpanel", "key", "Surface", "data", "TabGroupHeading", "Tab", "SettingsValue", "label", "description", "secondary", "children", "primary", "Input", "Label", "DescriptionAndValidation", "Description", "DEFAULT_PLUGIN", "SettingsPlugin", "LocalStorageStore", "ready", "prop", "type", "string", "surface", "component", "values", "intent", "resolver", "action", "SettingsAction", "OPEN", "intents", "LayoutAction", "SET_LAYOUT", "element", "dialogBlockAlign", "graph", "builder", "intentPlugin", "resolvePlugin", "parseIntentPlugin", "createExtension", "node", "actions", "dispatch", "properties", "ns", "props", "Gear", "iconSymbol", "keyBinding", "macos", "windows", "translations"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport {\n type IntentResolverProvides,\n type PluginDefinition,\n type SurfaceProvides,\n parseIntentPlugin,\n resolvePlugin,\n LayoutAction,\n SettingsAction,\n type GraphBuilderProvides,\n type TranslationsProvides,\n} from '@dxos/app-framework';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\n\nimport { SettingsDialog } from './components';\nimport meta, { SETTINGS_PLUGIN } from './meta';\nimport translations from './translations';\n\nconst DEFAULT_PLUGIN = 'dxos.org/plugin/registry';\n\nexport type SettingsPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n TranslationsProvides;\n\ntype SettingsSettingsProps = {\n selected: string;\n};\n\n/**\n * Plugin for aggregating and rendering plugin settings.\n */\nexport const SettingsPlugin = (): PluginDefinition<SettingsPluginProvides> => {\n const settings = new LocalStorageStore<SettingsSettingsProps>(SETTINGS_PLUGIN, { selected: DEFAULT_PLUGIN });\n\n return {\n meta,\n ready: async () => {\n settings.prop({ key: 'selected', type: LocalStorageStore.string() });\n },\n provides: {\n surface: {\n component: ({ data }) => {\n switch (data.component) {\n case `${SETTINGS_PLUGIN}/Settings`:\n return (\n <SettingsDialog\n selected={settings.values.selected}\n onSelected={(selected) => (settings.values.selected = selected)}\n />\n );\n\n default:\n return null;\n }\n },\n },\n intent: {\n resolver: (intent) => {\n switch (intent.action) {\n case SettingsAction.OPEN: {\n if (intent.data?.plugin) {\n settings.values.selected = intent.data?.plugin;\n }\n\n return {\n intents: [\n [\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'dialog',\n component: `${SETTINGS_PLUGIN}/Settings`,\n dialogBlockAlign: 'start',\n },\n },\n ],\n ],\n };\n }\n }\n },\n },\n graph: {\n builder: (plugins) => {\n const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n\n return createExtension({\n id: SETTINGS_PLUGIN,\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SETTINGS_PLUGIN,\n data: async () => {\n await intentPlugin?.provides.intent.dispatch({\n plugin: SETTINGS_PLUGIN,\n action: SettingsAction.OPEN,\n });\n },\n properties: {\n label: ['open settings label', { ns: SETTINGS_PLUGIN }],\n icon: 'ph--gear--regular',\n keyBinding: {\n macos: 'meta+,',\n windows: 'alt+,',\n },\n },\n },\n ],\n });\n },\n },\n translations,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type Plugin, Surface, usePlugins } from '@dxos/app-framework';\nimport { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';\nimport { Tabs, type TabsActivePart } from '@dxos/react-ui-tabs';\nimport { getSize } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { SETTINGS_PLUGIN } from '../meta';\n\nexport const SettingsDialog = ({\n selected,\n onSelected,\n}: {\n selected: string;\n onSelected: (plugin: string) => void;\n}) => {\n const { t } = useTranslation(SETTINGS_PLUGIN);\n const { plugins, enabled } = usePlugins();\n\n // TODO(burdon): Factor out common defs?\n const core = [\n 'dxos.org/plugin/layout',\n 'dxos.org/plugin/deck',\n 'dxos.org/plugin/files',\n 'dxos.org/plugin/space',\n 'dxos.org/plugin/stack',\n 'dxos.org/plugin/observability',\n 'dxos.org/plugin/registry',\n ];\n\n const sortPlugin = ({ name: a }: Plugin['meta'], { name: b }: Plugin['meta']) => a?.localeCompare(b ?? '') ?? 0;\n\n const corePlugins = core\n .map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta)\n .filter(nonNullable)\n .sort(sortPlugin);\n\n const filteredPlugins = enabled\n .filter((id) => !core.includes(id))\n .map((id) => plugins.find((plugin) => plugin.meta.id === id))\n .filter((plugin) => (plugin?.provides as any)?.settings)\n .map((plugin) => plugin!.meta)\n .sort(sortPlugin);\n\n const [tabsActivePart, setTabsActivePart] = useState<TabsActivePart>('list');\n\n return (\n <Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>\n <div role='none' className='flex justify-between mbe-1 pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5'>\n <Dialog.Title\n onClick={() => setTabsActivePart('list')}\n aria-description={t('click to return to tablist description')}\n classNames='flex cursor-pointer items-center group/title'\n >\n <Icon\n icon='ph--caret-left--regular'\n classNames={['@md:hidden', getSize(4), tabsActivePart === 'list' && 'invisible']}\n />\n <span\n className={\n tabsActivePart !== 'list'\n ? 'group-hover/title:underline @md:group-hover/title:no-underline underline-offset-4 decoration-1'\n : ''\n }\n >\n {t('settings dialog title')}\n </span>\n </Dialog.Title>\n <Dialog.Close asChild>\n <Button density='fine' variant='ghost' autoFocus>\n <Icon icon='ph--x--regular' size={3} />\n </Button>\n </Dialog.Close>\n </div>\n\n <Tabs.Root\n orientation='vertical'\n value={selected}\n onValueChange={(nextSelected) => onSelected(nextSelected)}\n activePart={tabsActivePart}\n onActivePartChange={setTabsActivePart}\n classNames='flex flex-col flex-1 mbs-2'\n >\n <Tabs.Viewport classNames='flex-1 min-bs-0'>\n <div role='none' className='overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator'>\n <Tabs.Tablist classNames='flex flex-col gap-4 max-bs-none overflow-y-visible'>\n <PluginList title='Options' plugins={corePlugins} />\n {filteredPlugins.length > 0 && <PluginList title='Plugins' plugins={filteredPlugins} />}\n </Tabs.Tablist>\n </div>\n\n {corePlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n {filteredPlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n </Tabs.Viewport>\n </Tabs.Root>\n </Dialog.Content>\n );\n};\n\nconst PluginList = ({ title, plugins }: { title: string; plugins: Plugin['meta'][] }) => {\n return (\n <div role='none'>\n <Tabs.TabGroupHeading classNames={'pli-1 mlb-2 mbs-4 @md:mbs-2'}>{title}</Tabs.TabGroupHeading>\n <div className='flex flex-col ml-1'>\n {plugins.map((plugin) => (\n <Tabs.Tab key={plugin.id} value={plugin.id}>\n {plugin.name}\n </Tabs.Tab>\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren } from 'react';\n\nimport { Input } from '@dxos/react-ui';\n\ntype SettingValueProps = {\n label: string;\n description?: JSX.Element;\n secondary?: JSX.Element;\n};\n\nexport const SettingsValue = ({ label, description, secondary, children }: PropsWithChildren<SettingValueProps>) => {\n const primary = (\n <div role='none' className='flex w-full gap-4 py-1'>\n <Input.Root>\n <div role='none' className='flex flex-col w-full'>\n {/* TODO(burdon): Consistent height for controls (e.g., Select, Textbox, and Checkbox are all different). */}\n <Input.Label classNames='flex min-h-[40px] items-center'>{label}</Input.Label>\n {description && (\n <Input.DescriptionAndValidation classNames='mbs-0.5'>\n <Input.Description>{description}</Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n\n <div role='none'>\n <div role='none' className='flex min-h-[40px] items-center'>\n {children}\n </div>\n </div>\n </Input.Root>\n </div>\n );\n\n if (secondary) {\n // console.log(secondary);\n return (\n <div role='none' className='flex flex-col w-full'>\n {primary}\n {secondary}\n </div>\n );\n }\n\n return primary;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SETTINGS_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [SETTINGS_PLUGIN]: {\n 'open settings label': 'Show settings',\n 'settings dialog title': 'Settings',\n 'back label': 'Back',\n 'click to return to tablist description': 'Click the title to return to the settings menu',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SettingsPlugin } from './SettingsPlugin';\n\nexport default SettingsPlugin;\n\nexport * from './SettingsPlugin';\n\n// TODO(wittjosiah): Remove.\n// Settings should be exposed from plugins as state and intents rather than components.\nexport * from './components';\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_app_framework", "import_react_ui", "SettingsDialog", "selected", "onSelected", "t", "useTranslation", "SETTINGS_PLUGIN", "plugins", "enabled", "usePlugins", "core", "sortPlugin", "name", "a", "b", "localeCompare", "corePlugins", "map", "id", "find", "plugin", "meta", "filter", "nonNullable", "sort", "filteredPlugins", "includes", "provides", "settings", "tabsActivePart", "setTabsActivePart", "useState", "React", "Dialog", "Content", "classNames", "div", "role", "className", "Title", "onClick", "aria-description", "Icon", "icon", "getSize", "span", "Close", "asChild", "Button", "density", "variant", "autoFocus", "size", "Tabs", "Root", "orientation", "value", "onValueChange", "nextSelected", "activePart", "onActivePartChange", "Viewport", "Tablist", "PluginList", "title", "length", "Tabpanel", "key", "Surface", "data", "TabGroupHeading", "Tab", "SettingsValue", "label", "description", "secondary", "children", "primary", "Input", "Label", "DescriptionAndValidation", "Description", "DEFAULT_PLUGIN", "SettingsPlugin", "LocalStorageStore", "ready", "prop", "type", "string", "surface", "component", "values", "intent", "resolver", "action", "SettingsAction", "OPEN", "intents", "LayoutAction", "SET_LAYOUT", "element", "dialogBlockAlign", "graph", "builder", "intentPlugin", "resolvePlugin", "parseIntentPlugin", "createExtension", "node", "actions", "dispatch", "properties", "ns", "keyBinding", "macos", "windows", "translations"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytes":778,"imports":[],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytes":15320,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytes":4471,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/plugin-settings/src/components/index.ts":{"bytes":634,"imports":[{"path":"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx","kind":"import-statement","original":"./SettingsDialog"},{"path":"packages/plugins/plugin-settings/src/components/SettingsValue.tsx","kind":"import-statement","original":"./SettingsValue"}],"format":"esm"},"packages/plugins/plugin-settings/src/translations.ts":{"bytes":1571,"imports":[{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytes":12747,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/plugin-settings/src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/plugins/plugin-settings/src/index.ts":{"bytes":1216,"imports":[{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"packages/plugins/plugin-settings/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":16980},"packages/plugins/plugin-settings/dist/lib/node/index.cjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs","kind":"import-statement"},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["SettingsDialog","SettingsPlugin","SettingsValue","default"],"entryPoint":"packages/plugins/plugin-settings/src/index.ts","inputs":{"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytesInOutput":2968},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytesInOutput":4288},"packages/plugins/plugin-settings/src/components/index.ts":{"bytesInOutput":0},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytesInOutput":1125},"packages/plugins/plugin-settings/src/translations.ts":{"bytesInOutput":318},"packages/plugins/plugin-settings/src/index.ts":{"bytesInOutput":34}},"bytes":9300},"packages/plugins/plugin-settings/dist/lib/node/meta.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/plugin-settings/dist/lib/node/meta.cjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs","kind":"import-statement"}],"exports":["SETTINGS_PLUGIN","default"],"entryPoint":"packages/plugins/plugin-settings/src/meta.ts","inputs":{},"bytes":165},"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":338},"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs":{"imports":[],"exports":["SETTINGS_PLUGIN","meta_default"],"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytesInOutput":96}},"bytes":235}}}
1
+ {"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytes":778,"imports":[],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytes":15790,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytes":4471,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/plugin-settings/src/components/index.ts":{"bytes":634,"imports":[{"path":"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx","kind":"import-statement","original":"./SettingsDialog"},{"path":"packages/plugins/plugin-settings/src/components/SettingsValue.tsx","kind":"import-statement","original":"./SettingsValue"}],"format":"esm"},"packages/plugins/plugin-settings/src/translations.ts":{"bytes":1571,"imports":[{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytes":12272,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/plugin-settings/src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/plugins/plugin-settings/src/index.ts":{"bytes":1216,"imports":[{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"packages/plugins/plugin-settings/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":16977},"packages/plugins/plugin-settings/dist/lib/node/index.cjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["SettingsDialog","SettingsPlugin","SettingsValue","default"],"entryPoint":"packages/plugins/plugin-settings/src/index.ts","inputs":{"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytesInOutput":2830},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytesInOutput":4430},"packages/plugins/plugin-settings/src/components/index.ts":{"bytesInOutput":0},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytesInOutput":1125},"packages/plugins/plugin-settings/src/translations.ts":{"bytesInOutput":318},"packages/plugins/plugin-settings/src/index.ts":{"bytesInOutput":34}},"bytes":9304},"packages/plugins/plugin-settings/dist/lib/node/meta.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/plugin-settings/dist/lib/node/meta.cjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs","kind":"import-statement"}],"exports":["SETTINGS_PLUGIN","default"],"entryPoint":"packages/plugins/plugin-settings/src/meta.ts","inputs":{},"bytes":165},"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":338},"packages/plugins/plugin-settings/dist/lib/node/chunk-LZVHLML4.cjs":{"imports":[],"exports":["SETTINGS_PLUGIN","meta_default"],"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytesInOutput":96}},"bytes":235}}}
@@ -0,0 +1,13 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/plugin-settings/src/meta.ts
4
+ var SETTINGS_PLUGIN = "dxos.org/plugin/settings";
5
+ var meta_default = {
6
+ id: SETTINGS_PLUGIN
7
+ };
8
+
9
+ export {
10
+ SETTINGS_PLUGIN,
11
+ meta_default
12
+ };
13
+ //# sourceMappingURL=chunk-CHPB3YX5.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport const SETTINGS_PLUGIN = 'dxos.org/plugin/settings';\n\nexport default {\n id: SETTINGS_PLUGIN,\n};\n"],
5
+ "mappings": ";;;AAIO,IAAMA,kBAAkB;AAE/B,IAAA,eAAe;EACbC,IAAID;AACN;",
6
+ "names": ["SETTINGS_PLUGIN", "id"]
7
+ }
@@ -0,0 +1,258 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ SETTINGS_PLUGIN,
4
+ meta_default
5
+ } from "./chunk-CHPB3YX5.mjs";
6
+
7
+ // packages/plugins/plugin-settings/src/SettingsPlugin.tsx
8
+ import React3 from "react";
9
+ import { parseIntentPlugin, resolvePlugin, LayoutAction, SettingsAction } from "@dxos/app-framework";
10
+ import { LocalStorageStore } from "@dxos/local-storage";
11
+ import { createExtension } from "@dxos/plugin-graph";
12
+
13
+ // packages/plugins/plugin-settings/src/components/SettingsDialog.tsx
14
+ import React, { useState } from "react";
15
+ import { Surface, usePlugins } from "@dxos/app-framework";
16
+ import { Button, Dialog, Icon, useTranslation } from "@dxos/react-ui";
17
+ import { Tabs } from "@dxos/react-ui-tabs";
18
+ import { getSize } from "@dxos/react-ui-theme";
19
+ import { nonNullable } from "@dxos/util";
20
+ var SettingsDialog = ({ selected, onSelected }) => {
21
+ const { t } = useTranslation(SETTINGS_PLUGIN);
22
+ const { plugins, enabled } = usePlugins();
23
+ const core = [
24
+ "dxos.org/plugin/layout",
25
+ "dxos.org/plugin/deck",
26
+ "dxos.org/plugin/files",
27
+ "dxos.org/plugin/space",
28
+ "dxos.org/plugin/stack",
29
+ "dxos.org/plugin/observability",
30
+ "dxos.org/plugin/registry"
31
+ ];
32
+ const sortPlugin = ({ name: a }, { name: b }) => a?.localeCompare(b ?? "") ?? 0;
33
+ const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(nonNullable).sort(sortPlugin);
34
+ const filteredPlugins = enabled.filter((id) => !core.includes(id)).map((id) => plugins.find((plugin) => plugin.meta.id === id)).filter((plugin) => plugin?.provides?.settings).map((plugin) => plugin.meta).sort(sortPlugin);
35
+ const [tabsActivePart, setTabsActivePart] = useState("list");
36
+ return /* @__PURE__ */ React.createElement(Dialog.Content, {
37
+ classNames: "p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden"
38
+ }, /* @__PURE__ */ React.createElement("div", {
39
+ role: "none",
40
+ className: "flex justify-between mbe-1 pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5"
41
+ }, /* @__PURE__ */ React.createElement(Dialog.Title, {
42
+ onClick: () => setTabsActivePart("list"),
43
+ "aria-description": t("click to return to tablist description"),
44
+ classNames: "flex cursor-pointer items-center group/title"
45
+ }, /* @__PURE__ */ React.createElement(Icon, {
46
+ icon: "ph--caret-left--regular",
47
+ classNames: [
48
+ "@md:hidden",
49
+ getSize(4),
50
+ tabsActivePart === "list" && "invisible"
51
+ ]
52
+ }), /* @__PURE__ */ React.createElement("span", {
53
+ className: tabsActivePart !== "list" ? "group-hover/title:underline @md:group-hover/title:no-underline underline-offset-4 decoration-1" : ""
54
+ }, t("settings dialog title"))), /* @__PURE__ */ React.createElement(Dialog.Close, {
55
+ asChild: true
56
+ }, /* @__PURE__ */ React.createElement(Button, {
57
+ density: "fine",
58
+ variant: "ghost",
59
+ autoFocus: true
60
+ }, /* @__PURE__ */ React.createElement(Icon, {
61
+ icon: "ph--x--regular",
62
+ size: 3
63
+ })))), /* @__PURE__ */ React.createElement(Tabs.Root, {
64
+ orientation: "vertical",
65
+ value: selected,
66
+ onValueChange: (nextSelected) => onSelected(nextSelected),
67
+ activePart: tabsActivePart,
68
+ onActivePartChange: setTabsActivePart,
69
+ classNames: "flex flex-col flex-1 mbs-2"
70
+ }, /* @__PURE__ */ React.createElement(Tabs.Viewport, {
71
+ classNames: "flex-1 min-bs-0"
72
+ }, /* @__PURE__ */ React.createElement("div", {
73
+ role: "none",
74
+ className: "overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator"
75
+ }, /* @__PURE__ */ React.createElement(Tabs.Tablist, {
76
+ classNames: "flex flex-col gap-4 max-bs-none overflow-y-visible"
77
+ }, /* @__PURE__ */ React.createElement(PluginList, {
78
+ title: "Options",
79
+ plugins: corePlugins
80
+ }), filteredPlugins.length > 0 && /* @__PURE__ */ React.createElement(PluginList, {
81
+ title: "Plugins",
82
+ plugins: filteredPlugins
83
+ }))), corePlugins.map((plugin) => /* @__PURE__ */ React.createElement(Tabs.Tabpanel, {
84
+ key: plugin.id,
85
+ value: plugin.id,
86
+ classNames: "pli-3 @md:pli-5 max-bs-dvh overflow-y-auto"
87
+ }, /* @__PURE__ */ React.createElement(Surface, {
88
+ role: "settings",
89
+ data: {
90
+ plugin: plugin.id
91
+ }
92
+ }))), filteredPlugins.map((plugin) => /* @__PURE__ */ React.createElement(Tabs.Tabpanel, {
93
+ key: plugin.id,
94
+ value: plugin.id,
95
+ classNames: "pli-3 @md:pli-5 max-bs-dvh overflow-y-auto"
96
+ }, /* @__PURE__ */ React.createElement(Surface, {
97
+ role: "settings",
98
+ data: {
99
+ plugin: plugin.id
100
+ }
101
+ }))))));
102
+ };
103
+ var PluginList = ({ title, plugins }) => {
104
+ return /* @__PURE__ */ React.createElement("div", {
105
+ role: "none"
106
+ }, /* @__PURE__ */ React.createElement(Tabs.TabGroupHeading, {
107
+ classNames: "pli-1 mlb-2 mbs-4 @md:mbs-2"
108
+ }, title), /* @__PURE__ */ React.createElement("div", {
109
+ className: "flex flex-col ml-1"
110
+ }, plugins.map((plugin) => /* @__PURE__ */ React.createElement(Tabs.Tab, {
111
+ key: plugin.id,
112
+ value: plugin.id
113
+ }, plugin.name))));
114
+ };
115
+
116
+ // packages/plugins/plugin-settings/src/components/SettingsValue.tsx
117
+ import React2 from "react";
118
+ import { Input } from "@dxos/react-ui";
119
+ var SettingsValue = ({ label, description, secondary, children }) => {
120
+ const primary = /* @__PURE__ */ React2.createElement("div", {
121
+ role: "none",
122
+ className: "flex w-full gap-4 py-1"
123
+ }, /* @__PURE__ */ React2.createElement(Input.Root, null, /* @__PURE__ */ React2.createElement("div", {
124
+ role: "none",
125
+ className: "flex flex-col w-full"
126
+ }, /* @__PURE__ */ React2.createElement(Input.Label, {
127
+ classNames: "flex min-h-[40px] items-center"
128
+ }, label), description && /* @__PURE__ */ React2.createElement(Input.DescriptionAndValidation, {
129
+ classNames: "mbs-0.5"
130
+ }, /* @__PURE__ */ React2.createElement(Input.Description, null, description))), /* @__PURE__ */ React2.createElement("div", {
131
+ role: "none"
132
+ }, /* @__PURE__ */ React2.createElement("div", {
133
+ role: "none",
134
+ className: "flex min-h-[40px] items-center"
135
+ }, children))));
136
+ if (secondary) {
137
+ return /* @__PURE__ */ React2.createElement("div", {
138
+ role: "none",
139
+ className: "flex flex-col w-full"
140
+ }, primary, secondary);
141
+ }
142
+ return primary;
143
+ };
144
+
145
+ // packages/plugins/plugin-settings/src/translations.ts
146
+ var translations_default = [
147
+ {
148
+ "en-US": {
149
+ [SETTINGS_PLUGIN]: {
150
+ "open settings label": "Show settings",
151
+ "settings dialog title": "Settings",
152
+ "back label": "Back",
153
+ "click to return to tablist description": "Click the title to return to the settings menu"
154
+ }
155
+ }
156
+ }
157
+ ];
158
+
159
+ // packages/plugins/plugin-settings/src/SettingsPlugin.tsx
160
+ var DEFAULT_PLUGIN = "dxos.org/plugin/registry";
161
+ var SettingsPlugin = () => {
162
+ const settings = new LocalStorageStore(SETTINGS_PLUGIN, {
163
+ selected: DEFAULT_PLUGIN
164
+ });
165
+ return {
166
+ meta: meta_default,
167
+ ready: async () => {
168
+ settings.prop({
169
+ key: "selected",
170
+ type: LocalStorageStore.string()
171
+ });
172
+ },
173
+ provides: {
174
+ surface: {
175
+ component: ({ data }) => {
176
+ switch (data.component) {
177
+ case `${SETTINGS_PLUGIN}/Settings`:
178
+ return /* @__PURE__ */ React3.createElement(SettingsDialog, {
179
+ selected: settings.values.selected,
180
+ onSelected: (selected) => settings.values.selected = selected
181
+ });
182
+ default:
183
+ return null;
184
+ }
185
+ }
186
+ },
187
+ intent: {
188
+ resolver: (intent) => {
189
+ switch (intent.action) {
190
+ case SettingsAction.OPEN: {
191
+ if (intent.data?.plugin) {
192
+ settings.values.selected = intent.data?.plugin;
193
+ }
194
+ return {
195
+ intents: [
196
+ [
197
+ {
198
+ action: LayoutAction.SET_LAYOUT,
199
+ data: {
200
+ element: "dialog",
201
+ component: `${SETTINGS_PLUGIN}/Settings`,
202
+ dialogBlockAlign: "start"
203
+ }
204
+ }
205
+ ]
206
+ ]
207
+ };
208
+ }
209
+ }
210
+ }
211
+ },
212
+ graph: {
213
+ builder: (plugins) => {
214
+ const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
215
+ return createExtension({
216
+ id: SETTINGS_PLUGIN,
217
+ filter: (node) => node.id === "root",
218
+ actions: () => [
219
+ {
220
+ id: SETTINGS_PLUGIN,
221
+ data: async () => {
222
+ await intentPlugin?.provides.intent.dispatch({
223
+ plugin: SETTINGS_PLUGIN,
224
+ action: SettingsAction.OPEN
225
+ });
226
+ },
227
+ properties: {
228
+ label: [
229
+ "open settings label",
230
+ {
231
+ ns: SETTINGS_PLUGIN
232
+ }
233
+ ],
234
+ icon: "ph--gear--regular",
235
+ keyBinding: {
236
+ macos: "meta+,",
237
+ windows: "alt+,"
238
+ }
239
+ }
240
+ }
241
+ ]
242
+ });
243
+ }
244
+ },
245
+ translations: translations_default
246
+ }
247
+ };
248
+ };
249
+
250
+ // packages/plugins/plugin-settings/src/index.ts
251
+ var src_default = SettingsPlugin;
252
+ export {
253
+ SettingsDialog,
254
+ SettingsPlugin,
255
+ SettingsValue,
256
+ src_default as default
257
+ };
258
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/SettingsPlugin.tsx", "../../../src/components/SettingsDialog.tsx", "../../../src/components/SettingsValue.tsx", "../../../src/translations.ts", "../../../src/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport {\n type IntentResolverProvides,\n type PluginDefinition,\n type SurfaceProvides,\n parseIntentPlugin,\n resolvePlugin,\n LayoutAction,\n SettingsAction,\n type GraphBuilderProvides,\n type TranslationsProvides,\n} from '@dxos/app-framework';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\n\nimport { SettingsDialog } from './components';\nimport meta, { SETTINGS_PLUGIN } from './meta';\nimport translations from './translations';\n\nconst DEFAULT_PLUGIN = 'dxos.org/plugin/registry';\n\nexport type SettingsPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n TranslationsProvides;\n\ntype SettingsSettingsProps = {\n selected: string;\n};\n\n/**\n * Plugin for aggregating and rendering plugin settings.\n */\nexport const SettingsPlugin = (): PluginDefinition<SettingsPluginProvides> => {\n const settings = new LocalStorageStore<SettingsSettingsProps>(SETTINGS_PLUGIN, { selected: DEFAULT_PLUGIN });\n\n return {\n meta,\n ready: async () => {\n settings.prop({ key: 'selected', type: LocalStorageStore.string() });\n },\n provides: {\n surface: {\n component: ({ data }) => {\n switch (data.component) {\n case `${SETTINGS_PLUGIN}/Settings`:\n return (\n <SettingsDialog\n selected={settings.values.selected}\n onSelected={(selected) => (settings.values.selected = selected)}\n />\n );\n\n default:\n return null;\n }\n },\n },\n intent: {\n resolver: (intent) => {\n switch (intent.action) {\n case SettingsAction.OPEN: {\n if (intent.data?.plugin) {\n settings.values.selected = intent.data?.plugin;\n }\n\n return {\n intents: [\n [\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'dialog',\n component: `${SETTINGS_PLUGIN}/Settings`,\n dialogBlockAlign: 'start',\n },\n },\n ],\n ],\n };\n }\n }\n },\n },\n graph: {\n builder: (plugins) => {\n const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n\n return createExtension({\n id: SETTINGS_PLUGIN,\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SETTINGS_PLUGIN,\n data: async () => {\n await intentPlugin?.provides.intent.dispatch({\n plugin: SETTINGS_PLUGIN,\n action: SettingsAction.OPEN,\n });\n },\n properties: {\n label: ['open settings label', { ns: SETTINGS_PLUGIN }],\n icon: 'ph--gear--regular',\n keyBinding: {\n macos: 'meta+,',\n windows: 'alt+,',\n },\n },\n },\n ],\n });\n },\n },\n translations,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type Plugin, Surface, usePlugins } from '@dxos/app-framework';\nimport { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';\nimport { Tabs, type TabsActivePart } from '@dxos/react-ui-tabs';\nimport { getSize } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { SETTINGS_PLUGIN } from '../meta';\n\nexport const SettingsDialog = ({\n selected,\n onSelected,\n}: {\n selected: string;\n onSelected: (plugin: string) => void;\n}) => {\n const { t } = useTranslation(SETTINGS_PLUGIN);\n const { plugins, enabled } = usePlugins();\n\n // TODO(burdon): Factor out common defs?\n const core = [\n 'dxos.org/plugin/layout',\n 'dxos.org/plugin/deck',\n 'dxos.org/plugin/files',\n 'dxos.org/plugin/space',\n 'dxos.org/plugin/stack',\n 'dxos.org/plugin/observability',\n 'dxos.org/plugin/registry',\n ];\n\n const sortPlugin = ({ name: a }: Plugin['meta'], { name: b }: Plugin['meta']) => a?.localeCompare(b ?? '') ?? 0;\n\n const corePlugins = core\n .map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta)\n .filter(nonNullable)\n .sort(sortPlugin);\n\n const filteredPlugins = enabled\n .filter((id) => !core.includes(id))\n .map((id) => plugins.find((plugin) => plugin.meta.id === id))\n .filter((plugin) => (plugin?.provides as any)?.settings)\n .map((plugin) => plugin!.meta)\n .sort(sortPlugin);\n\n const [tabsActivePart, setTabsActivePart] = useState<TabsActivePart>('list');\n\n return (\n <Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>\n <div role='none' className='flex justify-between mbe-1 pbs-3 pis-2 pie-3 @md:pbs-4 @md:pis-4 @md:pie-5'>\n <Dialog.Title\n onClick={() => setTabsActivePart('list')}\n aria-description={t('click to return to tablist description')}\n classNames='flex cursor-pointer items-center group/title'\n >\n <Icon\n icon='ph--caret-left--regular'\n classNames={['@md:hidden', getSize(4), tabsActivePart === 'list' && 'invisible']}\n />\n <span\n className={\n tabsActivePart !== 'list'\n ? 'group-hover/title:underline @md:group-hover/title:no-underline underline-offset-4 decoration-1'\n : ''\n }\n >\n {t('settings dialog title')}\n </span>\n </Dialog.Title>\n <Dialog.Close asChild>\n <Button density='fine' variant='ghost' autoFocus>\n <Icon icon='ph--x--regular' size={3} />\n </Button>\n </Dialog.Close>\n </div>\n\n <Tabs.Root\n orientation='vertical'\n value={selected}\n onValueChange={(nextSelected) => onSelected(nextSelected)}\n activePart={tabsActivePart}\n onActivePartChange={setTabsActivePart}\n classNames='flex flex-col flex-1 mbs-2'\n >\n <Tabs.Viewport classNames='flex-1 min-bs-0'>\n <div role='none' className='overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator'>\n <Tabs.Tablist classNames='flex flex-col gap-4 max-bs-none overflow-y-visible'>\n <PluginList title='Options' plugins={corePlugins} />\n {filteredPlugins.length > 0 && <PluginList title='Plugins' plugins={filteredPlugins} />}\n </Tabs.Tablist>\n </div>\n\n {corePlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n {filteredPlugins.map((plugin) => (\n <Tabs.Tabpanel key={plugin.id} value={plugin.id} classNames='pli-3 @md:pli-5 max-bs-dvh overflow-y-auto'>\n <Surface role='settings' data={{ plugin: plugin.id }} />\n </Tabs.Tabpanel>\n ))}\n </Tabs.Viewport>\n </Tabs.Root>\n </Dialog.Content>\n );\n};\n\nconst PluginList = ({ title, plugins }: { title: string; plugins: Plugin['meta'][] }) => {\n return (\n <div role='none'>\n <Tabs.TabGroupHeading classNames={'pli-1 mlb-2 mbs-4 @md:mbs-2'}>{title}</Tabs.TabGroupHeading>\n <div className='flex flex-col ml-1'>\n {plugins.map((plugin) => (\n <Tabs.Tab key={plugin.id} value={plugin.id}>\n {plugin.name}\n </Tabs.Tab>\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren } from 'react';\n\nimport { Input } from '@dxos/react-ui';\n\ntype SettingValueProps = {\n label: string;\n description?: JSX.Element;\n secondary?: JSX.Element;\n};\n\nexport const SettingsValue = ({ label, description, secondary, children }: PropsWithChildren<SettingValueProps>) => {\n const primary = (\n <div role='none' className='flex w-full gap-4 py-1'>\n <Input.Root>\n <div role='none' className='flex flex-col w-full'>\n {/* TODO(burdon): Consistent height for controls (e.g., Select, Textbox, and Checkbox are all different). */}\n <Input.Label classNames='flex min-h-[40px] items-center'>{label}</Input.Label>\n {description && (\n <Input.DescriptionAndValidation classNames='mbs-0.5'>\n <Input.Description>{description}</Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n\n <div role='none'>\n <div role='none' className='flex min-h-[40px] items-center'>\n {children}\n </div>\n </div>\n </Input.Root>\n </div>\n );\n\n if (secondary) {\n // console.log(secondary);\n return (\n <div role='none' className='flex flex-col w-full'>\n {primary}\n {secondary}\n </div>\n );\n }\n\n return primary;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SETTINGS_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [SETTINGS_PLUGIN]: {\n 'open settings label': 'Show settings',\n 'settings dialog title': 'Settings',\n 'back label': 'Back',\n 'click to return to tablist description': 'Click the title to return to the settings menu',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SettingsPlugin } from './SettingsPlugin';\n\nexport default SettingsPlugin;\n\nexport * from './SettingsPlugin';\n\n// TODO(wittjosiah): Remove.\n// Settings should be exposed from plugins as state and intents rather than components.\nexport * from './components';\n"],
5
+ "mappings": ";;;;;;;AAIA,OAAOA,YAAW;AAElB,SAIEC,mBACAC,eACAC,cACAC,sBAGK;AACP,SAASC,yBAAyB;AAClC,SAASC,uBAAkC;;;ACd3C,OAAOC,SAASC,gBAAgB;AAEhC,SAAsBC,SAASC,kBAAkB;AACjD,SAASC,QAAQC,QAAQC,MAAMC,sBAAsB;AACrD,SAASC,YAAiC;AAC1C,SAASC,eAAe;AACxB,SAASC,mBAAmB;AAIrB,IAAMC,iBAAiB,CAAC,EAC7BC,UACAC,WAAU,MAIX;AACC,QAAM,EAAEC,EAAC,IAAKC,eAAeC,eAAAA;AAC7B,QAAM,EAAEC,SAASC,QAAO,IAAKC,WAAAA;AAG7B,QAAMC,OAAO;IACX;IACA;IACA;IACA;IACA;IACA;IACA;;AAGF,QAAMC,aAAa,CAAC,EAAEC,MAAMC,EAAC,GAAoB,EAAED,MAAME,EAAC,MAAuBD,GAAGE,cAAcD,KAAK,EAAA,KAAO;AAE9G,QAAME,cAAcN,KACjBO,IAAI,CAACC,OAAOX,QAAQY,KAAK,CAACC,WAAWA,OAAOC,KAAKH,OAAOA,EAAAA,GAAKG,IAAAA,EAC7DC,OAAOC,WAAAA,EACPC,KAAKb,UAAAA;AAER,QAAMc,kBAAkBjB,QACrBc,OAAO,CAACJ,OAAO,CAACR,KAAKgB,SAASR,EAAAA,CAAAA,EAC9BD,IAAI,CAACC,OAAOX,QAAQY,KAAK,CAACC,WAAWA,OAAOC,KAAKH,OAAOA,EAAAA,CAAAA,EACxDI,OAAO,CAACF,WAAYA,QAAQO,UAAkBC,QAAAA,EAC9CX,IAAI,CAACG,WAAWA,OAAQC,IAAI,EAC5BG,KAAKb,UAAAA;AAER,QAAM,CAACkB,gBAAgBC,iBAAAA,IAAqBC,SAAyB,MAAA;AAErE,SACE,sBAAA,cAACC,OAAOC,SAAO;IAACC,YAAW;KACzB,sBAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAU;KACzB,sBAAA,cAACL,OAAOM,OAAK;IACXC,SAAS,MAAMT,kBAAkB,MAAA;IACjCU,oBAAkBpC,EAAE,wCAAA;IACpB8B,YAAW;KAEX,sBAAA,cAACO,MAAAA;IACCC,MAAK;IACLR,YAAY;MAAC;MAAcS,QAAQ,CAAA;MAAId,mBAAmB,UAAU;;MAEtE,sBAAA,cAACe,QAAAA;IACCP,WACER,mBAAmB,SACf,mGACA;KAGLzB,EAAE,uBAAA,CAAA,CAAA,GAGP,sBAAA,cAAC4B,OAAOa,OAAK;IAACC,SAAAA;KACZ,sBAAA,cAACC,QAAAA;IAAOC,SAAQ;IAAOC,SAAQ;IAAQC,WAAAA;KACrC,sBAAA,cAACT,MAAAA;IAAKC,MAAK;IAAiBS,MAAM;SAKxC,sBAAA,cAACC,KAAKC,MAAI;IACRC,aAAY;IACZC,OAAOrD;IACPsD,eAAe,CAACC,iBAAiBtD,WAAWsD,YAAAA;IAC5CC,YAAY7B;IACZ8B,oBAAoB7B;IACpBI,YAAW;KAEX,sBAAA,cAACkB,KAAKQ,UAAQ;IAAC1B,YAAW;KACxB,sBAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAU;KACzB,sBAAA,cAACe,KAAKS,SAAO;IAAC3B,YAAW;KACvB,sBAAA,cAAC4B,YAAAA;IAAWC,OAAM;IAAUxD,SAASS;MACpCS,gBAAgBuC,SAAS,KAAK,sBAAA,cAACF,YAAAA;IAAWC,OAAM;IAAUxD,SAASkB;QAIvET,YAAYC,IAAI,CAACG,WAChB,sBAAA,cAACgC,KAAKa,UAAQ;IAACC,KAAK9C,OAAOF;IAAIqC,OAAOnC,OAAOF;IAAIgB,YAAW;KAC1D,sBAAA,cAACiC,SAAAA;IAAQ/B,MAAK;IAAWgC,MAAM;MAAEhD,QAAQA,OAAOF;IAAG;QAGtDO,gBAAgBR,IAAI,CAACG,WACpB,sBAAA,cAACgC,KAAKa,UAAQ;IAACC,KAAK9C,OAAOF;IAAIqC,OAAOnC,OAAOF;IAAIgB,YAAW;KAC1D,sBAAA,cAACiC,SAAAA;IAAQ/B,MAAK;IAAWgC,MAAM;MAAEhD,QAAQA,OAAOF;IAAG;;AAOjE;AAEA,IAAM4C,aAAa,CAAC,EAAEC,OAAOxD,QAAO,MAAgD;AAClF,SACE,sBAAA,cAAC4B,OAAAA;IAAIC,MAAK;KACR,sBAAA,cAACgB,KAAKiB,iBAAe;IAACnC,YAAY;KAAgC6B,KAAAA,GAClE,sBAAA,cAAC5B,OAAAA;IAAIE,WAAU;KACZ9B,QAAQU,IAAI,CAACG,WACZ,sBAAA,cAACgC,KAAKkB,KAAG;IAACJ,KAAK9C,OAAOF;IAAIqC,OAAOnC,OAAOF;KACrCE,OAAOR,IAAI,CAAA,CAAA,CAAA;AAMxB;;;ACzHA,OAAO2D,YAAiD;AAExD,SAASC,aAAa;AAQf,IAAMC,gBAAgB,CAAC,EAAEC,OAAOC,aAAaC,WAAWC,SAAQ,MAAwC;AAC7G,QAAMC,UACJ,gBAAAC,OAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAU;KACzB,gBAAAH,OAAA,cAACI,MAAMC,MAAI,MACT,gBAAAL,OAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAU;KAEzB,gBAAAH,OAAA,cAACI,MAAME,OAAK;IAACC,YAAW;KAAkCZ,KAAAA,GACzDC,eACC,gBAAAI,OAAA,cAACI,MAAMI,0BAAwB;IAACD,YAAW;KACzC,gBAAAP,OAAA,cAACI,MAAMK,aAAW,MAAEb,WAAAA,CAAAA,CAAAA,GAK1B,gBAAAI,OAAA,cAACC,OAAAA;IAAIC,MAAK;KACR,gBAAAF,OAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAU;KACxBL,QAAAA,CAAAA,CAAAA,CAAAA;AAOX,MAAID,WAAW;AAEb,WACE,gBAAAG,OAAA,cAACC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;OACxBJ,SACAF,SAAAA;EAGP;AAEA,SAAOE;AACT;;;AC1CA,IAAA,uBAAe;EACb;IACE,SAAS;MACP,CAACW,eAAAA,GAAkB;QACjB,uBAAuB;QACvB,yBAAyB;QACzB,cAAc;QACd,0CAA0C;MAC5C;IACF;EACF;;;;AHQF,IAAMC,iBAAiB;AAchB,IAAMC,iBAAiB,MAAA;AAC5B,QAAMC,WAAW,IAAIC,kBAAyCC,iBAAiB;IAAEC,UAAUL;EAAe,CAAA;AAE1G,SAAO;IACLM;IACAC,OAAO,YAAA;AACLL,eAASM,KAAK;QAAEC,KAAK;QAAYC,MAAMP,kBAAkBQ,OAAM;MAAG,CAAA;IACpE;IACAC,UAAU;MACRC,SAAS;QACPC,WAAW,CAAC,EAAEC,KAAI,MAAE;AAClB,kBAAQA,KAAKD,WAAS;YACpB,KAAK,GAAGV,eAAAA;AACN,qBACE,gBAAAY,OAAA,cAACC,gBAAAA;gBACCZ,UAAUH,SAASgB,OAAOb;gBAC1Bc,YAAY,CAACd,aAAcH,SAASgB,OAAOb,WAAWA;;YAI5D;AACE,qBAAO;UACX;QACF;MACF;MACAe,QAAQ;QACNC,UAAU,CAACD,WAAAA;AACT,kBAAQA,OAAOE,QAAM;YACnB,KAAKC,eAAeC,MAAM;AACxB,kBAAIJ,OAAOL,MAAMU,QAAQ;AACvBvB,yBAASgB,OAAOb,WAAWe,OAAOL,MAAMU;cAC1C;AAEA,qBAAO;gBACLC,SAAS;kBACP;oBACE;sBACEJ,QAAQK,aAAaC;sBACrBb,MAAM;wBACJc,SAAS;wBACTf,WAAW,GAAGV,eAAAA;wBACd0B,kBAAkB;sBACpB;oBACF;;;cAGN;YACF;UACF;QACF;MACF;MACAC,OAAO;QACLC,SAAS,CAACC,YAAAA;AACR,gBAAMC,eAAeC,cAAcF,SAASG,iBAAAA;AAE5C,iBAAOC,gBAAgB;YACrBC,IAAIlC;YACJmC,QAAQ,CAACC,SAA6BA,KAAKF,OAAO;YAClDG,SAAS,MAAM;cACb;gBACEH,IAAIlC;gBACJW,MAAM,YAAA;AACJ,wBAAMmB,cAActB,SAASQ,OAAOsB,SAAS;oBAC3CjB,QAAQrB;oBACRkB,QAAQC,eAAeC;kBACzB,CAAA;gBACF;gBACAmB,YAAY;kBACVC,OAAO;oBAAC;oBAAuB;sBAAEC,IAAIzC;oBAAgB;;kBACrD0C,MAAM;kBACNC,YAAY;oBACVC,OAAO;oBACPC,SAAS;kBACX;gBACF;cACF;;UAEJ,CAAA;QACF;MACF;MACAC;IACF;EACF;AACF;;;AInHA,IAAA,cAAeC;",
6
+ "names": ["React", "parseIntentPlugin", "resolvePlugin", "LayoutAction", "SettingsAction", "LocalStorageStore", "createExtension", "React", "useState", "Surface", "usePlugins", "Button", "Dialog", "Icon", "useTranslation", "Tabs", "getSize", "nonNullable", "SettingsDialog", "selected", "onSelected", "t", "useTranslation", "SETTINGS_PLUGIN", "plugins", "enabled", "usePlugins", "core", "sortPlugin", "name", "a", "b", "localeCompare", "corePlugins", "map", "id", "find", "plugin", "meta", "filter", "nonNullable", "sort", "filteredPlugins", "includes", "provides", "settings", "tabsActivePart", "setTabsActivePart", "useState", "Dialog", "Content", "classNames", "div", "role", "className", "Title", "onClick", "aria-description", "Icon", "icon", "getSize", "span", "Close", "asChild", "Button", "density", "variant", "autoFocus", "size", "Tabs", "Root", "orientation", "value", "onValueChange", "nextSelected", "activePart", "onActivePartChange", "Viewport", "Tablist", "PluginList", "title", "length", "Tabpanel", "key", "Surface", "data", "TabGroupHeading", "Tab", "React", "Input", "SettingsValue", "label", "description", "secondary", "children", "primary", "React", "div", "role", "className", "Input", "Root", "Label", "classNames", "DescriptionAndValidation", "Description", "SETTINGS_PLUGIN", "DEFAULT_PLUGIN", "SettingsPlugin", "settings", "LocalStorageStore", "SETTINGS_PLUGIN", "selected", "meta", "ready", "prop", "key", "type", "string", "provides", "surface", "component", "data", "React", "SettingsDialog", "values", "onSelected", "intent", "resolver", "action", "SettingsAction", "OPEN", "plugin", "intents", "LayoutAction", "SET_LAYOUT", "element", "dialogBlockAlign", "graph", "builder", "plugins", "intentPlugin", "resolvePlugin", "parseIntentPlugin", "createExtension", "id", "filter", "node", "actions", "dispatch", "properties", "label", "ns", "icon", "keyBinding", "macos", "windows", "translations", "SettingsPlugin"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytes":778,"imports":[],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytes":15790,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytes":4471,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/plugin-settings/src/components/index.ts":{"bytes":634,"imports":[{"path":"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx","kind":"import-statement","original":"./SettingsDialog"},{"path":"packages/plugins/plugin-settings/src/components/SettingsValue.tsx","kind":"import-statement","original":"./SettingsValue"}],"format":"esm"},"packages/plugins/plugin-settings/src/translations.ts":{"bytes":1571,"imports":[{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytes":12272,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/plugin-settings/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/plugin-settings/src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/plugins/plugin-settings/src/index.ts":{"bytes":1216,"imports":[{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/SettingsPlugin.tsx","kind":"import-statement","original":"./SettingsPlugin"},{"path":"packages/plugins/plugin-settings/src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"packages/plugins/plugin-settings/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":16978},"packages/plugins/plugin-settings/dist/lib/node-esm/index.mjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/node-esm/chunk-CHPB3YX5.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/local-storage","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-tabs","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["SettingsDialog","SettingsPlugin","SettingsValue","default"],"entryPoint":"packages/plugins/plugin-settings/src/index.ts","inputs":{"packages/plugins/plugin-settings/src/SettingsPlugin.tsx":{"bytesInOutput":2830},"packages/plugins/plugin-settings/src/components/SettingsDialog.tsx":{"bytesInOutput":4430},"packages/plugins/plugin-settings/src/components/index.ts":{"bytesInOutput":0},"packages/plugins/plugin-settings/src/components/SettingsValue.tsx":{"bytesInOutput":1125},"packages/plugins/plugin-settings/src/translations.ts":{"bytesInOutput":318},"packages/plugins/plugin-settings/src/index.ts":{"bytesInOutput":34}},"bytes":9396},"packages/plugins/plugin-settings/dist/lib/node-esm/meta.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/plugin-settings/dist/lib/node-esm/meta.mjs":{"imports":[{"path":"packages/plugins/plugin-settings/dist/lib/node-esm/chunk-CHPB3YX5.mjs","kind":"import-statement"}],"exports":["SETTINGS_PLUGIN","default"],"entryPoint":"packages/plugins/plugin-settings/src/meta.ts","inputs":{},"bytes":257},"packages/plugins/plugin-settings/dist/lib/node-esm/chunk-CHPB3YX5.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":340},"packages/plugins/plugin-settings/dist/lib/node-esm/chunk-CHPB3YX5.mjs":{"imports":[],"exports":["SETTINGS_PLUGIN","meta_default"],"inputs":{"packages/plugins/plugin-settings/src/meta.ts":{"bytesInOutput":96}},"bytes":328}}}
@@ -0,0 +1,10 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ SETTINGS_PLUGIN,
4
+ meta_default
5
+ } from "./chunk-CHPB3YX5.mjs";
6
+ export {
7
+ SETTINGS_PLUGIN,
8
+ meta_default as default
9
+ };
10
+ //# sourceMappingURL=meta.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPlugin.d.ts","sourceRoot":"","sources":["../../../src/SettingsPlugin.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAKpB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAU7B,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAClD,sBAAsB,GACtB,oBAAoB,GACpB,oBAAoB,CAAC;AAMvB;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,gBAAgB,CAAC,sBAAsB,CAoFxE,CAAC"}
1
+ {"version":3,"file":"SettingsPlugin.d.ts","sourceRoot":"","sources":["../../../src/SettingsPlugin.tsx"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAKpB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAU7B,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAClD,sBAAsB,GACtB,oBAAoB,GACpB,oBAAoB,CAAC;AAMvB;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,gBAAgB,CAAC,sBAAsB,CAmFxE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/SettingsDialog.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAUxC,eAAO,MAAM,cAAc,8BAGxB;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,sBAqFA,CAAC"}
1
+ {"version":3,"file":"SettingsDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/SettingsDialog.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAUxC,eAAO,MAAM,cAAc,8BAGxB;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,sBA0FA,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-settings",
3
- "version": "0.6.11",
3
+ "version": "0.6.12-main.568932b",
4
4
  "description": "DXOS app plugin for aggregating and rendering plugin settings.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,14 +10,16 @@
10
10
  ".": {
11
11
  "browser": "./dist/lib/browser/index.mjs",
12
12
  "node": {
13
- "default": "./dist/lib/node/index.cjs"
13
+ "require": "./dist/lib/node/index.cjs",
14
+ "default": "./dist/lib/node-esm/index.mjs"
14
15
  },
15
16
  "types": "./dist/types/src/index.d.ts"
16
17
  },
17
18
  "./meta": {
18
19
  "browser": "./dist/lib/browser/meta.mjs",
19
20
  "node": {
20
- "default": "./dist/lib/node/meta.cjs"
21
+ "require": "./dist/lib/node/meta.cjs",
22
+ "default": "./dist/lib/node-esm/meta.mjs"
21
23
  },
22
24
  "types": "./dist/types/src/meta.d.ts"
23
25
  }
@@ -35,26 +37,26 @@
35
37
  "src"
36
38
  ],
37
39
  "dependencies": {
38
- "@dxos/app-framework": "0.6.11",
39
- "@dxos/local-storage": "0.6.11",
40
- "@dxos/plugin-graph": "0.6.11",
41
- "@dxos/react-ui-tabs": "0.6.11",
42
- "@dxos/util": "0.6.11"
40
+ "@dxos/app-framework": "0.6.12-main.568932b",
41
+ "@dxos/local-storage": "0.6.12-main.568932b",
42
+ "@dxos/util": "0.6.12-main.568932b",
43
+ "@dxos/plugin-graph": "0.6.12-main.568932b",
44
+ "@dxos/react-ui-tabs": "0.6.12-main.568932b"
43
45
  },
44
46
  "devDependencies": {
45
47
  "@phosphor-icons/react": "^2.1.5",
46
48
  "@types/react": "~18.2.0",
47
49
  "react": "~18.2.0",
48
- "vite": "^5.3.4",
49
- "@dxos/react-ui": "0.6.11",
50
- "@dxos/react-ui-theme": "0.6.11",
51
- "@dxos/storybook-utils": "0.6.11"
50
+ "vite": "5.4.7",
51
+ "@dxos/react-ui": "0.6.12-main.568932b",
52
+ "@dxos/storybook-utils": "0.6.12-main.568932b",
53
+ "@dxos/react-ui-theme": "0.6.12-main.568932b"
52
54
  },
53
55
  "peerDependencies": {
54
56
  "@phosphor-icons/react": "^2.1.5",
55
57
  "react": "~18.2.0",
56
- "@dxos/react-ui": "0.6.11",
57
- "@dxos/react-ui-theme": "0.6.11"
58
+ "@dxos/react-ui": "0.6.12-main.568932b",
59
+ "@dxos/react-ui-theme": "0.6.12-main.568932b"
58
60
  },
59
61
  "publishConfig": {
60
62
  "access": "public"
@@ -2,7 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Gear, type IconProps } from '@phosphor-icons/react';
6
5
  import React from 'react';
7
6
 
8
7
  import {
@@ -106,8 +105,7 @@ export const SettingsPlugin = (): PluginDefinition<SettingsPluginProvides> => {
106
105
  },
107
106
  properties: {
108
107
  label: ['open settings label', { ns: SETTINGS_PLUGIN }],
109
- icon: (props: IconProps) => <Gear {...props} />,
110
- iconSymbol: 'ph--gear--regular',
108
+ icon: 'ph--gear--regular',
111
109
  keyBinding: {
112
110
  macos: 'meta+,',
113
111
  windows: 'alt+,',
@@ -33,14 +33,19 @@ export const SettingsDialog = ({
33
33
  'dxos.org/plugin/registry',
34
34
  ];
35
35
 
36
- const corePlugins = core.map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta).filter(nonNullable);
36
+ const sortPlugin = ({ name: a }: Plugin['meta'], { name: b }: Plugin['meta']) => a?.localeCompare(b ?? '') ?? 0;
37
+
38
+ const corePlugins = core
39
+ .map((id) => plugins.find((plugin) => plugin.meta.id === id)?.meta)
40
+ .filter(nonNullable)
41
+ .sort(sortPlugin);
37
42
 
38
43
  const filteredPlugins = enabled
39
44
  .filter((id) => !core.includes(id))
40
45
  .map((id) => plugins.find((plugin) => plugin.meta.id === id))
41
46
  .filter((plugin) => (plugin?.provides as any)?.settings)
42
47
  .map((plugin) => plugin!.meta)
43
- .sort(({ name: a }, { name: b }) => a?.localeCompare(b ?? '') ?? 0);
48
+ .sort(sortPlugin);
44
49
 
45
50
  const [tabsActivePart, setTabsActivePart] = useState<TabsActivePart>('list');
46
51
 
@@ -83,9 +88,9 @@ export const SettingsDialog = ({
83
88
  >
84
89
  <Tabs.Viewport classNames='flex-1 min-bs-0'>
85
90
  <div role='none' className='overflow-y-auto pli-3 @md:pis-2 @md:pie-0 mbe-4 border-r border-separator'>
86
- <Tabs.Tablist classNames='max-bs-none overflow-y-visible'>
91
+ <Tabs.Tablist classNames='flex flex-col gap-4 max-bs-none overflow-y-visible'>
87
92
  <PluginList title='Options' plugins={corePlugins} />
88
- {filteredPlugins.length > 0 && <PluginList title='Plugins' plugins={filteredPlugins} gap />}
93
+ {filteredPlugins.length > 0 && <PluginList title='Plugins' plugins={filteredPlugins} />}
89
94
  </Tabs.Tablist>
90
95
  </div>
91
96
 
@@ -105,15 +110,17 @@ export const SettingsDialog = ({
105
110
  );
106
111
  };
107
112
 
108
- const PluginList = ({ title, plugins, gap }: { title: string; plugins: Plugin['meta'][]; gap?: boolean }) => {
113
+ const PluginList = ({ title, plugins }: { title: string; plugins: Plugin['meta'][] }) => {
109
114
  return (
110
- <>
111
- <Tabs.TabGroupHeading classNames={gap ? 'mbs-4' : 'mbs-4 @md:mbs-2'}>{title}</Tabs.TabGroupHeading>
112
- {plugins.map((plugin) => (
113
- <Tabs.Tab key={plugin.id} value={plugin.id}>
114
- {plugin.name}
115
- </Tabs.Tab>
116
- ))}
117
- </>
115
+ <div role='none'>
116
+ <Tabs.TabGroupHeading classNames={'pli-1 mlb-2 mbs-4 @md:mbs-2'}>{title}</Tabs.TabGroupHeading>
117
+ <div className='flex flex-col ml-1'>
118
+ {plugins.map((plugin) => (
119
+ <Tabs.Tab key={plugin.id} value={plugin.id}>
120
+ {plugin.name}
121
+ </Tabs.Tab>
122
+ ))}
123
+ </div>
124
+ </div>
118
125
  );
119
126
  };