opui-css 5.1.2 → 5.3.0

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 (290) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +4 -5
  3. package/components/AGENTS.md +12 -13
  4. package/components/Accordion/Accordion.astro +5 -9
  5. package/components/Accordion/Accordion.vue +38 -0
  6. package/components/Accordion/types.astro.ts +4 -0
  7. package/components/Accordion/types.d.vue.ts +15 -0
  8. package/components/Accordion/types.solid.ts +6 -0
  9. package/components/Accordion/types.svelte.ts +7 -0
  10. package/components/Accordion/types.ts +10 -0
  11. package/components/Anchor/Anchor.astro +1 -7
  12. package/components/Anchor/Anchor.vue +41 -0
  13. package/components/Anchor/types.astro.ts +4 -0
  14. package/components/Anchor/types.d.vue.ts +10 -0
  15. package/components/Anchor/types.solid.ts +6 -0
  16. package/components/Anchor/types.svelte.ts +7 -0
  17. package/components/Anchor/types.ts +9 -0
  18. package/components/Avatar/Avatar.astro +4 -13
  19. package/components/Avatar/Avatar.vue +24 -0
  20. package/components/Avatar/types.astro.ts +10 -0
  21. package/components/Avatar/types.d.vue.ts +11 -0
  22. package/components/Avatar/types.solid.ts +11 -0
  23. package/components/Avatar/types.svelte.ts +12 -0
  24. package/components/Avatar/types.ts +29 -0
  25. package/components/Badge/Badge.astro +3 -11
  26. package/components/Badge/Badge.vue +39 -0
  27. package/components/Badge/types.astro.ts +4 -0
  28. package/components/Badge/types.d.vue.ts +10 -0
  29. package/components/Badge/types.solid.ts +4 -0
  30. package/components/Badge/types.svelte.ts +4 -0
  31. package/components/Badge/types.ts +8 -0
  32. package/components/Button/Button.astro +18 -27
  33. package/components/Button/Button.vue +27 -0
  34. package/components/Button/types.astro.ts +6 -0
  35. package/components/Button/types.d.vue.ts +10 -0
  36. package/components/Button/types.solid.ts +8 -0
  37. package/components/Button/types.svelte.ts +6 -0
  38. package/components/Button/types.ts +16 -0
  39. package/components/ButtonGroup/ButtonGroup.astro +1 -8
  40. package/components/ButtonGroup/ButtonGroup.vue +22 -0
  41. package/components/ButtonGroup/types.astro.ts +4 -0
  42. package/components/ButtonGroup/types.d.vue.ts +10 -0
  43. package/components/ButtonGroup/types.solid.ts +4 -0
  44. package/components/ButtonGroup/types.svelte.ts +4 -0
  45. package/components/ButtonGroup/types.ts +7 -0
  46. package/components/Callout/Callout.astro +10 -9
  47. package/components/Callout/Callout.vue +63 -0
  48. package/components/Callout/types.astro.ts +4 -0
  49. package/components/Callout/types.d.vue.ts +10 -0
  50. package/components/Callout/types.solid.ts +6 -0
  51. package/components/Callout/types.svelte.ts +7 -0
  52. package/components/Callout/types.ts +10 -0
  53. package/components/Card/Card.astro +1 -5
  54. package/components/Card/Card.vue +28 -0
  55. package/components/Card/types.astro.ts +4 -0
  56. package/components/Card/types.d.vue.ts +10 -0
  57. package/components/Card/types.solid.ts +6 -0
  58. package/components/Card/types.svelte.ts +7 -0
  59. package/components/Card/types.ts +11 -0
  60. package/components/Checkbox/Checkbox.astro +6 -36
  61. package/components/Checkbox/Checkbox.vue +43 -0
  62. package/components/Checkbox/CheckboxInput.astro +2 -18
  63. package/components/Checkbox/CheckboxInput.vue +32 -0
  64. package/components/Checkbox/types.astro.ts +8 -0
  65. package/components/Checkbox/types.d.vue.ts +11 -0
  66. package/components/Checkbox/types.solid.ts +9 -0
  67. package/components/Checkbox/types.svelte.ts +12 -0
  68. package/components/Checkbox/types.ts +16 -0
  69. package/components/Chip/Chip.astro +6 -12
  70. package/components/Chip/Chip.vue +37 -0
  71. package/components/Chip/types.astro.ts +9 -0
  72. package/components/Chip/types.d.vue.ts +10 -0
  73. package/components/Chip/types.solid.ts +10 -0
  74. package/components/Chip/types.svelte.ts +14 -0
  75. package/components/Chip/types.ts +13 -0
  76. package/components/ClassicSelect/ClassicSelect.astro +5 -28
  77. package/components/ClassicSelect/ClassicSelect.vue +54 -0
  78. package/components/ClassicSelect/types.astro.ts +8 -0
  79. package/components/ClassicSelect/types.d.vue.ts +10 -0
  80. package/components/ClassicSelect/types.solid.ts +5 -0
  81. package/components/ClassicSelect/types.svelte.ts +5 -0
  82. package/components/ClassicSelect/types.ts +15 -0
  83. package/components/DescriptionList/Description.astro +1 -4
  84. package/components/DescriptionList/Description.vue +12 -0
  85. package/components/DescriptionList/DescriptionList.astro +1 -5
  86. package/components/DescriptionList/DescriptionList.vue +23 -0
  87. package/components/DescriptionList/Item.astro +1 -4
  88. package/components/DescriptionList/Item.vue +12 -0
  89. package/components/DescriptionList/Term.astro +1 -4
  90. package/components/DescriptionList/Term.vue +12 -0
  91. package/components/DescriptionList/types.astro.ts +10 -0
  92. package/components/DescriptionList/types.d.vue.ts +10 -0
  93. package/components/DescriptionList/types.solid.ts +4 -0
  94. package/components/DescriptionList/types.svelte.ts +4 -0
  95. package/components/DescriptionList/types.ts +3 -0
  96. package/components/Dialog/Dialog.astro +1 -6
  97. package/components/Dialog/Dialog.vue +35 -0
  98. package/components/Dialog/types.astro.ts +4 -0
  99. package/components/Dialog/types.d.vue.ts +10 -0
  100. package/components/Dialog/types.solid.ts +8 -0
  101. package/components/Dialog/types.svelte.ts +7 -0
  102. package/components/Dialog/types.ts +10 -0
  103. package/components/Divider/Divider.astro +1 -6
  104. package/components/Divider/Divider.vue +12 -0
  105. package/components/Divider/types.astro.ts +4 -0
  106. package/components/Divider/types.d.vue.ts +6 -0
  107. package/components/Divider/types.solid.ts +4 -0
  108. package/components/Divider/types.svelte.ts +4 -0
  109. package/components/Divider/types.ts +3 -0
  110. package/components/Drawer/Drawer.astro +10 -12
  111. package/components/Drawer/Drawer.vue +46 -0
  112. package/components/Drawer/DrawerFooter.astro +1 -4
  113. package/components/Drawer/DrawerFooter.vue +16 -0
  114. package/components/Drawer/DrawerHeader.astro +1 -5
  115. package/components/Drawer/DrawerHeader.vue +36 -0
  116. package/components/Drawer/types.astro.ts +8 -0
  117. package/components/Drawer/types.d.vue.ts +31 -0
  118. package/components/Drawer/types.solid.ts +12 -0
  119. package/components/Drawer/types.svelte.ts +15 -0
  120. package/components/Drawer/types.ts +20 -0
  121. package/components/FieldDescription/FieldDescription.astro +1 -5
  122. package/components/FieldDescription/FieldDescription.vue +12 -0
  123. package/components/FieldDescription/types.astro.ts +4 -0
  124. package/components/FieldDescription/types.d.vue.ts +10 -0
  125. package/components/FieldDescription/types.solid.ts +5 -0
  126. package/components/FieldDescription/types.svelte.ts +4 -0
  127. package/components/FieldDescription/types.ts +1 -0
  128. package/components/FieldGroup/FieldGroup.astro +1 -8
  129. package/components/FieldGroup/FieldGroup.vue +25 -0
  130. package/components/FieldGroup/types.astro.ts +4 -0
  131. package/components/FieldGroup/types.d.vue.ts +12 -0
  132. package/components/FieldGroup/types.solid.ts +5 -0
  133. package/components/FieldGroup/types.svelte.ts +4 -0
  134. package/components/FieldGroup/types.ts +4 -0
  135. package/components/FieldLegend/FieldLegend.astro +4 -8
  136. package/components/FieldLegend/FieldLegend.vue +18 -0
  137. package/components/FieldLegend/types.astro.ts +6 -0
  138. package/components/FieldLegend/types.d.vue.ts +11 -0
  139. package/components/FieldLegend/types.solid.ts +5 -0
  140. package/components/FieldLegend/types.svelte.ts +6 -0
  141. package/components/FieldLegend/types.ts +1 -0
  142. package/components/FieldSet/FieldSet.astro +1 -5
  143. package/components/FieldSet/FieldSet.vue +18 -0
  144. package/components/FieldSet/types.astro.ts +6 -0
  145. package/components/FieldSet/types.d.vue.ts +11 -0
  146. package/components/FieldSet/types.solid.ts +5 -0
  147. package/components/FieldSet/types.svelte.ts +8 -0
  148. package/components/FieldSet/types.ts +5 -0
  149. package/components/Form/Form.astro +1 -6
  150. package/components/Form/Form.vue +14 -0
  151. package/components/Form/types.astro.ts +6 -0
  152. package/components/Form/types.d.vue.ts +11 -0
  153. package/components/Form/types.solid.ts +5 -0
  154. package/components/Form/types.svelte.ts +7 -0
  155. package/components/Form/types.ts +1 -0
  156. package/components/IconButton/IconButton.astro +18 -20
  157. package/components/IconButton/IconButton.vue +24 -0
  158. package/components/IconButton/types.astro.ts +6 -0
  159. package/components/IconButton/types.d.vue.ts +10 -0
  160. package/components/IconButton/types.solid.ts +8 -0
  161. package/components/IconButton/types.svelte.ts +6 -0
  162. package/components/IconButton/types.ts +16 -0
  163. package/components/List/List.astro +1 -8
  164. package/components/List/List.vue +28 -0
  165. package/components/List/types.astro.ts +4 -0
  166. package/components/List/types.d.vue.ts +10 -0
  167. package/components/List/types.solid.ts +4 -0
  168. package/components/List/types.svelte.ts +4 -0
  169. package/components/List/types.ts +7 -0
  170. package/components/ListItem/ListItem.astro +3 -13
  171. package/components/ListItem/ListItem.vue +98 -0
  172. package/components/ListItem/types.astro.ts +10 -0
  173. package/components/ListItem/types.d.vue.ts +10 -0
  174. package/components/ListItem/types.solid.ts +12 -0
  175. package/components/ListItem/types.svelte.ts +14 -0
  176. package/components/ListItem/types.ts +32 -0
  177. package/components/Progress/Progress.astro +1 -11
  178. package/components/Progress/Progress.vue +34 -0
  179. package/components/Progress/types.astro.ts +4 -0
  180. package/components/Progress/types.d.vue.ts +10 -0
  181. package/components/Progress/types.solid.ts +4 -0
  182. package/components/Progress/types.svelte.ts +4 -0
  183. package/components/Progress/types.ts +10 -0
  184. package/components/Radio/Radio.astro +6 -32
  185. package/components/Radio/Radio.vue +41 -0
  186. package/components/Radio/RadioInput.astro +3 -20
  187. package/components/Radio/RadioInput.vue +14 -0
  188. package/components/Radio/types.astro.ts +6 -0
  189. package/components/Radio/types.d.vue.ts +11 -0
  190. package/components/Radio/types.solid.ts +9 -0
  191. package/components/Radio/types.svelte.ts +12 -0
  192. package/components/Radio/types.ts +12 -0
  193. package/components/Range/Range.astro +23 -31
  194. package/components/Range/Range.vue +85 -0
  195. package/components/Range/types.astro.ts +6 -0
  196. package/components/Range/types.d.vue.ts +14 -0
  197. package/components/Range/types.solid.ts +6 -0
  198. package/components/Range/types.svelte.ts +9 -0
  199. package/components/Range/types.ts +25 -0
  200. package/components/Select/Select.astro +41 -39
  201. package/components/Select/Select.vue +85 -0
  202. package/components/Select/types.astro.ts +4 -0
  203. package/components/Select/types.d.vue.ts +17 -0
  204. package/components/Select/types.solid.ts +6 -0
  205. package/components/Select/types.svelte.ts +7 -0
  206. package/components/Select/types.ts +27 -0
  207. package/components/Switch/Switch.astro +14 -39
  208. package/components/Switch/Switch.vue +63 -0
  209. package/components/Switch/SwitchInput.astro +3 -21
  210. package/components/Switch/SwitchInput.vue +14 -0
  211. package/components/Switch/types.astro.ts +5 -0
  212. package/components/Switch/types.d.vue.ts +13 -0
  213. package/components/Switch/types.solid.ts +9 -0
  214. package/components/Switch/types.svelte.ts +9 -0
  215. package/components/Switch/types.ts +16 -0
  216. package/components/Table/Body.astro +1 -3
  217. package/components/Table/Body.vue +5 -0
  218. package/components/Table/Cell.astro +1 -3
  219. package/components/Table/Cell.vue +5 -0
  220. package/components/Table/Column.astro +1 -4
  221. package/components/Table/Column.vue +19 -0
  222. package/components/Table/ColumnGroup.astro +1 -3
  223. package/components/Table/ColumnGroup.vue +5 -0
  224. package/components/Table/Head.astro +1 -3
  225. package/components/Table/Head.vue +5 -0
  226. package/components/Table/HeaderCell.astro +1 -3
  227. package/components/Table/HeaderCell.vue +5 -0
  228. package/components/Table/Row.astro +1 -3
  229. package/components/Table/Row.vue +5 -0
  230. package/components/Table/Table.astro +1 -5
  231. package/components/Table/Table.vue +19 -0
  232. package/components/Table/types.astro.ts +16 -0
  233. package/components/Table/types.d.vue.ts +10 -0
  234. package/components/Table/types.solid.ts +8 -0
  235. package/components/Table/types.svelte.ts +11 -0
  236. package/components/Table/types.ts +9 -0
  237. package/components/Tabs/Tabs.astro +1 -5
  238. package/components/Tabs/Tabs.vue +20 -0
  239. package/components/Tabs/TabsItem.astro +1 -8
  240. package/components/Tabs/TabsItem.vue +39 -0
  241. package/components/Tabs/TabsPanel.astro +1 -6
  242. package/components/Tabs/TabsPanel.vue +31 -0
  243. package/components/Tabs/TabsTab.astro +1 -5
  244. package/components/Tabs/TabsTab.vue +24 -0
  245. package/components/Tabs/types.astro.ts +11 -0
  246. package/components/Tabs/types.d.vue.ts +31 -0
  247. package/components/Tabs/types.solid.ts +12 -0
  248. package/components/Tabs/types.svelte.ts +10 -0
  249. package/components/Tabs/types.ts +19 -0
  250. package/components/TextField/TextField.astro +45 -49
  251. package/components/TextField/TextField.vue +74 -0
  252. package/components/TextField/types.astro.ts +17 -0
  253. package/components/TextField/types.d.vue.ts +20 -0
  254. package/components/TextField/types.solid.ts +22 -0
  255. package/components/TextField/types.svelte.ts +22 -0
  256. package/components/TextField/types.ts +35 -0
  257. package/components/Textarea/Textarea.astro +50 -38
  258. package/components/Textarea/Textarea.vue +64 -0
  259. package/components/Textarea/types.astro.ts +10 -0
  260. package/components/Textarea/types.d.vue.ts +19 -0
  261. package/components/Textarea/types.solid.ts +6 -0
  262. package/components/Textarea/types.svelte.ts +21 -0
  263. package/components/Textarea/types.ts +33 -0
  264. package/components/Toast/Toast.vue +48 -0
  265. package/components/ToggleButton/ToggleButton.astro +1 -11
  266. package/components/ToggleButton/ToggleButton.vue +41 -0
  267. package/components/ToggleButton/types.astro.ts +4 -0
  268. package/components/ToggleButton/types.d.vue.ts +10 -0
  269. package/components/ToggleButton/types.solid.ts +7 -0
  270. package/components/ToggleButton/types.svelte.ts +7 -0
  271. package/components/ToggleButton/types.ts +10 -0
  272. package/components/ToggleGroup/ToggleGroup.astro +1 -8
  273. package/components/ToggleGroup/ToggleGroup.vue +36 -0
  274. package/components/ToggleGroup/types.astro.ts +4 -0
  275. package/components/ToggleGroup/types.d.vue.ts +15 -0
  276. package/components/ToggleGroup/types.solid.ts +4 -0
  277. package/components/ToggleGroup/types.svelte.ts +9 -0
  278. package/components/ToggleGroup/types.ts +15 -0
  279. package/components/Tooltip/Tooltip.astro +2 -9
  280. package/components/Tooltip/Tooltip.vue +22 -0
  281. package/components/Tooltip/types.astro.ts +4 -0
  282. package/components/Tooltip/types.d.vue.ts +10 -0
  283. package/components/Tooltip/types.solid.ts +6 -0
  284. package/components/Tooltip/types.svelte.ts +7 -0
  285. package/components/Tooltip/types.ts +11 -0
  286. package/css/theme.css +0 -1
  287. package/dist/opui.css +0 -1
  288. package/dist/opui.css.map +1 -1
  289. package/package.json +16 -7
  290. package/vue/index.ts +54 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.3.0 - 2026-06-04
