@reshape-biotech/design-system 0.0.22 → 0.0.24

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 (138) hide show
  1. package/README.md +30 -38
  2. package/dist/components/banner/Banner.stories.svelte +129 -0
  3. package/dist/components/banner/Banner.stories.svelte.d.ts +19 -0
  4. package/dist/components/banner/Banner.svelte +59 -0
  5. package/dist/components/banner/Banner.svelte.d.ts +11 -0
  6. package/dist/components/button/Button.stories.svelte +37 -0
  7. package/dist/components/button/Button.stories.svelte.d.ts +19 -0
  8. package/dist/components/button/Button.svelte +85 -0
  9. package/dist/components/button/Button.svelte.d.ts +17 -0
  10. package/dist/components/datepicker/DatePicker.svelte +283 -0
  11. package/dist/components/datepicker/DatePicker.svelte.d.ts +8 -0
  12. package/dist/components/divider/Divider.stories.svelte +14 -0
  13. package/dist/components/divider/Divider.stories.svelte.d.ts +27 -0
  14. package/dist/components/divider/Divider.svelte +9 -0
  15. package/dist/components/divider/Divider.svelte.d.ts +6 -0
  16. package/dist/components/drawer/Drawer.stories.svelte +99 -0
  17. package/dist/components/drawer/Drawer.stories.svelte.d.ts +27 -0
  18. package/dist/components/drawer/Drawer.svelte +45 -0
  19. package/dist/components/drawer/Drawer.svelte.d.ts +12 -0
  20. package/dist/components/drawer/DrawerLabel.svelte +13 -0
  21. package/dist/components/drawer/DrawerLabel.svelte.d.ts +9 -0
  22. package/dist/components/dropdown/Dropdown.stories.svelte +214 -0
  23. package/dist/components/dropdown/Dropdown.stories.svelte.d.ts +27 -0
  24. package/dist/components/dropdown/Dropdown.svelte +69 -0
  25. package/dist/components/dropdown/Dropdown.svelte.d.ts +14 -0
  26. package/dist/components/dropdown/components/DropdownContent.svelte +29 -0
  27. package/dist/components/dropdown/components/DropdownContent.svelte.d.ts +10 -0
  28. package/dist/components/dropdown/components/DropdownMenu.svelte +23 -0
  29. package/dist/components/dropdown/components/DropdownMenu.svelte.d.ts +8 -0
  30. package/dist/components/dropdown/components/DropdownTrigger.svelte +44 -0
  31. package/dist/components/dropdown/components/DropdownTrigger.svelte.d.ts +12 -0
  32. package/dist/components/icon-button/IconButton.stories.svelte +52 -0
  33. package/dist/components/icon-button/IconButton.stories.svelte.d.ts +19 -0
  34. package/dist/components/icon-button/IconButton.svelte +71 -0
  35. package/dist/components/icon-button/IconButton.svelte.d.ts +14 -0
  36. package/dist/components/image/Image.svelte +56 -0
  37. package/dist/components/image/Image.svelte.d.ts +7 -0
  38. package/dist/components/input/Input.stories.svelte +81 -0
  39. package/dist/components/input/Input.stories.svelte.d.ts +27 -0
  40. package/dist/components/input/Input.svelte +131 -0
  41. package/dist/components/input/Input.svelte.d.ts +20 -0
  42. package/dist/components/list/List.stories.svelte +97 -0
  43. package/dist/components/list/List.stories.svelte.d.ts +19 -0
  44. package/dist/components/list/List.svelte +75 -0
  45. package/dist/components/list/List.svelte.d.ts +24 -0
  46. package/dist/components/markdown/Markdown.stories.svelte +41 -0
  47. package/dist/components/markdown/Markdown.stories.svelte.d.ts +27 -0
  48. package/dist/components/markdown/Markdown.svelte +12 -0
  49. package/dist/components/markdown/Markdown.svelte.d.ts +6 -0
  50. package/dist/components/modal/Modal.stories.svelte +41 -0
  51. package/dist/components/modal/Modal.stories.svelte.d.ts +19 -0
  52. package/dist/components/modal/Modal.svelte +56 -0
  53. package/dist/components/modal/Modal.svelte.d.ts +16 -0
  54. package/dist/components/notification-popup/NotificationPopup.stories.svelte +27 -0
  55. package/dist/components/notification-popup/NotificationPopup.stories.svelte.d.ts +27 -0
  56. package/dist/components/notification-popup/NotificationPopup.svelte +31 -0
  57. package/dist/components/notification-popup/NotificationPopup.svelte.d.ts +11 -0
  58. package/dist/components/pill/Pill.svelte +39 -0
  59. package/dist/components/pill/Pill.svelte.d.ts +10 -0
  60. package/dist/components/progress-circle/ProgressCircle.svelte +79 -0
  61. package/dist/components/progress-circle/ProgressCircle.svelte.d.ts +7 -0
  62. package/dist/components/segmented-control-buttons/ControlButton.svelte +59 -0
  63. package/dist/components/segmented-control-buttons/ControlButton.svelte.d.ts +14 -0
  64. package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +45 -0
  65. package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte.d.ts +19 -0
  66. package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte +21 -0
  67. package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte.d.ts +10 -0
  68. package/dist/components/select/Select.stories.svelte +113 -0
  69. package/dist/components/select/Select.stories.svelte.d.ts +19 -0
  70. package/dist/components/select/Select.svelte +137 -0
  71. package/dist/components/select/Select.svelte.d.ts +60 -0
  72. package/dist/components/select/index.d.ts +6 -0
  73. package/dist/components/select/index.js +1 -0
  74. package/dist/components/skeleton-loader/HorizontalCardSkeleton.svelte +31 -0
  75. package/dist/components/skeleton-loader/HorizontalCardSkeleton.svelte.d.ts +5 -0
  76. package/dist/components/skeleton-loader/ProjectCardSkeleton.svelte +12 -0
  77. package/dist/components/skeleton-loader/ProjectCardSkeleton.svelte.d.ts +18 -0
  78. package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte +71 -0
  79. package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte.d.ts +27 -0
  80. package/dist/components/skeleton-loader/SkeletonLoader.svelte +17 -0
  81. package/dist/components/skeleton-loader/SkeletonLoader.svelte.d.ts +9 -0
  82. package/dist/components/skeleton-loader/StatcardSkeleton.svelte +17 -0
  83. package/dist/components/skeleton-loader/StatcardSkeleton.svelte.d.ts +18 -0
  84. package/dist/components/skeleton-loader/components/Skeleton.svelte +14 -0
  85. package/dist/components/skeleton-loader/components/Skeleton.svelte.d.ts +8 -0
  86. package/dist/components/skeleton-loader/components/SkeletonImage.svelte +14 -0
  87. package/dist/components/skeleton-loader/components/SkeletonImage.svelte.d.ts +26 -0
  88. package/dist/components/skeleton-loader/index.d.ts +5 -0
  89. package/dist/components/skeleton-loader/index.js +5 -0
  90. package/dist/components/slider/Slider.stories.svelte +37 -0
  91. package/dist/components/slider/Slider.stories.svelte.d.ts +27 -0
  92. package/dist/components/slider/Slider.svelte +117 -0
  93. package/dist/components/slider/Slider.svelte.d.ts +29 -0
  94. package/dist/components/spinner/Spinner.svelte +27 -0
  95. package/dist/components/spinner/Spinner.svelte.d.ts +6 -0
  96. package/dist/components/stat-card/StatCard.stories.svelte +31 -0
  97. package/dist/components/stat-card/StatCard.stories.svelte.d.ts +27 -0
  98. package/dist/components/stat-card/StatCard.svelte +46 -0
  99. package/dist/components/stat-card/StatCard.svelte.d.ts +9 -0
  100. package/dist/components/status-badge/StatusBadge.stories.svelte +401 -0
  101. package/dist/components/status-badge/StatusBadge.stories.svelte.d.ts +19 -0
  102. package/dist/components/status-badge/StatusBadge.svelte +147 -0
  103. package/dist/components/status-badge/StatusBadge.svelte.d.ts +12 -0
  104. package/dist/components/table/Table.stories.svelte +86 -0
  105. package/dist/components/table/Table.stories.svelte.d.ts +24 -0
  106. package/dist/components/table/Table.svelte +33 -0
  107. package/dist/components/table/Table.svelte.d.ts +8 -0
  108. package/dist/components/table/components/Td.svelte +14 -0
  109. package/dist/components/table/components/Td.svelte.d.ts +8 -0
  110. package/dist/components/table/components/Th.svelte +15 -0
  111. package/dist/components/table/components/Th.svelte.d.ts +9 -0
  112. package/dist/components/table/components/Tr.svelte +31 -0
  113. package/dist/components/table/components/Tr.svelte.d.ts +8 -0
  114. package/dist/components/tabs/Tabs.stories.svelte +30 -0
  115. package/dist/components/tabs/Tabs.stories.svelte.d.ts +27 -0
  116. package/dist/components/tabs/Tabs.svelte +15 -0
  117. package/dist/components/tabs/Tabs.svelte.d.ts +8 -0
  118. package/dist/components/tabs/components/Content.svelte +15 -0
  119. package/dist/components/tabs/components/Content.svelte.d.ts +9 -0
  120. package/dist/components/tabs/components/Tab.svelte +21 -0
  121. package/dist/components/tabs/components/Tab.svelte.d.ts +10 -0
  122. package/dist/components/tabs/components/Tabs.svelte +14 -0
  123. package/dist/components/tabs/components/Tabs.svelte.d.ts +8 -0
  124. package/dist/components/tag/Tag.stories.svelte +50 -0
  125. package/dist/components/tag/Tag.stories.svelte.d.ts +19 -0
  126. package/dist/components/tag/Tag.svelte +104 -0
  127. package/dist/components/tag/Tag.svelte.d.ts +11 -0
  128. package/dist/components/toast/Toast.svelte +66 -0
  129. package/dist/components/toast/Toast.svelte.d.ts +5 -0
  130. package/dist/index.d.ts +1 -1
  131. package/dist/index.js +1 -1
  132. package/dist/tailwind-safelist.d.ts +14 -0
  133. package/dist/tailwind-safelist.js +148 -0
  134. package/dist/tailwind.preset.d.ts +1 -0
  135. package/dist/tokens.d.ts +314 -36
  136. package/dist/tokens.js +235 -248
  137. package/package.json +5 -6
  138. package/dist/tailwind-safelist.txt +0 -142
