@proyecto-viviana/solidaria-components 0.2.9 → 0.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 (222) hide show
  1. package/README.md +39 -272
  2. package/dist/ActionBar.d.ts +21 -13
  3. package/dist/ActionBar.d.ts.map +1 -1
  4. package/dist/ActionGroup.d.ts +8 -8
  5. package/dist/ActionGroup.d.ts.map +1 -1
  6. package/dist/Alert.d.ts +5 -5
  7. package/dist/Alert.d.ts.map +1 -1
  8. package/dist/Autocomplete.d.ts +5 -5
  9. package/dist/Autocomplete.d.ts.map +1 -1
  10. package/dist/Breadcrumbs.d.ts +18 -7
  11. package/dist/Breadcrumbs.d.ts.map +1 -1
  12. package/dist/Button.d.ts +24 -5
  13. package/dist/Button.d.ts.map +1 -1
  14. package/dist/Calendar.d.ts +38 -7
  15. package/dist/Calendar.d.ts.map +1 -1
  16. package/dist/Checkbox.d.ts +32 -7
  17. package/dist/Checkbox.d.ts.map +1 -1
  18. package/dist/Collection.d.ts +19 -14
  19. package/dist/Collection.d.ts.map +1 -1
  20. package/dist/Color.d.ts +103 -14
  21. package/dist/Color.d.ts.map +1 -1
  22. package/dist/ColorEditor.d.ts +6 -6
  23. package/dist/ColorEditor.d.ts.map +1 -1
  24. package/dist/ComboBox.d.ts +85 -19
  25. package/dist/ComboBox.d.ts.map +1 -1
  26. package/dist/ContextualHelpTrigger.d.ts +2 -2
  27. package/dist/ContextualHelpTrigger.d.ts.map +1 -1
  28. package/dist/DateField.d.ts +8 -6
  29. package/dist/DateField.d.ts.map +1 -1
  30. package/dist/DatePicker.d.ts +53 -22
  31. package/dist/DatePicker.d.ts.map +1 -1
  32. package/dist/DateRangePickerContext.d.ts +30 -0
  33. package/dist/DateRangePickerContext.d.ts.map +1 -0
  34. package/dist/Dialog.d.ts +5 -5
  35. package/dist/Dialog.d.ts.map +1 -1
  36. package/dist/Disclosure.d.ts +23 -5
  37. package/dist/Disclosure.d.ts.map +1 -1
  38. package/dist/DragAndDrop.d.ts +6 -6
  39. package/dist/DragAndDrop.d.ts.map +1 -1
  40. package/dist/DragPreview.d.ts +2 -2
  41. package/dist/DragPreview.d.ts.map +1 -1
  42. package/dist/DropZone.d.ts +4 -4
  43. package/dist/DropZone.d.ts.map +1 -1
  44. package/dist/FieldError.d.ts +9 -5
  45. package/dist/FieldError.d.ts.map +1 -1
  46. package/dist/FileTrigger.d.ts +3 -3
  47. package/dist/FileTrigger.d.ts.map +1 -1
  48. package/dist/Focusable.d.ts +2 -2
  49. package/dist/Focusable.d.ts.map +1 -1
  50. package/dist/Form.d.ts +18 -4
  51. package/dist/Form.d.ts.map +1 -1
  52. package/dist/GridList.d.ts +32 -12
  53. package/dist/GridList.d.ts.map +1 -1
  54. package/dist/HiddenDateInput.d.ts +26 -0
  55. package/dist/HiddenDateInput.d.ts.map +1 -0
  56. package/dist/HiddenTimeInput.d.ts +25 -0
  57. package/dist/HiddenTimeInput.d.ts.map +1 -0
  58. package/dist/Icon.d.ts +5 -5
  59. package/dist/Icon.d.ts.map +1 -1
  60. package/dist/Keyboard.d.ts +1 -1
  61. package/dist/Landmark.d.ts +3 -3
  62. package/dist/Landmark.d.ts.map +1 -1
  63. package/dist/Link.d.ts +10 -4
  64. package/dist/Link.d.ts.map +1 -1
  65. package/dist/ListBox.d.ts +32 -12
  66. package/dist/ListBox.d.ts.map +1 -1
  67. package/dist/ListDropTargetDelegate.d.ts +6 -6
  68. package/dist/ListDropTargetDelegate.d.ts.map +1 -1
  69. package/dist/Menu.d.ts +65 -14
  70. package/dist/Menu.d.ts.map +1 -1
  71. package/dist/Meter.d.ts +3 -3
  72. package/dist/Meter.d.ts.map +1 -1
  73. package/dist/Modal.d.ts +5 -5
  74. package/dist/Modal.d.ts.map +1 -1
  75. package/dist/NumberField.d.ts +8 -12
  76. package/dist/NumberField.d.ts.map +1 -1
  77. package/dist/Popover.d.ts +28 -5
  78. package/dist/Popover.d.ts.map +1 -1
  79. package/dist/Pressable.d.ts +2 -2
  80. package/dist/Pressable.d.ts.map +1 -1
  81. package/dist/ProgressBar.d.ts +5 -3
  82. package/dist/ProgressBar.d.ts.map +1 -1
  83. package/dist/RadioGroup.d.ts +43 -9
  84. package/dist/RadioGroup.d.ts.map +1 -1
  85. package/dist/RangeCalendar.d.ts +34 -7
  86. package/dist/RangeCalendar.d.ts.map +1 -1
  87. package/dist/RouterProvider.d.ts +2 -2
  88. package/dist/RouterProvider.d.ts.map +1 -1
  89. package/dist/SearchField.d.ts +23 -20
  90. package/dist/SearchField.d.ts.map +1 -1
  91. package/dist/Select.d.ts +41 -11
  92. package/dist/Select.d.ts.map +1 -1
  93. package/dist/SelectionIndicator.d.ts +3 -3
  94. package/dist/SelectionIndicator.d.ts.map +1 -1
  95. package/dist/Separator.d.ts +9 -3
  96. package/dist/Separator.d.ts.map +1 -1
  97. package/dist/SharedElementTransition.d.ts +6 -4
  98. package/dist/SharedElementTransition.d.ts.map +1 -1
  99. package/dist/Slider.d.ts +12 -8
  100. package/dist/Slider.d.ts.map +1 -1
  101. package/dist/StepList.d.ts +90 -0
  102. package/dist/StepList.d.ts.map +1 -0
  103. package/dist/Switch.d.ts +11 -5
  104. package/dist/Switch.d.ts.map +1 -1
  105. package/dist/Table.d.ts +187 -23
  106. package/dist/Table.d.ts.map +1 -1
  107. package/dist/Tabs.d.ts +45 -9
  108. package/dist/Tabs.d.ts.map +1 -1
  109. package/dist/TagGroup.d.ts +12 -10
  110. package/dist/TagGroup.d.ts.map +1 -1
  111. package/dist/Text.d.ts +2 -2
  112. package/dist/TextField.d.ts +15 -11
  113. package/dist/TextField.d.ts.map +1 -1
  114. package/dist/TimeField.d.ts +6 -6
  115. package/dist/TimeField.d.ts.map +1 -1
  116. package/dist/Toast.d.ts +29 -14
  117. package/dist/Toast.d.ts.map +1 -1
  118. package/dist/ToggleButton.d.ts +11 -5
  119. package/dist/ToggleButton.d.ts.map +1 -1
  120. package/dist/ToggleButtonGroup.d.ts +7 -7
  121. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  122. package/dist/Toolbar.d.ts +7 -3
  123. package/dist/Toolbar.d.ts.map +1 -1
  124. package/dist/Tooltip.d.ts +50 -8
  125. package/dist/Tooltip.d.ts.map +1 -1
  126. package/dist/Tree.d.ts +66 -17
  127. package/dist/Tree.d.ts.map +1 -1
  128. package/dist/Virtualizer.d.ts +12 -12
  129. package/dist/Virtualizer.d.ts.map +1 -1
  130. package/dist/VirtualizerLayouts.d.ts +2 -2
  131. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  132. package/dist/VisuallyHidden.d.ts +1 -1
  133. package/dist/VisuallyHidden.d.ts.map +1 -1
  134. package/dist/contexts.d.ts +5 -1
  135. package/dist/contexts.d.ts.map +1 -1
  136. package/dist/index.d.ts +73 -71
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +23247 -18564
  139. package/dist/index.js.map +1 -1
  140. package/dist/index.jsx +18110 -0
  141. package/dist/index.jsx.map +1 -0
  142. package/dist/useDragAndDrop.d.ts +13 -13
  143. package/dist/useDragAndDrop.d.ts.map +1 -1
  144. package/dist/utils.d.ts +2 -2
  145. package/dist/utils.d.ts.map +1 -1
  146. package/dist/virtualizer/Layout.d.ts +1 -1
  147. package/dist/virtualizer/Layout.d.ts.map +1 -1
  148. package/package.json +31 -32
  149. package/src/ActionBar.tsx +75 -72
  150. package/src/ActionGroup.tsx +53 -61
  151. package/src/Alert.tsx +17 -42
  152. package/src/Autocomplete.tsx +39 -44
  153. package/src/Breadcrumbs.tsx +149 -80
  154. package/src/Button.tsx +267 -70
  155. package/src/Calendar.tsx +218 -138
  156. package/src/Checkbox.tsx +413 -121
  157. package/src/Collection.tsx +67 -58
  158. package/src/Color.tsx +803 -380
  159. package/src/ColorEditor.tsx +131 -149
  160. package/src/ComboBox.tsx +414 -249
  161. package/src/ContextualHelpTrigger.tsx +86 -74
  162. package/src/DateField.tsx +185 -91
  163. package/src/DatePicker.tsx +524 -213
  164. package/src/DateRangePickerContext.tsx +44 -0
  165. package/src/Dialog.tsx +156 -118
  166. package/src/Disclosure.tsx +127 -80
  167. package/src/DragAndDrop.tsx +60 -54
  168. package/src/DragPreview.tsx +13 -11
  169. package/src/DropZone.tsx +42 -22
  170. package/src/FieldError.tsx +45 -23
  171. package/src/FileTrigger.tsx +19 -19
  172. package/src/Focusable.tsx +21 -24
  173. package/src/Form.tsx +71 -16
  174. package/src/GridList.tsx +273 -197
  175. package/src/HiddenDateInput.tsx +153 -0
  176. package/src/HiddenTimeInput.tsx +133 -0
  177. package/src/Icon.tsx +22 -43
  178. package/src/Keyboard.tsx +3 -3
  179. package/src/Landmark.tsx +37 -63
  180. package/src/Link.tsx +125 -75
  181. package/src/ListBox.tsx +332 -233
  182. package/src/ListDropTargetDelegate.ts +81 -80
  183. package/src/Menu.tsx +1023 -274
  184. package/src/Meter.tsx +38 -56
  185. package/src/Modal.tsx +243 -175
  186. package/src/NumberField.tsx +139 -143
  187. package/src/Popover.tsx +386 -233
  188. package/src/Pressable.tsx +21 -21
  189. package/src/ProgressBar.tsx +48 -57
  190. package/src/RadioGroup.tsx +524 -122
  191. package/src/RangeCalendar.tsx +157 -90
  192. package/src/RouterProvider.tsx +30 -47
  193. package/src/SearchField.tsx +362 -143
  194. package/src/Select.tsx +656 -233
  195. package/src/SelectionIndicator.tsx +18 -15
  196. package/src/Separator.tsx +47 -49
  197. package/src/SharedElementTransition.tsx +103 -97
  198. package/src/Slider.tsx +138 -98
  199. package/src/StepList.tsx +272 -0
  200. package/src/Switch.tsx +93 -46
  201. package/src/Table.tsx +1308 -342
  202. package/src/Tabs.tsx +324 -103
  203. package/src/TagGroup.tsx +139 -126
  204. package/src/Text.tsx +3 -3
  205. package/src/TextField.tsx +389 -79
  206. package/src/TimeField.tsx +136 -76
  207. package/src/Toast.tsx +209 -157
  208. package/src/ToggleButton.tsx +47 -37
  209. package/src/ToggleButtonGroup.tsx +39 -34
  210. package/src/Toolbar.tsx +54 -69
  211. package/src/Tooltip.tsx +387 -119
  212. package/src/Tree.tsx +651 -368
  213. package/src/Virtualizer.tsx +208 -180
  214. package/src/VirtualizerLayouts.ts +45 -30
  215. package/src/VisuallyHidden.tsx +19 -19
  216. package/src/contexts.ts +29 -37
  217. package/src/index.ts +110 -195
  218. package/src/useDragAndDrop.ts +87 -71
  219. package/src/utils.tsx +40 -55
  220. package/src/virtualizer/Layout.ts +14 -22
  221. package/dist/index.ssr.js +0 -16996
  222. package/dist/index.ssr.js.map +0 -1
