@devalok/shilp-sutra 0.39.0 → 0.40.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/AGENTS.md +151 -0
- package/MIGRATION.md +137 -0
- package/README.md +3 -0
- package/dist/_chunks/badge-group.js +75 -74
- package/dist/_chunks/badge-group.js.map +1 -1
- package/dist/_chunks/chart-container.js +50 -0
- package/dist/_chunks/chart-container.js.map +1 -0
- package/dist/_chunks/chat.js +231 -223
- package/dist/_chunks/chat.js.map +1 -1
- package/dist/_chunks/colors.js +30 -0
- package/dist/_chunks/colors.js.map +1 -0
- package/dist/_chunks/emoji-data.js +45 -0
- package/dist/_chunks/emoji-data.js.map +1 -0
- package/dist/_chunks/grid-lines.js +72 -0
- package/dist/_chunks/grid-lines.js.map +1 -0
- package/dist/_chunks/mention-suggestion.js +31 -259
- package/dist/_chunks/mention-suggestion.js.map +1 -1
- package/dist/_chunks/normalize-icon.js +18 -0
- package/dist/_chunks/normalize-icon.js.map +1 -0
- package/dist/_chunks/oauth-button.js +227 -0
- package/dist/_chunks/oauth-button.js.map +1 -0
- package/dist/_chunks/primitives.js +107 -107
- package/dist/_chunks/primitives.js.map +1 -1
- package/dist/_chunks/{text.js → success.js} +24 -61
- package/dist/_chunks/success.js.map +1 -0
- package/dist/_chunks/tiptap.js +1952 -1949
- package/dist/_chunks/tiptap.js.map +1 -1
- package/dist/_chunks/tooltip.js +58 -0
- package/dist/_chunks/tooltip.js.map +1 -0
- package/dist/_chunks/tree-view.js +101 -96
- package/dist/_chunks/tree-view.js.map +1 -1
- package/dist/ai/ai-command-provider.d.ts +3 -2
- package/dist/ai/ai-command-provider.d.ts.map +1 -1
- package/dist/ai/ai-command-provider.js.map +1 -1
- package/dist/ai/block-renderer.js +11 -9
- package/dist/ai/block-renderer.js.map +1 -1
- package/dist/ai/blocks/error.js +31 -0
- package/dist/ai/blocks/error.js.map +1 -0
- package/dist/ai/blocks/index.d.ts +0 -2
- package/dist/ai/blocks/index.d.ts.map +1 -1
- package/dist/ai/blocks/index.js +2 -2
- package/dist/ai/blocks/text.js +19 -0
- package/dist/ai/blocks/text.js.map +1 -0
- package/dist/ai/command-bar.d.ts.map +1 -1
- package/dist/ai/command-bar.js +192 -187
- package/dist/ai/command-bar.js.map +1 -1
- package/dist/ai/conversation.d.ts +2 -1
- package/dist/ai/conversation.d.ts.map +1 -1
- package/dist/ai/conversation.js +88 -83
- package/dist/ai/conversation.js.map +1 -1
- package/dist/ai/index.d.ts +0 -4
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +45 -46
- package/dist/ai/index.js.map +1 -1
- package/dist/composed/activity-feed.d.ts +2 -1
- package/dist/composed/activity-feed.d.ts.map +1 -1
- package/dist/composed/activity-feed.js.map +1 -1
- package/dist/composed/bulk-action-bar.d.ts +2 -2
- package/dist/composed/bulk-action-bar.d.ts.map +1 -1
- package/dist/composed/bulk-action-bar.js +11 -11
- package/dist/composed/bulk-action-bar.js.map +1 -1
- package/dist/composed/command-palette.d.ts +2 -1
- package/dist/composed/command-palette.d.ts.map +1 -1
- package/dist/composed/command-palette.js +103 -98
- package/dist/composed/command-palette.js.map +1 -1
- package/dist/composed/date-picker/index.js +747 -3
- package/dist/composed/date-picker/index.js.map +1 -0
- package/dist/composed/empty-state.d.ts +3 -3
- package/dist/composed/empty-state.d.ts.map +1 -1
- package/dist/composed/empty-state.js +40 -31
- package/dist/composed/empty-state.js.map +1 -1
- package/dist/composed/extensions/emoji-node.js +81 -0
- package/dist/composed/extensions/emoji-node.js.map +1 -0
- package/dist/composed/extensions/emoji-suggestion.js +117 -0
- package/dist/composed/extensions/emoji-suggestion.js.map +1 -0
- package/dist/composed/file-preview.js +498 -2
- package/dist/{_chunks → composed}/file-preview.js.map +1 -1
- package/dist/composed/index.d.ts +0 -15
- package/dist/composed/index.d.ts.map +1 -1
- package/dist/composed/index.js +16 -24
- package/dist/composed/rich-chat-input.js +2073 -2
- package/dist/{_chunks → composed}/rich-chat-input.js.map +1 -1
- package/dist/composed/rich-text-editor.js +64 -61
- package/dist/composed/rich-text-editor.js.map +1 -1
- package/dist/composed/status-badge.d.ts +3 -2
- package/dist/composed/status-badge.d.ts.map +1 -1
- package/dist/composed/status-badge.js +58 -53
- package/dist/composed/status-badge.js.map +1 -1
- package/dist/shell/app-command-palette.d.ts +2 -1
- package/dist/shell/app-command-palette.d.ts.map +1 -1
- package/dist/shell/app-command-palette.js.map +1 -1
- package/dist/shell/bottom-navbar.d.ts +3 -1
- package/dist/shell/bottom-navbar.d.ts.map +1 -1
- package/dist/shell/bottom-navbar.js +90 -82
- package/dist/shell/bottom-navbar.js.map +1 -1
- package/dist/shell/command-registry.d.ts +2 -1
- package/dist/shell/command-registry.d.ts.map +1 -1
- package/dist/shell/command-registry.js.map +1 -1
- package/dist/shell/sidebar.d.ts +7 -4
- package/dist/shell/sidebar.d.ts.map +1 -1
- package/dist/shell/sidebar.js +143 -129
- package/dist/shell/sidebar.js.map +1 -1
- package/dist/shell/top-bar.d.ts +4 -3
- package/dist/shell/top-bar.d.ts.map +1 -1
- package/dist/shell/top-bar.js +114 -106
- package/dist/shell/top-bar.js.map +1 -1
- package/dist/ui/badge.d.ts +3 -2
- package/dist/ui/badge.d.ts.map +1 -1
- package/dist/ui/button.d.ts +3 -2
- package/dist/ui/button.d.ts.map +1 -1
- package/dist/ui/button.js +54 -53
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/charts/area-chart.js +177 -0
- package/dist/ui/charts/area-chart.js.map +1 -0
- package/dist/ui/charts/bar-chart.js +127 -0
- package/dist/ui/charts/bar-chart.js.map +1 -0
- package/dist/ui/charts/chart-container.js +3 -0
- package/dist/ui/charts/gauge-chart.js +72 -0
- package/dist/ui/charts/gauge-chart.js.map +1 -0
- package/dist/ui/charts/index.js +10 -1035
- package/dist/ui/charts/line-chart.js +135 -0
- package/dist/ui/charts/line-chart.js.map +1 -0
- package/dist/ui/charts/pie-chart.js +111 -0
- package/dist/ui/charts/pie-chart.js.map +1 -0
- package/dist/ui/charts/radar-chart.js +170 -0
- package/dist/ui/charts/radar-chart.js.map +1 -0
- package/dist/ui/charts/sparkline.js +119 -0
- package/dist/ui/charts/sparkline.js.map +1 -0
- package/dist/ui/chat/message.d.ts +3 -3
- package/dist/ui/chat/message.d.ts.map +1 -1
- package/dist/ui/chat/system-message.d.ts +2 -1
- package/dist/ui/chat/system-message.d.ts.map +1 -1
- package/dist/ui/combobox.d.ts +2 -1
- package/dist/ui/combobox.d.ts.map +1 -1
- package/dist/ui/combobox.js +97 -92
- package/dist/ui/combobox.js.map +1 -1
- package/dist/ui/container.d.ts +6 -1
- package/dist/ui/container.d.ts.map +1 -1
- package/dist/ui/container.js +2 -1
- package/dist/ui/container.js.map +1 -1
- package/dist/ui/icon-button.d.ts +9 -2
- package/dist/ui/icon-button.d.ts.map +1 -1
- package/dist/ui/icon-button.js +14 -13
- package/dist/ui/icon-button.js.map +1 -1
- package/dist/ui/index.d.ts +1 -3
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +31 -33
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/lib/icon-input.d.ts +42 -0
- package/dist/ui/lib/icon-input.d.ts.map +1 -0
- package/dist/ui/lib/normalize-icon.d.ts +39 -0
- package/dist/ui/lib/normalize-icon.d.ts.map +1 -0
- package/dist/ui/oauth-button/index.d.ts +3 -0
- package/dist/ui/oauth-button/index.d.ts.map +1 -0
- package/dist/ui/oauth-button/index.js +3 -0
- package/dist/ui/oauth-button/oauth-button.d.ts +208 -0
- package/dist/ui/oauth-button/oauth-button.d.ts.map +1 -0
- package/dist/ui/progress.js +1 -1
- package/dist/ui/segmented-control.d.ts +3 -4
- package/dist/ui/segmented-control.d.ts.map +1 -1
- package/dist/ui/segmented-control.js +53 -45
- package/dist/ui/segmented-control.js.map +1 -1
- package/dist/ui/stack.d.ts +6 -1
- package/dist/ui/stack.d.ts.map +1 -1
- package/dist/ui/stack.js +2 -1
- package/dist/ui/stack.js.map +1 -1
- package/dist/ui/stat-card.d.ts +2 -3
- package/dist/ui/stat-card.d.ts.map +1 -1
- package/dist/ui/stat-card.js +117 -115
- package/dist/ui/stat-card.js.map +1 -1
- package/dist/ui/stepper.d.ts +2 -1
- package/dist/ui/stepper.d.ts.map +1 -1
- package/dist/ui/stepper.js +74 -69
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/text.d.ts +7 -2
- package/dist/ui/text.d.ts.map +1 -1
- package/dist/ui/text.js +2 -1
- package/dist/ui/text.js.map +1 -1
- package/dist/ui/toaster.d.ts +11 -2
- package/dist/ui/toaster.d.ts.map +1 -1
- package/dist/ui/toaster.js.map +1 -1
- package/dist/ui/tooltip.js +12 -12
- package/dist/ui/tree-view/tree-item.d.ts +3 -2
- package/dist/ui/tree-view/tree-item.d.ts.map +1 -1
- package/dist/ui/tree-view/use-tree.d.ts +2 -1
- package/dist/ui/tree-view/use-tree.d.ts.map +1 -1
- package/docs/components/ui/oauth-button.md +86 -0
- package/docs/recipes/customize-brand.md +15 -0
- package/docs/recipes/index.md +5 -1
- package/docs/recipes/install-astro.md +15 -0
- package/docs/recipes/install-next-app-router.md +21 -5
- package/docs/recipes/install-next-pages.md +2 -0
- package/docs/recipes/install-remix.md +15 -0
- package/docs/recipes/install-tanstack-start.md +15 -0
- package/docs/recipes/install-vite.md +15 -0
- package/docs/recipes/troubleshoot.md +22 -0
- package/llms-full.txt +87 -1
- package/llms-quick.txt +247 -0
- package/llms.txt +107 -2
- package/package.json +79 -2
- package/scripts/welcome.mjs +219 -0
- package/skill/SKILL.md +22 -3
- package/skill/references/components-full.md +87 -1
- package/skill/references/components.md +107 -2
- package/skill/references/customize-brand.md +15 -0
- package/skill/references/setup-astro.md +15 -0
- package/skill/references/setup-next-app-router.md +21 -5
- package/skill/references/setup-next-pages.md +2 -0
- package/skill/references/setup-remix.md +15 -0
- package/skill/references/setup-tanstack-start.md +15 -0
- package/skill/references/setup-vite.md +15 -0
- package/skill/references/troubleshoot.md +22 -0
- package/dist/_chunks/date-picker.js +0 -748
- package/dist/_chunks/date-picker.js.map +0 -1
- package/dist/_chunks/file-preview.js +0 -499
- package/dist/_chunks/rich-chat-input.js +0 -2071
- package/dist/_chunks/text.js.map +0 -1
- package/dist/ui/charts/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bottom-navbar.js","names":[],"sources":["../../src/shell/bottom-navbar.tsx"],"sourcesContent":["'use client'\n\n/**\n * BottomNavbar -- Mobile bottom navigation bar.\n *\n * Props-driven: accepts currentPath, user, navItems instead of\n * reading from Remix hooks or Zustand stores.\n */\nimport { IconDots, IconX } from '@tabler/icons-react'\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\nimport * as React from 'react'\nimport { useCallback,useEffect, useRef, useState } from 'react'\n\nimport { Icon } from '../ui/icon'\nimport { springs } from '../ui/lib/motion'\nimport { cn } from '../ui/lib/utils'\nimport { useLink } from './link-context'\n\n// -----------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------\n\nexport interface BottomNavItem {\n title: string\n href: string\n icon: React.ReactNode\n /** When true, the route matches only when the path is exactly equal */\n exact?: boolean\n /** Notification badge count. 0 or undefined = hidden, 1–99 = shown, >99 = \"99+\" */\n badge?: number\n}\n\nexport interface BottomNavbarUser {\n name: string\n role?: string\n}\n\nexport interface BottomNavbarProps\n extends React.HTMLAttributes<HTMLElement> {\n /** Currently active pathname */\n currentPath?: string\n /** User information (used to determine admin status, presence) */\n user?: BottomNavbarUser | null\n /** Primary nav items shown directly in the bottom bar (max 4 recommended) */\n primaryItems?: BottomNavItem[]\n /** Additional items shown in the \"More\" overflow menu */\n moreItems?: BottomNavItem[]\n /** Additional className for the nav element */\n className?: string\n}\n\n// -----------------------------------------------------------------------\n// NavBadge (internal)\n// -----------------------------------------------------------------------\n\nfunction NavBadge({ count }: { count: number }) {\n if (!count || count <= 0) return null\n const display = count > 99 ? '99+' : String(count)\n const isMultiDigit = count >= 10\n return (\n <span\n aria-label={`${count} notifications`}\n className={cn(\n 'absolute -right-1 -top-0.5 flex h-4 min-w-4 items-center justify-center rounded-pill bg-error-9 text-[10px] font-semibold leading-none text-error-fg animate-in zoom-in-75',\n isMultiDigit ? 'px-0.5' : '',\n )}\n >\n {display}\n </span>\n )\n}\n\n// -----------------------------------------------------------------------\n// BottomNavLink (internal)\n// -----------------------------------------------------------------------\n\nfunction BottomNavLink({\n item,\n isActive,\n onClick,\n}: {\n item: BottomNavItem\n isActive: boolean\n onClick?: () => void\n}) {\n const Link = useLink()\n const prefersReducedMotion = useReducedMotion()\n return (\n <motion.div whileTap={prefersReducedMotion ? undefined : { y: -2 }} transition={prefersReducedMotion ? { duration: 0 } : springs.snappy} className=\"flex max-w-[70px] flex-1\">\n <Link\n href={item.href}\n onClick={onClick}\n aria-label={item.title}\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'flex h-16 w-full cursor-pointer flex-col items-center gap-ds-02 p-ds-02 pt-0 text-ds-sm transition-colors duration-fast-02 ease-productive-standard',\n isActive\n ? 'font-semibold text-accent-11'\n : 'text-surface-fg-subtle',\n )}\n >\n <div className=\"relative flex w-full flex-col items-center gap-ds-02\">\n {isActive && (\n <motion.div\n layoutId=\"bottom-nav-indicator\"\n className=\"absolute top-0 h-[3px] w-full rounded-b-control-inner bg-accent-9 p-0\"\n aria-hidden=\"true\"\n transition={prefersReducedMotion ? { duration: 0 } : springs.snappy}\n />\n )}\n <div className=\"relative p-ds-03\">\n <span className=\"[&>svg]:h-ico-md [&>svg]:w-ico-md\" aria-hidden=\"true\">{item.icon}</span>\n {item.badge != null && <NavBadge count={item.badge} />}\n </div>\n <span className=\"text-center\">{item.title}</span>\n </div>\n </Link>\n </motion.div>\n )\n}\n\n// -----------------------------------------------------------------------\n// BottomNavbar\n// -----------------------------------------------------------------------\n\nconst BottomNavbar = React.forwardRef<HTMLElement, BottomNavbarProps>(\n (\n {\n currentPath = '/',\n user: _user,\n primaryItems = [],\n moreItems = [],\n className,\n ...props\n },\n ref,\n ) => {\n const Link = useLink()\n const prefersReducedMotion = useReducedMotion()\n const [showMore, setShowMore] = useState(false)\n const overlayRef = useRef<HTMLDivElement>(null)\n\n const closeMore = useCallback(() => setShowMore(false), [])\n\n // Focus first focusable item when overlay opens\n useEffect(() => {\n if (showMore && overlayRef.current) {\n const firstFocusable = overlayRef.current.querySelector<HTMLElement>('a, button')\n firstFocusable?.focus()\n }\n }, [showMore])\n\n const isActive = (path: string, exact = false) => {\n if (exact || path === '/') {\n return currentPath === path\n }\n return currentPath.startsWith(path)\n }\n\n // Check if any \"more\" item is active\n const isMoreActive = moreItems.some((item) =>\n isActive(item.href, item.exact),\n )\n\n return (\n <>\n {/* More Menu Overlay */}\n <AnimatePresence>\n {showMore && (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events -- backdrop overlay, dismiss via mouse only; keyboard users close via Escape\n <div\n className=\"fixed inset-0 z-overlay md:hidden\"\n onClick={() => setShowMore(false)}\n >\n <div className=\"absolute inset-0 bg-overlay\" />\n { }\n <motion.div\n ref={overlayRef}\n role=\"dialog\"\n aria-label=\"More navigation\"\n initial={{ y: '100%' }}\n animate={{ y: 0 }}\n exit={{ y: '100%' }}\n transition={prefersReducedMotion ? { duration: 0 } : springs.smooth}\n className=\"absolute bottom-[72px] left-0 right-0 rounded-t-bubble border-t border-surface-border-strong bg-surface-overlay p-ds-05 pb-ds-03\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Escape') closeMore()\n }}\n >\n <div className=\"mb-ds-04 flex items-center justify-between\">\n <span className=\"text-ds-md font-semibold text-surface-fg\">\n More\n </span>\n <button\n onClick={() => setShowMore(false)}\n aria-label=\"Close more menu\"\n className=\"flex h-ds-sm w-ds-sm items-center justify-center rounded-pill hover:bg-surface-raised-hover\"\n >\n <Icon icon={IconX} size=\"sm\" className=\"text-surface-fg-muted\" />\n </button>\n </div>\n <div className=\"grid grid-cols-4 gap-ds-03\">\n {moreItems.map((item) => (\n <Link\n key={item.href}\n href={item.href}\n onClick={() => setShowMore(false)}\n className={cn(\n 'flex flex-col items-center gap-ds-02b rounded-overlay-lg p-ds-04 text-ds-sm transition-colors ease-productive-standard',\n isActive(item.href, item.exact)\n ? 'bg-surface-raised-hover text-accent-11'\n : 'text-surface-fg-subtle hover:bg-surface-raised-hover',\n )}\n >\n <span className=\"[&>svg]:h-ico-md [&>svg]:w-ico-md\">{item.icon}</span>\n <span className=\"text-center\">\n {item.title}\n </span>\n </Link>\n ))}\n </div>\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n\n {/* Bottom Navigation Bar */}\n <nav\n {...props}\n ref={ref}\n aria-label=\"Mobile navigation\"\n className={cn(\n 'fixed bottom-0 left-0 right-0 z-sticky flex w-full flex-row items-start justify-between border-t border-surface-border-strong bg-surface-raised px-ds-05 pb-safe pt-0 md:hidden',\n className,\n )}\n >\n {primaryItems.map((item) => (\n <BottomNavLink\n key={item.href}\n item={item}\n isActive={isActive(item.href, item.exact)}\n />\n ))}\n\n {/* More Button */}\n {moreItems.length > 0 && (\n <motion.button\n type=\"button\"\n onClick={() => setShowMore(!showMore)}\n aria-label=\"More navigation options\"\n aria-expanded={showMore}\n whileTap={prefersReducedMotion ? undefined : { y: -2 }}\n transition={prefersReducedMotion ? { duration: 0 } : springs.snappy}\n className={cn(\n 'flex h-16 max-w-[70px] flex-1 cursor-pointer flex-col items-center gap-ds-02 p-ds-02 pt-0 text-ds-sm',\n showMore || isMoreActive\n ? 'font-semibold text-accent-11'\n : 'text-surface-fg-subtle',\n )}\n >\n <div className=\"relative flex w-full flex-col items-center gap-ds-02\">\n {(showMore || isMoreActive) && (\n <motion.div\n layoutId=\"bottom-nav-indicator\"\n className=\"absolute top-0 h-[3px] w-full rounded-b-control-inner bg-accent-9 p-0\"\n aria-hidden=\"true\"\n transition={prefersReducedMotion ? { duration: 0 } : springs.snappy}\n />\n )}\n <div className=\"p-ds-03\">\n <Icon icon={IconDots} />\n </div>\n <span className=\"text-center\">More</span>\n </div>\n </motion.button>\n )}\n </nav>\n </>\n )\n },\n)\nBottomNavbar.displayName = 'BottomNavbar'\n\nexport { BottomNavbar }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bottom-navbar.js","names":[],"sources":["../../src/shell/bottom-navbar.tsx"],"sourcesContent":["'use client'\n\n/**\n * BottomNavbar -- Mobile bottom navigation bar.\n *\n * Props-driven: accepts currentPath, user, navItems instead of\n * reading from Remix hooks or Zustand stores.\n */\nimport { IconDots, IconX } from '@tabler/icons-react'\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion'\nimport * as React from 'react'\nimport { useCallback,useEffect, useRef, useState } from 'react'\n\nimport { Icon } from '../ui/icon'\nimport { IconProvider } from '../ui/icon-context'\nimport type { IconInput } from '../ui/lib/icon-input'\nimport { springs } from '../ui/lib/motion'\nimport { normalizeIcon } from '../ui/lib/normalize-icon'\nimport { cn } from '../ui/lib/utils'\nimport { useLink } from './link-context'\n\n// -----------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------\n\nexport interface BottomNavItem {\n title: string\n href: string\n /** Icon for this nav item. Accepts any `IconInput`. */\n icon: IconInput\n /** When true, the route matches only when the path is exactly equal */\n exact?: boolean\n /** Notification badge count. 0 or undefined = hidden, 1–99 = shown, >99 = \"99+\" */\n badge?: number\n}\n\nexport interface BottomNavbarUser {\n name: string\n role?: string\n}\n\nexport interface BottomNavbarProps\n extends React.HTMLAttributes<HTMLElement> {\n /** Currently active pathname */\n currentPath?: string\n /** User information (used to determine admin status, presence) */\n user?: BottomNavbarUser | null\n /** Primary nav items shown directly in the bottom bar (max 4 recommended) */\n primaryItems?: BottomNavItem[]\n /** Additional items shown in the \"More\" overflow menu */\n moreItems?: BottomNavItem[]\n /** Additional className for the nav element */\n className?: string\n}\n\n// -----------------------------------------------------------------------\n// NavBadge (internal)\n// -----------------------------------------------------------------------\n\nfunction NavBadge({ count }: { count: number }) {\n if (!count || count <= 0) return null\n const display = count > 99 ? '99+' : String(count)\n const isMultiDigit = count >= 10\n return (\n <span\n aria-label={`${count} notifications`}\n className={cn(\n 'absolute -right-1 -top-0.5 flex h-4 min-w-4 items-center justify-center rounded-pill bg-error-9 text-[10px] font-semibold leading-none text-error-fg animate-in zoom-in-75',\n isMultiDigit ? 'px-0.5' : '',\n )}\n >\n {display}\n </span>\n )\n}\n\n// -----------------------------------------------------------------------\n// BottomNavLink (internal)\n// -----------------------------------------------------------------------\n\nfunction BottomNavLink({\n item,\n isActive,\n onClick,\n}: {\n item: BottomNavItem\n isActive: boolean\n onClick?: () => void\n}) {\n const Link = useLink()\n const prefersReducedMotion = useReducedMotion()\n return (\n <motion.div whileTap={prefersReducedMotion ? undefined : { y: -2 }} transition={prefersReducedMotion ? { duration: 0 } : springs.snappy} className=\"flex max-w-[70px] flex-1\">\n <Link\n href={item.href}\n onClick={onClick}\n aria-label={item.title}\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'flex h-16 w-full cursor-pointer flex-col items-center gap-ds-02 p-ds-02 pt-0 text-ds-sm transition-colors duration-fast-02 ease-productive-standard',\n isActive\n ? 'font-semibold text-accent-11'\n : 'text-surface-fg-subtle',\n )}\n >\n <div className=\"relative flex w-full flex-col items-center gap-ds-02\">\n {isActive && (\n <motion.div\n layoutId=\"bottom-nav-indicator\"\n className=\"absolute top-0 h-[3px] w-full rounded-b-control-inner bg-accent-9 p-0\"\n aria-hidden=\"true\"\n transition={prefersReducedMotion ? { duration: 0 } : springs.snappy}\n />\n )}\n <div className=\"relative p-ds-03\">\n <span className=\"[&>svg]:h-ico-md [&>svg]:w-ico-md\" aria-hidden=\"true\"><IconProvider size=\"md\">{normalizeIcon(item.icon)}</IconProvider></span>\n {item.badge != null && <NavBadge count={item.badge} />}\n </div>\n <span className=\"text-center\">{item.title}</span>\n </div>\n </Link>\n </motion.div>\n )\n}\n\n// -----------------------------------------------------------------------\n// BottomNavbar\n// -----------------------------------------------------------------------\n\nconst BottomNavbar = React.forwardRef<HTMLElement, BottomNavbarProps>(\n (\n {\n currentPath = '/',\n user: _user,\n primaryItems = [],\n moreItems = [],\n className,\n ...props\n },\n ref,\n ) => {\n const Link = useLink()\n const prefersReducedMotion = useReducedMotion()\n const [showMore, setShowMore] = useState(false)\n const overlayRef = useRef<HTMLDivElement>(null)\n\n const closeMore = useCallback(() => setShowMore(false), [])\n\n // Focus first focusable item when overlay opens\n useEffect(() => {\n if (showMore && overlayRef.current) {\n const firstFocusable = overlayRef.current.querySelector<HTMLElement>('a, button')\n firstFocusable?.focus()\n }\n }, [showMore])\n\n const isActive = (path: string, exact = false) => {\n if (exact || path === '/') {\n return currentPath === path\n }\n return currentPath.startsWith(path)\n }\n\n // Check if any \"more\" item is active\n const isMoreActive = moreItems.some((item) =>\n isActive(item.href, item.exact),\n )\n\n return (\n <>\n {/* More Menu Overlay */}\n <AnimatePresence>\n {showMore && (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events -- backdrop overlay, dismiss via mouse only; keyboard users close via Escape\n <div\n className=\"fixed inset-0 z-overlay md:hidden\"\n onClick={() => setShowMore(false)}\n >\n <div className=\"absolute inset-0 bg-overlay\" />\n { }\n <motion.div\n ref={overlayRef}\n role=\"dialog\"\n aria-label=\"More navigation\"\n initial={{ y: '100%' }}\n animate={{ y: 0 }}\n exit={{ y: '100%' }}\n transition={prefersReducedMotion ? { duration: 0 } : springs.smooth}\n className=\"absolute bottom-[72px] left-0 right-0 rounded-t-bubble border-t border-surface-border-strong bg-surface-overlay p-ds-05 pb-ds-03\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Escape') closeMore()\n }}\n >\n <div className=\"mb-ds-04 flex items-center justify-between\">\n <span className=\"text-ds-md font-semibold text-surface-fg\">\n More\n </span>\n <button\n onClick={() => setShowMore(false)}\n aria-label=\"Close more menu\"\n className=\"flex h-ds-sm w-ds-sm items-center justify-center rounded-pill hover:bg-surface-raised-hover\"\n >\n <Icon icon={IconX} size=\"sm\" className=\"text-surface-fg-muted\" />\n </button>\n </div>\n <div className=\"grid grid-cols-4 gap-ds-03\">\n {moreItems.map((item) => (\n <Link\n key={item.href}\n href={item.href}\n onClick={() => setShowMore(false)}\n className={cn(\n 'flex flex-col items-center gap-ds-02b rounded-overlay-lg p-ds-04 text-ds-sm transition-colors ease-productive-standard',\n isActive(item.href, item.exact)\n ? 'bg-surface-raised-hover text-accent-11'\n : 'text-surface-fg-subtle hover:bg-surface-raised-hover',\n )}\n >\n <span className=\"[&>svg]:h-ico-md [&>svg]:w-ico-md\"><IconProvider size=\"md\">{normalizeIcon(item.icon)}</IconProvider></span>\n <span className=\"text-center\">\n {item.title}\n </span>\n </Link>\n ))}\n </div>\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n\n {/* Bottom Navigation Bar */}\n <nav\n {...props}\n ref={ref}\n aria-label=\"Mobile navigation\"\n className={cn(\n 'fixed bottom-0 left-0 right-0 z-sticky flex w-full flex-row items-start justify-between border-t border-surface-border-strong bg-surface-raised px-ds-05 pb-safe pt-0 md:hidden',\n className,\n )}\n >\n {primaryItems.map((item) => (\n <BottomNavLink\n key={item.href}\n item={item}\n isActive={isActive(item.href, item.exact)}\n />\n ))}\n\n {/* More Button */}\n {moreItems.length > 0 && (\n <motion.button\n type=\"button\"\n onClick={() => setShowMore(!showMore)}\n aria-label=\"More navigation options\"\n aria-expanded={showMore}\n whileTap={prefersReducedMotion ? undefined : { y: -2 }}\n transition={prefersReducedMotion ? { duration: 0 } : springs.snappy}\n className={cn(\n 'flex h-16 max-w-[70px] flex-1 cursor-pointer flex-col items-center gap-ds-02 p-ds-02 pt-0 text-ds-sm',\n showMore || isMoreActive\n ? 'font-semibold text-accent-11'\n : 'text-surface-fg-subtle',\n )}\n >\n <div className=\"relative flex w-full flex-col items-center gap-ds-02\">\n {(showMore || isMoreActive) && (\n <motion.div\n layoutId=\"bottom-nav-indicator\"\n className=\"absolute top-0 h-[3px] w-full rounded-b-control-inner bg-accent-9 p-0\"\n aria-hidden=\"true\"\n transition={prefersReducedMotion ? { duration: 0 } : springs.snappy}\n />\n )}\n <div className=\"p-ds-03\">\n <Icon icon={IconDots} />\n </div>\n <span className=\"text-center\">More</span>\n </div>\n </motion.button>\n )}\n </nav>\n </>\n )\n },\n)\nBottomNavbar.displayName = 'BottomNavbar'\n\nexport { BottomNavbar }\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-registry.d.ts","sourceRoot":"","sources":["../../src/shell/command-registry.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"command-registry.d.ts","sourceRoot":"","sources":["../../src/shell/command-registry.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAMrD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B;AAYD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,QAAQ,GACT,EAAE,4BAA4B,2CAM9B;yBATe,uBAAuB;;;AAiBvC,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,IAAI,CAE3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-registry.js","names":[],"sources":["../../src/shell/command-registry.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\n// -----------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------\n\nexport interface CommandPageItem {\n id: string\n label: string\n icon:
|
|
1
|
+
{"version":3,"file":"command-registry.js","names":[],"sources":["../../src/shell/command-registry.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport type { IconInput } from '../ui/lib/icon-input'\n\n// -----------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------\n\nexport interface CommandPageItem {\n id: string\n label: string\n icon: IconInput\n path: string\n keywords?: string[]\n}\n\nexport interface CommandRegistry {\n pages: CommandPageItem[]\n adminPages: CommandPageItem[]\n}\n\n// -----------------------------------------------------------------------\n// Context\n// -----------------------------------------------------------------------\n\nconst CommandRegistryContext = React.createContext<CommandRegistry | null>(null)\n\n// -----------------------------------------------------------------------\n// Provider\n// -----------------------------------------------------------------------\n\nexport interface CommandRegistryProviderProps {\n children: React.ReactNode\n registry: CommandRegistry\n}\n\nexport function CommandRegistryProvider({\n children,\n registry,\n}: CommandRegistryProviderProps) {\n return (\n <CommandRegistryContext.Provider value={registry}>\n {children}\n </CommandRegistryContext.Provider>\n )\n}\n\nCommandRegistryProvider.displayName = 'CommandRegistryProvider'\n\n// -----------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------\n\nexport function useCommandRegistry(): CommandRegistry | null {\n return React.useContext(CommandRegistryContext)\n}\n"],"mappings":";;;;AA2BA,IAAM,IAAyB,EAAM,cAAsC,KAAK;AAWhF,SAAgB,EAAwB,EACtC,aACA,eAC+B;AAC/B,QACE,kBAAC,EAAuB,UAAxB;EAAiC,OAAO;EACrC;EAC+B,CAAA;;AAItC,EAAwB,cAAc;AAMtC,SAAgB,IAA6C;AAC3D,QAAO,EAAM,WAAW,EAAuB"}
|
package/dist/shell/sidebar.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { IconInput } from '../ui/lib/icon-input';
|
|
2
3
|
/**
|
|
3
4
|
* AppSidebar -- Application-layer sidebar built on the Sidebar primitive.
|
|
4
5
|
*
|
|
@@ -13,13 +14,15 @@ import * as React from 'react';
|
|
|
13
14
|
export interface NavSubItem {
|
|
14
15
|
title: string;
|
|
15
16
|
href: string;
|
|
16
|
-
icon
|
|
17
|
+
/** Optional icon. Accepts any `IconInput`. */
|
|
18
|
+
icon?: IconInput;
|
|
17
19
|
exact?: boolean;
|
|
18
20
|
}
|
|
19
21
|
export interface NavItem {
|
|
20
22
|
title: string;
|
|
21
23
|
href: string;
|
|
22
|
-
|
|
24
|
+
/** Icon for this nav item. Accepts any `IconInput`. */
|
|
25
|
+
icon: IconInput;
|
|
23
26
|
/** When true, the route matches only when the path is exactly equal */
|
|
24
27
|
exact?: boolean;
|
|
25
28
|
/** Badge rendered on the right side of the nav item */
|
|
@@ -45,8 +48,8 @@ export interface SidebarUser {
|
|
|
45
48
|
export interface SidebarPromo {
|
|
46
49
|
/** Promo message text */
|
|
47
50
|
text: string;
|
|
48
|
-
/** Optional icon rendered before the text */
|
|
49
|
-
icon?:
|
|
51
|
+
/** Optional icon rendered before the text. Accepts any `IconInput`. */
|
|
52
|
+
icon?: IconInput;
|
|
50
53
|
/** Action button rendered in the promo banner */
|
|
51
54
|
action?: {
|
|
52
55
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/shell/sidebar.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/shell/sidebar.tsx"],"names":[],"mappings":"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"}
|
package/dist/shell/sidebar.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { IconProvider as e } from "../ui/icon-context.js";
|
|
3
|
+
import { cn as t } from "../ui/lib/utils.js";
|
|
4
|
+
import { Avatar as n, AvatarFallback as r, AvatarImage as i } from "../ui/avatar.js";
|
|
5
|
+
import { t as a } from "../_chunks/normalize-icon.js";
|
|
6
|
+
import { Collapsible as o, CollapsibleContent as s, CollapsibleTrigger as c } from "../ui/collapsible.js";
|
|
7
|
+
import { n as l } from "../_chunks/link-context.js";
|
|
8
|
+
import { Sidebar as u, SidebarContent as d, SidebarFooter as f, SidebarGroup as p, SidebarGroupAction as m, SidebarGroupContent as h, SidebarGroupLabel as g, SidebarHeader as _, SidebarMenu as v, SidebarMenuBadge as y, SidebarMenuButton as b, SidebarMenuItem as x, SidebarMenuSub as S, SidebarMenuSubButton as C, SidebarMenuSubItem as w, SidebarSeparator as T } from "../ui/sidebar.js";
|
|
7
9
|
import "./link-context.js";
|
|
8
|
-
import * as
|
|
9
|
-
import { Fragment as
|
|
10
|
+
import * as E from "react";
|
|
11
|
+
import { Fragment as D, jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
10
12
|
//#region src/shell/sidebar.tsx
|
|
11
|
-
function
|
|
12
|
-
return /* @__PURE__ */
|
|
13
|
+
function A({ className: e }) {
|
|
14
|
+
return /* @__PURE__ */ O("svg", {
|
|
13
15
|
xmlns: "http://www.w3.org/2000/svg",
|
|
14
16
|
width: "16",
|
|
15
17
|
height: "16",
|
|
@@ -20,11 +22,11 @@ function O({ className: e }) {
|
|
|
20
22
|
strokeLinecap: "round",
|
|
21
23
|
strokeLinejoin: "round",
|
|
22
24
|
className: e,
|
|
23
|
-
children: /* @__PURE__ */
|
|
25
|
+
children: /* @__PURE__ */ O("path", { d: "m9 18 6-6-6-6" })
|
|
24
26
|
});
|
|
25
27
|
}
|
|
26
|
-
function
|
|
27
|
-
return /* @__PURE__ */
|
|
28
|
+
function j({ className: e }) {
|
|
29
|
+
return /* @__PURE__ */ k("svg", {
|
|
28
30
|
xmlns: "http://www.w3.org/2000/svg",
|
|
29
31
|
width: "16",
|
|
30
32
|
height: "16",
|
|
@@ -35,212 +37,224 @@ function k({ className: e }) {
|
|
|
35
37
|
strokeLinecap: "round",
|
|
36
38
|
strokeLinejoin: "round",
|
|
37
39
|
className: e,
|
|
38
|
-
children: [/* @__PURE__ */
|
|
40
|
+
children: [/* @__PURE__ */ O("path", { d: "M18 6 6 18" }), /* @__PURE__ */ O("path", { d: "m6 6 12 12" })]
|
|
39
41
|
});
|
|
40
42
|
}
|
|
41
|
-
var
|
|
42
|
-
function
|
|
43
|
-
let
|
|
44
|
-
if (
|
|
45
|
-
let
|
|
46
|
-
return /* @__PURE__ */
|
|
47
|
-
defaultOpen:
|
|
43
|
+
var M = "relative gap-ds-04 rounded-surface px-ds-04 py-ds-03 transition-colors duration-fast-02", N = "bg-accent-2 text-accent-11 after:absolute after:right-0 after:top-0 after:h-full after:w-ds-01 after:rounded-l-pill after:bg-accent-9 after:content-['']", P = "text-surface-fg-subtle hover:bg-surface-raised-hover hover:text-surface-fg";
|
|
44
|
+
function F({ item: n, isActive: r, isPathActive: i }) {
|
|
45
|
+
let u = l(), d = n.badge == null ? null : typeof n.badge == "number" && n.badge > 99 ? "99+" : String(n.badge);
|
|
46
|
+
if (n.children && n.children.length > 0) {
|
|
47
|
+
let l = n.children.some((e) => i(e.href, e.exact));
|
|
48
|
+
return /* @__PURE__ */ O(o, {
|
|
49
|
+
defaultOpen: l || r || (n.defaultOpen ?? !1),
|
|
48
50
|
className: "group/collapsible",
|
|
49
|
-
children: /* @__PURE__ */
|
|
51
|
+
children: /* @__PURE__ */ k(x, { children: [/* @__PURE__ */ k("div", {
|
|
50
52
|
className: "relative",
|
|
51
53
|
children: [
|
|
52
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ O(b, {
|
|
53
55
|
asChild: !0,
|
|
54
|
-
isActive:
|
|
55
|
-
tooltip:
|
|
56
|
-
className:
|
|
57
|
-
children: /* @__PURE__ */
|
|
58
|
-
href:
|
|
59
|
-
"aria-label":
|
|
60
|
-
"aria-current":
|
|
61
|
-
children: [/* @__PURE__ */
|
|
56
|
+
isActive: r || l,
|
|
57
|
+
tooltip: n.title,
|
|
58
|
+
className: t(M, r || l ? N : P),
|
|
59
|
+
children: /* @__PURE__ */ k(u, {
|
|
60
|
+
href: n.href,
|
|
61
|
+
"aria-label": n.title,
|
|
62
|
+
"aria-current": r ? "page" : void 0,
|
|
63
|
+
children: [/* @__PURE__ */ O("span", {
|
|
62
64
|
className: "[&>svg]:h-ico-md [&>svg]:w-ico-md shrink-0",
|
|
63
65
|
"aria-hidden": "true",
|
|
64
|
-
children:
|
|
65
|
-
|
|
66
|
+
children: /* @__PURE__ */ O(e, {
|
|
67
|
+
size: "md",
|
|
68
|
+
children: a(n.icon)
|
|
69
|
+
})
|
|
70
|
+
}), /* @__PURE__ */ O("span", {
|
|
66
71
|
className: "text-ds-base",
|
|
67
|
-
children:
|
|
72
|
+
children: n.title
|
|
68
73
|
})]
|
|
69
74
|
})
|
|
70
75
|
}),
|
|
71
|
-
|
|
72
|
-
/* @__PURE__ */
|
|
76
|
+
d && /* @__PURE__ */ O(y, { children: d }),
|
|
77
|
+
/* @__PURE__ */ O(c, {
|
|
73
78
|
asChild: !0,
|
|
74
|
-
children: /* @__PURE__ */
|
|
79
|
+
children: /* @__PURE__ */ O("button", {
|
|
75
80
|
className: "absolute right-ds-02 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded-control text-surface-fg-subtle transition-colors hover:bg-surface-raised-hover hover:text-surface-fg group-data-[collapsible=icon]:hidden",
|
|
76
|
-
"aria-label": `Toggle ${
|
|
77
|
-
children: /* @__PURE__ */
|
|
81
|
+
"aria-label": `Toggle ${n.title}`,
|
|
82
|
+
children: /* @__PURE__ */ O(A, { className: "h-4 w-4 transition-transform duration-fast-02 ease-productive-standard group-data-[state=open]/collapsible:rotate-90" })
|
|
78
83
|
})
|
|
79
84
|
})
|
|
80
85
|
]
|
|
81
|
-
}), /* @__PURE__ */
|
|
82
|
-
let
|
|
83
|
-
return /* @__PURE__ */
|
|
86
|
+
}), /* @__PURE__ */ O(s, { children: /* @__PURE__ */ O(S, { children: n.children.map((t) => {
|
|
87
|
+
let n = i(t.href, t.exact);
|
|
88
|
+
return /* @__PURE__ */ O(w, { children: /* @__PURE__ */ O(C, {
|
|
84
89
|
asChild: !0,
|
|
85
|
-
isActive:
|
|
86
|
-
children: /* @__PURE__ */
|
|
87
|
-
href:
|
|
88
|
-
"aria-current":
|
|
89
|
-
children: [
|
|
90
|
+
isActive: n,
|
|
91
|
+
children: /* @__PURE__ */ k(u, {
|
|
92
|
+
href: t.href,
|
|
93
|
+
"aria-current": n ? "page" : void 0,
|
|
94
|
+
children: [t.icon && /* @__PURE__ */ O("span", {
|
|
90
95
|
className: "[&>svg]:h-ico-sm [&>svg]:w-ico-sm shrink-0",
|
|
91
96
|
"aria-hidden": "true",
|
|
92
|
-
children: e
|
|
93
|
-
|
|
97
|
+
children: /* @__PURE__ */ O(e, {
|
|
98
|
+
size: "sm",
|
|
99
|
+
children: a(t.icon)
|
|
100
|
+
})
|
|
101
|
+
}), /* @__PURE__ */ O("span", { children: t.title })]
|
|
94
102
|
})
|
|
95
|
-
}) },
|
|
103
|
+
}) }, t.href);
|
|
96
104
|
}) }) })] })
|
|
97
105
|
});
|
|
98
106
|
}
|
|
99
|
-
return /* @__PURE__ */
|
|
107
|
+
return /* @__PURE__ */ k(x, { children: [/* @__PURE__ */ O(b, {
|
|
100
108
|
asChild: !0,
|
|
101
|
-
isActive:
|
|
102
|
-
tooltip:
|
|
103
|
-
className:
|
|
104
|
-
children: /* @__PURE__ */
|
|
105
|
-
href:
|
|
106
|
-
"aria-label":
|
|
107
|
-
"aria-current":
|
|
108
|
-
children: [/* @__PURE__ */
|
|
109
|
+
isActive: r,
|
|
110
|
+
tooltip: n.title,
|
|
111
|
+
className: t(M, r ? N : P),
|
|
112
|
+
children: /* @__PURE__ */ k(u, {
|
|
113
|
+
href: n.href,
|
|
114
|
+
"aria-label": n.title,
|
|
115
|
+
"aria-current": r ? "page" : void 0,
|
|
116
|
+
children: [/* @__PURE__ */ O("span", {
|
|
109
117
|
className: "[&>svg]:h-ico-md [&>svg]:w-ico-md shrink-0",
|
|
110
118
|
"aria-hidden": "true",
|
|
111
|
-
children:
|
|
112
|
-
|
|
119
|
+
children: /* @__PURE__ */ O(e, {
|
|
120
|
+
size: "md",
|
|
121
|
+
children: a(n.icon)
|
|
122
|
+
})
|
|
123
|
+
}), /* @__PURE__ */ O("span", {
|
|
113
124
|
className: "text-ds-base",
|
|
114
|
-
children:
|
|
125
|
+
children: n.title
|
|
115
126
|
})]
|
|
116
127
|
})
|
|
117
|
-
}),
|
|
128
|
+
}), d && /* @__PURE__ */ O(y, { children: d })] });
|
|
118
129
|
}
|
|
119
|
-
var
|
|
120
|
-
let
|
|
121
|
-
return /* @__PURE__ */
|
|
122
|
-
...
|
|
123
|
-
ref:
|
|
130
|
+
var I = E.forwardRef(({ currentPath: o = "/", user: s, navGroups: c = [], logo: y, headerSlot: b, preFooterSlot: x, preFooterClassName: S, footerLinks: C = [], footer: w, renderItem: A, className: M, ...N }, P) => {
|
|
131
|
+
let I = l(), L = (e, t = !1) => t || e === "/" ? o === e : o.startsWith(e);
|
|
132
|
+
return /* @__PURE__ */ k(u, {
|
|
133
|
+
...N,
|
|
134
|
+
ref: P,
|
|
124
135
|
"aria-label": "Main navigation",
|
|
125
|
-
className:
|
|
136
|
+
className: t("z-raised hidden h-full flex-col border-r border-surface-border-strong bg-surface-raised md:flex", M),
|
|
126
137
|
children: [
|
|
127
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ O(_, {
|
|
128
139
|
className: "px-ds-06 py-ds-06",
|
|
129
|
-
children:
|
|
140
|
+
children: y ?? /* @__PURE__ */ O("span", {
|
|
130
141
|
className: "text-ds-lg font-semibold text-surface-fg",
|
|
131
142
|
children: "Logo"
|
|
132
143
|
})
|
|
133
144
|
}),
|
|
134
|
-
|
|
145
|
+
s && /* @__PURE__ */ k("div", {
|
|
135
146
|
className: "flex items-center gap-ds-04 px-ds-06 pb-ds-05",
|
|
136
|
-
children: [/* @__PURE__ */
|
|
147
|
+
children: [/* @__PURE__ */ k(n, {
|
|
137
148
|
className: "h-ds-sm-plus w-ds-sm-plus",
|
|
138
|
-
children: [
|
|
139
|
-
src:
|
|
140
|
-
alt:
|
|
141
|
-
}) : null, /* @__PURE__ */
|
|
149
|
+
children: [s.image ? /* @__PURE__ */ O(i, {
|
|
150
|
+
src: s.image,
|
|
151
|
+
alt: s.name
|
|
152
|
+
}) : null, /* @__PURE__ */ O(r, {
|
|
142
153
|
className: "bg-surface-raised-hover text-surface-fg",
|
|
143
|
-
children:
|
|
154
|
+
children: s.name?.charAt(0).toUpperCase()
|
|
144
155
|
})]
|
|
145
|
-
}), /* @__PURE__ */
|
|
156
|
+
}), /* @__PURE__ */ k("div", {
|
|
146
157
|
className: "flex min-w-0 flex-col",
|
|
147
|
-
children: [/* @__PURE__ */
|
|
158
|
+
children: [/* @__PURE__ */ O("span", {
|
|
148
159
|
className: "truncate text-ds-md text-surface-fg",
|
|
149
|
-
children:
|
|
150
|
-
}), /* @__PURE__ */
|
|
160
|
+
children: s.name
|
|
161
|
+
}), /* @__PURE__ */ O("span", {
|
|
151
162
|
className: "truncate text-ds-sm text-surface-fg-subtle",
|
|
152
|
-
children:
|
|
163
|
+
children: s.designation || s.role
|
|
153
164
|
})]
|
|
154
165
|
})]
|
|
155
166
|
}),
|
|
156
|
-
/* @__PURE__ */
|
|
157
|
-
|
|
158
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ O(T, {}),
|
|
168
|
+
b && /* @__PURE__ */ k(D, { children: [b, /* @__PURE__ */ O(T, {})] }),
|
|
169
|
+
/* @__PURE__ */ O(d, {
|
|
159
170
|
className: "no-scrollbar px-ds-04",
|
|
160
|
-
children:
|
|
161
|
-
/* @__PURE__ */
|
|
171
|
+
children: c.map((e, t) => /* @__PURE__ */ k("div", { children: [t > 0 && /* @__PURE__ */ O(T, {}), /* @__PURE__ */ k(p, { children: [
|
|
172
|
+
/* @__PURE__ */ O(g, {
|
|
162
173
|
className: "px-ds-04 text-ds-sm text-surface-fg-subtle",
|
|
163
174
|
children: e.label
|
|
164
175
|
}),
|
|
165
|
-
e.action && /* @__PURE__ */
|
|
176
|
+
e.action && /* @__PURE__ */ O(m, {
|
|
166
177
|
asChild: !0,
|
|
167
178
|
children: e.action
|
|
168
179
|
}),
|
|
169
|
-
/* @__PURE__ */
|
|
170
|
-
let t = () => /* @__PURE__ */
|
|
180
|
+
/* @__PURE__ */ O(h, { children: /* @__PURE__ */ O(v, { children: e.items.map((e) => {
|
|
181
|
+
let t = () => /* @__PURE__ */ O(F, {
|
|
171
182
|
item: e,
|
|
172
|
-
isActive:
|
|
173
|
-
isPathActive:
|
|
183
|
+
isActive: L(e.href, e.exact),
|
|
184
|
+
isPathActive: L
|
|
174
185
|
});
|
|
175
|
-
if (
|
|
176
|
-
let n =
|
|
177
|
-
if (n !== null) return /* @__PURE__ */ E
|
|
186
|
+
if (A) {
|
|
187
|
+
let n = A(e, t);
|
|
188
|
+
if (n !== null) return /* @__PURE__ */ O(E.Fragment, { children: n }, e.href);
|
|
178
189
|
}
|
|
179
|
-
return /* @__PURE__ */ E
|
|
190
|
+
return /* @__PURE__ */ O(E.Fragment, { children: t() }, e.href);
|
|
180
191
|
}) }) })
|
|
181
192
|
] })] }, e.label))
|
|
182
193
|
}),
|
|
183
|
-
|
|
184
|
-
className:
|
|
185
|
-
children:
|
|
194
|
+
x && /* @__PURE__ */ k(D, { children: [/* @__PURE__ */ O(T, {}), /* @__PURE__ */ O("div", {
|
|
195
|
+
className: S,
|
|
196
|
+
children: x
|
|
186
197
|
})] }),
|
|
187
|
-
|
|
198
|
+
w ? /* @__PURE__ */ k(f, {
|
|
188
199
|
className: "gap-ds-03 px-ds-06 py-ds-05",
|
|
189
200
|
children: [
|
|
190
|
-
|
|
191
|
-
|
|
201
|
+
w.slot && /* @__PURE__ */ O("div", { children: w.slot }),
|
|
202
|
+
w.promo && /* @__PURE__ */ k("div", {
|
|
192
203
|
className: "relative rounded-surface border border-surface-border bg-surface-raised p-ds-04 shadow-raised",
|
|
193
|
-
children: [
|
|
194
|
-
onClick:
|
|
204
|
+
children: [w.promo.onDismiss && /* @__PURE__ */ O("button", {
|
|
205
|
+
onClick: w.promo.onDismiss,
|
|
195
206
|
"aria-label": "Dismiss",
|
|
196
207
|
className: "absolute right-ds-02 top-ds-02 flex h-5 w-5 items-center justify-center rounded-control text-surface-fg-subtle transition-colors hover:bg-surface-raised-hover hover:text-surface-fg",
|
|
197
|
-
children: /* @__PURE__ */
|
|
198
|
-
}), /* @__PURE__ */
|
|
208
|
+
children: /* @__PURE__ */ O(j, { className: "h-3.5 w-3.5" })
|
|
209
|
+
}), /* @__PURE__ */ k("div", {
|
|
199
210
|
className: "flex flex-col gap-ds-03",
|
|
200
|
-
children: [
|
|
211
|
+
children: [w.promo.icon && /* @__PURE__ */ O("span", {
|
|
201
212
|
className: "text-accent-11 [&>svg]:h-ico-md [&>svg]:w-ico-md",
|
|
202
213
|
"aria-hidden": "true",
|
|
203
|
-
children:
|
|
204
|
-
|
|
214
|
+
children: /* @__PURE__ */ O(e, {
|
|
215
|
+
size: "md",
|
|
216
|
+
children: a(w.promo.icon)
|
|
217
|
+
})
|
|
218
|
+
}), /* @__PURE__ */ k("div", {
|
|
205
219
|
className: "flex min-w-0 flex-col gap-ds-03",
|
|
206
|
-
children: [/* @__PURE__ */
|
|
220
|
+
children: [/* @__PURE__ */ O("p", {
|
|
207
221
|
className: "text-ds-sm text-surface-fg",
|
|
208
|
-
children:
|
|
209
|
-
}),
|
|
210
|
-
href:
|
|
211
|
-
onClick:
|
|
222
|
+
children: w.promo.text
|
|
223
|
+
}), w.promo.action && (w.promo.action.href ? /* @__PURE__ */ O(I, {
|
|
224
|
+
href: w.promo.action.href,
|
|
225
|
+
onClick: w.promo.action.onClick,
|
|
212
226
|
className: "inline-flex self-start rounded-control bg-accent-9 px-ds-04 py-ds-02 text-ds-sm font-medium text-accent-fg transition-colors hover:bg-accent-10",
|
|
213
|
-
children:
|
|
214
|
-
}) : /* @__PURE__ */
|
|
215
|
-
onClick:
|
|
227
|
+
children: w.promo.action.label
|
|
228
|
+
}) : /* @__PURE__ */ O("button", {
|
|
229
|
+
onClick: w.promo.action.onClick,
|
|
216
230
|
className: "inline-flex self-start rounded-control bg-accent-9 px-ds-04 py-ds-02 text-ds-sm font-medium text-accent-fg transition-colors hover:bg-accent-10",
|
|
217
|
-
children:
|
|
231
|
+
children: w.promo.action.label
|
|
218
232
|
}))]
|
|
219
233
|
})]
|
|
220
234
|
})]
|
|
221
235
|
}),
|
|
222
|
-
(
|
|
236
|
+
(w.links?.length || w.version) && /* @__PURE__ */ k("div", {
|
|
223
237
|
className: "flex items-center gap-ds-03 text-ds-sm text-surface-fg-subtle",
|
|
224
238
|
children: [
|
|
225
|
-
|
|
239
|
+
w.links?.map((e, t) => /* @__PURE__ */ k(E.Fragment, { children: [t > 0 && /* @__PURE__ */ O("span", { children: "·" }), /* @__PURE__ */ O(I, {
|
|
226
240
|
className: "transition-colors hover:text-accent-11",
|
|
227
241
|
href: e.href,
|
|
228
242
|
children: e.label
|
|
229
243
|
})] }, e.href)),
|
|
230
|
-
|
|
231
|
-
|
|
244
|
+
w.links?.length && w.version && /* @__PURE__ */ O("span", { children: "·" }),
|
|
245
|
+
w.version && (typeof w.version == "string" ? /* @__PURE__ */ O("span", { children: w.version }) : /* @__PURE__ */ O(I, {
|
|
232
246
|
className: "transition-colors hover:text-accent-11",
|
|
233
|
-
href:
|
|
234
|
-
children:
|
|
247
|
+
href: w.version.href,
|
|
248
|
+
children: w.version.label
|
|
235
249
|
}))
|
|
236
250
|
]
|
|
237
251
|
})
|
|
238
252
|
]
|
|
239
|
-
}) :
|
|
253
|
+
}) : C.length > 0 ? /* @__PURE__ */ O(f, {
|
|
240
254
|
className: "px-ds-06 py-ds-05",
|
|
241
|
-
children: /* @__PURE__ */
|
|
255
|
+
children: /* @__PURE__ */ O("div", {
|
|
242
256
|
className: "flex items-center gap-ds-03 text-ds-sm text-surface-fg-subtle",
|
|
243
|
-
children:
|
|
257
|
+
children: C.map((e, t) => /* @__PURE__ */ k(E.Fragment, { children: [t > 0 && /* @__PURE__ */ O("span", { children: "·" }), /* @__PURE__ */ O(I, {
|
|
244
258
|
className: "transition-colors hover:text-accent-11",
|
|
245
259
|
href: e.href,
|
|
246
260
|
children: e.label
|
|
@@ -250,6 +264,6 @@ var P = w.forwardRef(({ currentPath: i = "/", user: a, navGroups: o = [], logo:
|
|
|
250
264
|
]
|
|
251
265
|
});
|
|
252
266
|
});
|
|
253
|
-
|
|
267
|
+
I.displayName = "AppSidebar";
|
|
254
268
|
//#endregion
|
|
255
|
-
export {
|
|
269
|
+
export { I as AppSidebar };
|