@tableslayer/ui 0.0.1 → 0.1.4

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 (205) hide show
  1. package/package.json +4 -15
  2. package/src/lib/components/Avatar/Avatar.svelte +82 -0
  3. package/src/lib/components/Avatar/AvatarFileInput.svelte +85 -0
  4. package/src/lib/components/Avatar/AvatarPopover.svelte +34 -0
  5. package/src/lib/components/Avatar/index.ts +4 -0
  6. package/src/lib/components/Avatar/types.ts +24 -0
  7. package/src/lib/components/BrushSizeSlider/BrushSizeSlider.svelte +174 -0
  8. package/src/lib/components/BrushSizeSlider/index.ts +1 -0
  9. package/src/lib/components/Button/Button.svelte +182 -0
  10. package/src/lib/components/Button/ConfirmActionButton.svelte +98 -0
  11. package/src/lib/components/Button/IconButton.svelte +121 -0
  12. package/src/lib/components/Button/RadioButton.svelte +93 -0
  13. package/src/lib/components/Button/index.ts +5 -0
  14. package/src/lib/components/Button/types.ts +54 -0
  15. package/src/lib/components/CardFan/CardFan.svelte +165 -0
  16. package/src/lib/components/CardFan/index.ts +2 -0
  17. package/src/lib/components/CardFan/types.ts +6 -0
  18. package/src/lib/components/CodeBlock/Code.svelte +7 -0
  19. package/src/lib/components/CodeBlock/CodeBlock.svelte +102 -0
  20. package/src/lib/components/CodeBlock/index.ts +3 -0
  21. package/src/lib/components/CodeBlock/types.ts +10 -0
  22. package/src/lib/components/ColorMode/ColorMode.svelte +8 -0
  23. package/src/lib/components/ColorMode/index.ts +2 -0
  24. package/src/lib/components/ColorMode/types.ts +12 -0
  25. package/src/lib/components/ColorPicker/ColorPicker.svelte +838 -0
  26. package/src/lib/components/ColorPicker/ColorPickerSwatch.svelte +32 -0
  27. package/src/lib/components/ColorPicker/index.ts +3 -0
  28. package/src/lib/components/ColorPicker/types.ts +51 -0
  29. package/src/lib/components/ContextMenu/ContextMenu.svelte +86 -0
  30. package/src/lib/components/ContextMenu/index.ts +2 -0
  31. package/src/lib/components/ContextMenu/types.ts +15 -0
  32. package/src/lib/components/DrawingSliders/DrawingSliders.svelte +379 -0
  33. package/src/lib/components/DrawingSliders/index.ts +1 -0
  34. package/src/lib/components/Editor/Editor.svelte +825 -0
  35. package/src/lib/components/Editor/index.ts +1 -0
  36. package/src/lib/components/FogSliders/FogSliders.svelte +33 -0
  37. package/src/lib/components/FogSliders/index.ts +1 -0
  38. package/src/lib/components/Hr/Hr.svelte +15 -0
  39. package/src/lib/components/Hr/index.ts +1 -0
  40. package/src/lib/components/Icon/Icon.svelte +6 -0
  41. package/src/lib/components/Icon/index.ts +2 -0
  42. package/src/lib/components/Icon/types.ts +20 -0
  43. package/src/lib/components/Input/DualInputSlider.svelte +126 -0
  44. package/src/lib/components/Input/FileInput.svelte +176 -0
  45. package/src/lib/components/Input/FormControl.svelte +150 -0
  46. package/src/lib/components/Input/FormError.svelte +37 -0
  47. package/src/lib/components/Input/Input.svelte +56 -0
  48. package/src/lib/components/Input/InputCheckbox.svelte +99 -0
  49. package/src/lib/components/Input/InputSlider.svelte +86 -0
  50. package/src/lib/components/Input/Label.svelte +19 -0
  51. package/src/lib/components/Input/index.ts +9 -0
  52. package/src/lib/components/Input/types.ts +39 -0
  53. package/src/lib/components/Link/Link.svelte +41 -0
  54. package/src/lib/components/Link/LinkBox.svelte +20 -0
  55. package/src/lib/components/Link/LinkOverlay.svelte +23 -0
  56. package/src/lib/components/Link/index.ts +4 -0
  57. package/src/lib/components/Link/types.ts +17 -0
  58. package/src/lib/components/Loading/Loader.svelte +60 -0
  59. package/src/lib/components/Loading/Skeleton.svelte +9 -0
  60. package/src/lib/components/Loading/index.ts +2 -0
  61. package/src/lib/components/Logo/Logo.svelte +16 -0
  62. package/src/lib/components/Logo/index.ts +1 -0
  63. package/src/lib/components/MarkerTooltip/MarkerTooltip.svelte +435 -0
  64. package/src/lib/components/MarkerTooltip/index.ts +1 -0
  65. package/src/lib/components/Menu/SelectorMenu.svelte +280 -0
  66. package/src/lib/components/Menu/index.ts +2 -0
  67. package/src/lib/components/Menu/types.ts +17 -0
  68. package/src/lib/components/MyCounterButton.svelte +11 -0
  69. package/src/lib/components/Panel/index.ts +2 -0
  70. package/src/lib/components/Panel/panel.svelte +18 -0
  71. package/src/lib/components/Panel/types.ts +8 -0
  72. package/src/lib/components/PersistButton/PersistButton.svelte +100 -0
  73. package/src/lib/components/PersistButton/index.ts +1 -0
  74. package/src/lib/components/Popover/Popover.svelte +81 -0
  75. package/src/lib/components/Popover/index.ts +2 -0
  76. package/src/lib/components/Popover/types.ts +19 -0
  77. package/src/lib/components/PropsTable/PropsTable.svelte +107 -0
  78. package/src/lib/components/RadialMenu/EffectPreview.svelte +36 -0
  79. package/src/lib/components/RadialMenu/EffectPreviewScene.svelte +194 -0
  80. package/src/lib/components/RadialMenu/RadialMenu.svelte +503 -0
  81. package/src/lib/components/RadialMenu/RadialMenuItem.svelte +176 -0
  82. package/src/lib/components/RadialMenu/index.ts +2 -0
  83. package/src/lib/components/RadialMenu/types.ts +35 -0
  84. package/src/lib/components/Select/Select.svelte +342 -0
  85. package/src/lib/components/Select/index.ts +2 -0
  86. package/src/lib/components/Select/types.ts +22 -0
  87. package/src/lib/components/Spacer/Spacer.svelte +14 -0
  88. package/src/lib/components/Spacer/index.ts +2 -0
  89. package/src/lib/components/Spacer/types.ts +5 -0
  90. package/src/lib/components/Stage/components/AnnotationLayer/AnnotationLayer.svelte +445 -0
  91. package/src/lib/components/Stage/components/AnnotationLayer/AnnotationMaterial.svelte +167 -0
  92. package/src/lib/components/Stage/components/AnnotationLayer/types.ts +196 -0
  93. package/src/lib/components/Stage/components/CursorLayer/CursorLayer.svelte +148 -0
  94. package/src/lib/components/Stage/components/CursorLayer/cursor.svg +26 -0
  95. package/src/lib/components/Stage/components/CursorLayer/index.ts +2 -0
  96. package/src/lib/components/Stage/components/CursorLayer/types.ts +23 -0
  97. package/src/lib/components/Stage/components/DrawingLayer/DrawingMaterial.svelte +364 -0
  98. package/src/lib/components/Stage/components/DrawingLayer/types.ts +65 -0
  99. package/src/lib/components/Stage/components/EdgeOverlayLayer/EdgeOverlayLayer.svelte +72 -0
  100. package/src/lib/components/Stage/components/EdgeOverlayLayer/types.ts +34 -0
  101. package/src/lib/components/Stage/components/FogLayer/FogLayer.svelte +75 -0
  102. package/src/lib/components/Stage/components/FogLayer/types.ts +51 -0
  103. package/src/lib/components/Stage/components/FogOfWarLayer/FogOfWarLayer.svelte +249 -0
  104. package/src/lib/components/Stage/components/FogOfWarLayer/FogOfWarMaterial.svelte +200 -0
  105. package/src/lib/components/Stage/components/FogOfWarLayer/types.ts +116 -0
  106. package/src/lib/components/Stage/components/GridLayer/GridLayer.svelte +20 -0
  107. package/src/lib/components/Stage/components/GridLayer/GridMaterial.svelte +69 -0
  108. package/src/lib/components/Stage/components/GridLayer/types.ts +79 -0
  109. package/src/lib/components/Stage/components/LayerInput/LayerInput.svelte +300 -0
  110. package/src/lib/components/Stage/components/MapLayer/MapLayer.svelte +196 -0
  111. package/src/lib/components/Stage/components/MapLayer/dataSources/GifDataSource.ts +265 -0
  112. package/src/lib/components/Stage/components/MapLayer/dataSources/IMapDataSource.ts +55 -0
  113. package/src/lib/components/Stage/components/MapLayer/dataSources/ImageDataSource.ts +87 -0
  114. package/src/lib/components/Stage/components/MapLayer/dataSources/VideoDataSource.ts +150 -0
  115. package/src/lib/components/Stage/components/MapLayer/dataSources/dataSourceFactory.ts +48 -0
  116. package/src/lib/components/Stage/components/MapLayer/dataSources/index.ts +16 -0
  117. package/src/lib/components/Stage/components/MapLayer/types.ts +58 -0
  118. package/src/lib/components/Stage/components/MarkerLayer/MarkerLayer.svelte +398 -0
  119. package/src/lib/components/Stage/components/MarkerLayer/MarkerToken.svelte +262 -0
  120. package/src/lib/components/Stage/components/MarkerLayer/types.ts +126 -0
  121. package/src/lib/components/Stage/components/MeasurementLayer/MeasurementLayer.svelte +364 -0
  122. package/src/lib/components/Stage/components/MeasurementLayer/MeasurementManager.svelte +473 -0
  123. package/src/lib/components/Stage/components/MeasurementLayer/measurements/BaseMeasurement.ts +427 -0
  124. package/src/lib/components/Stage/components/MeasurementLayer/measurements/BeamMeasurement.ts +105 -0
  125. package/src/lib/components/Stage/components/MeasurementLayer/measurements/CircleMeasurement.ts +98 -0
  126. package/src/lib/components/Stage/components/MeasurementLayer/measurements/ConeMeasurement.ts +163 -0
  127. package/src/lib/components/Stage/components/MeasurementLayer/measurements/LineMeasurement.ts +102 -0
  128. package/src/lib/components/Stage/components/MeasurementLayer/measurements/RectangleMeasurement.ts +120 -0
  129. package/src/lib/components/Stage/components/MeasurementLayer/measurements/index.ts +7 -0
  130. package/src/lib/components/Stage/components/MeasurementLayer/types.ts +94 -0
  131. package/src/lib/components/Stage/components/MeasurementLayer/utils/canvasDrawing.ts +357 -0
  132. package/src/lib/components/Stage/components/MeasurementLayer/utils/distanceCalculations.ts +170 -0
  133. package/src/lib/components/Stage/components/ParticleSystem/ParticleSystem.svelte +220 -0
  134. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/ash.png +0 -0
  135. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/leaves.png +0 -0
  136. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/rain.png +0 -0
  137. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/snow.png +0 -0
  138. package/src/lib/components/Stage/components/ParticleSystem/rng.js +20 -0
  139. package/src/lib/components/Stage/components/ParticleSystem/types.ts +95 -0
  140. package/src/lib/components/Stage/components/PerformanceDebugger/PerformanceDebugger.svelte +144 -0
  141. package/src/lib/components/Stage/components/PerformanceDebugger/index.ts +1 -0
  142. package/src/lib/components/Stage/components/PerformanceOverlay/PerformanceOverlay.svelte +208 -0
  143. package/src/lib/components/Stage/components/PerformanceOverlay/index.ts +1 -0
  144. package/src/lib/components/Stage/components/PointerInputManager/PointerInputManager.svelte +201 -0
  145. package/src/lib/components/Stage/components/Scene/Scene.svelte +651 -0
  146. package/src/lib/components/Stage/components/Scene/luts.ts +24 -0
  147. package/src/lib/components/Stage/components/Scene/types.ts +225 -0
  148. package/src/lib/components/Stage/components/Stage/Stage.svelte +332 -0
  149. package/src/lib/components/Stage/components/Stage/types.ts +136 -0
  150. package/src/lib/components/Stage/components/WeatherLayer/WeatherLayer.svelte +135 -0
  151. package/src/lib/components/Stage/components/WeatherLayer/presets/AshPreset.ts +71 -0
  152. package/src/lib/components/Stage/components/WeatherLayer/presets/LeavesPreset.ts +70 -0
  153. package/src/lib/components/Stage/components/WeatherLayer/presets/RainPreset.ts +68 -0
  154. package/src/lib/components/Stage/components/WeatherLayer/presets/SnowPreset.ts +70 -0
  155. package/src/lib/components/Stage/components/WeatherLayer/presets/index.ts +6 -0
  156. package/src/lib/components/Stage/components/WeatherLayer/types.ts +35 -0
  157. package/src/lib/components/Stage/helpers/clippingPlaneStore.svelte.ts +28 -0
  158. package/src/lib/components/Stage/helpers/debugState.svelte.ts +18 -0
  159. package/src/lib/components/Stage/helpers/grid.ts +548 -0
  160. package/src/lib/components/Stage/helpers/lazyBrush.ts +171 -0
  161. package/src/lib/components/Stage/helpers/performanceMetrics.svelte.ts +220 -0
  162. package/src/lib/components/Stage/helpers/utils.ts +21 -0
  163. package/src/lib/components/Stage/index.ts +49 -0
  164. package/src/lib/components/Stage/shaders/AnnotationEffects.frag +1070 -0
  165. package/src/lib/components/Stage/shaders/Annotations.frag +29 -0
  166. package/src/lib/components/Stage/shaders/Drawing.frag +83 -0
  167. package/src/lib/components/Stage/shaders/Drawing.vert +5 -0
  168. package/src/lib/components/Stage/shaders/Fog.frag +147 -0
  169. package/src/lib/components/Stage/shaders/FractalNoise.frag +96 -0
  170. package/src/lib/components/Stage/shaders/GridShader.frag +174 -0
  171. package/src/lib/components/Stage/shaders/Overlay.frag +23 -0
  172. package/src/lib/components/Stage/shaders/Overlay.vert +0 -0
  173. package/src/lib/components/Stage/shaders/Particles.frag +27 -0
  174. package/src/lib/components/Stage/shaders/Particles.vert +51 -0
  175. package/src/lib/components/Stage/shaders/ToolOutline.frag +59 -0
  176. package/src/lib/components/Stage/shaders/default.vert +8 -0
  177. package/src/lib/components/Stage/types.ts +4 -0
  178. package/src/lib/components/Table/Table.svelte +16 -0
  179. package/src/lib/components/Table/Td.svelte +17 -0
  180. package/src/lib/components/Table/Th.svelte +18 -0
  181. package/src/lib/components/Table/index.ts +4 -0
  182. package/src/lib/components/Table/types.ts +14 -0
  183. package/src/lib/components/Text/Text.svelte +23 -0
  184. package/src/lib/components/Text/index.ts +2 -0
  185. package/src/lib/components/Text/types.ts +12 -0
  186. package/src/lib/components/Title/Title.svelte +54 -0
  187. package/src/lib/components/Title/index.ts +2 -0
  188. package/src/lib/components/Title/types.ts +9 -0
  189. package/src/lib/components/Toast/Toast.svelte +155 -0
  190. package/src/lib/components/Toast/index.ts +5 -0
  191. package/src/lib/components/Toast/toastCookie.ts +24 -0
  192. package/src/lib/components/Toast/types.ts +6 -0
  193. package/src/lib/components/ToolTip/ToolTip.svelte +70 -0
  194. package/src/lib/components/ToolTip/index.ts +2 -0
  195. package/src/lib/components/ToolTip/types.ts +14 -0
  196. package/src/lib/components/index.ts +32 -0
  197. package/src/lib/components/types.ts +0 -0
  198. package/src/lib/index.ts +2 -0
  199. package/src/lib/styles/globals.css +108 -0
  200. package/src/lib/styles/normalize.css +9 -0
  201. package/src/lib/styles/reset.css +133 -0
  202. package/src/lib/styles/utilities.css +179 -0
  203. package/src/lib/styles/vars.css +1103 -0
  204. package/src/lib/types/awareness.ts +17 -0
  205. package/src/lib/utils/rle.ts +217 -0
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@tableslayer/ui",
3
- "version": "0.0.1",
3
+ "version": "0.1.4",
4
4
  "license": "FSL-1.1-ALv2",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/tableslayer/tableslayer.git",