@@ -10,11 +10,14 @@ import {
10
10
  type JSX,
11
11
  createContext,
12
12
  createMemo,
13
+ createSignal,
14
+ children as resolveChildren,
13
15
  splitProps,
14
16
  useContext,
15
17
  For,
16
- } from 'solid-js';
17
- import { Dynamic } from 'solid-js/web';
18
+ Show,
19
+ } from "solid-js";
20
+ import { Dynamic } from "solid-js/web";
18
21
  import {
19
22
  createBreadcrumbs,
20
23
  createBreadcrumbItem,
@@ -24,7 +27,7 @@ import {
24
27
  type AriaBreadcrumbsProps,
25
28
  type AriaBreadcrumbItemProps,
26
29
  type PressEvent,
27
- } from '@proyecto-viviana/solidaria';
30
+ } from "@proyecto-viviana/solidaria";
28
31
  import {
29
32
  type RenderChildren,
30
33
  type ClassNameOrFunction,
@@ -32,18 +35,28 @@ import {
32
35
  type SlotProps,
33
36
  useRenderProps,
34
37
  filterDOMProps,
35
- } from './utils';
38
+ } from "./utils";
36
39
 
37
- // ============================================
38
- // TYPES
39
- // ============================================
40
+ type RefLike<T> = ((el: T) => void) | { current?: T | null } | undefined;
41
+
42
+ function assignRef<T>(ref: RefLike<T>, el: T): void {
43
+ if (!ref) {
44
+ return;
45
+ }
46
+
47
+ if (typeof ref === "function") {
48
+ ref(el);
49
+ } else {
50
+ ref.current = el;
51
+ }
52
+ }
40
53
 
