@stubber/ui 1.7.3 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/components/PrimaryButton.svelte.d.ts +2 -2
  2. package/dist/components/input/input.svelte +1 -2
  3. package/dist/composites/account-menu/account-menu.svelte +100 -0
  4. package/dist/composites/account-menu/account-menu.svelte.d.ts +37 -0
  5. package/dist/composites/account-menu/index.d.ts +2 -0
  6. package/dist/composites/account-menu/index.js +2 -0
  7. package/dist/composites/app-switcher/app-switcher.svelte +40 -0
  8. package/dist/composites/app-switcher/app-switcher.svelte.d.ts +20 -0
  9. package/dist/composites/app-switcher/index.d.ts +2 -0
  10. package/dist/composites/app-switcher/index.js +2 -0
  11. package/dist/composites/org-switcher/index.d.ts +2 -0
  12. package/dist/composites/org-switcher/index.js +2 -0
  13. package/dist/{components/OrgSwitcher.svelte → composites/org-switcher/org-switcher.svelte} +6 -6
  14. package/dist/index.d.ts +0 -3
  15. package/dist/index.js +0 -3
  16. package/package.json +5 -1
  17. package/dist/components/NavProfile.svelte +0 -70
  18. package/dist/components/NavProfile.svelte.d.ts +0 -31
  19. package/dist/components/OrgSwitcherNew.svelte +0 -213
  20. package/dist/components/OrgSwitcherNew.svelte.d.ts +0 -35
  21. package/dist/components/ProfileMenu.svelte +0 -58
  22. package/dist/components/ProfileMenu.svelte.d.ts +0 -37
  23. package/dist/components/input-new/index.d.ts +0 -23
  24. package/dist/components/input-new/index.js +0 -4
  25. package/dist/components/input-new/input.svelte +0 -32
  26. package/dist/components/input-new/input.svelte.d.ts +0 -14
  27. package/dist/{components/OrgSwitcher.svelte.d.ts → composites/org-switcher/org-switcher.svelte.d.ts} +2 -2