package/README.md CHANGED
@@ -1,58 +1,50 @@
1
- # create-svelte
2
-
3
- Everything you need to build a Svelte library, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte).
4
-
5
- Read more about creating a library [in the docs](https://svelte.dev/docs/kit/packaging).
6
-
7
- ## Creating a project
1
+ ## Publishing
8
2
 
9
- If you're seeing this, you've probably already done this step. Congrats!
3
+ Set the package version in the `package.json` file.
4
+ To build your library:
10
5
 
11
6
  ```bash
12
- # create a new project in the current directory
13
- npx sv create
14
-
15
- # create a new project in my-app
16
- npx sv create my-app
7
+ bun run package
17
8
  ```
18
9
 
19
- ## Developing
20
-
21
- Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
22
-
23
10
  ```bash
24
- npm run dev
25
-
26
- # or start the server and open the app in a new browser tab
27
- npm run dev -- --open
11
+ bun publish
28
12
  ```
29
13
 
30
- Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app.
14
+ ## About the Design System
31
15
 
32
- ## Building
16
+ This package contains the core design system for Reshape Biotech frontend projects, providing a consistent and reusable set of components and styles.
33
17
 
34
- To build your library:
18
+ ### Contents
35
19
 
36
- ```bash
37
- npm run package
38
- ```
20
+ 1. **Component Library**
39
21
 
40
- To create a production version of your showcase app:
22
+ - A collection of shared, reusable React components
23
+ - Standardized UI elements following Reshape Biotech's design guidelines
24
+ - Fully typed components with TypeScript support
41
25
 
42
- ```bash
43
- npm run build
44
- ```
26
+ 2. **Tailwind Configuration**
45
27
 
46
- You can preview the production build with `npm run preview`.
28
+ - Pre-configured Tailwind CSS setup
29
+ - Custom theme extensions
30
+ - Shared utility classes
47
31
 
48
- > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
32
+ 3. **DaisyUI**
49
33
 
50
- ## Publishing
34
+ - Pre-configured DaisyUI setup
35
+ - Custom theme extensions
36
+ - Shared utility classes
51
37
 
52
- Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)).
38
+ 4. **Design Tokens**
39
+ - Color palette
40
+ - Typography
41
+ - Shadow definitions
53
42
 
