@hoardodile/ui 0.0.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.
- package/LICENSE +18 -0
- package/README.md +70 -0
- package/dist/components/alert.d.ts +13 -0
- package/dist/components/alert.js +97 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/app-dialog.d.ts +62 -0
- package/dist/components/app-dialog.js +656 -0
- package/dist/components/app-dialog.js.map +1 -0
- package/dist/components/badge.d.ts +11 -0
- package/dist/components/badge.js +70 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +12 -0
- package/dist/components/breadcrumb.js +617 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.d.ts +17 -0
- package/dist/components/button.js +78 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/caption-bar.d.ts +44 -0
- package/dist/components/caption-bar.js +827 -0
- package/dist/components/caption-bar.js.map +1 -0
- package/dist/components/chart-card.d.ts +15 -0
- package/dist/components/chart-card.js +27 -0
- package/dist/components/chart-card.js.map +1 -0
- package/dist/components/checkbox.d.ts +6 -0
- package/dist/components/checkbox.js +76 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/chip-button.d.ts +28 -0
- package/dist/components/chip-button.js +87 -0
- package/dist/components/chip-button.js.map +1 -0
- package/dist/components/close-confirm-dialog.d.ts +19 -0
- package/dist/components/close-confirm-dialog.js +743 -0
- package/dist/components/close-confirm-dialog.js.map +1 -0
- package/dist/components/color-picker.d.ts +32 -0
- package/dist/components/color-picker.js +667 -0
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/combobox.d.ts +32 -0
- package/dist/components/combobox.js +1211 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/confirm-by-typing-dialog.d.ts +48 -0
- package/dist/components/confirm-by-typing-dialog.js +759 -0
- package/dist/components/confirm-by-typing-dialog.js.map +1 -0
- package/dist/components/confirm-dialog.d.ts +34 -0
- package/dist/components/confirm-dialog.js +710 -0
- package/dist/components/confirm-dialog.js.map +1 -0
- package/dist/components/count-badge.d.ts +13 -0
- package/dist/components/count-badge.js +39 -0
- package/dist/components/count-badge.js.map +1 -0
- package/dist/components/dialog.d.ts +40 -0
- package/dist/components/dialog.js +571 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +45 -0
- package/dist/components/dropdown-menu.js +1003 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/dropdown-select.d.ts +29 -0
- package/dist/components/dropdown-select.js +1036 -0
- package/dist/components/dropdown-select.js.map +1 -0
- package/dist/components/empty.d.ts +15 -0
- package/dist/components/empty.js +119 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/filter-rail.d.ts +48 -0
- package/dist/components/filter-rail.js +231 -0
- package/dist/components/filter-rail.js.map +1 -0
- package/dist/components/fixed-action-bar.d.ts +24 -0
- package/dist/components/fixed-action-bar.js +48 -0
- package/dist/components/fixed-action-bar.js.map +1 -0
- package/dist/components/font-picker.d.ts +45 -0
- package/dist/components/font-picker.js +759 -0
- package/dist/components/font-picker.js.map +1 -0
- package/dist/components/form.d.ts +17 -0
- package/dist/components/form.js +150 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/group-label.d.ts +12 -0
- package/dist/components/group-label.js +10 -0
- package/dist/components/group-label.js.map +1 -0
- package/dist/components/icon-tile.d.ts +16 -0
- package/dist/components/icon-tile.js +67 -0
- package/dist/components/icon-tile.js.map +1 -0
- package/dist/components/icon-toggle.d.ts +24 -0
- package/dist/components/icon-toggle.js +81 -0
- package/dist/components/icon-toggle.js.map +1 -0
- package/dist/components/icon.d.ts +2 -0
- package/dist/components/icon.js +49 -0
- package/dist/components/icon.js.map +1 -0
- package/dist/components/image-crop-panel.d.ts +80 -0
- package/dist/components/image-crop-panel.js +1104 -0
- package/dist/components/image-crop-panel.js.map +1 -0
- package/dist/components/image-cropper.d.ts +63 -0
- package/dist/components/image-cropper.js +166 -0
- package/dist/components/image-cropper.js.map +1 -0
- package/dist/components/input-group.d.ts +22 -0
- package/dist/components/input-group.js +270 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input.d.ts +16 -0
- package/dist/components/input.js +60 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.d.ts +5 -0
- package/dist/components/label.js +40 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/list-empty-row.d.ts +16 -0
- package/dist/components/list-empty-row.js +40 -0
- package/dist/components/list-empty-row.js.map +1 -0
- package/dist/components/management-empty.d.ts +14 -0
- package/dist/components/management-empty.js +40 -0
- package/dist/components/management-empty.js.map +1 -0
- package/dist/components/management-skeleton.d.ts +11 -0
- package/dist/components/management-skeleton.js +72 -0
- package/dist/components/management-skeleton.js.map +1 -0
- package/dist/components/meta-chip.d.ts +17 -0
- package/dist/components/meta-chip.js +49 -0
- package/dist/components/meta-chip.js.map +1 -0
- package/dist/components/mobile-drawer.d.ts +29 -0
- package/dist/components/mobile-drawer.js +331 -0
- package/dist/components/mobile-drawer.js.map +1 -0
- package/dist/components/page-header.d.ts +20 -0
- package/dist/components/page-header.js +44 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/page-scaffold.d.ts +34 -0
- package/dist/components/page-scaffold.js +157 -0
- package/dist/components/page-scaffold.js.map +1 -0
- package/dist/components/pagination-bar.d.ts +22 -0
- package/dist/components/pagination-bar.js +703 -0
- package/dist/components/pagination-bar.js.map +1 -0
- package/dist/components/pagination.d.ts +22 -0
- package/dist/components/pagination.js +680 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/panel-toolbar.d.ts +37 -0
- package/dist/components/panel-toolbar.js +781 -0
- package/dist/components/panel-toolbar.js.map +1 -0
- package/dist/components/pill-tabs.d.ts +33 -0
- package/dist/components/pill-tabs.js +66 -0
- package/dist/components/pill-tabs.js.map +1 -0
- package/dist/components/plugin-download-consent.d.ts +52 -0
- package/dist/components/plugin-download-consent.js +780 -0
- package/dist/components/plugin-download-consent.js.map +1 -0
- package/dist/components/popover.d.ts +26 -0
- package/dist/components/popover.js +343 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +10 -0
- package/dist/components/progress.js +103 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/query-state-view.d.ts +36 -0
- package/dist/components/query-state-view.js +17 -0
- package/dist/components/query-state-view.js.map +1 -0
- package/dist/components/radio-group.d.ts +8 -0
- package/dist/components/radio-group.js +60 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/scroll-area.d.ts +7 -0
- package/dist/components/scroll-area.js +80 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/search-field.d.ts +49 -0
- package/dist/components/search-field.js +586 -0
- package/dist/components/search-field.js.map +1 -0
- package/dist/components/secondary-stat.d.ts +13 -0
- package/dist/components/secondary-stat.js +56 -0
- package/dist/components/secondary-stat.js.map +1 -0
- package/dist/components/section-header.d.ts +23 -0
- package/dist/components/section-header.js +76 -0
- package/dist/components/section-header.js.map +1 -0
- package/dist/components/section-label.d.ts +20 -0
- package/dist/components/section-label.js +46 -0
- package/dist/components/section-label.js.map +1 -0
- package/dist/components/section-tabs.d.ts +47 -0
- package/dist/components/section-tabs.js +145 -0
- package/dist/components/section-tabs.js.map +1 -0
- package/dist/components/separator.d.ts +14 -0
- package/dist/components/separator.js +49 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +22 -0
- package/dist/components/sheet.js +469 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +69 -0
- package/dist/components/sidebar.js +1645 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.d.ts +8 -0
- package/dist/components/skeleton.js +41 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +6 -0
- package/dist/components/slider.js +75 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sortable-chip-list.d.ts +26 -0
- package/dist/components/sortable-chip-list.js +59 -0
- package/dist/components/sortable-chip-list.js.map +1 -0
- package/dist/components/spinner.d.ts +5 -0
- package/dist/components/spinner.js +65 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/surface.d.ts +13 -0
- package/dist/components/surface.js +51 -0
- package/dist/components/surface.js.map +1 -0
- package/dist/components/switch.d.ts +8 -0
- package/dist/components/switch.js +53 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +12 -0
- package/dist/components/table.js +129 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/textarea.d.ts +15 -0
- package/dist/components/textarea.js +58 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toast.d.ts +19 -0
- package/dist/components/toast.js +805 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toggle.d.ts +12 -0
- package/dist/components/toggle.js +63 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/tooltip.d.ts +9 -0
- package/dist/components/tooltip.js +82 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/hooks/use-dialog-footer-actions.d.ts +18 -0
- package/dist/hooks/use-dialog-footer-actions.js +11 -0
- package/dist/hooks/use-dialog-footer-actions.js.map +1 -0
- package/dist/hooks/use-form-field.d.ts +33 -0
- package/dist/hooks/use-form-field.js +36 -0
- package/dist/hooks/use-form-field.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +34 -0
- package/dist/hooks/use-mobile.js +29 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-pinch-pan.d.ts +56 -0
- package/dist/hooks/use-pinch-pan.js +223 -0
- package/dist/hooks/use-pinch-pan.js.map +1 -0
- package/dist/hooks/useMobileBackToClose.d.ts +61 -0
- package/dist/hooks/useMobileBackToClose.js +234 -0
- package/dist/hooks/useMobileBackToClose.js.map +1 -0
- package/dist/icon-BOgL5bpL.d.ts +85 -0
- package/dist/icons/actions.d.ts +4 -0
- package/dist/icons/actions.js +520 -0
- package/dist/icons/actions.js.map +1 -0
- package/dist/icons/icon-style.d.ts +2 -0
- package/dist/icons/icon-style.js +51 -0
- package/dist/icons/icon-style.js.map +1 -0
- package/dist/icons/marks.d.ts +15 -0
- package/dist/icons/marks.js +48 -0
- package/dist/icons/marks.js.map +1 -0
- package/dist/icons/registry.d.ts +177 -0
- package/dist/icons/registry.js +1180 -0
- package/dist/icons/registry.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +653 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/merge-config.d.ts +15 -0
- package/dist/lib/merge-config.js +20 -0
- package/dist/lib/merge-config.js.map +1 -0
- package/dist/lib/pagination.d.ts +19 -0
- package/dist/lib/pagination.js +26 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +26 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/styles/theme.css +480 -0
- package/dist/styles/theme.css.map +1 -0
- package/dist/styles/theme.d.ts +2 -0
- package/dist/viewport.d.ts +64 -0
- package/dist/viewport.js +13 -0
- package/dist/viewport.js.map +1 -0
- package/package.json +122 -0
- package/src/components/alert.tsx +76 -0
- package/src/components/app-dialog.tsx +187 -0
- package/src/components/badge.tsx +52 -0
- package/src/components/breadcrumb.tsx +129 -0
- package/src/components/button.tsx +70 -0
- package/src/components/caption-bar.test.tsx +151 -0
- package/src/components/caption-bar.tsx +392 -0
- package/src/components/chart-card.tsx +31 -0
- package/src/components/checkbox.tsx +28 -0
- package/src/components/chip-button.tsx +69 -0
- package/src/components/close-confirm-dialog.tsx +99 -0
- package/src/components/color-picker.tsx +186 -0
- package/src/components/combobox.tsx +335 -0
- package/src/components/confirm-by-typing-dialog.tsx +130 -0
- package/src/components/confirm-dialog.test.tsx +39 -0
- package/src/components/confirm-dialog.tsx +98 -0
- package/src/components/count-badge.tsx +23 -0
- package/src/components/dialog.tsx +315 -0
- package/src/components/dropdown-menu.tsx +311 -0
- package/src/components/dropdown-select.tsx +211 -0
- package/src/components/empty.tsx +104 -0
- package/src/components/filter-rail.tsx +139 -0
- package/src/components/fixed-action-bar.tsx +46 -0
- package/src/components/font-picker.tsx +257 -0
- package/src/components/form.tsx +127 -0
- package/src/components/group-label.tsx +13 -0
- package/src/components/icon-tile.tsx +35 -0
- package/src/components/icon-toggle.tsx +57 -0
- package/src/components/icon.tsx +66 -0
- package/src/components/image-crop-panel.test.tsx +167 -0
- package/src/components/image-crop-panel.tsx +465 -0
- package/src/components/image-cropper.test.tsx +144 -0
- package/src/components/image-cropper.tsx +265 -0
- package/src/components/input-group.tsx +156 -0
- package/src/components/input.tsx +45 -0
- package/src/components/label.tsx +20 -0
- package/src/components/list-empty-row.tsx +27 -0
- package/src/components/management-empty.tsx +25 -0
- package/src/components/management-skeleton.tsx +23 -0
- package/src/components/meta-chip.tsx +40 -0
- package/src/components/mobile-drawer.test.tsx +52 -0
- package/src/components/mobile-drawer.tsx +98 -0
- package/src/components/page-header.tsx +47 -0
- package/src/components/page-scaffold.test.tsx +24 -0
- package/src/components/page-scaffold.tsx +131 -0
- package/src/components/pagination-bar.test.tsx +87 -0
- package/src/components/pagination-bar.tsx +139 -0
- package/src/components/pagination.tsx +139 -0
- package/src/components/panel-toolbar.tsx +99 -0
- package/src/components/pill-tabs.test.tsx +84 -0
- package/src/components/pill-tabs.tsx +77 -0
- package/src/components/plugin-download-consent.test.tsx +90 -0
- package/src/components/plugin-download-consent.tsx +183 -0
- package/src/components/popover.tsx +133 -0
- package/src/components/progress.tsx +88 -0
- package/src/components/query-state-view.tsx +47 -0
- package/src/components/radio-group.tsx +36 -0
- package/src/components/scroll-area.tsx +52 -0
- package/src/components/search-field.test.tsx +86 -0
- package/src/components/search-field.tsx +119 -0
- package/src/components/secondary-stat.tsx +24 -0
- package/src/components/section-header.tsx +54 -0
- package/src/components/section-label.tsx +40 -0
- package/src/components/section-tabs.test.tsx +154 -0
- package/src/components/section-tabs.tsx +190 -0
- package/src/components/separator.tsx +38 -0
- package/src/components/sheet.tsx +170 -0
- package/src/components/sidebar.tsx +725 -0
- package/src/components/skeleton.tsx +18 -0
- package/src/components/slider.tsx +52 -0
- package/src/components/sortable-chip-list.tsx +56 -0
- package/src/components/spinner.tsx +35 -0
- package/src/components/surface.tsx +37 -0
- package/src/components/switch.tsx +30 -0
- package/src/components/table.tsx +116 -0
- package/src/components/textarea.tsx +41 -0
- package/src/components/toast.tsx +239 -0
- package/src/components/toggle.tsx +45 -0
- package/src/components/tooltip.tsx +64 -0
- package/src/hooks/use-dialog-footer-actions.ts +23 -0
- package/src/hooks/use-form-field.ts +62 -0
- package/src/hooks/use-mobile.ts +54 -0
- package/src/hooks/use-pinch-pan.test.tsx +42 -0
- package/src/hooks/use-pinch-pan.ts +340 -0
- package/src/hooks/useMobileBackToClose.test.tsx +140 -0
- package/src/hooks/useMobileBackToClose.ts +508 -0
- package/src/icons/actions.ts +10 -0
- package/src/icons/icon-style.test.tsx +69 -0
- package/src/icons/icon-style.ts +104 -0
- package/src/icons/marks.tsx +72 -0
- package/src/icons/registry.test.ts +65 -0
- package/src/icons/registry.ts +1163 -0
- package/src/index.ts +22 -0
- package/src/lib/merge-config.test.ts +109 -0
- package/src/lib/merge-config.ts +22 -0
- package/src/lib/pagination.test.ts +55 -0
- package/src/lib/pagination.ts +42 -0
- package/src/lib/utils.ts +6 -0
- package/src/styles/scan-contract.test.ts +74 -0
- package/src/styles/theme.css +798 -0
- package/src/test/i18n.tsx +22 -0
- package/src/test/setup.ts +104 -0
- package/src/viewport.ts +69 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { extendTailwindMerge } from 'tailwind-merge';
|
|
3
|
+
import { useId, useRef, Fragment } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/lib/utils.ts
|
|
7
|
+
var mergeTheme = {
|
|
8
|
+
text: ["tiny", "ui", "doc", "doc-title", "doc-heading", "quote"],
|
|
9
|
+
spacing: ["chip", "control", "nav", "sidebar", "panel"],
|
|
10
|
+
tracking: ["label"],
|
|
11
|
+
shadow: ["card", "dialog"],
|
|
12
|
+
container: ["reading", "medium", "content"],
|
|
13
|
+
font: ["doc", "heading"],
|
|
14
|
+
ease: ["standard"],
|
|
15
|
+
animate: ["skel", "pop"]
|
|
16
|
+
};
|
|
17
|
+
var twMerge = extendTailwindMerge({
|
|
18
|
+
extend: { theme: mergeTheme }
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// src/lib/utils.ts
|
|
22
|
+
function cn(...inputs) {
|
|
23
|
+
return twMerge(clsx(inputs));
|
|
24
|
+
}
|
|
25
|
+
var TRIGGER_CLASSES = "relative inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap rounded-none border-0 bg-transparent px-0.5 pt-1 pb-3 text-xs font-semibold uppercase tracking-[0.1em] text-muted-foreground transition-colors hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 after:absolute after:inset-x-0 after:-bottom-[2px] after:h-0.5 after:bg-foreground after:opacity-0 after:transition-opacity";
|
|
26
|
+
function triggerClassName(active) {
|
|
27
|
+
return cn(TRIGGER_CLASSES, active && "text-foreground after:opacity-100");
|
|
28
|
+
}
|
|
29
|
+
function SectionTabs(props) {
|
|
30
|
+
const {
|
|
31
|
+
value,
|
|
32
|
+
items,
|
|
33
|
+
onChange,
|
|
34
|
+
className,
|
|
35
|
+
panelClassName,
|
|
36
|
+
listClassName,
|
|
37
|
+
controls,
|
|
38
|
+
ariaLabel
|
|
39
|
+
} = props;
|
|
40
|
+
const baseId = useId();
|
|
41
|
+
const listRef = useRef(null);
|
|
42
|
+
const activeIndex = items.findIndex((item) => item.value === value);
|
|
43
|
+
const activeItem = activeIndex >= 0 ? items[activeIndex] : void 0;
|
|
44
|
+
function activate(next) {
|
|
45
|
+
if (next !== value) onChange?.(next);
|
|
46
|
+
}
|
|
47
|
+
function focusTriggerAt(index) {
|
|
48
|
+
const trigger = listRef.current?.querySelectorAll('[role="tab"]')[index];
|
|
49
|
+
trigger?.focus();
|
|
50
|
+
}
|
|
51
|
+
function handleKeyDown(event) {
|
|
52
|
+
const from = activeIndex < 0 ? 0 : activeIndex;
|
|
53
|
+
const count = items.length;
|
|
54
|
+
let nextIndex;
|
|
55
|
+
switch (event.key) {
|
|
56
|
+
case "ArrowRight":
|
|
57
|
+
nextIndex = (from + 1) % count;
|
|
58
|
+
break;
|
|
59
|
+
case "ArrowLeft":
|
|
60
|
+
nextIndex = (from - 1 + count) % count;
|
|
61
|
+
break;
|
|
62
|
+
case "Home":
|
|
63
|
+
nextIndex = 0;
|
|
64
|
+
break;
|
|
65
|
+
case "End":
|
|
66
|
+
nextIndex = count - 1;
|
|
67
|
+
break;
|
|
68
|
+
default:
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
const next = items[nextIndex];
|
|
73
|
+
if (next === void 0) return;
|
|
74
|
+
activate(next.value);
|
|
75
|
+
focusTriggerAt(nextIndex);
|
|
76
|
+
}
|
|
77
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col gap-2", className), children: [
|
|
78
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6", children: [
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
"div",
|
|
81
|
+
{
|
|
82
|
+
ref: listRef,
|
|
83
|
+
role: "tablist",
|
|
84
|
+
"aria-label": ariaLabel,
|
|
85
|
+
className: cn(
|
|
86
|
+
// The 2px strong edge is an inset shadow over the bottom
|
|
87
|
+
// padding zone: the active underline (positioned 2px
|
|
88
|
+
// below the trigger) lands inside the padding box —
|
|
89
|
+
// a border would be outside it and get clipped by the
|
|
90
|
+
// scroll list's overflow-y-hidden. The color reads the
|
|
91
|
+
// runtime palette variable directly (what border-border
|
|
92
|
+
// compiles to), not the @theme mirror — the mirror
|
|
93
|
+
// lives in a cascade layer and is not reliable here.
|
|
94
|
+
"flex min-w-0 flex-1 items-center gap-6 overflow-x-auto overflow-y-hidden no-scrollbar pb-0.5 shadow-[inset_0_-2px_0_0_var(--border)]",
|
|
95
|
+
listClassName
|
|
96
|
+
),
|
|
97
|
+
children: items.map((item, index) => {
|
|
98
|
+
const active = item.value === value;
|
|
99
|
+
const triggerProps = {
|
|
100
|
+
id: `${baseId}-tab-${index}`,
|
|
101
|
+
role: "tab",
|
|
102
|
+
tabIndex: active ? 0 : -1,
|
|
103
|
+
"aria-selected": active,
|
|
104
|
+
"aria-controls": item.panel !== void 0 ? `${baseId}-panel-${index}` : void 0,
|
|
105
|
+
"data-testid": item.testId,
|
|
106
|
+
onKeyDown: handleKeyDown
|
|
107
|
+
};
|
|
108
|
+
if (item.render !== void 0) {
|
|
109
|
+
return /* @__PURE__ */ jsx(Fragment, { children: item.render(active, triggerClassName(active), triggerProps) }, item.value);
|
|
110
|
+
}
|
|
111
|
+
return /* @__PURE__ */ jsx(
|
|
112
|
+
"button",
|
|
113
|
+
{
|
|
114
|
+
type: "button",
|
|
115
|
+
...triggerProps,
|
|
116
|
+
onClick: () => activate(item.value),
|
|
117
|
+
className: triggerClassName(active),
|
|
118
|
+
children: item.label
|
|
119
|
+
},
|
|
120
|
+
item.value
|
|
121
|
+
);
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
controls
|
|
126
|
+
] }),
|
|
127
|
+
activeItem?.panel !== void 0 ? /* @__PURE__ */ jsx(
|
|
128
|
+
"div",
|
|
129
|
+
{
|
|
130
|
+
role: "tabpanel",
|
|
131
|
+
id: `${baseId}-panel-${activeIndex}`,
|
|
132
|
+
"aria-labelledby": `${baseId}-tab-${activeIndex}`,
|
|
133
|
+
className: cn(
|
|
134
|
+
"flex-1 text-sm outline-none",
|
|
135
|
+
activeItem.panelClassName ?? panelClassName ?? "mt-4"
|
|
136
|
+
),
|
|
137
|
+
children: activeItem.panel
|
|
138
|
+
}
|
|
139
|
+
) : null
|
|
140
|
+
] });
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export { SectionTabs };
|
|
144
|
+
//# sourceMappingURL=section-tabs.js.map
|
|
145
|
+
//# sourceMappingURL=section-tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/components/section-tabs.tsx"],"names":[],"mappings":"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","file":"section-tabs.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\"\n\n// The app's `@theme inline` tokens (theme.css) generate utility names\n// tailwind-merge doesn't know, so it misclassifies them — e.g. `text-ui` is\n// parsed as a text color and dropped next to any `text-*` color. The default\n// class groups are theme-backed, so extending the theme (keys mirror the v4\n// token namespaces one-to-one) registers every custom utility with correct\n// conflict semantics. merge-config.test.ts pins this list against theme.css.\nexport const mergeTheme = {\n\ttext: [\"tiny\", \"ui\", \"doc\", \"doc-title\", \"doc-heading\", \"quote\"],\n\tspacing: [\"chip\", \"control\", \"nav\", \"sidebar\", \"panel\"],\n\ttracking: [\"label\"],\n\tshadow: [\"card\", \"dialog\"],\n\tcontainer: [\"reading\", \"medium\", \"content\"],\n\tfont: [\"doc\", \"heading\"],\n\tease: [\"standard\"],\n\tanimate: [\"skel\", \"pop\"],\n} as const\n\nexport const twMerge = extendTailwindMerge({\n\textend: { theme: mergeTheme },\n})\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"./merge-config\"\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import { cn } from \"@hoardodile/ui/lib/utils\"\nimport {\n\tFragment,\n\ttype KeyboardEvent,\n\ttype ReactNode,\n\tuseId,\n\tuseRef,\n} from \"react\"\n\nexport type SectionTabTriggerProps = {\n\treadonly id: string\n\treadonly role: \"tab\"\n\treadonly tabIndex: number\n\treadonly \"aria-selected\": boolean\n\treadonly \"aria-controls\": string | undefined\n\treadonly \"data-testid\": string | undefined\n\treadonly onKeyDown: (event: KeyboardEvent<HTMLElement>) => void\n}\n\nexport type SectionTabItem<T extends string> = {\n\treadonly value: T\n\treadonly label: ReactNode\n\treadonly testId?: string\n\t/** Replaces the trigger element (e.g. a router Link) — receives the\n\t active state, the trigger classes and the ARIA/keyboard props to\n\t spread onto the element. */\n\treadonly render?: (\n\t\tactive: boolean,\n\t\tclassName: string,\n\t\ttrigger: SectionTabTriggerProps,\n\t) => ReactNode\n\t/** Content panel; mounted only while the tab is active. */\n\treadonly panel?: ReactNode\n\t/** Panel wrapper classes, replacing the default `mt-4`. */\n\treadonly panelClassName?: string\n}\n\nexport type SectionTabsProps<T extends string> = {\n\treadonly value: T\n\treadonly items: readonly SectionTabItem<T>[]\n\treadonly onChange?: (value: T) => void\n\treadonly className?: string\n\treadonly panelClassName?: string\n\t/** Overrides for the tab bar itself (e.g. an indented side-panel bar). */\n\treadonly listClassName?: string\n\t/** Right-hand controls sharing the tab row (e.g. a sort toggle). */\n\treadonly controls?: ReactNode\n\treadonly ariaLabel?: string\n}\n\nconst TRIGGER_CLASSES =\n\t\"relative inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap rounded-none border-0 bg-transparent px-0.5 pt-1 pb-3 text-xs font-semibold uppercase tracking-[0.1em] text-muted-foreground transition-colors hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 after:absolute after:inset-x-0 after:-bottom-[2px] after:h-0.5 after:bg-foreground after:opacity-0 after:transition-opacity\"\n\nfunction triggerClassName(active: boolean): string {\n\treturn cn(TRIGGER_CLASSES, active && \"text-foreground after:opacity-100\")\n}\n\n/**\n * Section-mode tab bar: uppercase 12px labels, a 2px underline on the\n * active tab over a 2px strong bottom edge, and a hidden horizontal\n * scrollbar on overflow. Standalone replacement for the shadcn tabs'\n * `section` variant — the group-data variant chains it leaned on were\n * too fragile to extend.\n */\nexport function SectionTabs<T extends string>(props: SectionTabsProps<T>) {\n\tconst {\n\t\tvalue,\n\t\titems,\n\t\tonChange,\n\t\tclassName,\n\t\tpanelClassName,\n\t\tlistClassName,\n\t\tcontrols,\n\t\tariaLabel,\n\t} = props\n\tconst baseId = useId()\n\tconst listRef = useRef<HTMLDivElement>(null)\n\n\tconst activeIndex = items.findIndex((item) => item.value === value)\n\tconst activeItem = activeIndex >= 0 ? items[activeIndex] : undefined\n\n\tfunction activate(next: T): void {\n\t\tif (next !== value) onChange?.(next)\n\t}\n\n\tfunction focusTriggerAt(index: number): void {\n\t\tconst trigger =\n\t\t\tlistRef.current?.querySelectorAll<HTMLElement>('[role=\"tab\"]')[index]\n\t\ttrigger?.focus()\n\t}\n\n\tfunction handleKeyDown(event: KeyboardEvent<HTMLElement>): void {\n\t\tconst from = activeIndex < 0 ? 0 : activeIndex\n\t\tconst count = items.length\n\t\tlet nextIndex: number\n\t\tswitch (event.key) {\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextIndex = (from + 1) % count\n\t\t\t\tbreak\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextIndex = (from - 1 + count) % count\n\t\t\t\tbreak\n\t\t\tcase \"Home\":\n\t\t\t\tnextIndex = 0\n\t\t\t\tbreak\n\t\t\tcase \"End\":\n\t\t\t\tnextIndex = count - 1\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\treturn\n\t\t}\n\t\tevent.preventDefault()\n\t\tconst next = items[nextIndex]\n\t\tif (next === undefined) return\n\t\tactivate(next.value)\n\t\tfocusTriggerAt(nextIndex)\n\t}\n\n\treturn (\n\t\t<div className={cn(\"flex min-w-0 flex-col gap-2\", className)}>\n\t\t\t<div className=\"flex items-center gap-6\">\n\t\t\t\t<div\n\t\t\t\t\tref={listRef}\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// The 2px strong edge is an inset shadow over the bottom\n\t\t\t\t\t\t// padding zone: the active underline (positioned 2px\n\t\t\t\t\t\t// below the trigger) lands inside the padding box —\n\t\t\t\t\t\t// a border would be outside it and get clipped by the\n\t\t\t\t\t\t// scroll list's overflow-y-hidden. The color reads the\n\t\t\t\t\t\t// runtime palette variable directly (what border-border\n\t\t\t\t\t\t// compiles to), not the @theme mirror — the mirror\n\t\t\t\t\t\t// lives in a cascade layer and is not reliable here.\n\t\t\t\t\t\t\"flex min-w-0 flex-1 items-center gap-6 overflow-x-auto overflow-y-hidden no-scrollbar pb-0.5 shadow-[inset_0_-2px_0_0_var(--border)]\",\n\t\t\t\t\t\tlistClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\tconst active = item.value === value\n\t\t\t\t\t\tconst triggerProps: SectionTabTriggerProps = {\n\t\t\t\t\t\t\tid: `${baseId}-tab-${index}`,\n\t\t\t\t\t\t\trole: \"tab\",\n\t\t\t\t\t\t\ttabIndex: active ? 0 : -1,\n\t\t\t\t\t\t\t\"aria-selected\": active,\n\t\t\t\t\t\t\t\"aria-controls\":\n\t\t\t\t\t\t\t\titem.panel !== undefined\n\t\t\t\t\t\t\t\t\t? `${baseId}-panel-${index}`\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\"data-testid\": item.testId,\n\t\t\t\t\t\t\tonKeyDown: handleKeyDown,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (item.render !== undefined) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Fragment key={item.value}>\n\t\t\t\t\t\t\t\t\t{item.render(active, triggerClassName(active), triggerProps)}\n\t\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\tonClick={() => activate(item.value)}\n\t\t\t\t\t\t\t\tclassName={triggerClassName(active)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t\t{controls}\n\t\t\t</div>\n\t\t\t{activeItem?.panel !== undefined ? (\n\t\t\t\t<div\n\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\tid={`${baseId}-panel-${activeIndex}`}\n\t\t\t\t\taria-labelledby={`${baseId}-tab-${activeIndex}`}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex-1 text-sm outline-none\",\n\t\t\t\t\t\tactiveItem.panelClassName ?? panelClassName ?? \"mt-4\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{activeItem.panel}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Separator as Separator$1 } from '@base-ui/react/separator';
|
|
3
|
+
|
|
4
|
+
type SeparatorSize = "hairline" | "seam";
|
|
5
|
+
/**
|
|
6
|
+
* Horizontal/vertical divider: hairlines are 1px and quiet; the 2px
|
|
7
|
+
* `seam` tier marks only structural seams (tab bars, panel sections,
|
|
8
|
+
* pinned action bars).
|
|
9
|
+
*/
|
|
10
|
+
declare function Separator({ className, orientation, size, ...props }: Separator$1.Props & {
|
|
11
|
+
readonly size?: SeparatorSize;
|
|
12
|
+
}): React.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { Separator, type SeparatorSize };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Separator as Separator$1 } from '@base-ui/react/separator';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { extendTailwindMerge } from 'tailwind-merge';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/components/separator.tsx
|
|
7
|
+
var mergeTheme = {
|
|
8
|
+
text: ["tiny", "ui", "doc", "doc-title", "doc-heading", "quote"],
|
|
9
|
+
spacing: ["chip", "control", "nav", "sidebar", "panel"],
|
|
10
|
+
tracking: ["label"],
|
|
11
|
+
shadow: ["card", "dialog"],
|
|
12
|
+
container: ["reading", "medium", "content"],
|
|
13
|
+
font: ["doc", "heading"],
|
|
14
|
+
ease: ["standard"],
|
|
15
|
+
animate: ["skel", "pop"]
|
|
16
|
+
};
|
|
17
|
+
var twMerge = extendTailwindMerge({
|
|
18
|
+
extend: { theme: mergeTheme }
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// src/lib/utils.ts
|
|
22
|
+
function cn(...inputs) {
|
|
23
|
+
return twMerge(clsx(inputs));
|
|
24
|
+
}
|
|
25
|
+
function Separator({
|
|
26
|
+
className,
|
|
27
|
+
orientation = "horizontal",
|
|
28
|
+
size = "hairline",
|
|
29
|
+
...props
|
|
30
|
+
}) {
|
|
31
|
+
const thickness = size === "seam" ? "data-horizontal:h-0.5 data-vertical:w-0.5" : "data-horizontal:h-px data-vertical:w-px";
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
Separator$1,
|
|
34
|
+
{
|
|
35
|
+
"data-slot": "separator",
|
|
36
|
+
orientation,
|
|
37
|
+
className: cn(
|
|
38
|
+
"shrink-0 bg-border data-horizontal:w-full data-vertical:self-stretch",
|
|
39
|
+
thickness,
|
|
40
|
+
className
|
|
41
|
+
),
|
|
42
|
+
...props
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { Separator };
|
|
48
|
+
//# sourceMappingURL=separator.js.map
|
|
49
|
+
//# sourceMappingURL=separator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/components/separator.tsx"],"names":["SeparatorPrimitive"],"mappings":";;;;;;AAQO,IAAM,UAAA,GAAa;AAAA,EACzB,MAAM,CAAC,MAAA,EAAQ,MAAM,KAAA,EAAO,WAAA,EAAa,eAAe,OAAO,CAAA;AAAA,EAC/D,SAAS,CAAC,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,WAAW,OAAO,CAAA;AAAA,EACtD,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,EAClB,MAAA,EAAQ,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACzB,SAAA,EAAW,CAAC,SAAA,EAAW,QAAA,EAAU,SAAS,CAAA;AAAA,EAC1C,IAAA,EAAM,CAAC,KAAA,EAAO,SAAS,CAAA;AAAA,EACvB,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,OAAA,EAAS,CAAC,MAAA,EAAQ,KAAK;AACxB,CAAA;AAEO,IAAM,UAAU,mBAAA,CAAoB;AAAA,EAC1C,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA;AAClB,CAAC,CAAA;;;AClBM,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC5B;ACMA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,IAAA,GAAO,UAAA;AAAA,EACP,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,SAAA,GACJ,IAAA,KAAS,MAAA,GACL,2CAAA,GACA,yCAAA;AACN,EAAA,uBACE,GAAA;AAAA,IAACA,WAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,sEAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"separator.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\"\n\n// The app's `@theme inline` tokens (theme.css) generate utility names\n// tailwind-merge doesn't know, so it misclassifies them — e.g. `text-ui` is\n// parsed as a text color and dropped next to any `text-*` color. The default\n// class groups are theme-backed, so extending the theme (keys mirror the v4\n// token namespaces one-to-one) registers every custom utility with correct\n// conflict semantics. merge-config.test.ts pins this list against theme.css.\nexport const mergeTheme = {\n\ttext: [\"tiny\", \"ui\", \"doc\", \"doc-title\", \"doc-heading\", \"quote\"],\n\tspacing: [\"chip\", \"control\", \"nav\", \"sidebar\", \"panel\"],\n\ttracking: [\"label\"],\n\tshadow: [\"card\", \"dialog\"],\n\tcontainer: [\"reading\", \"medium\", \"content\"],\n\tfont: [\"doc\", \"heading\"],\n\tease: [\"standard\"],\n\tanimate: [\"skel\", \"pop\"],\n} as const\n\nexport const twMerge = extendTailwindMerge({\n\textend: { theme: mergeTheme },\n})\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"./merge-config\"\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\n\nexport type SeparatorSize = \"hairline\" | \"seam\"\n\n/**\n * Horizontal/vertical divider: hairlines are 1px and quiet; the 2px\n * `seam` tier marks only structural seams (tab bars, panel sections,\n * pinned action bars).\n */\nfunction Separator({\n className,\n orientation = \"horizontal\",\n size = \"hairline\",\n ...props\n}: SeparatorPrimitive.Props & {\n readonly size?: SeparatorSize\n}) {\n const thickness =\n size === \"seam\"\n ? \"data-horizontal:h-0.5 data-vertical:w-0.5\"\n : \"data-horizontal:h-px data-vertical:w-px\"\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:w-full data-vertical:self-stretch\",\n thickness,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Dialog } from '@base-ui/react/dialog';
|
|
3
|
+
|
|
4
|
+
declare function Sheet({ open, defaultOpen, onOpenChange, ...props }: Omit<Dialog.Root.Props, "onOpenChange"> & {
|
|
5
|
+
/**
|
|
6
|
+
* `eventDetails` is absent for closes triggered by the mobile back
|
|
7
|
+
* gesture (a synthetic close with no underlying Base UI event).
|
|
8
|
+
*/
|
|
9
|
+
onOpenChange?: (open: boolean, eventDetails?: Dialog.Root.ChangeEventDetails) => void;
|
|
10
|
+
}): React.JSX.Element;
|
|
11
|
+
declare function SheetTrigger({ ...props }: Dialog.Trigger.Props): React.JSX.Element;
|
|
12
|
+
declare function SheetClose({ ...props }: Dialog.Close.Props): React.JSX.Element;
|
|
13
|
+
declare function SheetContent({ className, children, side, showCloseButton, ...props }: Dialog.Popup.Props & {
|
|
14
|
+
side?: "top" | "right" | "bottom" | "left";
|
|
15
|
+
showCloseButton?: boolean;
|
|
16
|
+
}): React.JSX.Element;
|
|
17
|
+
declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
18
|
+
declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
19
|
+
declare function SheetTitle({ className, ...props }: Dialog.Title.Props): React.JSX.Element;
|
|
20
|
+
declare function SheetDescription({ className, ...props }: Dialog.Description.Props): React.JSX.Element;
|
|
21
|
+
|
|
22
|
+
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };
|