7
+ "url": "https://github.com/Siege-Perilous/tableslayer.git",
8
8
  "directory": "packages/ui"
9
9
  },
10
10
  "author": "Siege Perilous LLC",
@@ -15,7 +15,7 @@
15
15
  "ui",
16
16
  "tableslayer"
17
17
  ],
18
- "homepage": "https://github.com/tableslayer/tableslayer/tree/main/packages/ui",
18
+ "homepage": "https://github.com/Siege-Perilous/tableslayer/tree/main/packages/ui",
19
19
  "scripts": {
20
20
  "dev": "typedoc && pnpm check:watch",
21
21
  "build": "svelte-kit sync && vite build && npm run package",
@@ -45,21 +45,10 @@
45
45
  },
46
46
  "files": [
47
47
  "dist",
48
+ "src/lib",
48
49
  "!dist/**/*.test.*",
49
50
  "!dist/**/*.spec.*"
50
51
  ],
51
- "publishConfig": {
52
- "exports": {
53
- ".": {
54
- "types": "./dist/index.d.ts",
55
- "svelte": "./dist/index.js"
56
- },
57
- "./styles/*.css": {
58
- "import": "./dist/styles/*.css",
59
- "require": "./dist/styles/*.css"
60
- }
61
- }
62
- },
63
52
  "peerDependencies": {
64
53
  "@melt-ui/svelte": "^0.86.2",
65
54
  "@sveltejs/kit": "^2.16.0",
@@ -0,0 +1,82 @@
1
+ <script lang="ts">
2
+ import type { AvatarProps } from './types';
3
+ let { src, alt, initials, variant = 'round', size = 'sm', isLoading, ...restProps }: AvatarProps = $props();
4
+ import { createAvatar, melt } from '@melt-ui/svelte';
5
+
6
+ let avatarClasses = $derived([
7
+ 'avatar',
8
+ `avatar--${size}`,
9
+ isLoading && 'isLoading',
10
+ `avatar--${variant}`,
11
+ restProps.class
12
+ ]);
13
+
14
+ const {
15
+ elements: { fallback }
16
+ } = createAvatar({
17
+ src: src || ''
18
+ });
19
+ </script>
20
+
21
+ <div class={avatarClasses}>
22
+ <img {src} {alt} class="avatar__image" />
23
+ <span use:melt={$fallback} class="avatar__text">{initials}</span>
24
+ </div>
25
+
26
+ <style>
27
+ .avatar {
28
+ width: 40px;
29
+ height: 40px;
30
+ border-radius: 50%;
31
+ background: var(--fg);
32
+ color: var(--bg);
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ border: 2px solid var(--fg);
37
+ }
38
+ .avatar--round {
39
+ border-radius: 50%;
40
+ }
41
+ .avatar--square {
42
+ border-radius: var(--radius-2);
43
+ .avatar__image {
44
+ border-radius: var(--radius-2);
45
+ }
46
+ }
47
+ .avatar--sm {
48
+ width: 1.5rem;
49
+ height: 1.5rem;
50
+ min-width: 1.5rem;
51
+ min-height: 1.5rem;
52
+ font-size: 0.875rem;
53
+ }
54
+ .avatar--md {
55
+ width: 2rem;
56
+ height: 2rem;
57
+ min-width: 2rem;
58
+ min-height: 2rem;
59
+ font-size: var(--font-size-4);
60
+ }
61
+ .avatar--lg {
62
+ width: 2.5rem;
63
+ height: 2.5rem;
64
+ min-width: 2.5rem;
65
+ min-height: 2.5rem;
66
+ }
67
+ .avatar--xl {
68
+ width: 5rem;
69
+ height: 5rem;
70
+ min-width: 5rem;
71
+ min-height: 5rem;
72
+ }
73
+ .avatar__image {
74
+ width: 100%;
75
+ height: 100%;
76
+ object-fit: cover;
77
+ border-radius: 50%;
78
+ }
79
+ .avatar__text {
80
+ font-weight: var(--font-weight-6);
81
+ }
82
+ </style>
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ import { Avatar, Icon, type AvatarFileInputProps } from '../';
3
+ import { IconPhotoCirclePlus } from '@tabler/icons-svelte';
4
+
5
+ let {
6
+ files = $bindable(),
7
+ src,
8
+ alt,
9
+ initials,
10
+ isLoading,
11
+ size = 'xl',
12
+ variant = 'round',
13
+ onChange,
14
+ ...restProps
15
+ }: AvatarFileInputProps = $props();
16
+
17
+ let avatarPreviewUrl = $state<string | null>(src ?? null);
18
+ let hiddenFileInput: HTMLInputElement | null = null;
19
+
20
+ function openFileDialog() {
21
+ hiddenFileInput?.click();
22
+ }
23
+
24
+ async function handleFileChange(event: Event) {
25
+ const input = event.target as HTMLInputElement;
26
+ if (!input.files || input.files.length === 0) return;
27
+
28
+ const file = input.files[0];
29
+ avatarPreviewUrl = URL.createObjectURL(file);
30
+ if (onChange) {
31
+ onChange();
32
+ }
33
+ input.value = '';
34
+ }
35
+ </script>
36
+
37
+ <div
38
+ role="button"
39
+ onkeydown={(e) => {
40
+ if (e.key === 'Enter' || e.key === ' ') {
41
+ openFileDialog();
42
+ }
43
+ }}
44
+ aria-label="Change Avatar"
45
+ tabindex="0"
46
+ onclick={openFileDialog}
47
+ class={['avatarFileInput', restProps.class]}
48
+ >
49
+ <Avatar src={avatarPreviewUrl || src} {alt} {initials} {isLoading} {size} {variant} {...restProps} />
50
+ <div class="avatarFileInput__overlay">
51
+ <Icon Icon={IconPhotoCirclePlus} size="2rem" stroke={2} />
52
+ </div>
53
+ <input
54
+ type="file"
55
+ bind:files
56
+ accept="image/*"
57
+ bind:this={hiddenFileInput}
58
+ onchange={handleFileChange}
59
+ style={'display: none;'}
60
+ />
61
+ </div>
62
+
63
+ <style>
64
+ .avatarFileInput {
65
+ position: relative;
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ cursor: pointer;
70
+ }
71
+ .avatarFileInput__overlay {
72
+ position: absolute;
73
+ width: calc(100% - 4px);
74
+ height: calc(100% - 4px);
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ background: rgba(0, 0, 0, 0.8);
79
+ border-radius: 50%;
80
+ opacity: 0;
81
+ }
82
+ .avatarFileInput:hover .avatarFileInput__overlay {
83
+ opacity: 1;
84
+ }
85
+ </style>
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import { Avatar, Popover, Icon } from '../';
3
+ import type { AvatarPopoverProps } from './types';
4
+ let {
5
+ src,
6
+ size = 'md',
7
+ positioning = { placement: 'bottom' },
8
+ content: AvatarPopoverContent
9
+ }: AvatarPopoverProps = $props();
10
+ import { IconChevronDown } from '@tabler/icons-svelte';
11
+ </script>
12
+
13
+ <Popover {positioning}>
14
+ {#snippet trigger()}
15
+ <div class="avatarPopoverTrigger">
16
+ <Avatar {src} {size} />
17
+ <Icon Icon={IconChevronDown} />
18
+ </div>
19
+ {/snippet}
20
+ {#snippet content()}
21
+ {@render AvatarPopoverContent()}
22
+ {/snippet}
23
+ </Popover>
24
+
25
+ <style>
26
+ .avatarPopoverTrigger {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: var(--size-1);
30
+ padding-right: var(--size-2);
31
+ background: var(--contrastMedium);
32
+ border-radius: var(--radius-3);
33
+ }
34
+ </style>
@@ -0,0 +1,4 @@
1
+ export { default as Avatar } from './Avatar.svelte';
2
+ export { default as AvatarFileInput } from './AvatarFileInput.svelte';
3
+ export { default as AvatarPopover } from './AvatarPopover.svelte';
4
+ export * from './types';
@@ -0,0 +1,24 @@
1
+ import type { FloatingConfig } from '@melt-ui/svelte/internal/actions';
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLBaseAttributes } from 'svelte/elements';
4
+
5
+ export type AvatarProps = {
6
+ src?: string;
7
+ alt?: string;
8
+ initials?: string;
9
+ isLoading?: boolean;
10
+ size?: 'sm' | 'md' | 'lg' | 'xl';
11
+ variant?: 'round' | 'square';
12
+ } & HTMLBaseAttributes;
13
+
14
+ export type AvatarPopoverProps = {
15
+ src: AvatarProps['src'];
16
+ size?: AvatarProps['size'];
17
+ content: Snippet;
18
+ positioning?: FloatingConfig;
19
+ };
20
+
21
+ export type AvatarFileInputProps = AvatarProps & {
22
+ files?: FileList | null;
23
+ onChange?: () => void;
24
+ };
@@ -0,0 +1,174 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ brushSize: number;
4
+ onBrushSizeChange: (value: number) => void;
5
+ min?: number;
6
+ max?: number;
7
+ curve?: 'linear' | 'quadratic';
8
+ displayAsPercentage?: boolean;
9
+ }
10
+
11
+ let {
12
+ brushSize,
13
+ onBrushSizeChange,
14
+ min = 1,
15
+ max = 200,
16
+ curve = 'quadratic',
17
+ displayAsPercentage = false
18
+ }: Props = $props();
19
+
20
+ // For quadratic curve: size = coefficient * slider^2
21
+ // We want: at slider=50%, size should be at the midpoint between min and max
22
+ // midpoint = (min + max) / 2
23
+ // So: midpoint = coefficient * 50^2
24
+ // coefficient = midpoint / 2500
25
+ const midpoint = (min + max) / 2;
26
+ const coefficient = midpoint / 2500;
27
+
28
+ const brushSizeToSlider = (size: number): number => {
29
+ const clampedSize = Math.max(min, Math.min(max, size));
30
+
31
+ if (curve === 'linear') {
32
+ // Linear: map size range to 0-100 slider range
33
+ return ((clampedSize - min) / (max - min)) * 100;
34
+ } else {
35
+ // Quadratic: inverse of size = coefficient * slider^2
36
+ return Math.sqrt(clampedSize / coefficient);
37
+ }
38
+ };
39
+
40
+ const sliderToBrushSize = (slider: number): number => {
41
+ if (curve === 'linear') {
42
+ // Linear mapping from slider (0-100) to size range (min-max)
43
+ const size = min + (slider / 100) * (max - min);
44
+ // For linear curve (used by fog), keep decimal precision
45
+ // Round to 1 decimal place
46
+ return Math.max(min, Math.min(max, Math.round(size * 10) / 10));
47
+ } else {
48
+ // Quadratic curve (used by annotations)
49
+ const size = coefficient * slider * slider;
50
+ // For quadratic, we can round to integers as the range is small decimals (0.01-5.0)
51
+ // but we need to preserve decimal precision, so round to 2 decimal places
52
+ return Math.max(min, Math.min(max, Math.round(size * 100) / 100));
53
+ }
54
+ };
55
+
56
+ let brushSliderValue = $derived(brushSizeToSlider(brushSize));
57
+
58
+ const handleBrushSliderChange = (value: number) => {
59
+ const actualSize = sliderToBrushSize(value);
60
+ console.log('[BrushSizeSlider] Slider change:', {
61
+ sliderValue: value,
62
+ actualSize,
63
+ min,
64
+ max,
65
+ curve
66
+ });
67
+ onBrushSizeChange(actualSize);
68
+ };
69
+
70
+ // Touch event handlers for better mobile support
71
+ const handleTouchStart = (e: TouchEvent) => {
72
+ // Prevent default to avoid conflicts with other touch interactions
73
+ e.stopPropagation();
74
+ };
75
+
76
+ const handleTouchMove = (e: TouchEvent) => {
77
+ // Prevent scrolling while adjusting sliders
78
+ e.preventDefault();
79
+ e.stopPropagation();
80
+ };
81
+ </script>
82
+
83
+ <div class="brushSizeSlider">
84
+ <input
85
+ id="brush-size-slider"
86
+ type="range"
87
+ class="brushSizeSlider__input"
88
+ min="0"
89
+ max="100"
90
+ step="0.1"
91
+ value={brushSliderValue}
92
+ oninput={(e) => handleBrushSliderChange(Number(e.currentTarget.value))}
93
+ ontouchstart={handleTouchStart}
94
+ ontouchmove={handleTouchMove}
95
+ />
96
+ <div class="brushSizeSlider__value">{displayAsPercentage ? `${brushSize.toFixed(1)}%` : brushSize}</div>
97
+ </div>
98
+
99
+ <style>
100
+ .brushSizeSlider {
101
+ display: flex;
102
+ flex-direction: column;
103
+ align-items: center;
104
+ gap: 1rem;
105
+ }
106
+
107
+ .brushSizeSlider__input {
108
+ writing-mode: vertical-lr;
109
+ direction: rtl;
110
+ width: 32px;
111
+ height: 120px;
112
+ -webkit-appearance: none;
113
+ appearance: none;
114
+ background: var(--contrastLow);
115
+ border-radius: var(--radius-1);
116
+ cursor: pointer;
117
+ touch-action: none;
118
+ outline: none;
119
+ }
120
+
121
+ /* Webkit browsers (Chrome, Safari, Edge) */
122
+ .brushSizeSlider__input::-webkit-slider-track {
123
+ width: 32px;
124
+ height: 120px;
125
+ background: transparent;
126
+ border: none;
127
+ }
128
+
129
+ .brushSizeSlider__input::-webkit-slider-thumb {
130
+ -webkit-appearance: none;
131
+ appearance: none;
132
+ width: 32px;
133
+ height: 14px;
134
+ background: var(--contrastHigh);
135
+ border: none;
136
+ border-radius: var(--radius-1);
137
+ cursor: grab;
138
+ box-shadow: 0 0px 2px rgba(0, 0, 0, 0.2);
139
+ }
140
+
141
+ .brushSizeSlider__input::-webkit-slider-thumb:active {
142
+ cursor: grabbing;
143
+ }
144
+
145
+ /* Firefox */
146
+ .brushSizeSlider__input::-moz-range-track {
147
+ width: 32px;
148
+ height: 120px;
149
+ background: var(--contrastLow);
150
+ border-radius: var(--radius-2);
151
+ }
152
+
153
+ .brushSizeSlider__input::-moz-range-thumb {
154
+ width: 32px;
155
+ height: 14px;
156
+ background: var(--contrastHigh);
157
+ border: none;
158
+ border-radius: var(--radius-2);
159
+ cursor: grab;
160
+ box-shadow: 0 0px 2px rgba(0, 0, 0, 0.2);
161
+ }
162
+
163
+ .brushSizeSlider__input::-moz-range-thumb:active {
164
+ cursor: grabbing;
165
+ }
166
+
167
+ .brushSizeSlider__value {
168
+ font-size: 0.875rem;
169
+ font-weight: 600;
170
+ color: var(--fg);
171
+ min-width: 3rem;
172
+ text-align: center;
173
+ }
174
+ </style>
@@ -0,0 +1 @@
1
+ export { default as BrushSizeSlider } from './BrushSizeSlider.svelte';
@@ -0,0 +1,182 @@
1
+ <script lang="ts">
2
+ import type { ButtonProps } from './types';
3
+ import { Loader } from '../Loading';
4
+ /* @type {ButtonProps} */
5
+ let {
6
+ children,
7
+ start,
8
+ end,
9
+ isLoading = false,
10
+ isDisabled = false,
11
+ size = 'md',
12
+ variant = 'primary',
13
+ href,
14
+ as,
15
+ ...restProps
16
+ }: ButtonProps = $props();
17
+
18
+ let btnClasses = $derived([
19
+ 'btn',
20
+ `btn--${size}`,
21
+ isLoading && 'btn-isLoading',
22
+ isDisabled && 'btn--isDisabled',
23
+ `btn--${variant}`,
24
+ restProps.class ?? ''
25
+ ]);
26
+
27
+ const component = as !== undefined ? as : href !== undefined ? 'a' : 'button';
28
+
29
+ let buttonProps = $state({});
30
+ if (component === 'button') {
31
+ buttonProps = { disabled: isDisabled };
32
+ } else if (component === 'a') {
33
+ buttonProps = { href };
34
+ }
35
+ </script>
36
+
37
+ <!--
38
+ @component
39
+ ## Button
40
+
41
+ Button component is used to trigger an action or event.
42
+
43
+ @example
44
+ ```svelte
45
+ <Button>
46
+ {#snippet start()}
47
+ <Icon Icon={IconCheck} />
48
+ {/snippet}
49
+ Primary
50
+ </Button>
51
+ ```
52
+ @props
53
+ - `variant` - The variant of the button. Default is `primary`.
54
+ - `size` - The size of the button. Default is `md`.
55
+ - `isLoading` - The loading state of the button. Default is `false`.
56
+ - `isDisabled` - The disabled state of the button. Default is `false`.
57
+ - `start` - The start snippet of the button.
58
+ - `end` - The end snippet of the button.
59
+ -->
60
+
61
+ <svelte:element this={component} {...buttonProps} {...restProps} class={btnClasses}>
62
+ {#if isLoading}
63
+ <Loader />
64
+ {/if}
65
+ {#if start}
66
+ {@render start()}
67
+ {/if}
68
+ {@render children()}
69
+ {#if end}
70
+ {@render end()}
71
+ {/if}
72
+ </svelte:element>
73
+
74
+ <style>
75
+ :global(.light) {
76
+ color-scheme: light;
77
+ --btn-bg: var(--contrastEmpty);
78
+ --btn-bgHover: var(--primary-50);
79
+ --btn-border: solid 2px var(--fg);
80
+ --btn-borderHover: solid 2px var(--primary-600);
81
+ --btn-color: var(--fg);
82
+ --btn-dangerStripesHover: var(--primary-300);
83
+ --btn-bgSpecial: var(--primary-100);
84
+ }
85
+
86
+ :global(.dark) {
87
+ color-scheme: dark;
88
+ --btn-bg: var(--bg);
89
+ --btn-bgHover: var(--primary-950);
90
+ --btn-border: solid 2px var(--fg);
91
+ --btn-borderHover: solid 2px var(--primary-500);
92
+ --btn-color: var(--fg);
93
+ --btn-dangerStripesHover: var(--primary-700);
94
+ --btn-bgSpecial: var(--primary-900);
95
+ }
96
+
97
+ .btn {
98
+ color: var(--btn-color);
99
+ background-color: var(--btn-bg);
100
+ padding: 0 var(--size-2);
101
+ border-radius: var(--radius-2);
102
+ display: inline-flex;
103
+ align-items: center;
104
+ justify-content: center;
105
+ gap: var(--size-2);
106
+ cursor: pointer;
107
+ border: var(--btn-border);
108
+ border-color: transparent;
109
+ font-family: var(--font-sans);
110
+ font-weight: 600;
111
+ white-space: nowrap;
112
+ }
113
+
114
+ .btn--sm {
115
+ font-size: var(--font-size-1);
116
+ height: var(--size-6);
117
+ }
118
+ .btn--md {
119
+ font-size: var(--font-size-1);
120
+ height: var(--size-8);
121
+ }
122
+ .btn--lg {
123
+ font-size: var(--font-size-2);
124
+ height: var(--size-9);
125
+ }
126
+
127
+ .btn--primary {
128
+ border-color: var(--fg);
129
+ }
130
+ .btn--danger {
131
+ border-color: var(--fg);
132
+ background-image: linear-gradient(
133
+ 135deg,
134
+ transparent 10%,
135
+ transparent 10%,
136
+ transparent 50%,
137
+ color-mix(in srgb, var(--fg), transparent 40%) 50%,
138
+ color-mix(in srgb, var(--fg), transparent 40%) 50%,
139
+ transparent 60%,
140
+ transparent 100%
141
+ );
142
+ background-size: 14.14px 14.14px;
143
+ text-shadow: 0 0 4px var(--bg);
144
+ }
145
+ .btn--danger:hover {
146
+ background-image: linear-gradient(
147
+ 135deg,
148
+ transparent 10%,
149
+ transparent 10%,
150
+ transparent 50%,
151
+ var(--btn-dangerStripesHover),
152
+ var(--btn-dangerStripesHover),
153
+ transparent 60%,
154
+ transparent 100%
155
+ );
156
+ }
157
+ .btn--special {
158
+ border: var(--btn-borderHover);
159
+ background: var(--btn-bgSpecial);
160
+ }
161
+ .btn:hover {
162
+ background-color: var(--btn-bgHover);
163
+ border: var(--btn-borderHover);
164
+ }
165
+ .btn--isDisabled {
166
+ cursor: pointer;
167
+ }
168
+ .btn--ghost {
169
+ background: none;
170
+ border-color: transparent;
171
+ }
172
+ .btn--link {
173
+ background: none;
174
+ border-color: transparent;
175
+ color: var(--fgPrimary);
176
+ }
177
+ .btn--link:hover {
178
+ background: none;
179
+ border-color: transparent;
180
+ text-decoration: underline;
181
+ }
182
+ </style>