54
- To publish your library to [npm](https://www.npmjs.com):
43
+ ### Usage
55
44
 
56
- ```bash
57
- npm publish
45
+ Import components and styles from the design system:
46
+
47
+ ```typescript
48
+ import { Button, Card } from '@reshape/design-system';
49
+ import '@reshape/design-system/styles.css';
58
50
  ```
@@ -0,0 +1,129 @@
1
+ <script module lang="ts">
2
+ import { Info, Warning as WarningIcon } from 'phosphor-svelte';
3
+ import Banner from './Banner.svelte';
4
+ import { defineMeta } from '@storybook/addon-svelte-csf';
5
+ import Button from 'design-system/components/button/Button.svelte';
6
+
7
+ const { Story } = defineMeta({
8
+ component: Banner,
9
+ title: 'Design System/Banner',
10
+ tags: ['autodocs']
11
+ });
12
+
13
+ let showBanner = $state(true);
14
+ </script>
15
+
16
+ <Story name="Well finding warning">
17
+ <Banner type="warning" closable={false}>
18
+ {#snippet icon()}
19
+ <WarningIcon size="100%" weight="bold" />
20
+ {/snippet}
21
+ {#snippet content()}
22
+ Our system couldn't find the wells in some plates. Analysis can't be done. For more help, <a
23
+ href="https://docs.reshapebiotech.com/reshape-biotech-knowledgebase/general-info/troubleshooting/well-detection"
24
+ >check our documentation</a
25
+ >
26
+ or <a href="mailto:support@reshapebiotech.com">contact us</a>.
27
+ {/snippet}
28
+ </Banner>
29
+ </Story>
30
+
31
+ <Story name="No icon">
32
+ <Banner type="success">
33
+ {#snippet content()}
34
+ This banner has no icon.
35
+ {/snippet}
36
+ </Banner>
37
+ </Story>
38
+
39
+ <Story name="No toggle">
40
+ <Banner type="progress" closable={false}>
41
+ {#snippet icon()}
42
+ <Info size="100%" weight="bold" />
43
+ {/snippet}
44
+ {#snippet content()}
45
+ This banner has no toggle.
46
+ {/snippet}
47
+ </Banner>
48
+ </Story>
49
+
50
+ <Story name="Toggle back on">
51
+ <div class="h-28">
52
+ <Button onClick={() => (showBanner = true)} disabled={showBanner}>Toggle banner back on</Button>
53
+ <br />
54
+ <br />
55
+
56
+ <Banner type="error" bind:show={showBanner}>
57
+ {#snippet icon()}
58
+ <Info size="100%" weight="bold" />
59
+ {/snippet}
60
+ {#snippet content()}
61
+ This banner can be toggled off with the "x" to the right and back on with the button above.
62
+ {/snippet}
63
+ </Banner>
64
+ </div>
65
+ </Story>
66
+
67
+ <Story name="Type variations">
68
+ <div class="space-y-4">
69
+ <div class="space-y-2">
70
+ <h4>Neutral</h4>
71
+ <Banner type="neutral">
72
+ {#snippet icon()}
73
+ <Info size="100%" weight="bold" />
74
+ {/snippet}
75
+ {#snippet content()}
76
+ This is a "neutral" banner.
77
+ {/snippet}
78
+ </Banner>
79
+ </div>
80
+
81
+ <div class="space-y-2">
82
+ <h4>Success</h4>
83
+ <Banner type="success">
84
+ {#snippet icon()}
85
+ <Info size="100%" weight="bold" />
86
+ {/snippet}
87
+ {#snippet content()}
88
+ This is a "success" banner.
89
+ {/snippet}
90
+ </Banner>
91
+ </div>
92
+
93
+ <div class="space-y-2">
94
+ <h4>Progress</h4>
95
+ <Banner type="progress">
96
+ {#snippet icon()}
97
+ <Info size="100%" weight="bold" />
98
+ {/snippet}
99
+ {#snippet content()}
100
+ This is a "progress" banner.
101
+ {/snippet}
102
+ </Banner>
103
+ </div>
104
+
105
+ <div class="space-y-2">
106
+ <h4>Warning</h4>
107
+ <Banner type="warning">
108
+ {#snippet icon()}
109
+ <Info size="100%" weight="bold" />
110
+ {/snippet}
111
+ {#snippet content()}
112
+ This is a "warning" banner.
113
+ {/snippet}
114
+ </Banner>
115
+ </div>
116
+
117
+ <div class="space-y-2">
118
+ <h4>Error</h4>
119
+ <Banner type="error">
120
+ {#snippet icon()}
121
+ <Info size="100%" weight="bold" />
122
+ {/snippet}
123
+ {#snippet content()}
124
+ This is an "error" banner.
125
+ {/snippet}
126
+ </Banner>
127
+ </div>
128
+ </div>
129
+ </Story>
@@ -0,0 +1,19 @@
1
+ import Banner from './Banner.svelte';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const Banner: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type Banner = InstanceType<typeof Banner>;
19
+ export default Banner;
@@ -0,0 +1,59 @@
1
+ <script lang="ts">
2
+ import { X } from 'phosphor-svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import IconButton from 'design-system/components/icon-button/IconButton.svelte';
5
+
6
+ interface Props {
7
+ type?: 'neutral' | 'success' | 'progress' | 'warning' | 'error';
8
+ show?: boolean;
9
+ closable?: boolean;
10
+ icon?: Snippet;
11
+ content: Snippet;
12
+ }
13
+
14
+ let {
15
+ type = 'neutral',
16
+ show = $bindable(true),
17
+ closable = true,
18
+ icon,
19
+ content
20
+ }: Props = $props();
21
+
22
+ const color = {
23
+ neutral: 'neutral',
24
+ success: 'success',
25
+ progress: 'blue',
26
+ warning: 'warning',
27
+ error: 'danger'
28
+ }[type];
29
+ </script>
30
+
31
+ {#if show}
32
+ <div class="rounded-lg bg-{color} flex h-11 w-full items-center justify-between p-3">
33
+ <div class="inline-flex items-center justify-start gap-3">
34
+ {#if icon}
35
+ <div class="size-5 text-icon-{color} ">
36
+ {@render icon?.()}
37
+ </div>
38
+ {/if}
39
+ <div class="content text-sm">
40
+ {@render content?.()}
41
+ </div>
42
+ </div>
43
+ {#if closable}
44
+ <IconButton size="sm" onclick={() => (show = false)}>
45
+ <X class="text-icon-secondary" weight="bold" />
46
+ </IconButton>
47
+ {/if}
48
+ </div>
49
+ {/if}
50
+
51
+ <style>
52
+ .content :global(a) {
53
+ font-size: 0.875rem;
54
+ line-height: 1.25rem;
55
+ --tw-text-opacity: 1;
56
+ color: rgb(18 25 42 / var(--tw-text-opacity, 1));
57
+ text-decoration-line: underline
58
+ }
59
+ </style>
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ type?: 'neutral' | 'success' | 'progress' | 'warning' | 'error';
4
+ show?: boolean;
5
+ closable?: boolean;
6
+ icon?: Snippet;
7
+ content: Snippet;
8
+ }
9
+ declare const Banner: import("svelte").Component<Props, {}, "show">;
10
+ type Banner = ReturnType<typeof Banner>;
11
+ export default Banner;
@@ -0,0 +1,37 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import Button from './Button.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ component: Button,
7
+ title: 'Design System/Button',
8
+ tags: ['autodocs']
9
+ });
10
+ </script>
11
+
12
+ <Story name="Primary">
13
+ <Button variant="primary">Button</Button>
14
+ </Story>
15
+ <Story name="Medium">
16
+ <Button variant="primary" size="md">Button</Button>
17
+ </Story>
18
+ <Story name="Small">
19
+ <Button variant="primary" size="sm">Button</Button>
20
+ </Story>
21
+
22
+ <Story name="Secondary">
23
+ <Button variant="secondary">Button</Button>
24
+ </Story>
25
+
26
+ <Story name="Danger">
27
+ <Button variant="danger">Button</Button>
28
+ </Story>
29
+ <Story name="Transparent">
30
+ <Button variant="transparent">Button</Button>
31
+ </Story>
32
+ <Story name="Disabled">
33
+ <Button disabled>Button</Button>
34
+ </Story>
35
+ <Story name="Loading">
36
+ <Button loading>Button</Button>
37
+ </Story>
@@ -0,0 +1,19 @@
1
+ import Button from './Button.svelte';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const Button: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type Button = InstanceType<typeof Button>;
19
+ export default Button;
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ import Spinner from 'design-system/components/spinner/Spinner.svelte';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ interface Props {
6
+ class?: string;
7
+ onClick?: (event?: MouseEvent) => void;
8
+ type?: 'button' | 'submit' | 'reset' | null | undefined;
9
+ loading?: boolean;
10
+ disabled?: boolean;
11
+ accessibilityLabel?: string;
12
+ size?: 'sm' | 'md' | 'lg';
13
+ id?: string | undefined;
14
+ tabindex?: number | undefined;
15
+ variant?: Variant;
16
+ children?: Snippet;
17
+ dataTestId?: string;
18
+ }
19
+
20
+ let {
21
+ class: className = '',
22
+ onClick = () => {},
23
+ type = 'button',
24
+ loading = false,
25
+ disabled = false,
26
+ accessibilityLabel = '',
27
+ size = 'lg',
28
+ id = undefined,
29
+ tabindex = undefined,
30
+ variant = 'primary',
31
+ children,
32
+ dataTestId = undefined
33
+ }: Props = $props();
34
+
35
+ type Variant =
36
+ | 'primary'
37
+ | 'secondary'
38
+ | 'transparent'
39
+ | 'danger'
40
+ | 'outline'
41
+ | 'secondary-inverse';
42
+
43
+ const Variants: Record<Variant, string> = {
44
+ primary: 'bg-accent-inverse text-primary-inverse hover:bg-accent-inverse-hover ',
45
+ secondary: 'bg-neutral text-primary hover:bg-neutral-hover active:bg-neutral',
46
+ transparent: 'bg-transparent text-primary hover:bg-neutral active:red',
47
+ danger: 'bg-danger-inverse text-primary-inverse hover:bg-danger-inverse-hover ',
48
+ outline:
49
+ 'bg-transparent text-primary border border-interactive hover:bg-neutral-hover disabled:border-none',
50
+ 'secondary-inverse':
51
+ 'bg-neutral-inverse text-primary-inverse hover:bg-neutral-inverse-hover active:bg-neutral-inverse'
52
+ };
53
+
54
+ const sizes = {
55
+ sm: 'h-8 px-3 py-2',
56
+ md: 'h-10 px-5 py-3',
57
+ lg: 'h-12 px-6 py-4'
58
+ };
59
+ let sizeClassName = $derived(sizes[size]);
60
+ let colorClassName = $derived(Variants[variant]);
61
+ </script>
62
+
63
+ <button
64
+ aria-label={accessibilityLabel}
65
+ onclick={(e) => {
66
+ if (!loading) {
67
+ onClick(e);
68
+ } else {
69
+ e.preventDefault();
70
+ }
71
+ }}
72
+ {type}
73
+ {disabled}
74
+ {id}
75
+ {tabindex}
76
+ class:cursor-wait={loading}
77
+ class="inline-flex items-center justify-center gap-2 rounded-full text-base font-medium leading-6 duration-150 disabled:bg-neutral disabled:text-tertiary {colorClassName} {sizeClassName} {className}"
78
+ data-testid={dataTestId}
79
+ >
80
+ {#if loading}
81
+ <Spinner />
82
+ {:else}
83
+ {@render children?.()}
84
+ {/if}
85
+ </button>
@@ -0,0 +1,17 @@
1
+ import type { Snippet } from 'svelte';
2
+ declare const Button: import("svelte").Component<{
3
+ class?: string;
4
+ onClick?: (event?: MouseEvent) => void;
5
+ type?: "button" | "submit" | "reset" | null | undefined;
6
+ loading?: boolean;
7
+ disabled?: boolean;
8
+ accessibilityLabel?: string;
9
+ size?: "sm" | "md" | "lg";
10
+ id?: string | undefined;
11
+ tabindex?: number | undefined;
12
+ variant?: "primary" | "secondary" | "transparent" | "danger" | "outline" | "secondary-inverse";
13
+ children?: Snippet;
14
+ dataTestId?: string;
15
+ }, {}, "">;
16
+ type Button = ReturnType<typeof Button>;
17
+ export default Button;