@once-ui-system/core 1.8.5 → 2.0.0-alpha.1
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 +1 -1
- package/ai/catalog.json +166 -78
- package/ai/components/Accordion.json +1 -1
- package/ai/components/BarChart.json +34 -3
- package/ai/components/Book.json +128 -0
- package/ai/components/Button.json +1 -1
- package/ai/components/Card.json +1 -0
- package/ai/components/Carousel.json +1 -1
- package/ai/components/ChartHeader.json +2 -1
- package/ai/components/ChartStatus.json +2 -1
- package/ai/components/Checkbox.json +2 -2
- package/ai/components/CodeBlock.json +23 -2
- package/ai/components/ColorInput.json +1 -1
- package/ai/components/DataTooltip.json +3 -2
- package/ai/components/DatePicker.json +2 -2
- package/ai/components/Dialog.json +1 -1
- package/ai/components/DropdownWrapper.json +6 -4
- package/ai/components/Effect.json +133 -0
- package/ai/components/Fade.json +1 -1
- package/ai/components/Feedback.json +1 -1
- package/ai/components/IconButton.json +1 -1
- package/ai/components/InfoTip.json +125 -0
- package/ai/components/Input.json +5 -4
- package/ai/components/Legend.json +2 -1
- package/ai/components/LineBarChart.json +34 -3
- package/ai/components/LineChart.json +39 -3
- package/ai/components/LinearGauge.json +3 -2
- package/ai/components/LinearGradient.json +2 -1
- package/ai/components/Logo.json +2 -2
- package/ai/components/Media.json +1 -1
- package/ai/components/MediaUpload.json +21 -2
- package/ai/components/Modal.json +1 -1
- package/ai/components/NavGroup.json +130 -0
- package/ai/components/NavIcon.json +1 -1
- package/ai/components/NavItem.json +14 -0
- package/ai/components/Option.json +2 -2
- package/ai/components/Particle.json +1 -1
- package/ai/components/PieChart.json +32 -3
- package/ai/components/ProgressBar.json +1 -1
- package/ai/components/Pulse.json +1 -1
- package/ai/components/RadialGauge.json +4 -3
- package/ai/components/RadialGradient.json +2 -1
- package/ai/components/RadioButton.json +1 -1
- package/ai/components/RevealFx.json +1 -1
- package/ai/components/Scrubber.json +136 -0
- package/ai/components/SegmentedControl.json +3 -3
- package/ai/components/Setting.json +128 -0
- package/ai/components/SettingAxes.json +127 -0
- package/ai/components/SettingGroup.json +129 -0
- package/ai/components/ShineFx.json +1 -1
- package/ai/components/Skeleton.json +2 -3
- package/ai/components/SplitView.json +2 -0
- package/ai/components/StylePanel.json +4 -2
- package/ai/components/Swatch.json +11 -0
- package/ai/components/Swiper.json +1 -1
- package/ai/components/Switch.json +1 -1
- package/ai/components/Tag.json +1 -1
- package/ai/components/Textarea.json +6 -5
- package/ai/components/ThemeSwitcher.json +3 -0
- package/ai/components/Toast.json +1 -1
- package/ai/components/ToggleButton.json +2 -1
- package/ai/eval-tasks.md +10 -1
- package/ai/examples/app-shell.tsx +111 -0
- package/ai/examples/auth.tsx +2 -3
- package/ai/examples/blocks/Dashboard1.tsx +25 -36
- package/ai/examples/blocks/Feed3.tsx +8 -8
- package/ai/examples/blocks/Footer1.tsx +5 -3
- package/ai/examples/blocks/Footer2.tsx +3 -3
- package/ai/examples/blocks/Footer3.tsx +1 -1
- package/ai/examples/blocks/Footer4.tsx +6 -5
- package/ai/examples/blocks/Header1.tsx +7 -6
- package/ai/examples/blocks/Header2.tsx +1 -1
- package/ai/examples/blocks/Header3.tsx +7 -7
- package/ai/examples/blocks/Header4.tsx +6 -7
- package/ai/examples/blocks/Productivity1.tsx +1 -1
- package/ai/examples/blocks/Roadmap1.tsx +3 -3
- package/ai/examples/blocks/Sidebar1.tsx +1 -1
- package/ai/examples/blocks/Sidebar2.tsx +1 -1
- package/ai/examples/blocks/Sidebar4.tsx +1 -1
- package/ai/examples/blocks/Streaming1.tsx +4 -4
- package/ai/examples/blocks/Table1.tsx +9 -9
- package/ai/examples/blocks/Waitlist1.tsx +5 -5
- package/ai/examples/blocks/content/resources.ts +3 -1
- package/ai/examples/dashboard.tsx +13 -14
- package/ai/examples/marketing-hero.tsx +4 -4
- package/ai/examples/pricing.tsx +7 -8
- package/ai/examples/settings.tsx +7 -7
- package/ai/gotchas.json +99 -25
- package/ai/layouts.md +154 -0
- package/ai/manifest.json +3 -2
- package/ai/recipes.md +50 -5
- package/ai/rules.compact.md +26 -5
- package/ai/rules.md +84 -14
- package/ai/spec.json +634 -176
- package/ai/tasks/settings.json +1 -1
- package/dist/AGENTS.md +1 -1
- package/dist/ai/catalog.json +166 -78
- package/dist/ai/components/Accordion.json +1 -1
- package/dist/ai/components/BarChart.json +34 -3
- package/dist/ai/components/Book.json +128 -0
- package/dist/ai/components/Button.json +1 -1
- package/dist/ai/components/Card.json +1 -0
- package/dist/ai/components/Carousel.json +1 -1
- package/dist/ai/components/ChartHeader.json +2 -1
- package/dist/ai/components/ChartStatus.json +2 -1
- package/dist/ai/components/Checkbox.json +2 -2
- package/dist/ai/components/CodeBlock.json +23 -2
- package/dist/ai/components/ColorInput.json +1 -1
- package/dist/ai/components/DataTooltip.json +3 -2
- package/dist/ai/components/DatePicker.json +2 -2
- package/dist/ai/components/Dialog.json +1 -1
- package/dist/ai/components/DropdownWrapper.json +6 -4
- package/dist/ai/components/Effect.json +133 -0
- package/dist/ai/components/Fade.json +1 -1
- package/dist/ai/components/Feedback.json +1 -1
- package/dist/ai/components/IconButton.json +1 -1
- package/dist/ai/components/InfoTip.json +125 -0
- package/dist/ai/components/Input.json +5 -4
- package/dist/ai/components/Legend.json +2 -1
- package/dist/ai/components/LineBarChart.json +34 -3
- package/dist/ai/components/LineChart.json +39 -3
- package/dist/ai/components/LinearGauge.json +3 -2
- package/dist/ai/components/LinearGradient.json +2 -1
- package/dist/ai/components/Logo.json +2 -2
- package/dist/ai/components/Media.json +1 -1
- package/dist/ai/components/MediaUpload.json +21 -2
- package/dist/ai/components/Modal.json +1 -1
- package/dist/ai/components/NavGroup.json +130 -0
- package/dist/ai/components/NavIcon.json +1 -1
- package/dist/ai/components/NavItem.json +14 -0
- package/dist/ai/components/Option.json +2 -2
- package/dist/ai/components/Particle.json +1 -1
- package/dist/ai/components/PieChart.json +32 -3
- package/dist/ai/components/ProgressBar.json +1 -1
- package/dist/ai/components/Pulse.json +1 -1
- package/dist/ai/components/RadialGauge.json +4 -3
- package/dist/ai/components/RadialGradient.json +2 -1
- package/dist/ai/components/RadioButton.json +1 -1
- package/dist/ai/components/RevealFx.json +1 -1
- package/dist/ai/components/Scrubber.json +136 -0
- package/dist/ai/components/SegmentedControl.json +3 -3
- package/dist/ai/components/Setting.json +128 -0
- package/dist/ai/components/SettingAxes.json +127 -0
- package/dist/ai/components/SettingGroup.json +129 -0
- package/dist/ai/components/ShineFx.json +1 -1
- package/dist/ai/components/Skeleton.json +2 -3
- package/dist/ai/components/SplitView.json +2 -0
- package/dist/ai/components/StylePanel.json +4 -2
- package/dist/ai/components/Swatch.json +11 -0
- package/dist/ai/components/Swiper.json +1 -1
- package/dist/ai/components/Switch.json +1 -1
- package/dist/ai/components/Tag.json +1 -1
- package/dist/ai/components/Textarea.json +6 -5
- package/dist/ai/components/ThemeSwitcher.json +3 -0
- package/dist/ai/components/Toast.json +1 -1
- package/dist/ai/components/ToggleButton.json +2 -1
- package/dist/ai/eval-tasks.md +10 -1
- package/dist/ai/gotchas.json +99 -25
- package/dist/ai/layouts.md +154 -0
- package/dist/ai/manifest.json +3 -2
- package/dist/ai/recipes.md +50 -5
- package/dist/ai/rules.compact.md +26 -5
- package/dist/ai/rules.md +84 -14
- package/dist/ai/spec.json +634 -176
- package/dist/ai/tasks/settings.json +1 -1
- package/dist/components/Accordion.d.ts +2 -1
- package/dist/components/Accordion.d.ts.map +1 -1
- package/dist/components/Accordion.js.map +1 -1
- package/dist/components/Avatar.d.ts.map +1 -1
- package/dist/components/Avatar.js +2 -2
- package/dist/components/Avatar.js.map +1 -1
- package/dist/components/Background.d.ts +6 -6
- package/dist/components/Background.d.ts.map +1 -1
- package/dist/components/Book.d.ts +28 -0
- package/dist/components/Book.d.ts.map +1 -0
- package/dist/components/Book.js +24 -0
- package/dist/components/Book.js.map +1 -0
- package/dist/components/Book.module.scss +45 -0
- package/dist/components/Button.d.ts +1 -1
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Button.js +4 -4
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Card.d.ts +8 -0
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/Card.js +10 -2
- package/dist/components/Card.js.map +1 -1
- package/dist/components/Card.module.scss +11 -1
- package/dist/components/Carousel.d.ts +7 -1
- package/dist/components/Carousel.d.ts.map +1 -1
- package/dist/components/Carousel.js +7 -7
- package/dist/components/Carousel.js.map +1 -1
- package/dist/components/Carousel.module.scss +1 -8
- package/dist/components/Checkbox.d.ts +3 -3
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox.js +5 -5
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/ClientFlex.d.ts.map +1 -1
- package/dist/components/ClientFlex.js +5 -10
- package/dist/components/ClientFlex.js.map +1 -1
- package/dist/components/ClientGrid.d.ts.map +1 -1
- package/dist/components/ClientGrid.js +2 -7
- package/dist/components/ClientGrid.js.map +1 -1
- package/dist/components/ColorInput.d.ts +1 -1
- package/dist/components/ColorInput.d.ts.map +1 -1
- package/dist/components/ColorInput.js +7 -13
- package/dist/components/ColorInput.js.map +1 -1
- package/dist/components/CompareImage.d.ts.map +1 -1
- package/dist/components/CompareImage.js +2 -2
- package/dist/components/CompareImage.js.map +1 -1
- package/dist/components/DateInput.d.ts.map +1 -1
- package/dist/components/DateInput.js +10 -1
- package/dist/components/DateInput.js.map +1 -1
- package/dist/components/DatePicker.d.ts +2 -2
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker.js +21 -14
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/DateRangeInput.js +3 -3
- package/dist/components/DateRangeInput.js.map +1 -1
- package/dist/components/Dialog.d.ts +1 -1
- package/dist/components/Dialog.d.ts.map +1 -1
- package/dist/components/Dialog.js +14 -14
- package/dist/components/Dialog.js.map +1 -1
- package/dist/components/DropdownWrapper.d.ts +8 -3
- package/dist/components/DropdownWrapper.d.ts.map +1 -1
- package/dist/components/DropdownWrapper.js +17 -6
- package/dist/components/DropdownWrapper.js.map +1 -1
- package/dist/components/Effect.d.ts +41 -0
- package/dist/components/Effect.d.ts.map +1 -0
- package/dist/components/Effect.js +30 -0
- package/dist/components/Effect.js.map +1 -0
- package/dist/components/ElementType.d.ts +2 -1
- package/dist/components/ElementType.d.ts.map +1 -1
- package/dist/components/ElementType.js +4 -2
- package/dist/components/ElementType.js.map +1 -1
- package/dist/components/EmojiPicker.d.ts.map +1 -1
- package/dist/components/EmojiPicker.js +1 -1
- package/dist/components/EmojiPicker.js.map +1 -1
- package/dist/components/Feedback.d.ts +1 -1
- package/dist/components/Feedback.d.ts.map +1 -1
- package/dist/components/Feedback.js +2 -2
- package/dist/components/Feedback.js.map +1 -1
- package/dist/components/Flex.d.ts.map +1 -1
- package/dist/components/Flex.js +46 -5
- package/dist/components/Flex.js.map +1 -1
- package/dist/components/Icon.d.ts.map +1 -1
- package/dist/components/Icon.js.map +1 -1
- package/dist/components/IconButton.d.ts +1 -1
- package/dist/components/IconButton.d.ts.map +1 -1
- package/dist/components/IconButton.js +4 -4
- package/dist/components/IconButton.js.map +1 -1
- package/dist/components/InfoTip.d.ts +17 -0
- package/dist/components/InfoTip.d.ts.map +1 -0
- package/dist/components/InfoTip.js +12 -0
- package/dist/components/InfoTip.js.map +1 -0
- package/dist/components/Input.d.ts +11 -5
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Input.js +32 -16
- package/dist/components/Input.js.map +1 -1
- package/dist/components/Input.module.scss +313 -1
- package/dist/components/InteractiveDetails.d.ts.map +1 -1
- package/dist/components/InteractiveDetails.js +1 -1
- package/dist/components/InteractiveDetails.js.map +1 -1
- package/dist/components/Kbd.d.ts.map +1 -1
- package/dist/components/Kbd.js +4 -1
- package/dist/components/Kbd.js.map +1 -1
- package/dist/components/Logo.d.ts +16 -4
- package/dist/components/Logo.d.ts.map +1 -1
- package/dist/components/Logo.js +32 -14
- package/dist/components/Logo.js.map +1 -1
- package/dist/components/Media.d.ts +9 -2
- package/dist/components/Media.d.ts.map +1 -1
- package/dist/components/Media.js +25 -16
- package/dist/components/Media.js.map +1 -1
- package/dist/components/MediaAudioPlayer.d.ts +29 -0
- package/dist/components/MediaAudioPlayer.d.ts.map +1 -0
- package/dist/components/MediaAudioPlayer.js +115 -0
- package/dist/components/MediaAudioPlayer.js.map +1 -0
- package/dist/components/MediaAudioPlayer.module.scss +38 -0
- package/dist/components/Modal.d.ts +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Modal.js +10 -10
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/NavGroup.d.ts +33 -0
- package/dist/components/NavGroup.d.ts.map +1 -0
- package/dist/components/NavGroup.js +27 -0
- package/dist/components/NavGroup.js.map +1 -0
- package/dist/components/NavIcon.d.ts +1 -1
- package/dist/components/NavIcon.d.ts.map +1 -1
- package/dist/components/NavIcon.js +2 -2
- package/dist/components/NavIcon.js.map +1 -1
- package/dist/components/NavItem.d.ts +24 -0
- package/dist/components/NavItem.d.ts.map +1 -0
- package/dist/components/NavItem.js +18 -0
- package/dist/components/NavItem.js.map +1 -0
- package/dist/components/NumberInput.js +1 -1
- package/dist/components/NumberInput.js.map +1 -1
- package/dist/components/OgCard.d.ts.map +1 -1
- package/dist/components/OgCard.js +7 -4
- package/dist/components/OgCard.js.map +1 -1
- package/dist/components/Option.d.ts +3 -3
- package/dist/components/Option.d.ts.map +1 -1
- package/dist/components/Option.js +2 -2
- package/dist/components/Option.js.map +1 -1
- package/dist/components/Particle.d.ts +2 -2
- package/dist/components/Particle.d.ts.map +1 -1
- package/dist/components/PasswordInput.d.ts.map +1 -1
- package/dist/components/PasswordInput.js +2 -2
- package/dist/components/PasswordInput.js.map +1 -1
- package/dist/components/ProgressBar.d.ts +1 -1
- package/dist/components/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar.js +2 -2
- package/dist/components/ProgressBar.js.map +1 -1
- package/dist/components/Pulse.d.ts +1 -1
- package/dist/components/Pulse.d.ts.map +1 -1
- package/dist/components/Pulse.js +2 -2
- package/dist/components/Pulse.js.map +1 -1
- package/dist/components/RadioButton.d.ts +2 -2
- package/dist/components/RadioButton.d.ts.map +1 -1
- package/dist/components/RadioButton.js +1 -1
- package/dist/components/RadioButton.js.map +1 -1
- package/dist/components/RevealFx.d.ts +2 -1
- package/dist/components/RevealFx.d.ts.map +1 -1
- package/dist/components/RevealFx.js +8 -8
- package/dist/components/RevealFx.js.map +1 -1
- package/dist/components/ScrollContainer.d.ts.map +1 -1
- package/dist/components/ScrollContainer.js +1 -1
- package/dist/components/ScrollContainer.js.map +1 -1
- package/dist/components/Scrubber.d.ts +70 -0
- package/dist/components/Scrubber.d.ts.map +1 -0
- package/dist/components/Scrubber.js +161 -0
- package/dist/components/Scrubber.js.map +1 -0
- package/dist/components/SegmentedControl.d.ts +4 -4
- package/dist/components/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl.js +11 -11
- package/dist/components/SegmentedControl.js.map +1 -1
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Select.js +48 -15
- package/dist/components/Select.js.map +1 -1
- package/dist/components/ServerFlex.d.ts +0 -1
- package/dist/components/ServerFlex.d.ts.map +1 -1
- package/dist/components/ServerFlex.js +99 -52
- package/dist/components/ServerFlex.js.map +1 -1
- package/dist/components/ServerGrid.d.ts +0 -1
- package/dist/components/ServerGrid.d.ts.map +1 -1
- package/dist/components/ServerGrid.js +11 -9
- package/dist/components/ServerGrid.js.map +1 -1
- package/dist/components/Setting.d.ts +50 -0
- package/dist/components/Setting.d.ts.map +1 -0
- package/dist/components/Setting.js +43 -0
- package/dist/components/Setting.js.map +1 -0
- package/dist/components/ShineFx.d.ts +1 -0
- package/dist/components/ShineFx.d.ts.map +1 -1
- package/dist/components/ShineFx.js +2 -2
- package/dist/components/ShineFx.js.map +1 -1
- package/dist/components/Skeleton.d.ts +16 -3
- package/dist/components/Skeleton.d.ts.map +1 -1
- package/dist/components/Skeleton.js +2 -2
- package/dist/components/Skeleton.js.map +1 -1
- package/dist/components/Skeleton.module.scss +14 -51
- package/dist/components/SplitView.d.ts +23 -3
- package/dist/components/SplitView.d.ts.map +1 -1
- package/dist/components/SplitView.js +90 -58
- package/dist/components/SplitView.js.map +1 -1
- package/dist/components/StyleOverlay.d.ts.map +1 -1
- package/dist/components/StyleOverlay.js +1 -1
- package/dist/components/StyleOverlay.js.map +1 -1
- package/dist/components/StylePanel.d.ts +47 -6
- package/dist/components/StylePanel.d.ts.map +1 -1
- package/dist/components/StylePanel.js +16 -189
- package/dist/components/StylePanel.js.map +1 -1
- package/dist/components/StylePanel.module.scss +6 -1
- package/dist/components/StylePanelSections.d.ts +117 -0
- package/dist/components/StylePanelSections.d.ts.map +1 -0
- package/dist/components/StylePanelSections.js +175 -0
- package/dist/components/StylePanelSections.js.map +1 -0
- package/dist/components/Swiper.d.ts +7 -1
- package/dist/components/Swiper.d.ts.map +1 -1
- package/dist/components/Swiper.js +7 -7
- package/dist/components/Swiper.js.map +1 -1
- package/dist/components/Switch.d.ts +2 -2
- package/dist/components/Switch.d.ts.map +1 -1
- package/dist/components/Switch.js +4 -4
- package/dist/components/Switch.js.map +1 -1
- package/dist/components/Table.d.ts.map +1 -1
- package/dist/components/Table.js +4 -4
- package/dist/components/Table.js.map +1 -1
- package/dist/components/Tag.d.ts +1 -1
- package/dist/components/Tag.d.ts.map +1 -1
- package/dist/components/Tag.js +2 -2
- package/dist/components/Tag.js.map +1 -1
- package/dist/components/Textarea.d.ts +15 -5
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/Textarea.js +31 -17
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeSwitcher.d.ts +14 -1
- package/dist/components/ThemeSwitcher.d.ts.map +1 -1
- package/dist/components/ThemeSwitcher.js +19 -9
- package/dist/components/ThemeSwitcher.js.map +1 -1
- package/dist/components/ThemeSwitcher.module.scss +54 -0
- package/dist/components/Toast.d.ts +1 -1
- package/dist/components/Toast.d.ts.map +1 -1
- package/dist/components/Toast.js +2 -2
- package/dist/components/Toast.js.map +1 -1
- package/dist/components/ToggleButton.d.ts +9 -2
- package/dist/components/ToggleButton.d.ts.map +1 -1
- package/dist/components/ToggleButton.js +5 -5
- package/dist/components/ToggleButton.js.map +1 -1
- package/dist/components/User.js +1 -1
- package/dist/components/User.js.map +1 -1
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +7 -0
- package/dist/components/index.js.map +1 -1
- package/dist/contexts/AdapterProvider.d.ts +50 -0
- package/dist/contexts/AdapterProvider.d.ts.map +1 -0
- package/dist/contexts/AdapterProvider.js +91 -0
- package/dist/contexts/AdapterProvider.js.map +1 -0
- package/dist/contexts/IconProvider.d.ts +2 -2
- package/dist/contexts/IconProvider.d.ts.map +1 -1
- package/dist/contexts/IconProvider.js +2 -2
- package/dist/contexts/IconProvider.js.map +1 -1
- package/dist/contexts/LayoutProvider.d.ts +0 -2
- package/dist/contexts/LayoutProvider.d.ts.map +1 -1
- package/dist/contexts/LayoutProvider.js +15 -10
- package/dist/contexts/LayoutProvider.js.map +1 -1
- package/dist/contexts/ThemeProvider.d.ts +29 -1
- package/dist/contexts/ThemeProvider.d.ts.map +1 -1
- package/dist/contexts/ThemeProvider.js +42 -15
- package/dist/contexts/ThemeProvider.js.map +1 -1
- package/dist/contexts/index.d.ts +3 -2
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +3 -2
- package/dist/contexts/index.js.map +1 -1
- package/dist/css/styles.css +1 -1
- package/dist/css/tokens.css +1 -1
- package/dist/data/emoji-data.json +8 -10
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/icons/ATTRIBUTION.md +19 -0
- package/dist/icons/data.d.ts +1919 -0
- package/dist/icons/data.d.ts.map +1 -0
- package/dist/icons/data.js +102 -0
- package/dist/icons/data.js.map +1 -0
- package/dist/icons/renderIcon.d.ts +26 -0
- package/dist/icons/renderIcon.d.ts.map +1 -0
- package/dist/icons/renderIcon.js +22 -0
- package/dist/icons/renderIcon.js.map +1 -0
- package/dist/icons.d.ts +35 -4
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +13 -60
- package/dist/icons.js.map +1 -1
- package/dist/modules/code/CodeBlock.impl.d.ts +2 -1
- package/dist/modules/code/CodeBlock.impl.d.ts.map +1 -1
- package/dist/modules/code/CodeBlock.impl.js +7 -2
- package/dist/modules/code/CodeBlock.impl.js.map +1 -1
- package/dist/modules/data/ChartHeader.d.ts.map +1 -1
- package/dist/modules/data/ChartHeader.js +1 -1
- package/dist/modules/data/ChartHeader.js.map +1 -1
- package/dist/modules/data/DataTooltip.d.ts +1 -1
- package/dist/modules/data/DataTooltip.d.ts.map +1 -1
- package/dist/modules/data/DataTooltip.js +2 -2
- package/dist/modules/data/DataTooltip.js.map +1 -1
- package/dist/modules/data/LinearGauge.d.ts +3 -2
- package/dist/modules/data/LinearGauge.d.ts.map +1 -1
- package/dist/modules/data/LinearGauge.js +1 -1
- package/dist/modules/data/LinearGauge.js.map +1 -1
- package/dist/modules/data/PieChart.impl.d.ts +1 -1
- package/dist/modules/data/PieChart.impl.d.ts.map +1 -1
- package/dist/modules/data/PieChart.impl.js +4 -1
- package/dist/modules/data/PieChart.impl.js.map +1 -1
- package/dist/modules/data/RadialGauge.d.ts +3 -2
- package/dist/modules/data/RadialGauge.d.ts.map +1 -1
- package/dist/modules/data/RadialGauge.js +1 -1
- package/dist/modules/data/RadialGauge.js.map +1 -1
- package/dist/modules/data/interfaces.d.ts +12 -3
- package/dist/modules/data/interfaces.d.ts.map +1 -1
- package/dist/modules/index.d.ts +1 -4
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +9 -3
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/media/MediaUpload.impl.d.ts +1 -1
- package/dist/modules/media/MediaUpload.impl.d.ts.map +1 -1
- package/dist/modules/media/MediaUpload.impl.js +1 -1
- package/dist/modules/media/MediaUpload.impl.js.map +1 -1
- package/dist/modules/navigation/Kbar.d.ts +5 -4
- package/dist/modules/navigation/Kbar.d.ts.map +1 -1
- package/dist/modules/navigation/Kbar.js +32 -35
- package/dist/modules/navigation/Kbar.js.map +1 -1
- package/dist/modules/navigation/MegaMenu.d.ts +5 -3
- package/dist/modules/navigation/MegaMenu.d.ts.map +1 -1
- package/dist/modules/navigation/MegaMenu.js +24 -12
- package/dist/modules/navigation/MegaMenu.js.map +1 -1
- package/dist/modules/navigation/MobileMegaMenu.d.ts +3 -2
- package/dist/modules/navigation/MobileMegaMenu.d.ts.map +1 -1
- package/dist/modules/navigation/MobileMegaMenu.js +1 -1
- package/dist/modules/navigation/MobileMegaMenu.js.map +1 -1
- package/dist/modules/seo/Meta.d.ts +40 -2
- package/dist/modules/seo/Meta.d.ts.map +1 -1
- package/dist/modules/seo/Meta.js.map +1 -1
- package/dist/modules/seo/Schema.d.ts.map +1 -1
- package/dist/modules/seo/Schema.js +1 -2
- package/dist/modules/seo/Schema.js.map +1 -1
- package/dist/next/index.d.ts +35 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +56 -0
- package/dist/next/index.js.map +1 -0
- package/dist/package.json +52 -7
- package/dist/scripts/init-agent.js +156 -0
- package/dist/scripts/validate-ai-code.js +431 -0
- package/dist/server/og-utils.d.ts +9 -3
- package/dist/server/og-utils.d.ts.map +1 -1
- package/dist/server/og-utils.js +15 -9
- package/dist/server/og-utils.js.map +1 -1
- package/dist/styles/breakpoints.scss +16 -5
- package/dist/test/setup.js +21 -0
- package/dist/test/setup.js.map +1 -1
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/colorScheme.d.ts +35 -0
- package/dist/utils/colorScheme.d.ts.map +1 -0
- package/dist/utils/colorScheme.js +140 -0
- package/dist/utils/colorScheme.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/navMatch.d.ts +21 -0
- package/dist/utils/navMatch.d.ts.map +1 -0
- package/dist/utils/navMatch.js +26 -0
- package/dist/utils/navMatch.js.map +1 -0
- package/package.json +66 -11
- package/scripts/validate-ai-code.js +309 -27
- package/dist/css/styles.css.map +0 -1
- package/dist/css/tokens.css.map +0 -1
- package/dist/hooks/useResponsiveClasses.d.ts +0 -9
- package/dist/hooks/useResponsiveClasses.d.ts.map +0 -1
- package/dist/hooks/useResponsiveClasses.js +0 -293
- package/dist/hooks/useResponsiveClasses.js.map +0 -1
- package/dist/styles/background.scss +0 -423
- package/dist/styles/border.scss +0 -546
- package/dist/styles/color.scss +0 -183
- package/dist/styles/display.scss +0 -391
- package/dist/styles/flex.scss +0 -518
- package/dist/styles/global.scss +0 -36
- package/dist/styles/grid.scss +0 -293
- package/dist/styles/index.scss +0 -14
- package/dist/styles/position.scss +0 -1549
- package/dist/styles/shadow.scss +0 -19
- package/dist/styles/size.scss +0 -53
- package/dist/styles/spacing.scss +0 -1505
- package/dist/styles/typography.scss +0 -223
- package/dist/styles/utilities.scss +0 -23
- package/dist/tokens/border.scss +0 -95
- package/dist/tokens/data.scss +0 -107
- package/dist/tokens/function.scss +0 -742
- package/dist/tokens/index.scss +0 -8
- package/dist/tokens/layout.scss +0 -275
- package/dist/tokens/scheme.scss +0 -352
- package/dist/tokens/shadow.scss +0 -7
- package/dist/tokens/theme.scss +0 -657
- package/dist/tokens/typography.scss +0 -118
- package/next-env.d.ts +0 -5
- package/scripts/copy-files.js +0 -103
- package/scripts/generate-ai-spec.js +0 -464
- package/scripts/generate-emoji-data.js +0 -128
- package/scss.d.ts +0 -4
- package/tsconfig.vitest.json +0 -20
- package/vitest.config.ts +0 -19
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Mechanical Once UI codegen validator.
|
|
4
|
+
* Usage: node scripts/validate-ai-code.js <file.tsx> [--fix]
|
|
5
|
+
* node scripts/validate-ai-code.js --stdin < file.tsx
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require("fs");
|
|
9
|
+
const path = require("path");
|
|
10
|
+
|
|
11
|
+
const ROOT = path.join(__dirname, "..");
|
|
12
|
+
const SPEC_PATH = path.join(ROOT, "ai", "spec.json");
|
|
13
|
+
|
|
14
|
+
function loadSpec() {
|
|
15
|
+
if (!fs.existsSync(SPEC_PATH)) return { components: {}, tokens: {} };
|
|
16
|
+
return JSON.parse(fs.readFileSync(SPEC_PATH, "utf8"));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function parseIconNames(spec) {
|
|
20
|
+
const raw = spec.tokens?.IconName || "";
|
|
21
|
+
const matches = raw.match(/"([^"]+)"/g) || [];
|
|
22
|
+
return new Set(matches.map((m) => m.slice(1, -1)));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function readInput(argv) {
|
|
26
|
+
const fileArg = argv.find((a) => !a.startsWith("-"));
|
|
27
|
+
if (argv.includes("--stdin")) {
|
|
28
|
+
return { source: fs.readFileSync(0, "utf8"), file: "<stdin>" };
|
|
29
|
+
}
|
|
30
|
+
if (!fileArg) {
|
|
31
|
+
console.error("Usage: validate-ai-code.js <file.tsx> [--fix] | --stdin");
|
|
32
|
+
process.exit(2);
|
|
33
|
+
}
|
|
34
|
+
return { source: fs.readFileSync(fileArg, "utf8"), file: fileArg };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* A literal colour in a styling position.
|
|
39
|
+
*
|
|
40
|
+
* The rule used to be a bare `#[0-9a-fA-F]{3,8}` over the whole file, which
|
|
41
|
+
* flagged two things that are not colours at all: any string that happens to
|
|
42
|
+
* look like hex (an order id `"#1024"` is a valid #RGBA literal), and the
|
|
43
|
+
* `fill` / `stroke` of an inline `<svg>`, where a raw value is the only thing
|
|
44
|
+
* that works — which is why 2.0 types those props `ColorValue` rather than
|
|
45
|
+
* `Colors`. So it looks at where the value sits, not only at its shape.
|
|
46
|
+
*/
|
|
47
|
+
function hasLiteralColor(source) {
|
|
48
|
+
const LITERAL = /#[0-9a-fA-F]{3,8}\b|rgba?\s*\(/;
|
|
49
|
+
const SVG_PAINT =
|
|
50
|
+
/^(?:fill|stroke|stopColor|stop-color|floodColor|flood-color|lightingColor|lighting-color)$/;
|
|
51
|
+
|
|
52
|
+
for (const block of source.match(/style=\{\{[\s\S]*?\}\}/g) || []) {
|
|
53
|
+
if (LITERAL.test(block)) return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const [, name, value] of source.matchAll(/([A-Za-z-]+)=\{?["']([^"']*)["']/g)) {
|
|
57
|
+
if (SVG_PAINT.test(name)) continue;
|
|
58
|
+
if (!/colou?r|background|border|shadow|gradient/i.test(name)) continue;
|
|
59
|
+
if (LITERAL.test(value)) return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Is `index` inside the braces of a `<prop>={ ... }` value?
|
|
66
|
+
*
|
|
67
|
+
* Counts braces forward from each occurrence of the prop, which is enough for
|
|
68
|
+
* JSX: a `{` inside a string would have to be unbalanced to fool it, and the
|
|
69
|
+
* answer is only used to suppress a warning.
|
|
70
|
+
*/
|
|
71
|
+
function insidePropValue(source, index, prop) {
|
|
72
|
+
for (const m of source.matchAll(new RegExp(`\\b${prop}=\\{`, "g"))) {
|
|
73
|
+
if (m.index > index) return false;
|
|
74
|
+
let depth = 1;
|
|
75
|
+
let i = m.index + m[0].length;
|
|
76
|
+
for (; i < source.length && depth > 0; i++) {
|
|
77
|
+
if (source[i] === "{") depth++;
|
|
78
|
+
else if (source[i] === "}") depth--;
|
|
79
|
+
}
|
|
80
|
+
if (index > m.index && index < i) return true;
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Every opening JSX tag with its attribute text.
|
|
87
|
+
*
|
|
88
|
+
* Brace- and quote-aware, so a `>` inside an arrow function or an object
|
|
89
|
+
* literal in a prop value does not end the tag early — which is what a plain
|
|
90
|
+
* `<Tag[^>]*>` does on `onClick={() => x > 1}`. Scanning resumes right after
|
|
91
|
+
* the tag name, so a tag nested in a prop value (`trigger={<Card …>}`) is
|
|
92
|
+
* found on its own as well.
|
|
93
|
+
*/
|
|
94
|
+
function openingTags(source) {
|
|
95
|
+
const tags = [];
|
|
96
|
+
const re = /<([A-Z][A-Za-z0-9.]*)\b/g;
|
|
97
|
+
let m;
|
|
98
|
+
while ((m = re.exec(source)) !== null) {
|
|
99
|
+
const start = m.index + m[0].length;
|
|
100
|
+
let i = start;
|
|
101
|
+
let depth = 0;
|
|
102
|
+
let quote = null;
|
|
103
|
+
for (; i < source.length; i++) {
|
|
104
|
+
const ch = source[i];
|
|
105
|
+
if (quote) {
|
|
106
|
+
if (ch === quote) quote = null;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (ch === '"' || ch === "'" || ch === "`") quote = ch;
|
|
110
|
+
else if (ch === "{") depth++;
|
|
111
|
+
else if (ch === "}") depth--;
|
|
112
|
+
else if (ch === ">" && depth === 0) break;
|
|
113
|
+
}
|
|
114
|
+
tags.push({ name: m[1], attrs: source.slice(start, i), start, end: i });
|
|
115
|
+
}
|
|
116
|
+
return tags;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The element's own props, with every `{ … }` value that holds JSX blanked to
|
|
121
|
+
* spaces of the same length — so a check reads `fillWidth` and `maxWidth` on
|
|
122
|
+
* the element itself and not on a tag nested inside one of its values
|
|
123
|
+
* (`dropdown={<Column maxWidth={20} />}`), and an index into the masked text
|
|
124
|
+
* is still an index into the original.
|
|
125
|
+
*/
|
|
126
|
+
function ownProps(attrs) {
|
|
127
|
+
let out = "";
|
|
128
|
+
let depth = 0;
|
|
129
|
+
let quote = null;
|
|
130
|
+
let from = 0;
|
|
131
|
+
for (let i = 0; i < attrs.length; i++) {
|
|
132
|
+
const ch = attrs[i];
|
|
133
|
+
if (quote) {
|
|
134
|
+
if (ch === quote) quote = null;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (ch === '"' || ch === "'" || ch === "`") quote = ch;
|
|
138
|
+
else if (ch === "{") {
|
|
139
|
+
if (depth === 0) {
|
|
140
|
+
out += attrs.slice(from, i);
|
|
141
|
+
from = i;
|
|
142
|
+
}
|
|
143
|
+
depth++;
|
|
144
|
+
} else if (ch === "}") {
|
|
145
|
+
depth--;
|
|
146
|
+
if (depth === 0) {
|
|
147
|
+
const block = attrs.slice(from, i + 1);
|
|
148
|
+
out += /<[A-Z]/.test(block) ? `{${" ".repeat(block.length - 2)}}` : block;
|
|
149
|
+
from = i + 1;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return out + attrs.slice(from);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Apply a replacement to the element's own props only, never inside nested JSX. */
|
|
157
|
+
function replaceOwnProps(attrs, pattern, replacement) {
|
|
158
|
+
const masked = ownProps(attrs);
|
|
159
|
+
const flags = pattern.flags.includes("g") ? pattern.flags : `${pattern.flags}g`;
|
|
160
|
+
const re = new RegExp(pattern.source, flags);
|
|
161
|
+
let out = "";
|
|
162
|
+
let last = 0;
|
|
163
|
+
for (const m of masked.matchAll(re)) {
|
|
164
|
+
out += attrs.slice(last, m.index) + m[0].replace(pattern, replacement);
|
|
165
|
+
last = m.index + m[0].length;
|
|
166
|
+
if (!pattern.flags.includes("g")) break;
|
|
167
|
+
}
|
|
168
|
+
return out + attrs.slice(last);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Collapse two props on one element into a shorthand: the earlier of the two
|
|
173
|
+
* becomes the shorthand, the later is removed, and nothing else moves.
|
|
174
|
+
*/
|
|
175
|
+
function collapsePair(attrs, first, second, shorthand) {
|
|
176
|
+
const own = ownProps(attrs);
|
|
177
|
+
const a = own.search(first);
|
|
178
|
+
const b = own.search(second);
|
|
179
|
+
if (a < 0 || b < 0) return attrs;
|
|
180
|
+
const [lead, trail] = a < b ? [first, second] : [second, first];
|
|
181
|
+
const asShorthand = new RegExp(`(\\s)${lead.source.replace(/^\(\?:\^\|\\s\)/, "")}`);
|
|
182
|
+
const removed = new RegExp(`\\s+${trail.source.replace(/^\(\?:\^\|\\s\)/, "")}`);
|
|
183
|
+
return replaceOwnProps(replaceOwnProps(attrs, removed, ""), asShorthand, `$1${shorthand}`);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const FILL_WIDTH = /(?:^|\s)fillWidth(?=[\s/]|$)/;
|
|
187
|
+
const FILL_HEIGHT = /(?:^|\s)fillHeight(?=[\s/]|$)/;
|
|
188
|
+
|
|
189
|
+
/** Both centring props on one element, whatever sits between them. */
|
|
190
|
+
function isCentered(attrs) {
|
|
191
|
+
const own = ownProps(attrs);
|
|
192
|
+
return HORIZONTAL_CENTER.test(own) && VERTICAL_CENTER.test(own);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** Does the element carry `prop`, bare or with a value? */
|
|
196
|
+
function hasProp(attrs, prop) {
|
|
197
|
+
return new RegExp(`(?:^|\\s)${prop}(?=[\\s=/]|$)`).test(ownProps(attrs));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const HORIZONTAL_CENTER = /(?:^|\s)horizontal=["']center["']/;
|
|
201
|
+
const VERTICAL_CENTER = /(?:^|\s)vertical=["']center["']/;
|
|
202
|
+
const LITERAL_MAX_WIDTH =
|
|
203
|
+
/(?:^|\s)maxWidth=(?:"[^"]*"|\{\s*(?:\d+(?:\.\d+)?|"[^"]*"|'[^']*')\s*\})(?=[\s/]|$)/;
|
|
204
|
+
const MIN_WIDTH_ZERO = /(?:^|\s)minWidth=(?:\{\s*0\s*\}|\{?["']0["']\}?)(?=[\s/]|$)/;
|
|
205
|
+
const DEFAULT_BORDER = /(?:^|\s)(border(?:Top|Right|Bottom|Left|X|Y)?)=["']neutral-alpha-weak["']/;
|
|
206
|
+
|
|
207
|
+
function validate(source, spec, iconNames) {
|
|
208
|
+
const issues = [];
|
|
209
|
+
|
|
210
|
+
const add = (rule, message, fix) => issues.push({ rule, message, fix });
|
|
211
|
+
|
|
212
|
+
// Per element: `fillWidth` on a parent and `fillHeight` on its child is not
|
|
213
|
+
// a shorthand missed, and neither is `horizontal="center"` on a header row
|
|
214
|
+
// beside `vertical="center"` on the row inside it.
|
|
215
|
+
const tags = openingTags(source);
|
|
216
|
+
if (tags.some((t) => hasProp(t.attrs, "fillWidth") && hasProp(t.attrs, "fillHeight"))) {
|
|
217
|
+
add("layout.shorthands", "Use fill instead of fillWidth + fillHeight", "fill");
|
|
218
|
+
}
|
|
219
|
+
if (/<Flex[^>]*direction="column"/.test(source)) {
|
|
220
|
+
add("layout.shorthands", 'Use Column instead of Flex direction="column"', "Column");
|
|
221
|
+
}
|
|
222
|
+
if (/<Flex[^>]*direction="row"/.test(source)) {
|
|
223
|
+
add("layout.shorthands", 'Use Row instead of Flex direction="row"', "Row");
|
|
224
|
+
}
|
|
225
|
+
if (tags.some((t) => isCentered(t.attrs))) {
|
|
226
|
+
add(
|
|
227
|
+
"layout.shorthands",
|
|
228
|
+
'Use center instead of horizontal="center" vertical="center"',
|
|
229
|
+
"center",
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (/position="relative"/.test(source)) {
|
|
234
|
+
add("layout.defaults", 'position="relative" is the default — omit it');
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Props another prop on the same element already implies. Checked per tag,
|
|
238
|
+
// because `fillWidth` and `maxWidth` on two different elements is fine, and
|
|
239
|
+
// only for a literal `maxWidth`: a computed one may resolve to `undefined`,
|
|
240
|
+
// and then `fillWidth` is the only thing filling the width.
|
|
241
|
+
if (
|
|
242
|
+
tags.some((t) => hasProp(t.attrs, "fillWidth") && LITERAL_MAX_WIDTH.test(ownProps(t.attrs)))
|
|
243
|
+
) {
|
|
244
|
+
add(
|
|
245
|
+
"layout.defaults",
|
|
246
|
+
"fillWidth beside maxWidth — maxWidth already fills the width, omit fillWidth",
|
|
247
|
+
"drop-fillWidth",
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
if (tags.some((t) => hasProp(t.attrs, "fillWidth") && MIN_WIDTH_ZERO.test(ownProps(t.attrs)))) {
|
|
251
|
+
add(
|
|
252
|
+
"layout.defaults",
|
|
253
|
+
"minWidth={0} beside fillWidth — fillWidth already sets min-width: 0, omit minWidth",
|
|
254
|
+
"drop-minWidth-0",
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
const named = tags.map((t) => ownProps(t.attrs).match(DEFAULT_BORDER)).find(Boolean);
|
|
258
|
+
if (named) {
|
|
259
|
+
add(
|
|
260
|
+
"border.default",
|
|
261
|
+
`${named[1]}="neutral-alpha-weak" restates the default border — write bare ${named[1]}, and name a colour only to deviate`,
|
|
262
|
+
"default-border",
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// A zIndex only means something against a sibling in the same stacking
|
|
267
|
+
// group, and that group is always anchored by something positioned.
|
|
268
|
+
if (/\bzIndex=/.test(source) && !/position=["'](?:absolute|fixed|sticky)["']/.test(source)) {
|
|
269
|
+
add(
|
|
270
|
+
"zIndex.scope",
|
|
271
|
+
"zIndex with nothing positioned absolute, fixed or sticky — zIndex belongs to an isolated stacking group, not a lone element",
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (/<Button[^>]*variant="primary"/.test(source)) {
|
|
276
|
+
add("layout.defaults", 'variant="primary" is the Button default — omit it');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Scoped to the tag: `lines` is a different prop on Background and CodeBlock.
|
|
280
|
+
if (/<Textarea[^>]*\blines=\{?["']auto["']/.test(source)) {
|
|
281
|
+
add("layout.defaults", 'lines="auto" is the Textarea default — omit it');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (hasLiteralColor(source)) {
|
|
285
|
+
add("color.tokens", "Use semantic color tokens, not hex/rgb");
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (/<img[\s>/]|<a[\s>/]|<button[\s>/]/.test(source)) {
|
|
289
|
+
add(
|
|
290
|
+
"components.primitives",
|
|
291
|
+
"Use Once UI components (Media, SmartLink, Button) instead of raw HTML",
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
for (const match of source.matchAll(/<Card\b[^>]*>/g)) {
|
|
296
|
+
if (/\b(href|onClick)=/.test(match[0])) continue;
|
|
297
|
+
// A card handed to a `trigger` prop is operated by whatever owns it
|
|
298
|
+
// (DropdownWrapper, Dialog), so it carries no handler of its own and is
|
|
299
|
+
// not the static-panel misuse this rule is looking for.
|
|
300
|
+
if (insidePropValue(source, match.index, "trigger")) continue;
|
|
301
|
+
add(
|
|
302
|
+
"Card.interactive",
|
|
303
|
+
"Card without href/onClick — use Column + surface recipe for static panels",
|
|
304
|
+
);
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const iconPropRe = /(?:prefixIcon|suffixIcon|name)=["']([^"']+)["']/g;
|
|
309
|
+
let iconMatch;
|
|
310
|
+
while ((iconMatch = iconPropRe.exec(source)) !== null) {
|
|
311
|
+
const name = iconMatch[1];
|
|
312
|
+
if (iconNames.size && !iconNames.has(name)) {
|
|
313
|
+
add("Icon.names", `Unknown icon name "${name}" — use IconName from spec.json`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (
|
|
318
|
+
/\b(?:delay|speed)=\{[^}]*\*\s*0?\.\d+/.test(source) ||
|
|
319
|
+
/\b(?:delay|speed)=\{\s*0?\.\d+\s*\}/.test(source)
|
|
320
|
+
) {
|
|
321
|
+
add(
|
|
322
|
+
"RevealFx.delay",
|
|
323
|
+
"RevealFx delay and ShineFx speed are milliseconds — use index * 100, not index * 0.1",
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (/<Fade[^>]*>[\s\S]*<(Column|Row)[^>]*overflowY/.test(source)) {
|
|
328
|
+
add("Fade.edge", "Fade wrapping scroll content — use as absolute edge strip instead");
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (/style=\{\{[^}]*(gap|padding|margin|color|background):/.test(source)) {
|
|
332
|
+
add("spacing.tokens", "Use token props (gap, padding, background) instead of style={{}}");
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return issues;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Rewrite the attribute text of opening tags, one at a time from a fresh scan,
|
|
340
|
+
* since a tag nested in a prop value overlaps its parent's attribute text.
|
|
341
|
+
*/
|
|
342
|
+
function rewriteTags(source, edit) {
|
|
343
|
+
let out = source;
|
|
344
|
+
for (;;) {
|
|
345
|
+
const tag = openingTags(out).find((t) => edit(t.attrs, t.name) !== t.attrs);
|
|
346
|
+
if (!tag) return out;
|
|
347
|
+
out = out.slice(0, tag.start) + edit(tag.attrs, tag.name) + out.slice(tag.end);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function applyFixes(source, issues) {
|
|
352
|
+
let out = source;
|
|
353
|
+
for (const issue of issues) {
|
|
354
|
+
if (issue.fix === "fill") {
|
|
355
|
+
out = rewriteTags(out, (attrs) => collapsePair(attrs, FILL_WIDTH, FILL_HEIGHT, "fill"));
|
|
356
|
+
}
|
|
357
|
+
if (issue.fix === "center") {
|
|
358
|
+
out = rewriteTags(out, (attrs) =>
|
|
359
|
+
collapsePair(attrs, HORIZONTAL_CENTER, VERTICAL_CENTER, "center"),
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
if (issue.fix === "drop-fillWidth") {
|
|
363
|
+
out = rewriteTags(out, (attrs) =>
|
|
364
|
+
hasProp(attrs, "fillWidth") && LITERAL_MAX_WIDTH.test(ownProps(attrs))
|
|
365
|
+
? replaceOwnProps(attrs, /\s+fillWidth(?=[\s/]|$)/, "")
|
|
366
|
+
: attrs,
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
if (issue.fix === "drop-minWidth-0") {
|
|
370
|
+
out = rewriteTags(out, (attrs) =>
|
|
371
|
+
hasProp(attrs, "fillWidth") && MIN_WIDTH_ZERO.test(ownProps(attrs))
|
|
372
|
+
? replaceOwnProps(attrs, /\s+minWidth=(?:\{\s*0\s*\}|\{?["']0["']\}?)(?=[\s/]|$)/, "")
|
|
373
|
+
: attrs,
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
if (issue.fix === "default-border") {
|
|
377
|
+
out = rewriteTags(out, (attrs) =>
|
|
378
|
+
replaceOwnProps(
|
|
379
|
+
attrs,
|
|
380
|
+
/(border(?:Top|Right|Bottom|Left|X|Y)?)=["']neutral-alpha-weak["']/g,
|
|
381
|
+
"$1",
|
|
382
|
+
),
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return out;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function main() {
|
|
390
|
+
const spec = loadSpec();
|
|
391
|
+
const iconNames = parseIconNames(spec);
|
|
392
|
+
const fix = process.argv.includes("--fix");
|
|
393
|
+
const { source, file } = readInput(process.argv.slice(2));
|
|
394
|
+
|
|
395
|
+
const issues = validate(source, spec, iconNames);
|
|
396
|
+
|
|
397
|
+
if (issues.length === 0) {
|
|
398
|
+
console.log(`✓ ${file}: no mechanical issues`);
|
|
399
|
+
process.exit(0);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
console.log(`✗ ${file}: ${issues.length} issue(s)`);
|
|
403
|
+
for (const issue of issues) {
|
|
404
|
+
console.log(` [${issue.rule}] ${issue.message}`);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (fix) {
|
|
408
|
+
const fixed = applyFixes(source, issues);
|
|
409
|
+
if (fixed !== source && !process.argv.includes("--stdin")) {
|
|
410
|
+
const fileArg = process.argv.find((a) => a.endsWith(".tsx") || a.endsWith(".jsx"));
|
|
411
|
+
fs.writeFileSync(fileArg, fixed);
|
|
412
|
+
console.log(`Applied auto-fixes to ${fileArg}`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
process.exit(1);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Importable for tests; the CLI runs only when this file is invoked directly.
|
|
420
|
+
if (require.main === module) main();
|
|
421
|
+
|
|
422
|
+
module.exports = {
|
|
423
|
+
validate,
|
|
424
|
+
applyFixes,
|
|
425
|
+
loadSpec,
|
|
426
|
+
parseIconNames,
|
|
427
|
+
hasLiteralColor,
|
|
428
|
+
insidePropValue,
|
|
429
|
+
openingTags,
|
|
430
|
+
ownProps,
|
|
431
|
+
};
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Open Graph fetch/proxy handlers.
|
|
3
|
+
*
|
|
4
|
+
* Uses the standard `Response` rather than `NextResponse`: `NextResponse`
|
|
5
|
+
* extends `Response`, so Next route handlers accept these return values
|
|
6
|
+
* unchanged, and the module no longer pulls `next/server` into core.
|
|
7
|
+
*/
|
|
2
8
|
import { type OGUrlValidationOptions } from './og-url-validation';
|
|
3
9
|
export interface OGData {
|
|
4
10
|
url: string;
|
|
@@ -12,12 +18,12 @@ export interface OGFetchOptions extends OGUrlValidationOptions {
|
|
|
12
18
|
userAgent?: string;
|
|
13
19
|
decodeEntities?: boolean;
|
|
14
20
|
}
|
|
15
|
-
export declare function handleOGFetch(request: Request, options?: OGFetchOptions): Promise<
|
|
21
|
+
export declare function handleOGFetch(request: Request, options?: OGFetchOptions): Promise<Response>;
|
|
16
22
|
export interface OGProxyOptions extends OGUrlValidationOptions {
|
|
17
23
|
userAgent?: string;
|
|
18
24
|
cacheMaxAge?: number;
|
|
19
25
|
}
|
|
20
|
-
export declare function handleOGProxy(request: Request, options?: OGProxyOptions): Promise<
|
|
26
|
+
export declare function handleOGProxy(request: Request, options?: OGProxyOptions): Promise<Response>;
|
|
21
27
|
export { OGUrlValidationError, validateOgUrl } from './og-url-validation';
|
|
22
28
|
export type { OGUrlValidationOptions } from './og-url-validation';
|
|
23
29
|
//# sourceMappingURL=og-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"og-utils.d.ts","sourceRoot":"","sources":["../../src/server/og-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"og-utils.d.ts","sourceRoot":"","sources":["../../src/server/og-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAGL,KAAK,sBAAsB,EAE5B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAe,SAAQ,sBAAsB;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA2DD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkFrG;AAED,MAAM,WAAW,cAAe,SAAQ,sBAAsB;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA0DrG;AAED,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/server/og-utils.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Open Graph fetch/proxy handlers.
|
|
3
|
+
*
|
|
4
|
+
* Uses the standard `Response` rather than `NextResponse`: `NextResponse`
|
|
5
|
+
* extends `Response`, so Next route handlers accept these return values
|
|
6
|
+
* unchanged, and the module no longer pulls `next/server` into core.
|
|
7
|
+
*/
|
|
2
8
|
import { fetchValidatedUrl, OGUrlValidationError, validateOgUrl, } from './og-url-validation';
|
|
3
9
|
function decodeHTMLEntities(text) {
|
|
4
10
|
return text.replace(/&(#?[a-zA-Z0-9]+);/g, (match, entity) => {
|
|
@@ -41,14 +47,14 @@ async function fetchWithTimeout(url, timeout = 5000, userAgent = 'Mozilla/5.0 (c
|
|
|
41
47
|
}
|
|
42
48
|
}
|
|
43
49
|
function validationErrorResponse() {
|
|
44
|
-
return
|
|
50
|
+
return Response.json({ error: 'URL is not allowed' }, { status: 400 });
|
|
45
51
|
}
|
|
46
52
|
export async function handleOGFetch(request, options = {}) {
|
|
47
53
|
const { timeout = 5000, userAgent = 'Mozilla/5.0 (compatible; OG-Fetcher/1.0)', decodeEntities = true, allowedDomains, } = options;
|
|
48
54
|
const { searchParams } = new URL(request.url);
|
|
49
55
|
const url = searchParams.get('url');
|
|
50
56
|
if (!url) {
|
|
51
|
-
return
|
|
57
|
+
return Response.json({ error: 'URL parameter is required' }, { status: 400 });
|
|
52
58
|
}
|
|
53
59
|
const validationOptions = { allowedDomains };
|
|
54
60
|
try {
|
|
@@ -99,11 +105,11 @@ export async function handleOGFetch(request, options = {}) {
|
|
|
99
105
|
ogData.title = decodeHTMLEntities(ogData.title);
|
|
100
106
|
ogData.description = decodeHTMLEntities(ogData.description);
|
|
101
107
|
}
|
|
102
|
-
return
|
|
108
|
+
return Response.json(ogData);
|
|
103
109
|
}
|
|
104
110
|
catch (error) {
|
|
105
111
|
console.error('Error fetching OG data:', error);
|
|
106
|
-
return
|
|
112
|
+
return Response.json({ error: 'Failed to fetch Open Graph data' }, { status: 500 });
|
|
107
113
|
}
|
|
108
114
|
}
|
|
109
115
|
export async function handleOGProxy(request, options = {}) {
|
|
@@ -111,7 +117,7 @@ export async function handleOGProxy(request, options = {}) {
|
|
|
111
117
|
const { searchParams } = new URL(request.url);
|
|
112
118
|
const url = searchParams.get('url');
|
|
113
119
|
if (!url) {
|
|
114
|
-
return
|
|
120
|
+
return Response.json({ error: 'URL parameter is required' }, { status: 400 });
|
|
115
121
|
}
|
|
116
122
|
const validationOptions = { allowedDomains };
|
|
117
123
|
try {
|
|
@@ -130,11 +136,11 @@ export async function handleOGProxy(request, options = {}) {
|
|
|
130
136
|
},
|
|
131
137
|
}, validationOptions);
|
|
132
138
|
if (!response.ok) {
|
|
133
|
-
return
|
|
139
|
+
return Response.json({ error: 'Failed to fetch image' }, { status: response.status >= 400 && response.status < 600 ? response.status : 502 });
|
|
134
140
|
}
|
|
135
141
|
const contentType = response.headers.get('content-type') || 'image/jpeg';
|
|
136
142
|
const buffer = await response.arrayBuffer();
|
|
137
|
-
return new
|
|
143
|
+
return new Response(buffer, {
|
|
138
144
|
headers: {
|
|
139
145
|
'Content-Type': contentType,
|
|
140
146
|
'Cache-Control': `public, max-age=${cacheMaxAge}`,
|
|
@@ -143,7 +149,7 @@ export async function handleOGProxy(request, options = {}) {
|
|
|
143
149
|
}
|
|
144
150
|
catch (error) {
|
|
145
151
|
console.error('Error proxying image:', error);
|
|
146
|
-
return
|
|
152
|
+
return Response.json({ error: 'Failed to proxy image' }, { status: 500 });
|
|
147
153
|
}
|
|
148
154
|
}
|
|
149
155
|
export { OGUrlValidationError, validateOgUrl } from './og-url-validation';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"og-utils.js","sourceRoot":"","sources":["../../src/server/og-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"og-utils.js","sourceRoot":"","sources":["../../src/server/og-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,39 @@
|
|
|
1
|
+
/* GENERATED by scripts/generate-utilities.mjs — do not edit.
|
|
2
|
+
* The class matrix lives in scripts/utilities.spec.mjs; change it there and
|
|
3
|
+
* re-run `pnpm generate:utilities`. */
|
|
4
|
+
|
|
1
5
|
$breakpoint-xs: 480px;
|
|
2
6
|
$breakpoint-s: 768px;
|
|
3
7
|
$breakpoint-m: 1024px;
|
|
4
8
|
$breakpoint-l: 1440px;
|
|
9
|
+
$breakpoint-xl: 1441px;
|
|
5
10
|
|
|
6
11
|
@mixin xs {
|
|
7
|
-
@media (max-width:
|
|
12
|
+
@media (max-width: 480px) {
|
|
8
13
|
@content;
|
|
9
14
|
}
|
|
10
15
|
}
|
|
11
16
|
|
|
12
17
|
@mixin s {
|
|
13
|
-
@media (max-width:
|
|
18
|
+
@media (max-width: 768px) {
|
|
14
19
|
@content;
|
|
15
20
|
}
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
@mixin m {
|
|
19
|
-
@media (max-width:
|
|
24
|
+
@media (max-width: 1024px) {
|
|
20
25
|
@content;
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
|
|
24
29
|
@mixin l {
|
|
25
|
-
@media (max-width:
|
|
30
|
+
@media (max-width: 1440px) {
|
|
31
|
+
@content;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@mixin xl {
|
|
36
|
+
@media (min-width: 1441px) {
|
|
26
37
|
@content;
|
|
27
38
|
}
|
|
28
|
-
}
|
|
39
|
+
}
|
package/dist/test/setup.js
CHANGED
|
@@ -6,6 +6,20 @@ class ResizeObserverMock {
|
|
|
6
6
|
unobserve() { }
|
|
7
7
|
disconnect() { }
|
|
8
8
|
}
|
|
9
|
+
/** jsdom ships no IntersectionObserver; the canvas effects gate their animation loop on it. */
|
|
10
|
+
class IntersectionObserverMock {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.root = null;
|
|
13
|
+
this.rootMargin = "";
|
|
14
|
+
this.thresholds = [];
|
|
15
|
+
}
|
|
16
|
+
observe() { }
|
|
17
|
+
unobserve() { }
|
|
18
|
+
disconnect() { }
|
|
19
|
+
takeRecords() {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
9
23
|
const installBrowserMocks = () => {
|
|
10
24
|
if (!("ResizeObserver" in globalThis)) {
|
|
11
25
|
Object.defineProperty(globalThis, "ResizeObserver", {
|
|
@@ -14,6 +28,13 @@ const installBrowserMocks = () => {
|
|
|
14
28
|
value: ResizeObserverMock,
|
|
15
29
|
});
|
|
16
30
|
}
|
|
31
|
+
if (!("IntersectionObserver" in globalThis)) {
|
|
32
|
+
Object.defineProperty(globalThis, "IntersectionObserver", {
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: IntersectionObserverMock,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
17
38
|
Object.defineProperty(window, "scrollTo", {
|
|
18
39
|
configurable: true,
|
|
19
40
|
writable: true,
|
package/dist/test/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,kBAAkB;IACtB,OAAO,KAAI,CAAC;IACZ,SAAS,KAAI,CAAC;IACd,UAAU,KAAI,CAAC;CAChB;AAED,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC/B,IAAI,CAAC,CAAC,gBAAgB,IAAI,UAAU,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE;YAClD,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,kBAAkB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE;QACxC,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;QAC1C,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;YACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;YACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;YACzB,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;YAC5B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;SACvB,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,mBAAmB,EAAE,CAAC;AAEtB,IAAI,CAAC,CAAC,OAAO,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;IACxC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE;QACpD,YAAY,EAAE,IAAI;QAClB,GAAG;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,GAAG,CAAC,KAAc;YAChB,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,EAAE,CAAC;IACV,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,mBAAmB,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,kBAAkB;IACtB,OAAO,KAAI,CAAC;IACZ,SAAS,KAAI,CAAC;IACd,UAAU,KAAI,CAAC;CAChB;AAED,+FAA+F;AAC/F,MAAM,wBAAwB;IAA9B;QACW,SAAI,GAAG,IAAI,CAAC;QACZ,eAAU,GAAG,EAAE,CAAC;QAChB,eAAU,GAAa,EAAE,CAAC;IAOrC,CAAC;IANC,OAAO,KAAI,CAAC;IACZ,SAAS,KAAI,CAAC;IACd,UAAU,KAAI,CAAC;IACf,WAAW;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC/B,IAAI,CAAC,CAAC,gBAAgB,IAAI,UAAU,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE;YAClD,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,kBAAkB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,CAAC,sBAAsB,IAAI,UAAU,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,sBAAsB,EAAE;YACxD,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,wBAAwB;SAChC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE;QACxC,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;QAC1C,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;YACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;YACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;YACzB,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;YAC5B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;SACvB,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,mBAAmB,EAAE,CAAC;AAEtB,IAAI,CAAC,CAAC,OAAO,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;IACxC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE;QACpD,YAAY,EAAE,IAAI;QAClB,GAAG;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,GAAG,CAAC,KAAc;YAChB,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,EAAE,CAAC;IACV,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,mBAAmB,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC"}
|