@@ -6,9 +6,9 @@ export default class PrimaryButton extends SvelteComponent<{
6
6
  color?: string | undefined;
7
7
  variant?: string | undefined;
8
8
  icon?: string | undefined;
9
- width?: string | undefined;
10
9
  disabled?: boolean | undefined;
11
10
  type?: string | undefined;
11
+ width?: string | undefined;
12
12
  }, {
13
13
  mouseout: MouseEvent;
14
14
  mouseover: MouseEvent;
@@ -29,9 +29,9 @@ declare const __propDef: {
29
29
  color?: string | undefined;
30
30
  variant?: string | undefined;
31
31
  icon?: string | undefined;
32
- width?: string | undefined;
33
32
  disabled?: boolean | undefined;
34
33
  type?: string | undefined;
34
+ width?: string | undefined;
35
35
  };
36
36
  events: {
37
37
  mouseout: MouseEvent;
@@ -7,10 +7,9 @@ export let readonly = void 0;
7
7
 
8
8
  <input
9
9
  class={cn(
10
- "border-input bg-white bg-opacity-[15] ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex h-10 w-full rounded-md border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
10
+ "border-input bg-background selection:bg-primary dark:bg-input/30 selection:text-primary-foreground ring-offset-background placeholder:text-muted-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base outline-none transition-[color,box-shadow] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-[invalid]:border-destructive aria-[invalid]:ring-destructive/50 aria-[invalid]:focus-visible:ring-destructive/50",
11
11
  className
12
12
  )}
13
- style="box-shadow: inset 0px 16px 16px -16px rgba(0, 0, 0, 0.1333);"
14
13
  bind:value
15
14
  {readonly}
16
15
  on:blur
@@ -0,0 +1,100 @@
1
+ <script>
2
+ import { Button } from "../../components/button/index";
3
+ import * as Popover from "../../components/popover/index";
4
+ import { badgeVariants } from "../../components/badge/index";
5
+ import Tooltip from "../../components/Tooltip.svelte";
6
+ import StubberIcon from "../../assets/stubber-icon.svg";
7
+ import DocsIcon from "../../assets/docs-icon.svg";
8
+ import { createEventDispatcher } from "svelte";
9
+
10
+ export let avatarUrl = "";
11
+ export let profileName = "";
12
+ export let stubberhandle = "";
13
+ export let settingsUrl = "";
14
+
15
+ const dispatch = createEventDispatcher();
16
+
17
+ let tooltip = "Copy stubberhandle";
18
+
19
+ function handle_copy_stubberhandle() {
20
+ navigator.clipboard.writeText(stubberhandle);
21
+ dispatch("copied", { stubberhandle });
22
+ tooltip = "Copied!";
23
+ setTimeout(() => {
24
+ tooltip = "Copy stubberhandle";
25
+ }, 2000);
26
+ }
27
+ </script>
28
+
29
+ <Popover.Root>
30
+ <Popover.Trigger asChild let:builder>
31
+ <Button builders={[builder]} variant="ghost" class="h-full aspect-square">
32
+ {#if avatarUrl}
33
+ <img
34
+ class="rounded-full w-7 h-7 object-cover"
35
+ src={avatarUrl}
36
+ alt=""
37
+ width="28"
38
+ height="28"
39
+ />
40
+ {:else}
41
+ <img
42
+ class="rounded-full"
43
+ src={`https://ui-avatars.com/api/?name=${profileName}&background=3b82f6&color=fff`}
44
+ width="28px"
45
+ alt=""
46
+ />
47
+ {/if}
48
+ </Button>
49
+ </Popover.Trigger>
50
+ <Popover.Content class="w-auto p-0">
51
+ <div class="w-[230px] border border-surface-100 rounded-lg">
52
+ <div class="p-2 pt-6 bg-surface-50 flex flex-col gap-4 items-center rounded-t-lg">
53
+ <img width="25px" src={StubberIcon} alt="stubber" />
54
+ <h3 class="text-lg text-surface-900">{profileName}</h3>
55
+ <Tooltip>
56
+ <span slot="subject">
57
+ <button
58
+ on:click={handle_copy_stubberhandle}
59
+ class="${badgeVariants({
60
+ variant: 'outline',
61
+ })} focus:ring-transparent border-primary text-primary"
62
+ >
63
+ {stubberhandle}
64
+ </button>
65
+ </span>
66
+ <span slot="tooltip">{tooltip}</span>
67
+ </Tooltip>
68
+
69
+ <Button href={settingsUrl} target="_blank" variant="link" class="w-full">
70
+ Personal Settings
71
+ </Button>
72
+ </div>
73
+ <div class="p-2.5 bg-white border-b border-surface-100">
74
+ <Button
75
+ variant="ghost"
76
+ href="https://docs.stubber.com"
77
+ target="_blank"
78
+ class="w-full flex items-center justify-start h-[40px] space-x-3 text-surface-900 hover:bg-surface-50 rounded-lg px-4"
79
+ >
80
+ <div class="flex justify-center items-center w-5 h-5">
81
+ <img height="16px" src={DocsIcon} alt="stubber docs" />
82
+ </div>
83
+ Documentation
84
+ </Button>
85
+ </div>
86
+ <div class="p-2.5 bg-white rounded-b-lg">
87
+ <Button
88
+ variant="ghost"
89
+ on:click={() => dispatch("logout")}
90
+ class="w-full flex items-center justify-start h-[40px] space-x-3 text-surface-900 hover:bg-surface-50 rounded-lg px-4"
91
+ >
92
+ <div class="flex justify-center items-center w-5 h-5">
93
+ <i class="far fa-arrow-right-from-bracket" />
94
+ </div>
95
+ Log out
96
+ </Button>
97
+ </div>
98
+ </div>
99
+ </Popover.Content>
100
+ </Popover.Root>
@@ -0,0 +1,37 @@
1
+ /** @typedef {typeof __propDef.props} AccountMenuProps */
2
+ /** @typedef {typeof __propDef.events} AccountMenuEvents */
3
+ /** @typedef {typeof __propDef.slots} AccountMenuSlots */
4
+ export default class AccountMenu extends SvelteComponent<{
5
+ avatarUrl?: string | undefined;
6
+ profileName?: string | undefined;
7
+ stubberhandle?: string | undefined;
8
+ settingsUrl?: string | undefined;
9
+ }, {
10
+ logout: CustomEvent<any>;
11
+ copied: CustomEvent<any>;
12
+ } & {
13
+ [evt: string]: CustomEvent<any>;
14
+ }, {}> {
15
+ }
16
+ export type AccountMenuProps = typeof __propDef.props;
17
+ export type AccountMenuEvents = typeof __propDef.events;
18
+ export type AccountMenuSlots = typeof __propDef.slots;
19
+ import { SvelteComponent } from "svelte";
20
+ declare const __propDef: {
21
+ props: {
22
+ avatarUrl?: string | undefined;
23
+ profileName?: string | undefined;
24
+ stubberhandle?: string | undefined;
25
+ settingsUrl?: string | undefined;
26
+ };
27
+ events: {
28
+ logout: CustomEvent<any>;
29
+ copied: CustomEvent<any>;
30
+ } & {
31
+ [evt: string]: CustomEvent<any>;
32
+ };
33
+ slots: {};
34
+ exports?: undefined;
35
+ bindings?: undefined;
36
+ };
37
+ export {};
@@ -0,0 +1,2 @@
1
+ import AccountMenu from "./account-menu.svelte";
2
+ export { AccountMenu };
@@ -0,0 +1,2 @@
1
+ import AccountMenu from "./account-menu.svelte";
2
+ export { AccountMenu };
@@ -0,0 +1,40 @@
1
+ <script>import { Button } from "../../components/button/index";
2
+ import * as Popover from "../../components/popover/index";
3
+ export let consoleOrigin = "";
4
+ export let stubsOrigin = "";
5
+ export let builderOrigin = "";
6
+ let stubsUrl = `${stubsOrigin}/_/inbox/assigned`;
7
+ let consoleUrl = `${consoleOrigin}/_/contacts`;
8
+ let builderUrl = `${builderOrigin}/_/drive/folders`;
9
+ </script>
10
+
11
+ <Popover.Root>
12
+ <Popover.Trigger asChild let:builder>
13
+ <Button builders={[builder]} variant="ghost" class="h-full aspect-square">
14
+ <i class="fa-lg fa-fw fa-solid fa-grid-2 text-surface-700" />
15
+ </Button>
16
+ </Popover.Trigger>
17
+ <Popover.Content class="w-auto p-5 space-y-2">
18
+ <!-- Stubs -->
19
+ <Button href={stubsUrl} class="h-20 w-20" variant="ghost">
20
+ <div class="flex flex-col items-center space-y-2 text-surface-700">
21
+ <i class="fa-regular fa-list-tree fa-2x" />
22
+ <p class="text-label">Stubs</p>
23
+ </div>
24
+ </Button>
25
+ <!-- Console -->
26
+ <Button href={consoleUrl} class="h-20 w-20" variant="ghost">
27
+ <div class="flex flex-col items-center space-y-2 text-surface-700">
28
+ <i class="fa-solid fa-sliders-simple fa-2x" />
29
+ <p class="text-label">Console</p>
30
+ </div>
31
+ </Button>
32
+ <!-- Builder -->
33
+ <Button href={builderUrl} class="h-20 w-20" variant="ghost">
34
+ <div class="flex flex-col items-center space-y-2 text-surface-700">
35
+ <i class="fa-regular fa-diagram-subtask fa-2x" />
36
+ <p class="text-label">Builder</p>
37
+ </div>
38
+ </Button>
39
+ </Popover.Content>
40
+ </Popover.Root>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ consoleOrigin?: string;
5
+ stubsOrigin?: string;
6
+ builderOrigin?: string;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ exports?: {} | undefined;
13
+ bindings?: string | undefined;
14
+ };
15
+ export type AppSwitcherProps = typeof __propDef.props;
16
+ export type AppSwitcherEvents = typeof __propDef.events;
17
+ export type AppSwitcherSlots = typeof __propDef.slots;
18
+ export default class AppSwitcher extends SvelteComponent<AppSwitcherProps, AppSwitcherEvents, AppSwitcherSlots> {
19
+ }
20
+ export {};
@@ -0,0 +1,2 @@
1
+ import AppSwitcher from "./app-switcher.svelte";
2
+ export { AppSwitcher };
@@ -0,0 +1,2 @@
1
+ import AppSwitcher from "./app-switcher.svelte";
2
+ export { AppSwitcher };
@@ -0,0 +1,2 @@
1
+ import OrgSwitcher from "./org-switcher.svelte";
2
+ export { OrgSwitcher };
@@ -0,0 +1,2 @@
1
+ import OrgSwitcher from "./org-switcher.svelte";
2
+ export { OrgSwitcher };
@@ -2,10 +2,10 @@
2
2
  import { createEventDispatcher, tick } from "svelte";
