@proyecto-viviana/solidaria 0.2.4 → 0.2.8
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.
- package/LICENSE +21 -0
- package/dist/actiongroup/createActionGroup.d.ts +29 -0
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
- package/dist/actiongroup/index.d.ts +2 -0
- package/dist/actiongroup/index.d.ts.map +1 -0
- package/dist/autocomplete/createAutocomplete.d.ts +6 -2
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/breadcrumbs/createBreadcrumbs.d.ts +2 -0
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/button/createToggleButtonGroup.d.ts +32 -0
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
- package/dist/button/index.d.ts +2 -0
- package/dist/button/index.d.ts.map +1 -1
- package/dist/calendar/createCalendarCell.d.ts +2 -0
- package/dist/calendar/createCalendarCell.d.ts.map +1 -1
- package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts +3 -1
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroup.d.ts +5 -1
- package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
- package/dist/collections/index.d.ts +56 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/color/createColorArea.d.ts.map +1 -1
- package/dist/color/createColorSlider.d.ts.map +1 -1
- package/dist/color/createColorWheel.d.ts.map +1 -1
- package/dist/combobox/createComboBox.d.ts +6 -0
- package/dist/combobox/createComboBox.d.ts.map +1 -1
- package/dist/datepicker/createDatePicker.d.ts +6 -0
- package/dist/datepicker/createDatePicker.d.ts.map +1 -1
- package/dist/datepicker/createDateRangePicker.d.ts +40 -0
- package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
- package/dist/datepicker/createDateSegment.d.ts +1 -1
- package/dist/datepicker/createDateSegment.d.ts.map +1 -1
- package/dist/datepicker/createTimeSegment.d.ts +29 -0
- package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
- package/dist/datepicker/index.d.ts +2 -0
- package/dist/datepicker/index.d.ts.map +1 -1
- package/dist/disclosure/createDisclosureGroup.d.ts +2 -1
- package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
- package/dist/dnd/createDrag.d.ts.map +1 -1
- package/dist/dnd/createDraggableCollection.d.ts +4 -0
- package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
- package/dist/dnd/createDraggableItem.d.ts.map +1 -1
- package/dist/dnd/createDrop.d.ts.map +1 -1
- package/dist/dnd/createDroppableCollection.d.ts +32 -1
- package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
- package/dist/dnd/createDroppableItem.d.ts.map +1 -1
- package/dist/dnd/index.d.ts +1 -1
- package/dist/dnd/index.d.ts.map +1 -1
- package/dist/grid/createGrid.d.ts.map +1 -1
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4659 -3452
- package/dist/index.js.map +1 -7
- package/dist/index.ssr.js +4659 -3452
- package/dist/index.ssr.js.map +1 -7
- package/dist/interactions/createFocus.d.ts.map +1 -1
- package/dist/interactions/createFocusWithin.d.ts.map +1 -1
- package/dist/link/createLink.d.ts +10 -0
- package/dist/link/createLink.d.ts.map +1 -1
- package/dist/listbox/createListBox.d.ts +1 -0
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/menu/createMenu.d.ts +1 -0
- package/dist/menu/createMenu.d.ts.map +1 -1
- package/dist/meter/createMeter.d.ts.map +1 -1
- package/dist/numberfield/createNumberField.d.ts +18 -0
- package/dist/numberfield/createNumberField.d.ts.map +1 -1
- package/dist/overlays/createModal.d.ts +16 -0
- package/dist/overlays/createModal.d.ts.map +1 -1
- package/dist/overlays/createOverlay.d.ts.map +1 -1
- package/dist/overlays/index.d.ts +1 -1
- package/dist/overlays/index.d.ts.map +1 -1
- package/dist/popover/createOverlayPosition.d.ts.map +1 -1
- package/dist/popover/createPopover.d.ts.map +1 -1
- package/dist/progress/createProgressBar.d.ts.map +1 -1
- package/dist/radio/createRadioGroup.d.ts +2 -2
- package/dist/radio/createRadioGroup.d.ts.map +1 -1
- package/dist/searchfield/createSearchField.d.ts.map +1 -1
- package/dist/select/createHiddenSelect.d.ts.map +1 -1
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/slider/createSlider.d.ts.map +1 -1
- package/dist/table/createTable.d.ts.map +1 -1
- package/dist/tabs/createTabs.d.ts +1 -1
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tag/createTag.d.ts.map +1 -1
- package/dist/tag/createTagGroup.d.ts.map +1 -1
- package/dist/toast/createToast.d.ts +4 -0
- package/dist/toast/createToast.d.ts.map +1 -1
- package/dist/toast/createToastRegion.d.ts.map +1 -1
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeItem.d.ts.map +1 -1
- package/dist/tree/types.d.ts +4 -0
- package/dist/tree/types.d.ts.map +1 -1
- package/dist/utils/env.d.ts +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
- package/package.json +8 -6
- package/src/actiongroup/createActionGroup.ts +324 -0
- package/src/actiongroup/index.ts +8 -0
- package/src/autocomplete/createAutocomplete.ts +32 -9
- package/src/breadcrumbs/createBreadcrumbs.ts +10 -15
- package/src/button/createButton.ts +1 -1
- package/src/button/createToggleButtonGroup.ts +128 -0
- package/src/button/index.ts +9 -0
- package/src/calendar/createCalendarCell.ts +6 -4
- package/src/calendar/createCalendarGrid.ts +27 -18
- package/src/calendar/createRangeCalendarCell.ts +26 -9
- package/src/checkbox/createCheckboxGroup.ts +21 -4
- package/src/collections/index.ts +242 -0
- package/src/color/createColorArea.ts +380 -314
- package/src/color/createColorField.ts +137 -137
- package/src/color/createColorSlider.ts +286 -197
- package/src/color/createColorSwatch.ts +40 -40
- package/src/color/createColorWheel.ts +218 -208
- package/src/color/index.ts +24 -24
- package/src/color/types.ts +116 -116
- package/src/combobox/createComboBox.ts +670 -647
- package/src/combobox/index.ts +6 -6
- package/src/datepicker/createDatePicker.ts +54 -16
- package/src/datepicker/createDateRangePicker.ts +246 -0
- package/src/datepicker/createDateSegment.ts +185 -31
- package/src/datepicker/createTimeSegment.ts +370 -0
- package/src/datepicker/index.ts +14 -0
- package/src/dialog/createDialog.ts +120 -120
- package/src/dialog/index.ts +2 -2
- package/src/dialog/types.ts +19 -19
- package/src/disclosure/createDisclosureGroup.ts +5 -2
- package/src/dnd/createDrag.ts +224 -209
- package/src/dnd/createDraggableCollection.ts +96 -63
- package/src/dnd/createDraggableItem.ts +259 -243
- package/src/dnd/createDrop.ts +322 -321
- package/src/dnd/createDroppableCollection.ts +682 -293
- package/src/dnd/createDroppableItem.ts +215 -213
- package/src/dnd/index.ts +55 -47
- package/src/dnd/types.ts +89 -89
- package/src/dnd/utils.ts +294 -294
- package/src/focus/createAutoFocus.ts +321 -321
- package/src/focus/createFocusRestore.ts +313 -313
- package/src/focus/createVirtualFocus.ts +396 -396
- package/src/form/createFormValidation.ts +224 -224
- package/src/form/index.ts +11 -11
- package/src/grid/createGrid.ts +3 -1
- package/src/gridlist/createGridList.ts +16 -0
- package/src/gridlist/createGridListItem.ts +1 -1
- package/src/i18n/NumberFormatter.ts +266 -266
- package/src/i18n/createCollator.ts +79 -79
- package/src/i18n/createDateFormatter.ts +83 -83
- package/src/i18n/createFilter.ts +131 -131
- package/src/i18n/createNumberFormatter.ts +52 -52
- package/src/i18n/index.ts +40 -40
- package/src/i18n/locale.tsx +188 -188
- package/src/i18n/utils.ts +99 -99
- package/src/index.ts +51 -0
- package/src/interactions/createFocus.ts +6 -5
- package/src/interactions/createFocusWithin.ts +6 -5
- package/src/interactions/createLongPress.ts +174 -174
- package/src/interactions/createMove.ts +289 -289
- package/src/interactions/createPress.ts +5 -5
- package/src/landmark/createLandmark.ts +377 -377
- package/src/landmark/index.ts +8 -8
- package/src/link/createLink.ts +23 -8
- package/src/listbox/createListBox.ts +308 -269
- package/src/listbox/createOption.ts +162 -151
- package/src/listbox/index.ts +12 -12
- package/src/live-announcer/announce.ts +322 -322
- package/src/live-announcer/index.ts +9 -9
- package/src/menu/createMenu.ts +405 -396
- package/src/menu/createMenuItem.ts +149 -149
- package/src/menu/createMenuTrigger.ts +88 -88
- package/src/menu/index.ts +18 -18
- package/src/meter/createMeter.ts +1 -6
- package/src/numberfield/createNumberField.ts +311 -268
- package/src/numberfield/index.ts +5 -5
- package/src/overlays/ariaHideOutside.ts +219 -219
- package/src/overlays/createInteractOutside.ts +149 -149
- package/src/overlays/createModal.tsx +238 -202
- package/src/overlays/createOverlay.ts +165 -155
- package/src/overlays/createOverlayTrigger.ts +85 -85
- package/src/overlays/createPreventScroll.ts +266 -266
- package/src/overlays/index.ts +48 -44
- package/src/popover/calculatePosition.ts +6 -6
- package/src/popover/createOverlayPosition.ts +7 -4
- package/src/popover/createPopover.ts +21 -7
- package/src/progress/createProgressBar.ts +6 -1
- package/src/radio/createRadioGroup.ts +88 -14
- package/src/searchfield/createSearchField.ts +241 -186
- package/src/searchfield/index.ts +2 -2
- package/src/select/createHiddenSelect.tsx +263 -236
- package/src/select/createSelect.ts +373 -395
- package/src/select/index.ts +14 -14
- package/src/slider/createSlider.ts +364 -349
- package/src/slider/index.ts +2 -2
- package/src/ssr/index.tsx +370 -370
- package/src/table/createTable.ts +3 -1
- package/src/table/createTableColumnHeader.ts +1 -1
- package/src/table/createTableRow.ts +1 -1
- package/src/tabs/createTabs.ts +80 -51
- package/src/tag/createTag.ts +135 -6
- package/src/tag/createTagGroup.ts +7 -2
- package/src/toast/createToast.ts +8 -2
- package/src/toast/createToastRegion.ts +0 -1
- package/src/toolbar/createToolbar.ts +75 -1
- package/src/tooltip/createTooltip.ts +79 -79
- package/src/tooltip/createTooltipTrigger.ts +226 -222
- package/src/tooltip/index.ts +6 -6
- package/src/tree/createTree.ts +261 -246
- package/src/tree/createTreeItem.ts +282 -233
- package/src/tree/createTreeSelectionCheckbox.ts +68 -68
- package/src/tree/index.ts +16 -16
- package/src/tree/types.ts +91 -87
- package/src/utils/env.ts +55 -54
- package/src/utils/platform.ts +16 -6
- package/src/visually-hidden/createVisuallyHidden.ts +139 -124
- package/src/visually-hidden/index.ts +6 -6
package/src/tree/index.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree ARIA layer exports.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export { createTree, getTreeData } from './createTree';
|
|
6
|
-
export { createTreeItem } from './createTreeItem';
|
|
7
|
-
export { createTreeSelectionCheckbox } from './createTreeSelectionCheckbox';
|
|
8
|
-
|
|
9
|
-
export type {
|
|
10
|
-
AriaTreeProps,
|
|
11
|
-
TreeAria,
|
|
12
|
-
AriaTreeItemProps,
|
|
13
|
-
TreeItemAria,
|
|
14
|
-
AriaTreeSelectionCheckboxProps,
|
|
15
|
-
TreeSelectionCheckboxAria,
|
|
16
|
-
} from './types';
|
|
1
|
+
/**
|
|
2
|
+
* Tree ARIA layer exports.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export { createTree, getTreeData } from './createTree';
|
|
6
|
+
export { createTreeItem } from './createTreeItem';
|
|
7
|
+
export { createTreeSelectionCheckbox } from './createTreeSelectionCheckbox';
|
|
8
|
+
|
|
9
|
+
export type {
|
|
10
|
+
AriaTreeProps,
|
|
11
|
+
TreeAria,
|
|
12
|
+
AriaTreeItemProps,
|
|
13
|
+
TreeItemAria,
|
|
14
|
+
AriaTreeSelectionCheckboxProps,
|
|
15
|
+
TreeSelectionCheckboxAria,
|
|
16
|
+
} from './types';
|
package/src/tree/types.ts
CHANGED
|
@@ -1,87 +1,91 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree ARIA types.
|
|
3
|
-
* Based on @react-aria/tree.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { JSX } from 'solid-js';
|
|
7
|
-
import type { Key, TreeNode } from '@proyecto-viviana/solid-stately';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Props for createTree.
|
|
11
|
-
*/
|
|
12
|
-
export interface AriaTreeProps {
|
|
13
|
-
/** The unique id for the tree. */
|
|
14
|
-
id?: string;
|
|
15
|
-
/** Label for accessibility. */
|
|
16
|
-
'aria-label'?: string;
|
|
17
|
-
/** ID of an element that labels the tree. */
|
|
18
|
-
'aria-labelledby'?: string;
|
|
19
|
-
/** ID of an element that describes the tree. */
|
|
20
|
-
'aria-describedby'?: string;
|
|
21
|
-
/** Whether the tree is virtualized. */
|
|
22
|
-
isVirtualized?: boolean;
|
|
23
|
-
/** Handler called when an item action is triggered. */
|
|
24
|
-
onAction?: (key: Key) => void;
|
|
25
|
-
/** Whether the tree is disabled. */
|
|
26
|
-
isDisabled?: boolean;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
/** Props for the
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
/** Whether the item is
|
|
64
|
-
|
|
65
|
-
/** Whether the item is
|
|
66
|
-
|
|
67
|
-
/** Whether the item is
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Tree ARIA types.
|
|
3
|
+
* Based on @react-aria/tree.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { JSX } from 'solid-js';
|
|
7
|
+
import type { Key, TreeNode } from '@proyecto-viviana/solid-stately';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Props for createTree.
|
|
11
|
+
*/
|
|
12
|
+
export interface AriaTreeProps {
|
|
13
|
+
/** The unique id for the tree. */
|
|
14
|
+
id?: string;
|
|
15
|
+
/** Label for accessibility. */
|
|
16
|
+
'aria-label'?: string;
|
|
17
|
+
/** ID of an element that labels the tree. */
|
|
18
|
+
'aria-labelledby'?: string;
|
|
19
|
+
/** ID of an element that describes the tree. */
|
|
20
|
+
'aria-describedby'?: string;
|
|
21
|
+
/** Whether the tree is virtualized. */
|
|
22
|
+
isVirtualized?: boolean;
|
|
23
|
+
/** Handler called when an item action is triggered. */
|
|
24
|
+
onAction?: (key: Key) => void;
|
|
25
|
+
/** Whether the tree is disabled. */
|
|
26
|
+
isDisabled?: boolean;
|
|
27
|
+
/** The writing direction for the tree. Determines expand/collapse key mapping. */
|
|
28
|
+
direction?: 'ltr' | 'rtl';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Return value for createTree.
|
|
33
|
+
*/
|
|
34
|
+
export interface TreeAria {
|
|
35
|
+
/** Props for the tree container (role="treegrid"). */
|
|
36
|
+
treeProps: JSX.HTMLAttributes<HTMLDivElement>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Props for createTreeItem.
|
|
41
|
+
*/
|
|
42
|
+
export interface AriaTreeItemProps<T = unknown> {
|
|
43
|
+
/** The tree node this item represents. */
|
|
44
|
+
node: TreeNode<T>;
|
|
45
|
+
/** Whether the item is rendered in a virtualized list. */
|
|
46
|
+
isVirtualized?: boolean;
|
|
47
|
+
/** Handler called when this item's action is triggered. */
|
|
48
|
+
onAction?: () => void;
|
|
49
|
+
/** The text value for the item (used for aria-label on the row). */
|
|
50
|
+
textValue?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Return value for createTreeItem.
|
|
55
|
+
*/
|
|
56
|
+
export interface TreeItemAria {
|
|
57
|
+
/** Props for the row element. */
|
|
58
|
+
rowProps: JSX.HTMLAttributes<HTMLDivElement>;
|
|
59
|
+
/** Props for the grid cell content wrapper. */
|
|
60
|
+
gridCellProps: JSX.HTMLAttributes<HTMLDivElement>;
|
|
61
|
+
/** Props for the expand button (if the item is expandable). */
|
|
62
|
+
expandButtonProps: JSX.ButtonHTMLAttributes<HTMLButtonElement>;
|
|
63
|
+
/** Whether the item is selected. */
|
|
64
|
+
isSelected: boolean;
|
|
65
|
+
/** Whether the item is disabled. */
|
|
66
|
+
isDisabled: boolean;
|
|
67
|
+
/** Whether the item is being pressed. */
|
|
68
|
+
isPressed: boolean;
|
|
69
|
+
/** Whether the item is expanded. */
|
|
70
|
+
isExpanded: boolean;
|
|
71
|
+
/** Whether the item is expandable (has children). */
|
|
72
|
+
isExpandable: boolean;
|
|
73
|
+
/** The nesting level of the item (0 for root). */
|
|
74
|
+
level: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Props for createTreeSelectionCheckbox.
|
|
79
|
+
*/
|
|
80
|
+
export interface AriaTreeSelectionCheckboxProps {
|
|
81
|
+
/** The key of the tree item this checkbox belongs to. */
|
|
82
|
+
key: Key;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Return value for createTreeSelectionCheckbox.
|
|
87
|
+
*/
|
|
88
|
+
export interface TreeSelectionCheckboxAria {
|
|
89
|
+
/** Props for the checkbox input element. */
|
|
90
|
+
checkboxProps: JSX.InputHTMLAttributes<HTMLInputElement>;
|
|
91
|
+
}
|
package/src/utils/env.ts
CHANGED
|
@@ -1,54 +1,55 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment detection utilities.
|
|
3
|
-
* These avoid direct references to process.env which can cause TypeScript issues in browser environments.
|
|
4
|
-
* Compatible with Node.js
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Type-safe access to import.meta.env (Vite) and
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
const nodeEnv = getEnvVar('NODE_ENV');
|
|
42
|
-
return nodeEnv !== 'production';
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Check if we're running in production.
|
|
47
|
-
*/
|
|
48
|
-
export function isProdEnv(): boolean {
|
|
49
|
-
// Check Vite's PROD flag
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Environment detection utilities.
|
|
3
|
+
* These avoid direct references to process.env which can cause TypeScript issues in browser environments.
|
|
4
|
+
* Compatible with Node.js and Vite environments.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Type-safe access to import.meta.env (Vite) and process.env
|
|
8
|
+
type ImportMetaWithEnv = ImportMeta & { env?: Record<string, unknown> & { DEV?: boolean; PROD?: boolean } };
|
|
9
|
+
type ProcessLike = { env?: Record<string, string | undefined> };
|
|
10
|
+
|
|
11
|
+
function getEnvVar(key: string): string | undefined {
|
|
12
|
+
// Check Vite's import.meta.env
|
|
13
|
+
const importMetaEnv = (import.meta as ImportMetaWithEnv).env;
|
|
14
|
+
if (importMetaEnv && typeof importMetaEnv[key] === 'string') {
|
|
15
|
+
return importMetaEnv[key] as string;
|
|
16
|
+
}
|
|
17
|
+
// Check Node.js process.env via globalThis
|
|
18
|
+
const processEnv = (globalThis as typeof globalThis & { process?: ProcessLike }).process?.env;
|
|
19
|
+
if (processEnv) {
|
|
20
|
+
return processEnv[key];
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Check if we're running in a test environment.
|
|
27
|
+
*/
|
|
28
|
+
export function isTestEnv(): boolean {
|
|
29
|
+
return getEnvVar('NODE_ENV') === 'test';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Check if we're running in a development environment (not production).
|
|
34
|
+
*/
|
|
35
|
+
export function isDevEnv(): boolean {
|
|
36
|
+
// Check Vite's DEV flag
|
|
37
|
+
const importMetaEnv = (import.meta as ImportMetaWithEnv).env;
|
|
38
|
+
if (importMetaEnv?.DEV === true) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const nodeEnv = getEnvVar('NODE_ENV');
|
|
42
|
+
return nodeEnv !== 'production';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Check if we're running in production.
|
|
47
|
+
*/
|
|
48
|
+
export function isProdEnv(): boolean {
|
|
49
|
+
// Check Vite's PROD flag
|
|
50
|
+
const importMetaEnv = (import.meta as ImportMetaWithEnv).env;
|
|
51
|
+
if (importMetaEnv?.PROD === true) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return getEnvVar('NODE_ENV') === 'production';
|
|
55
|
+
}
|
package/src/utils/platform.ts
CHANGED
|
@@ -3,16 +3,26 @@
|
|
|
3
3
|
* Based on @react-aria/utils platform detection.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
interface NavigatorWithUserAgentData extends Navigator {
|
|
7
|
+
userAgentData?: {
|
|
8
|
+
platform?: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function getNavigator(): NavigatorWithUserAgentData | null {
|
|
13
|
+
if (typeof window === 'undefined' || window.navigator == null) return null;
|
|
14
|
+
return window.navigator as NavigatorWithUserAgentData;
|
|
15
|
+
}
|
|
16
|
+
|
|
6
17
|
function testPlatform(re: RegExp): boolean {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
18
|
+
const nav = getNavigator();
|
|
19
|
+
if (!nav) return false;
|
|
20
|
+
return re.test(nav.platform || nav.userAgentData?.platform || '');
|
|
10
21
|
}
|
|
11
22
|
|
|
12
23
|
function testUserAgent(re: RegExp): boolean {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
: false;
|
|
24
|
+
const nav = getNavigator();
|
|
25
|
+
return nav ? re.test(nav.userAgent) : false;
|
|
16
26
|
}
|
|
17
27
|
|
|
18
28
|
export function isMac(): boolean {
|
|
@@ -1,124 +1,139 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* createVisuallyHidden hook for solidaria
|
|
3
|
-
*
|
|
4
|
-
* Provides styles and props to visually hide content while keeping it
|
|
5
|
-
* accessible to screen readers.
|
|
6
|
-
*
|
|
7
|
-
* Port of react-aria's useVisuallyHidden.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { type Accessor, type JSX, createMemo, createSignal } from 'solid-js';
|
|
11
|
-
import { createFocusWithin } from '../interactions/createFocusWithin';
|
|
12
|
-
import { access, type MaybeAccessor } from '../utils';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
*
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
1
|
+
/**
|
|
2
|
+
* createVisuallyHidden hook for solidaria
|
|
3
|
+
*
|
|
4
|
+
* Provides styles and props to visually hide content while keeping it
|
|
5
|
+
* accessible to screen readers.
|
|
6
|
+
*
|
|
7
|
+
* Port of react-aria's useVisuallyHidden.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { type Accessor, type JSX, createMemo, createSignal } from 'solid-js';
|
|
11
|
+
import { createFocusWithin } from '../interactions/createFocusWithin';
|
|
12
|
+
import { access, type MaybeAccessor } from '../utils';
|
|
13
|
+
import { mergeProps } from '../utils/mergeProps';
|
|
14
|
+
|
|
15
|
+
// ============================================
|
|
16
|
+
// TYPES
|
|
17
|
+
// ============================================
|
|
18
|
+
|
|
19
|
+
export interface AriaVisuallyHiddenProps {
|
|
20
|
+
/** Inline styles to merge with the visually hidden styles. */
|
|
21
|
+
style?: JSX.CSSProperties;
|
|
22
|
+
/** Whether the element should become visible when focused (e.g., skip links). */
|
|
23
|
+
isFocusable?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface VisuallyHiddenAria {
|
|
27
|
+
/** Props to spread on the visually hidden element. */
|
|
28
|
+
visuallyHiddenProps: Accessor<JSX.HTMLAttributes<HTMLElement>>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ============================================
|
|
32
|
+
// STYLES
|
|
33
|
+
// ============================================
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* CSS styles that visually hide an element while keeping it accessible.
|
|
37
|
+
* These styles ensure the element is read by screen readers but not visible on screen.
|
|
38
|
+
*/
|
|
39
|
+
export const visuallyHiddenStyles: JSX.CSSProperties = {
|
|
40
|
+
border: '0',
|
|
41
|
+
clip: 'rect(0 0 0 0)',
|
|
42
|
+
'clip-path': 'inset(50%)',
|
|
43
|
+
height: '1px',
|
|
44
|
+
margin: '-1px',
|
|
45
|
+
overflow: 'hidden',
|
|
46
|
+
padding: '0',
|
|
47
|
+
position: 'absolute',
|
|
48
|
+
width: '1px',
|
|
49
|
+
'white-space': 'nowrap',
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// ============================================
|
|
53
|
+
// HOOK
|
|
54
|
+
// ============================================
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Provides props for an element that hides its children visually
|
|
58
|
+
* but keeps content visible to assistive technology.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* function SkipLink() {
|
|
63
|
+
* let ref: HTMLAnchorElement | undefined;
|
|
64
|
+
* const { visuallyHiddenProps } = createVisuallyHidden({ isFocusable: true });
|
|
65
|
+
*
|
|
66
|
+
* return (
|
|
67
|
+
* <a
|
|
68
|
+
* ref={ref}
|
|
69
|
+
* href="#main-content"
|
|
70
|
+
* {...visuallyHiddenProps()}
|
|
71
|
+
* >
|
|
72
|
+
* Skip to main content
|
|
73
|
+
* </a>
|
|
74
|
+
* );
|
|
75
|
+
* }
|
|
76
|
+
*
|
|
77
|
+
* // For content that should always be hidden
|
|
78
|
+
* function ScreenReaderOnly(props: ParentProps) {
|
|
79
|
+
* const { visuallyHiddenProps } = createVisuallyHidden();
|
|
80
|
+
*
|
|
81
|
+
* return (
|
|
82
|
+
* <span {...visuallyHiddenProps()}>
|
|
83
|
+
* {props.children}
|
|
84
|
+
* </span>
|
|
85
|
+
* );
|
|
86
|
+
* }
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export function createVisuallyHidden(
|
|
90
|
+
props: MaybeAccessor<AriaVisuallyHiddenProps> = {}
|
|
91
|
+
): VisuallyHiddenAria {
|
|
92
|
+
const [isFocused, setIsFocused] = createSignal(false);
|
|
93
|
+
|
|
94
|
+
const isFocusable = () => access(props).isFocusable ?? false;
|
|
95
|
+
const style = () => access(props).style;
|
|
96
|
+
|
|
97
|
+
// Track focus within for focusable visually hidden elements
|
|
98
|
+
const { focusWithinProps } = createFocusWithin({
|
|
99
|
+
get isDisabled() {
|
|
100
|
+
return !isFocusable();
|
|
101
|
+
},
|
|
102
|
+
onFocusWithinChange: (val: boolean) => setIsFocused(val),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Compute combined styles
|
|
106
|
+
const combinedStyles = createMemo<JSX.CSSProperties | undefined>(() => {
|
|
107
|
+
if (isFocused()) {
|
|
108
|
+
// If focused, show the element (for skip links, etc.)
|
|
109
|
+
return style();
|
|
110
|
+
} else if (style()) {
|
|
111
|
+
return { ...visuallyHiddenStyles, ...style() };
|
|
112
|
+
} else {
|
|
113
|
+
return visuallyHiddenStyles;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const visuallyHiddenProps = createMemo<JSX.HTMLAttributes<HTMLElement>>(() => ({
|
|
118
|
+
...mergeProps(
|
|
119
|
+
focusWithinProps as unknown as Record<string, unknown>,
|
|
120
|
+
isFocusable()
|
|
121
|
+
? {
|
|
122
|
+
onFocusIn: () => setIsFocused(true),
|
|
123
|
+
onFocusOut: (e: FocusEvent) => {
|
|
124
|
+
const currentTarget = e.currentTarget as Element | null;
|
|
125
|
+
const relatedTarget = e.relatedTarget as Element | null;
|
|
126
|
+
if (currentTarget && !currentTarget.contains(relatedTarget)) {
|
|
127
|
+
setIsFocused(false);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
: {},
|
|
132
|
+
{ style: combinedStyles() }
|
|
133
|
+
),
|
|
134
|
+
}));
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
visuallyHiddenProps,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export {
|
|
2
|
-
createVisuallyHidden,
|
|
3
|
-
visuallyHiddenStyles,
|
|
4
|
-
type AriaVisuallyHiddenProps,
|
|
5
|
-
type VisuallyHiddenAria,
|
|
6
|
-
} from './createVisuallyHidden';
|
|
1
|
+
export {
|
|
2
|
+
createVisuallyHidden,
|
|
3
|
+
visuallyHiddenStyles,
|
|
4
|
+
type AriaVisuallyHiddenProps,
|
|
5
|
+
type VisuallyHiddenAria,
|
|
6
|
+
} from './createVisuallyHidden';
|