@kouji-ui/components 0.1.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/.turbo/turbo-build.log +29 -0
- package/CHANGELOG.md +192 -0
- package/ng-package.json +7 -0
- package/package.json +43 -0
- package/src/accordion/_examples/accordion.default.example.ts +31 -0
- package/src/accordion/_examples/accordion.disabled.example.ts +38 -0
- package/src/accordion/_examples/accordion.multiple.example.ts +31 -0
- package/src/accordion/_examples/accordion.rich-content.example.ts +49 -0
- package/src/accordion/_examples/index.ts +6 -0
- package/src/accordion/accordion.arrow-nav.example.ts +39 -0
- package/src/accordion/accordion.css +68 -0
- package/src/accordion/accordion.playground.ts +119 -0
- package/src/accordion/accordion.spec.ts +117 -0
- package/src/accordion/accordion.ts +153 -0
- package/src/accordion/accordion.usage.example.ts +38 -0
- package/src/accordion/accordion.value.example.ts +60 -0
- package/src/accordion/index.ts +1 -0
- package/src/alert/_examples/alert.banner.example.ts +56 -0
- package/src/alert/_examples/alert.dismissible.example.ts +53 -0
- package/src/alert/_examples/alert.example.ts +40 -0
- package/src/alert/_examples/alert.variants.example.ts +66 -0
- package/src/alert/_examples/alert.with-actions.example.ts +57 -0
- package/src/alert/_examples/index.ts +7 -0
- package/src/alert/alert.css +133 -0
- package/src/alert/alert.playground.ts +111 -0
- package/src/alert/alert.spec.ts +167 -0
- package/src/alert/alert.ts +250 -0
- package/src/alert/alert.usage.example.ts +58 -0
- package/src/alert/index.ts +8 -0
- package/src/avatar/_examples/avatar-group.example.ts +31 -0
- package/src/avatar/_examples/avatar-group.list.example.ts +45 -0
- package/src/avatar/_examples/avatar-group.overflow.example.ts +33 -0
- package/src/avatar/_examples/avatar-group.shapes.example.ts +39 -0
- package/src/avatar/_examples/avatar-group.sizes.example.ts +44 -0
- package/src/avatar/_examples/avatar.default.example.ts +18 -0
- package/src/avatar/_examples/avatar.initials.example.ts +20 -0
- package/src/avatar/_examples/avatar.shapes.example.ts +22 -0
- package/src/avatar/_examples/avatar.sizes.example.ts +26 -0
- package/src/avatar/_examples/avatar.with-image.example.ts +20 -0
- package/src/avatar/_examples/index.ts +12 -0
- package/src/avatar/avatar-group.spec.ts +138 -0
- package/src/avatar/avatar-group.ts +127 -0
- package/src/avatar/avatar-group.usage.example.ts +30 -0
- package/src/avatar/avatar.css +58 -0
- package/src/avatar/avatar.playground.ts +95 -0
- package/src/avatar/avatar.ts +123 -0
- package/src/avatar/index.ts +2 -0
- package/src/badge/_examples/badge.default.example.ts +18 -0
- package/src/badge/_examples/badge.sizes.example.ts +25 -0
- package/src/badge/_examples/badge.variants.example.ts +24 -0
- package/src/badge/_examples/badge.with-dot.example.ts +31 -0
- package/src/badge/_examples/badge.with-icon.example.ts +23 -0
- package/src/badge/_examples/index.ts +7 -0
- package/src/badge/badge.css +59 -0
- package/src/badge/badge.playground.ts +49 -0
- package/src/badge/badge.ts +86 -0
- package/src/badge/badge.usage.example.ts +22 -0
- package/src/badge/index.ts +1 -0
- package/src/breadcrumb/_examples/breadcrumb.custom-separator.example.ts +53 -0
- package/src/breadcrumb/_examples/breadcrumb.example.ts +48 -0
- package/src/breadcrumb/_examples/breadcrumb.long-path.example.ts +58 -0
- package/src/breadcrumb/_examples/breadcrumb.truncated.example.ts +59 -0
- package/src/breadcrumb/_examples/breadcrumb.with-icons.example.ts +66 -0
- package/src/breadcrumb/_examples/index.ts +7 -0
- package/src/breadcrumb/breadcrumb.css +121 -0
- package/src/breadcrumb/breadcrumb.playground.ts +93 -0
- package/src/breadcrumb/breadcrumb.spec.ts +230 -0
- package/src/breadcrumb/breadcrumb.ts +272 -0
- package/src/breadcrumb/breadcrumb.usage.example.ts +45 -0
- package/src/breadcrumb/index.ts +1 -0
- package/src/button/_examples/button.anchor.example.ts +18 -0
- package/src/button/_examples/button.configured.example.ts +43 -0
- package/src/button/_examples/button.disabled.example.ts +25 -0
- package/src/button/_examples/button.example.ts +22 -0
- package/src/button/_examples/button.icon.example.ts +27 -0
- package/src/button/_examples/button.loading.example.ts +31 -0
- package/src/button/_examples/button.pressed.example.ts +24 -0
- package/src/button/_examples/button.sizes.example.ts +26 -0
- package/src/button/_examples/button.usage.example.ts +66 -0
- package/src/button/_examples/button.variants.example.ts +26 -0
- package/src/button/_examples/index.ts +12 -0
- package/src/button/button.css +263 -0
- package/src/button/button.playground.ts +79 -0
- package/src/button/button.spec.ts +100 -0
- package/src/button/button.ts +150 -0
- package/src/button/index.ts +1 -0
- package/src/button-group/_examples/button-group.example.ts +30 -0
- package/src/button-group/_examples/button-group.icon-only.example.ts +30 -0
- package/src/button-group/_examples/button-group.toggle.example.ts +36 -0
- package/src/button-group/_examples/button-group.variants.example.ts +40 -0
- package/src/button-group/_examples/button-group.vertical.example.ts +29 -0
- package/src/button-group/_examples/index.ts +7 -0
- package/src/button-group/button-group.css +80 -0
- package/src/button-group/button-group.playground.ts +94 -0
- package/src/button-group/button-group.spec.ts +119 -0
- package/src/button-group/button-group.ts +130 -0
- package/src/button-group/button-group.usage.example.ts +35 -0
- package/src/button-group/index.ts +1 -0
- package/src/calendar/_examples/calendar.example.ts +33 -0
- package/src/calendar/_examples/index.ts +3 -0
- package/src/calendar/calendar.css +129 -0
- package/src/calendar/calendar.playground.ts +84 -0
- package/src/calendar/calendar.spec.ts +50 -0
- package/src/calendar/calendar.ts +171 -0
- package/src/calendar/calendar.usage.example.ts +33 -0
- package/src/calendar/index.ts +1 -0
- package/src/card/_examples/card.cover.example.ts +53 -0
- package/src/card/_examples/card.example.ts +27 -0
- package/src/card/_examples/card.full.example.ts +51 -0
- package/src/card/_examples/index.ts +5 -0
- package/src/card/card.css +120 -0
- package/src/card/card.playground.ts +116 -0
- package/src/card/card.spec.ts +50 -0
- package/src/card/card.ts +194 -0
- package/src/card/card.usage.example.ts +46 -0
- package/src/card/index.ts +1 -0
- package/src/carousel/_examples/carousel.autoplay.example.ts +69 -0
- package/src/carousel/_examples/carousel.example.ts +60 -0
- package/src/carousel/_examples/carousel.indicators.example.ts +64 -0
- package/src/carousel/_examples/carousel.lazy-load.example.ts +85 -0
- package/src/carousel/_examples/carousel.tabs-pattern.example.ts +61 -0
- package/src/carousel/_examples/index.ts +7 -0
- package/src/carousel/carousel.css +181 -0
- package/src/carousel/carousel.playground.ts +135 -0
- package/src/carousel/carousel.spec.ts +211 -0
- package/src/carousel/carousel.ts +399 -0
- package/src/carousel/carousel.usage.example.ts +46 -0
- package/src/carousel/index.ts +1 -0
- package/src/cascade-select/_examples/cascade-select.data-driven.example.ts +119 -0
- package/src/cascade-select/_examples/cascade-select.disabled.example.ts +74 -0
- package/src/cascade-select/_examples/cascade-select.example.ts +80 -0
- package/src/cascade-select/_examples/cascade-select.field.example.ts +73 -0
- package/src/cascade-select/_examples/cascade-select.path.example.ts +85 -0
- package/src/cascade-select/_examples/index.ts +7 -0
- package/src/cascade-select/cascade-select.css +120 -0
- package/src/cascade-select/cascade-select.playground.ts +133 -0
- package/src/cascade-select/cascade-select.ts +201 -0
- package/src/cascade-select/cascade-select.usage.example.ts +44 -0
- package/src/cascade-select/index.ts +5 -0
- package/src/chat/_examples/chat-bubble.example.ts +71 -0
- package/src/chat/_examples/chat-bubble.grouped.example.ts +69 -0
- package/src/chat/_examples/chat-bubble.sides.example.ts +41 -0
- package/src/chat/_examples/chat-bubble.variants.example.ts +58 -0
- package/src/chat/_examples/chat-bubble.with-state.example.ts +57 -0
- package/src/chat/_examples/index.ts +7 -0
- package/src/chat/chat.css +231 -0
- package/src/chat/chat.playground.ts +171 -0
- package/src/chat/chat.spec.ts +343 -0
- package/src/chat/chat.ts +269 -0
- package/src/chat/chat.usage.example.ts +49 -0
- package/src/chat/index.ts +13 -0
- package/src/checkbox/_examples/checkbox.checked.example.ts +20 -0
- package/src/checkbox/_examples/checkbox.default.example.ts +20 -0
- package/src/checkbox/_examples/checkbox.disabled.example.ts +26 -0
- package/src/checkbox/_examples/checkbox.indeterminate.example.ts +20 -0
- package/src/checkbox/_examples/checkbox.usage.example.ts +62 -0
- package/src/checkbox/_examples/index.ts +7 -0
- package/src/checkbox/checkbox.css +74 -0
- package/src/checkbox/checkbox.playground.ts +68 -0
- package/src/checkbox/checkbox.ts +122 -0
- package/src/checkbox/index.ts +1 -0
- package/src/color-picker/_examples/color-picker.alpha.example.ts +36 -0
- package/src/color-picker/_examples/color-picker.example.ts +34 -0
- package/src/color-picker/_examples/color-picker.hex-input.example.ts +53 -0
- package/src/color-picker/_examples/color-picker.in-form.example.ts +60 -0
- package/src/color-picker/_examples/color-picker.usage.example.ts +58 -0
- package/src/color-picker/_examples/color-picker.with-presets.example.ts +45 -0
- package/src/color-picker/_examples/index.ts +8 -0
- package/src/color-picker/color-picker.css +183 -0
- package/src/color-picker/color-picker.playground.ts +83 -0
- package/src/color-picker/color-picker.spec.ts +94 -0
- package/src/color-picker/color-picker.ts +234 -0
- package/src/color-picker/index.ts +1 -0
- package/src/combobox/_examples/combobox.async.example.ts +85 -0
- package/src/combobox/_examples/combobox.empty-state.example.ts +36 -0
- package/src/combobox/_examples/combobox.example.ts +36 -0
- package/src/combobox/_examples/combobox.free-text.example.ts +42 -0
- package/src/combobox/_examples/combobox.usage.example.ts +51 -0
- package/src/combobox/_examples/combobox.with-icons.example.ts +49 -0
- package/src/combobox/_examples/index.ts +8 -0
- package/src/combobox/combobox.css +101 -0
- package/src/combobox/combobox.playground.ts +90 -0
- package/src/combobox/combobox.spec.ts +111 -0
- package/src/combobox/combobox.ts +219 -0
- package/src/combobox/index.ts +6 -0
- package/src/command-palette/_examples/command-palette.async.example.ts +99 -0
- package/src/command-palette/_examples/command-palette.dialog.example.ts +90 -0
- package/src/command-palette/_examples/command-palette.example.ts +40 -0
- package/src/command-palette/_examples/command-palette.fuzzy.example.ts +54 -0
- package/src/command-palette/_examples/command-palette.groups.example.ts +55 -0
- package/src/command-palette/_examples/command-palette.usage.example.ts +49 -0
- package/src/command-palette/_examples/index.ts +8 -0
- package/src/command-palette/command-palette.css +234 -0
- package/src/command-palette/command-palette.playground.ts +119 -0
- package/src/command-palette/command-palette.ts +448 -0
- package/src/command-palette/index.ts +10 -0
- package/src/confirm-popup/_examples/confirm-popup.destructive.example.ts +72 -0
- package/src/confirm-popup/_examples/confirm-popup.example.ts +82 -0
- package/src/confirm-popup/_examples/confirm-popup.placement.example.ts +97 -0
- package/src/confirm-popup/_examples/confirm-popup.usage.example.ts +94 -0
- package/src/confirm-popup/_examples/confirm-popup.with-message.example.ts +76 -0
- package/src/confirm-popup/_examples/index.ts +7 -0
- package/src/confirm-popup/confirm-popup.css +47 -0
- package/src/confirm-popup/confirm-popup.playground.ts +109 -0
- package/src/confirm-popup/confirm-popup.spec.ts +209 -0
- package/src/confirm-popup/confirm-popup.ts +279 -0
- package/src/confirm-popup/index.ts +1 -0
- package/src/date-picker/_examples/date-picker.disabled-dates.example.ts +44 -0
- package/src/date-picker/_examples/date-picker.example.ts +38 -0
- package/src/date-picker/_examples/date-picker.locale.example.ts +50 -0
- package/src/date-picker/_examples/date-picker.readonly.example.ts +32 -0
- package/src/date-picker/_examples/date-picker.usage.example.ts +60 -0
- package/src/date-picker/_examples/date-picker.with-min-max.example.ts +47 -0
- package/src/date-picker/_examples/index.ts +8 -0
- package/src/date-picker/date-picker.css +61 -0
- package/src/date-picker/date-picker.playground.ts +79 -0
- package/src/date-picker/date-picker.spec.ts +71 -0
- package/src/date-picker/date-picker.ts +185 -0
- package/src/date-picker/index.ts +1 -0
- package/src/dialog/_examples/dialog.confirmation.example.ts +30 -0
- package/src/dialog/_examples/dialog.default.example.ts +30 -0
- package/src/dialog/_examples/dialog.nested.example.ts +86 -0
- package/src/dialog/_examples/dialog.scrollable.example.ts +30 -0
- package/src/dialog/_examples/dialog.usage.example.ts +57 -0
- package/src/dialog/_examples/dialog.with-form.example.ts +48 -0
- package/src/dialog/_examples/index.ts +8 -0
- package/src/dialog/dialog.css +56 -0
- package/src/dialog/dialog.playground.ts +136 -0
- package/src/dialog/dialog.ts +82 -0
- package/src/dialog/index.ts +1 -0
- package/src/divider/_examples/divider.example.ts +27 -0
- package/src/divider/_examples/divider.sizes.example.ts +33 -0
- package/src/divider/_examples/divider.structural.example.ts +55 -0
- package/src/divider/_examples/divider.usage.example.ts +48 -0
- package/src/divider/_examples/divider.variants.example.ts +33 -0
- package/src/divider/_examples/divider.vertical.example.ts +38 -0
- package/src/divider/_examples/divider.with-content.example.ts +38 -0
- package/src/divider/_examples/index.ts +9 -0
- package/src/divider/divider.css +93 -0
- package/src/divider/divider.playground.ts +97 -0
- package/src/divider/divider.spec.ts +207 -0
- package/src/divider/divider.ts +220 -0
- package/src/divider/index.ts +1 -0
- package/src/drawer/_examples/drawer.example.ts +30 -0
- package/src/drawer/_examples/drawer.modal-vs-non-modal.example.ts +27 -0
- package/src/drawer/_examples/drawer.scrollable.example.ts +30 -0
- package/src/drawer/_examples/drawer.sides.example.ts +32 -0
- package/src/drawer/_examples/drawer.usage.example.ts +56 -0
- package/src/drawer/_examples/drawer.with-form.example.ts +48 -0
- package/src/drawer/_examples/index.ts +8 -0
- package/src/drawer/drawer.css +130 -0
- package/src/drawer/drawer.playground.ts +107 -0
- package/src/drawer/drawer.spec.ts +216 -0
- package/src/drawer/drawer.ts +85 -0
- package/src/drawer/index.ts +1 -0
- package/src/dropdown-menu/_examples/dropdown-menu.disabled.example.ts +19 -0
- package/src/dropdown-menu/_examples/dropdown-menu.example.ts +20 -0
- package/src/dropdown-menu/_examples/dropdown-menu.shortcuts.example.ts +31 -0
- package/src/dropdown-menu/_examples/dropdown-menu.sides.example.ts +18 -0
- package/src/dropdown-menu/_examples/dropdown-menu.usage.example.ts +56 -0
- package/src/dropdown-menu/_examples/dropdown-menu.with-icons.example.ts +31 -0
- package/src/dropdown-menu/_examples/dropdown-menu.with-separator.example.ts +41 -0
- package/src/dropdown-menu/_examples/index.ts +9 -0
- package/src/dropdown-menu/dropdown-menu.css +108 -0
- package/src/dropdown-menu/dropdown-menu.playground.ts +109 -0
- package/src/dropdown-menu/dropdown-menu.spec.ts +5 -0
- package/src/dropdown-menu/dropdown-menu.ts +128 -0
- package/src/dropdown-menu/index.ts +1 -0
- package/src/empty-state/_examples/empty-state.error.example.ts +63 -0
- package/src/empty-state/_examples/empty-state.example.ts +59 -0
- package/src/empty-state/_examples/empty-state.search.example.ts +82 -0
- package/src/empty-state/_examples/empty-state.sizes.example.ts +76 -0
- package/src/empty-state/_examples/empty-state.usage.example.ts +66 -0
- package/src/empty-state/_examples/empty-state.with-actions.example.ts +68 -0
- package/src/empty-state/_examples/index.ts +8 -0
- package/src/empty-state/empty-state.css +114 -0
- package/src/empty-state/empty-state.playground.ts +87 -0
- package/src/empty-state/empty-state.spec.ts +211 -0
- package/src/empty-state/empty-state.ts +276 -0
- package/src/empty-state/index.ts +1 -0
- package/src/example-components.ts +396 -0
- package/src/field/_examples/field.disabled.example.ts +49 -0
- package/src/field/_examples/field.example.ts +51 -0
- package/src/field/_examples/field.required.example.ts +46 -0
- package/src/field/_examples/field.with-error.example.ts +73 -0
- package/src/field/_examples/field.with-prefix-suffix.example.ts +63 -0
- package/src/field/_examples/index.ts +7 -0
- package/src/field/field.css +138 -0
- package/src/field/field.playground.ts +108 -0
- package/src/field/field.spec.ts +132 -0
- package/src/field/field.ts +232 -0
- package/src/field/field.usage.example.ts +63 -0
- package/src/field/index.ts +7 -0
- package/src/file-upload/_examples/file-upload.dropzone.example.ts +32 -0
- package/src/file-upload/_examples/file-upload.example.ts +29 -0
- package/src/file-upload/_examples/file-upload.image-preview.example.ts +31 -0
- package/src/file-upload/_examples/file-upload.multiple.example.ts +23 -0
- package/src/file-upload/_examples/file-upload.with-progress.example.ts +59 -0
- package/src/file-upload/_examples/index.ts +7 -0
- package/src/file-upload/file-upload.css +207 -0
- package/src/file-upload/file-upload.playground.ts +84 -0
- package/src/file-upload/file-upload.spec.ts +94 -0
- package/src/file-upload/file-upload.ts +301 -0
- package/src/file-upload/file-upload.usage.example.ts +45 -0
- package/src/file-upload/index.ts +1 -0
- package/src/form/_examples/form.async-submit.example.ts +72 -0
- package/src/form/_examples/form.compound.example.ts +93 -0
- package/src/form/_examples/form.example.ts +70 -0
- package/src/form/_examples/form.validation.example.ts +67 -0
- package/src/form/_examples/index.ts +6 -0
- package/src/form/form.css +63 -0
- package/src/form/form.playground.ts +145 -0
- package/src/form/form.spec.ts +96 -0
- package/src/form/form.ts +216 -0
- package/src/form/form.usage.example.ts +63 -0
- package/src/form/index.ts +5 -0
- package/src/icon/_examples/icon.gallery.example.ts +199 -0
- package/src/icon/_examples/icon.usage.example.ts +46 -0
- package/src/icon/_examples/index.ts +4 -0
- package/src/icon/icon.playground.ts +63 -0
- package/src/icon/index.ts +5 -0
- package/src/icon/lucide/icon-names.generated.ts +1708 -0
- package/src/icon/lucide/icon-names.ts +18 -0
- package/src/icon/lucide/index.ts +2 -0
- package/src/icon/lucide/provide-lucide-icons.ts +96 -0
- package/src/input/_examples/index.ts +4 -0
- package/src/input/_examples/input.color.example.ts +33 -0
- package/src/input/_examples/input.example.ts +22 -0
- package/src/input/index.ts +1 -0
- package/src/input/input.css +70 -0
- package/src/input/input.playground.ts +79 -0
- package/src/input/input.spec.ts +98 -0
- package/src/input/input.ts +158 -0
- package/src/input/input.usage.example.ts +40 -0
- package/src/input-group/_examples/index.ts +7 -0
- package/src/input-group/_examples/input-group.button.example.ts +43 -0
- package/src/input-group/_examples/input-group.example.ts +39 -0
- package/src/input-group/_examples/input-group.icon.example.ts +49 -0
- package/src/input-group/_examples/input-group.url.example.ts +36 -0
- package/src/input-group/_examples/input-group.variants.example.ts +39 -0
- package/src/input-group/index.ts +1 -0
- package/src/input-group/input-group.css +125 -0
- package/src/input-group/input-group.playground.ts +90 -0
- package/src/input-group/input-group.ts +142 -0
- package/src/input-group/input-group.usage.example.ts +47 -0
- package/src/input-mask/_examples/index.ts +8 -0
- package/src/input-mask/_examples/input-mask.credit-card.example.ts +90 -0
- package/src/input-mask/_examples/input-mask.custom-tokens.example.ts +87 -0
- package/src/input-mask/_examples/input-mask.date.example.ts +61 -0
- package/src/input-mask/_examples/input-mask.example.ts +61 -0
- package/src/input-mask/_examples/input-mask.usage.example.ts +44 -0
- package/src/input-mask/_examples/input-mask.validation.example.ts +80 -0
- package/src/input-mask/index.ts +9 -0
- package/src/input-mask/input-mask.css +39 -0
- package/src/input-mask/input-mask.playground.ts +79 -0
- package/src/input-mask/input-mask.ts +130 -0
- package/src/input-otp/_examples/index.ts +8 -0
- package/src/input-otp/_examples/input-otp.autosubmit.example.ts +71 -0
- package/src/input-otp/_examples/input-otp.example.ts +47 -0
- package/src/input-otp/_examples/input-otp.lengths.example.ts +67 -0
- package/src/input-otp/_examples/input-otp.masked.example.ts +46 -0
- package/src/input-otp/_examples/input-otp.reactive.example.ts +58 -0
- package/src/input-otp/_examples/input-otp.separator.example.ts +49 -0
- package/src/input-otp/index.ts +1 -0
- package/src/input-otp/input-otp.css +87 -0
- package/src/input-otp/input-otp.playground.ts +107 -0
- package/src/input-otp/input-otp.ts +244 -0
- package/src/input-otp/input-otp.usage.example.ts +45 -0
- package/src/kbd/_examples/index.ts +6 -0
- package/src/kbd/_examples/kbd.combo.example.ts +24 -0
- package/src/kbd/_examples/kbd.example.ts +22 -0
- package/src/kbd/_examples/kbd.in-tooltip.example.ts +43 -0
- package/src/kbd/_examples/kbd.sizes.example.ts +31 -0
- package/src/kbd/index.ts +1 -0
- package/src/kbd/kbd.css +67 -0
- package/src/kbd/kbd.playground.ts +51 -0
- package/src/kbd/kbd.spec.ts +123 -0
- package/src/kbd/kbd.ts +123 -0
- package/src/kbd/kbd.usage.example.ts +38 -0
- package/src/link/_examples/index.ts +8 -0
- package/src/link/_examples/link.disabled.example.ts +23 -0
- package/src/link/_examples/link.example.ts +26 -0
- package/src/link/_examples/link.external.example.ts +33 -0
- package/src/link/_examples/link.in-prose.example.ts +36 -0
- package/src/link/_examples/link.sizes.example.ts +28 -0
- package/src/link/_examples/link.variants.example.ts +25 -0
- package/src/link/index.ts +1 -0
- package/src/link/link.css +104 -0
- package/src/link/link.playground.ts +98 -0
- package/src/link/link.spec.ts +146 -0
- package/src/link/link.ts +133 -0
- package/src/link/link.usage.example.ts +37 -0
- package/src/list/_examples/index.ts +7 -0
- package/src/list/_examples/list.divided.example.ts +32 -0
- package/src/list/_examples/list.example.ts +31 -0
- package/src/list/_examples/list.interactive.example.ts +51 -0
- package/src/list/_examples/list.nav.example.ts +44 -0
- package/src/list/_examples/list.with-icons.example.ts +97 -0
- package/src/list/index.ts +1 -0
- package/src/list/list.css +166 -0
- package/src/list/list.playground.ts +90 -0
- package/src/list/list.spec.ts +121 -0
- package/src/list/list.ts +227 -0
- package/src/list/list.usage.example.ts +45 -0
- package/src/menubar/_examples/index.ts +6 -0
- package/src/menubar/_examples/menubar.disabled-item.example.ts +23 -0
- package/src/menubar/_examples/menubar.example.ts +22 -0
- package/src/menubar/_examples/menubar.with-shortcuts.example.ts +33 -0
- package/src/menubar/_examples/menubar.with-submenu.example.ts +76 -0
- package/src/menubar/index.ts +1 -0
- package/src/menubar/menubar.css +62 -0
- package/src/menubar/menubar.playground.ts +96 -0
- package/src/menubar/menubar.ts +160 -0
- package/src/menubar/menubar.usage.example.ts +33 -0
- package/src/number-input/_examples/index.ts +7 -0
- package/src/number-input/_examples/number-input.currency.example.ts +35 -0
- package/src/number-input/_examples/number-input.decimal.example.ts +34 -0
- package/src/number-input/_examples/number-input.example.ts +24 -0
- package/src/number-input/_examples/number-input.min-max.example.ts +33 -0
- package/src/number-input/_examples/number-input.with-stepper.example.ts +45 -0
- package/src/number-input/index.ts +1 -0
- package/src/number-input/number-input.css +115 -0
- package/src/number-input/number-input.playground.ts +92 -0
- package/src/number-input/number-input.spec.ts +102 -0
- package/src/number-input/number-input.ts +212 -0
- package/src/number-input/number-input.usage.example.ts +73 -0
- package/src/overlay/overlay.css +32 -0
- package/src/overlay-badge/_examples/index.ts +7 -0
- package/src/overlay-badge/_examples/overlay-badge.described.example.ts +36 -0
- package/src/overlay-badge/_examples/overlay-badge.dot.example.ts +28 -0
- package/src/overlay-badge/_examples/overlay-badge.example.ts +34 -0
- package/src/overlay-badge/_examples/overlay-badge.on-avatar.example.ts +38 -0
- package/src/overlay-badge/_examples/overlay-badge.positions.example.ts +39 -0
- package/src/overlay-badge/index.ts +1 -0
- package/src/overlay-badge/overlay-badge.css +118 -0
- package/src/overlay-badge/overlay-badge.playground.ts +92 -0
- package/src/overlay-badge/overlay-badge.spec.ts +174 -0
- package/src/overlay-badge/overlay-badge.ts +232 -0
- package/src/overlay-badge/overlay-badge.usage.example.ts +44 -0
- package/src/pagination/_examples/index.ts +7 -0
- package/src/pagination/_examples/pagination.boundaries.example.ts +56 -0
- package/src/pagination/_examples/pagination.compact.example.ts +42 -0
- package/src/pagination/_examples/pagination.example.ts +55 -0
- package/src/pagination/_examples/pagination.large.example.ts +54 -0
- package/src/pagination/_examples/pagination.with-info.example.ts +49 -0
- package/src/pagination/index.ts +1 -0
- package/src/pagination/pagination.css +146 -0
- package/src/pagination/pagination.playground.ts +107 -0
- package/src/pagination/pagination.spec.ts +202 -0
- package/src/pagination/pagination.ts +432 -0
- package/src/pagination/pagination.usage.example.ts +50 -0
- package/src/password-input/_examples/index.ts +6 -0
- package/src/password-input/_examples/password-input.example.ts +24 -0
- package/src/password-input/_examples/password-input.strength.example.ts +45 -0
- package/src/password-input/_examples/password-input.toggle.example.ts +43 -0
- package/src/password-input/_examples/password-input.with-rules.example.ts +78 -0
- package/src/password-input/index.ts +1 -0
- package/src/password-input/password-input.css +155 -0
- package/src/password-input/password-input.playground.ts +81 -0
- package/src/password-input/password-input.spec.ts +129 -0
- package/src/password-input/password-input.ts +254 -0
- package/src/password-input/password-input.usage.example.ts +55 -0
- package/src/playground-types.ts +47 -0
- package/src/popover/_examples/index.ts +7 -0
- package/src/popover/_examples/popover.cancellable.example.ts +20 -0
- package/src/popover/_examples/popover.example.ts +20 -0
- package/src/popover/_examples/popover.modal.example.ts +22 -0
- package/src/popover/_examples/popover.sides.example.ts +37 -0
- package/src/popover/_examples/popover.with-form.example.ts +38 -0
- package/src/popover/index.ts +1 -0
- package/src/popover/popover.css +71 -0
- package/src/popover/popover.playground.ts +86 -0
- package/src/popover/popover.spec.ts +5 -0
- package/src/popover/popover.ts +94 -0
- package/src/popover/popover.usage.example.ts +48 -0
- package/src/progress-bar/_examples/index.ts +7 -0
- package/src/progress-bar/_examples/progress-bar.example.ts +22 -0
- package/src/progress-bar/_examples/progress-bar.indeterminate.example.ts +23 -0
- package/src/progress-bar/_examples/progress-bar.sizes.example.ts +29 -0
- package/src/progress-bar/_examples/progress-bar.variants.example.ts +30 -0
- package/src/progress-bar/_examples/progress-bar.with-label.example.ts +30 -0
- package/src/progress-bar/index.ts +1 -0
- package/src/progress-bar/progress-bar.css +113 -0
- package/src/progress-bar/progress-bar.playground.ts +87 -0
- package/src/progress-bar/progress-bar.spec.ts +233 -0
- package/src/progress-bar/progress-bar.ts +155 -0
- package/src/progress-bar/progress-bar.usage.example.ts +52 -0
- package/src/public-api.ts +61 -0
- package/src/radio/_examples/index.ts +6 -0
- package/src/radio/_examples/radio.default.example.ts +26 -0
- package/src/radio/_examples/radio.disabled.example.ts +26 -0
- package/src/radio/_examples/radio.group.example.ts +27 -0
- package/src/radio/_examples/radio.inline.example.ts +26 -0
- package/src/radio/index.ts +1 -0
- package/src/radio/radio.css +58 -0
- package/src/radio/radio.playground.ts +90 -0
- package/src/radio/radio.ts +143 -0
- package/src/radio/radio.usage.example.ts +54 -0
- package/src/select/_examples/index.ts +6 -0
- package/src/select/_examples/select.default.example.ts +26 -0
- package/src/select/_examples/select.disabled.example.ts +24 -0
- package/src/select/_examples/select.grouped.example.ts +37 -0
- package/src/select/_examples/select.placeholder.example.ts +26 -0
- package/src/select/index.ts +1 -0
- package/src/select/select.css +65 -0
- package/src/select/select.playground.ts +81 -0
- package/src/select/select.ts +176 -0
- package/src/select/select.usage.example.ts +64 -0
- package/src/skeleton/_examples/index.ts +6 -0
- package/src/skeleton/_examples/skeleton.animations.example.ts +52 -0
- package/src/skeleton/_examples/skeleton.card.example.ts +68 -0
- package/src/skeleton/_examples/skeleton.example.ts +24 -0
- package/src/skeleton/_examples/skeleton.shapes.example.ts +55 -0
- package/src/skeleton/index.ts +1 -0
- package/src/skeleton/skeleton.css +111 -0
- package/src/skeleton/skeleton.playground.ts +80 -0
- package/src/skeleton/skeleton.spec.ts +126 -0
- package/src/skeleton/skeleton.ts +155 -0
- package/src/skeleton/skeleton.usage.example.ts +49 -0
- package/src/slider/_examples/index.ts +7 -0
- package/src/slider/_examples/slider.example.ts +41 -0
- package/src/slider/_examples/slider.formatted.example.ts +53 -0
- package/src/slider/_examples/slider.range.example.ts +48 -0
- package/src/slider/_examples/slider.vertical.example.ts +48 -0
- package/src/slider/_examples/slider.with-marks.example.ts +46 -0
- package/src/slider/index.ts +1 -0
- package/src/slider/slider.css +172 -0
- package/src/slider/slider.playground.ts +88 -0
- package/src/slider/slider.spec.ts +139 -0
- package/src/slider/slider.ts +246 -0
- package/src/slider/slider.usage.example.ts +68 -0
- package/src/speed-dial/_examples/index.ts +7 -0
- package/src/speed-dial/_examples/speed-dial.directions.example.ts +85 -0
- package/src/speed-dial/_examples/speed-dial.disabled.example.ts +71 -0
- package/src/speed-dial/_examples/speed-dial.example.ts +48 -0
- package/src/speed-dial/_examples/speed-dial.usage.example.ts +59 -0
- package/src/speed-dial/_examples/speed-dial.with-tooltips.example.ts +65 -0
- package/src/speed-dial/index.ts +1 -0
- package/src/speed-dial/speed-dial.css +137 -0
- package/src/speed-dial/speed-dial.playground.ts +137 -0
- package/src/speed-dial/speed-dial.spec.ts +191 -0
- package/src/speed-dial/speed-dial.ts +257 -0
- package/src/spinner/_examples/index.ts +8 -0
- package/src/spinner/_examples/spinner.animations.example.ts +54 -0
- package/src/spinner/_examples/spinner.example.ts +26 -0
- package/src/spinner/_examples/spinner.in-button.example.ts +51 -0
- package/src/spinner/_examples/spinner.sizes.example.ts +31 -0
- package/src/spinner/_examples/spinner.usage.example.ts +45 -0
- package/src/spinner/_examples/spinner.variants.example.ts +34 -0
- package/src/spinner/index.ts +1 -0
- package/src/spinner/spinner.css +161 -0
- package/src/spinner/spinner.playground.ts +68 -0
- package/src/spinner/spinner.spec.ts +184 -0
- package/src/spinner/spinner.ts +185 -0
- package/src/stepper/_examples/index.ts +8 -0
- package/src/stepper/_examples/stepper.example.ts +62 -0
- package/src/stepper/_examples/stepper.non-linear.example.ts +63 -0
- package/src/stepper/_examples/stepper.optional-step.example.ts +62 -0
- package/src/stepper/_examples/stepper.usage.example.ts +73 -0
- package/src/stepper/_examples/stepper.vertical.example.ts +66 -0
- package/src/stepper/_examples/stepper.with-error.example.ts +63 -0
- package/src/stepper/index.ts +1 -0
- package/src/stepper/stepper.css +147 -0
- package/src/stepper/stepper.playground.ts +88 -0
- package/src/stepper/stepper.spec.ts +200 -0
- package/src/stepper/stepper.ts +242 -0
- package/src/table/_examples/index.ts +23 -0
- package/src/table/_examples/table.column-pinning.example.ts +55 -0
- package/src/table/_examples/table.column-resize.example.ts +49 -0
- package/src/table/_examples/table.column-visibility.example.ts +52 -0
- package/src/table/_examples/table.density.example.ts +71 -0
- package/src/table/_examples/table.editable.example.ts +85 -0
- package/src/table/_examples/table.empty-and-error.example.ts +112 -0
- package/src/table/_examples/table.example.ts +45 -0
- package/src/table/_examples/table.export.example.ts +82 -0
- package/src/table/_examples/table.filterable.example.ts +67 -0
- package/src/table/_examples/table.grouping.example.ts +63 -0
- package/src/table/_examples/table.keyboard.example.ts +115 -0
- package/src/table/_examples/table.master-detail.example.ts +102 -0
- package/src/table/_examples/table.persistence.example.ts +85 -0
- package/src/table/_examples/table.playground.ts +154 -0
- package/src/table/_examples/table.row-pinning.example.ts +71 -0
- package/src/table/_examples/table.selection.example.ts +67 -0
- package/src/table/_examples/table.server-mode.example.ts +120 -0
- package/src/table/_examples/table.sortable.example.ts +49 -0
- package/src/table/_examples/table.theming.example.ts +64 -0
- package/src/table/_examples/table.usage.example.ts +90 -0
- package/src/table/_examples/table.virtualized.example.ts +122 -0
- package/src/table/index.ts +11 -0
- package/src/table/table-cell-editor-outlet.ts +111 -0
- package/src/table/table-editors/boolean-editor.ts +71 -0
- package/src/table/table-editors/date-editor.ts +117 -0
- package/src/table/table-editors/editors.spec.ts +147 -0
- package/src/table/table-editors/index.ts +41 -0
- package/src/table/table-editors/number-editor.ts +89 -0
- package/src/table/table-editors/select-editor.ts +107 -0
- package/src/table/table-editors/text-editor.ts +82 -0
- package/src/table/table-export.spec.ts +33 -0
- package/src/table/table-export.ts +53 -0
- package/src/table/table-filter-outlet.ts +137 -0
- package/src/table/table-filters/date-filter.ts +122 -0
- package/src/table/table-filters/filters.css +53 -0
- package/src/table/table-filters/filters.spec.ts +277 -0
- package/src/table/table-filters/index.ts +11 -0
- package/src/table/table-filters/number-filter.ts +232 -0
- package/src/table/table-filters/select-filter.ts +129 -0
- package/src/table/table-filters/text-filter.ts +110 -0
- package/src/table/table-pagination.spec.ts +118 -0
- package/src/table/table-pagination.ts +191 -0
- package/src/table/table-side-panel.spec.ts +170 -0
- package/src/table/table-side-panel.ts +263 -0
- package/src/table/table-status-bar.spec.ts +78 -0
- package/src/table/table-status-bar.ts +70 -0
- package/src/table/table-toolbar.spec.ts +180 -0
- package/src/table/table-toolbar.ts +244 -0
- package/src/table/table-virtual.spec.ts +103 -0
- package/src/table/table-virtual.ts +180 -0
- package/src/table/table.css +468 -0
- package/src/table/table.spec.ts +175 -0
- package/src/table/table.ts +1009 -0
- package/src/tabs/_examples/index.ts +8 -0
- package/src/tabs/_examples/tabs.controlled.example.ts +59 -0
- package/src/tabs/_examples/tabs.disabled.example.ts +34 -0
- package/src/tabs/_examples/tabs.example.ts +34 -0
- package/src/tabs/_examples/tabs.manual-activation.example.ts +34 -0
- package/src/tabs/_examples/tabs.usage.example.ts +43 -0
- package/src/tabs/_examples/tabs.vertical.example.ts +33 -0
- package/src/tabs/index.ts +1 -0
- package/src/tabs/tabs.css +80 -0
- package/src/tabs/tabs.playground.ts +88 -0
- package/src/tabs/tabs.spec.ts +135 -0
- package/src/tabs/tabs.ts +204 -0
- package/src/tag/_examples/index.ts +9 -0
- package/src/tag/_examples/tag.example.ts +22 -0
- package/src/tag/_examples/tag.list.example.ts +38 -0
- package/src/tag/_examples/tag.removable.example.ts +39 -0
- package/src/tag/_examples/tag.selectable.example.ts +33 -0
- package/src/tag/_examples/tag.sizes.example.ts +25 -0
- package/src/tag/_examples/tag.usage.example.ts +62 -0
- package/src/tag/_examples/tag.variants.example.ts +29 -0
- package/src/tag/index.ts +1 -0
- package/src/tag/tag.css +167 -0
- package/src/tag/tag.playground.ts +63 -0
- package/src/tag/tag.spec.ts +153 -0
- package/src/tag/tag.ts +186 -0
- package/src/test-setup.ts +5 -0
- package/src/textarea/_examples/index.ts +8 -0
- package/src/textarea/_examples/textarea.autoresize.example.ts +37 -0
- package/src/textarea/_examples/textarea.character-count.example.ts +34 -0
- package/src/textarea/_examples/textarea.example.ts +22 -0
- package/src/textarea/_examples/textarea.no-resize.example.ts +28 -0
- package/src/textarea/_examples/textarea.usage.example.ts +50 -0
- package/src/textarea/_examples/textarea.with-field.example.ts +66 -0
- package/src/textarea/index.ts +1 -0
- package/src/textarea/textarea.css +117 -0
- package/src/textarea/textarea.playground.ts +70 -0
- package/src/textarea/textarea.spec.ts +161 -0
- package/src/textarea/textarea.ts +339 -0
- package/src/time-picker/_examples/index.ts +8 -0
- package/src/time-picker/_examples/time-picker.12-hour.example.ts +24 -0
- package/src/time-picker/_examples/time-picker.example.ts +24 -0
- package/src/time-picker/_examples/time-picker.formatted.example.ts +32 -0
- package/src/time-picker/_examples/time-picker.range.example.ts +54 -0
- package/src/time-picker/_examples/time-picker.usage.example.ts +53 -0
- package/src/time-picker/_examples/time-picker.with-seconds.example.ts +24 -0
- package/src/time-picker/index.ts +1 -0
- package/src/time-picker/time-picker.css +126 -0
- package/src/time-picker/time-picker.playground.ts +72 -0
- package/src/time-picker/time-picker.spec.ts +77 -0
- package/src/time-picker/time-picker.ts +207 -0
- package/src/toast/_examples/index.ts +7 -0
- package/src/toast/_examples/toast.default.example.ts +37 -0
- package/src/toast/_examples/toast.dismissible.example.ts +38 -0
- package/src/toast/_examples/toast.usage.example.ts +57 -0
- package/src/toast/_examples/toast.variants.example.ts +43 -0
- package/src/toast/_examples/toast.with-action.example.ts +46 -0
- package/src/toast/index.ts +1 -0
- package/src/toast/toast.css +115 -0
- package/src/toast/toast.playground.ts +61 -0
- package/src/toast/toast.ts +168 -0
- package/src/toggle/_examples/index.ts +7 -0
- package/src/toggle/_examples/toggle.checked.example.ts +20 -0
- package/src/toggle/_examples/toggle.default.example.ts +20 -0
- package/src/toggle/_examples/toggle.disabled.example.ts +26 -0
- package/src/toggle/_examples/toggle.usage.example.ts +51 -0
- package/src/toggle/_examples/toggle.with-label.example.ts +30 -0
- package/src/toggle/index.ts +1 -0
- package/src/toggle/toggle.css +123 -0
- package/src/toggle/toggle.playground.ts +65 -0
- package/src/toggle/toggle.ts +113 -0
- package/src/tooltip/_examples/index.ts +9 -0
- package/src/tooltip/_examples/tooltip.delays.example.ts +16 -0
- package/src/tooltip/_examples/tooltip.disabled.example.ts +16 -0
- package/src/tooltip/_examples/tooltip.example.ts +16 -0
- package/src/tooltip/_examples/tooltip.group.example.ts +20 -0
- package/src/tooltip/_examples/tooltip.rich.example.ts +19 -0
- package/src/tooltip/_examples/tooltip.sides.example.ts +18 -0
- package/src/tooltip/_examples/tooltip.usage.example.ts +50 -0
- package/src/tooltip/index.ts +1 -0
- package/src/tooltip/tooltip.css +61 -0
- package/src/tooltip/tooltip.playground.ts +79 -0
- package/src/tooltip/tooltip.spec.ts +5 -0
- package/src/tooltip/tooltip.ts +102 -0
- package/src/tree-select/_examples/index.ts +8 -0
- package/src/tree-select/_examples/tree-select.disabled.example.ts +106 -0
- package/src/tree-select/_examples/tree-select.example.ts +65 -0
- package/src/tree-select/_examples/tree-select.expanded.example.ts +72 -0
- package/src/tree-select/_examples/tree-select.field.example.ts +77 -0
- package/src/tree-select/_examples/tree-select.multi.example.ts +73 -0
- package/src/tree-select/_examples/tree-select.usage.example.ts +85 -0
- package/src/tree-select/index.ts +1 -0
- package/src/tree-select/tree-select.css +220 -0
- package/src/tree-select/tree-select.playground.ts +83 -0
- package/src/tree-select/tree-select.ts +348 -0
- package/src/typography/_examples/index.ts +9 -0
- package/src/typography/_examples/typography.blockquote.example.ts +34 -0
- package/src/typography/_examples/typography.code.example.ts +32 -0
- package/src/typography/_examples/typography.example.ts +42 -0
- package/src/typography/_examples/typography.lead.example.ts +37 -0
- package/src/typography/_examples/typography.muted.example.ts +27 -0
- package/src/typography/_examples/typography.truncate.example.ts +41 -0
- package/src/typography/_examples/typography.usage.example.ts +44 -0
- package/src/typography/index.ts +8 -0
- package/src/typography/typography.playground.ts +101 -0
- package/src/typography/typography.spec.ts +70 -0
- package/src/typography/typography.ts +105 -0
- package/tsconfig.lib.json +25 -0
- package/tsconfig.lib.prod.json +17 -0
- package/tsconfig.spec.json +16 -0
- package/vite.config.ts +33 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
.kj-progress-bar — component-layer tokens + structural CSS
|
|
3
|
+
The directive owns the value math + ARIA contract. The theme
|
|
4
|
+
only renders track + fill. Variant tokens flip the fill colour;
|
|
5
|
+
size tokens flip the bar height. The indeterminate stripe is a
|
|
6
|
+
pure CSS animation, neutralised under prefers-reduced-motion.
|
|
7
|
+
──────────────────────────────────────────────────────────── */
|
|
8
|
+
|
|
9
|
+
@layer kj.component {
|
|
10
|
+
.kj-progress-bar {
|
|
11
|
+
/* component knobs — themes/users can override any of these */
|
|
12
|
+
--kj-progress-bar-track: var(--kj-bg-field);
|
|
13
|
+
--kj-progress-bar-fill: var(--kj-bg-primary);
|
|
14
|
+
--kj-progress-bar-radius: 9999px;
|
|
15
|
+
--kj-progress-bar-height: 0.5rem; /* md default — 8px */
|
|
16
|
+
--kj-progress-bar-transition: 200ms ease-out;
|
|
17
|
+
--kj-progress-bar-indeterminate-duration: 1.6s;
|
|
18
|
+
|
|
19
|
+
display: block;
|
|
20
|
+
position: relative;
|
|
21
|
+
width: 100%;
|
|
22
|
+
height: var(--kj-progress-bar-height);
|
|
23
|
+
background: var(--kj-progress-bar-track);
|
|
24
|
+
border-radius: var(--kj-progress-bar-radius);
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* ── Sizes ── (data-size mirrored by KjSize host directive) */
|
|
29
|
+
.kj-progress-bar[data-size="xs"] { --kj-progress-bar-height: 0.125rem; } /* 2px */
|
|
30
|
+
.kj-progress-bar[data-size="sm"] { --kj-progress-bar-height: 0.25rem; } /* 4px */
|
|
31
|
+
.kj-progress-bar[data-size="md"] { --kj-progress-bar-height: 0.5rem; } /* 8px */
|
|
32
|
+
.kj-progress-bar[data-size="lg"] { --kj-progress-bar-height: 0.75rem; } /* 12px */
|
|
33
|
+
|
|
34
|
+
/* ── Variants ── (data-variant mirrored by KjVariant host directive) */
|
|
35
|
+
.kj-progress-bar[data-variant="primary"] { --kj-progress-bar-fill: var(--kj-bg-primary); }
|
|
36
|
+
.kj-progress-bar[data-variant="success"] { --kj-progress-bar-fill: var(--kj-bg-success); }
|
|
37
|
+
.kj-progress-bar[data-variant="warning"] { --kj-progress-bar-fill: var(--kj-bg-warning); }
|
|
38
|
+
.kj-progress-bar[data-variant="error"] { --kj-progress-bar-fill: var(--kj-bg-danger); }
|
|
39
|
+
|
|
40
|
+
/* ── Fill (determinate) ──
|
|
41
|
+
The directive sets --kj-progress-fraction (0..1) on the host AND on the
|
|
42
|
+
fill. Reading from the fill is one selector hop shorter and lets us scope
|
|
43
|
+
the transition cleanly. */
|
|
44
|
+
.kj-progress-bar__fill {
|
|
45
|
+
display: block;
|
|
46
|
+
width: 100%;
|
|
47
|
+
height: 100%;
|
|
48
|
+
background: var(--kj-progress-bar-fill);
|
|
49
|
+
border-radius: inherit;
|
|
50
|
+
transform-origin: left center;
|
|
51
|
+
transform: scaleX(var(--kj-progress-fraction, 0));
|
|
52
|
+
/* Transition the fill width on value changes — but never the colour, so
|
|
53
|
+
a variant flip mid-flight is instantaneous. */
|
|
54
|
+
transition: transform var(--kj-progress-bar-transition);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* RTL: the fill grows from the right edge. */
|
|
58
|
+
[dir="rtl"] .kj-progress-bar__fill {
|
|
59
|
+
transform-origin: right center;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ── Fill (indeterminate) ──
|
|
63
|
+
When data-indeterminate="true", abandon the scaleX(fraction) transform
|
|
64
|
+
and run a stripe that travels left → right. The stripe is a 50%-wide
|
|
65
|
+
coloured band on a transparent track, which gives a clean "working"
|
|
66
|
+
read on every theme without needing the track itself to animate. */
|
|
67
|
+
.kj-progress-bar__fill[data-indeterminate="true"] {
|
|
68
|
+
transform: none;
|
|
69
|
+
background: linear-gradient(
|
|
70
|
+
90deg,
|
|
71
|
+
transparent 0%,
|
|
72
|
+
var(--kj-progress-bar-fill) 50%,
|
|
73
|
+
transparent 100%
|
|
74
|
+
);
|
|
75
|
+
background-size: 50% 100%;
|
|
76
|
+
background-repeat: no-repeat;
|
|
77
|
+
animation: kj-progress-bar-indeterminate
|
|
78
|
+
var(--kj-progress-bar-indeterminate-duration) linear infinite;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@keyframes kj-progress-bar-indeterminate {
|
|
82
|
+
from { background-position: -50% 0; }
|
|
83
|
+
to { background-position: 150% 0; }
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* ── Reduced motion ──
|
|
87
|
+
APG / WCAG 2.3.3: animations from interactions must respect
|
|
88
|
+
prefers-reduced-motion. The directive reflects data-reduced-motion;
|
|
89
|
+
we also honour the media query directly so the rule kicks in even if
|
|
90
|
+
the directive's media-query subscription hasn't run yet (SSR, very
|
|
91
|
+
early paint). The indeterminate stripe collapses to a static, dimmed
|
|
92
|
+
fill — still visible as "something is happening", just not moving. */
|
|
93
|
+
.kj-progress-bar[data-reduced-motion="reduce"] .kj-progress-bar__fill,
|
|
94
|
+
.kj-progress-bar[data-reduced-motion="reduce"] .kj-progress-bar__fill[data-indeterminate="true"] {
|
|
95
|
+
animation: none;
|
|
96
|
+
transition: none;
|
|
97
|
+
}
|
|
98
|
+
.kj-progress-bar[data-reduced-motion="reduce"] .kj-progress-bar__fill[data-indeterminate="true"] {
|
|
99
|
+
background: var(--kj-progress-bar-fill);
|
|
100
|
+
opacity: 0.6;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@media (prefers-reduced-motion: reduce) {
|
|
104
|
+
.kj-progress-bar__fill {
|
|
105
|
+
transition: none;
|
|
106
|
+
}
|
|
107
|
+
.kj-progress-bar__fill[data-indeterminate="true"] {
|
|
108
|
+
animation: none;
|
|
109
|
+
background: var(--kj-progress-bar-fill);
|
|
110
|
+
opacity: 0.6;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
2
|
+
import { KjProgressBarComponent } from './progress-bar';
|
|
3
|
+
import type { PlaygroundFile } from '@kouji-ui/components/playground-types';
|
|
4
|
+
|
|
5
|
+
const value = signal<number>(60);
|
|
6
|
+
const min = signal<number>(0);
|
|
7
|
+
const max = signal<number>(100);
|
|
8
|
+
const variant = signal<'primary' | 'success' | 'warning' | 'error'>('primary');
|
|
9
|
+
const size = signal<'xs' | 'sm' | 'md' | 'lg'>('md');
|
|
10
|
+
const ariaValuetext = signal<string>('');
|
|
11
|
+
|
|
12
|
+
@Component({
|
|
13
|
+
selector: 'kj-progress-bar-playground',
|
|
14
|
+
standalone: true,
|
|
15
|
+
imports: [KjProgressBarComponent],
|
|
16
|
+
styles: [`
|
|
17
|
+
/* The progress bar itself uses width: 100%, but the flex-centered
|
|
18
|
+
playground stage shrinks it to content size — give the host a
|
|
19
|
+
comfortable width so the bar has something to fill. */
|
|
20
|
+
:host { display: block; width: min(420px, 100%); }
|
|
21
|
+
`],
|
|
22
|
+
template: `
|
|
23
|
+
<kj-progress-bar
|
|
24
|
+
[kjValue]="value()"
|
|
25
|
+
[kjMin]="min()"
|
|
26
|
+
[kjMax]="max()"
|
|
27
|
+
[kjVariant]="variant()"
|
|
28
|
+
[kjSize]="size()"
|
|
29
|
+
[kjAriaValuetext]="ariaValuetext()"
|
|
30
|
+
kjAriaLabel="Loading progress"
|
|
31
|
+
/>
|
|
32
|
+
`,
|
|
33
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
34
|
+
})
|
|
35
|
+
export class KjProgressBarPlaygroundDemo {
|
|
36
|
+
protected readonly value = value;
|
|
37
|
+
protected readonly min = min;
|
|
38
|
+
protected readonly max = max;
|
|
39
|
+
protected readonly variant = variant;
|
|
40
|
+
protected readonly size = size;
|
|
41
|
+
protected readonly ariaValuetext = ariaValuetext;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const PLAYGROUND: PlaygroundFile = {
|
|
45
|
+
component: KjProgressBarPlaygroundDemo,
|
|
46
|
+
state: {
|
|
47
|
+
value: value as unknown as ReturnType<typeof signal>,
|
|
48
|
+
min: min as unknown as ReturnType<typeof signal>,
|
|
49
|
+
max: max as unknown as ReturnType<typeof signal>,
|
|
50
|
+
variant: variant as unknown as ReturnType<typeof signal>,
|
|
51
|
+
size: size as unknown as ReturnType<typeof signal>,
|
|
52
|
+
ariaValuetext: ariaValuetext as unknown as ReturnType<typeof signal>,
|
|
53
|
+
},
|
|
54
|
+
controls: [
|
|
55
|
+
{ kind: 'number', name: 'value', label: 'value' },
|
|
56
|
+
{ kind: 'number', name: 'min', label: 'min' },
|
|
57
|
+
{ kind: 'number', name: 'max', label: 'max' },
|
|
58
|
+
{
|
|
59
|
+
kind: 'chips',
|
|
60
|
+
name: 'variant',
|
|
61
|
+
label: 'variant',
|
|
62
|
+
options: ['primary', 'success', 'warning', 'error'],
|
|
63
|
+
},
|
|
64
|
+
{ kind: 'chips', name: 'size', label: 'size', options: ['xs', 'sm', 'md', 'lg'] },
|
|
65
|
+
{ kind: 'text', name: 'ariaValuetext', label: 'aria-valuetext' },
|
|
66
|
+
],
|
|
67
|
+
snippet: (values) => {
|
|
68
|
+
const s = values as {
|
|
69
|
+
value: number;
|
|
70
|
+
min: number;
|
|
71
|
+
max: number;
|
|
72
|
+
variant: string;
|
|
73
|
+
size: string;
|
|
74
|
+
ariaValuetext: string;
|
|
75
|
+
};
|
|
76
|
+
const attrs: string[] = [
|
|
77
|
+
`[kjValue]="${s.value}"`,
|
|
78
|
+
`[kjMin]="${s.min}"`,
|
|
79
|
+
`[kjMax]="${s.max}"`,
|
|
80
|
+
`kjVariant="${s.variant}"`,
|
|
81
|
+
`kjSize="${s.size}"`,
|
|
82
|
+
];
|
|
83
|
+
if (s.ariaValuetext) attrs.push(`kjAriaValuetext="${s.ariaValuetext}"`);
|
|
84
|
+
attrs.push('kjAriaLabel="Loading progress"');
|
|
85
|
+
return `<kj-progress-bar\n ${attrs.join('\n ')}\n/>`;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { Component, signal } from '@angular/core';
|
|
2
|
+
import { render } from '@testing-library/angular';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
|
|
5
|
+
import { KjProgressBarComponent } from './progress-bar';
|
|
6
|
+
|
|
7
|
+
const imports = [KjProgressBarComponent];
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Flush microtasks + the rAF backing `afterNextRender` so the directive has
|
|
11
|
+
* a chance to subscribe to the reduced-motion signal and write its host
|
|
12
|
+
* attributes before assertions read them.
|
|
13
|
+
*/
|
|
14
|
+
async function flush(): Promise<void> {
|
|
15
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 0));
|
|
16
|
+
await Promise.resolve();
|
|
17
|
+
await Promise.resolve();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** The wrapper's `<kj-progress-bar>` host renders `display: contents` and
|
|
21
|
+
* delegates ARIA + value math to an inner `<div kjProgressBar>`. The inner
|
|
22
|
+
* div is what carries `role`, the value attributes, and the data-*
|
|
23
|
+
* reflections — that's the assertion target. */
|
|
24
|
+
function getBar(container: ParentNode): HTMLElement {
|
|
25
|
+
const bar = container.querySelector('div.kj-progress-bar') as HTMLElement;
|
|
26
|
+
if (!bar) throw new Error('kj-progress-bar inner element not found');
|
|
27
|
+
return bar;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
describe('KjProgressBarComponent', () => {
|
|
31
|
+
it('renders the wrapper with an inner [kjProgressBar] and a [kjProgressBarFill]', async () => {
|
|
32
|
+
@Component({
|
|
33
|
+
standalone: true,
|
|
34
|
+
imports,
|
|
35
|
+
template: `<kj-progress-bar [kjValue]="50" kjAriaLabel="x" />`,
|
|
36
|
+
})
|
|
37
|
+
class Host {}
|
|
38
|
+
|
|
39
|
+
const { container } = await render(Host);
|
|
40
|
+
await flush();
|
|
41
|
+
|
|
42
|
+
const wrapper = container.querySelector('kj-progress-bar') as HTMLElement;
|
|
43
|
+
expect(wrapper).toBeTruthy();
|
|
44
|
+
|
|
45
|
+
const bar = getBar(container);
|
|
46
|
+
expect(bar.getAttribute('role')).toBe('progressbar');
|
|
47
|
+
|
|
48
|
+
// Wrapper is responsible for rendering the inner fill so consumers
|
|
49
|
+
// don't have to remember the two-element shape.
|
|
50
|
+
const fill = bar.querySelector('.kj-progress-bar__fill') as HTMLElement;
|
|
51
|
+
expect(fill).toBeTruthy();
|
|
52
|
+
// Fill is the [kjProgressBarFill] directive host — it reflects the
|
|
53
|
+
// parent fraction as --kj-progress-fraction (proves wiring is intact).
|
|
54
|
+
expect(fill.style.getPropertyValue('--kj-progress-fraction')).toBe('0.5');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('forwards kjValue: aliased input drives aria-valuenow when determinate', async () => {
|
|
58
|
+
@Component({
|
|
59
|
+
standalone: true,
|
|
60
|
+
imports,
|
|
61
|
+
template: `<kj-progress-bar [kjValue]="42" kjAriaLabel="Upload" />`,
|
|
62
|
+
})
|
|
63
|
+
class Host {}
|
|
64
|
+
|
|
65
|
+
const { container } = await render(Host);
|
|
66
|
+
await flush();
|
|
67
|
+
|
|
68
|
+
const bar = getBar(container);
|
|
69
|
+
expect(bar.getAttribute('role')).toBe('progressbar');
|
|
70
|
+
expect(bar.getAttribute('aria-valuenow')).toBe('42');
|
|
71
|
+
expect(bar.getAttribute('aria-valuemin')).toBe('0');
|
|
72
|
+
expect(bar.getAttribute('aria-valuemax')).toBe('100');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('omits aria-valuenow when kjValue is null (indeterminate)', async () => {
|
|
76
|
+
@Component({
|
|
77
|
+
standalone: true,
|
|
78
|
+
imports,
|
|
79
|
+
template: `<kj-progress-bar [kjValue]="null" kjAriaLabel="Loading" />`,
|
|
80
|
+
})
|
|
81
|
+
class Host {}
|
|
82
|
+
|
|
83
|
+
const { container } = await render(Host);
|
|
84
|
+
await flush();
|
|
85
|
+
|
|
86
|
+
const bar = getBar(container);
|
|
87
|
+
// APG-correct: indeterminate must NOT carry aria-valuenow at all.
|
|
88
|
+
expect(bar.hasAttribute('aria-valuenow')).toBe(false);
|
|
89
|
+
expect(bar.getAttribute('data-indeterminate')).toBe('true');
|
|
90
|
+
|
|
91
|
+
// Bounds attributes are still present in indeterminate mode.
|
|
92
|
+
expect(bar.getAttribute('aria-valuemin')).toBe('0');
|
|
93
|
+
expect(bar.getAttribute('aria-valuemax')).toBe('100');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('forwards kjMin / kjMax for absolute units', async () => {
|
|
97
|
+
@Component({
|
|
98
|
+
standalone: true,
|
|
99
|
+
imports,
|
|
100
|
+
template: `
|
|
101
|
+
<kj-progress-bar
|
|
102
|
+
[kjMin]="0"
|
|
103
|
+
[kjMax]="2500000"
|
|
104
|
+
[kjValue]="1200000"
|
|
105
|
+
kjAriaLabel="bytes"
|
|
106
|
+
/>
|
|
107
|
+
`,
|
|
108
|
+
})
|
|
109
|
+
class Host {}
|
|
110
|
+
|
|
111
|
+
const { container } = await render(Host);
|
|
112
|
+
await flush();
|
|
113
|
+
|
|
114
|
+
const bar = getBar(container);
|
|
115
|
+
expect(bar.getAttribute('aria-valuemin')).toBe('0');
|
|
116
|
+
expect(bar.getAttribute('aria-valuemax')).toBe('2500000');
|
|
117
|
+
expect(bar.getAttribute('aria-valuenow')).toBe('1200000');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('forwards kjAriaValuetext to the host', async () => {
|
|
121
|
+
@Component({
|
|
122
|
+
standalone: true,
|
|
123
|
+
imports,
|
|
124
|
+
template: `<kj-progress-bar [kjValue]="60" kjAriaValuetext="Step 3 of 5" kjAriaLabel="Onboarding" />`,
|
|
125
|
+
})
|
|
126
|
+
class Host {}
|
|
127
|
+
|
|
128
|
+
const { container } = await render(Host);
|
|
129
|
+
await flush();
|
|
130
|
+
|
|
131
|
+
const bar = getBar(container);
|
|
132
|
+
expect(bar.getAttribute('aria-valuetext')).toBe('Step 3 of 5');
|
|
133
|
+
// Visual fraction is still 60% even though SR reads the phrasing.
|
|
134
|
+
expect(bar.getAttribute('aria-valuenow')).toBe('60');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('forwards kjVariant and kjSize through the composed directives', async () => {
|
|
138
|
+
@Component({
|
|
139
|
+
standalone: true,
|
|
140
|
+
imports,
|
|
141
|
+
template: `<kj-progress-bar [kjValue]="50" kjVariant="success" kjSize="lg" kjAriaLabel="x" />`,
|
|
142
|
+
})
|
|
143
|
+
class Host {}
|
|
144
|
+
|
|
145
|
+
const { container } = await render(Host);
|
|
146
|
+
await flush();
|
|
147
|
+
|
|
148
|
+
const bar = getBar(container);
|
|
149
|
+
expect(bar.getAttribute('data-variant')).toBe('success');
|
|
150
|
+
expect(bar.getAttribute('data-size')).toBe('lg');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('reflects defaults when no variant/size provided (primary, md)', async () => {
|
|
154
|
+
@Component({
|
|
155
|
+
standalone: true,
|
|
156
|
+
imports,
|
|
157
|
+
template: `<kj-progress-bar [kjValue]="50" kjAriaLabel="x" />`,
|
|
158
|
+
})
|
|
159
|
+
class Host {}
|
|
160
|
+
|
|
161
|
+
const { container } = await render(Host);
|
|
162
|
+
await flush();
|
|
163
|
+
|
|
164
|
+
const bar = getBar(container);
|
|
165
|
+
expect(bar.getAttribute('data-variant')).toBe('primary');
|
|
166
|
+
expect(bar.getAttribute('data-size')).toBe('md');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('binds kjAriaLabel to the bar', async () => {
|
|
170
|
+
@Component({
|
|
171
|
+
standalone: true,
|
|
172
|
+
imports,
|
|
173
|
+
template: `<kj-progress-bar [kjValue]="50" kjAriaLabel="Upload progress" />`,
|
|
174
|
+
})
|
|
175
|
+
class Host {}
|
|
176
|
+
|
|
177
|
+
const { container } = await render(Host);
|
|
178
|
+
await flush();
|
|
179
|
+
|
|
180
|
+
const bar = getBar(container);
|
|
181
|
+
expect(bar.getAttribute('aria-label')).toBe('Upload progress');
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('binds kjAriaLabelledby to the bar', async () => {
|
|
185
|
+
@Component({
|
|
186
|
+
standalone: true,
|
|
187
|
+
imports,
|
|
188
|
+
template: `
|
|
189
|
+
<span id="upload-heading">Upload</span>
|
|
190
|
+
<kj-progress-bar [kjValue]="50" kjAriaLabelledby="upload-heading" />
|
|
191
|
+
`,
|
|
192
|
+
})
|
|
193
|
+
class Host {}
|
|
194
|
+
|
|
195
|
+
const { container } = await render(Host);
|
|
196
|
+
await flush();
|
|
197
|
+
|
|
198
|
+
const bar = getBar(container);
|
|
199
|
+
expect(bar.getAttribute('aria-labelledby')).toBe('upload-heading');
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('switches between determinate and indeterminate reactively', async () => {
|
|
203
|
+
@Component({
|
|
204
|
+
standalone: true,
|
|
205
|
+
imports,
|
|
206
|
+
template: `<kj-progress-bar [kjValue]="value()" kjAriaLabel="x" />`,
|
|
207
|
+
})
|
|
208
|
+
class Host {
|
|
209
|
+
readonly value = signal<number | null>(30);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const { fixture } = await render(Host);
|
|
213
|
+
await flush();
|
|
214
|
+
|
|
215
|
+
const bar = getBar(fixture.nativeElement);
|
|
216
|
+
expect(bar.getAttribute('aria-valuenow')).toBe('30');
|
|
217
|
+
expect(bar.hasAttribute('data-indeterminate')).toBe(false);
|
|
218
|
+
|
|
219
|
+
fixture.componentInstance.value.set(null);
|
|
220
|
+
fixture.detectChanges();
|
|
221
|
+
await flush();
|
|
222
|
+
|
|
223
|
+
expect(bar.hasAttribute('aria-valuenow')).toBe(false);
|
|
224
|
+
expect(bar.getAttribute('data-indeterminate')).toBe('true');
|
|
225
|
+
|
|
226
|
+
fixture.componentInstance.value.set(80);
|
|
227
|
+
fixture.detectChanges();
|
|
228
|
+
await flush();
|
|
229
|
+
|
|
230
|
+
expect(bar.getAttribute('aria-valuenow')).toBe('80');
|
|
231
|
+
expect(bar.hasAttribute('data-indeterminate')).toBe(false);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChangeDetectionStrategy,
|
|
3
|
+
Component,
|
|
4
|
+
ViewEncapsulation,
|
|
5
|
+
input,
|
|
6
|
+
} from '@angular/core';
|
|
7
|
+
import { KjProgressBar, KjProgressBarFill } from '@kouji-ui/core';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Styled wrapper around the headless `KjProgressBar` directive. Composes the
|
|
11
|
+
* core directive on an inner element and renders the inner
|
|
12
|
+
* `[kjProgressBarFill]` automatically so consumers don't have to remember
|
|
13
|
+
* the two-element shape — the component handles both halves.
|
|
14
|
+
*
|
|
15
|
+
* `kjValue: number | null` is the single mode switch — pass a number for
|
|
16
|
+
* determinate mode (the fill scales to the fraction with a CSS transition),
|
|
17
|
+
* or `null` for indeterminate mode (the fill animates as a CSS-only stripe).
|
|
18
|
+
* The directive omits `aria-valuenow` in indeterminate mode per APG. The
|
|
19
|
+
* indeterminate stripe collapses to a static state under
|
|
20
|
+
* `prefers-reduced-motion: reduce`.
|
|
21
|
+
*
|
|
22
|
+
* Variants and sizes are configurable at the directive level via
|
|
23
|
+
* `provideKjProgressBar(…)`. Defaults: `kjVariant="primary"`, `kjSize="md"`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```html
|
|
27
|
+
* <kj-progress-bar [kjValue]="progress()" kjAriaLabel="Upload progress" />
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @doc-example Default
|
|
31
|
+
* A determinate bar at 50% with an accessible label — the bare-minimum recipe.
|
|
32
|
+
* @doc-file progress-bar.example.ts
|
|
33
|
+
* @doc-example Usage
|
|
34
|
+
* A walkthrough of the most common usages — determinate upload,
|
|
35
|
+
* indeterminate spinner replacement, and success completion. Use this as
|
|
36
|
+
* the copy-paste starting point.
|
|
37
|
+
* @doc-file progress-bar.usage.example.ts
|
|
38
|
+
* @doc-example Indeterminate
|
|
39
|
+
* `[kjValue]="null"` runs the CSS-only stripe animation.
|
|
40
|
+
* @doc-file progress-bar.indeterminate.example.ts
|
|
41
|
+
* @doc-example Variants
|
|
42
|
+
* `primary` / `success` / `warning` / `error` — pick the semantic color.
|
|
43
|
+
* @doc-file progress-bar.variants.example.ts
|
|
44
|
+
* @doc-example Sizes
|
|
45
|
+
* `xs` / `sm` / `md` / `lg` — drives the bar thickness via CSS tokens.
|
|
46
|
+
* @doc-file progress-bar.sizes.example.ts
|
|
47
|
+
* @doc-example With value text
|
|
48
|
+
* Pair `kjAriaValuetext` with a visible label for richer SR phrasing.
|
|
49
|
+
* @doc-file progress-bar.with-label.example.ts
|
|
50
|
+
*
|
|
51
|
+
* @doc-aria
|
|
52
|
+
* role="progressbar" — On the bar host (provided by the directive)
|
|
53
|
+
* aria-valuenow — Reflects the clamped numeric value; omitted in indeterminate mode
|
|
54
|
+
* aria-valuemin — Reflects `kjMin`
|
|
55
|
+
* aria-valuemax — Reflects `kjMax`
|
|
56
|
+
* aria-valuetext — Reflects `kjAriaValuetext` when set
|
|
57
|
+
* aria-label — Wired from `kjAriaLabel` (or use `kjAriaLabelledby`)
|
|
58
|
+
* data-variant — Mirrors the variant for theme hooks
|
|
59
|
+
* data-size — Mirrors the size for theme hooks
|
|
60
|
+
* data-indeterminate — Set when `kjValue` is null
|
|
61
|
+
*
|
|
62
|
+
* @doc-touch
|
|
63
|
+
* The bar is non-interactive — no touch target rules apply. Pair with a
|
|
64
|
+
* labelled cancel button (44×44) when the operation is cancellable.
|
|
65
|
+
*
|
|
66
|
+
* @doc-a11y
|
|
67
|
+
* Always set `kjAriaLabel` or `kjAriaLabelledby` — a bare percentage
|
|
68
|
+
* ("50 percent") with no context is useless to AT users. In indeterminate
|
|
69
|
+
* mode the directive omits `aria-valuenow` per APG. The stripe animation
|
|
70
|
+
* collapses under `prefers-reduced-motion: reduce`.
|
|
71
|
+
*
|
|
72
|
+
* @doc-related skeleton,spinner,toast
|
|
73
|
+
*
|
|
74
|
+
* @doc-css-var
|
|
75
|
+
* --kj-progress-bar-track — Track (unfilled portion) background. Inherits --kj-bg-field.
|
|
76
|
+
* --kj-progress-bar-fill — Fill color. Variants flip this per data-variant.
|
|
77
|
+
* --kj-progress-bar-radius — Track and fill corner radius.
|
|
78
|
+
* --kj-progress-bar-height — Bar thickness. Sizes (xs/sm/md/lg) override.
|
|
79
|
+
* --kj-progress-bar-transition — Transition timing for determinate fill changes.
|
|
80
|
+
* --kj-progress-bar-indeterminate-duration — One-cycle duration of the indeterminate stripe.
|
|
81
|
+
*
|
|
82
|
+
* @doc-category Library/Feedback
|
|
83
|
+
* @doc
|
|
84
|
+
* @doc-name progress-bar
|
|
85
|
+
* @doc-description Themed determinate or indeterminate progress bar with variant and size tokens.
|
|
86
|
+
* @doc-is-main
|
|
87
|
+
*/
|
|
88
|
+
@Component({
|
|
89
|
+
selector: 'kj-progress-bar',
|
|
90
|
+
standalone: true,
|
|
91
|
+
imports: [KjProgressBar, KjProgressBarFill],
|
|
92
|
+
template: `
|
|
93
|
+
<div
|
|
94
|
+
kjProgressBar
|
|
95
|
+
class="kj-progress-bar"
|
|
96
|
+
[kjValue]="kjValue()"
|
|
97
|
+
[kjMin]="kjMin()"
|
|
98
|
+
[kjMax]="kjMax()"
|
|
99
|
+
[kjAriaValuetext]="kjAriaValuetext()"
|
|
100
|
+
[kjVariant]="kjVariant()"
|
|
101
|
+
[kjSize]="kjSize()"
|
|
102
|
+
[attr.aria-label]="kjAriaLabel() ?? null"
|
|
103
|
+
[attr.aria-labelledby]="kjAriaLabelledby() ?? null"
|
|
104
|
+
>
|
|
105
|
+
<div kjProgressBarFill class="kj-progress-bar__fill"></div>
|
|
106
|
+
</div>
|
|
107
|
+
`,
|
|
108
|
+
styleUrl: './progress-bar.css',
|
|
109
|
+
encapsulation: ViewEncapsulation.None,
|
|
110
|
+
host: { 'style': 'display: contents;' },
|
|
111
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
112
|
+
})
|
|
113
|
+
export class KjProgressBarComponent {
|
|
114
|
+
/**
|
|
115
|
+
* Current progress value. `null` = indeterminate (the directive omits
|
|
116
|
+
* `aria-valuenow` and runs the indeterminate stripe). Out-of-range values
|
|
117
|
+
* clamp to `[kjMin, kjMax]` with a dev-mode warning.
|
|
118
|
+
* @default null
|
|
119
|
+
*/
|
|
120
|
+
readonly kjValue = input<number>(0);
|
|
121
|
+
|
|
122
|
+
/** Lower bound, bound to `aria-valuemin`. @default 0 */
|
|
123
|
+
readonly kjMin = input<number>(0);
|
|
124
|
+
|
|
125
|
+
/** Upper bound, bound to `aria-valuemax`. Must be `> kjMin`. @default 100 */
|
|
126
|
+
readonly kjMax = input<number>(100);
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Human-readable phrasing reflected to `aria-valuetext`. Use when the raw
|
|
130
|
+
* percentage is less meaningful — `"Step 3 of 5"`, `"1.2 MB of 2.5 MB"`.
|
|
131
|
+
*/
|
|
132
|
+
readonly kjAriaValuetext = input<string>('');
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Variant — one of the configured presets (`primary` | `success` |
|
|
136
|
+
* `warning` | `error` by default). @default 'primary'
|
|
137
|
+
*/
|
|
138
|
+
readonly kjVariant = input<string>('primary');
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Size — one of the configured presets (`xs` | `sm` | `md` | `lg` by
|
|
142
|
+
* default). Drives the bar height. @default 'md'
|
|
143
|
+
*/
|
|
144
|
+
readonly kjSize = input<string>('md');
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Accessible label for the bar. At least one of `kjAriaLabel` or
|
|
148
|
+
* `kjAriaLabelledby` must be set — a progress bar without a name announces
|
|
149
|
+
* as just *"50 percent"*, which is useless to screen-reader users.
|
|
150
|
+
*/
|
|
151
|
+
readonly kjAriaLabel = input<string>('');
|
|
152
|
+
|
|
153
|
+
/** ID reference for the bar's accessible name. See `kjAriaLabel`. */
|
|
154
|
+
readonly kjAriaLabelledby = input<string>('');
|
|
155
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { KjProgressBarComponent } from './progress-bar';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A walkthrough of the most common progress-bar usages — a determinate
|
|
6
|
+
* upload bar with `aria-valuetext`, an indeterminate spinner replacement,
|
|
7
|
+
* and a success-variant complete state. Use this as the copy-paste starting
|
|
8
|
+
* point for feedback rows.
|
|
9
|
+
*/
|
|
10
|
+
@Component({
|
|
11
|
+
selector: 'kj-progress-bar-usage-example',
|
|
12
|
+
standalone: true,
|
|
13
|
+
imports: [KjProgressBarComponent],
|
|
14
|
+
styles: [
|
|
15
|
+
`
|
|
16
|
+
:host {
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
gap: var(--kj-space-lg);
|
|
20
|
+
}
|
|
21
|
+
.label {
|
|
22
|
+
font-size: 0.75rem;
|
|
23
|
+
color: var(--kj-fg-default);
|
|
24
|
+
opacity: 0.7;
|
|
25
|
+
text-transform: uppercase;
|
|
26
|
+
letter-spacing: 0.04em;
|
|
27
|
+
}
|
|
28
|
+
`,
|
|
29
|
+
],
|
|
30
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
31
|
+
template: `
|
|
32
|
+
<div>
|
|
33
|
+
<span class="label">Uploading (determinate)</span>
|
|
34
|
+
<kj-progress-bar
|
|
35
|
+
[kjValue]="progress()"
|
|
36
|
+
kjAriaLabel="Upload progress"
|
|
37
|
+
[kjAriaValuetext]="progress() + ' percent uploaded'"
|
|
38
|
+
/>
|
|
39
|
+
</div>
|
|
40
|
+
<div>
|
|
41
|
+
<span class="label">Working (indeterminate)</span>
|
|
42
|
+
<kj-progress-bar [kjValue]="null!" kjAriaLabel="Working" />
|
|
43
|
+
</div>
|
|
44
|
+
<div>
|
|
45
|
+
<span class="label">Complete (success)</span>
|
|
46
|
+
<kj-progress-bar [kjValue]="100" kjVariant="success" kjSize="lg" kjAriaLabel="Done" />
|
|
47
|
+
</div>
|
|
48
|
+
`,
|
|
49
|
+
})
|
|
50
|
+
export class KjProgressBarUsageExample {
|
|
51
|
+
readonly progress = signal<number>(62);
|
|
52
|
+
}
|