@tableslayer/ui 0.1.3 → 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 +2 -13
  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
@@ -0,0 +1,17 @@
1
+ import type { Placement } from '@floating-ui/dom';
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLButtonAttributes } from 'svelte/elements';
4
+ import type { SelectOption } from '../Select';
5
+
6
+ export type SelectorMenuProps = {
7
+ trigger?: Snippet;
8
+ variant?: 'default';
9
+ selected?: string;
10
+ options: SelectOption[];
11
+ onSelectedChange?: (selected: string) => void;
12
+ positioning?: {
13
+ placement?: Placement;
14
+ offset?: number;
15
+ };
16
+ footer?: Snippet<[{ footerProps: { close: () => void } }]>;
17
+ } & HTMLButtonAttributes;
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ let count = $state(0);
3
+
4
+ function handleClick() {
5
+ count += 1;
6
+ }
7
+ </script>
8
+
9
+ <button onclick={handleClick}>
10
+ clicks: {count}
11
+ </button>
@@ -0,0 +1,2 @@
1
+ export { default as Panel } from './panel.svelte';
2
+ export * from './types';
@@ -0,0 +1,18 @@
1
+ <script lang="ts">
2
+ import type { PanelProps } from './types';
3
+ let { variant = 'rounded', borderWidth = 1, children, ...restProps }: PanelProps = $props();
4
+ let panelClasses = $derived(['panel', `panel--${variant}`, `border-${borderWidth}`, restProps.class ?? '']);
5
+ </script>
6
+
7
+ <div {...restProps} class={panelClasses}>
8
+ {@render children()}
9
+ </div>
10
+
11
+ <style>
12
+ .panel {
13
+ background: var(--contrastLowest);
14
+ border: var(--borderThin);
15
+ border-radius: var(--radius-2);
16
+ box-shadow: var(--shadow-1);
17
+ }
18
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+
4
+ export type PanelProps = {
5
+ children: Snippet;
6
+ variant?: 'rounded' | 'cut';
7
+ borderWidth?: number;
8
+ } & HTMLAttributes<HTMLDivElement>;
@@ -0,0 +1,100 @@
1
+ <script lang="ts">
2
+ import { IconPinFilled } from '@tabler/icons-svelte';
3
+
4
+ interface Props {
5
+ visible: boolean;
6
+ position: { x: number; y: number };
7
+ onPersist: () => void;
8
+ onDismiss: () => void;
9
+ }
10
+
11
+ const { visible, position, onPersist, onDismiss }: Props = $props();
12
+
13
+ // Offset button slightly from touch point
14
+ const OFFSET_X = 20;
15
+ const OFFSET_Y = -40;
16
+
17
+ function handleBackdropClick() {
18
+ onDismiss();
19
+ }
20
+
21
+ function handlePersistClick(e: MouseEvent | TouchEvent) {
22
+ e.stopPropagation();
23
+ onPersist();
24
+ }
25
+ </script>
26
+
27
+ {#if visible}
28
+ <div class="persistButton">
29
+ <!-- Transparent backdrop to catch clicks outside -->
30
+ <button class="persistButton__backdrop" onclick={handleBackdropClick} type="button" aria-label="Dismiss"></button>
31
+
32
+ <!-- The persist button -->
33
+ <button
34
+ class="persistButton__btn"
35
+ style:left="{position.x + OFFSET_X}px"
36
+ style:top="{position.y + OFFSET_Y}px"
37
+ onclick={handlePersistClick}
38
+ type="button"
39
+ aria-label="Persist drawing"
40
+ >
41
+ <IconPinFilled size={20} stroke={2} />
42
+ </button>
43
+ </div>
44
+ {/if}
45
+
46
+ <style>
47
+ .persistButton {
48
+ position: fixed;
49
+ inset: 0;
50
+ pointer-events: auto;
51
+ z-index: 500;
52
+ }
53
+
54
+ .persistButton__backdrop {
55
+ position: absolute;
56
+ inset: 0;
57
+ background: transparent;
58
+ border: none;
59
+ cursor: default;
60
+ padding: 0;
61
+ }
62
+
63
+ .persistButton__btn {
64
+ position: absolute;
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ width: 3rem;
69
+ height: 3rem;
70
+ padding: 0;
71
+ background: var(--fgPrimary);
72
+ border: 2px solid var(--bg);
73
+ border-radius: 50%;
74
+ color: var(--bg);
75
+ cursor: pointer;
76
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
77
+ transform: translate(-50%, -50%);
78
+ animation: persistButton__fadeIn 0.15s ease-out;
79
+ }
80
+
81
+ .persistButton__btn:hover {
82
+ background: var(--fg);
83
+ transform: translate(-50%, -50%) scale(1.1);
84
+ }
85
+
86
+ .persistButton__btn:active {
87
+ transform: translate(-50%, -50%) scale(0.95);
88
+ }
89
+
90
+ @keyframes persistButton__fadeIn {
91
+ from {
92
+ opacity: 0;
93
+ transform: translate(-50%, -50%) scale(0.8);
94
+ }
95
+ to {
96
+ opacity: 1;
97
+ transform: translate(-50%, -50%) scale(1);
98
+ }
99
+ }
100
+ </style>
@@ -0,0 +1 @@
1
+ export { default as PersistButton } from './PersistButton.svelte';
@@ -0,0 +1,81 @@
1
+ <script lang="ts">
2
+ import { createPopover, createSync, melt } from '@melt-ui/svelte';
3
+ import { fade } from 'svelte/transition';
4
+ import type { PopoverProps } from './types';
5
+ import type { HTMLBaseAttributes } from 'svelte/elements';
6
+
7
+ let {
8
+ isOpen = false,
9
+ onIsOpenChange,
10
+ trigger,
11
+ content,
12
+ triggerClass,
13
+ triggerTestId,
14
+ contentClass,
15
+ positioning = { placement: 'bottom' },
16
+ portal = null,
17
+ forceVisible,
18
+ closeOnOutsideClick = true
19
+ }: PopoverProps & HTMLBaseAttributes = $props();
20
+
21
+ const {
22
+ elements: { trigger: triggerAction, content: contentAction, close },
23
+ states
24
+ } = createPopover({
25
+ positioning,
26
+ forceVisible,
27
+ portal,
28
+ closeOnOutsideClick
29
+ });
30
+
31
+ const sync = createSync(states);
32
+
33
+ $effect(() => {
34
+ sync.open(isOpen, (v) => {
35
+ isOpen = v;
36
+ onIsOpenChange?.(v);
37
+ });
38
+ });
39
+
40
+ const contentProps = {
41
+ close: () => {
42
+ isOpen = false;
43
+ }
44
+ };
45
+ </script>
46
+
47
+ <button
48
+ type="button"
49
+ class={['popTrigger', triggerClass ?? '']}
50
+ data-testid={triggerTestId}
51
+ use:melt={$triggerAction}
52
+ aria-label="Update dimensions"
53
+ >
54
+ {@render trigger()}
55
+ </button>
56
+
57
+ {#if isOpen}
58
+ <div use:melt={$contentAction} transition:fade={{ duration: 100 }} class={['popContent', contentClass ?? '']}>
59
+ {@render content({ contentProps })}
60
+ <button class="popClose" use:melt={$close}>close</button>
61
+ </div>
62
+ {/if}
63
+
64
+ <style>
65
+ .popTrigger {
66
+ cursor: pointer;
67
+ }
68
+ .popContent {
69
+ padding: var(--size-2);
70
+ background: var(--popoverBg);
71
+ color: var(--fg);
72
+ border: var(--borderThin);
73
+ border-radius: var(--radius-1);
74
+ box-shadow: var(--shadow-1);
75
+ z-index: 1000;
76
+ }
77
+ /* TODO: Maybe I should use this */
78
+ .popClose {
79
+ display: none;
80
+ }
81
+ </style>
@@ -0,0 +1,2 @@
1
+ export { default as Popover } from './Popover.svelte';
2
+ export * from './types';
@@ -0,0 +1,19 @@
1
+ import type { CreatePopoverProps } from '@melt-ui/svelte';
2
+ import type { Snippet } from 'svelte';
3
+ export type PopoverProps = {
4
+ isOpen?: boolean;
5
+ onIsOpenChange?: (open: boolean) => void;
6
+ trigger: Snippet;
7
+ triggerClass?: string;
8
+ triggerTestId?: string;
9
+ contentClass?: string;
10
+ content: Snippet<
11
+ [
12
+ {
13
+ contentProps: {
14
+ close: () => void;
15
+ };
16
+ }
17
+ ]
18
+ >;
19
+ } & CreatePopoverProps;
@@ -0,0 +1,107 @@
1
+ <script>
2
+ import jsonData from '../../../../typedocgen.json';
3
+ import Markdown from '@magidoc/plugin-svelte-marked';
4
+ import { Table, Th, Td, Title, Spacer } from '@tableslayer/ui';
5
+ export let componentName = '';
6
+
7
+ const getComponentData = (componentName) => {
8
+ const component = jsonData.children.find(
9
+ (child) => child.name === componentName && child.variant === 'declaration'
10
+ );
11
+
12
+ if (!component) return null;
13
+
14
+ const props = jsonData.children.find((child) => child.name === `${componentName}Props`);
15
+
16
+ return props?.type ?? null;
17
+ };
18
+
19
+ const getPropsList = (type) => {
20
+ if (type?.type === 'intersection') {
21
+ // Handle intersection types (e.g., ButtonProps extending HTMLButtonAttributes)
22
+ return type.types?.filter((t) => t.type === 'reflection').flatMap((t) => t.declaration.children) || [];
23
+ }
24
+ if (type?.type === 'reflection') {
25
+ // Handle reflection types (e.g., ToolTipProps)
26
+ return type.declaration.children || [];
27
+ }
28
+ return [];
29
+ };
30
+
31
+ const getExtendedProps = (type) => {
32
+ if (type?.type === 'intersection') {
33
+ return (
34
+ type.types
35
+ ?.filter((t) => t.type === 'reference')
36
+ ?.map((t) => `${t.name}`)
37
+ .join(', ') || ''
38
+ );
39
+ }
40
+ return '';
41
+ };
42
+
43
+ const getComment = (prop) => {
44
+ return prop?.comment?.summary?.map((s) => s.text).join(' ') || '';
45
+ };
46
+
47
+ const getDefaultValue = (prop) => {
48
+ const defaultTag = prop?.comment?.blockTags?.find((tag) => tag.tag === '@default');
49
+ return defaultTag ? defaultTag.content[0]?.text || '' : '';
50
+ };
51
+
52
+ const componentType = getComponentData(componentName);
53
+ const extendedProps = getExtendedProps(componentType);
54
+ const propsList = getPropsList(componentType);
55
+ </script>
56
+
57
+ {#if componentType}
58
+ <Title as="h3" size="sm">{componentName} Properties</Title>
59
+ <Spacer size="0.5rem" />
60
+
61
+ {#if extendedProps}
62
+ <p>
63
+ <strong>Extends:</strong>
64
+ {extendedProps}
65
+ </p>
66
+ <Spacer />
67
+ {/if}
68
+
69
+ <Table>
70
+ <thead>
71
+ <tr>
72
+ <Th>Property</Th>
73
+ <Th>Type</Th>
74
+ <Th>Description</Th>
75
+ <Th>Default</Th>
76
+ </tr>
77
+ </thead>
78
+ <tbody>
79
+ {#each propsList as prop}
80
+ <tr>
81
+ <Td>
82
+ <strong>
83
+ {prop.name}
84
+ {#if !prop.flags.isOptional}
85
+ *
86
+ {/if}
87
+ </strong>
88
+ </Td>
89
+ <Td>
90
+ {#if prop.type.type === 'intrinsic'}
91
+ {prop.type.name}
92
+ {/if}
93
+ {#if prop.type.type === 'union'}
94
+ {prop.type.types.map((type) => type.value || type.name).join(' | ')}
95
+ {:else if prop.type.type === 'reference'}
96
+ {prop.type.name}
97
+ {/if}
98
+ </Td>
99
+ <Td><Markdown source={getComment(prop)} /></Td>
100
+ <Td><Markdown source={getDefaultValue(prop)} /></Td>
101
+ </tr>
102
+ {/each}
103
+ </tbody>
104
+ </Table>
105
+ {:else}
106
+ <p>No data available for {componentName}.</p>
107
+ {/if}
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import { Canvas } from '@threlte/core';
3
+ import { AnnotationEffect } from '../Stage/components/AnnotationLayer/types';
4
+ import EffectPreviewScene from './EffectPreviewScene.svelte';
5
+
6
+ interface Props {
7
+ effectType: AnnotationEffect;
8
+ size?: string;
9
+ shape?: 'circle' | 'rounded';
10
+ }
11
+
12
+ const { effectType, size = '3rem', shape = 'circle' }: Props = $props();
13
+ </script>
14
+
15
+ <div class="effectPreview" class:effectPreview--rounded={shape === 'rounded'} style="width: {size}; height: {size};">
16
+ <Canvas>
17
+ <EffectPreviewScene {effectType} {shape} />
18
+ </Canvas>
19
+ </div>
20
+
21
+ <style>
22
+ .effectPreview {
23
+ border-radius: 50%;
24
+ overflow: hidden;
25
+ background: transparent;
26
+ }
27
+
28
+ .effectPreview--rounded {
29
+ border-radius: var(--radius-1);
30
+ }
31
+
32
+ .effectPreview :global(canvas) {
33
+ width: 100% !important;
34
+ height: 100% !important;
35
+ }
36
+ </style>
@@ -0,0 +1,194 @@
1
+ <script lang="ts">
2
+ import * as THREE from 'three';
3
+ import { T, useTask } from '@threlte/core';
4
+ import { AnnotationEffect, getDefaultEffectProps } from '../Stage/components/AnnotationLayer/types';
5
+
6
+ import annotationEffectsFragmentShader from '../Stage/shaders/AnnotationEffects.frag?raw';
7
+ import annotationVertexShader from '../Stage/shaders/default.vert?raw';
8
+
9
+ interface Props {
10
+ effectType: AnnotationEffect;
11
+ shape?: 'circle' | 'rounded';
12
+ }
13
+
14
+ const { effectType, shape = 'circle' }: Props = $props();
15
+
16
+ // Create circular mask texture with mipmaps
17
+ // Use 512x512 to match shader expectations for texSize calculations
18
+ const createCircularMaskTexture = (): THREE.DataTexture => {
19
+ const textureSize = 512;
20
+ const data = new Uint8Array(textureSize * textureSize * 4);
21
+
22
+ const center = textureSize / 2;
23
+ const radius = textureSize / 2 - 4; // Slight inset for smooth edges
24
+
25
+ for (let y = 0; y < textureSize; y++) {
26
+ for (let x = 0; x < textureSize; x++) {
27
+ const dx = x - center;
28
+ const dy = y - center;
29
+ const dist = Math.sqrt(dx * dx + dy * dy);
30
+
31
+ // Smooth anti-aliased edge
32
+ const edge = 1.0 - Math.max(0, Math.min(1, (dist - radius + 2) / 4));
33
+ const value = Math.floor(edge * 255);
34
+
35
+ const idx = (y * textureSize + x) * 4;
36
+ data[idx] = value;
37
+ data[idx + 1] = value;
38
+ data[idx + 2] = value;
39
+ data[idx + 3] = value;
40
+ }
41
+ }
42
+
43
+ const texture = new THREE.DataTexture(data, textureSize, textureSize, THREE.RGBAFormat);
44
+ texture.generateMipmaps = true;
45
+ texture.minFilter = THREE.LinearMipmapLinearFilter;
46
+ texture.magFilter = THREE.LinearFilter;
47
+ texture.needsUpdate = true;
48
+
49
+ return texture;
50
+ };
51
+
52
+ // Create rounded square mask texture with mipmaps
53
+ const createRoundedSquareMaskTexture = (): THREE.DataTexture => {
54
+ const textureSize = 512;
55
+ const data = new Uint8Array(textureSize * textureSize * 4);
56
+
57
+ const inset = 4; // Slight inset for smooth edges
58
+ const halfSize = textureSize / 2 - inset;
59
+ const cornerRadius = textureSize * 0.15; // ~15% corner radius
60
+
61
+ // Signed distance function for rounded rectangle
62
+ const sdRoundedBox = (px: number, py: number, bx: number, by: number, r: number): number => {
63
+ const qx = Math.abs(px) - bx + r;
64
+ const qy = Math.abs(py) - by + r;
65
+ const outsideDist = Math.sqrt(Math.max(qx, 0) ** 2 + Math.max(qy, 0) ** 2);
66
+ const insideDist = Math.min(Math.max(qx, qy), 0);
67
+ return outsideDist + insideDist - r;
68
+ };
69
+
70
+ for (let y = 0; y < textureSize; y++) {
71
+ for (let x = 0; x < textureSize; x++) {
72
+ const px = x - textureSize / 2;
73
+ const py = y - textureSize / 2;
74
+
75
+ const dist = sdRoundedBox(px, py, halfSize, halfSize, cornerRadius);
76
+
77
+ // Smooth anti-aliased edge
78
+ const edge = 1.0 - Math.max(0, Math.min(1, (dist + 2) / 4));
79
+ const value = Math.floor(edge * 255);
80
+
81
+ const idx = (y * textureSize + x) * 4;
82
+ data[idx] = value;
83
+ data[idx + 1] = value;
84
+ data[idx + 2] = value;
85
+ data[idx + 3] = value;
86
+ }
87
+ }
88
+
89
+ const texture = new THREE.DataTexture(data, textureSize, textureSize, THREE.RGBAFormat);
90
+ texture.generateMipmaps = true;
91
+ texture.minFilter = THREE.LinearMipmapLinearFilter;
92
+ texture.magFilter = THREE.LinearFilter;
93
+ texture.needsUpdate = true;
94
+
95
+ return texture;
96
+ };
97
+
98
+ const maskTexture = shape === 'rounded' ? createRoundedSquareMaskTexture() : createCircularMaskTexture();
99
+
100
+ const getEffectColor = (effect: AnnotationEffect): THREE.Vector3 => {
101
+ switch (effect) {
102
+ case AnnotationEffect.Fire:
103
+ return new THREE.Vector3(1.0, 0.3, 0.1);
104
+ case AnnotationEffect.Water:
105
+ return new THREE.Vector3(0.2, 0.5, 0.8);
106
+ case AnnotationEffect.Ice:
107
+ return new THREE.Vector3(0.7, 0.85, 1.0);
108
+ case AnnotationEffect.Magic:
109
+ // Saturated purple (#9333ea) to match AnnotationMaterial
110
+ return new THREE.Vector3(0.576, 0.2, 0.918);
111
+ case AnnotationEffect.Grease:
112
+ return new THREE.Vector3(0.3, 0.2, 0.1);
113
+ case AnnotationEffect.SpaceTear:
114
+ return new THREE.Vector3(0.2, 0.0, 0.4);
115
+ default:
116
+ return new THREE.Vector3(1.0, 1.0, 1.0);
117
+ }
118
+ };
119
+
120
+ const emptyClippingPlanes = [
121
+ new THREE.Vector4(0, 0, 0, 0),
122
+ new THREE.Vector4(0, 0, 0, 0),
123
+ new THREE.Vector4(0, 0, 0, 0),
124
+ new THREE.Vector4(0, 0, 0, 0)
125
+ ];
126
+
127
+ // Replace NUM_CLIPPING_PLANES with 4 directly in the shader source
128
+ // This is needed because Three.js replaces this token before processing defines
129
+ const fragmentShaderFixed = annotationEffectsFragmentShader.replace(/NUM_CLIPPING_PLANES/g, '4');
130
+
131
+ // Get effect defaults and adjust for small preview size
132
+ const effectProps = getDefaultEffectProps(effectType);
133
+ // Reduce border effect for small previews to avoid artifacts
134
+ const previewBorder = Math.min(effectProps.border, 0.2);
135
+
136
+ const material = new THREE.ShaderMaterial({
137
+ uniforms: {
138
+ uMaskTexture: { value: maskTexture },
139
+ uTime: { value: 0.0 },
140
+ uEffectType: { value: effectType },
141
+ uBaseColor: { value: getEffectColor(effectType) },
142
+ uOpacity: { value: 1.0 },
143
+ uSpeed: { value: effectProps.speed },
144
+ uIntensity: { value: effectProps.intensity },
145
+ uSoftness: { value: effectProps.softness },
146
+ uBorder: { value: previewBorder },
147
+ uRoughness: { value: effectProps.roughness },
148
+ uEdgeMinMipMapLevel: { value: 0 },
149
+ uEdgeMaxMipMapLevel: { value: 4 },
150
+ uClippingPlanes: { value: emptyClippingPlanes }
151
+ },
152
+ transparent: true,
153
+ fragmentShader: fragmentShaderFixed,
154
+ vertexShader: annotationVertexShader,
155
+ clipping: false
156
+ });
157
+
158
+ $effect(() => {
159
+ const props = getDefaultEffectProps(effectType);
160
+ material.uniforms.uEffectType.value = effectType;
161
+ material.uniforms.uBaseColor.value = getEffectColor(effectType);
162
+ material.uniforms.uSpeed.value = props.speed;
163
+ material.uniforms.uIntensity.value = props.intensity;
164
+ material.uniforms.uSoftness.value = props.softness;
165
+ material.uniforms.uBorder.value = Math.min(props.border, 0.2);
166
+ material.uniforms.uRoughness.value = props.roughness;
167
+ material.uniformsNeedUpdate = true;
168
+ });
169
+
170
+ // Animate the effect
171
+ useTask((delta) => {
172
+ material.uniforms.uTime.value += delta;
173
+ });
174
+ </script>
175
+
176
+ <T.OrthographicCamera
177
+ makeDefault
178
+ manual
179
+ position.z={1}
180
+ oncreate={(ref) => {
181
+ // Force camera frustum to match our 2x2 plane
182
+ ref.left = -1;
183
+ ref.right = 1;
184
+ ref.top = 1;
185
+ ref.bottom = -1;
186
+ ref.near = 0.1;
187
+ ref.far = 10;
188
+ ref.updateProjectionMatrix();
189
+ }}
190
+ />
191
+ <T.Mesh>
192
+ <T.PlaneGeometry args={[2, 2]} />
193
+ <T is={material} />
194
+ </T.Mesh>