@giddaa-housing/ui 0.1.0 → 1.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/README.md +18 -6
- package/css/base.css +37 -0
- package/css/components.css +135 -0
- package/css/generated/shared.css +1 -0
- package/css/giddaa.css +402 -0
- package/css/preset.css +77 -0
- package/css/styles.css +2 -0
- package/css/theme.css +255 -0
- package/dist/accordion.js +5 -35
- package/dist/accordion.js.map +1 -1
- package/dist/activity-timeline.d.ts +33 -0
- package/dist/activity-timeline.js +212 -0
- package/dist/activity-timeline.js.map +1 -0
- package/dist/alert.js +5 -35
- package/dist/alert.js.map +1 -1
- package/dist/auth-layout.d.ts +23 -0
- package/dist/auth-layout.js +304 -0
- package/dist/auth-layout.js.map +1 -0
- package/dist/avatar.js +10 -142
- package/dist/avatar.js.map +1 -1
- package/dist/badge.d.ts +3 -2
- package/dist/badge.js +6 -114
- package/dist/badge.js.map +1 -1
- package/dist/bar-chart.d.ts +101 -77
- package/dist/bar-chart.js +142 -220
- package/dist/bar-chart.js.map +1 -1
- package/dist/breadcrumb.js +5 -35
- package/dist/breadcrumb.js.map +1 -1
- package/dist/bullet-chart.js +15 -48
- package/dist/bullet-chart.js.map +1 -1
- package/dist/button-group.js +14 -90
- package/dist/button-group.js.map +1 -1
- package/dist/button.d.ts +5 -5
- package/dist/button.js +7 -140
- package/dist/button.js.map +1 -1
- package/dist/calendar.js +12 -287
- package/dist/calendar.js.map +1 -1
- package/dist/card.js +5 -35
- package/dist/card.js.map +1 -1
- package/dist/carousel.js +12 -386
- package/dist/carousel.js.map +1 -1
- package/dist/chart.js +16 -480
- package/dist/chart.js.map +1 -1
- package/dist/checkbox.d.ts +1 -1
- package/dist/checkbox.js +13 -48
- package/dist/checkbox.js.map +1 -1
- package/dist/chunk-322YCNVL.js +278 -0
- package/dist/chunk-322YCNVL.js.map +1 -0
- package/dist/chunk-3ACQVT7A.js +25 -0
- package/dist/chunk-3ACQVT7A.js.map +1 -0
- package/dist/chunk-3T65TLJX.js +334 -0
- package/dist/chunk-3T65TLJX.js.map +1 -0
- package/dist/chunk-6ZSGQHH2.js +192 -0
- package/dist/chunk-6ZSGQHH2.js.map +1 -0
- package/dist/chunk-7TBMLFGW.js +41 -0
- package/dist/chunk-7TBMLFGW.js.map +1 -0
- package/dist/chunk-B4H6RNDH.js +135 -0
- package/dist/chunk-B4H6RNDH.js.map +1 -0
- package/dist/chunk-BUXCGZ6X.js +219 -0
- package/dist/chunk-BUXCGZ6X.js.map +1 -0
- package/dist/chunk-CHII2QHH.js +58 -0
- package/dist/chunk-CHII2QHH.js.map +1 -0
- package/dist/chunk-DMNOXRRW.js +147 -0
- package/dist/chunk-DMNOXRRW.js.map +1 -0
- package/dist/chunk-EFSOSSIC.js +130 -0
- package/dist/chunk-EFSOSSIC.js.map +1 -0
- package/dist/chunk-FZDSVMKY.js +363 -0
- package/dist/chunk-FZDSVMKY.js.map +1 -0
- package/dist/chunk-GJOFIJS3.js +246 -0
- package/dist/chunk-GJOFIJS3.js.map +1 -0
- package/dist/chunk-HL3ZSYES.js +23 -0
- package/dist/chunk-HL3ZSYES.js.map +1 -0
- package/dist/chunk-JVLUBAPB.js +129 -0
- package/dist/chunk-JVLUBAPB.js.map +1 -0
- package/dist/chunk-KDPYSOYZ.js +64 -0
- package/dist/chunk-KDPYSOYZ.js.map +1 -0
- package/dist/chunk-KSMDANKI.js +43 -0
- package/dist/chunk-KSMDANKI.js.map +1 -0
- package/dist/chunk-MEKCCOP5.js +46 -0
- package/dist/chunk-MEKCCOP5.js.map +1 -0
- package/dist/chunk-NOFXVRWL.js +451 -0
- package/dist/chunk-NOFXVRWL.js.map +1 -0
- package/dist/chunk-PC5MHNVA.js +171 -0
- package/dist/chunk-PC5MHNVA.js.map +1 -0
- package/dist/chunk-QKAQZ2GU.js +122 -0
- package/dist/chunk-QKAQZ2GU.js.map +1 -0
- package/dist/chunk-QZHSHSVV.js +26 -0
- package/dist/chunk-QZHSHSVV.js.map +1 -0
- package/dist/chunk-RBMK26XD.js +19 -0
- package/dist/chunk-RBMK26XD.js.map +1 -0
- package/dist/chunk-SFNJGF6M.js +262 -0
- package/dist/chunk-SFNJGF6M.js.map +1 -0
- package/dist/chunk-UJJNLGTM.js +112 -0
- package/dist/chunk-UJJNLGTM.js.map +1 -0
- package/dist/chunk-VGR4ZWJ3.js +418 -0
- package/dist/chunk-VGR4ZWJ3.js.map +1 -0
- package/dist/chunk-XG47P6D4.js +99 -0
- package/dist/chunk-XG47P6D4.js.map +1 -0
- package/dist/chunk-XZZAHNVM.js +21 -0
- package/dist/chunk-XZZAHNVM.js.map +1 -0
- package/dist/chunk-Y4TTYVNE.js +36 -0
- package/dist/chunk-Y4TTYVNE.js.map +1 -0
- package/dist/chunk-YDWIHW6Q.js +69 -0
- package/dist/chunk-YDWIHW6Q.js.map +1 -0
- package/dist/collapsible.js +6 -35
- package/dist/collapsible.js.map +1 -1
- package/dist/combobox.js +26 -694
- package/dist/combobox.js.map +1 -1
- package/dist/cta.d.ts +66 -0
- package/dist/cta.js +358 -0
- package/dist/cta.js.map +1 -0
- package/dist/currency-selector.d.ts +42 -0
- package/dist/currency-selector.js +192 -0
- package/dist/currency-selector.js.map +1 -0
- package/dist/date-picker.d.ts +18 -10
- package/dist/date-picker.js +105 -430
- package/dist/date-picker.js.map +1 -1
- package/dist/details-card.d.ts +19 -0
- package/dist/details-card.js +267 -0
- package/dist/details-card.js.map +1 -0
- package/dist/dialog.js +36 -146
- package/dist/dialog.js.map +1 -1
- package/dist/dropdown-menu.d.ts +1 -1
- package/dist/dropdown-menu.js +20 -358
- package/dist/dropdown-menu.js.map +1 -1
- package/dist/dropzone.js +13 -40
- package/dist/dropzone.js.map +1 -1
- package/dist/editorial-card.d.ts +29 -0
- package/dist/editorial-card.js +311 -0
- package/dist/editorial-card.js.map +1 -0
- package/dist/empty-state.js +5 -35
- package/dist/empty-state.js.map +1 -1
- package/dist/field.js +30 -135
- package/dist/field.js.map +1 -1
- package/dist/footer.d.ts +47 -0
- package/dist/footer.js +430 -0
- package/dist/footer.js.map +1 -0
- package/dist/funnel-chart.js +42 -415
- package/dist/funnel-chart.js.map +1 -1
- package/dist/gallery-indicator.d.ts +18 -0
- package/dist/gallery-indicator.js +12 -0
- package/dist/gallery-indicator.js.map +1 -0
- package/dist/heatmap-chart.d.ts +98 -0
- package/dist/heatmap-chart.js +248 -0
- package/dist/heatmap-chart.js.map +1 -0
- package/dist/infotip.d.ts +11 -0
- package/dist/infotip.js +66 -0
- package/dist/infotip.js.map +1 -0
- package/dist/input-group.d.ts +2 -1
- package/dist/input-group.js +15 -371
- package/dist/input-group.js.map +1 -1
- package/dist/input-size-context.js +5 -19
- package/dist/input-size-context.js.map +1 -1
- package/dist/input.js +6 -78
- package/dist/input.js.map +1 -1
- package/dist/item.js +5 -35
- package/dist/item.js.map +1 -1
- package/dist/kpi-card.js +12 -52
- package/dist/kpi-card.js.map +1 -1
- package/dist/label.js +5 -64
- package/dist/label.js.map +1 -1
- package/dist/line-chart.js +9 -166
- package/dist/line-chart.js.map +1 -1
- package/dist/logo.js +4 -141
- package/dist/logo.js.map +1 -1
- package/dist/map-indicator.d.ts +13 -0
- package/dist/map-indicator.js +109 -0
- package/dist/map-indicator.js.map +1 -0
- package/dist/match.d.ts +16 -0
- package/dist/match.js +113 -0
- package/dist/match.js.map +1 -0
- package/dist/media-gallery-hero.d.ts +60 -0
- package/dist/media-gallery-hero.js +362 -0
- package/dist/media-gallery-hero.js.map +1 -0
- package/dist/media-player.d.ts +60 -0
- package/dist/media-player.js +1394 -0
- package/dist/media-player.js.map +1 -0
- package/dist/number-input.js +30 -325
- package/dist/number-input.js.map +1 -1
- package/dist/page-header.js +4 -32
- package/dist/page-header.js.map +1 -1
- package/dist/pagination.d.ts +1 -0
- package/dist/pagination.js +27 -161
- package/dist/pagination.js.map +1 -1
- package/dist/password-input.d.ts +1 -0
- package/dist/password-input.js +21 -319
- package/dist/password-input.js.map +1 -1
- package/dist/phone-input.d.ts +2 -1
- package/dist/phone-input.js +148 -359
- package/dist/phone-input.js.map +1 -1
- package/dist/photo-gallery.d.ts +1 -1
- package/dist/photo-gallery.js +97 -393
- package/dist/photo-gallery.js.map +1 -1
- package/dist/pie-chart.js +17 -52
- package/dist/pie-chart.js.map +1 -1
- package/dist/popover.js +13 -158
- package/dist/popover.js.map +1 -1
- package/dist/price-tag.d.ts +35 -0
- package/dist/price-tag.js +178 -0
- package/dist/price-tag.js.map +1 -0
- package/dist/progress.d.ts +5 -2
- package/dist/progress.js +14 -303
- package/dist/progress.js.map +1 -1
- package/dist/property-listing-card.d.ts +32 -0
- package/dist/property-listing-card.js +235 -0
- package/dist/property-listing-card.js.map +1 -0
- package/dist/radar-chart.d.ts +110 -0
- package/dist/radar-chart.js +147 -0
- package/dist/radar-chart.js.map +1 -0
- package/dist/radio-group.js +15 -50
- package/dist/radio-group.js.map +1 -1
- package/dist/review-block.d.ts +20 -0
- package/dist/review-block.js +10 -0
- package/dist/review-block.js.map +1 -0
- package/dist/rich-text-editor.js +172 -433
- package/dist/rich-text-editor.js.map +1 -1
- package/dist/scatter-chart.d.ts +142 -0
- package/dist/scatter-chart.js +252 -0
- package/dist/scatter-chart.js.map +1 -0
- package/dist/search-input.d.ts +1 -0
- package/dist/search-input.js +22 -320
- package/dist/search-input.js.map +1 -1
- package/dist/select.js +15 -292
- package/dist/select.js.map +1 -1
- package/dist/separator.js +5 -68
- package/dist/separator.js.map +1 -1
- package/dist/sheet.js +14 -271
- package/dist/sheet.js.map +1 -1
- package/dist/sidebar.d.ts +1 -1
- package/dist/sidebar.js +89 -494
- package/dist/sidebar.js.map +1 -1
- package/dist/size-context.js +5 -17
- package/dist/size-context.js.map +1 -1
- package/dist/skeleton.js +4 -44
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.d.ts +28 -0
- package/dist/slider.js +152 -0
- package/dist/slider.js.map +1 -0
- package/dist/sparkline.js +33 -341
- package/dist/sparkline.js.map +1 -1
- package/dist/stepper.js +5 -35
- package/dist/stepper.js.map +1 -1
- package/dist/styles.css +9593 -2
- package/dist/switch.js +13 -48
- package/dist/switch.js.map +1 -1
- package/dist/tab-list.js +35 -306
- package/dist/tab-list.js.map +1 -1
- package/dist/table.js +5 -32
- package/dist/table.js.map +1 -1
- package/dist/tabs.js +10 -150
- package/dist/tabs.js.map +1 -1
- package/dist/tag.d.ts +7 -6
- package/dist/tag.js +101 -97
- package/dist/tag.js.map +1 -1
- package/dist/testimonial-block.d.ts +34 -0
- package/dist/testimonial-block.js +377 -0
- package/dist/testimonial-block.js.map +1 -0
- package/dist/textarea.js +6 -73
- package/dist/textarea.js.map +1 -1
- package/dist/time-picker.js +119 -279
- package/dist/time-picker.js.map +1 -1
- package/dist/toast.js +27 -132
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.d.ts +5 -5
- package/dist/tooltip.js +7 -90
- package/dist/tooltip.js.map +1 -1
- package/dist/tree-map.js +41 -414
- package/dist/tree-map.js.map +1 -1
- package/dist/waterfall-chart.d.ts +129 -0
- package/dist/waterfall-chart.js +577 -0
- package/dist/waterfall-chart.js.map +1 -0
- package/package.json +98 -28
- package/dist/base.css +0 -32
- package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
- package/dist/index.d.ts +0 -87
- package/dist/index.js +0 -10448
- package/dist/index.js.map +0 -1
- package/dist/red-hat-display.css +0 -2
- package/dist/theme/giddaa.css +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/media-player.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slider as SliderPrimitive } from \"@base-ui/react/slider\";\nimport {\n\tCaptions,\n\tCaptionsOff,\n\tMaximize,\n\tMinimize,\n\tPause,\n\tPictureInPicture2,\n\tPlay,\n\tRefreshCcw,\n\tRepeat2,\n\tRotateCcw,\n\tRotateCw,\n\tSettings,\n\tTriangleAlert,\n\tVolume1,\n\tVolume2,\n\tVolumeX,\n} from \"lucide-react\";\nimport {\n\tMediaActionTypes,\n\tMediaProvider,\n\tuseMediaDispatch,\n\tuseMediaFullscreenRef,\n\tuseMediaRef,\n\tuseMediaSelector,\n\tuseMediaStore,\n} from \"media-chrome/react/media-store\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\n\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSub,\n\tDropdownMenuSubContent,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuTrigger,\n} from \"./dropdown-menu\";\nimport { cn } from \"./lib/cn\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\ntype MediaProviderProps = React.ComponentProps<typeof MediaProvider>;\ntype MediaPlayerProps = React.ComponentProps<\"div\"> & {\n\taudio?: boolean;\n\tmediaStore?: MediaProviderProps[\"mediaStore\"];\n};\ntype MediaPlayerRootProps = Omit<MediaPlayerProps, \"mediaStore\">;\ntype MediaPlayerControlsProps = React.ComponentProps<\"div\">;\ntype MediaPlayerVideoProps = React.ComponentProps<\"video\">;\ntype MediaPlayerAudioProps = React.ComponentProps<\"audio\">;\ntype MediaPlayerControlsOverlayProps = React.ComponentProps<\"div\">;\ntype MediaPlayerPlayProps = React.ComponentProps<\"button\">;\ntype MediaPlayerSeekButtonProps = React.ComponentProps<\"button\"> & {\n\tseekOffset?: number;\n};\ntype MediaPlayerVolumeProps = React.ComponentProps<\"button\"> & {\n\texpandable?: boolean;\n\trangeClassName?: string;\n};\ntype MediaPlayerPlaybackSpeedProps = React.ComponentProps<\"button\"> & {\n\trates?: number[];\n};\ntype MediaPlayerCaptionsProps = React.ComponentProps<\"button\">;\ntype MediaPlayerSettingsProps = React.ComponentProps<\"button\"> & {\n\trates?: number[];\n};\ntype MediaPlayerTimeProps = React.ComponentProps<\"span\"> & {\n\tshowDuration?: boolean;\n};\ntype MediaPlayerSeekProps = Omit<\n\tSliderPrimitive.Root.Props<number>,\n\t\"defaultValue\" | \"onValueChange\" | \"onValueCommitted\" | \"value\"\n> & {\n\tonValueChange?: (value: number) => void;\n\tstep?: number;\n\twithTime?: boolean;\n};\ntype MediaPlayerLoopProps = React.ComponentProps<\"button\">;\ntype MediaPlayerPiPProps = React.ComponentProps<\"button\">;\ntype MediaPlayerFullscreenProps = React.ComponentProps<\"button\">;\ntype MediaPlayerErrorProps = React.ComponentProps<\"div\">;\n\ntype SubtitleTrack = { kind: string; label: string; language: string };\n\nconst DEFAULT_PLAYBACK_RATES = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\nconst CONTROLS_HIDE_DELAY = 2500;\nconst SEEK_PREVIEW_WIDTH = 160;\n\ntype MediaPlayerContextValue = {\n\tonMenuOpenChange: (open: boolean) => void;\n\tportalContainer: HTMLElement | null;\n\trootNode: HTMLElement | null;\n};\n\nconst MediaPlayerContext = React.createContext<MediaPlayerContextValue>({\n\tonMenuOpenChange: () => {},\n\tportalContainer: null,\n\trootNode: null,\n});\n\nfunction setRef<T>(ref: React.Ref<T> | undefined, value: T | null) {\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t\treturn;\n\t}\n\n\tif (ref) {\n\t\tref.current = value;\n\t}\n}\n\nfunction formatTime(value: number | undefined): string {\n\tif (!Number.isFinite(value)) {\n\t\treturn \"0:00\";\n\t}\n\n\tconst safeValue = Math.max(0, Math.floor(value ?? 0));\n\tconst hours = Math.floor(safeValue / 3600);\n\tconst minutes = Math.floor((safeValue % 3600) / 60);\n\tconst seconds = safeValue % 60;\n\n\tif (hours > 0) {\n\t\treturn `${hours}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n\t}\n\n\treturn `${minutes}:${String(seconds).padStart(2, \"0\")}`;\n}\n\nfunction formatRate(value: number | undefined): string {\n\tif (!value || value === 1) {\n\t\treturn \"1x\";\n\t}\n\n\treturn `${Number.parseFloat(value.toFixed(2))}x`;\n}\n\nfunction subtitleTrackId(track: SubtitleTrack): string {\n\treturn `${track.kind}:${track.language}:${track.label}`;\n}\n\nfunction subtitleTrackLabel(track: SubtitleTrack): string {\n\treturn track.label || track.language || \"Captions\";\n}\n\nfunction hasAudioChild(children: React.ReactNode): boolean {\n\treturn React.Children.toArray(children).some((child) => {\n\t\tif (!React.isValidElement(child)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (child.type === MediaPlayerAudio) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst props = child.props as { children?: React.ReactNode };\n\t\treturn hasAudioChild(props.children);\n\t});\n}\n\nfunction getSeekBounds(\n\tseekable: [number, number] | undefined,\n\tduration: number | undefined,\n) {\n\tconst min = seekable?.[0] ?? 0;\n\tconst fallbackMax = Number.isFinite(duration) ? (duration ?? 0) : 0;\n\tconst max = seekable?.[1] ?? fallbackMax;\n\n\treturn {\n\t\tmin,\n\t\tmax: Number.isFinite(max) ? Math.max(min, max) : min,\n\t};\n}\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(Math.max(value, min), max);\n}\n\nfunction getSeekValueFromPointer(\n\tevent: React.PointerEvent<HTMLElement>,\n\tmin: number,\n\tmax: number,\n) {\n\tconst rect = event.currentTarget.getBoundingClientRect();\n\tconst percent = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n\n\treturn {\n\t\tpercent: percent * 100,\n\t\tvalue: min + percent * (max - min),\n\t};\n}\n\nfunction MediaPlayer({ mediaStore, ...props }: MediaPlayerProps) {\n\tconst audio =\n\t\tprops.audio ?? (hasAudioChild(props.children) ? true : undefined);\n\n\treturn (\n\t\t<MediaProvider mediaStore={mediaStore}>\n\t\t\t<MediaPlayerRoot {...props} audio={audio} />\n\t\t</MediaProvider>\n\t);\n}\n\nfunction MediaPlayerRoot({\n\taudio,\n\tchildren,\n\tclassName,\n\tonBlurCapture,\n\tonFocusCapture,\n\tonKeyDown,\n\tonPointerDown,\n\tonPointerLeave,\n\tonPointerMove,\n\tref,\n\t...props\n}: MediaPlayerRootProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst store = useMediaStore();\n\tconst fullscreenRef = useMediaFullscreenRef();\n\tconst paused = useMediaSelector((state) => state.mediaPaused !== false);\n\tconst muted = useMediaSelector((state) => state.mediaMuted === true);\n\tconst isFullscreen = useMediaSelector(\n\t\t(state) => state.mediaIsFullscreen === true,\n\t);\n\n\tconst [rootNode, setRootNode] = React.useState<HTMLDivElement | null>(null);\n\tconst [controlsVisible, setControlsVisible] = React.useState(true);\n\tconst [menuOpenCount, setMenuOpenCount] = React.useState(0);\n\tconst [hoveringControls, setHoveringControls] = React.useState(false);\n\tconst [focusPinned, setFocusPinned] = React.useState(false);\n\tconst hideTimerRef = React.useRef<number | undefined>(undefined);\n\tconst lastActivityRef = React.useRef(0);\n\n\tconst alwaysVisible =\n\t\tBoolean(audio) ||\n\t\tpaused ||\n\t\tmenuOpenCount > 0 ||\n\t\thoveringControls ||\n\t\tfocusPinned;\n\tconst alwaysVisibleRef = React.useRef(alwaysVisible);\n\talwaysVisibleRef.current = alwaysVisible;\n\n\tconst scheduleHide = React.useCallback(function schedule(\n\t\tdelay: number = CONTROLS_HIDE_DELAY,\n\t) {\n\t\twindow.clearTimeout(hideTimerRef.current);\n\t\thideTimerRef.current = window.setTimeout(() => {\n\t\t\tif (alwaysVisibleRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// A stale callback can fire right after activity woke the controls\n\t\t\t// (clearTimeout cannot cancel an already-dispatched callback), so\n\t\t\t// hide only once the controls have actually been idle long enough.\n\t\t\tconst idleFor = Date.now() - lastActivityRef.current;\n\n\t\t\tif (idleFor < CONTROLS_HIDE_DELAY) {\n\t\t\t\tschedule(CONTROLS_HIDE_DELAY - idleFor);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetControlsVisible(false);\n\t\t}, delay);\n\t}, []);\n\n\tconst wake = React.useCallback(() => {\n\t\tlastActivityRef.current = Date.now();\n\t\tsetControlsVisible(true);\n\t\tscheduleHide();\n\t}, [scheduleHide]);\n\n\tReact.useEffect(() => {\n\t\tif (alwaysVisible) {\n\t\t\twindow.clearTimeout(hideTimerRef.current);\n\t\t\tsetControlsVisible(true);\n\t\t\treturn;\n\t\t}\n\n\t\tscheduleHide();\n\t}, [alwaysVisible, scheduleHide]);\n\n\tReact.useEffect(() => {\n\t\treturn () => window.clearTimeout(hideTimerRef.current);\n\t}, []);\n\n\t// Chapters tracks default to \"disabled\", which never loads their cues.\n\tReact.useEffect(() => {\n\t\tif (!rootNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst loadChapters = () => {\n\t\t\tconst media = rootNode.querySelector<HTMLMediaElement>(\"video, audio\");\n\n\t\t\tfor (const track of media?.textTracks ?? []) {\n\t\t\t\tif (track.kind === \"chapters\" && track.mode === \"disabled\") {\n\t\t\t\t\ttrack.mode = \"hidden\";\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tloadChapters();\n\t\tconst textTracks =\n\t\t\trootNode.querySelector<HTMLMediaElement>(\"video, audio\")?.textTracks;\n\t\ttextTracks?.addEventListener(\"addtrack\", loadChapters);\n\n\t\treturn () => textTracks?.removeEventListener(\"addtrack\", loadChapters);\n\t}, [rootNode]);\n\n\tconst onMenuOpenChange = React.useCallback((open: boolean) => {\n\t\tsetMenuOpenCount((count) => (open ? count + 1 : Math.max(0, count - 1)));\n\t}, []);\n\n\tconst contextValue = React.useMemo<MediaPlayerContextValue>(\n\t\t() => ({\n\t\t\tonMenuOpenChange,\n\t\t\tportalContainer: isFullscreen ? rootNode : null,\n\t\t\trootNode,\n\t\t}),\n\t\t[isFullscreen, onMenuOpenChange, rootNode],\n\t);\n\n\t// useMediaFullscreenRef returns a new function every render; keeping it out\n\t// of the callback deps stops React from detaching/re-attaching the ref each\n\t// render, which would reset the media store's fullscreen element (and, while\n\t// playing, loop: store update -> render -> ref cycle -> store update).\n\tconst fullscreenRefRef = React.useRef(fullscreenRef);\n\tfullscreenRefRef.current = fullscreenRef;\n\tconst rootRef = React.useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\tfullscreenRefRef.current(node);\n\t\t\tsetRootNode(node);\n\t\t\tsetRef(ref, node);\n\t\t},\n\t\t[ref],\n\t);\n\n\treturn (\n\t\t<MediaPlayerContext.Provider value={contextValue}>\n\t\t\t{/* biome-ignore lint/a11y/useSemanticElements: media-chrome needs a generic container for the fullscreen ref */}\n\t\t\t<div\n\t\t\t\tref={rootRef}\n\t\t\t\taria-label={audio ? \"Audio player\" : \"Video player\"}\n\t\t\t\tdata-audio={audio ? \"\" : undefined}\n\t\t\t\tdata-controls={controlsVisible ? \"visible\" : \"hidden\"}\n\t\t\t\tdata-fullscreen={isFullscreen ? \"\" : undefined}\n\t\t\t\tdata-slot=\"media-player\"\n\t\t\t\trole=\"region\"\n\t\t\t\t// biome-ignore lint/a11y/noNoninteractiveTabindex: the player region is the focus target for keyboard shortcuts\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/media-player relative isolate block w-full overflow-hidden rounded-2xl bg-fg-primary text-fg-on-brand shadow-2 outline-none\",\n\t\t\t\t\t\"data-[controls=hidden]:cursor-none\",\n\t\t\t\t\t\"data-[audio]:bg-[image:var(--gradient-accent-forest-to-brass)]\",\n\t\t\t\t\t\"data-[fullscreen]:rounded-none data-[fullscreen]:shadow-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t\tonBlurCapture={(event) => {\n\t\t\t\t\tonBlurCapture?.(event);\n\n\t\t\t\t\tif (!event.currentTarget.contains(event.relatedTarget as Node)) {\n\t\t\t\t\t\tsetFocusPinned(false);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonFocusCapture={(event) => {\n\t\t\t\t\tonFocusCapture?.(event);\n\n\t\t\t\t\tconst keyboardFocus =\n\t\t\t\t\t\t(event.target as HTMLElement).matches?.(\":focus-visible\") ?? false;\n\t\t\t\t\tsetFocusPinned(keyboardFocus);\n\n\t\t\t\t\tif (keyboardFocus) {\n\t\t\t\t\t\tsetControlsVisible(true);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tonKeyDown?.(event);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tevent.defaultPrevented ||\n\t\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\t\tevent.ctrlKey ||\n\t\t\t\t\t\tevent.altKey\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst target = event.target as HTMLElement;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttarget.closest(\n\t\t\t\t\t\t\t\"input, textarea, select, [contenteditable], [role='slider'], [role='menu'], [role='menuitem'], [role='menuitemradio']\",\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Read lazily from the store: subscribing the root to currentTime\n\t\t\t\t\t// would re-render it (and cycle its ref) on every timeupdate.\n\t\t\t\t\tconst state = store.getState();\n\t\t\t\t\tconst currentTime = state.mediaCurrentTime ?? 0;\n\t\t\t\t\tconst { min, max } = getSeekBounds(\n\t\t\t\t\t\tstate.mediaSeekable,\n\t\t\t\t\t\tstate.mediaDuration,\n\t\t\t\t\t);\n\n\t\t\t\t\tswitch (event.key) {\n\t\t\t\t\t\tcase \" \":\n\t\t\t\t\t\t\tif (target.closest(\"button\")) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: paused\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_PLAY_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_PAUSE_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"k\":\n\t\t\t\t\t\tcase \"K\":\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: paused\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_PLAY_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_PAUSE_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: muted\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_UNMUTE_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_MUTE_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"f\":\n\t\t\t\t\t\tcase \"F\":\n\t\t\t\t\t\t\tif (audio) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_EXIT_FULLSCREEN_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_ENTER_FULLSCREEN_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"c\":\n\t\t\t\t\t\tcase \"C\":\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_TOGGLE_SUBTITLES_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\t\t\t\tdetail: clamp(currentTime - 5, min, max),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\t\t\t\tdetail: clamp(currentTime + 5, min, max),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\twake();\n\t\t\t\t}}\n\t\t\t\tonPointerDown={(event) => {\n\t\t\t\t\tonPointerDown?.(event);\n\t\t\t\t\twake();\n\t\t\t\t}}\n\t\t\t\tonPointerLeave={(event) => {\n\t\t\t\t\tonPointerLeave?.(event);\n\t\t\t\t\tsetHoveringControls(false);\n\n\t\t\t\t\tif (!alwaysVisibleRef.current) {\n\t\t\t\t\t\twindow.clearTimeout(hideTimerRef.current);\n\t\t\t\t\t\tsetControlsVisible(false);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tonPointerMove?.(event);\n\t\t\t\t\twake();\n\n\t\t\t\t\t// Hidden controls are pointer-events-none, so hit-testing via\n\t\t\t\t\t// event.target misses them right after a wake; use geometry.\n\t\t\t\t\tconst controls = event.currentTarget.querySelector(\n\t\t\t\t\t\t\"[data-slot='media-player-controls']\",\n\t\t\t\t\t);\n\t\t\t\t\tconst rect = controls?.getBoundingClientRect();\n\t\t\t\t\tsetHoveringControls(\n\t\t\t\t\t\t!!rect &&\n\t\t\t\t\t\t\tevent.clientX >= rect.left &&\n\t\t\t\t\t\t\tevent.clientX <= rect.right &&\n\t\t\t\t\t\t\tevent.clientY >= rect.top &&\n\t\t\t\t\t\t\tevent.clientY <= rect.bottom,\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</MediaPlayerContext.Provider>\n\t);\n}\n\nfunction MediaPlayerVideo({ className, ref, ...props }: MediaPlayerVideoProps) {\n\t// useMediaRef returns a new function every render; keep it out of the deps\n\t// so re-renders don't cycle the ref and re-register the media element.\n\tconst mediaRef = useMediaRef();\n\tconst mediaRefRef = React.useRef(mediaRef);\n\tmediaRefRef.current = mediaRef;\n\tconst videoRef = React.useCallback(\n\t\t(node: HTMLVideoElement | null) => {\n\t\t\tmediaRefRef.current(node);\n\t\t\tsetRef(ref, node);\n\t\t},\n\t\t[ref],\n\t);\n\n\treturn (\n\t\t<video\n\t\t\tref={videoRef}\n\t\t\tdata-slot=\"media-player-video\"\n\t\t\tclassName={cn(\n\t\t\t\t\"block aspect-video size-full object-cover\",\n\t\t\t\t\"group-data-[fullscreen]/media-player:aspect-auto group-data-[fullscreen]/media-player:object-contain\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tplaysInline\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaPlayerAudio({ className, ref, ...props }: MediaPlayerAudioProps) {\n\tconst mediaRef = useMediaRef();\n\tconst mediaRefRef = React.useRef(mediaRef);\n\tmediaRefRef.current = mediaRef;\n\tconst audioRef = React.useCallback(\n\t\t(node: HTMLAudioElement | null) => {\n\t\t\tmediaRefRef.current(node);\n\t\t\tsetRef(ref, node);\n\t\t},\n\t\t[ref],\n\t);\n\n\treturn (\n\t\t<audio\n\t\t\tref={audioRef}\n\t\t\tdata-slot=\"media-player-audio\"\n\t\t\tclassName={cn(\"sr-only\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaPlayerControls({\n\tclassName,\n\t...props\n}: MediaPlayerControlsProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"media-player-controls\"\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-x-0 bottom-0 z-10 flex w-full items-center gap-2 p-3 text-fg-on-brand md:p-4\",\n\t\t\t\t\"transition-opacity duration-300 ease-out group-data-[controls=hidden]/media-player:pointer-events-none group-data-[controls=hidden]/media-player:opacity-0\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaPlayerControlsOverlay({\n\tclassName,\n\t...props\n}: MediaPlayerControlsOverlayProps) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tdata-slot=\"media-player-controls-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"pointer-events-none absolute inset-x-0 bottom-0 -z-10 h-36 bg-[image:var(--gradient-overlay-photo-bottom)]\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaControlButton({\n\tclassName,\n\tshortcut,\n\ttooltip,\n\t...props\n}: React.ComponentProps<\"button\"> & {\n\tshortcut?: string;\n\ttooltip?: React.ReactNode;\n}) {\n\tconst { portalContainer } = React.useContext(MediaPlayerContext);\n\tconst button = (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-surface-glass-overlay-button text-fg-on-brand shadow-1 backdrop-blur-sm transition-[background-color,color,box-shadow,transform] outline-none select-none hover:bg-surface-brand hover:text-fg-on-brand focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:scale-95 aria-pressed:bg-surface-brand disabled:pointer-events-none disabled:opacity-45 [&_svg]:size-4.5\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n\n\tif (!tooltip) {\n\t\treturn button;\n\t}\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger delay={300} render={button} />\n\t\t\t<TooltipContent\n\t\t\t\tclassName=\"border-line-subtle px-2.5 py-1.5 text-gdt-xs font-bold\"\n\t\t\t\tcontainer={portalContainer ?? undefined}\n\t\t\t\tside=\"top\"\n\t\t\t\tsideOffset={8}\n\t\t\t>\n\t\t\t\t{tooltip}\n\t\t\t\t{shortcut ? (\n\t\t\t\t\t<kbd\n\t\t\t\t\t\tdata-slot=\"kbd\"\n\t\t\t\t\t\tclassName=\"rounded-sm border border-line bg-surface px-1.5 py-0.5 font-sans text-gdt-xs font-bold text-fg-primary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{shortcut}\n\t\t\t\t\t</kbd>\n\t\t\t\t) : null}\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n\nfunction MediaPlayerPlay({\n\tclassName,\n\tonClick,\n\t...props\n}: MediaPlayerPlayProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst paused = useMediaSelector((state) => state.mediaPaused !== false);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={paused ? \"Play media\" : \"Pause media\"}\n\t\t\taria-pressed={!paused}\n\t\t\tdata-slot=\"media-player-play\"\n\t\t\tclassName={className}\n\t\t\tshortcut=\"Space\"\n\t\t\ttooltip={paused ? \"Play\" : \"Pause\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: paused\n\t\t\t\t\t\t? MediaActionTypes.MEDIA_PLAY_REQUEST\n\t\t\t\t\t\t: MediaActionTypes.MEDIA_PAUSE_REQUEST,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t{paused ? <Play fill=\"currentColor\" /> : <Pause fill=\"currentColor\" />}\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerSeekBackward({\n\tclassName,\n\tonClick,\n\tseekOffset = 10,\n\t...props\n}: MediaPlayerSeekButtonProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={`Seek back ${seekOffset} seconds`}\n\t\t\tdata-slot=\"media-player-seek-backward\"\n\t\t\tclassName={className}\n\t\t\ttooltip={`Back ${seekOffset}s`}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\tdetail: Math.max(0, currentTime - seekOffset),\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RotateCcw />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerSeekForward({\n\tclassName,\n\tonClick,\n\tseekOffset = 10,\n\t...props\n}: MediaPlayerSeekButtonProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\tconst duration = useMediaSelector((state) => state.mediaDuration);\n\tconst seekable = useMediaSelector((state) => state.mediaSeekable);\n\tconst { max } = getSeekBounds(seekable, duration);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={`Seek forward ${seekOffset} seconds`}\n\t\t\tdata-slot=\"media-player-seek-forward\"\n\t\t\tclassName={className}\n\t\t\ttooltip={`Forward ${seekOffset}s`}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\tdetail:\n\t\t\t\t\t\tmax > 0\n\t\t\t\t\t\t\t? Math.min(max, currentTime + seekOffset)\n\t\t\t\t\t\t\t: currentTime + seekOffset,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RotateCw />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerVolume({\n\tclassName,\n\tdisabled,\n\texpandable = false,\n\tonClick,\n\trangeClassName,\n\t...props\n}: MediaPlayerVolumeProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst muted = useMediaSelector((state) => state.mediaMuted === true);\n\tconst volume = useMediaSelector((state) => state.mediaVolume ?? 1);\n\tconst unavailable = useMediaSelector(\n\t\t(state) => !!state.mediaVolumeUnavailable,\n\t);\n\tconst resolvedDisabled = disabled || unavailable;\n\tconst Icon =\n\t\tmuted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"media-player-volume\"\n\t\t\tclassName={cn(\n\t\t\t\t\"group/volume flex items-center gap-2 rounded-full\",\n\t\t\t\texpandable &&\n\t\t\t\t\t\"w-9 overflow-visible transition-[width] hover:w-32 focus-within:w-32\",\n\t\t\t)}\n\t\t>\n\t\t\t<MediaControlButton\n\t\t\t\taria-label={muted ? \"Unmute media\" : \"Mute media\"}\n\t\t\t\taria-pressed={muted}\n\t\t\t\tclassName={className}\n\t\t\t\tdisabled={resolvedDisabled}\n\t\t\t\tshortcut=\"M\"\n\t\t\t\ttooltip=\"Volume\"\n\t\t\t\tonClick={(event) => {\n\t\t\t\t\tonClick?.(event);\n\n\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: muted\n\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_UNMUTE_REQUEST\n\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_MUTE_REQUEST,\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t</MediaControlButton>\n\t\t\t<SliderPrimitive.Root\n\t\t\t\tdata-slot=\"media-player-volume-slider\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex h-8 w-20 min-w-20 touch-none items-center\",\n\t\t\t\t\tresolvedDisabled && \"pointer-events-none opacity-45\",\n\t\t\t\t\texpandable &&\n\t\t\t\t\t\t\"pointer-events-none opacity-0 transition-opacity group-hover/volume:pointer-events-auto group-hover/volume:opacity-100 group-focus-within/volume:pointer-events-auto group-focus-within/volume:opacity-100\",\n\t\t\t\t\trangeClassName,\n\t\t\t\t)}\n\t\t\t\tdisabled={resolvedDisabled}\n\t\t\t\tmax={1}\n\t\t\t\tmin={0}\n\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\tconst nextValue = Array.isArray(value) ? (value[0] ?? 0) : value;\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_VOLUME_REQUEST,\n\t\t\t\t\t\tdetail: nextValue,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (muted && nextValue > 0) {\n\t\t\t\t\t\tdispatch({ type: MediaActionTypes.MEDIA_UNMUTE_REQUEST });\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tstep={0.02}\n\t\t\t\tvalue={muted ? 0 : volume}\n\t\t\t>\n\t\t\t\t<SliderPrimitive.Control className=\"flex h-8 w-full items-center\">\n\t\t\t\t\t<SliderPrimitive.Track className=\"h-1.5 w-full rounded-full bg-fg-on-brand/30\">\n\t\t\t\t\t\t<SliderPrimitive.Indicator className=\"rounded-full bg-fg-on-brand\" />\n\t\t\t\t\t\t<SliderPrimitive.Thumb\n\t\t\t\t\t\t\tgetAriaLabel={() => \"Media volume\"}\n\t\t\t\t\t\t\tclassName=\"size-3 rounded-full bg-fg-on-brand shadow-1 outline-none focus-visible:[filter:drop-shadow(0_0_0.25rem_var(--color-line-focus))]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SliderPrimitive.Track>\n\t\t\t\t</SliderPrimitive.Control>\n\t\t\t</SliderPrimitive.Root>\n\t\t</div>\n\t);\n}\n\nfunction MediaPlayerPlaybackSpeed({\n\tclassName,\n\trates = DEFAULT_PLAYBACK_RATES,\n\t...props\n}: MediaPlayerPlaybackSpeedProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst { onMenuOpenChange, portalContainer } =\n\t\tReact.useContext(MediaPlayerContext);\n\tconst playbackRate = useMediaSelector(\n\t\t(state) => state.mediaPlaybackRate ?? 1,\n\t);\n\tconst rateLabel = formatRate(playbackRate);\n\n\treturn (\n\t\t<DropdownMenu size=\"sm\" onOpenChange={onMenuOpenChange}>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\taria-label={`Playback speed ${rateLabel}`}\n\t\t\t\t\t\tdata-slot=\"media-player-playback-speed\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-auto px-3 text-gdt-xs font-bold tabular-nums\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttooltip=\"Playback speed\"\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t{rateLabel}\n\t\t\t\t\t</MediaControlButton>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenuContent\n\t\t\t\talign=\"end\"\n\t\t\t\tclassName=\"min-w-24\"\n\t\t\t\tcontainer={portalContainer ?? undefined}\n\t\t\t\tside=\"top\"\n\t\t\t\tsideOffset={8}\n\t\t\t>\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={String(playbackRate)}\n\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_PLAYBACK_RATE_REQUEST,\n\t\t\t\t\t\t\tdetail: Number(value),\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{rates.map((rate) => (\n\t\t\t\t\t\t<DropdownMenuRadioItem key={rate} closeOnClick value={String(rate)}>\n\t\t\t\t\t\t\t{formatRate(rate)}\n\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t))}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction MediaPlayerCaptions({\n\tclassName,\n\tdisabled,\n\tonClick,\n\t...props\n}: MediaPlayerCaptionsProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst subtitlesList = useMediaSelector((state) => state.mediaSubtitlesList);\n\tconst subtitlesShowing = useMediaSelector(\n\t\t(state) => state.mediaSubtitlesShowing,\n\t);\n\tconst hasSubtitles = (subtitlesList?.length ?? 0) > 0;\n\tconst showing = (subtitlesShowing?.length ?? 0) > 0;\n\tconst Icon = showing ? Captions : CaptionsOff;\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={showing ? \"Disable captions\" : \"Enable captions\"}\n\t\t\taria-pressed={showing}\n\t\t\tdata-slot=\"media-player-captions\"\n\t\t\tclassName={className}\n\t\t\tdisabled={disabled || !hasSubtitles}\n\t\t\tshortcut=\"C\"\n\t\t\ttooltip=\"Captions\"\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({ type: MediaActionTypes.MEDIA_TOGGLE_SUBTITLES_REQUEST });\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Icon />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerSettings({\n\tclassName,\n\trates = DEFAULT_PLAYBACK_RATES,\n\t...props\n}: MediaPlayerSettingsProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst { onMenuOpenChange, portalContainer } =\n\t\tReact.useContext(MediaPlayerContext);\n\tconst playbackRate = useMediaSelector(\n\t\t(state) => state.mediaPlaybackRate ?? 1,\n\t);\n\tconst subtitlesList = useMediaSelector((state) => state.mediaSubtitlesList);\n\tconst subtitlesShowing = useMediaSelector(\n\t\t(state) => state.mediaSubtitlesShowing,\n\t);\n\tconst subtitles = subtitlesList ?? [];\n\tconst showingTrack = subtitlesShowing?.[0];\n\tconst captionsValue = showingTrack ? subtitleTrackId(showingTrack) : \"off\";\n\tconst captionsLabel = showingTrack ? subtitleTrackLabel(showingTrack) : \"Off\";\n\n\treturn (\n\t\t<DropdownMenu size=\"sm\" onOpenChange={onMenuOpenChange}>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\taria-label=\"Player settings\"\n\t\t\t\t\t\tdata-slot=\"media-player-settings\"\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\ttooltip=\"Settings\"\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Settings />\n\t\t\t\t\t</MediaControlButton>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenuContent\n\t\t\t\talign=\"end\"\n\t\t\t\tclassName=\"min-w-48\"\n\t\t\t\tcontainer={portalContainer ?? undefined}\n\t\t\t\tside=\"top\"\n\t\t\t\tsideOffset={8}\n\t\t\t>\n\t\t\t\t<DropdownMenuSub>\n\t\t\t\t\t<DropdownMenuSubTrigger>\n\t\t\t\t\t\tSpeed\n\t\t\t\t\t\t<span className=\"ml-auto rounded-md bg-surface px-1.5 py-0.5 text-gdt-xs font-bold tabular-nums\">\n\t\t\t\t\t\t\t{formatRate(playbackRate)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</DropdownMenuSubTrigger>\n\t\t\t\t\t<DropdownMenuSubContent container={portalContainer ?? undefined}>\n\t\t\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\t\t\tvalue={String(playbackRate)}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_PLAYBACK_RATE_REQUEST,\n\t\t\t\t\t\t\t\t\tdetail: Number(value),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{rates.map((rate) => (\n\t\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\t\tkey={rate}\n\t\t\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t\t\t\tvalue={String(rate)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{formatRate(rate)}\n\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t\t\t</DropdownMenuSubContent>\n\t\t\t\t</DropdownMenuSub>\n\t\t\t\t{subtitles.length > 0 ? (\n\t\t\t\t\t<DropdownMenuSub>\n\t\t\t\t\t\t<DropdownMenuSubTrigger>\n\t\t\t\t\t\t\tCaptions\n\t\t\t\t\t\t\t<span className=\"ml-auto rounded-md bg-surface px-1.5 py-0.5 text-gdt-xs font-bold\">\n\t\t\t\t\t\t\t\t{captionsLabel}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</DropdownMenuSubTrigger>\n\t\t\t\t\t\t<DropdownMenuSubContent container={portalContainer ?? undefined}>\n\t\t\t\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\t\t\t\tvalue={captionsValue}\n\t\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\t\tif (subtitlesShowing?.length) {\n\t\t\t\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_DISABLE_SUBTITLES_REQUEST,\n\t\t\t\t\t\t\t\t\t\t\tdetail: subtitlesShowing,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst track = subtitles.find(\n\t\t\t\t\t\t\t\t\t\t(candidate) => subtitleTrackId(candidate) === value,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tif (track) {\n\t\t\t\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_SHOW_SUBTITLES_REQUEST,\n\t\t\t\t\t\t\t\t\t\t\tdetail: [track],\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DropdownMenuRadioItem closeOnClick value=\"off\">\n\t\t\t\t\t\t\t\t\tOff\n\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t\t{subtitles.map((track) => (\n\t\t\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\t\t\tkey={subtitleTrackId(track)}\n\t\t\t\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t\t\t\t\tvalue={subtitleTrackId(track)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{subtitleTrackLabel(track)}\n\t\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t\t\t\t</DropdownMenuSubContent>\n\t\t\t\t\t</DropdownMenuSub>\n\t\t\t\t) : null}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction MediaPlayerTime({\n\tclassName,\n\tshowDuration = true,\n\t...props\n}: MediaPlayerTimeProps) {\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\tconst duration = useMediaSelector((state) => state.mediaDuration);\n\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"media-player-time\"\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex shrink-0 items-center px-1 text-gdt-sm font-medium tabular-nums text-fg-on-brand/80\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{showDuration\n\t\t\t\t? `${formatTime(currentTime)} / ${formatTime(duration)}`\n\t\t\t\t: formatTime(currentTime)}\n\t\t</span>\n\t);\n}\n\nfunction MediaPlayerSeek({\n\tclassName,\n\tdisabled,\n\tonValueChange,\n\t\"aria-label\": ariaLabel,\n\tstep = 5,\n\twithTime = true,\n\t...props\n}: MediaPlayerSeekProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst { portalContainer } = React.useContext(MediaPlayerContext);\n\tconst controlRef = React.useRef<HTMLDivElement | null>(null);\n\tconst [dragValue, setDragValue] = React.useState<number | null>(null);\n\tconst [hoverValue, setHoverValue] = React.useState<number | null>(null);\n\tconst [pendingSeek, setPendingSeek] = React.useState<number | null>(null);\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\tconst duration = useMediaSelector((state) => state.mediaDuration);\n\tconst seekable = useMediaSelector((state) => state.mediaSeekable);\n\tconst buffered = useMediaSelector((state) => state.mediaBuffered);\n\tconst previewImage = useMediaSelector((state) => state.mediaPreviewImage);\n\tconst previewCoords = useMediaSelector((state) => state.mediaPreviewCoords);\n\tconst chapterCues = useMediaSelector((state) => state.mediaChaptersCues);\n\tconst { min, max } = getSeekBounds(seekable, duration);\n\tconst canSeek = max > min;\n\tconst resolvedDisabled = disabled || !canSeek;\n\n\tconst seekRafRef = React.useRef<number | null>(null);\n\tconst latestSeekValueRef = React.useRef(0);\n\n\t// While scrubbing, the slider value drives the UI; after release the seek\n\t// target keeps driving it until the media element catches up, so the thumb\n\t// never snaps back to a stale currentTime.\n\tconst displayTime = clamp(dragValue ?? pendingSeek ?? currentTime, min, max);\n\n\t// Fine enough that dragging feels continuous; `step` (default 5s) maps to\n\t// PageUp/PageDown via largeStep.\n\tconst sliderStep = canSeek ? clamp((max - min) / 500, 0.05, 1) : 1;\n\n\tReact.useEffect(() => {\n\t\tif (pendingSeek !== null && Math.abs(currentTime - pendingSeek) < 0.5) {\n\t\t\tsetPendingSeek(null);\n\t\t}\n\t}, [currentTime, pendingSeek]);\n\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tif (seekRafRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(seekRafRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst queueSeek = (value: number) => {\n\t\tlatestSeekValueRef.current = value;\n\n\t\tif (seekRafRef.current !== null) {\n\t\t\treturn;\n\t\t}\n\n\t\tseekRafRef.current = requestAnimationFrame(() => {\n\t\t\tseekRafRef.current = null;\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\tdetail: latestSeekValueRef.current,\n\t\t\t});\n\t\t});\n\t};\n\n\tconst previewAt = (value: number) => {\n\t\tdispatch({\n\t\t\ttype: MediaActionTypes.MEDIA_PREVIEW_REQUEST,\n\t\t\tdetail: clamp(value, min, max),\n\t\t});\n\t};\n\n\tconst clearPreview = () => {\n\t\tsetHoverValue(null);\n\t\tdispatch({\n\t\t\ttype: MediaActionTypes.MEDIA_PREVIEW_REQUEST,\n\t\t\tdetail: undefined,\n\t\t});\n\t};\n\n\tconst previewValue = dragValue ?? hoverValue;\n\tconst previewPercent =\n\t\tpreviewValue !== null && canSeek\n\t\t\t? ((clamp(previewValue, min, max) - min) / (max - min)) * 100\n\t\t\t: 0;\n\tconst previewChapter =\n\t\tpreviewValue !== null\n\t\t\t? chapterCues?.find(\n\t\t\t\t\t(cue) => previewValue >= cue.startTime && previewValue < cue.endTime,\n\t\t\t\t)\n\t\t\t: undefined;\n\tconst previewCoordValues = previewCoords?.map(Number);\n\tconst hasSpriteCoords =\n\t\tpreviewCoordValues?.length === 4 && (previewCoordValues[2] ?? 0) > 0;\n\tconst previewScale = hasSpriteCoords\n\t\t? SEEK_PREVIEW_WIDTH / (previewCoordValues?.[2] ?? 1)\n\t\t: 1;\n\tconst previewClampPx = previewImage ? SEEK_PREVIEW_WIDTH / 2 + 4 : 32;\n\n\t// The preview renders through a portal with fixed positioning: the player\n\t// root is overflow-hidden, which would clip it on compact (audio) layouts.\n\tconst controlRect =\n\t\twithTime && previewValue !== null\n\t\t\t? controlRef.current?.getBoundingClientRect()\n\t\t\t: undefined;\n\tconst previewLeft = controlRect\n\t\t? clamp(\n\t\t\t\tcontrolRect.left + (previewPercent / 100) * controlRect.width,\n\t\t\t\tcontrolRect.left + previewClampPx,\n\t\t\t\tcontrolRect.right - previewClampPx,\n\t\t\t)\n\t\t: 0;\n\n\t// One track segment per chapter (single segment without chapters); each\n\t// segment clips its own buffered/played fills so every edge stays rounded.\n\tconst segmentBounds = canSeek\n\t\t? [\n\t\t\t\tmin,\n\t\t\t\t...(chapterCues ?? [])\n\t\t\t\t\t.map((cue) => cue.startTime)\n\t\t\t\t\t.filter((time) => time > min && time < max)\n\t\t\t\t\t.sort((a, b) => a - b),\n\t\t\t\tmax,\n\t\t\t]\n\t\t: [0, 1];\n\tconst segments = segmentBounds.slice(0, -1).map((start, index) => ({\n\t\tstart,\n\t\tend: segmentBounds[index + 1] ?? start,\n\t}));\n\n\treturn (\n\t\t<SliderPrimitive.Root\n\t\t\tdata-slot=\"media-player-seek\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-8 w-full min-w-0 touch-none items-center\",\n\t\t\t\tresolvedDisabled && \"pointer-events-none opacity-45\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tdisabled={resolvedDisabled}\n\t\t\tlargeStep={step}\n\t\t\tmax={canSeek ? max : 100}\n\t\t\tmin={min}\n\t\t\tonValueChange={(value) => {\n\t\t\t\tconst nextValue = Array.isArray(value) ? (value[0] ?? 0) : value;\n\t\t\t\tsetDragValue(nextValue);\n\t\t\t\tpreviewAt(nextValue);\n\t\t\t\tqueueSeek(nextValue);\n\t\t\t\tonValueChange?.(nextValue);\n\t\t\t}}\n\t\t\tonValueCommitted={(value) => {\n\t\t\t\tconst nextValue = clamp(\n\t\t\t\t\tArray.isArray(value) ? (value[0] ?? 0) : value,\n\t\t\t\t\tmin,\n\t\t\t\t\tmax,\n\t\t\t\t);\n\n\t\t\t\tif (seekRafRef.current !== null) {\n\t\t\t\t\tcancelAnimationFrame(seekRafRef.current);\n\t\t\t\t\tseekRafRef.current = null;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\tdetail: nextValue,\n\t\t\t\t});\n\t\t\t\tsetPendingSeek(nextValue);\n\t\t\t\tsetDragValue(null);\n\t\t\t\tclearPreview();\n\t\t\t}}\n\t\t\tstep={sliderStep}\n\t\t\tvalue={displayTime}\n\t\t\t{...props}\n\t\t>\n\t\t\t{withTime &&\n\t\t\t\tpreviewValue !== null &&\n\t\t\t\tcontrolRect &&\n\t\t\t\tReactDOM.createPortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"pointer-events-none fixed z-50 flex -translate-x-1/2 -translate-y-full flex-col items-center overflow-hidden rounded-lg bg-surface-overlay text-fg-primary shadow-2\"\n\t\t\t\t\t\tdata-slot=\"media-player-seek-preview\"\n\t\t\t\t\t\tstyle={{ left: previewLeft, top: controlRect.top - 6 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{previewImage ? (\n\t\t\t\t\t\t\thasSpriteCoords ? (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"relative block overflow-hidden bg-line-subtle/50\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\twidth: SEEK_PREVIEW_WIDTH,\n\t\t\t\t\t\t\t\t\t\theight: (previewCoordValues?.[3] ?? 0) * previewScale,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={previewImage}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 left-0 max-w-none origin-top-left\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\ttransform: `scale(${previewScale}) translate(${-(previewCoordValues?.[0] ?? 0)}px, ${-(previewCoordValues?.[1] ?? 0)}px)`,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={previewImage}\n\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t\t\tclassName=\"block aspect-video bg-line-subtle/50 object-cover\"\n\t\t\t\t\t\t\t\t\tstyle={{ width: SEEK_PREVIEW_WIDTH }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{previewChapter?.text ? (\n\t\t\t\t\t\t\t<span className=\"max-w-40 truncate px-2.5 pt-1 text-gdt-xs font-bold\">\n\t\t\t\t\t\t\t\t{previewChapter.text}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"px-2.5 py-1 text-gdt-xs font-bold tabular-nums\",\n\t\t\t\t\t\t\t\t(previewImage || previewChapter?.text) && \"pt-0.5 pb-1.5\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{formatTime(previewValue)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>,\n\t\t\t\t\tportalContainer ?? document.body,\n\t\t\t\t)}\n\t\t\t<SliderPrimitive.Control\n\t\t\t\tref={controlRef}\n\t\t\t\tclassName=\"flex h-8 w-full items-center\"\n\t\t\t\tonPointerLeave={() => {\n\t\t\t\t\tif (dragValue === null) {\n\t\t\t\t\t\tclearPreview();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tif (resolvedDisabled || dragValue !== null) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst next = getSeekValueFromPointer(event, min, max);\n\t\t\t\t\tsetHoverValue(next.value);\n\t\t\t\t\tpreviewAt(next.value);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<SliderPrimitive.Track className=\"relative flex h-2 w-full items-center gap-[3px]\">\n\t\t\t\t\t{segments.map(({ start, end }) => {\n\t\t\t\t\t\tconst span = end - start || 1;\n\t\t\t\t\t\tconst fraction = (value: number) =>\n\t\t\t\t\t\t\tclamp((clamp(value, start, end) - start) / span, 0, 1);\n\t\t\t\t\t\tconst playedWidth = fraction(displayTime) * 100;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={start}\n\t\t\t\t\t\t\t\tdata-slot=\"media-player-seek-segment\"\n\t\t\t\t\t\t\t\tclassName=\"relative h-full overflow-hidden rounded-full bg-line-subtle/65\"\n\t\t\t\t\t\t\t\tstyle={{ width: `${(span / (max - min || 1)) * 100}%` }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{canSeek &&\n\t\t\t\t\t\t\t\t\tbuffered?.map(([bufferStart, bufferEnd]) =>\n\t\t\t\t\t\t\t\t\t\tbufferEnd > start && bufferStart < end ? (\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tkey={`${bufferStart}-${bufferEnd}`}\n\t\t\t\t\t\t\t\t\t\t\t\tdata-slot=\"media-player-seek-buffered\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-y-0 bg-fg-on-brand/25\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tleft: `${fraction(bufferStart) * 100}%`,\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: `${(fraction(bufferEnd) - fraction(bufferStart)) * 100}%`,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tdata-slot=\"media-player-seek-progress\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"absolute inset-y-0 left-0 bg-surface-brand\",\n\t\t\t\t\t\t\t\t\t\tdragValue === null &&\n\t\t\t\t\t\t\t\t\t\t\t\"transition-[width] duration-200 ease-linear\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ width: `${playedWidth}%` }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</SliderPrimitive.Track>\n\t\t\t\t<SliderPrimitive.Thumb\n\t\t\t\t\tgetAriaLabel={() => ariaLabel ?? \"Media timeline\"}\n\t\t\t\t\tgetAriaValueText={(_formatted, value) =>\n\t\t\t\t\t\t`${formatTime(value)} of ${formatTime(max)}`\n\t\t\t\t\t}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"size-3.5 -translate-x-1/2 rounded-full bg-surface-overlay shadow-2 ring-2 ring-surface-brand outline-none\",\n\t\t\t\t\t\t\"transition-[inset-inline-start,transform] duration-200 ease-linear data-[dragging]:scale-125 data-[dragging]:transition-transform\",\n\t\t\t\t\t\t\"focus-visible:[filter:drop-shadow(0_0_0.25rem_var(--color-line-focus))]\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</SliderPrimitive.Control>\n\t\t</SliderPrimitive.Root>\n\t);\n}\n\nfunction MediaPlayerLoop({\n\tclassName,\n\tonClick,\n\t...props\n}: MediaPlayerLoopProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst loop = useMediaSelector((state) => state.mediaLoop === true);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={loop ? \"Disable loop\" : \"Enable loop\"}\n\t\t\taria-pressed={loop}\n\t\t\tdata-slot=\"media-player-loop\"\n\t\t\tclassName={className}\n\t\t\ttooltip={loop ? \"Disable loop\" : \"Enable loop\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_LOOP_REQUEST,\n\t\t\t\t\tdetail: !loop,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Repeat2 />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerPiP({\n\tclassName,\n\tdisabled,\n\tonClick,\n\t...props\n}: MediaPlayerPiPProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst isPip = useMediaSelector((state) => state.mediaIsPip === true);\n\tconst unavailable = useMediaSelector((state) => !!state.mediaPipUnavailable);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={\n\t\t\t\tisPip ? \"Exit picture in picture\" : \"Enter picture in picture\"\n\t\t\t}\n\t\t\taria-pressed={isPip}\n\t\t\tdata-slot=\"media-player-pip\"\n\t\t\tclassName={className}\n\t\t\tdisabled={disabled || unavailable}\n\t\t\ttooltip={isPip ? \"Exit picture in picture\" : \"Picture in picture\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isPip\n\t\t\t\t\t\t? MediaActionTypes.MEDIA_EXIT_PIP_REQUEST\n\t\t\t\t\t\t: MediaActionTypes.MEDIA_ENTER_PIP_REQUEST,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<PictureInPicture2 />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerFullscreen({\n\tclassName,\n\tdisabled,\n\tonClick,\n\t...props\n}: MediaPlayerFullscreenProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst isFullscreen = useMediaSelector(\n\t\t(state) => state.mediaIsFullscreen === true,\n\t);\n\tconst unavailable = useMediaSelector(\n\t\t(state) => !!state.mediaFullscreenUnavailable,\n\t);\n\tconst Icon = isFullscreen ? Minimize : Maximize;\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n\t\t\taria-pressed={isFullscreen}\n\t\t\tdata-slot=\"media-player-fullscreen\"\n\t\t\tclassName={className}\n\t\t\tdisabled={disabled || unavailable}\n\t\t\tshortcut=\"F\"\n\t\t\ttooltip={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t? MediaActionTypes.MEDIA_EXIT_FULLSCREEN_REQUEST\n\t\t\t\t\t\t: MediaActionTypes.MEDIA_ENTER_FULLSCREEN_REQUEST,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Icon />\n\t\t</MediaControlButton>\n\t);\n}\n\nconst MEDIA_ERROR_CONTENT: Record<\n\tnumber,\n\t{ title: string; description: string }\n> = {\n\t1: {\n\t\ttitle: \"Playback interrupted\",\n\t\tdescription: \"Loading the media was interrupted.\",\n\t},\n\t2: {\n\t\ttitle: \"Connection error\",\n\t\tdescription: \"A network error kept the media from loading.\",\n\t},\n\t3: {\n\t\ttitle: \"Playback error\",\n\t\tdescription: \"The media could not be decoded.\",\n\t},\n\t4: {\n\t\ttitle: \"Unsupported format\",\n\t\tdescription: \"The media format is not supported.\",\n\t},\n};\n\nfunction MediaPlayerError({\n\tchildren,\n\tclassName,\n\t...props\n}: MediaPlayerErrorProps) {\n\tconst { rootNode } = React.useContext(MediaPlayerContext);\n\tconst mediaError = useMediaSelector((state) => state.mediaError);\n\tconst [sourceFailed, setSourceFailed] = React.useState(false);\n\n\t// When all <source> children fail, the error event fires on the <source>\n\t// element and media.error stays null, so the media store never reports it.\n\t// Catch it in the capture phase and inspect networkState instead.\n\tReact.useEffect(() => {\n\t\tif (!rootNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst update = () => {\n\t\t\tconst media = rootNode.querySelector<HTMLMediaElement>(\"video, audio\");\n\t\t\tsetSourceFailed(\n\t\t\t\t!!media &&\n\t\t\t\t\tmedia.networkState === HTMLMediaElement.NETWORK_NO_SOURCE &&\n\t\t\t\t\tmedia.readyState === HTMLMediaElement.HAVE_NOTHING,\n\t\t\t);\n\t\t};\n\n\t\tupdate();\n\t\trootNode.addEventListener(\"error\", update, true);\n\t\trootNode.addEventListener(\"loadstart\", update, true);\n\t\trootNode.addEventListener(\"loadedmetadata\", update, true);\n\n\t\treturn () => {\n\t\t\trootNode.removeEventListener(\"error\", update, true);\n\t\t\trootNode.removeEventListener(\"loadstart\", update, true);\n\t\t\trootNode.removeEventListener(\"loadedmetadata\", update, true);\n\t\t};\n\t}, [rootNode]);\n\n\tconst error: { code?: number } | null =\n\t\tmediaError ?? (sourceFailed ? { code: 4 } : null);\n\n\tif (!error) {\n\t\treturn null;\n\t}\n\n\tconst content = MEDIA_ERROR_CONTENT[error.code ?? 0] ?? {\n\t\ttitle: \"Something went wrong\",\n\t\tdescription: \"The media could not be played.\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"media-player-error\"\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-0 z-20 flex flex-col items-center justify-center gap-1 bg-canvas/85 px-6 text-center text-fg-primary backdrop-blur-sm rounded-2xl\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? (\n\t\t\t\t<>\n\t\t\t\t\t<TriangleAlert\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"mb-2 size-9 text-fg-danger\"\n\t\t\t\t\t/>\n\t\t\t\t\t<p className=\"text-gdt-lg font-bold\">{content.title}</p>\n\t\t\t\t\t<p className=\"text-gdt-sm text-fg-secondary\">{content.description}</p>\n\t\t\t\t\t<div className=\"mt-4 flex items-center gap-2\">\n\t\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\t\tclassName=\"w-auto gap-1.5 px-4 text-gdt-xs font-bold [&_svg]:size-3.5\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\trootNode\n\t\t\t\t\t\t\t\t\t?.querySelector<HTMLMediaElement>(\"video, audio\")\n\t\t\t\t\t\t\t\t\t?.load();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshCcw />\n\t\t\t\t\t\t\tTry again\n\t\t\t\t\t\t</MediaControlButton>\n\t\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\t\tclassName=\"w-auto gap-1.5 px-4 text-gdt-xs font-bold [&_svg]:size-3.5\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RotateCcw />\n\t\t\t\t\t\t\tReload page\n\t\t\t\t\t\t</MediaControlButton>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport {\n\tMediaPlayer,\n\tMediaPlayerAudio,\n\tMediaPlayerCaptions,\n\tMediaPlayerControls,\n\tMediaPlayerControlsOverlay,\n\tMediaPlayerError,\n\tMediaPlayerFullscreen,\n\tMediaPlayerLoop,\n\tMediaPlayerPiP,\n\tMediaPlayerPlay,\n\tMediaPlayerPlaybackSpeed,\n\tMediaPlayerSeek,\n\tMediaPlayerSeekBackward,\n\tMediaPlayerSeekForward,\n\tMediaPlayerSettings,\n\tMediaPlayerTime,\n\tMediaPlayerVideo,\n\tMediaPlayerVolume,\n};\n"],"mappings":"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","names":[]}
|
package/dist/number-input.js
CHANGED
|
@@ -1,322 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
import {
|
|
2
|
+
InputGroup,
|
|
3
|
+
InputGroupAddon,
|
|
4
|
+
InputGroupButton,
|
|
5
|
+
InputGroupInput
|
|
6
|
+
} from "./chunk-6ZSGQHH2.js";
|
|
7
|
+
import "./chunk-KSMDANKI.js";
|
|
8
|
+
import "./chunk-MEKCCOP5.js";
|
|
9
|
+
import "./chunk-3ACQVT7A.js";
|
|
10
|
+
import "./chunk-B4H6RNDH.js";
|
|
11
|
+
import {
|
|
12
|
+
SizeProvider,
|
|
13
|
+
useComponentSize
|
|
14
|
+
} from "./chunk-HL3ZSYES.js";
|
|
15
|
+
import {
|
|
16
|
+
cn
|
|
17
|
+
} from "./chunk-Y4TTYVNE.js";
|
|
18
|
+
|
|
19
|
+
// src/number-input.tsx
|
|
2
20
|
import {
|
|
3
21
|
NumberField
|
|
4
22
|
} from "@base-ui/react/number-field";
|
|
5
23
|
import { MinusIcon, PlusIcon } from "lucide-react";
|
|
6
|
-
|
|
7
|
-
// src/lib/cn.ts
|
|
8
|
-
import { clsx } from "clsx";
|
|
9
|
-
import { extendTailwindMerge } from "tailwind-merge";
|
|
10
|
-
var twMerge = extendTailwindMerge({
|
|
11
|
-
extend: {
|
|
12
|
-
classGroups: {
|
|
13
|
-
"font-size": [
|
|
14
|
-
{
|
|
15
|
-
text: [
|
|
16
|
-
"gdt-display",
|
|
17
|
-
"gdt-h1",
|
|
18
|
-
"gdt-h2",
|
|
19
|
-
"gdt-h3",
|
|
20
|
-
"gdt-h4",
|
|
21
|
-
"gdt-h5",
|
|
22
|
-
"gdt-xl",
|
|
23
|
-
"gdt-lg",
|
|
24
|
-
"gdt-md",
|
|
25
|
-
"gdt-sm",
|
|
26
|
-
"gdt-xs",
|
|
27
|
-
"gdt-subtext",
|
|
28
|
-
"gdt-capitalized"
|
|
29
|
-
]
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
function cn(...inputs) {
|
|
36
|
-
return twMerge(clsx(inputs));
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// src/components/ui/input-group.tsx
|
|
40
|
-
import { cva as cva3 } from "class-variance-authority";
|
|
41
|
-
|
|
42
|
-
// src/components/ui/button.tsx
|
|
43
|
-
import { Button as ButtonPrimitive } from "@base-ui/react/button";
|
|
44
|
-
import { cva } from "class-variance-authority";
|
|
45
|
-
import { Loader } from "lucide-react";
|
|
46
|
-
|
|
47
|
-
// src/components/ui/size-context.tsx
|
|
48
|
-
import { createContext, useContext } from "react";
|
|
49
|
-
import { Fragment, jsx } from "react/jsx-runtime";
|
|
50
|
-
var SizeContext = createContext(void 0);
|
|
51
|
-
function SizeProvider({
|
|
52
|
-
children,
|
|
53
|
-
size
|
|
54
|
-
}) {
|
|
55
|
-
if (!size) {
|
|
56
|
-
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
57
|
-
}
|
|
58
|
-
return /* @__PURE__ */ jsx(SizeContext.Provider, { value: size, children });
|
|
59
|
-
}
|
|
60
|
-
function useComponentSize(size, fallback = "md") {
|
|
61
|
-
const inheritedSize = useContext(SizeContext);
|
|
62
|
-
return size ?? inheritedSize ?? fallback;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// src/components/ui/button.tsx
|
|
66
|
-
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
67
|
-
var buttonVariants = cva(
|
|
68
|
-
"group/button inline-flex shrink-0 items-center justify-center rounded-full bg-clip-padding whitespace-nowrap font-bold transition-[background-color,color,border-color,box-shadow,transform] outline-none select-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
69
|
-
{
|
|
70
|
-
variants: {
|
|
71
|
-
variant: {
|
|
72
|
-
primary: "bg-action-primary text-fg-on-brand hover:bg-action-primary-hover active:bg-action-primary-pressed",
|
|
73
|
-
"primary-outline": "border-2 border-action-primary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle",
|
|
74
|
-
secondary: "bg-surface-brand-subtle text-fg-brand hover:bg-action-primary-hover hover:text-fg-on-brand active:bg-action-primary-pressed active:text-fg-on-brand data-focused:bg-action-primary-hover data-pressed:bg-action-primary-pressed data-focused:text-fg-on-brand data-pressed:text-fg-on-brand",
|
|
75
|
-
"secondary-outline": "border-2 border-action-secondary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle",
|
|
76
|
-
tertiary: "bg-action-tertiary text-fg-primary hover:bg-action-tertiary-hover active:bg-action-tertiary-pressed data-focused:bg-action-tertiary-hover data-pressed:bg-action-tertiary-pressed",
|
|
77
|
-
"tertiary-outline": "border border-line-strong bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised",
|
|
78
|
-
ghost: "bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised",
|
|
79
|
-
danger: "bg-action-danger text-fg-on-brand hover:bg-action-danger-hover active:bg-action-danger-pressed data-focused:bg-action-danger-hover data-pressed:bg-action-danger-pressed",
|
|
80
|
-
"glass-overlay": "bg-surface-glass-overlay-button text-fg-on-brand",
|
|
81
|
-
"link-brand": "border-transparent bg-transparent px-0 text-fg-brand hover:underline active:underline active:opacity-70",
|
|
82
|
-
"link-neutral": "border-transparent bg-transparent px-0 text-fg-secondary hover:underline active:underline active:opacity-70"
|
|
83
|
-
},
|
|
84
|
-
size: {
|
|
85
|
-
sm: "h-8 gap-2 px-3.5 text-gdt-xs has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3 [&_svg:not([class*='size-'])]:size-3.5",
|
|
86
|
-
md: "h-10 gap-2 px-4.5 text-gdt-sm has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4",
|
|
87
|
-
lg: "h-12.5 gap-2.5 px-5.5 text-gdt-md has-data-[icon=inline-end]:pr-5 has-data-[icon=inline-start]:pl-5 [&_svg:not([class*='size-'])]:size-4.5",
|
|
88
|
-
xl: "h-14 gap-3 px-6.5 text-gdt-lg has-data-[icon=inline-end]:pr-6 has-data-[icon=inline-start]:pl-6 [&_svg:not([class*='size-'])]:size-5",
|
|
89
|
-
icon: "size-10",
|
|
90
|
-
"icon-xs": "size-6 text-gdt-xs [&_svg:not([class*='size-'])]:size-3",
|
|
91
|
-
"icon-sm": "size-8 text-gdt-sm [&_svg:not([class*='size-'])]:size-3.5",
|
|
92
|
-
"icon-lg": "size-12.5 text-gdt-md [&_svg:not([class*='size-'])]:size-4.5",
|
|
93
|
-
"icon-xl": "size-14 text-gdt-lg [&_svg:not([class*='size-'])]:size-5"
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
defaultVariants: {
|
|
97
|
-
variant: "primary",
|
|
98
|
-
size: "md"
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
);
|
|
102
|
-
function Button({
|
|
103
|
-
className,
|
|
104
|
-
variant = "primary",
|
|
105
|
-
size,
|
|
106
|
-
isLoading = false,
|
|
107
|
-
children,
|
|
108
|
-
disabled = false,
|
|
109
|
-
...props
|
|
110
|
-
}) {
|
|
111
|
-
const inheritedSize = useComponentSize();
|
|
112
|
-
const resolvedSize = size ?? inheritedSize;
|
|
113
|
-
const _disabled = disabled || isLoading;
|
|
114
|
-
return /* @__PURE__ */ jsxs(
|
|
115
|
-
ButtonPrimitive,
|
|
116
|
-
{
|
|
117
|
-
"data-slot": "button",
|
|
118
|
-
className: cn(buttonVariants({ variant, size: resolvedSize, className })),
|
|
119
|
-
disabled: _disabled,
|
|
120
|
-
...props,
|
|
121
|
-
children: [
|
|
122
|
-
isLoading && /* @__PURE__ */ jsx2(Loader, { className: "size-4 animate-spin" }),
|
|
123
|
-
" ",
|
|
124
|
-
children
|
|
125
|
-
]
|
|
126
|
-
}
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// src/components/ui/input.tsx
|
|
131
|
-
import { Input as InputPrimitive } from "@base-ui/react/input";
|
|
132
|
-
import { cva as cva2 } from "class-variance-authority";
|
|
133
|
-
|
|
134
|
-
// src/components/ui/input-size-context.tsx
|
|
135
|
-
import { createContext as createContext2, useContext as useContext2 } from "react";
|
|
136
|
-
import { Fragment as Fragment2, jsx as jsx3 } from "react/jsx-runtime";
|
|
137
|
-
var InputSizeContext = createContext2(
|
|
138
|
-
void 0
|
|
139
|
-
);
|
|
140
|
-
function InputSizeProvider({
|
|
141
|
-
children,
|
|
142
|
-
size
|
|
143
|
-
}) {
|
|
144
|
-
if (!size) {
|
|
145
|
-
return /* @__PURE__ */ jsx3(Fragment2, { children });
|
|
146
|
-
}
|
|
147
|
-
return /* @__PURE__ */ jsx3(InputSizeContext.Provider, { value: size, children });
|
|
148
|
-
}
|
|
149
|
-
function useInputComponentSize(size, fallback = "md") {
|
|
150
|
-
const inheritedSize = useContext2(InputSizeContext);
|
|
151
|
-
return size ?? inheritedSize ?? fallback;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// src/components/ui/input.tsx
|
|
155
|
-
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
156
|
-
var inputVariants = cva2(
|
|
157
|
-
"flex w-full min-w-0 rounded-full border border-line bg-canvas text-fg-primary transition-[background-color,border-color,box-shadow,color] outline-none file:inline-flex file:border-0 file:bg-transparent file:font-normal file:text-fg-primary placeholder:text-fg-muted hover:border-line-strong focus-visible:border-line-focus focus-visible:inset-ring-1 inset-ring-line-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:border-line-subtle disabled:bg-surface disabled:text-fg-muted disabled:placeholder:text-fg-muted aria-invalid:border-line-danger aria-invalid:text-fg-danger aria-invalid:placeholder:text-fg-danger aria-invalid:shadow-none",
|
|
158
|
-
{
|
|
159
|
-
variants: {
|
|
160
|
-
size: {
|
|
161
|
-
sm: "h-8 px-3 text-gdt-xs font-normal file:text-gdt-xs",
|
|
162
|
-
md: "h-10 px-3.5 text-gdt-sm font-normal file:text-gdt-sm",
|
|
163
|
-
lg: "h-12 px-4 text-gdt-md font-normal file:text-gdt-md",
|
|
164
|
-
xl: "h-14 px-4.5 text-gdt-lg font-normal file:text-gdt-lg"
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
defaultVariants: {
|
|
168
|
-
size: "md"
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
);
|
|
172
|
-
function Input({ className, size, type, ...props }) {
|
|
173
|
-
const resolvedSize = useInputComponentSize(size);
|
|
174
|
-
return /* @__PURE__ */ jsx4(
|
|
175
|
-
InputPrimitive,
|
|
176
|
-
{
|
|
177
|
-
type,
|
|
178
|
-
"data-slot": "input",
|
|
179
|
-
"data-size": resolvedSize,
|
|
180
|
-
className: cn(inputVariants({ size: resolvedSize }), className),
|
|
181
|
-
...props
|
|
182
|
-
}
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// src/components/ui/input-group.tsx
|
|
187
|
-
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
188
|
-
var inputGroupVariants = cva3(
|
|
189
|
-
"group/input-group relative flex w-full min-w-0 items-center rounded-full has-[textarea]:rounded-xl has-data-[align=block-end]:rounded-xl has-data-[align=block-start]:rounded-xl border border-line bg-canvas transition-[background-color,border-color,box-shadow,color] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:border-line-subtle has-disabled:bg-surface has-disabled:text-fg-muted focus-within:border-line-focus focus-within:inset-ring-1 inset-ring-line-focus has-[[data-slot][aria-invalid=true]]:border-line-danger has-[[data-slot][aria-invalid=true]]:inset-shadow-none has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=sm]/input-group:pl-2 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=md]/input-group:pl-2.5 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=lg]/input-group:pl-3 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=xl]/input-group:pl-3 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=sm]/input-group:pr-2 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=md]/input-group:pr-2.5 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=lg]/input-group:pr-3 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=xl]/input-group:pr-3",
|
|
190
|
-
{
|
|
191
|
-
variants: {
|
|
192
|
-
size: {
|
|
193
|
-
sm: "h-8",
|
|
194
|
-
md: "h-10",
|
|
195
|
-
lg: "h-12",
|
|
196
|
-
xl: "h-14"
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
defaultVariants: {
|
|
200
|
-
size: "md"
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
);
|
|
204
|
-
function InputGroup({
|
|
205
|
-
className,
|
|
206
|
-
size,
|
|
207
|
-
...props
|
|
208
|
-
}) {
|
|
209
|
-
const inheritedSize = useComponentSize();
|
|
210
|
-
const resolvedSize = size ?? inheritedSize;
|
|
211
|
-
const componentSize = resolvedSize === "xl" ? void 0 : resolvedSize;
|
|
212
|
-
return /* @__PURE__ */ jsx5(SizeProvider, { size: componentSize, children: /* @__PURE__ */ jsx5(InputSizeProvider, { size: resolvedSize, children: /* @__PURE__ */ jsx5(
|
|
213
|
-
"div",
|
|
214
|
-
{
|
|
215
|
-
"data-slot": "input-group",
|
|
216
|
-
"data-size": resolvedSize,
|
|
217
|
-
role: "group",
|
|
218
|
-
className: cn(inputGroupVariants({ size: resolvedSize }), className),
|
|
219
|
-
...props
|
|
220
|
-
}
|
|
221
|
-
) }) });
|
|
222
|
-
}
|
|
223
|
-
var inputGroupAddonVariants = cva3(
|
|
224
|
-
"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-gdt-sm font-normal text-fg-secondary select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[size=lg]/input-group:[&>svg:not([class*='size-'])]:size-4.5 group-data-[size=xl]/input-group:[&>svg:not([class*='size-'])]:size-5 [&>svg:not([class*='size-'])]:size-4",
|
|
225
|
-
{
|
|
226
|
-
variants: {
|
|
227
|
-
align: {
|
|
228
|
-
"inline-start": "order-first group-data-[size=sm]/input-group:pl-3 group-data-[size=md]/input-group:pl-3.5 group-data-[size=lg]/input-group:pl-4 group-data-[size=xl]/input-group:pl-4.5 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]",
|
|
229
|
-
"inline-end": "order-last group-data-[size=sm]/input-group:pr-3 group-data-[size=md]/input-group:pr-3.5 group-data-[size=lg]/input-group:pr-4 group-data-[size=xl]/input-group:pr-4.5 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]",
|
|
230
|
-
"block-start": "order-first w-full justify-start px-3 group-data-[size=md]/input-group:px-3.5 group-data-[size=lg]/input-group:px-4 group-data-[size=xl]/input-group:px-4.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2",
|
|
231
|
-
"block-end": "order-last w-full justify-start px-3 group-data-[size=md]/input-group:px-3.5 group-data-[size=lg]/input-group:px-4 group-data-[size=xl]/input-group:px-4.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"
|
|
232
|
-
}
|
|
233
|
-
},
|
|
234
|
-
defaultVariants: {
|
|
235
|
-
align: "inline-start"
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
);
|
|
239
|
-
function InputGroupAddon({
|
|
240
|
-
className,
|
|
241
|
-
align = "inline-start",
|
|
242
|
-
...props
|
|
243
|
-
}) {
|
|
244
|
-
return (
|
|
245
|
-
// biome-ignore lint/a11y/useSemanticElements: addon is a structural wrapper for grouped input affordances.
|
|
246
|
-
// biome-ignore lint/a11y/useKeyWithClickEvents: click only forwards focus to the sibling input and is not a standalone action target.
|
|
247
|
-
/* @__PURE__ */ jsx5(
|
|
248
|
-
"div",
|
|
249
|
-
{
|
|
250
|
-
role: "group",
|
|
251
|
-
"data-slot": "input-group-addon",
|
|
252
|
-
"data-align": align,
|
|
253
|
-
className: cn(inputGroupAddonVariants({ align }), className),
|
|
254
|
-
onClick: (e) => {
|
|
255
|
-
if (e.target.closest("button")) {
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
e.currentTarget.parentElement?.querySelector("input")?.focus();
|
|
259
|
-
},
|
|
260
|
-
...props
|
|
261
|
-
}
|
|
262
|
-
)
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
var inputGroupButtonVariants = cva3(
|
|
266
|
-
"flex items-center gap-2 text-sm shadow-none rounded-full",
|
|
267
|
-
{
|
|
268
|
-
variants: {
|
|
269
|
-
size: {
|
|
270
|
-
xs: "h-6 gap-1 px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
|
|
271
|
-
sm: "",
|
|
272
|
-
"icon-xs": "size-6 p-0 has-[>svg]:p-0",
|
|
273
|
-
"icon-sm": "size-8 p-0 has-[>svg]:p-0"
|
|
274
|
-
}
|
|
275
|
-
},
|
|
276
|
-
defaultVariants: {
|
|
277
|
-
size: "xs"
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
);
|
|
281
|
-
function InputGroupButton({
|
|
282
|
-
className,
|
|
283
|
-
type = "button",
|
|
284
|
-
variant = "ghost",
|
|
285
|
-
size = "xs",
|
|
286
|
-
...props
|
|
287
|
-
}) {
|
|
288
|
-
return /* @__PURE__ */ jsx5(
|
|
289
|
-
Button,
|
|
290
|
-
{
|
|
291
|
-
type,
|
|
292
|
-
"data-size": size,
|
|
293
|
-
variant,
|
|
294
|
-
className: cn(inputGroupButtonVariants({ size }), className),
|
|
295
|
-
...props
|
|
296
|
-
}
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
function InputGroupInput({
|
|
300
|
-
className,
|
|
301
|
-
size,
|
|
302
|
-
...props
|
|
303
|
-
}) {
|
|
304
|
-
return /* @__PURE__ */ jsx5(
|
|
305
|
-
Input,
|
|
306
|
-
{
|
|
307
|
-
"data-slot": "input-group-control",
|
|
308
|
-
size,
|
|
309
|
-
className: cn(
|
|
310
|
-
"flex-1 rounded-none border-0 bg-transparent shadow-none inset-shadow-none inset-ring-0 focus:border-transparent focus:shadow-none focus:inset-shadow-none focus-visible:border-transparent focus-visible:shadow-none focus-visible:ring-0 focus-visible:inset-ring-0 focus-visible:inset-shadow-none disabled:bg-transparent aria-invalid:ring-0 aria-invalid:inset-ring-0 dark:bg-transparent dark:disabled:bg-transparent",
|
|
311
|
-
className
|
|
312
|
-
),
|
|
313
|
-
...props
|
|
314
|
-
}
|
|
315
|
-
);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// src/components/ui/number-input.tsx
|
|
319
|
-
import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
24
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
320
25
|
var numberInputFormatPresets = {
|
|
321
26
|
compact: {
|
|
322
27
|
compactDisplay: "short",
|
|
@@ -352,12 +57,12 @@ function NumberInput({
|
|
|
352
57
|
}) {
|
|
353
58
|
const resolvedSize = useComponentSize(size);
|
|
354
59
|
const resolvedFormat = format ?? (formatPreset ? numberInputFormatPresets[formatPreset] : void 0) ?? (thousandSeparator ? numberInputFormatPresets.decimal : void 0);
|
|
355
|
-
return /* @__PURE__ */
|
|
356
|
-
/* @__PURE__ */
|
|
60
|
+
return /* @__PURE__ */ jsx(SizeProvider, { size: resolvedSize, children: /* @__PURE__ */ jsx(NumberField.Root, { format: resolvedFormat, ...props, children: /* @__PURE__ */ jsxs(NumberField.Group, { render: /* @__PURE__ */ jsx(InputGroup, {}), children: [
|
|
61
|
+
/* @__PURE__ */ jsx(
|
|
357
62
|
NumberField.Input,
|
|
358
63
|
{
|
|
359
64
|
placeholder,
|
|
360
|
-
render: /* @__PURE__ */
|
|
65
|
+
render: /* @__PURE__ */ jsx(InputGroupInput, {})
|
|
361
66
|
}
|
|
362
67
|
),
|
|
363
68
|
children
|
|
@@ -365,7 +70,7 @@ function NumberInput({
|
|
|
365
70
|
}
|
|
366
71
|
function NumberInputControl() {
|
|
367
72
|
const size = useComponentSize();
|
|
368
|
-
return /* @__PURE__ */
|
|
73
|
+
return /* @__PURE__ */ jsxs(
|
|
369
74
|
InputGroupAddon,
|
|
370
75
|
{
|
|
371
76
|
align: "inline-end",
|
|
@@ -374,12 +79,12 @@ function NumberInputControl() {
|
|
|
374
79
|
size === "lg" && "w-12"
|
|
375
80
|
),
|
|
376
81
|
children: [
|
|
377
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ jsx(
|
|
378
83
|
NumberField.Increment,
|
|
379
84
|
{
|
|
380
85
|
className: "w-full flex-1 rounded-none rounded-tr-full",
|
|
381
|
-
render: /* @__PURE__ */
|
|
382
|
-
children: /* @__PURE__ */
|
|
86
|
+
render: /* @__PURE__ */ jsx(InputGroupButton, { variant: "tertiary" }),
|
|
87
|
+
children: /* @__PURE__ */ jsx(
|
|
383
88
|
PlusIcon,
|
|
384
89
|
{
|
|
385
90
|
className: cn("size-1.5", {
|
|
@@ -390,12 +95,12 @@ function NumberInputControl() {
|
|
|
390
95
|
)
|
|
391
96
|
}
|
|
392
97
|
),
|
|
393
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ jsx(
|
|
394
99
|
NumberField.Decrement,
|
|
395
100
|
{
|
|
396
101
|
className: "w-full flex-1 rounded-none rounded-br-full",
|
|
397
|
-
render: /* @__PURE__ */
|
|
398
|
-
children: /* @__PURE__ */
|
|
102
|
+
render: /* @__PURE__ */ jsx(InputGroupButton, { variant: "tertiary" }),
|
|
103
|
+
children: /* @__PURE__ */ jsx(
|
|
399
104
|
MinusIcon,
|
|
400
105
|
{
|
|
401
106
|
className: cn("size-1.5", {
|