41
54
  export interface BreadcrumbsRenderProps {
42
55
  /** Whether the breadcrumbs are disabled. */
43
56
  isDisabled: boolean;
44
57
  }
45
58
 
46
- export interface BreadcrumbsProps<T> extends Omit<AriaBreadcrumbsProps, 'isDisabled'>, SlotProps {
59
+ export interface BreadcrumbsProps<T> extends Omit<AriaBreadcrumbsProps, "isDisabled">, SlotProps {
47
60
  /** The items to render in the breadcrumbs. */
48
61
  items?: T[];
49
62
  /** Function to get the key from an item. */
@@ -52,12 +65,14 @@ export interface BreadcrumbsProps<T> extends Omit<AriaBreadcrumbsProps, 'isDisab
52
65
  isDisabled?: boolean;
53
66
  /** Handler called when a breadcrumb item is activated. */
54
67
  onAction?: (key: string | number) => void;
55
- /** The children of the component - render function for each item. */
56
- children: (item: T) => JSX.Element;
68
+ /** The children of the component, or a render function for collection items. */
69
+ children?: JSX.Element | ((item: T) => JSX.Element);
57
70
  /** The CSS className for the element. */
58
71
  class?: ClassNameOrFunction<BreadcrumbsRenderProps>;
59
72
  /** The inline style for the element. */
60
73
  style?: StyleOrFunction<BreadcrumbsRenderProps>;
74
+ /** Ref for the navigation element. */
75
+ ref?: RefLike<HTMLElement>;
61
76
  }
62
77
 
63
78
  export interface BreadcrumbItemRenderProps {
@@ -75,7 +90,8 @@ export interface BreadcrumbItemRenderProps {
75
90
  isHovered: boolean;
76
91
  }
77
92
 
78
- export interface BreadcrumbItemProps extends Omit<AriaBreadcrumbItemProps, 'isDisabled'>, SlotProps {
93
+ export interface BreadcrumbItemProps
94
+ extends Omit<AriaBreadcrumbItemProps, "isDisabled">, SlotProps {
79
95
  /** The children of the breadcrumb item. */
80
96
  children?: RenderChildren<BreadcrumbItemRenderProps>;
81
97
  /** The CSS className for the element. */
@@ -84,15 +100,17 @@ export interface BreadcrumbItemProps extends Omit<AriaBreadcrumbItemProps, 'isDi
84
100
  style?: StyleOrFunction<BreadcrumbItemRenderProps>;
85
101
  /** Whether this item is disabled. */
86
102
  isDisabled?: boolean;
103
+ /** Ref for the breadcrumb item element. */
104
+ ref?: RefLike<HTMLElement>;
87
105
  }
88
106
 
89
- // ============================================
90
- // CONTEXT
91
- // ============================================
92
-
93
107
  interface BreadcrumbsContextValue {
94
108
  isDisabled: Accessor<boolean>;
95
109
  onAction?: (key: string | number) => void;
110
+ registerStaticItem?: () => number;
111
+ staticItemCount?: Accessor<number>;
112
+ resetStaticItems?: () => void;
113
+ setStaticItemCount?: (count: number) => void;
96
114
  }
97
115
 
98
116
  export const BreadcrumbsContext = createContext<BreadcrumbsContextValue | null>(null);
@@ -109,106 +127,155 @@ function defaultItemKey(item: unknown, index: number): string | number {
109
127
  return maybeItem.key ?? maybeItem.id ?? index;
110
128
  }
111
129
 
112
- // ============================================
113
- // COMPONENTS
114
- // ============================================
115
-
116
130
  /**
117
131
  * Breadcrumbs show hierarchy and navigational context for a user's location within an application.
118
132
  */
119
133
  export function Breadcrumbs<T>(props: BreadcrumbsProps<T>): JSX.Element {
120
134
  const [local, ariaProps, rest] = splitProps(
121
135
  props,
122
- ['children', 'class', 'style', 'slot', 'items', 'getKey', 'isDisabled', 'onAction'],
123
- ['aria-label', 'aria-labelledby', 'aria-describedby']
136
+ ["children", "class", "style", "slot", "items", "getKey", "isDisabled", "onAction", "ref"],
137
+ ["aria-label", "aria-labelledby", "aria-describedby", "aria-details"],
124
138
  );
125
139
 
126
140
  const isDisabled = () => local.isDisabled ?? false;
127
141
  const items = () => local.items ?? [];
142
+ const hasCollectionItems = () => local.items !== undefined;
128
143
  const getItemKey = (item: T, index: number): string | number =>
129
144
  local.getKey?.(item) ?? defaultItemKey(item, index);
145
+ const [staticItemCount, setStaticItemCount] = createSignal(0);
146
+ let nextStaticIndex = 0;
147
+ const resetStaticItems = () => {
148
+ nextStaticIndex = 0;
149
+ setStaticItemCount(0);
150
+ };
151
+ const registerStaticItem = () => {
152
+ const index = nextStaticIndex;
153
+ nextStaticIndex += 1;
154
+ return index;
155
+ };
130
156
 
131
- // Create breadcrumbs aria props
132
157
  const { navProps } = createBreadcrumbs({
133
- get 'aria-label'() {
134
- return ariaProps['aria-label'];
158
+ get "aria-label"() {
159
+ return ariaProps["aria-label"];
135
160
  },
136
- get 'aria-labelledby'() {
137
- return ariaProps['aria-labelledby'];
161
+ get "aria-labelledby"() {
162
+ return ariaProps["aria-labelledby"];
138
163
  },
139
- get 'aria-describedby'() {
140
- return ariaProps['aria-describedby'];
164
+ get "aria-describedby"() {
165
+ return ariaProps["aria-describedby"];
141
166
  },
142
167
  get isDisabled() {
143
168
  return isDisabled();
144
169
  },
145
170
  });
146
171
 
147
- // Render props values
148
172
  const renderValues = createMemo<BreadcrumbsRenderProps>(() => ({
149
173
  isDisabled: isDisabled(),
150
174
  }));
151
175
 
152
- // Resolve render props
153
176
  const renderProps = useRenderProps(
154
177
  {
155
178
  class: local.class,
156
179
  style: local.style,
157
- defaultClassName: 'solidaria-Breadcrumbs',
180
+ defaultClassName: "solidaria-Breadcrumbs",
158
181
  },
159
- renderValues
182
+ renderValues,
160
183
  );
161
184
 
162
- // Filter DOM props
163
- const domProps = createMemo(() => filterDOMProps(rest as Record<string, unknown>, { global: true }));
164
-
185
+ const domProps = createMemo(() =>
186
+ filterDOMProps(rest as Record<string, unknown>, { global: true }),
187
+ );
165
188
  return (
166
- <BreadcrumbsContext.Provider value={{ isDisabled, onAction: local.onAction }}>
189
+ <BreadcrumbsContext.Provider
190
+ value={{
191
+ isDisabled,
192
+ onAction: local.onAction,
193
+ registerStaticItem,
194
+ staticItemCount,
195
+ resetStaticItems,
196
+ setStaticItemCount,
197
+ }}
198
+ >
167
199
  <nav
168
200
  {...navProps}
169
201
  {...domProps()}
202
+ ref={(element) => assignRef(local.ref, element)}
170
203
  class={renderProps.class()}
171
204
  style={renderProps.style()}
172
205
  data-disabled={isDisabled() || undefined}
173
206
  >
174
- <ol style={{ display: 'flex', 'align-items': 'center', 'list-style': 'none', margin: 0, padding: 0 }}>
175
- <For each={items()}>
176
- {(item, index) => {
177
- const itemKey = getItemKey(item, index());
178
- const isLast = () => index() === items().length - 1;
179
-
180
- return (
181
- <li style={{ display: 'flex', 'align-items': 'center' }}>
182
- <BreadcrumbItemContext.Provider value={{ itemKey, isLast }}>
183
- {props.children(item)}
184
- </BreadcrumbItemContext.Provider>
185
- </li>
186
- );
187
- }}
188
- </For>
207
+ <ol
208
+ style={{
209
+ display: "flex",
210
+ "align-items": "center",
211
+ "list-style": "none",
212
+ margin: 0,
213
+ padding: 0,
214
+ }}
215
+ >
216
+ <Show
217
+ when={hasCollectionItems()}
218
+ fallback={
219
+ <StaticBreadcrumbItems>{local.children as JSX.Element}</StaticBreadcrumbItems>
220
+ }
221
+ >
222
+ <For each={items()}>
223
+ {(item, index) => {
224
+ const itemKey = getItemKey(item, index());
225
+ const isLast = () => index() === items().length - 1;
226
+ const renderItem = local.children as ((item: T) => JSX.Element) | undefined;
227
+
228
+ return (
229
+ <li style={{ display: "flex", "align-items": "center" }}>
230
+ <BreadcrumbItemContext.Provider value={{ itemKey, isLast }}>
231
+ {renderItem?.(item)}
232
+ </BreadcrumbItemContext.Provider>
233
+ </li>
234
+ );
235
+ }}
236
+ </For>
237
+ </Show>
189
238
  </ol>
190
239
  </nav>
191
240
  </BreadcrumbsContext.Provider>
192
241
  );
193
242
  }
194
243
 
244
+ function StaticBreadcrumbItems(props: { children?: JSX.Element }): JSX.Element {
245
+ const context = useContext(BreadcrumbsContext);
246
+ const staticChildren = resolveChildren(() => props.children);
247
+ const childArray = createMemo(() => {
248
+ context?.resetStaticItems?.();
249
+ const array = staticChildren.toArray();
250
+ context?.setStaticItemCount?.(array.length);
251
+ return array;
252
+ });
253
+
254
+ return (
255
+ <For each={childArray()}>
256
+ {(child) => <li style={{ display: "flex", "align-items": "center" }}>{child}</li>}
257
+ </For>
258
+ );
259
+ }
260
+
195
261
  /**
196
262
  * A BreadcrumbItem represents an individual breadcrumb in the navigation trail.
197
263
  */
198
264
  export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
199
- const [local, ariaProps] = splitProps(props, [
200
- 'class',
201
- 'style',
202
- 'slot',
203
- 'isDisabled',
204
- ]);
205
-
206
- // Get context
265
+ const [local, ariaProps] = splitProps(props, ["class", "style", "slot", "isDisabled", "ref"]);
266
+
207
267
  const context = useContext(BreadcrumbsContext);
208
268
  const itemContext = useContext(BreadcrumbItemContext);
269
+ const staticIndex = itemContext ? null : context?.registerStaticItem?.();
209
270
  const isDisabled = () => local.isDisabled ?? context?.isDisabled() ?? false;
210
- const isCurrent = () => ariaProps.isCurrent ?? itemContext?.isLast() ?? false;
211
- const itemKey = () => itemContext?.itemKey ?? null;
271
+ const isCurrent = () =>
272
+ ariaProps.isCurrent ??
273
+ itemContext?.isLast() ??
274
+ (staticIndex !== null &&
275
+ staticIndex !== undefined &&
276
+ context?.staticItemCount !== undefined &&
277
+ staticIndex === context.staticItemCount() - 1);
278
+ const itemKey = () => itemContext?.itemKey ?? ariaProps.id ?? null;
212
279
 
213
280
  const handlePress = (e: PressEvent) => {
214
281
  ariaProps.onPress?.(e);
@@ -218,7 +285,6 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
218
285
  }
219
286
  };
220
287
 
221
- // Create breadcrumb item aria props
222
288
  const { itemProps, isPressed } = createBreadcrumbItem({
223
289
  get id() {
224
290
  return ariaProps.id;
@@ -271,17 +337,20 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
271
337
  get autoFocus() {
272
338
  return ariaProps.autoFocus;
273
339
  },
274
- get 'aria-label'() {
275
- return ariaProps['aria-label'];
340
+ get "aria-label"() {
341
+ return ariaProps["aria-label"];
342
+ },
343
+ get "aria-labelledby"() {
344
+ return ariaProps["aria-labelledby"];
276
345
  },
277
- get 'aria-labelledby'() {
278
- return ariaProps['aria-labelledby'];
346
+ get "aria-describedby"() {
347
+ return ariaProps["aria-describedby"];
279
348
  },
280
- get 'aria-describedby'() {
281
- return ariaProps['aria-describedby'];
349
+ get "aria-details"() {
350
+ return ariaProps["aria-details"];
282
351
  },
283
- get 'aria-current'() {
284
- return ariaProps['aria-current'];
352
+ get "aria-current"() {
353
+ return ariaProps["aria-current"];
285
354
  },
286
355
  });
287
356
 
@@ -295,12 +364,11 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
295
364
  mergeProps(
296
365
  itemProps as Record<string, unknown>,
297
366
  focusProps as Record<string, unknown>,
298
- hoverProps as Record<string, unknown>
299
- )
367
+ hoverProps as Record<string, unknown>,
368
+ ),
300
369
  );
301
- const elementType = () => ariaProps.elementType ?? 'a';
370
+ const elementType = () => ariaProps.elementType ?? "a";
302
371
 
303
- // Render props values
304
372
  const renderValues = createMemo<BreadcrumbItemRenderProps>(() => ({
305
373
  isCurrent: isCurrent(),
306
374
  isDisabled: isDisabled(),
@@ -310,21 +378,19 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
310
378
  isHovered: isHovered(),
311
379
  }));
312
380
 
313
- // Resolve render props
314
381
  const renderProps = useRenderProps(
315
382
  {
316
383
  children: props.children,
317
384
  class: local.class,
318
385
  style: local.style,
319
- defaultClassName: 'solidaria-BreadcrumbItem',
386
+ defaultClassName: "solidaria-BreadcrumbItem",
320
387
  },
321
- renderValues
388
+ renderValues,
322
389
  );
323
390
 
324
- // Merge inline flex styles with user styles
325
391
  const mergedStyle = () => {
326
392
  const userStyle = renderProps.style();
327
- const baseStyle = { display: 'inline-flex', 'align-items': 'center' };
393
+ const baseStyle = { display: "inline-flex", "align-items": "center" };
328
394
  return userStyle ? { ...baseStyle, ...userStyle } : baseStyle;
329
395
  };
330
396
 
@@ -332,6 +398,10 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
332
398
  <Dynamic
333
399
  component={elementType()}
334
400
  {...mergedItemProps()}
401
+ ref={(element: HTMLElement) => assignRef(local.ref, element)}
402
+ href={isCurrent() ? undefined : (mergedItemProps() as { href?: string }).href}
403
+ aria-current={isCurrent() ? (ariaProps["aria-current"] ?? "page") : undefined}
404
+ aria-disabled={isDisabled() || isCurrent() || undefined}
335
405
  class={renderProps.class()}
336
406
  style={mergedStyle()}
337
407
  data-current={isCurrent() || undefined}
@@ -346,5 +416,4 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
346
416
  );
347
417
  }
348
418
 
349
- // Attach sub-components
350
419
  Breadcrumbs.Item = BreadcrumbItem;