3
3
  import { slide } from "svelte/transition";
4
4
  import { quintOut } from "svelte/easing";
5
- import * as Popover from "./popover/index";
6
- import * as Command from "./command/index";
7
- import * as Tooltip from "./tooltip/index";
8
- import { Button } from "./button/index";
5
+ import * as Popover from "../../components/popover/index";
6
+ import * as Command from "../../components/command/index";
7
+ import * as Tooltip from "../../components/tooltip/index";
8
+ import { Button } from "../../components/button/index";
9
9
  import { toast } from "svelte-sonner";
10
10
 
11
11
  export let orgs = [];
@@ -28,7 +28,7 @@
28
28
 
29
29
  // Filter orgs based on search
30
30
  $: filteredOrgs = orgs.filter((org) =>
31
- org.label.toLowerCase().includes(searchValue.toLowerCase())
31
+ org.label.toLowerCase().includes(searchValue.toLowerCase()),
32
32
  );
33
33
 
34
34
  function selectOrg(orguuid) {
@@ -140,7 +140,7 @@
140
140
  <Command.Input placeholder="Search organizations..." bind:value={searchValue} />
141
141
  <Command.Empty>No organizations found.</Command.Empty>
142
142
  <Command.Group class="max-h-80 overflow-y-auto">
143
- {#each filteredOrgs as org}
143
+ {#each filteredOrgs as org (org.orguuid)}
144
144
  <div class="relative group">
145
145
  <Command.Item
146
146
  value={org.orguuid}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,5 @@
1
1
  export { default as HorizontalTabs } from "./components/HorizontalTabs.svelte";
2
- export { default as ProfileMenu } from "./components/ProfileMenu.svelte";
3
2
  export { default as Breadcrumbs } from "./components/Breadcrumbs.svelte";
4
- export { default as OrgSwitcher } from "./components/OrgSwitcher.svelte";
5
- export { default as OrgSwitcherNew } from "./components/OrgSwitcherNew.svelte";
6
3
  export { default as Checkbox } from "./components/fields/Checkbox.svelte";
7
4
  export { default as Radio } from "./components/fields/Radio.svelte";
8
5
  export { default as SideNavItem } from "./components/SideNav/SideNavItem.svelte";
package/dist/index.js CHANGED
@@ -4,10 +4,7 @@
4
4
  // export { default as IconButton } from "./components/IconButton.svelte";
5
5
  // export { default as Chip } from "./components/Chip.svelte";
6
6
  export { default as HorizontalTabs } from "./components/HorizontalTabs.svelte";
7
- export { default as ProfileMenu } from "./components/ProfileMenu.svelte";
8
7
  export { default as Breadcrumbs } from "./components/Breadcrumbs.svelte";
9
- export { default as OrgSwitcher } from "./components/OrgSwitcher.svelte";
10
- export { default as OrgSwitcherNew } from "./components/OrgSwitcherNew.svelte";
11
8
  export { default as Checkbox } from "./components/fields/Checkbox.svelte";
12
9
  export { default as Radio } from "./components/fields/Radio.svelte";
13
10
  export { default as SideNavItem } from "./components/SideNav/SideNavItem.svelte";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stubber/ui",
3
- "version": "1.7.3",
3
+ "version": "1.8.1",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && pnpm run package && node ./fix_dts_imports.js",
@@ -23,6 +23,10 @@
23
23
  "./*": {
24
24
  "types": "./dist/components/*/index.d.ts",
25
25
  "svelte": "./dist/components/*/index.js"
26
+ },
27
+ "./composites/*": {
28
+ "types": "./dist/composites/*/index.d.ts",
29
+ "svelte": "./dist/composites/*/index.js"
26
30
  }
27
31
  },
28
32
  "files": [
@@ -1,70 +0,0 @@
1
- <script>
2
- import { createEventDispatcher } from "svelte";
3
- import { clickOutside } from "../utils/actions.js";
4
-
5
- export let avatarLink = "";
6
- export let manageLink = "";
7
-
8
- const dispatch = createEventDispatcher();
9
-
10
- //states
11
- let isMenu = false;
12
-
13
- const toggleMenu = () => {
14
- isMenu = !isMenu;
15
- };
16
-
17
- function closeMenu() {
18
- if (isMenu) {
19
- isMenu = false;
20
- }
21
- }
22
- </script>
23
-
24
- <button
25
- use:clickOutside={closeMenu}
26
- on:click={toggleMenu}
27
- id="user-profile-btn"
28
- class="h-full aspect-square flex items-center justify-center hover:bg-surface-100 focus:bg-surface-50"
29
- >
30
- <div
31
- class="rounded-full {isMenu ? 'outline outline-2 outline-offset-1 outline-primary-100' : ''}"
32
- >
33
- {#if avatarLink}
34
- <img class="rounded-full" src={avatarLink} width="28px" alt="" />
35
- {:else}
36
- <div class="h-9 aspect-square bg-surface-100 rounded-full text-center" />
37
- {/if}
38
- </div>
39
- </button>
40
-
41
- <!-- Menu -->
42
- {#if isMenu}
43
- <div
44
- class="absolute z-20 divide-y top-[49px] right-0 w-60 border border-surface-200 bg-surface-0 shadow-md rounded-b-md"
45
- on:click={(e) => {
46
- e.stopImmediatePropagation();
47
- }}
48
- on:keypress={(e) => {
49
- e.stopImmediatePropagation();
50
- }}
51
- >
52
- <div>
53
- <a
54
- href={manageLink}
55
- class="w-full px-4 py-3 space-x-2 flex flex-row items-center text-left text-surface-700 hover:text-surface-900 focus:text-surface-700 hover:bg-surface-100 focus:outline-none focus:bg-surface-100"
56
- >
57
- <i class="fa-regular fa-lg fa-fw fa-cog" />
58
- <p class="text-button">Settings</p>
59
- </a>
60
- </div>
61
- <button
62
- on:click={dispatch("logout")}
63
- id="logout-btn"
64
- class="w-full px-4 py-3 space-x-2 flex flex-row items-center text-left text-surface-700 hover:text-surface-900 focus:text-surface-700 hover:bg-surface-100 focus:outline-none focus:bg-surface-100"
65
- >
66
- <i class="fa-regular fa-lg fa-fw fa-right-from-bracket" />
67
- <p class="text-button">Logout</p>
68
- </button>
69
- </div>
70
- {/if}
@@ -1,31 +0,0 @@
1
- /** @typedef {typeof __propDef.props} NavProfileProps */
2
- /** @typedef {typeof __propDef.events} NavProfileEvents */
3
- /** @typedef {typeof __propDef.slots} NavProfileSlots */
4
- export default class NavProfile extends SvelteComponent<{
5
- manageLink?: string | undefined;
6
- avatarLink?: string | undefined;
7
- }, {
8
- logout: CustomEvent<any>;
9
- } & {
10
- [evt: string]: CustomEvent<any>;
11
- }, {}> {
12
- }
13
- export type NavProfileProps = typeof __propDef.props;
14
- export type NavProfileEvents = typeof __propDef.events;
15
- export type NavProfileSlots = typeof __propDef.slots;
16
- import { SvelteComponent } from "svelte";
17
- declare const __propDef: {
18
- props: {
19
- manageLink?: string | undefined;
20
- avatarLink?: string | undefined;
21
- };
22
- events: {
23
- logout: CustomEvent<any>;
24
- } & {
25
- [evt: string]: CustomEvent<any>;
26
- };
27
- slots: {};
28
- exports?: undefined;
29
- bindings?: undefined;
30
- };
31
- export {};
@@ -1,213 +0,0 @@
1
- <script>
2
- import { createEventDispatcher, tick } from "svelte";
3
- import * as Popover from "./popover/index";
4
- import * as Command from "./command/index";
5
- import * as Tooltip from "./tooltip/index";
6
- import { Button } from "./button/index";
7
- import { toast } from "svelte-sonner";
8
-
9
- export let orgs = [];
10
- export let selectedorguuid = undefined;
11
- export let createOrgLink = "";
12
- export let loading = false;
13
-
14
- $: selectedOrg = orgs.find((org) => org.orguuid === selectedorguuid);
15
-
16
- const dispatch = createEventDispatcher();
17
- const alertColorMap = {
18
- error: "danger-500",
19
- warning: "warning-500",
20
- success: "success-500",
21
- };
22
-
23
- // Combobox state
24
- let open = false;
25
- let searchValue = "";
26
-
27
- // Filter orgs based on search
28
- $: filteredOrgs = orgs.filter((org) =>
29
- org.label.toLowerCase().includes(searchValue.toLowerCase())
30
- );
31
-
32
- function selectOrg(orguuid) {
33
- dispatch("selectOrg", orguuid);
34
- }
35
-
36
- function closeAndFocusTrigger(triggerId) {
37
- open = false;
38
- searchValue = "";
39
- tick().then(() => {
40
- document.getElementById(triggerId)?.focus();
41
- });
42
- }
43
-
44
- function copyToClipboard(uuid, event) {
45
- if (event) {
46
- event.stopPropagation();
47
- event.preventDefault();
48
- }
49
- navigator.clipboard.writeText(uuid);
50
- toast.success("UUID copied to clipboard!");
51
- }
52
- </script>
53
-
54
- <Popover.Root bind:open let:ids>
55
- <Popover.Trigger asChild let:builder>
56
- <Button
57
- builders={[builder]}
58
- id={ids.trigger}
59
- variant="outline"
60
- role="combobox"
61
- aria-expanded={open}
62
- class="w-full sm:w-[280px] pl-3 pr-3 py-2 h-auto border-surface-100 transition-colors group justify-start"
63
- >
64
- <div class="flex items-center w-full">
65
- <div class="flex items-center justify-center mr-3">
66
- {#if selectedOrg?.filesrc && !loading}
67
- <img
68
- class="h-[25px] w-[25px] object-cover rounded-full"
69
- src={selectedOrg.filesrc}
70
- alt={selectedOrg.label}
71
- />
72
- {:else if selectedOrg?.placeholderColor}
73
- <div
74
- class="h-[25px] w-[25px] rounded-full"
75
- style="background-color: {selectedOrg.placeholderColor}"
76
- />
77
- {:else}
78
- <div class="h-[25px] w-[25px] rounded-full bg-surface-100" />
79
- {/if}
80
- </div>
81
-
82
- {#if loading}
83
- <span class="h-[25px] w-40 bg-surface-100 rounded-md" />
84
- {:else}
85
- <div class="w-full text-left truncate">
86
- <p class="text-label text-surface-900 truncate">
87
- {selectedOrg?.label ?? "No Org"}
88
- </p>
89
- {#if selectedOrg?.alert}
90
- <div class="flex items-center space-x-1">
91
- <span
92
- class="h-[6px] w-[6px] bg-{alertColorMap[selectedOrg.alert?.type]} rounded-full"
93
- />
94
- <p class="text-small italic text-{alertColorMap[selectedOrg.alert?.type]}">
95
- {selectedOrg.alert?.message}
96
- </p>
97
- </div>
98
- {/if}
99
- </div>
100
- {/if}
101
-
102
- {#if selectedOrg}
103
- <Tooltip.Root openDelay={0} disableHoverableContent={true}>
104
- <Tooltip.Trigger>
105
- <div
106
- class="opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity ml-2 mr-2"
107
- >
108
- <i
109
- role="button"
110
- tabindex="0"
111
- on:click={(e) => {
112
- e.stopPropagation();
113
- copyToClipboard(selectedOrg.orguuid, e);
114
- }}
115
- on:keydown={(e) => {
116
- if (e.key === "Enter" || e.key === " ") {
117
- e.stopPropagation();
118
- copyToClipboard(selectedOrg.orguuid, e);
119
- }
120
- }}
121
- class="far fa-copy text-surface-400 cursor-pointer"
122
- />
123
- </div>
124
- </Tooltip.Trigger>
125
- <Tooltip.Content>Copy UUID</Tooltip.Content>
126
- </Tooltip.Root>
127
- {/if}
128
- </div>
129
- </Button>
130
- </Popover.Trigger>
131
-
132
- <Popover.Content class="w-full sm:w-[280px] p-0">
133
- <Command.Root shouldFilter={false}>
134
- <Command.Input placeholder="Search organizations..." bind:value={searchValue} />
135
- <Command.Empty>No organizations found.</Command.Empty>
136
- <Command.Group>
137
- {#each filteredOrgs as org}
138
- <div class="relative group">
139
- <Command.Item
140
- value={org.orguuid}
141
- onSelect={() => {
142
- selectOrg(org.orguuid);
143
- closeAndFocusTrigger(ids.trigger);
144
- }}
145
- class="pr-12"
146
- >
147
- <div class="flex items-center w-full">
148
- <div class="flex items-center justify-center mr-3">
149
- {#if org.filesrc}
150
- <img
151
- class="h-[25px] w-[25px] object-cover rounded-full"
152
- src={org.filesrc}
153
- alt={org.label}
154
- />
155
- {:else if org.placeholderColor}
156
- <div
157
- class="h-[25px] w-[25px] rounded-full"
158
- style="background-color: {org.placeholderColor}"
159
- />
160
- {:else}
161
- <div class="h-[25px] w-[25px] rounded-full bg-surface-100" />
162
- {/if}
163
- </div>
164
-
165
- <div class="flex-1 text-left">
166
- <p class="text-label text-surface-900">
167
- {org.label}
168
- </p>
169
- {#if org.alert}
170
- <div class="flex items-center space-x-1">
171
- <span
172
- class="h-[6px] w-[6px] bg-{alertColorMap[org.alert.type]} rounded-full"
173
- />
174
- <p class="text-small italic text-{alertColorMap[org.alert.type]}">
175
- {org.alert?.message}
176
- </p>
177
- </div>
178
- {/if}
179
- </div>
180
- </div>
181
- </Command.Item>
182
-
183
- <!-- Copy button positioned absolutely -->
184
- <div class="absolute right-2 top-1/2 -translate-y-1/2">
185
- <Button
186
- variant="ghost"
187
- size="icon"
188
- class="h-8 w-8 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity"
189
- on:click={(e) => {
190
- e.stopPropagation();
191
- copyToClipboard(org.orguuid, e);
192
- }}
193
- >
194
- <i class="far fa-copy text-surface-400" />
195
- </Button>
196
- </div>
197
- </div>
198
- {/each}
199
- </Command.Group>
200
-
201
- {#if createOrgLink}
202
- <Command.Separator />
203
- <a
204
- href={createOrgLink}
205
- class="flex items-center px-8 py-2 text-sm text-primary-500 hover:bg-accent rounded-sm"
206
- >
207
- <i class="far fa-plus mr-2" />
208
- <span>Create org</span>
209
- </a>
210
- {/if}
211
- </Command.Root>
212
- </Popover.Content>
213
- </Popover.Root>
@@ -1,35 +0,0 @@
1
- /** @typedef {typeof __propDef.props} OrgSwitcherNewProps */
2
- /** @typedef {typeof __propDef.events} OrgSwitcherNewEvents */
3
- /** @typedef {typeof __propDef.slots} OrgSwitcherNewSlots */
4
- export default class OrgSwitcherNew extends SvelteComponent<{
5
- orgs?: any[] | undefined;
6
- selectedorguuid?: any;
7
- createOrgLink?: string | undefined;
8
- loading?: boolean | undefined;
9
- }, {
10
- selectOrg: CustomEvent<any>;
11
- } & {
12
- [evt: string]: CustomEvent<any>;
13
- }, {}> {
14
- }
15
- export type OrgSwitcherNewProps = typeof __propDef.props;
16
- export type OrgSwitcherNewEvents = typeof __propDef.events;
17
- export type OrgSwitcherNewSlots = typeof __propDef.slots;
18
- import { SvelteComponent } from "svelte";
19
- declare const __propDef: {
20
- props: {
21
- orgs?: any[] | undefined;
22
- selectedorguuid?: any;
23
- createOrgLink?: string | undefined;
24
- loading?: boolean | undefined;
25
- };
26
- events: {
27
- selectOrg: CustomEvent<any>;
28
- } & {
29
- [evt: string]: CustomEvent<any>;
30
- };
31
- slots: {};
32
- exports?: undefined;
33
- bindings?: undefined;
34
- };
35
- export {};
@@ -1,58 +0,0 @@
1
- <script>
2
- import StubberIcon from "../assets/stubber-icon.svg";
3
- import DocsIcon from "../assets/docs-icon.svg";
4
- import PrimaryButton from "./PrimaryButton.svelte";
5
- import Chip from "./Chip.svelte";
6
- import { createEventDispatcher } from "svelte";
7
- import Tooltip from "./Tooltip.svelte";
8
-
9
- export let manageLink = "";
10
- export let documentationLink = "";
11
- export let profileName = "";
12
- export let stubberhandle = "";
13
-
14
- const dispatch = createEventDispatcher();
15
- </script>
16
-
17
- <div class="w-[230px] [&>*]:w-full border border-surface-100 rounded-lg">
18
- <div class="p-2.5 bg-surface-50 flex flex-col items-center rounded-t-lg">
19
- <img class="mt-5 mb-[23px]" width="25px" src={StubberIcon} alt="stubber" />
20
- <h3 class="mb-2 text-heading-6 font-normal text-center text-surface-900">{profileName}</h3>
21
- <Tooltip>
22
- <span slot="subject">
23
- <Chip
24
- on:click={() => dispatch("copystubberhandle")}
25
- label={stubberhandle}
26
- color="success"
27
- />
28
- </span>
29
- <span slot="tooltip"> Copy stubberhandle </span>
30
- </Tooltip>
31
- <a class="mt-[17px] w-full" href={manageLink}>
32
- <PrimaryButton label="Personal Settings" variant="secondary-transparent" width="full" />
33
- </a>
34
- </div>
35
- <a href={documentationLink}>
36
- <div class="p-2.5 bg-white border-b border-surface-100">
37
- <button
38
- class="w-full flex items-center h-[40px] space-x-4 text-surface-900 hover:bg-surface-50 rounded-lg"
39
- >
40
- <button class="h-10 flex justify-center items-center aspect-square">
41
- <img height="16px" src={DocsIcon} alt="stubber docs" />
42
- </button>
43
- <span class="text-button font-normal">Documentation</span>
44
- </button>
45
- </div>
46
- </a>
47
- <div class="p-2.5 bg-white rounded-b-lg">
48
- <button
49
- on:click={() => dispatch("logout")}
50
- class="w-full flex items-center h-[40px] space-x-4 text-surface-900 hover:bg-surface-50 rounded-lg"
51
- >
52
- <button class="h-10 aspect-square">
53
- <i class="far fa-arrow-right-from-bracket" />
54
- </button>
55
- <span class="text-button font-normal">Log out</span>
56
- </button>
57
- </div>
58
- </div>
@@ -1,37 +0,0 @@
1
- /** @typedef {typeof __propDef.props} ProfileMenuProps */
2
- /** @typedef {typeof __propDef.events} ProfileMenuEvents */
3
- /** @typedef {typeof __propDef.slots} ProfileMenuSlots */
4
- export default class ProfileMenu extends SvelteComponent<{
5
- manageLink?: string | undefined;
6
- documentationLink?: string | undefined;
7
- profileName?: string | undefined;
8
- stubberhandle?: string | undefined;
9
- }, {
10
- copystubberhandle: CustomEvent<any>;
11
- logout: CustomEvent<any>;
12
- } & {
13
- [evt: string]: CustomEvent<any>;
14
- }, {}> {
15
- }
16
- export type ProfileMenuProps = typeof __propDef.props;
17
- export type ProfileMenuEvents = typeof __propDef.events;
18
- export type ProfileMenuSlots = typeof __propDef.slots;
19
- import { SvelteComponent } from "svelte";
20
- declare const __propDef: {
21
- props: {
22
- manageLink?: string | undefined;
23
- documentationLink?: string | undefined;
24
- profileName?: string | undefined;
25
- stubberhandle?: string | undefined;
26
- };
27
- events: {
28
- copystubberhandle: CustomEvent<any>;
29
- logout: CustomEvent<any>;
30
- } & {
31
- [evt: string]: CustomEvent<any>;
32
- };
33
- slots: {};
34
- exports?: undefined;
35
- bindings?: undefined;
36
- };
37
- export {};
@@ -1,23 +0,0 @@
1
- import Root from "./input.svelte";
2
- export type FormInputEvent<T extends Event = Event> = T & {
3
- currentTarget: EventTarget & HTMLInputElement;
4
- };
5
- export type InputEvents = {
6
- blur: FormInputEvent<FocusEvent>;
7
- change: FormInputEvent<Event>;
8
- click: FormInputEvent<MouseEvent>;
9
- focus: FormInputEvent<FocusEvent>;
10
- focusin: FormInputEvent<FocusEvent>;
11
- focusout: FormInputEvent<FocusEvent>;
12
- keydown: FormInputEvent<KeyboardEvent>;
13
- keypress: FormInputEvent<KeyboardEvent>;
14
- keyup: FormInputEvent<KeyboardEvent>;
15
- mouseover: FormInputEvent<MouseEvent>;
16
- mouseenter: FormInputEvent<MouseEvent>;
17
- mouseleave: FormInputEvent<MouseEvent>;
18
- mousemove: FormInputEvent<MouseEvent>;
19
- paste: FormInputEvent<ClipboardEvent>;
20
- input: FormInputEvent<InputEvent>;
21
- wheel: FormInputEvent<WheelEvent>;
22
- };
23
- export { Root, Root as Input, };
@@ -1,4 +0,0 @@
1
- import Root from "./input.svelte";
2
- export { Root,
3
- //
4
- Root as Input, };
@@ -1,32 +0,0 @@
1
- <script>import { cn } from "../../utils/shadcn-utils.js";
2
- let className = void 0;
3
- export let value = void 0;
4
- export { className as class };
5
- export let readonly = void 0;
6
- </script>
7
-
8
- <input
9
- class={cn(
10
- "border-input bg-background selection:bg-primary dark:bg-input/30 selection:text-primary-foreground ring-offset-background placeholder:text-muted-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base outline-none transition-[color,box-shadow] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-[invalid]:border-destructive aria-[invalid]:ring-destructive/50 aria-[invalid]:focus-visible:ring-destructive/50",
11
- className
12
- )}
13
- bind:value
14
- {readonly}
15
- on:blur
16
- on:change
17
- on:click
18
- on:focus
19
- on:focusin
20
- on:focusout
21
- on:keydown
22
- on:keypress
23
- on:keyup
24
- on:mouseover
25
- on:mouseenter
26
- on:mouseleave
27
- on:mousemove
28
- on:paste
29
- on:input
30
- on:wheel|passive
31
- {...$$restProps}
32
- />
@@ -1,14 +0,0 @@
1
- import { SvelteComponent } from "svelte";
2
- import type { HTMLInputAttributes } from "svelte/elements";
3
- import type { InputEvents } from "./index.js";
4
- declare const __propDef: {
5
- props: HTMLInputAttributes;
6
- slots: {};
7
- events: InputEvents;
8
- };
9
- export type InputProps = typeof __propDef.props;
10
- type InputEvents_ = typeof __propDef.events;
11
- export { InputEvents_ as InputEvents };
12
- export type InputSlots = typeof __propDef.slots;
13
- export default class Input extends SvelteComponent<InputProps, InputEvents_, InputSlots> {
14
- }
@@ -2,10 +2,10 @@
2
2
  /** @typedef {typeof __propDef.events} OrgSwitcherEvents */
3
3
  /** @typedef {typeof __propDef.slots} OrgSwitcherSlots */
4
4
  export default class OrgSwitcher extends SvelteComponent<{
5
+ loading?: boolean | undefined;
5
6
  orgs?: any[] | undefined;
6
7
  selectedorguuid?: any;
7
8
  createOrgLink?: string | undefined;
8
- loading?: boolean | undefined;
9
9
  }, {
10
10
  selectOrg: CustomEvent<any>;
11
11
  } & {
@@ -18,10 +18,10 @@ export type OrgSwitcherSlots = typeof __propDef.slots;
18
18
  import { SvelteComponent } from "svelte";
19
19
  declare const __propDef: {
20
20
  props: {
21
+ loading?: boolean | undefined;
21
22
  orgs?: any[] | undefined;
22
23
  selectedorguuid?: any;
23
24
  createOrgLink?: string | undefined;
24
- loading?: boolean | undefined;
25
25
  };
26
26
  events: {
27
27
  selectOrg: CustomEvent<any>;