4
+
5
+ Vue support! 🎉
6
+ It's a lot of work but hopefully it's all good with them.
7
+
8
+ ### Added
9
+
10
+ - Vue components, importable from `opui-css/vue`.
11
+ - Adjusted types for Vue, Svelte and Solid.
12
+
13
+ ## 5.2.0 - 2026-06-03
14
+
15
+ ### Changed
16
+
17
+ - Broke out types for components into their own files. All frameworks now have their own types file. Yes you read that right, there will be more frameworks soon. Svelte, Vue and Solid are coming soon (in that order).
18
+
19
+ Thank you to [somephic](https://github.com/somephic) for the contribution and discussions!
20
+
3
21
  ## 5.1.2 - 2026-05-29
4
22
 
5
23
  ### Fixed
package/README.md CHANGED
@@ -36,7 +36,10 @@ import { Button, Card } from "opui-css/astro"
36
36
  Drop a pre-bundled stylesheet into any page and use the documented class names:
37
37
 
38
38
  ```html
39
- <link rel="stylesheet" href="https://unpkg.com/opui-css/dist/opui.css" />
39
+ <link
40
+ rel="stylesheet"
41
+ href="https://cdn.jsdelivr.net/npm/opui-css/dist/opui.css"
42
+ />
40
43
 
41
44
  <button class="ui-button ui-primary">Click me</button>
42
45
  ```
@@ -78,10 +81,6 @@ Wrap your own styles in a layer above `utils` (or unlayered) to override.
78
81
  | `opui-css/astro` | All Astro components |
79
82
  | `opui-css/components/*` | Individual Astro component sources |
80
83
 
81
- ## Contributing
82
-
83
- See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the component-authoring pattern.
84
-
85
84
  ## License
86
85
 
87
86
  [MIT](./LICENSE) © Felix Bohlin
@@ -8,7 +8,7 @@ This guide defines the standards for implementing reusable Astro UI components i
8
8
 
9
9
  When implementing or updating a component, ensure:
10
10
  - [ ] **Title Export**: `export const title = "Component Name"` is present.
11
- - [ ] **Props Type**: Used `type Props = { ... }` (avoid interfaces).
11
+ - [ ] **Props Type**: Imported `Props` from `./types.astro` (avoid interfaces).
12
12
  - [ ] **Sorting**: Props, Destructuring, and Classes are sorted alphabetically.
13
13
  - [ ] **Rest Props**: `...rest` is captured and spread onto the root element.
14
14
  - [ ] **Class Management**: Used `class:list` for all class manipulations.
@@ -20,18 +20,17 @@ When implementing or updating a component, ensure:
20
20
 
21
21
  ## 1. Frontmatter Structure
22
22
 
23
+ Every component uses layered type files:
24
+
25
+ - `types.ts` — shared, framework-agnostic props (component-specific only; no `HTMLAttributes`)
26
+ - `types.astro.ts` — Astro props = base + `HTMLAttributes<element>`
27
+ - `types.d.vue.ts` / `types.svelte.ts` / `types.solid.ts` — framework-specific extensions (for merge parity)
28
+
23
29
  Every component must follow this exact frontmatter layout:
24
30
 
25
31
  ```astro
26
32
  ---
27
- type Props = {
28
- [key: string]: any // Required for ...rest support
29
- class?: string
30
- disabled?: boolean
31
- label?: string
32
- size?: "small" | "large"
33
- variant?: "outlined" | "tonal" | "filled"
34
- }
33
+ import type { Props } from "./types.astro"
35
34
 
36
35
  export const title = "My Component"
37
36
 
@@ -40,15 +39,15 @@ const {
40
39
  disabled,
41
40
  label,
42
41
  size,
43
- variant = "outlined", // Default values in destructuring
42
+ variant = "outlined",
44
43
  ...rest
45
44
  } = Astro.props
46
45
  ---
47
46
  ```
48
47
 
49
48
  ### Key Rules:
50
- - **Alphabetical Sorting**: Sort property definitions in `type Props` and variables in the destructuring statement.
51
- - **REST Support**: Always include `[key: string]: any` in props and `...rest` in destructuring.
49
+ - **Alphabetical Sorting**: Sort property definitions in `types.ts` and variables in the destructuring statement.
50
+ - **REST Support**: Use `HTMLAttributes` in `types.astro.ts` and `...rest` in destructuring. Do not add `[key: string]: any` to `types.ts` — native attributes belong in the framework type files.
52
51
  - **Title Export**: This is mandatory for documentation generation.
53
52
 
54
53
  ---
@@ -137,7 +136,7 @@ Use named slots for specific functional areas. Check for existence before render
137
136
  Most inputs should be wrapped in a `<label>` to provide a larger hit area and built-in accessibility.
138
137
 
139
138
  ```astro
140
- <label class:list={["ui-field", { "ui-disabled": disabled, "ui-critical": error }]}>
139
+ <label class:list={["ui-field", { "ui-disabled": disabled }]} data-invalid={error || undefined}>
141
140
  <span class="ui-label">{label}</span>
142
141
  <input type="text" {...rest} />
143
142
  {endText && <span class="ui-end-text">{endText}</span>}
@@ -1,11 +1,5 @@
1
1
  ---
2
- type Props = {
3
- class?: string
4
- name?: string
5
- open?: boolean
6
- variant?: "default" | "outlined" | "elevated" | "tonal"
7
- [key: string]: any
8
- }
2
+ import type { Props } from "./types.astro"
9
3
 
10
4
  export const title = "Accordion"
11
5
 
@@ -28,8 +22,10 @@ const contentId = $id("content")
28
22
  {...rest}
29
23
  >
30
24
  <!-- Summary -->
31
- <!-- prettier-ignore -->
32
- <summary id={summaryId} aria-controls={contentId}><slot name="summary" /><slot name="marker" /></summary>
25
+
26
+ <summary id={summaryId} aria-controls={contentId}
27
+ ><slot name="summary" /><slot name="marker" /></summary
28
+ >
33
29
 
34
30
  <!-- Content -->
35
31
  <div
@@ -0,0 +1,38 @@
1
+ <script setup lang="ts">
2
+ import { useId } from "vue"
3
+ import type { Props, Slots } from "./types.d.vue"
4
+
5
+ const { class: className, name, open, variant } = defineProps<Props>()
6
+ defineSlots<Slots>()
7
+
8
+ const summaryId = useId()
9
+ const contentId = useId()
10
+ </script>
11
+
12
+ <template>
13
+ <details
14
+ :name="name"
15
+ :class="['ui-accordion', 'ui-card', variant && `ui-${variant}`, className]"
16
+ :open="open"
17
+ >
18
+ <!-- Summary -->
19
+ <summary :id="summaryId" :aria-controls="contentId">
20
+ <slot name="summary"></slot><slot name="marker"></slot>
21
+ </summary>
22
+
23
+ <!-- Content -->
24
+ <div
25
+ :id="contentId"
26
+ class="ui-content"
27
+ role="region"
28
+ :aria-labelledby="summaryId"
29
+ >
30
+ <slot></slot>
31
+ </div>
32
+
33
+ <!-- Actions -->
34
+ <div v-if="$slots.actions" class="ui-actions">
35
+ <slot name="actions"></slot>
36
+ </div>
37
+ </details>
38
+ </template>
@@ -0,0 +1,4 @@
1
+ import type * as Base from "./types"
2
+ import type { HTMLAttributes } from "astro/types"
3
+
4
+ export type Props = Base.Props & HTMLAttributes<"details">
@@ -0,0 +1,15 @@
1
+ import type { HTMLAttributes, Slot } from "vue"
2
+ import type { Props as BaseProps } from "./types"
3
+
4
+ export type Props = BaseProps & {
5
+ class?: HTMLAttributes["class"]
6
+ name?: string
7
+ open?: boolean
8
+ }
9
+
10
+ export type Slots = {
11
+ actions?: Slot
12
+ default?: Slot
13
+ marker?: Slot
14
+ summary?: Slot
15
+ }
@@ -0,0 +1,6 @@
1
+ import type * as Base from "./types"
2
+ import type { JSX } from "solid-js"
3
+
4
+ export type Props = Base.Props &
5
+ Base.Slots<JSX.Element> &
6
+ JSX.DetailsHtmlAttributes<HTMLDetailsElement>
@@ -0,0 +1,7 @@
1
+ import type * as Base from "./types"
2
+ import type { SvelteHTMLElements } from "svelte/elements"
3
+ import type { Snippet } from "svelte"
4
+
5
+ type Snippets = Base.Slots<Snippet>
6
+
7
+ export type Props = Base.Props & Snippets & SvelteHTMLElements["details"]
@@ -0,0 +1,10 @@
1
+ export type Props = {
2
+ variant?: "default" | "outlined" | "elevated" | "tonal"
3
+ }
4
+
5
+ export type Slots<S> = {
6
+ actions?: S
7
+ children: S
8
+ marker?: S
9
+ summary: string | S
10
+ }
@@ -1,11 +1,5 @@
1
1
  ---
2
- type Props = {
3
- [key: string]: any
4
- alignment?: string
5
- class?: string
6
- id?: string
7
- trigger?: "always" | "hover"
8
- }
2
+ import type { Props } from "./types.astro"
9
3
 
10
4
  export const title = "Anchor"
11
5
 
@@ -0,0 +1,41 @@
1
+ <script setup lang="ts">
2
+ import { useId } from "vue"
3
+ import type { Props, Slots } from "./types.d.vue"
4
+
5
+ const { alignment, id: idProp, trigger = "always" } = defineProps<Props>()
6
+ defineSlots<Slots>()
7
+
8
+ const isHover = trigger === "hover"
9
+ const uid = useId()
10
+ const id = isHover ? (idProp ?? uid) : undefined
11
+
12
+ const insetMap: Record<string, string> = {
13
+ "start start": "auto 100% 100% auto",
14
+ "start end": "auto auto 100% 100%",
15
+ "end start": "100% 100% auto auto",
16
+ "end end": "100% auto auto 100%",
17
+ }
18
+
19
+ const positionArea = alignment
20
+ ? {
21
+ "--anchor-position-area": alignment,
22
+ "--_anchor-inset": insetMap[alignment],
23
+ }
24
+ : {}
25
+ </script>
26
+
27
+ <template>
28
+ <span :class="['ui-anchor', $props.class]" :style="positionArea">
29
+ <span v-if="isHover" :interestfor="id">
30
+ <slot></slot>
31
+ </span>
32
+ <slot v-else></slot>
33
+ <span
34
+ class="ui-anchor-floating"
35
+ :id="id"
36
+ :popover="isHover ? 'hint' : undefined"
37
+ >
38
+ <slot name="anchored"></slot>
39
+ </span>
40
+ </span>
41
+ </template>
@@ -0,0 +1,4 @@
1
+ import type * as Base from "./types"
2
+ import type { HTMLAttributes } from "astro/types"
3
+
4
+ export type Props = Base.Props & HTMLAttributes<"span">
@@ -0,0 +1,10 @@
1
+ import type { HTMLAttributes, Slot } from "vue"
2
+ import type { Props as BaseProps, Slots as BaseSlots } from "./types"
3
+
4
+ export type Props = BaseProps & {
5
+ class?: HTMLAttributes["class"]
6
+ }
7
+
8
+ export type Slots = BaseSlots<Slot> & {
9
+ default?: Slot
10
+ }
@@ -0,0 +1,6 @@
1
+ import type * as Base from "./types"
2
+ import type { JSX } from "solid-js"
3
+
4
+ export type Props = Base.Props &
5
+ Partial<Base.Slots<JSX.Element>> &
6
+ JSX.HTMLAttributes<HTMLSpanElement>
@@ -0,0 +1,7 @@
1
+ import type * as Base from "./types"
2
+ import type { SvelteHTMLElements } from "svelte/elements"
3
+ import type { Snippet } from "svelte"
4
+
5
+ type Snippets = Base.Slots<Snippet>
6
+
7
+ export type Props = Base.Props & Snippets & SvelteHTMLElements["span"]
@@ -0,0 +1,9 @@
1
+ export type Props = {
2
+ [key: string]: any
3
+ alignment?: string
4
+ trigger?: "always" | "hover"
5
+ }
6
+
7
+ export type Slots<S> = {
8
+ anchored?: S
9
+ }
@@ -1,14 +1,5 @@
1
1
  ---
2
- type Props = {
3
- [key: string]: any
4
- alt?: string
5
- as?: "div" | "a" | "button" | string
6
- class?: string
7
- href?: string
8
- isGroup?: boolean
9
- src?: string
10
- variant?: "squared" | "rounded" | "squircle"
11
- }
2
+ import type { Props } from "./types.astro"
12
3
 
13
4
  export const title = "Avatar"
14
5
 
@@ -23,10 +14,9 @@ const {
23
14
  ...rest
24
15
  } = Astro.props
25
16
 
26
- const Tag = as || (href ? "a" : "div")
17
+ const Tag = (as || (href ? "a" : "div")) as any
27
18
  ---
28
19
 
29
- <!-- prettier-ignore -->
30
20
  <Tag
31
21
  class:list={[
32
22
  { "ui-avatar": !isGroup },
@@ -35,4 +25,5 @@ const Tag = as || (href ? "a" : "div")
35
25
  ]}
36
26
  href={href}
37
27
  role={isGroup ? "group" : undefined}
38
- {...rest}>{src ? <img src={src} alt={alt} /> : <slot />}</Tag>
28
+ {...rest}>{src ? <img src={src} alt={alt} /> : <slot />}</Tag
29
+ >
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import type { Props, Slots } from "./types.d.vue"
3
+
4
+ const { alt, as, href, isGroup, src, variant } = defineProps<Props>()
5
+ defineSlots<Slots>()
6
+
7
+ const Tag = as || (href ? "a" : "div")
8
+ </script>
9
+
10
+ <template>
11
+ <component
12
+ :is="Tag"
13
+ :class="[
14
+ { 'ui-avatar': !isGroup },
15
+ !isGroup && variant && `ui-${variant}`,
16
+ $props.class,
17
+ ]"
18
+ :href="href"
19
+ :role="isGroup ? 'group' : undefined"
20
+ >
21
+ <img v-if="src" :src="src" :alt="alt" />
22
+ <slot v-else></slot>
23
+ </component>
24
+ </template>
@@ -0,0 +1,10 @@
1
+ import type * as Base from "./types"
2
+ import type { HTMLAttributes } from "astro/types"
3
+
4
+ export type Props = Base.Props &
5
+ Pick<HTMLAttributes<"img">, Base.ImageProps> &
6
+ (
7
+ | ({ as?: "div" } & HTMLAttributes<"div">)
8
+ | ({ as?: "button" } & HTMLAttributes<"button">)
9
+ | ({ as?: "a" } & HTMLAttributes<"a">)
10
+ )
@@ -0,0 +1,11 @@
1
+ import type { HTMLAttributes, ImgHTMLAttributes, Slot } from "vue"
2
+ import type { Props as BaseProps } from "./types"
3
+
4
+ export type Props = BaseProps &
5
+ Pick<ImgHTMLAttributes, "alt" | "src"> & {
6
+ class?: HTMLAttributes["class"]
7
+ }
8
+
9
+ export type Slots = {
10
+ default?: Slot
11
+ }
@@ -0,0 +1,11 @@
1
+ import type * as Base from "./types"
2
+ import type { JSX } from "solid-js"
3
+
4
+ export type Props = Base.Props &
5
+ Base.Slots<JSX.Element> &
6
+ Pick<JSX.ImgHTMLAttributes<HTMLImageElement>, Base.ImageProps> &
7
+ (
8
+ | ({ as?: "div" } & JSX.HTMLAttributes<HTMLDivElement>)
9
+ | ({ as?: "button" } & JSX.ButtonHTMLAttributes<HTMLButtonElement>)
10
+ | ({ as?: "a" } & JSX.AnchorHTMLAttributes<HTMLAnchorElement>)
11
+ )
@@ -0,0 +1,12 @@
1
+ import type * as Base from "./types"
2
+ import type { SvelteHTMLElements } from "svelte/elements"
3
+ import type { Snippet } from "svelte"
4
+
5
+ export type Props = Base.Props &
6
+ Base.Slots<Snippet> &
7
+ Pick<SvelteHTMLElements["img"], Base.ImageProps> &
8
+ (
9
+ | ({ as?: "div" } & SvelteHTMLElements["div"])
10
+ | ({ as?: "button" } & SvelteHTMLElements["button"])
11
+ | ({ as?: "a" } & SvelteHTMLElements["a"])
12
+ )
@@ -0,0 +1,29 @@
1
+ export type Props = {
2
+ command?: string
3
+ commandfor?: string
4
+ interestfor?: string
5
+ isGroup?: boolean
6
+ variant?: "squared" | "rounded" | "squircle"
7
+ } & (
8
+ | {
9
+ as?: "div"
10
+ href: never
11
+ disabled?: never
12
+ }
13
+ | {
14
+ as?: "a"
15
+ href: string
16
+ disabled?: never
17
+ }
18
+ | {
19
+ as?: "button"
20
+ href?: never
21
+ disabled?: boolean
22
+ }
23
+ )
24
+
25
+ export type Slots<S> = {
26
+ children?: S
27
+ }
28
+
29
+ export type ImageProps = "src" | "alt"
@@ -1,15 +1,7 @@
1
1
  ---
2
- import Anchor from "../Anchor/Anchor.astro"
2
+ import type { Props } from "./types.astro"
3
3
 
4
- type Props = {
5
- [key: string]: any
6
- alignment?: "start-start" | "end-start" | "end-end"
7
- class?: string
8
- color?: "critical" | "info" | "neutral" | "success" | "warning"
9
- dot?: boolean
10
- invisible?: boolean
11
- label?: string | number
12
- }
4
+ import Anchor from "../Anchor/Anchor.astro"
13
5
 
14
6
  export const title = "Badge"
15
7
 
@@ -45,7 +37,7 @@ const positionArea =
45
37
  className,
46
38
  color && `ui-${color}`,
47
39
  ]}
48
- {...rest}
40
+ {...rest as any}
49
41
  >
50
42
  <slot />
51
43
  <span
@@ -0,0 +1,39 @@
1
+ <script setup lang="ts">
2
+ import Anchor from "../Anchor/Anchor.vue"
3
+ import type { Props, Slots } from "./types.d.vue"
4
+
5
+ const { alignment, color, dot, invisible, label } = defineProps<Props>()
6
+ defineSlots<Slots>()
7
+
8
+ const positionArea =
9
+ alignment === "start-start"
10
+ ? "start start"
11
+ : alignment === "end-start"
12
+ ? "end start"
13
+ : alignment === "end-end"
14
+ ? "end end"
15
+ : undefined
16
+ </script>
17
+
18
+ <template>
19
+ <Anchor
20
+ :alignment="positionArea"
21
+ :class="[
22
+ 'ui-badge',
23
+ {
24
+ 'ui-dot': dot,
25
+ 'ui-invisible': invisible,
26
+ },
27
+ alignment && `ui-${alignment}`,
28
+ color && `ui-${color}`,
29
+ $props.class,
30
+ ]"
31
+ >
32
+ <slot></slot>
33
+ <template #anchored>
34
+ <span class="ui-badge-indicator" :aria-label="label?.toString()">{{
35
+ dot ? "" : label
36
+ }}</span>
37
+ </template>
38
+ </Anchor>
39
+ </template>
@@ -0,0 +1,4 @@
1
+ import type * as Base from "./types"
2
+ import type { HTMLAttributes } from "astro/types"
3
+
4
+ export type Props = Base.Props & HTMLAttributes<"span">
@@ -0,0 +1,10 @@
1
+ import type { HTMLAttributes, Slot } from "vue"
2
+ import type { Props as BaseProps } from "./types"
3
+
4
+ export type Props = BaseProps & {
5
+ class?: HTMLAttributes["class"]
6
+ }
7
+
8
+ export type Slots = {
9
+ default?: Slot
10
+ }
@@ -0,0 +1,4 @@
1
+ import type * as Base from "./types"
2
+ import type { JSX } from "solid-js"
3
+
4
+ export type Props = Base.Props & JSX.HTMLAttributes<HTMLSpanElement>
@@ -0,0 +1,4 @@
1
+ import type * as Base from "./types"
2
+ import type { SvelteHTMLElements } from "svelte/elements"
3
+
4
+ export type Props = Base.Props & SvelteHTMLElements["span"]
@@ -0,0 +1,8 @@
1
+ export type Props = {
2
+ [key: string]: any
3
+ alignment?: "start-start" | "end-start" | "end-end"
4
+ color?: "critical" | "info" | "neutral" | "success" | "warning"
5
+ dot?: boolean
6
+ invisible?: boolean
7
+ label?: string | number
8
+ }
@@ -1,45 +1,36 @@
1
1
  ---
2
- type CommonProps = {
3
- [key: string]: any
4
- as?: string
5
- class?: string
6
- color?: "critical" | "primary"
7
- size?: "x-small" | "small" | "large"
8
- variant?: "outlined" | "tonal" | "filled"
9
- }
10
-
11
- type AnchorProps = CommonProps & {
12
- disabled?: never
13
- href: string
14
- }
15
-
16
- type ButtonProps = CommonProps & {
17
- disabled?: boolean
18
- href?: undefined
19
- }
20
-
21
- type Props = AnchorProps | ButtonProps
2
+ import type { Props } from "./types.astro"
22
3
 
23
4
  export const title = "Button"
24
5
 
6
+ const props = Astro.props as Props
25
7
  const {
26
8
  as,
27
9
  class: className,
28
10
  color,
29
- disabled,
30
- href,
31
11
  size,
32
12
  variant,
13
+ disabled,
14
+ href,
33
15
  ...rest
34
- } = Astro.props
16
+ } = props
35
17
 
36
- const Tag = as || (href ? "a" : "button")
18
+ const Tag = (as || (href ? "a" : "button")) as any
37
19
  const isButton = Tag === "button"
38
20
  ---
39
21
 
40
- <!-- prettier-ignore -->
41
22
  <Tag
42
- class:list={["ui-button", { "ui-disabled": isButton && disabled }, size && `ui-${size}`, variant && `ui-${variant}`, color && `ui-${color}`, className]}
23
+ class:list={[
24
+ "ui-button",
25
+ { "ui-disabled": isButton && disabled },
26
+ size && `ui-${size}`,
27
+ variant && `ui-${variant}`,
28
+ color && `ui-${color}`,
29
+ className,
30
+ ]}
43
31
  disabled={isButton ? disabled : undefined}
44
32
  href={href}
45
- {...rest}><slot /></Tag>
33
+ {...rest as any}
34
+ >
35
+ <slot />
36
+ </Tag>
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ import type { Props, Slots } from "./types.d.vue"
3
+
4
+ const { as, color, disabled, href, size, variant } = defineProps<Props>()
5
+ defineSlots<Slots>()
6
+
7
+ const Tag = as || (href ? "a" : "button")
8
+ const isButton = Tag === "button"
9
+ </script>
10
+
11
+ <template>
12
+ <component
13
+ :is="Tag"
14
+ :class="[
15
+ 'ui-button',
16
+ { 'ui-disabled': isButton && disabled },
17
+ size && `ui-${size}`,
18
+ variant && `ui-${variant}`,
19
+ color && `ui-${color}`,
20
+ $props.class,
21
+ ]"
22
+ :disabled="isButton ? disabled : undefined"
23
+ :href="href"
24
+ >
25
+ <slot></slot>
26
+ </component>
27
+ </template>