twintrinsic 0.0.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 (212) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +150 -0
  3. package/dist/App/App.svelte +54 -0
  4. package/dist/App/App.svelte.d.ts +65 -0
  5. package/dist/Section.svelte +25 -0
  6. package/dist/Section.svelte.d.ts +34 -0
  7. package/dist/actions/clickOutside.d.ts +9 -0
  8. package/dist/actions/clickOutside.js +19 -0
  9. package/dist/actions/index.d.ts +1 -0
  10. package/dist/actions/index.js +1 -0
  11. package/dist/components/Accordion/Accordion.svelte +75 -0
  12. package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
  13. package/dist/components/Accordion/AccordionItem.svelte +150 -0
  14. package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
  15. package/dist/components/App/App.story.md +8 -0
  16. package/dist/components/App/App.story.svelte +170 -0
  17. package/dist/components/App/App.story.svelte.d.ts +22 -0
  18. package/dist/components/App/App.svelte +77 -0
  19. package/dist/components/App/App.svelte.d.ts +66 -0
  20. package/dist/components/App/Split.svelte +346 -0
  21. package/dist/components/App/Split.svelte.d.ts +54 -0
  22. package/dist/components/App/index.d.ts +2 -0
  23. package/dist/components/App/index.js +3 -0
  24. package/dist/components/AppHeader/AppHeader.svelte +439 -0
  25. package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
  26. package/dist/components/Avatar/Avatar.svelte +300 -0
  27. package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
  28. package/dist/components/Avatar/AvatarGroup.svelte +185 -0
  29. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
  30. package/dist/components/Badge/Badge.svelte +186 -0
  31. package/dist/components/Badge/Badge.svelte.d.ts +51 -0
  32. package/dist/components/BottomBar/BottomBar.svelte +146 -0
  33. package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
  34. package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
  35. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
  36. package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
  37. package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
  38. package/dist/components/Button/Button.svelte +252 -0
  39. package/dist/components/Button/Button.svelte.d.ts +80 -0
  40. package/dist/components/Button/ButtonGroup.svelte +127 -0
  41. package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
  42. package/dist/components/Card/Card.svelte +152 -0
  43. package/dist/components/Card/Card.svelte.d.ts +55 -0
  44. package/dist/components/Carousel/Carousel.svelte +461 -0
  45. package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
  46. package/dist/components/Carousel/CarouselItem.svelte +149 -0
  47. package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
  48. package/dist/components/Chip/Chip.svelte +288 -0
  49. package/dist/components/Chip/Chip.svelte.d.ts +71 -0
  50. package/dist/components/Chip/ChipGroup.svelte +190 -0
  51. package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
  52. package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
  53. package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
  54. package/dist/components/CodeBlock/index.d.ts +1 -0
  55. package/dist/components/CodeBlock/index.js +1 -0
  56. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
  57. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
  58. package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
  59. package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
  60. package/dist/components/Combobox/Combobox.svelte +279 -0
  61. package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
  62. package/dist/components/Container/Container.svelte +45 -0
  63. package/dist/components/Container/Container.svelte.d.ts +36 -0
  64. package/dist/components/DataTable/DataTable.svelte +879 -0
  65. package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
  66. package/dist/components/Form/AutoComplete.svelte +357 -0
  67. package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
  68. package/dist/components/Form/Calendar.svelte +429 -0
  69. package/dist/components/Form/Calendar.svelte.d.ts +53 -0
  70. package/dist/components/Form/Checkbox.svelte +196 -0
  71. package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
  72. package/dist/components/Form/ColorPicker.svelte +396 -0
  73. package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
  74. package/dist/components/Form/Combobox.svelte +645 -0
  75. package/dist/components/Form/Combobox.svelte.d.ts +93 -0
  76. package/dist/components/Form/Dropdown.svelte +773 -0
  77. package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
  78. package/dist/components/Form/FileUpload.svelte +796 -0
  79. package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
  80. package/dist/components/Form/FloatLabel.svelte +245 -0
  81. package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
  82. package/dist/components/Form/Form.svelte +281 -0
  83. package/dist/components/Form/Form.svelte.d.ts +54 -0
  84. package/dist/components/Form/FormField.svelte +218 -0
  85. package/dist/components/Form/FormField.svelte.d.ts +47 -0
  86. package/dist/components/Form/Input.svelte +340 -0
  87. package/dist/components/Form/Input.svelte.d.ts +79 -0
  88. package/dist/components/Form/InputSwitch.svelte +189 -0
  89. package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
  90. package/dist/components/Form/InvalidState.svelte +97 -0
  91. package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
  92. package/dist/components/Form/Knob.svelte +537 -0
  93. package/dist/components/Form/Knob.svelte.d.ts +78 -0
  94. package/dist/components/Form/ListInput.svelte +469 -0
  95. package/dist/components/Form/ListInput.svelte.d.ts +70 -0
  96. package/dist/components/Form/Listbox.svelte +513 -0
  97. package/dist/components/Form/Listbox.svelte.d.ts +74 -0
  98. package/dist/components/Form/NumberInput.svelte +452 -0
  99. package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
  100. package/dist/components/Form/Radio.svelte +192 -0
  101. package/dist/components/Form/Radio.svelte.d.ts +53 -0
  102. package/dist/components/Form/RadioGroup.svelte +155 -0
  103. package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
  104. package/dist/components/Form/Rating.svelte +380 -0
  105. package/dist/components/Form/Rating.svelte.d.ts +64 -0
  106. package/dist/components/Form/Select.svelte +436 -0
  107. package/dist/components/Form/Select.svelte.d.ts +49 -0
  108. package/dist/components/Form/SelectGroup.svelte +34 -0
  109. package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
  110. package/dist/components/Form/Slider.svelte +622 -0
  111. package/dist/components/Form/Slider.svelte.d.ts +73 -0
  112. package/dist/components/Form/Switch.svelte +192 -0
  113. package/dist/components/Form/Switch.svelte.d.ts +46 -0
  114. package/dist/components/Form/TextInput.svelte +274 -0
  115. package/dist/components/Form/TextInput.svelte.d.ts +74 -0
  116. package/dist/components/Form/Textarea.svelte +207 -0
  117. package/dist/components/Form/Textarea.svelte.d.ts +62 -0
  118. package/dist/components/Icon/Icon.svelte +140 -0
  119. package/dist/components/Icon/Icon.svelte.d.ts +25 -0
  120. package/dist/components/Icon/index.d.ts +1 -0
  121. package/dist/components/Icon/index.js +1 -0
  122. package/dist/components/Lazy/Lazy.svelte +158 -0
  123. package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
  124. package/dist/components/Masonry/Masonry.svelte +299 -0
  125. package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
  126. package/dist/components/Menu/Menu/Menu.svelte +65 -0
  127. package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
  128. package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
  129. package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
  130. package/dist/components/Modal/Modal.svelte +334 -0
  131. package/dist/components/Modal/Modal.svelte.d.ts +55 -0
  132. package/dist/components/Panel/Card.svelte +141 -0
  133. package/dist/components/Panel/Card.svelte.d.ts +52 -0
  134. package/dist/components/Panel/Hero/Hero.story.md +9 -0
  135. package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
  136. package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
  137. package/dist/components/Panel/Hero/Hero.svelte +24 -0
  138. package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
  139. package/dist/components/Panel/LazyPanel.svelte +110 -0
  140. package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
  141. package/dist/components/Panel/Panel.svelte +205 -0
  142. package/dist/components/Panel/Panel.svelte.d.ts +23 -0
  143. package/dist/components/Progress/Progress.svelte +220 -0
  144. package/dist/components/Progress/Progress.svelte.d.ts +61 -0
  145. package/dist/components/Separator/Separator.svelte +109 -0
  146. package/dist/components/Separator/Separator.svelte.d.ts +35 -0
  147. package/dist/components/Sidebar/Sidebar.svelte +213 -0
  148. package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
  149. package/dist/components/Skeleton/Skeleton.svelte +170 -0
  150. package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
  151. package/dist/components/Stepper/Stepper.svelte +111 -0
  152. package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
  153. package/dist/components/Stepper/StepperStep.svelte +369 -0
  154. package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
  155. package/dist/components/Table/Table.svelte +167 -0
  156. package/dist/components/Table/Table.svelte.d.ts +56 -0
  157. package/dist/components/Table/TableBody.svelte +41 -0
  158. package/dist/components/Table/TableBody.svelte.d.ts +33 -0
  159. package/dist/components/Table/TableCell.svelte +76 -0
  160. package/dist/components/Table/TableCell.svelte.d.ts +36 -0
  161. package/dist/components/Table/TableHead.svelte +41 -0
  162. package/dist/components/Table/TableHead.svelte.d.ts +32 -0
  163. package/dist/components/Table/TableHeader.svelte +148 -0
  164. package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
  165. package/dist/components/Table/TableRow.svelte +99 -0
  166. package/dist/components/Table/TableRow.svelte.d.ts +40 -0
  167. package/dist/components/Tabs/Tab.svelte +145 -0
  168. package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
  169. package/dist/components/Tabs/TabList.svelte +60 -0
  170. package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
  171. package/dist/components/Tabs/TabPanel.svelte +118 -0
  172. package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
  173. package/dist/components/Tabs/Tabs.svelte +287 -0
  174. package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
  175. package/dist/components/Tag/Tag.svelte +260 -0
  176. package/dist/components/Tag/Tag.svelte.d.ts +54 -0
  177. package/dist/components/Tag/TagGroup.svelte +147 -0
  178. package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
  179. package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
  180. package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
  181. package/dist/components/Timeline/Timeline.svelte +144 -0
  182. package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
  183. package/dist/components/Timeline/TimelineItem.svelte +391 -0
  184. package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
  185. package/dist/components/Toast/Toast.svelte +313 -0
  186. package/dist/components/Toast/Toast.svelte.d.ts +44 -0
  187. package/dist/components/Toast/toastStore.d.ts +40 -0
  188. package/dist/components/Toast/toastStore.js +293 -0
  189. package/dist/components/Tooltip/Tooltip.svelte +282 -0
  190. package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
  191. package/dist/components/Tree/Tree.svelte +129 -0
  192. package/dist/components/Tree/Tree.svelte.d.ts +61 -0
  193. package/dist/components/Tree/TreeNode.svelte +332 -0
  194. package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
  195. package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
  196. package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
  197. package/dist/components/icons/twintrinsic-source.svg +73 -0
  198. package/dist/components/icons/twintrinsic.svg +38 -0
  199. package/dist/docs/EventsTable.svelte +86 -0
  200. package/dist/docs/EventsTable.svelte.d.ts +27 -0
  201. package/dist/docs/PropsTable.svelte +103 -0
  202. package/dist/docs/PropsTable.svelte.d.ts +28 -0
  203. package/dist/docs/index.d.ts +2 -0
  204. package/dist/docs/index.js +2 -0
  205. package/dist/helpers/detectLanguage.d.ts +6 -0
  206. package/dist/helpers/detectLanguage.js +60 -0
  207. package/dist/helpers/index.d.ts +1 -0
  208. package/dist/helpers/index.js +1 -0
  209. package/dist/index.d.ts +86 -0
  210. package/dist/index.js +94 -0
  211. package/dist/twintrinsic.css +347 -0
  212. package/package.json +98 -0
