@zyncat/ui 0.11.0 → 0.13.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 +135 -40
- package/dist/alert.css +126 -121
- package/dist/alert.js +12 -14
- package/dist/alert.js.map +1 -1
- package/dist/avatar-group.js.map +1 -1
- package/dist/avatar.css +179 -174
- package/dist/avatar.js.map +1 -1
- package/dist/badge.css +166 -160
- package/dist/badge.js +1 -1
- package/dist/button.css +272 -246
- package/dist/button.js +1 -1
- package/dist/checkbox.css +158 -153
- package/dist/checkbox.js +2 -2
- package/dist/{chunk-AMFGY56I.js → chunk-227ZW4V7.js} +40 -32
- package/dist/chunk-227ZW4V7.js.map +1 -0
- package/dist/{chunk-2ERBBFZS.js → chunk-3MPF7FZV.js} +2 -2
- package/dist/chunk-3MPF7FZV.js.map +1 -0
- package/dist/{chunk-AIQXS2XY.js → chunk-43M6GQ4Q.js} +86 -79
- package/dist/chunk-43M6GQ4Q.js.map +1 -0
- package/dist/{chunk-7SZCJ7WI.js → chunk-45R4Z5XN.js} +3 -3
- package/dist/chunk-45R4Z5XN.js.map +1 -0
- package/dist/{chunk-I4XQ4PV2.js → chunk-4BSHB7R3.js} +9 -7
- package/dist/chunk-4BSHB7R3.js.map +1 -0
- package/dist/{chunk-YGGCQNNU.js → chunk-4C5RZXBT.js} +33 -34
- package/dist/chunk-4C5RZXBT.js.map +1 -0
- package/dist/{chunk-2QWJ6FAX.js → chunk-5PZ43DCG.js} +31 -15
- package/dist/chunk-5PZ43DCG.js.map +1 -0
- package/dist/{chunk-S5ZTZANS.js → chunk-7IZJERGA.js} +35 -12
- package/dist/chunk-7IZJERGA.js.map +1 -0
- package/dist/{chunk-DKVUPFQR.js → chunk-A5WTZACK.js} +22 -12
- package/dist/chunk-A5WTZACK.js.map +1 -0
- package/dist/{chunk-64UU4LGU.js → chunk-AADAJL7D.js} +3 -3
- package/dist/{chunk-64UU4LGU.js.map → chunk-AADAJL7D.js.map} +1 -1
- package/dist/{chunk-XJQQQJAO.js → chunk-CF4QHO4N.js} +21 -11
- package/dist/chunk-CF4QHO4N.js.map +1 -0
- package/dist/{chunk-WM5J5TDI.js → chunk-CNWTIMIP.js} +13 -17
- package/dist/chunk-CNWTIMIP.js.map +1 -0
- package/dist/{chunk-NGTA34V2.js → chunk-DDRSMHN4.js} +16 -10
- package/dist/chunk-DDRSMHN4.js.map +1 -0
- package/dist/{chunk-VTJTGVZZ.js → chunk-DMX2F6B4.js} +2 -2
- package/dist/chunk-DMX2F6B4.js.map +1 -0
- package/dist/{chunk-3SBCBYB7.js → chunk-EAI4POPB.js} +2 -2
- package/dist/{chunk-3SBCBYB7.js.map → chunk-EAI4POPB.js.map} +1 -1
- package/dist/{chunk-Y7AJQVWJ.js → chunk-EF6RPXU7.js} +17 -15
- package/dist/chunk-EF6RPXU7.js.map +1 -0
- package/dist/{chunk-WFHRAKN3.js → chunk-FONOS5RN.js} +14 -15
- package/dist/chunk-FONOS5RN.js.map +1 -0
- package/dist/{chunk-PMECHR3A.js → chunk-FQEHSKEI.js} +2 -2
- package/dist/chunk-FQEHSKEI.js.map +1 -0
- package/dist/chunk-HDSFWZ7L.js +12 -0
- package/dist/chunk-HDSFWZ7L.js.map +1 -0
- package/dist/{chunk-2F5PITAO.js → chunk-HY5MPISE.js} +2 -2
- package/dist/chunk-HY5MPISE.js.map +1 -0
- package/dist/{chunk-QDK66S4G.js → chunk-I45AU6KH.js} +3 -3
- package/dist/chunk-I45AU6KH.js.map +1 -0
- package/dist/{chunk-YGCVWGUG.js → chunk-IJS7TPGV.js} +153 -46
- package/dist/chunk-IJS7TPGV.js.map +1 -0
- package/dist/{chunk-62P3KD57.js → chunk-IUQAUBVM.js} +18 -11
- package/dist/chunk-IUQAUBVM.js.map +1 -0
- package/dist/chunk-JY6A2ZJZ.js +44 -0
- package/dist/chunk-JY6A2ZJZ.js.map +1 -0
- package/dist/{chunk-XWUWYSCT.js → chunk-M43IOM5C.js} +20 -10
- package/dist/chunk-M43IOM5C.js.map +1 -0
- package/dist/{chunk-S7B34VGN.js → chunk-OWNMRMPN.js} +3 -3
- package/dist/{chunk-S7B34VGN.js.map → chunk-OWNMRMPN.js.map} +1 -1
- package/dist/chunk-RFRE4WKX.js +22 -0
- package/dist/chunk-RFRE4WKX.js.map +1 -0
- package/dist/{chunk-NNXJCLTV.js → chunk-RJFGWJ4W.js} +2 -2
- package/dist/chunk-RJFGWJ4W.js.map +1 -0
- package/dist/{chunk-NEF5XAHG.js → chunk-TUTXXC3W.js} +4 -4
- package/dist/chunk-TUTXXC3W.js.map +1 -0
- package/dist/chunk-TVYH4AN7.js +70 -0
- package/dist/chunk-TVYH4AN7.js.map +1 -0
- package/dist/{chunk-U4MHX3KH.js → chunk-VAXCXZ53.js} +33 -12
- package/dist/chunk-VAXCXZ53.js.map +1 -0
- package/dist/chunk-XNIYSAMJ.js +52 -0
- package/dist/chunk-XNIYSAMJ.js.map +1 -0
- package/dist/{chunk-CONSWNIV.js → chunk-Y2YA7QRF.js} +6 -6
- package/dist/chunk-Y2YA7QRF.js.map +1 -0
- package/dist/cli.js +1828 -0
- package/dist/collapse.css +70 -61
- package/dist/collapse.js +2 -2
- package/dist/confetti.css +45 -0
- package/dist/confetti.js +540 -0
- package/dist/confetti.js.map +1 -0
- package/dist/count-badge.js +3 -3
- package/dist/count-badge.js.map +1 -1
- package/dist/date-field.js +24 -19
- package/dist/date-field.js.map +1 -1
- package/dist/date-picker.css +563 -559
- package/dist/date-range-field.js +58 -41
- package/dist/date-range-field.js.map +1 -1
- package/dist/datetime-field.js +24 -19
- package/dist/datetime-field.js.map +1 -1
- package/dist/dialog.css +176 -172
- package/dist/dialog.js +30 -19
- package/dist/dialog.js.map +1 -1
- package/dist/digit-strip.css +65 -0
- package/dist/dropdown.css +65 -0
- package/dist/dropdown.js +350 -0
- package/dist/dropdown.js.map +1 -0
- package/dist/emoji-picker.js +713 -0
- package/dist/emoji-picker.js.map +1 -0
- package/dist/facebook-feed.css +880 -0
- package/dist/facebook-feed.js +697 -0
- package/dist/facebook-feed.js.map +1 -0
- package/dist/flow-field.css +49 -0
- package/dist/flow-field.js +269 -0
- package/dist/flow-field.js.map +1 -0
- package/dist/glide.js +3 -3
- package/dist/icon.css +34 -30
- package/dist/input.css +296 -318
- package/dist/instagram-feed.css +378 -0
- package/dist/instagram-feed.js +272 -0
- package/dist/instagram-feed.js.map +1 -0
- package/dist/lens.css +119 -0
- package/dist/lens.js +307 -0
- package/dist/lens.js.map +1 -0
- package/dist/mcp.js +379 -181
- package/dist/menu-surface.css +127 -0
- package/dist/modal.css +11 -7
- package/dist/modal.js +24 -17
- package/dist/modal.js.map +1 -1
- package/dist/morphing-text.css +84 -0
- package/dist/morphing-text.js +256 -0
- package/dist/morphing-text.js.map +1 -0
- package/dist/motion-devtools.css +237 -233
- package/dist/motion-devtools.js +7 -6
- package/dist/motion-devtools.js.map +1 -1
- package/dist/motion-tokens.js +1 -1
- package/dist/multi-select.js +20 -17
- package/dist/multi-select.js.map +1 -1
- package/dist/number-field.js +11 -7
- package/dist/number-field.js.map +1 -1
- package/dist/odometer.css +58 -59
- package/dist/odometer.js +109 -0
- package/dist/odometer.js.map +1 -0
- package/dist/otp-field.js.map +1 -1
- package/dist/overlay.css +24 -20
- package/dist/pagination.css +42 -38
- package/dist/pagination.js +6 -12
- package/dist/pagination.js.map +1 -1
- package/dist/popover.css +69 -65
- package/dist/popover.js +12 -10
- package/dist/radio-group.css +275 -276
- package/dist/radio-group.js +70 -95
- package/dist/radio-group.js.map +1 -1
- package/dist/select.css +291 -386
- package/dist/select.js +18 -15
- package/dist/select.js.map +1 -1
- package/dist/sheet.css +47 -23
- package/dist/sheet.js +11 -10
- package/dist/status-badge.js +3 -3
- package/dist/status-badge.js.map +1 -1
- package/dist/styles.css +221 -0
- package/dist/support-rail.css +421 -0
- package/dist/support-rail.js +243 -0
- package/dist/support-rail.js.map +1 -0
- package/dist/table.css +333 -323
- package/dist/table.js +32 -21
- package/dist/table.js.map +1 -1
- package/dist/tabs.css +163 -156
- package/dist/tabs.js +26 -20
- package/dist/tabs.js.map +1 -1
- package/dist/tag.css +209 -231
- package/dist/tag.js +11 -10
- package/dist/tag.js.map +1 -1
- package/dist/text-field.js +7 -67
- package/dist/text-field.js.map +1 -1
- package/dist/textarea.css +205 -211
- package/dist/textarea.js +12 -12
- package/dist/textarea.js.map +1 -1
- package/dist/theme.js +69 -0
- package/dist/theme.js.map +1 -0
- package/dist/tiktok.css +662 -0
- package/dist/tiktok.js +494 -0
- package/dist/tiktok.js.map +1 -0
- package/dist/time-field.js +6 -6
- package/dist/time-field.js.map +1 -1
- package/dist/toast.css +237 -233
- package/dist/toast.js +43 -47
- package/dist/toast.js.map +1 -1
- package/dist/toggle-tag.js +1 -1
- package/dist/toggle-tag.js.map +1 -1
- package/dist/toggle.css +139 -135
- package/dist/toggle.js.map +1 -1
- package/dist/tooltip.css +79 -78
- package/dist/tooltip.js +50 -60
- package/dist/tooltip.js.map +1 -1
- package/dist/trigger.css +13 -0
- package/dist/{alert.d.ts → types/components/composites/alert/Alert.d.ts} +13 -15
- package/dist/{date-field.d.ts → types/components/composites/date-picker/DateField.d.ts} +4 -10
- package/dist/types/components/composites/date-picker/DateRangeField.d.ts +21 -0
- package/dist/{datetime-field.d.ts → types/components/composites/date-picker/DateTimeField.d.ts} +4 -10
- package/dist/{time-field.d.ts → types/components/composites/date-picker/TimeField.d.ts} +5 -11
- package/dist/types/components/composites/date-picker/calendar-panel.d.ts +16 -0
- package/dist/types/components/composites/date-picker/date-utils.d.ts +12 -0
- package/dist/types/components/composites/date-picker/field-shell.d.ts +46 -0
- package/dist/types/components/composites/date-picker/range-panel.d.ts +24 -0
- package/dist/types/components/composites/date-picker/time-core.d.ts +14 -0
- package/dist/types/components/composites/date-picker/use-day-focus.d.ts +2 -0
- package/dist/{dialog.d.ts → types/components/composites/dialog/Dialog.d.ts} +10 -11
- package/dist/types/components/composites/dropdown/Dropdown.d.ts +37 -0
- package/dist/types/components/composites/dropdown/menu-panel.d.ts +7 -0
- package/dist/types/components/composites/dropdown/types.d.ts +71 -0
- package/dist/types/components/composites/emoji-picker/EmojiPickerPanel.d.ts +45 -0
- package/dist/types/components/composites/emoji-picker/category-icons.d.ts +9 -0
- package/dist/types/components/composites/emoji-picker/data.d.ts +33 -0
- package/dist/types/components/composites/emoji-picker/dom.d.ts +19 -0
- package/dist/types/components/composites/emoji-picker/getEmojiUrl.d.ts +2 -0
- package/dist/types/components/composites/emoji-picker/navigation.d.ts +7 -0
- package/dist/types/components/composites/emoji-picker/picker.d.ts +20 -0
- package/dist/types/components/composites/emoji-picker/react/category-bar.d.ts +6 -0
- package/dist/types/components/composites/emoji-picker/react/useEmojiPicker.d.ts +50 -0
- package/dist/types/components/composites/emoji-picker/scaffold.d.ts +8 -0
- package/dist/types/components/composites/emoji-picker/search.d.ts +1 -0
- package/dist/types/components/composites/emoji-picker/types.d.ts +13 -0
- package/dist/{modal.d.ts → types/components/composites/modal/Modal.d.ts} +10 -11
- package/dist/{pagination.d.ts → types/components/composites/pagination/Pagination.d.ts} +5 -8
- package/dist/{popover.d.ts → types/components/composites/popover/Popover.d.ts} +11 -14
- package/dist/{multi-select.d.ts → types/components/composites/select/MultiSelect.d.ts} +12 -11
- package/dist/{select.d.ts → types/components/composites/select/Select.d.ts} +16 -14
- package/dist/types/components/composites/select/core/index.d.ts +4 -0
- package/dist/types/components/composites/select/core/menu.d.ts +13 -0
- package/dist/types/components/composites/select/core/panel.d.ts +18 -0
- package/dist/types/components/composites/select/core/trigger.d.ts +16 -0
- package/dist/{types-SGMShK7R.d.ts → types/components/composites/select/core/types.d.ts} +13 -6
- package/dist/types/components/composites/select/core/use-listbox.d.ts +42 -0
- package/dist/{sheet.d.ts → types/components/composites/sheet/Sheet.d.ts} +10 -11
- package/dist/types/components/composites/sheet/use-sheet-drag.d.ts +13 -0
- package/dist/{table.d.ts → types/components/composites/table/Table.d.ts} +12 -12
- package/dist/{tabs.d.ts → types/components/composites/tabs/Tabs.d.ts} +13 -13
- package/dist/types/components/composites/toast/Toast.d.ts +10 -0
- package/dist/{toast-store.d.ts → types/components/composites/toast/toast-store.d.ts} +12 -14
- package/dist/{tooltip.d.ts → types/components/composites/tooltip/Tooltip.d.ts} +6 -10
- package/dist/types/components/composites/tooltip/tooltip-host.d.ts +1 -0
- package/dist/types/components/composites/tooltip/tooltip-store.d.ts +29 -0
- package/dist/types/components/compound/support-rail/SupportRail.d.ts +41 -0
- package/dist/types/components/dev/MotionDevtools.d.ts +24 -0
- package/dist/types/components/dev/slowmo-engine.d.ts +27 -0
- package/dist/types/components/expressive/confetti/Confetti.d.ts +43 -0
- package/dist/types/components/expressive/facebook-feed/FacebookFeed.d.ts +73 -0
- package/dist/types/components/expressive/facebook-feed/chrome.d.ts +30 -0
- package/dist/types/components/expressive/facebook-feed/icons.d.ts +21 -0
- package/dist/types/components/expressive/facebook-feed/post.d.ts +25 -0
- package/dist/types/components/expressive/facebook-feed/reel.d.ts +26 -0
- package/dist/types/components/expressive/facebook-feed/story.d.ts +20 -0
- package/dist/types/components/expressive/flow-field/FlowField.d.ts +23 -0
- package/dist/types/components/expressive/instagram-feed/InstagramFeed.d.ts +59 -0
- package/dist/types/components/expressive/lens/Lens.d.ts +23 -0
- package/dist/types/components/expressive/morphing-text/MorphingText.d.ts +21 -0
- package/dist/types/components/expressive/odometer/Odometer.d.ts +21 -0
- package/dist/types/components/expressive/tiktok/TikTok.d.ts +85 -0
- package/dist/types/components/expressive/tiktok/glyphs.d.ts +40 -0
- package/dist/types/components/expressive/typing-lines/TypingLines.d.ts +25 -0
- package/dist/types/components/expressive/weight-field/WeightField.d.ts +19 -0
- package/dist/types/components/expressive/youtube/YouTube.d.ts +73 -0
- package/dist/types/components/expressive/youtube/format.d.ts +2 -0
- package/dist/types/components/expressive/youtube/glyphs.d.ts +16 -0
- package/dist/types/components/expressive/youtube/media.d.ts +8 -0
- package/dist/types/components/expressive/youtube/post.d.ts +19 -0
- package/dist/types/components/expressive/youtube/short.d.ts +18 -0
- package/dist/types/components/expressive/youtube/video.d.ts +14 -0
- package/dist/types/components/internal/collection/collection.d.ts +19 -0
- package/dist/types/components/internal/glass/glint.d.ts +1 -0
- package/dist/types/components/internal/hooks/use-controllable.d.ts +1 -0
- package/dist/types/components/internal/hooks/use-media-query.d.ts +1 -0
- package/dist/types/components/internal/hooks/use-scroll-edges.d.ts +10 -0
- package/dist/types/components/internal/hooks/use-typeahead.d.ts +5 -0
- package/dist/types/components/internal/icon/Icon.d.ts +33 -0
- package/dist/types/components/internal/icon/IconSlot.d.ts +7 -0
- package/dist/types/components/internal/menu/menu-row.d.ts +11 -0
- package/dist/types/components/internal/overlay/focus.d.ts +8 -0
- package/dist/types/components/internal/overlay/layer.d.ts +38 -0
- package/dist/types/components/internal/overlay/modal.d.ts +18 -0
- package/dist/types/components/internal/overlay/position.d.ts +14 -0
- package/dist/types/components/internal/support/types.d.ts +15 -0
- package/dist/types/components/internal/utils/activation.d.ts +23 -0
- package/dist/types/components/internal/utils/cx.d.ts +1 -0
- package/dist/types/components/internal/utils/token-px.d.ts +1 -0
- package/dist/{avatar.d.ts → types/components/primitives/avatar/Avatar.d.ts} +10 -12
- package/dist/{avatar-group.d.ts → types/components/primitives/avatar/AvatarGroup.d.ts} +7 -9
- package/dist/{badge.d.ts → types/components/primitives/badge/Badge.d.ts} +8 -10
- package/dist/types/components/primitives/badge/CountBadge.d.ts +8 -0
- package/dist/types/components/primitives/badge/StatusBadge.d.ts +15 -0
- package/dist/types/components/primitives/badge/digit-strip.d.ts +5 -0
- package/dist/{button.d.ts → types/components/primitives/button/Button.d.ts} +6 -8
- package/dist/{checkbox.d.ts → types/components/primitives/checkbox/Checkbox.d.ts} +6 -8
- package/dist/types/components/primitives/checkbox/check-glyph.d.ts +6 -0
- package/dist/{collapse.d.ts → types/components/primitives/collapse/Collapse.d.ts} +12 -13
- package/dist/types/components/primitives/collapse/collapse.typecheck.d.ts +2 -0
- package/dist/{number-field.d.ts → types/components/primitives/input/NumberField.d.ts} +7 -9
- package/dist/{otp-field.d.ts → types/components/primitives/input/OtpField.d.ts} +6 -8
- package/dist/{text-field.d.ts → types/components/primitives/input/TextField.d.ts} +7 -9
- package/dist/types/components/primitives/input/field-chrome.d.ts +45 -0
- package/dist/{radio-group.d.ts → types/components/primitives/radio-group/RadioGroup.d.ts} +8 -10
- package/dist/{tag.d.ts → types/components/primitives/tag/Tag.d.ts} +9 -12
- package/dist/{toggle-tag.d.ts → types/components/primitives/tag/ToggleTag.d.ts} +7 -8
- package/dist/{textarea.d.ts → types/components/primitives/textarea/Textarea.d.ts} +7 -9
- package/dist/{toggle.d.ts → types/components/primitives/toggle/Toggle.d.ts} +6 -8
- package/dist/{dom-props-C0jrllBw.d.ts → types/dom-props.d.ts} +1 -3
- package/dist/types/engine/animate.d.ts +30 -0
- package/dist/types/engine/drag.d.ts +17 -0
- package/dist/types/engine/ease.d.ts +15 -0
- package/dist/types/engine/flip.d.ts +18 -0
- package/dist/types/engine/index.d.ts +4 -0
- package/dist/types/engine/loop.d.ts +9 -0
- package/dist/types/motion/element.d.ts +17 -0
- package/dist/types/motion/flip.d.ts +4 -0
- package/dist/types/motion/glide.d.ts +11 -0
- package/dist/types/motion/motion-timing.d.ts +16 -0
- package/dist/types/motion/presence-context.d.ts +11 -0
- package/dist/types/motion/presence.d.ts +12 -0
- package/dist/types/motion/presets.d.ts +6 -0
- package/dist/{timing-7JA_zQHP.d.ts → types/motion/timing.d.ts} +9 -9
- package/dist/types/motion/use-motion.d.ts +17 -0
- package/dist/types/tokens/component-styles.generated.d.ts +262 -0
- package/dist/{motion-scale-Canq4stZ.d.ts → types/tokens/motion-scale.d.ts} +4 -4
- package/dist/{motion-tokens.d.ts → types/tokens/motion-tokens.d.ts} +9 -9
- package/dist/types/tokens/theme-tokens.generated.d.ts +1249 -0
- package/dist/types/tokens/theme.d.ts +12 -0
- package/dist/typing-lines.css +92 -0
- package/dist/typing-lines.js +139 -0
- package/dist/typing-lines.js.map +1 -0
- package/dist/weight-field.css +84 -0
- package/dist/weight-field.js +17 -0
- package/dist/weight-field.js.map +1 -0
- package/dist/youtube.css +611 -0
- package/dist/youtube.js +814 -0
- package/dist/youtube.js.map +1 -0
- package/package.json +155 -49
- package/skills/zyncat-ui/SKILL.md +95 -0
- package/skills/zyncat-ui/references/components.md +85 -0
- package/skills/zyncat-ui/references/recipes.md +171 -0
- package/skills/zyncat-ui/references/theming.md +83 -0
- package/src/components/composites/alert/Alert.tsx +13 -11
- package/src/components/composites/alert/Alert.usage.md +15 -0
- package/src/components/composites/alert/alert.css +126 -121
- package/src/components/composites/date-picker/DateField.tsx +7 -2
- package/src/components/composites/date-picker/DateField.usage.md +10 -0
- package/src/components/composites/date-picker/DateRangeField.tsx +18 -16
- package/src/components/composites/date-picker/DateRangeField.usage.md +10 -0
- package/src/components/composites/date-picker/DateTimeField.tsx +10 -5
- package/src/components/composites/date-picker/DateTimeField.usage.md +12 -0
- package/src/components/composites/date-picker/TimeField.tsx +3 -1
- package/src/components/composites/date-picker/TimeField.usage.md +12 -0
- package/src/components/composites/date-picker/calendar-panel.tsx +15 -10
- package/src/components/composites/date-picker/date-picker.css +563 -559
- package/src/components/composites/date-picker/field-shell.tsx +9 -3
- package/src/components/composites/date-picker/range-panel.tsx +23 -8
- package/src/components/composites/date-picker/time-core.tsx +2 -0
- package/src/components/composites/dialog/Dialog.tsx +30 -15
- package/src/components/composites/dialog/Dialog.usage.md +17 -0
- package/src/components/composites/dialog/dialog.css +176 -172
- package/src/components/composites/dropdown/Dropdown.tsx +184 -0
- package/src/components/composites/dropdown/Dropdown.usage.md +19 -0
- package/src/components/composites/dropdown/dropdown.css +65 -0
- package/src/components/composites/dropdown/menu-panel.tsx +255 -0
- package/src/components/composites/dropdown/types.ts +95 -0
- package/src/components/composites/emoji-picker/EmojiPickerPanel.tsx +153 -0
- package/src/components/composites/emoji-picker/EmojiPickerPanel.usage.md +26 -0
- package/src/components/composites/emoji-picker/category-icons.ts +29 -0
- package/src/components/composites/emoji-picker/data.ts +83 -0
- package/src/components/composites/emoji-picker/dom.ts +79 -0
- package/src/components/composites/emoji-picker/getEmojiUrl.ts +17 -0
- package/src/components/composites/emoji-picker/navigation.ts +86 -0
- package/src/components/composites/emoji-picker/picker.ts +169 -0
- package/src/components/composites/emoji-picker/react/category-bar.tsx +77 -0
- package/src/components/composites/emoji-picker/react/useEmojiPicker.ts +139 -0
- package/src/components/composites/emoji-picker/scaffold.ts +74 -0
- package/src/components/composites/emoji-picker/search.ts +79 -0
- package/src/components/composites/emoji-picker/styles.css +221 -0
- package/src/components/composites/emoji-picker/types.ts +14 -0
- package/src/components/composites/modal/Modal.tsx +24 -13
- package/src/components/composites/modal/Modal.usage.md +24 -0
- package/src/components/composites/modal/modal.css +11 -7
- package/src/components/composites/pagination/Pagination.tsx +6 -11
- package/src/components/composites/pagination/Pagination.usage.md +12 -0
- package/src/components/composites/pagination/pagination.css +42 -38
- package/src/components/composites/popover/Popover.tsx +22 -7
- package/src/components/composites/popover/Popover.usage.md +15 -0
- package/src/components/composites/popover/popover.css +69 -65
- package/src/components/composites/select/MultiSelect.tsx +13 -5
- package/src/components/composites/select/MultiSelect.usage.md +12 -0
- package/src/components/composites/select/Select.tsx +23 -7
- package/src/components/composites/select/Select.usage.md +20 -0
- package/src/components/composites/select/core/index.ts +1 -1
- package/src/components/composites/select/core/menu.tsx +8 -6
- package/src/components/composites/select/core/panel.tsx +25 -26
- package/src/components/composites/select/core/trigger.tsx +36 -24
- package/src/components/composites/select/core/types.ts +17 -15
- package/src/components/composites/select/core/use-listbox.ts +22 -21
- package/src/components/composites/select/select.css +291 -386
- package/src/components/composites/sheet/Sheet.tsx +28 -18
- package/src/components/composites/sheet/Sheet.usage.md +15 -0
- package/src/components/composites/sheet/sheet.css +47 -23
- package/src/components/composites/sheet/use-sheet-drag.ts +19 -15
- package/src/components/composites/table/Table.tsx +17 -6
- package/src/components/composites/table/Table.usage.md +19 -0
- package/src/components/composites/table/table.css +333 -323
- package/src/components/composites/tabs/Tabs.tsx +31 -23
- package/src/components/composites/tabs/Tabs.usage.md +13 -0
- package/src/components/composites/tabs/tabs.css +163 -156
- package/src/components/composites/toast/Toast.tsx +48 -51
- package/src/components/composites/toast/Toast.usage.md +23 -0
- package/src/components/composites/toast/toast-store.usage.md +16 -0
- package/src/components/composites/toast/toast.css +237 -233
- package/src/components/composites/tooltip/Tooltip.tsx +13 -8
- package/src/components/composites/tooltip/Tooltip.usage.md +14 -0
- package/src/components/composites/tooltip/tooltip-host.tsx +29 -61
- package/src/components/composites/tooltip/tooltip-store.ts +10 -0
- package/src/components/composites/tooltip/tooltip.css +79 -78
- package/src/components/compound/support-rail/SupportRail.tsx +343 -0
- package/src/components/compound/support-rail/SupportRail.usage.md +18 -0
- package/src/components/compound/support-rail/support-rail.css +421 -0
- package/src/components/dev/MotionDevtools.tsx +3 -1
- package/src/components/dev/MotionDevtools.usage.md +16 -0
- package/src/components/dev/motion-devtools.css +237 -233
- package/src/components/expressive/confetti/Confetti.tsx +727 -0
- package/src/components/expressive/confetti/Confetti.usage.md +18 -0
- package/src/components/expressive/confetti/confetti.css +45 -0
- package/src/components/expressive/facebook-feed/FacebookFeed.tsx +200 -0
- package/src/components/expressive/facebook-feed/FacebookFeed.usage.md +18 -0
- package/src/components/expressive/facebook-feed/chrome.tsx +120 -0
- package/src/components/expressive/facebook-feed/facebook-feed.css +880 -0
- package/src/components/expressive/facebook-feed/icons.tsx +145 -0
- package/src/components/expressive/facebook-feed/post.tsx +213 -0
- package/src/components/expressive/facebook-feed/reel.tsx +199 -0
- package/src/components/expressive/facebook-feed/story.tsx +132 -0
- package/src/components/expressive/flow-field/FlowField.tsx +348 -0
- package/src/components/expressive/flow-field/FlowField.usage.md +19 -0
- package/src/components/expressive/flow-field/flow-field.css +49 -0
- package/src/components/expressive/instagram-feed/InstagramFeed.tsx +374 -0
- package/src/components/expressive/instagram-feed/InstagramFeed.usage.md +18 -0
- package/src/components/expressive/instagram-feed/instagram-feed.css +378 -0
- package/src/components/expressive/lens/Lens.tsx +415 -0
- package/src/components/expressive/lens/Lens.usage.md +20 -0
- package/src/components/expressive/lens/lens.css +119 -0
- package/src/components/expressive/morphing-text/MorphingText.tsx +328 -0
- package/src/components/expressive/morphing-text/MorphingText.usage.md +19 -0
- package/src/components/expressive/morphing-text/morphing-text.css +84 -0
- package/src/components/expressive/odometer/Odometer.tsx +158 -0
- package/src/components/expressive/odometer/Odometer.usage.md +17 -0
- package/src/components/expressive/odometer/odometer.css +61 -0
- package/src/components/expressive/tiktok/TikTok.tsx +542 -0
- package/src/components/expressive/tiktok/TikTok.usage.md +17 -0
- package/src/components/expressive/tiktok/glyphs.tsx +163 -0
- package/src/components/expressive/tiktok/tiktok.css +662 -0
- package/src/components/expressive/typing-lines/TypingLines.tsx +0 -0
- package/src/components/expressive/typing-lines/TypingLines.usage.md +17 -0
- package/src/components/expressive/typing-lines/typing-lines.css +92 -0
- package/src/components/expressive/weight-field/WeightField.tsx +41 -0
- package/src/components/expressive/weight-field/WeightField.usage.md +20 -0
- package/src/components/expressive/weight-field/weight-field.css +84 -0
- package/src/components/expressive/youtube/YouTube.tsx +192 -0
- package/src/components/expressive/youtube/YouTube.usage.md +18 -0
- package/src/components/expressive/youtube/format.ts +22 -0
- package/src/components/expressive/youtube/glyphs.tsx +235 -0
- package/src/components/expressive/youtube/media.tsx +18 -0
- package/src/components/expressive/youtube/post.tsx +282 -0
- package/src/components/expressive/youtube/short.tsx +212 -0
- package/src/components/expressive/youtube/video.tsx +75 -0
- package/src/components/expressive/youtube/youtube.css +611 -0
- package/src/components/internal/collection/collection.ts +44 -0
- package/src/components/internal/glass/glass.css +88 -84
- package/src/components/internal/hooks/use-media-query.ts +20 -0
- package/src/components/internal/hooks/use-typeahead.ts +28 -0
- package/src/components/internal/icon/Icon.tsx +2 -0
- package/src/components/internal/icon/IconSlot.tsx +2 -0
- package/src/components/internal/icon/icon.css +34 -30
- package/src/components/internal/menu/menu-row.tsx +34 -0
- package/src/components/internal/menu/menu-surface.css +127 -0
- package/src/components/internal/overlay/focus.ts +26 -10
- package/src/components/internal/overlay/layer.tsx +50 -9
- package/src/components/internal/overlay/modal.tsx +14 -12
- package/src/components/internal/overlay/overlay.css +24 -20
- package/src/components/internal/overlay/position.ts +19 -9
- package/src/components/internal/overlay/trigger.css +13 -0
- package/src/components/internal/support/types.ts +16 -0
- package/src/components/internal/utils/activation.ts +78 -0
- package/src/components/primitives/avatar/Avatar.tsx +2 -0
- package/src/components/primitives/avatar/Avatar.usage.md +12 -0
- package/src/components/primitives/avatar/AvatarGroup.tsx +3 -1
- package/src/components/primitives/avatar/AvatarGroup.usage.md +15 -0
- package/src/components/primitives/avatar/avatar.css +179 -174
- package/src/components/primitives/badge/Badge.tsx +3 -1
- package/src/components/primitives/badge/Badge.usage.md +14 -0
- package/src/components/primitives/badge/CountBadge.tsx +2 -2
- package/src/components/primitives/badge/CountBadge.usage.md +13 -0
- package/src/components/primitives/badge/StatusBadge.tsx +3 -1
- package/src/components/primitives/badge/StatusBadge.usage.md +14 -0
- package/src/components/primitives/badge/badge.css +166 -160
- package/src/components/primitives/badge/digit-strip.css +65 -0
- package/src/components/primitives/badge/{odometer.tsx → digit-strip.tsx} +3 -3
- package/src/components/primitives/button/Button.tsx +2 -0
- package/src/components/primitives/button/Button.usage.md +14 -0
- package/src/components/primitives/button/button.css +272 -246
- package/src/components/primitives/checkbox/Checkbox.tsx +3 -1
- package/src/components/primitives/checkbox/Checkbox.usage.md +12 -0
- package/src/components/primitives/checkbox/check-glyph.tsx +1 -0
- package/src/components/primitives/checkbox/checkbox.css +158 -153
- package/src/components/primitives/collapse/Collapse.tsx +3 -1
- package/src/components/primitives/collapse/Collapse.usage.md +17 -0
- package/src/components/primitives/collapse/collapse.css +70 -61
- package/src/components/primitives/collapse/collapse.typecheck.tsx +2 -0
- package/src/components/primitives/input/NumberField.tsx +18 -5
- package/src/components/primitives/input/NumberField.usage.md +12 -0
- package/src/components/primitives/input/OtpField.tsx +2 -0
- package/src/components/primitives/input/OtpField.usage.md +12 -0
- package/src/components/primitives/input/TextField.tsx +16 -4
- package/src/components/primitives/input/TextField.usage.md +13 -0
- package/src/components/primitives/input/field-chrome.tsx +11 -2
- package/src/components/primitives/input/input.css +296 -318
- package/src/components/primitives/radio-group/RadioGroup.tsx +20 -44
- package/src/components/primitives/radio-group/RadioGroup.usage.md +13 -0
- package/src/components/primitives/radio-group/radio-group.css +275 -276
- package/src/components/primitives/tag/Tag.tsx +10 -6
- package/src/components/primitives/tag/Tag.usage.md +14 -0
- package/src/components/primitives/tag/ToggleTag.tsx +4 -2
- package/src/components/primitives/tag/ToggleTag.usage.md +14 -0
- package/src/components/primitives/tag/tag.css +209 -231
- package/src/components/primitives/textarea/Textarea.tsx +17 -7
- package/src/components/primitives/textarea/Textarea.usage.md +12 -0
- package/src/components/primitives/textarea/textarea.css +205 -211
- package/src/components/primitives/toggle/Toggle.tsx +3 -1
- package/src/components/primitives/toggle/Toggle.usage.md +12 -0
- package/src/components/primitives/toggle/toggle.css +139 -135
- package/src/engine/animate.ts +40 -13
- package/src/engine/ease.ts +1 -0
- package/src/engine/flip.ts +32 -15
- package/src/engine/index.ts +2 -1
- package/src/engine/loop.ts +97 -0
- package/src/mcp/server.ts +315 -218
- package/src/motion/element.tsx +1 -0
- package/src/motion/flip.ts +29 -10
- package/src/motion/glide.tsx +11 -14
- package/src/motion/glide.usage.md +15 -0
- package/src/motion/motion-timing.ts +3 -3
- package/src/motion/presence.tsx +12 -5
- package/src/motion/presets.ts +13 -0
- package/src/motion/timing.ts +1 -0
- package/src/motion/use-motion.ts +16 -3
- package/src/styles.css +5 -0
- package/src/tokens/avatar.css +20 -16
- package/src/tokens/color.css +67 -56
- package/src/tokens/component-styles.generated.ts +270 -0
- package/src/tokens/elevation.css +28 -17
- package/src/tokens/fonts.css +1 -1
- package/src/tokens/glass.css +19 -15
- package/src/tokens/icons.css +8 -4
- package/src/tokens/layers.css +9 -4
- package/src/tokens/motion-scale.ts +4 -0
- package/src/tokens/motion-tokens.ts +42 -12
- package/src/tokens/motion-tokens.usage.md +16 -0
- package/src/tokens/motion.css +63 -45
- package/src/tokens/radius.css +12 -8
- package/src/tokens/semantic.css +62 -54
- package/src/tokens/spacing.css +25 -21
- package/src/tokens/theme-tokens.generated.ts +1278 -0
- package/src/tokens/theme.tsx +83 -0
- package/src/tokens/theme.usage.md +36 -0
- package/src/tokens/typography.css +53 -49
- package/dist/chunk-2ERBBFZS.js.map +0 -1
- package/dist/chunk-2F5PITAO.js.map +0 -1
- package/dist/chunk-2QWJ6FAX.js.map +0 -1
- package/dist/chunk-62P3KD57.js.map +0 -1
- package/dist/chunk-7SZCJ7WI.js.map +0 -1
- package/dist/chunk-AIQXS2XY.js.map +0 -1
- package/dist/chunk-AMFGY56I.js.map +0 -1
- package/dist/chunk-CONSWNIV.js.map +0 -1
- package/dist/chunk-DKVUPFQR.js.map +0 -1
- package/dist/chunk-I4XQ4PV2.js.map +0 -1
- package/dist/chunk-NEF5XAHG.js.map +0 -1
- package/dist/chunk-NGTA34V2.js.map +0 -1
- package/dist/chunk-NNXJCLTV.js.map +0 -1
- package/dist/chunk-PMECHR3A.js.map +0 -1
- package/dist/chunk-QDK66S4G.js.map +0 -1
- package/dist/chunk-S5ZTZANS.js.map +0 -1
- package/dist/chunk-U4MHX3KH.js.map +0 -1
- package/dist/chunk-VTJTGVZZ.js.map +0 -1
- package/dist/chunk-WFHRAKN3.js.map +0 -1
- package/dist/chunk-WM5J5TDI.js.map +0 -1
- package/dist/chunk-XJQQQJAO.js.map +0 -1
- package/dist/chunk-XWUWYSCT.js.map +0 -1
- package/dist/chunk-Y7AJQVWJ.js.map +0 -1
- package/dist/chunk-YGCVWGUG.js.map +0 -1
- package/dist/chunk-YGGCQNNU.js.map +0 -1
- package/dist/count-badge.d.ts +0 -13
- package/dist/date-range-field.d.ts +0 -33
- package/dist/field-chrome-CMPOQSLs.d.ts +0 -28
- package/dist/field-shell-Cuda-feL.d.ts +0 -24
- package/dist/glide.d.ts +0 -15
- package/dist/motion-devtools.d.ts +0 -51
- package/dist/status-badge.d.ts +0 -19
- package/dist/toast.d.ts +0 -12
- package/llms.txt +0 -220
- package/src/components/primitives/badge/odometer.css +0 -62
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zyncat-ui
|
|
3
|
+
description: Use when writing or reviewing React code in a project that uses @zyncat/ui - picking which component fits a job, rendering or composing components, styling/theming them, or debugging their behavior. Load BEFORE importing or rendering any @zyncat/ui component.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Building with @zyncat/ui
|
|
7
|
+
|
|
8
|
+
React 19 design system: accessible, animated components on a closed CSS token vocabulary.
|
|
9
|
+
No Tailwind, no CSS-in-JS, no animation library - a built-in WAAPI motion engine drives everything.
|
|
10
|
+
|
|
11
|
+
## The contract
|
|
12
|
+
|
|
13
|
+
1. **Never write a component's props from memory or from this skill.** Before writing any JSX that
|
|
14
|
+
renders a Zyncat UI component, call the `get_component` MCP tool with EVERY component the change
|
|
15
|
+
touches, in one call: `get_component(["select", "text-field", "dialog"])`. It returns the
|
|
16
|
+
maintainers' usage notes, the live docs URL and the complete prop types for the version actually
|
|
17
|
+
installed. An unknown name returns the full catalog, so a wrong guess self-corrects.
|
|
18
|
+
2. Unsure which component owns a behavior? `search_api("drag dismiss")` - ranked, and a miss
|
|
19
|
+
returns the catalog.
|
|
20
|
+
3. Styling or theming? Read [references/theming.md](references/theming.md) first, then `get_tokens`
|
|
21
|
+
for the real values.
|
|
22
|
+
4. Full component inventory: [references/components.md](references/components.md) - generated, and
|
|
23
|
+
stamped with the version it came from. If `node_modules/@zyncat/ui/package.json` shows a
|
|
24
|
+
different version, trust `get_component` over the file and re-run `npx zyncat-ui init`.
|
|
25
|
+
5. If the MCP tools are missing, register the server and reinstall this skill: `npx zyncat-ui init`
|
|
26
|
+
(one command: installs the package if absent, imports the stylesheet, writes `.mcp.json`,
|
|
27
|
+
`.claude/skills/` and the theme scaffold).
|
|
28
|
+
|
|
29
|
+
## Setup (once per app)
|
|
30
|
+
|
|
31
|
+
Everything here is what `npx zyncat-ui init` wires up - when a piece is missing, prefer re-running
|
|
32
|
+
init over hand-wiring it.
|
|
33
|
+
|
|
34
|
+
- `import '@zyncat/ui/styles.css'` once at the root - fonts + tokens; each component lazy-loads its
|
|
35
|
+
own CSS.
|
|
36
|
+
- Theming: `defineTheme` + `<ZyncatTheme theme={{ base, dark }} />` from `@zyncat/ui/theme`, once at
|
|
37
|
+
the root. Typed, server-rendered, no build config. See references/theming.md before writing one.
|
|
38
|
+
- One subpath per component: `import { Button } from '@zyncat/ui/button'`. There is no barrel.
|
|
39
|
+
- Peers: react and react-dom 19. Ships built ESM with `'use client'` intact - no bundler or
|
|
40
|
+
transpile config, works as-is in the Next.js App Router.
|
|
41
|
+
- Icons: the library bundles its own internal glyphs but exports NO Icon component. Every
|
|
42
|
+
icon-shaped prop or slot takes YOUR ReactNode (e.g. an `@phosphor-icons/react` element).
|
|
43
|
+
|
|
44
|
+
## Picking the component
|
|
45
|
+
|
|
46
|
+
The catalog is 9 groups (~50 components): primitives, forms, data display, date/time & tabs,
|
|
47
|
+
overlays & feedback, expressive, compound, replicas, dev tools. The full index is in
|
|
48
|
+
[references/components.md](references/components.md). The choices agents get wrong:
|
|
49
|
+
|
|
50
|
+
| Job | Use |
|
|
51
|
+
| ------------------------------------------------ | -------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| Standard modal: title, body, actions | **Dialog** - the default choice for modals |
|
|
53
|
+
| Modality with zero chrome (lightbox, full-bleed) | **Modal** - you supply the surface AND role="dialog" |
|
|
54
|
+
| Edge-docked panel, drag-to-dismiss | **Sheet** |
|
|
55
|
+
| Anchored non-modal panel | **Popover** |
|
|
56
|
+
| Menu of actions on a trigger | **Dropdown** - commands only, never holds a value |
|
|
57
|
+
| Pick one value from options | **Select** (or **RadioGroup** when all options should be visible) |
|
|
58
|
+
| Pick many values | **MultiSelect** (form value) / **ToggleTag** (filter chips) |
|
|
59
|
+
| Transient hint on hover/focus | **Tooltip** |
|
|
60
|
+
| Persistent in-flow status | **Alert** |
|
|
61
|
+
| Transient notification | **toast()** - needs `<Toaster />` mounted once |
|
|
62
|
+
| Ambient status chip | **Badge** / **StatusBadge** (canonical post status) |
|
|
63
|
+
| User-owned removable label | **Tag** |
|
|
64
|
+
| Rolling number | **CountBadge roll** (inline) / **Odometer** (display size) |
|
|
65
|
+
| Persistent support entry point | **SupportRail** (edge tab) |
|
|
66
|
+
| Social post mock | **InstagramFeed / FacebookFeed / TikTok / YouTube** - pixel-pinned replicas, unthemeable by design |
|
|
67
|
+
|
|
68
|
+
## Conventions the system assumes
|
|
69
|
+
|
|
70
|
+
- Sentence case everywhere; no emoji or exclamation marks in UI copy.
|
|
71
|
+
- Exactly one primary `<Button>` per view.
|
|
72
|
+
- Numbers, times, IDs and status read mono + tabular.
|
|
73
|
+
- Status hues (info/success/warning/danger) only for genuine status; hierarchy comes from the
|
|
74
|
+
neutral ramp.
|
|
75
|
+
|
|
76
|
+
## Pitfalls that bite
|
|
77
|
+
|
|
78
|
+
- `toast()` silently no-ops until `<Toaster />` is mounted once at the app root.
|
|
79
|
+
- `EmojiPickerPanel` throws unless `loadEmojiData(...)` ran before first open; `getEmojiUrl` is
|
|
80
|
+
required.
|
|
81
|
+
- Overlays (Dialog, Modal, Sheet, Popover, Tooltip, Dropdown) take no `className` - pass
|
|
82
|
+
`htmlProps={{ className }}` to reach the panel.
|
|
83
|
+
- `Modal` renders zero semantics - you render `role="dialog"` plus a label yourself.
|
|
84
|
+
- `Collapse`'s `animation` takes motion TOKENS only (`fast|base|slow|...`), never millisecond
|
|
85
|
+
values.
|
|
86
|
+
- Replicas pin platform metrics as constants - tokens cannot move them, on purpose.
|
|
87
|
+
- Every component's docs page is live at the `Docs:` URL `get_component` returns
|
|
88
|
+
(`https://ui.zyncat.app/<slug>`) - open or screenshot it to see the component rendered.
|
|
89
|
+
|
|
90
|
+
## References
|
|
91
|
+
|
|
92
|
+
- [references/components.md](references/components.md) - the generated component index
|
|
93
|
+
- [references/theming.md](references/theming.md) - the four override levels + token vocabulary
|
|
94
|
+
- [references/recipes.md](references/recipes.md) - assembled patterns: forms, tables, confirm
|
|
95
|
+
flows, notifications, drawers
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# @zyncat/ui component index
|
|
2
|
+
|
|
3
|
+
Generated from @zyncat/ui v0.13.0 by `pnpm sync:skill` - do not edit by hand.
|
|
4
|
+
If node_modules/@zyncat/ui/package.json shows a DIFFERENT version, this index is stale:
|
|
5
|
+
trust the get_component MCP tool and re-run `npx zyncat-ui init` to refresh the skill.
|
|
6
|
+
|
|
7
|
+
This is an index, not the API - prop lists here are incomplete by design.
|
|
8
|
+
Call get_component (it accepts a list) before writing any JSX.
|
|
9
|
+
|
|
10
|
+
== Primitives ==
|
|
11
|
+
Button - @zyncat/ui/button - One control for every click; exactly one primary per view.
|
|
12
|
+
Collapse - @zyncat/ui/collapse - Layout-transition primitive; eases height open/closed, never teleports.
|
|
13
|
+
Badge - @zyncat/ui/badge - Glass or outline chip for ambient status - toned, dotted, live or pill.
|
|
14
|
+
StatusBadge - @zyncat/ui/status-badge - Canonical post status - tone + one-word label.
|
|
15
|
+
CountBadge - @zyncat/ui/count-badge - Mono tabular count; `roll` animates digits like an odometer.
|
|
16
|
+
Glide / GlidePill - @zyncat/ui/glide - A persistent background pill that glides smoothly between hovered/active elements.
|
|
17
|
+
|
|
18
|
+
== Forms ==
|
|
19
|
+
Every form field takes label, helper/error/warning/success, size sm|md|lg, disabled.
|
|
20
|
+
TextField - @zyncat/ui/text-field - Base text input; states disclose via Collapse.
|
|
21
|
+
NumberField - @zyncat/ui/number-field - Tabular figures, caret steppers, unit suffix, clamp to [min,max].
|
|
22
|
+
OtpField - @zyncat/ui/otp-field - Segmented one-time code; auto-advance, paste-to-fill.
|
|
23
|
+
Textarea - @zyncat/ui/textarea - Auto-grow, char meter (max), ⌘/Ctrl+↵ submit (onSubmit).
|
|
24
|
+
Checkbox - @zyncat/ui/checkbox - Stages a choice the form commits later - pick Toggle when the effect is immediate.
|
|
25
|
+
Toggle - @zyncat/ui/toggle - Actuates a setting on the spot - pick Checkbox when the form commits the choice later.
|
|
26
|
+
RadioGroup - @zyncat/ui/radio-group - Pick exactly one from options that stay visible - rows or cards; pick Select for long lists.
|
|
27
|
+
Select - @zyncat/ui/select - Single-select listbox in a popover, searchable; holds value: string | null.
|
|
28
|
+
MultiSelect - @zyncat/ui/multi-select - Many-of listbox; stays open while toggling, trigger summarises as first +N.
|
|
29
|
+
|
|
30
|
+
== Data display ==
|
|
31
|
+
Avatar - @zyncat/ui/avatar - Identity mark: image, initials, or silhouette.
|
|
32
|
+
AvatarGroup - @zyncat/ui/avatar-group - Overlapping avatars with +N overflow.
|
|
33
|
+
Tag / TagGroup - @zyncat/ui/tag - User-owned label (a control, not a status).
|
|
34
|
+
ToggleTag - @zyncat/ui/toggle-tag - Many-of-many filter chip.
|
|
35
|
+
Table - @zyncat/ui/table - Declare columns + rows; owns sort, selection, stickiness, overflow.
|
|
36
|
+
Pagination - @zyncat/ui/pagination - Cursor strip: mono range readout + prev/next pair.
|
|
37
|
+
|
|
38
|
+
== Date, time & tabs ==
|
|
39
|
+
The date and time fields share: value is a string, onChange(value | null), timezone, min/max, disabled.
|
|
40
|
+
DateField - @zyncat/ui/date-field - Month calendar in a popover; value 'YYYY-MM-DD'.
|
|
41
|
+
DateTimeField - @zyncat/ui/datetime-field - Calendar + segmented HH:MM; value 'YYYY-MM-DDTHH:mm'.
|
|
42
|
+
DateRangeField - @zyncat/ui/date-range-field - Two-tap auto-ordering window; value DateRange { start, end } | null; commits when both ends exist.
|
|
43
|
+
TimeField - @zyncat/ui/time-field - Standalone segmented time; value 'HH:mm'; bounds saturate.
|
|
44
|
+
Tabs / TabPanel - @zyncat/ui/tabs - Line tabs; the ink reaches then releases; panels enter from the side you moved toward.
|
|
45
|
+
|
|
46
|
+
== Overlays & feedback ==
|
|
47
|
+
Dropdown - @zyncat/ui/dropdown - Menu button - a list of ACTIONS the trigger commits, with submenus.
|
|
48
|
+
Popover - @zyncat/ui/popover - Headless anchored panel, non-modal.
|
|
49
|
+
Sheet - @zyncat/ui/sheet - Edge-docked modal panel, drag-to-dismiss.
|
|
50
|
+
Dialog - @zyncat/ui/dialog - DEFAULT CHOICE for modals - the styled surface: header (icon/title/description/close), scrolling body, footer actions, on top of scrim + focus trap + scroll lock.
|
|
51
|
+
Modal - @zyncat/ui/modal - The SAME modality as Dialog (scrim, focus trap, scroll lock, inert, Esc, motion) with ZERO paint - no header, no body padding, no width cap, no border/radius/shadow.
|
|
52
|
+
Tooltip - @zyncat/ui/tooltip - Transient hint on hover/focus; wraps any child (no ref wiring needed).
|
|
53
|
+
Alert - @zyncat/ui/alert - Persistent, in-flow status.
|
|
54
|
+
Toast - @zyncat/ui/toast - Imperative transient notifications: mount <Toaster /> once at the app root, then call toast() from anywhere.
|
|
55
|
+
toast-store - @zyncat/ui/toast-store - The headless store behind Toast: subscribe to the toast queue and drive it without rendering <Toaster />.
|
|
56
|
+
EmojiPickerPanel - @zyncat/ui/emoji-picker - Searchable emoji panel - grid, scrollspy category rail, recents in localStorage - living in a Popover, becoming a bottom Sheet on narrow viewports.
|
|
57
|
+
|
|
58
|
+
== Expressive ==
|
|
59
|
+
Creative motion components. Each publishes scoped --<component>-* custom properties as its theming surface.
|
|
60
|
+
Odometer - @zyncat/ui/odometer - Rolling number display for display-size figures - each digit column springs on its own.
|
|
61
|
+
TypingLines - @zyncat/ui/typing-lines - A single line that types itself, holds, deletes, then moves to the next one and repeats.
|
|
62
|
+
Lens - @zyncat/ui/lens - An optical loupe that magnifies whatever you wrap.
|
|
63
|
+
Confetti - @zyncat/ui/confetti - A canvas particle burst you fire yourself: paper flakes, curls, ribbons and foil sequins tumbling on real drag, lift and flip, across three depth layers.
|
|
64
|
+
FlowField - @zyncat/ui/flow-field - A canvas field of needles that breathe on a noise loop, then swing away from the pointer with per-cell lag - a decorative backdrop for a hero or a card.
|
|
65
|
+
MorphingText - @zyncat/ui/morphing-text - A headline that cycles a word list, morphing each word into the next.
|
|
66
|
+
WeightField - @zyncat/ui/weight-field - A display headline where hovering one letter ramps its variable-font wght to the peak and its two neighbours either side part-way, so weight spills outward from the cursor.
|
|
67
|
+
|
|
68
|
+
== Compound ==
|
|
69
|
+
Whole assembled patterns on the expressive contract - scoped --support-rail-* properties, no tone/corner/density enums. Actions are a SupportAction[]: id, label, icon, meta, description, onSelect.
|
|
70
|
+
SupportRail - @zyncat/ui/support-rail - An edge tab that grows a support panel out of its own measured box.
|
|
71
|
+
|
|
72
|
+
== Replicas ==
|
|
73
|
+
Each reproduces an external platform surface; fidelity is the contract. Platform metrics are pinned constants - only --font-sans, --focus-ring and the duration tokens are read, so your theme cannot move them. None ever fetches media or autoplays: media and avatar take a URL string or your own node, with CSS-only placeholders.
|
|
74
|
+
FacebookFeed - @zyncat/ui/facebook-feed - Replica of Facebook's three post surfaces, pinned to the platform's real metrics: the feed card, the reels stage and the story stage.
|
|
75
|
+
InstagramFeed - @zyncat/ui/instagram-feed - A replica of one Instagram feed post, pixel-pinned to the platform and immune to your theme.
|
|
76
|
+
TikTok - @zyncat/ui/tiktok - A replica of TikTok's post surface: pick surface="desktop" for the 1584x912 web player with the photo carousel, or surface="mobile" for the 452x822 mobile-web viewport.
|
|
77
|
+
YouTube - @zyncat/ui/youtube - Replica of three YouTube surfaces, picked with surface: a feed grid card (video), a Shorts player with its action rail (short), or a community post (post).
|
|
78
|
+
|
|
79
|
+
== Dev tools ==
|
|
80
|
+
motion-tokens - @zyncat/ui/motion-tokens - TypeScript readers for the motion token vocabulary - duration/ease/distance/scale token names resolved to the live CSS values.
|
|
81
|
+
MotionDevtools - @zyncat/ui/motion-devtools - Dev-only floating panel that slows or freezes EVERY animation at once (CSS and WAAPI) for motion debugging.
|
|
82
|
+
Theme - @zyncat/ui/theme - Typed theming - defineTheme groups every token with autocomplete and hover docs; ZyncatTheme renders the themes as unlayered CSS above the library layers, with no build step.
|
|
83
|
+
|
|
84
|
+
== Types-only modules (documented by their .d.ts alone) ==
|
|
85
|
+
@zyncat/ui/next - get_component("next")
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Recipes - assembled @zyncat/ui patterns
|
|
2
|
+
|
|
3
|
+
Templates, not truth: they show which components compose and how state flows between them.
|
|
4
|
+
Before shipping one, run `get_component` on the parts you use - props here are the common subset,
|
|
5
|
+
not the full API of your installed version.
|
|
6
|
+
|
|
7
|
+
## Settings form
|
|
8
|
+
|
|
9
|
+
TextField + Select + Toggle + Button, submitted with a loading state and a toast.
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { Button } from '@zyncat/ui/button';
|
|
13
|
+
import { Select } from '@zyncat/ui/select';
|
|
14
|
+
import { TextField } from '@zyncat/ui/text-field';
|
|
15
|
+
import { toast } from '@zyncat/ui/toast';
|
|
16
|
+
import { Toggle } from '@zyncat/ui/toggle';
|
|
17
|
+
|
|
18
|
+
function WorkspaceSettings() {
|
|
19
|
+
const [name, setName] = useState('');
|
|
20
|
+
const [tz, setTz] = useState<string | null>(null);
|
|
21
|
+
const [autosave, setAutosave] = useState(true);
|
|
22
|
+
const [saving, setSaving] = useState(false);
|
|
23
|
+
|
|
24
|
+
const save = async () => {
|
|
25
|
+
setSaving(true);
|
|
26
|
+
try {
|
|
27
|
+
await api.save({ name, tz, autosave });
|
|
28
|
+
toast.success('Settings saved');
|
|
29
|
+
} finally {
|
|
30
|
+
setSaving(false);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<form
|
|
36
|
+
onSubmit={(e) => {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
save();
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
<TextField id="ws" label="Workspace name" required value={name} onChange={(e) => setName(e.target.value)} />
|
|
42
|
+
<Select
|
|
43
|
+
options={TIMEZONES}
|
|
44
|
+
value={tz}
|
|
45
|
+
onChange={setTz}
|
|
46
|
+
searchable
|
|
47
|
+
placeholder="Choose a time zone"
|
|
48
|
+
ariaLabel="Time zone"
|
|
49
|
+
/>
|
|
50
|
+
<Toggle label="Auto-save drafts" checked={autosave} onChange={(e) => setAutosave(e.target.checked)} />
|
|
51
|
+
<Button type="submit" loading={saving}>
|
|
52
|
+
Save changes
|
|
53
|
+
</Button>
|
|
54
|
+
</form>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Data table page
|
|
60
|
+
|
|
61
|
+
ToggleTag filters above a sortable Table, a Pagination cursor strip below.
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
import { Pagination } from '@zyncat/ui/pagination';
|
|
65
|
+
import { Table } from '@zyncat/ui/table';
|
|
66
|
+
import { ToggleTag } from '@zyncat/ui/toggle-tag';
|
|
67
|
+
|
|
68
|
+
<ToggleTag selected={onlyFailed} onChange={setOnlyFailed} count={counts.failed}>Failed</ToggleTag>
|
|
69
|
+
<Table<Invoice>
|
|
70
|
+
ariaLabel="Invoices"
|
|
71
|
+
columns={COLUMNS}
|
|
72
|
+
rows={page.rows}
|
|
73
|
+
selectable
|
|
74
|
+
defaultSort={{ key: 'amount', dir: 'desc' }}
|
|
75
|
+
/>
|
|
76
|
+
<Pagination ariaLabel="Rows" range={[page.from, page.to]} total={page.total}
|
|
77
|
+
hasPrev={page.from > 1} hasNext={page.to < page.total} onPrev={prev} onNext={next} />
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Destructive confirm
|
|
81
|
+
|
|
82
|
+
Dialog owns the modality; the danger action lives in its footer and reports back with a toast.
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
import { Button } from '@zyncat/ui/button';
|
|
86
|
+
import { Dialog } from '@zyncat/ui/dialog';
|
|
87
|
+
import { toast } from '@zyncat/ui/toast';
|
|
88
|
+
|
|
89
|
+
<Dialog
|
|
90
|
+
open={confirming}
|
|
91
|
+
onOpenChange={setConfirming}
|
|
92
|
+
tone="danger"
|
|
93
|
+
title="Delete this project?"
|
|
94
|
+
description="Every scheduled post in it is deleted with it."
|
|
95
|
+
footer={(close) => (
|
|
96
|
+
<>
|
|
97
|
+
<Button variant="secondary" onClick={close}>
|
|
98
|
+
Cancel
|
|
99
|
+
</Button>
|
|
100
|
+
<Button
|
|
101
|
+
variant="danger"
|
|
102
|
+
onClick={async () => {
|
|
103
|
+
await api.remove(id);
|
|
104
|
+
close();
|
|
105
|
+
toast.success('Project deleted');
|
|
106
|
+
}}
|
|
107
|
+
>
|
|
108
|
+
Delete project
|
|
109
|
+
</Button>
|
|
110
|
+
</>
|
|
111
|
+
)}
|
|
112
|
+
>
|
|
113
|
+
This cannot be undone.
|
|
114
|
+
</Dialog>;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## App-wide notifications
|
|
118
|
+
|
|
119
|
+
Mount `<Toaster />` once at the root; every module calls `toast()` - without the mount it no-ops.
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
import { toast, Toaster } from '@zyncat/ui/toast';
|
|
123
|
+
|
|
124
|
+
// root layout, once:
|
|
125
|
+
<Toaster position="bottom-right" />;
|
|
126
|
+
|
|
127
|
+
// anywhere else:
|
|
128
|
+
toast.promise(publish(), {
|
|
129
|
+
loading: 'Publishing...',
|
|
130
|
+
success: (r) => `Published to ${r.count} channels`,
|
|
131
|
+
error: (e) => `Publish failed - ${e.message}`,
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Detail drawer
|
|
136
|
+
|
|
137
|
+
Sheet for an edge-docked record view; you own the panel's semantics.
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
import { Sheet } from '@zyncat/ui/sheet';
|
|
141
|
+
|
|
142
|
+
<Sheet side="right" open={!!selected} onOpenChange={(o) => !o && setSelected(null)}>
|
|
143
|
+
<div role="dialog" aria-label="Invoice details">
|
|
144
|
+
{selected && <InvoiceDetails id={selected} />}
|
|
145
|
+
</div>
|
|
146
|
+
</Sheet>;
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Row actions menu
|
|
150
|
+
|
|
151
|
+
Dropdown runs commands - it never holds a value; pair it with an icon Button trigger.
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
import { Button } from '@zyncat/ui/button';
|
|
155
|
+
import { Dropdown } from '@zyncat/ui/dropdown';
|
|
156
|
+
|
|
157
|
+
<Dropdown
|
|
158
|
+
ariaLabel="Row actions"
|
|
159
|
+
trigger={
|
|
160
|
+
<Button size="icon" variant="ghost" aria-label="Actions">
|
|
161
|
+
…
|
|
162
|
+
</Button>
|
|
163
|
+
}
|
|
164
|
+
onSelect={(id) => run(id)}
|
|
165
|
+
items={[
|
|
166
|
+
{ id: 'rename', label: 'Rename' },
|
|
167
|
+
{ id: 'move', label: 'Move to', items: [{ id: 'drafts', label: 'Drafts' }] },
|
|
168
|
+
{ id: 'delete', label: 'Delete', danger: true },
|
|
169
|
+
]}
|
|
170
|
+
/>;
|
|
171
|
+
```
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Theming @zyncat/ui - the four override levels
|
|
2
|
+
|
|
3
|
+
Load your own stylesheet after `@zyncat/ui/styles.css`, then reach for the LOWEST level that does
|
|
4
|
+
the job. Never fork the source. The `get_tokens` MCP tool prints the whole vocabulary with real
|
|
5
|
+
values.
|
|
6
|
+
|
|
7
|
+
## Level 0 - your plain CSS already wins
|
|
8
|
+
|
|
9
|
+
Every shipped rule lives inside `@layer zyncat.tokens` or `@layer zyncat.components`, and unlayered
|
|
10
|
+
CSS beats every layer however specific the layered rule is. `.btn { border-radius: 0 }` in your
|
|
11
|
+
sheet lands: no `!important`, no specificity ladder, no parent selector. Even `:where(.btn)` at
|
|
12
|
+
specificity (0,0,0) wins. Class names are BEM off a short base - `.btn`, `.btn--primary`,
|
|
13
|
+
`.btn__label`; `.fld`, `.fld__input`; `.dialog__body`.
|
|
14
|
+
|
|
15
|
+
## Level 1 - retheme the whole system
|
|
16
|
+
|
|
17
|
+
Reach for `@zyncat/ui/theme` first: it is this level with types on it. `defineTheme` takes one
|
|
18
|
+
grouped object - `color`, `type`, `space`, `radius`, `elevation`, `motion`, `glass`, `icon`,
|
|
19
|
+
`layer`, `avatar`, plus `components` for scoped knobs and `custom` for anything else. Keys are the
|
|
20
|
+
token in camelCase (`accent`, `radiusMd`, `durationBase`), values are any CSS including `var()`
|
|
21
|
+
references, and a typo is a compile error. `ZyncatTheme` renders the set once at the app root; it
|
|
22
|
+
is a plain component with no hooks, so it server-renders and needs no build configuration.
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { defineTheme, ZyncatTheme } from '@zyncat/ui/theme';
|
|
26
|
+
|
|
27
|
+
const base = defineTheme({
|
|
28
|
+
color: { accent: 'oklch(0.58 0.19 292)', accentHover: 'oklch(0.5 0.19 292)' },
|
|
29
|
+
radius: { radiusMd: '0.5rem' },
|
|
30
|
+
components: { odometer: { accent: 'var(--warning)' } },
|
|
31
|
+
});
|
|
32
|
+
const dark = defineTheme({ color: { bgApp: 'oklch(0.19 0.008 198)', textBody: 'oklch(0.92 0.004 198)' } });
|
|
33
|
+
|
|
34
|
+
<ZyncatTheme theme={{ base, dark }} />;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`base` lands on `:root`; every other key is a `[data-theme='<key>']` block, so switching themes -
|
|
38
|
+
globally or for one subtree - is setting that attribute. Durations you repoint keep their
|
|
39
|
+
reduced-motion collapse automatically.
|
|
40
|
+
|
|
41
|
+
The same tokens are writable as plain CSS: repoint them on `:root` in your own stylesheet -
|
|
42
|
+
`--accent` and its ramp, `--bg-*`, `--text-*`, `--border-*`, `--radius-*`, `--shadow-*`,
|
|
43
|
+
`--space-*`, `--size-*`, `--type-*`, `--duration-*`, `--ease-*`, `--focus-ring`. Components read
|
|
44
|
+
them live and the WAAPI engine reads the same DOM values, so motion retimes with the CSS. Reduced
|
|
45
|
+
motion is handled here - every `--duration-*` collapses to 1ms under `prefers-reduced-motion`, so
|
|
46
|
+
derive your own delays from a duration token, and repoint durations on `:root` rather than a
|
|
47
|
+
nested scope or the collapse cannot reach them.
|
|
48
|
+
|
|
49
|
+
## Level 2 - retune one component
|
|
50
|
+
|
|
51
|
+
Expressive and compound components publish scoped `--<component>-<name>` properties as their public
|
|
52
|
+
contract: `--odometer-size/-accent/-gap`, `--typing-lines-caret-ink/-blink`,
|
|
53
|
+
`--lens-surface/-fringe-warm`, `--morphing-text-size/-smear`, `--weight-field-peak-weight/-hover-padding`,
|
|
54
|
+
`--flow-field-ramp-0..11`, `--confetti-paper-1..5`, `--support-rail-*`. Set them
|
|
55
|
+
on any ancestor or inline via `style`. The canvas simulations sample theirs at their next measure -
|
|
56
|
+
FlowField on resize and on a theme attribute change, Confetti on the next `fire()`.
|
|
57
|
+
|
|
58
|
+
Both reaches are typed. In a theme they are the `components` group with the prefix dropped:
|
|
59
|
+
`components.odometer.accent` is `--odometer-accent`. On one instance they are the component's own
|
|
60
|
+
`style` prop, which accepts the design tokens plus that component's knobs and nothing from another
|
|
61
|
+
component - `<Odometer style={{ '--odometer-size': '3rem' }} />`.
|
|
62
|
+
|
|
63
|
+
A few are per-frame state the component writes to itself, not knobs -
|
|
64
|
+
`--odometer-velocity/-blur`, `--lens-lift/-blur/-shadow-alpha`, `--morphing-text-heat/-letter-blur`,
|
|
65
|
+
`--support-rail-drag`, `--youtube-progress`.
|
|
66
|
+
Setting those does nothing, and they are absent from the types, so trying is a compile error.
|
|
67
|
+
|
|
68
|
+
System primitives and composites publish none by design - retheme those at level 1.
|
|
69
|
+
|
|
70
|
+
## Level 3 - restyle one instance
|
|
71
|
+
|
|
72
|
+
Primitives and fields take `className` and `style` directly; on a field they land on the wrapper,
|
|
73
|
+
and `htmlProps` reaches the native `<input>`. Overlays (Dialog, Modal, Sheet, Popover, Tooltip,
|
|
74
|
+
Dropdown) have no `className` prop - pass `htmlProps={{ className }}` and it lands on the panel
|
|
75
|
+
itself. Importing `@zyncat/ui/theme` anywhere in the app types every design token in `style`, so
|
|
76
|
+
`style={{ '--accent': 'red' }}` completes and checks like any other property.
|
|
77
|
+
|
|
78
|
+
## Replicas answer to none of this, on purpose
|
|
79
|
+
|
|
80
|
+
FacebookFeed, InstagramFeed, TikTok and YouTube pin platform metrics as constants; only
|
|
81
|
+
`--font-sans`, `--focus-ring` and the duration tokens reach them, and there are no scoped
|
|
82
|
+
properties to set. Fidelity is the contract. If you want a card that follows your theme, build one
|
|
83
|
+
from primitives instead.
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import './alert.css';
|
|
4
|
+
|
|
4
5
|
import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
import type { DataAttributes } from '../../../dom-props';
|
|
6
8
|
import { Motion } from '../../../motion/element';
|
|
7
9
|
import { resolveMotionTiming } from '../../../motion/motion-timing';
|
|
10
|
+
import { Presence } from '../../../motion/presence';
|
|
11
|
+
import { popOut } from '../../../motion/presets';
|
|
8
12
|
import type { DisableableAnimation } from '../../../motion/timing';
|
|
13
|
+
import { UIMotion } from '../../../tokens/motion-tokens';
|
|
14
|
+
import { useControllable } from '../../internal/hooks/use-controllable';
|
|
9
15
|
import { Icon, type IconName } from '../../internal/icon/Icon';
|
|
10
|
-
import { Button } from '../../primitives/button/Button';
|
|
11
16
|
import { IconSlot } from '../../internal/icon/IconSlot';
|
|
12
|
-
import { useControllable } from '../../internal/hooks/use-controllable';
|
|
13
|
-
import type { DataAttributes } from '../../../dom-props';
|
|
14
17
|
import { cx } from '../../internal/utils/cx';
|
|
18
|
+
import { Button } from '../../primitives/button/Button';
|
|
15
19
|
|
|
16
20
|
export type AlertTone = 'info' | 'success' | 'warning' | 'danger';
|
|
17
21
|
|
|
@@ -34,7 +38,8 @@ interface AlertOwnProps {
|
|
|
34
38
|
dismissible?: boolean;
|
|
35
39
|
/** Fires on dismiss. With `open` set, the parent owns hiding the alert. */
|
|
36
40
|
onDismiss?: () => void;
|
|
37
|
-
/** Controlled visibility; omit for uncontrolled. Exit
|
|
41
|
+
/** Controlled visibility; omit for uncontrolled. Exit scales down and fades; the slot it
|
|
42
|
+
* occupied is released when it unmounts, so content below moves up then rather than during. */
|
|
38
43
|
open?: boolean;
|
|
39
44
|
/** App-level strip: square corners, hairline below only. Paint modifier. */
|
|
40
45
|
banner?: boolean;
|
|
@@ -44,8 +49,8 @@ interface AlertOwnProps {
|
|
|
44
49
|
className?: string;
|
|
45
50
|
/** Inline styles merged onto the alert. */
|
|
46
51
|
style?: CSSProperties;
|
|
47
|
-
/** Enter/exit timing - motion tokens only, or `null` to disable (
|
|
48
|
-
* @default height 'slow'/'entrance'
|
|
52
|
+
/** Enter/exit timing - motion tokens only, or `null` to disable (enter and exit snap).
|
|
53
|
+
* @default entrance height 'slow'/'entrance' + opacity 'base'/'entrance'; exit scale + opacity 'fast'/'exit' */
|
|
49
54
|
animation?: DisableableAnimation;
|
|
50
55
|
}
|
|
51
56
|
|
|
@@ -104,10 +109,7 @@ export function Alert({
|
|
|
104
109
|
{ height: [0, 'auto'], timing: h.open },
|
|
105
110
|
{ opacity: [0, 1], timing: o.open },
|
|
106
111
|
]}
|
|
107
|
-
exit={[
|
|
108
|
-
{ height: ['auto', 0], timing: h.close },
|
|
109
|
-
{ opacity: [1, 0], timing: o.close },
|
|
110
|
-
]}
|
|
112
|
+
exit={[popOut(UIMotion.scale.floating, o.close)]}
|
|
111
113
|
>
|
|
112
114
|
<div className={cls} style={style} data-tone={tone} role={TONE_ROLE[tone] || 'status'} {...htmlProps}>
|
|
113
115
|
{icon === null ? null : (
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Alert - @zyncat/ui/alert
|
|
2
|
+
|
|
3
|
+
Group: overlays
|
|
4
|
+
Docs: https://ui.zyncat.app/alert
|
|
5
|
+
|
|
6
|
+
Persistent, in-flow status.
|
|
7
|
+
|
|
8
|
+
tone, title, children (body), action { label, onClick }, dismissible, banner, open/onDismiss
|
|
9
|
+
(controlled).
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
<Alert tone="warning" title="Your trial ends in 5 days" action={{ label: 'Upgrade', onClick: fn }}>
|
|
13
|
+
Add a plan...
|
|
14
|
+
</Alert>
|
|
15
|
+
```
|