@@ -0,0 +1,32 @@
1
+ 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> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: Props & {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
15
+ default: any;
16
+ } ? Props extends Record<string, never> ? any : {
17
+ children?: any;
18
+ } : {});
19
+ declare const Hero: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
20
+ [x: string]: any;
21
+ heading?: string | null | undefined;
22
+ type?: TypeLevel;
23
+ class?: string | undefined;
24
+ }, {
25
+ default: {};
26
+ }>, {
27
+ [evt: string]: CustomEvent<any>;
28
+ }, {
29
+ default: {};
30
+ }, {}, string>;
31
+ type Hero = InstanceType<typeof Hero>;
32
+ export default Hero;
@@ -0,0 +1,110 @@
1
+ <!--
2
+ @component
3
+ LazyPanel - A Panel component that only loads its content when it becomes visible in the viewport.
4
+ Built on top of the Panel component with intersection observer for lazy loading.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <LazyPanel>
9
+ <svelte:fragment slot="header">Lazy Content</svelte:fragment>
10
+ <svelte:fragment slot="loading">Loading...</svelte:fragment>
11
+ <ExpensiveComponent />
12
+ </LazyPanel>
13
+ ```
14
+ -->
15
+ <script>
16
+ import { onMount } from "svelte"
17
+ import Panel from "./Panel.svelte"
18
+
19
+ const {
20
+ /** @type {boolean} - Whether the panel is expanded */
21
+ expanded = true,
22
+
23
+ /** @type {string} - Additional CSS classes */
24
+ class: className = "",
25
+
26
+ /** @type {string} - HTML id for accessibility */
27
+ id = crypto.randomUUID(),
28
+
29
+ /** @type {string} - ARIA label */
30
+ ariaLabel,
31
+
32
+ /** @type {boolean} - Whether to disable the panel controls */
33
+ disabled = false,
34
+
35
+ /** @type {boolean} - Whether to show a border */
36
+ bordered = true,
37
+
38
+ /** @type {boolean} - Whether to show the expand/collapse icon */
39
+ showIcon = true,
40
+
41
+ /** @type {number} - Root margin for intersection observer */
42
+ rootMargin = "50px",
43
+
44
+ /** @type {number} - Threshold for intersection observer */
45
+ threshold = 0,
46
+
47
+ children,
48
+ header,
49
+ loading,
50
+ } = $props()
51
+
52
+ let isVisible = $state(false)
53
+ let panelElement
54
+ let observer
55
+
56
+ onMount(() => {
57
+ observer = new IntersectionObserver(
58
+ (entries) => {
59
+ const [entry] = entries
60
+ if (entry.isIntersecting) {
61
+ isVisible = true
62
+ // Once visible, disconnect the observer
63
+ observer.disconnect()
64
+ }
65
+ },
66
+ {
67
+ rootMargin,
68
+ threshold,
69
+ }
70
+ )
71
+
72
+ if (panelElement) {
73
+ observer.observe(panelElement)
74
+ }
75
+
76
+ return () => {
77
+ if (observer) {
78
+ observer.disconnect()
79
+ }
80
+ }
81
+ })
82
+ </script>
83
+
84
+ <div bind:this={panelElement}>
85
+ <Panel
86
+ {expanded}
87
+ class={className}
88
+ {id}
89
+ {ariaLabel}
90
+ {disabled}
91
+ {bordered}
92
+ {showIcon}
93
+ >
94
+ <svelte:fragment slot="header">
95
+ {@render header?.()}
96
+ </svelte:fragment>
97
+
98
+ {#if isVisible}
99
+ {@render children?.()}
100
+ {:else if loading}
101
+ {@render loading()}
102
+ {:else}
103
+ Loading...
104
+ {/if}
105
+ </Panel>
106
+ </div>
107
+
108
+ <style>
109
+ @reference "../../twintrinsic.css";
110
+ </style>
@@ -0,0 +1,46 @@
1
+ export default LazyPanel;
2
+ type LazyPanel = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * LazyPanel - A Panel component that only loads its content when it becomes visible in the viewport.
8
+ * Built on top of the Panel component with intersection observer for lazy loading.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <LazyPanel>
13
+ * <svelte:fragment slot="header">Lazy Content</svelte:fragment>
14
+ * <svelte:fragment slot="loading">Loading...</svelte:fragment>
15
+ * <ExpensiveComponent />
16
+ * </LazyPanel>
17
+ * ```
18
+ */
19
+ declare const LazyPanel: import("svelte").Component<{
20
+ expanded?: boolean;
21
+ class?: string;
22
+ id?: any;
23
+ ariaLabel: any;
24
+ disabled?: boolean;
25
+ bordered?: boolean;
26
+ showIcon?: boolean;
27
+ rootMargin?: string;
28
+ threshold?: number;
29
+ children: any;
30
+ header: any;
31
+ loading: any;
32
+ }, {}, "">;
33
+ type $$ComponentProps = {
34
+ expanded?: boolean;
35
+ class?: string;
36
+ id?: any;
37
+ ariaLabel: any;
38
+ disabled?: boolean;
39
+ bordered?: boolean;
40
+ showIcon?: boolean;
41
+ rootMargin?: string;
42
+ threshold?: number;
43
+ children: any;
44
+ header: any;
45
+ loading: any;
46
+ };
@@ -0,0 +1,205 @@
1
+ <!--
2
+ @component
3
+ Panel - A collapsible container with header and content sections.
4
+ Provides smooth animations and keyboard accessibility.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <Panel>
9
+ <svelte:fragment slot="header">Panel Title</svelte:fragment>
10
+ Content goes here
11
+ </Panel>
12
+
13
+ <Panel expanded={false} class="custom-class">
14
+ <svelte:fragment slot="header">
15
+ <Icon name="settings" />
16
+ Settings
17
+ </svelte:fragment>
18
+ Settings content
19
+ </Panel>
20
+ ```
21
+ -->
22
+ <script lang="ts">
23
+ import { slide } from "svelte/transition"
24
+ import type { Snippet } from "svelte"
25
+
26
+ /**
27
+ * @slot header Renders custom header content for the panel button
28
+ * @slot default Provides the main panel body content
29
+ * @slot footer Displays supplemental content below the body (e.g., actions)
30
+ */
31
+ type PanelProps = {
32
+ /** Whether the panel is expanded */
33
+ expanded?: boolean
34
+ /** Additional CSS classes */
35
+ class?: string
36
+ /** HTML id for accessibility */
37
+ id?: string
38
+ /** ARIA label for the header button */
39
+ ariaLabel?: string | null
40
+ /** Whether to disable the panel controls */
41
+ disabled?: boolean
42
+ /** Whether to show a border */
43
+ bordered?: boolean
44
+ /** Whether to show the expand/collapse icon */
45
+ showIcon?: boolean
46
+ /** Slot content for the panel body */
47
+ children?: Snippet | null
48
+ /** Slot content for the header */
49
+ header?: Snippet | null
50
+ /** Slot content rendered below the body */
51
+ footer?: Snippet | null
52
+ /** Callback invoked whenever the panel toggles expanded state */
53
+ ontoggle?: (payload: { expanded: boolean }) => void
54
+ }
55
+
56
+ const {
57
+ /** @type {boolean} - Whether the panel is expanded */
58
+ expanded = true,
59
+
60
+ /** @type {string} - Additional CSS classes */
61
+ class: className = "",
62
+
63
+ /** @type {string} - HTML id for accessibility */
64
+ id = crypto.randomUUID(),
65
+
66
+ /** @type {string} - ARIA label for the header button */
67
+ ariaLabel = null,
68
+
69
+ /** @type {boolean} - Whether to disable the panel controls */
70
+ disabled = false,
71
+
72
+ /** @type {boolean} - Whether to show a border */
73
+ bordered = true,
74
+
75
+ /** @type {boolean} - Whether to show the expand/collapse icon */
76
+ showIcon = true,
77
+
78
+ children = null,
79
+ header = null,
80
+ footer = null,
81
+ } = $props() satisfies PanelProps
82
+
83
+ let isExpanded = $state(true)
84
+
85
+ // Internal state
86
+ let headerEl = $state<HTMLButtonElement | null>(null)
87
+ let contentEl = $state<HTMLDivElement | null>(null)
88
+
89
+ // Update expanded state when prop changes
90
+ $effect(() => {
91
+ isExpanded = expanded
92
+ })
93
+
94
+ // Handle toggle
95
+ function handleToggle() {
96
+ if (disabled) return
97
+
98
+ isExpanded = !isExpanded
99
+ ontoggle?.({ expanded: isExpanded })
100
+ }
101
+
102
+ // Handle keyboard navigation
103
+ function handleKeydown(event: KeyboardEvent) {
104
+ if (disabled) return
105
+
106
+ if (event.key === "Enter" || event.key === " ") {
107
+ event.preventDefault()
108
+ handleToggle()
109
+ }
110
+ }
111
+ </script>
112
+
113
+ <div
114
+ class="panel {bordered ? 'border border-border dark:border-border rounded-lg' : ''} {className}"
115
+ class:disabled
116
+ >
117
+ <button
118
+ type="button"
119
+ id="{id}-header"
120
+ class="
121
+ w-full flex items-center justify-between
122
+ px-4 py-3
123
+ text-left
124
+ bg-surface dark:bg-surface
125
+ hover:bg-hover dark:hover:bg-hover
126
+ focus:outline-none focus:ring-2 focus:ring-focus-ring dark:focus:ring-focus-ring
127
+ disabled:opacity-50 disabled:cursor-not-allowed
128
+ text-text dark:text-text
129
+ {bordered ? 'rounded-t-lg' : 'rounded-lg'}
130
+ "
131
+ aria-expanded={isExpanded}
132
+ aria-controls="{id}-content"
133
+ aria-label={ariaLabel}
134
+ {disabled}
135
+ onclick={handleToggle}
136
+ onkeydown={handleKeydown}
137
+ bind:this={headerEl}
138
+ >
139
+ <div class="flex items-center gap-2">
140
+ {#if header}
141
+ {@render header()}
142
+ {:else}
143
+ Panel
144
+ {/if}
145
+ </div>
146
+
147
+ {#if showIcon}
148
+ <svg
149
+ class="w-5 h-5 transform transition-transform duration-200 text-muted dark:text-muted {isExpanded ? 'rotate-180' : ''}"
150
+ xmlns="http://www.w3.org/2000/svg"
151
+ viewBox="0 0 20 20"
152
+ fill="currentColor"
153
+ aria-hidden="true"
154
+ >
155
+ <path
156
+ fill-rule="evenodd"
157
+ d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
158
+ clip-rule="evenodd"
159
+ />
160
+ </svg>
161
+ {/if}
162
+ </button>
163
+
164
+ {#if isExpanded}
165
+ <div
166
+ id="{id}-content"
167
+ class="px-4 py-3 bg-background dark:bg-background text-text dark:text-text"
168
+ role="region"
169
+ aria-labelledby="{id}-header"
170
+ transition:slide={{ duration: 200 }}
171
+ bind:this={contentEl}
172
+ class:rounded-b-lg={!footer && bordered}
173
+ >
174
+ {@render children?.()}
175
+ </div>
176
+
177
+ {#if footer}
178
+ <div
179
+ class="px-4 py-3 bg-background dark:bg-background text-muted dark:text-muted"
180
+ class:border-t={bordered}
181
+ class:border-border={bordered}
182
+ class:rounded-b-lg={bordered}
183
+ >
184
+ {@render footer()}
185
+ </div>
186
+ {/if}
187
+ {/if}
188
+ </div>
189
+
190
+ <style>
191
+ @reference "../../twintrinsic.css";
192
+ /* Base styles that work with Tailwind */
193
+ .panel {
194
+ @apply overflow-hidden;
195
+ }
196
+
197
+ .panel.disabled {
198
+ @apply opacity-50 cursor-not-allowed;
199
+ }
200
+
201
+ /* Ensure the content area has proper spacing when collapsed */
202
+ .panel :global(.svelte-collapse-content) {
203
+ @apply overflow-hidden;
204
+ }
205
+ </style>
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Panel - A collapsible container with header and content sections.
3
+ * Provides smooth animations and keyboard accessibility.
4
+ *
5
+ * Usage:
6
+ * ```svelte
7
+ * <Panel>
8
+ * <svelte:fragment slot="header">Panel Title</svelte:fragment>
9
+ * Content goes here
10
+ * </Panel>
11
+ *
12
+ * <Panel expanded={false} class="custom-class">
13
+ * <svelte:fragment slot="header">
14
+ * <Icon name="settings" />
15
+ * Settings
16
+ * </svelte:fragment>
17
+ * Settings content
18
+ * </Panel>
19
+ * ```
20
+ */
21
+ declare const Panel: import("svelte").Component<Record<string, never>, {}, "">;
22
+ type Panel = ReturnType<typeof Panel>;
23
+ export default Panel;
@@ -0,0 +1,220 @@
1
+ <!--
2
+ @component
3
+ Progress - A component for displaying progress bars and indicators.
4
+ Provides consistent styling, accessibility features, and various display options.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <Progress value={75} />
9
+
10
+ <Progress
11
+ value={42}
12
+ max={100}
13
+ variant="primary"
14
+ showValue
15
+ />
16
+
17
+ <Progress
18
+ value={0.8}
19
+ max={1}
20
+ variant="success"
21
+ size="lg"
22
+ format={(v) => `${Math.round(v * 100)}%`}
23
+ />
24
+ ```
25
+ -->
26
+ <script>
27
+ const {
28
+ /** @type {string} - Additional CSS classes */
29
+ class: className = "",
30
+
31
+ /** @type {string} - HTML id for accessibility */
32
+ id = crypto.randomUUID(),
33
+
34
+ /** @type {number} - Current value */
35
+ value = 0,
36
+
37
+ /** @type {number} - Maximum value */
38
+ max = 100,
39
+
40
+ /** @type {number} - Minimum value */
41
+ min = 0,
42
+
43
+ /** @type {string} - Visual style variant */
44
+ variant = "primary",
45
+
46
+ /** @type {string} - Size of the progress bar (sm, md, lg) */
47
+ size = "md",
48
+
49
+ /** @type {boolean} - Whether to show the value as text */
50
+ showValue = false,
51
+
52
+ /** @type {boolean} - Whether to show the value inside the progress bar */
53
+ valueInside = false,
54
+
55
+ /** @type {boolean} - Whether to show a striped pattern */
56
+ striped = false,
57
+
58
+ /** @type {boolean} - Whether to animate the striped pattern */
59
+ animated = false,
60
+
61
+ /** @type {boolean} - Whether to show an indeterminate loading animation */
62
+ indeterminate = false,
63
+
64
+ /** @type {Function} - Custom function to format the displayed value */
65
+ format,
66
+
67
+ /** @type {string} - ARIA label for accessibility */
68
+ ariaLabel,
69
+ } = $props()
70
+
71
+ // Calculate percentage for width
72
+ const percentage = $derived(Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100)))
73
+
74
+ // Format value for display
75
+ const formattedValue = $derived(format ? format(value, min, max) : `${Math.round(percentage)}%`)
76
+
77
+ // Determine size classes
78
+ const sizeClasses = $derived(
79
+ {
80
+ sm: "h-1.5",
81
+ md: "h-2.5",
82
+ lg: "h-4",
83
+ }[size] || "h-2.5"
84
+ )
85
+
86
+ // Determine text size classes
87
+ const textSizeClasses = $derived(
88
+ {
89
+ sm: "text-xs",
90
+ md: "text-sm",
91
+ lg: "text-base",
92
+ }[size] || "text-sm"
93
+ )
94
+
95
+ // Determine variant classes
96
+ const variantClasses = $derived(
97
+ {
98
+ default: "bg-muted/20 dark:bg-muted/20",
99
+ primary: "bg-primary-500 dark:bg-primary-500",
100
+ secondary: "bg-secondary-500 dark:bg-secondary-500",
101
+ success: "bg-success-500 dark:bg-success-500",
102
+ warning: "bg-warning-500 dark:bg-warning-500",
103
+ error: "bg-error-500 dark:bg-error-500",
104
+ info: "bg-info-500 dark:bg-info-500",
105
+ }[variant] || "bg-primary-500 dark:bg-primary-500"
106
+ )
107
+
108
+ // Determine track classes
109
+ const trackClasses = $derived("bg-muted/10 dark:bg-muted/10")
110
+
111
+ // Generate ARIA label
112
+ const progressAriaLabel = $derived(ariaLabel || `Progress: ${formattedValue}`)
113
+ </script>
114
+
115
+ <div
116
+ class="progress-container {className}"
117
+ >
118
+ {#if showValue && !valueInside}
119
+ <div class="progress-label {textSizeClasses}">
120
+ {formattedValue}
121
+ </div>
122
+ {/if}
123
+
124
+ <div
125
+ {id}
126
+ class="
127
+ progress
128
+ {sizeClasses}
129
+ {trackClasses}
130
+ "
131
+ role="progressbar"
132
+ aria-valuenow={indeterminate ? undefined : value}
133
+ aria-valuemin={min}
134
+ aria-valuemax={max}
135
+ aria-label={progressAriaLabel}
136
+ >
137
+ <div
138
+ class="
139
+ progress-bar
140
+ {variantClasses}
141
+ {striped ? 'progress-striped' : ''}
142
+ {animated ? 'progress-animated' : ''}
143
+ {indeterminate ? 'progress-indeterminate' : ''}
144
+ "
145
+ style={indeterminate ? '' : `width: ${percentage}%`}
146
+ >
147
+ {#if showValue && valueInside}
148
+ <span class="progress-value {textSizeClasses}">
149
+ {formattedValue}
150
+ </span>
151
+ {/if}
152
+ </div>
153
+ </div>
154
+ </div>
155
+
156
+ <style>
157
+ @reference "../../twintrinsic.css";
158
+
159
+ .progress-container {
160
+ @apply w-full;
161
+ }
162
+
163
+ .progress-label {
164
+ @apply mb-1 font-medium text-text dark:text-text;
165
+ }
166
+
167
+ .progress {
168
+ @apply w-full overflow-hidden rounded-full;
169
+ }
170
+
171
+ .progress-bar {
172
+ @apply h-full rounded-full transition-all duration-300 ease-out;
173
+ }
174
+
175
+ .progress-value {
176
+ @apply text-white dark:text-white font-medium px-2;
177
+ @apply flex items-center h-full;
178
+ }
179
+
180
+ .progress-striped {
181
+ background-image: linear-gradient(
182
+ 45deg,
183
+ rgba(255, 255, 255, 0.15) 25%,
184
+ transparent 25%,
185
+ transparent 50%,
186
+ rgba(255, 255, 255, 0.15) 50%,
187
+ rgba(255, 255, 255, 0.15) 75%,
188
+ transparent 75%,
189
+ transparent
190
+ );
191
+ background-size: 1rem 1rem;
192
+ }
193
+
194
+ .progress-animated {
195
+ animation: progress-stripes 1s linear infinite;
196
+ }
197
+
198
+ .progress-indeterminate {
199
+ width: 50%;
200
+ animation: progress-indeterminate 1.5s ease-in-out infinite;
201
+ }
202
+
203
+ @keyframes progress-stripes {
204
+ from {
205
+ background-position: 1rem 0;
206
+ }
207
+ to {
208
+ background-position: 0 0;
209
+ }
210
+ }
211
+
212
+ @keyframes progress-indeterminate {
213
+ 0% {
214
+ transform: translateX(-100%);
215
+ }
216
+ 100% {
217
+ transform: translateX(200%);
218
+ }
219
+ }
220
+ </style>
@@ -0,0 +1,61 @@
1
+ export default Progress;
2
+ type Progress = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * Progress - A component for displaying progress bars and indicators.
8
+ * Provides consistent styling, accessibility features, and various display options.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Progress value={75} />
13
+ *
14
+ * <Progress
15
+ * value={42}
16
+ * max={100}
17
+ * variant="primary"
18
+ * showValue
19
+ * />
20
+ *
21
+ * <Progress
22
+ * value={0.8}
23
+ * max={1}
24
+ * variant="success"
25
+ * size="lg"
26
+ * format={(v) => `${Math.round(v * 100)}%`}
27
+ * />
28
+ * ```
29
+ */
30
+ declare const Progress: import("svelte").Component<{
31
+ class?: string;
32
+ id?: any;
33
+ value?: number;
34
+ max?: number;
35
+ min?: number;
36
+ variant?: string;
37
+ size?: string;
38
+ showValue?: boolean;
39
+ valueInside?: boolean;
40
+ striped?: boolean;
41
+ animated?: boolean;
42
+ indeterminate?: boolean;
43
+ format: any;
44
+ ariaLabel: any;
45
+ }, {}, "">;
46
+ type $$ComponentProps = {
47
+ class?: string;
48
+ id?: any;
49
+ value?: number;
50
+ max?: number;
51
+ min?: number;
52
+ variant?: string;
53
+ size?: string;
54
+ showValue?: boolean;
55
+ valueInside?: boolean;
56
+ striped?: boolean;
57
+ animated?: boolean;
58
+ indeterminate?: boolean;
59
+ format: any;
60
+ ariaLabel: any;
61
+ };