@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,348 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChangeDetectionStrategy,
|
|
3
|
+
Component,
|
|
4
|
+
ViewEncapsulation,
|
|
5
|
+
booleanAttribute,
|
|
6
|
+
computed,
|
|
7
|
+
inject,
|
|
8
|
+
input,
|
|
9
|
+
} from '@angular/core';
|
|
10
|
+
import {
|
|
11
|
+
KjTreeSelect,
|
|
12
|
+
KjTreeSelectContent,
|
|
13
|
+
KjTreeSelectNode,
|
|
14
|
+
KjTreeSelectToggle,
|
|
15
|
+
KjTreeSelectTrigger,
|
|
16
|
+
type KjTreeNode,
|
|
17
|
+
} from '@kouji-ui/core';
|
|
18
|
+
|
|
19
|
+
// ── Flat-tree projection ──────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Internal flat row produced by walking the tree. The wrapper renders a flat
|
|
23
|
+
* list rather than nested DOM to avoid recursive component issues; indentation
|
|
24
|
+
* is applied via `padding-inline-start`.
|
|
25
|
+
*/
|
|
26
|
+
interface FlatNode {
|
|
27
|
+
node: KjTreeNode;
|
|
28
|
+
level: number;
|
|
29
|
+
size: number;
|
|
30
|
+
pos: number;
|
|
31
|
+
hasChildren: boolean;
|
|
32
|
+
/** Path of ancestor values — used to determine visibility when ancestors collapse. */
|
|
33
|
+
ancestorValues: readonly unknown[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Walk the tree into a flat array. All nodes are included; visibility is
|
|
37
|
+
* determined at render time by checking ancestor expansion state. */
|
|
38
|
+
function flattenTree(
|
|
39
|
+
nodes: readonly KjTreeNode[],
|
|
40
|
+
level = 1,
|
|
41
|
+
ancestors: readonly unknown[] = [],
|
|
42
|
+
): FlatNode[] {
|
|
43
|
+
const result: FlatNode[] = [];
|
|
44
|
+
const size = nodes.length;
|
|
45
|
+
nodes.forEach((node, i) => {
|
|
46
|
+
const hasChildren = !!(node.children && node.children.length > 0);
|
|
47
|
+
result.push({
|
|
48
|
+
node,
|
|
49
|
+
level,
|
|
50
|
+
size,
|
|
51
|
+
pos: i + 1,
|
|
52
|
+
hasChildren,
|
|
53
|
+
ancestorValues: ancestors,
|
|
54
|
+
});
|
|
55
|
+
if (hasChildren && node.children) {
|
|
56
|
+
result.push(
|
|
57
|
+
...flattenTree(node.children as readonly KjTreeNode[], level + 1, [...ancestors, node.value]),
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Single styled tree node row for `<kj-tree-select>`. Renders an optional
|
|
66
|
+
* expand/collapse toggle, a checkbox in multi mode, indentation based on
|
|
67
|
+
* nesting level, and the node label.
|
|
68
|
+
*
|
|
69
|
+
* @doc-category Library/Data input
|
|
70
|
+
* @doc
|
|
71
|
+
* @doc-name tree-select
|
|
72
|
+
*/
|
|
73
|
+
@Component({
|
|
74
|
+
selector: 'kj-tree-select-node',
|
|
75
|
+
standalone: true,
|
|
76
|
+
imports: [KjTreeSelectNode, KjTreeSelectToggle],
|
|
77
|
+
template: `
|
|
78
|
+
<div
|
|
79
|
+
kjTreeSelectNode
|
|
80
|
+
[kjValue]="value()"
|
|
81
|
+
[kjLabel]="label()"
|
|
82
|
+
[kjNodeLevel]="level()"
|
|
83
|
+
[kjNodeSize]="size()"
|
|
84
|
+
[kjNodePos]="pos()"
|
|
85
|
+
[kjDisabled]="disabled()"
|
|
86
|
+
[kjHasChildren]="hasChildren()"
|
|
87
|
+
class="kj-tree-select-node"
|
|
88
|
+
[style.padding-inline-start.rem]="(level() - 1) * 1.25 + 0.75"
|
|
89
|
+
>
|
|
90
|
+
@if (hasChildren()) {
|
|
91
|
+
<button
|
|
92
|
+
type="button"
|
|
93
|
+
kjTreeSelectToggle
|
|
94
|
+
class="kj-tree-select-toggle"
|
|
95
|
+
aria-hidden="true"
|
|
96
|
+
tabindex="-1"
|
|
97
|
+
>
|
|
98
|
+
<span class="kj-tree-select-toggle-icon"></span>
|
|
99
|
+
</button>
|
|
100
|
+
} @else {
|
|
101
|
+
<span class="kj-tree-select-indent" aria-hidden="true"></span>
|
|
102
|
+
}
|
|
103
|
+
@if (multiMode()) {
|
|
104
|
+
<span class="kj-tree-select-checkbox" aria-hidden="true"></span>
|
|
105
|
+
}
|
|
106
|
+
<span class="kj-tree-select-label"><ng-content /></span>
|
|
107
|
+
</div>
|
|
108
|
+
`,
|
|
109
|
+
encapsulation: ViewEncapsulation.None,
|
|
110
|
+
host: { style: 'display: contents;' },
|
|
111
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
112
|
+
})
|
|
113
|
+
export class KjTreeSelectNodeComponent {
|
|
114
|
+
/** The value this node represents. */
|
|
115
|
+
readonly value = input.required<unknown>();
|
|
116
|
+
/** Display label for type-ahead. */
|
|
117
|
+
readonly label = input<string>('');
|
|
118
|
+
/** Nesting depth (1-based). */
|
|
119
|
+
readonly level = input<number>(1);
|
|
120
|
+
/** Number of siblings at this level. */
|
|
121
|
+
readonly size = input<number>(1);
|
|
122
|
+
/** 1-based position among siblings. */
|
|
123
|
+
readonly pos = input<number>(1);
|
|
124
|
+
/** Whether the node is disabled. */
|
|
125
|
+
readonly disabled = input(false, { transform: booleanAttribute });
|
|
126
|
+
/** Whether the node has children (branch). */
|
|
127
|
+
readonly hasChildren = input(false, { transform: booleanAttribute });
|
|
128
|
+
/** Whether the tree is in multi-select mode (renders a checkbox). */
|
|
129
|
+
readonly multiMode = input(false, { transform: booleanAttribute });
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Styled wrapper around the headless `KjTreeSelect` directive family.
|
|
134
|
+
*
|
|
135
|
+
* Renders the trigger button showing the selected value label (single mode)
|
|
136
|
+
* or a count of selected items (multiple mode), and a dropdown tree panel
|
|
137
|
+
* containing all nodes. Tree data is passed via `[kjNodes]`.
|
|
138
|
+
*
|
|
139
|
+
* The component projects the recursive tree into a flat rendered list, using
|
|
140
|
+
* CSS indentation (`padding-inline-start`) for visual hierarchy — avoiding
|
|
141
|
+
* recursive component issues while remaining fully accessible via ARIA
|
|
142
|
+
* `aria-level`, `aria-setsize`, and `aria-posinset` attributes.
|
|
143
|
+
*
|
|
144
|
+
* Collapsed branches' children are hidden via `display:none`; all nodes
|
|
145
|
+
* remain in the DOM to preserve ARIA tree structure.
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```html
|
|
149
|
+
* <kj-tree-select [kjNodes]="categories" [(kjValue)]="selected" />
|
|
150
|
+
* ```
|
|
151
|
+
*
|
|
152
|
+
* @doc-example Default
|
|
153
|
+
* The default playground — single-select tree with collapsed branches.
|
|
154
|
+
* @doc-file tree-select.example.ts
|
|
155
|
+
* @doc-example Usage
|
|
156
|
+
* A walkthrough of the most common tree-select usages — single-select with a
|
|
157
|
+
* readout, multi-select with a count, and pre-expanded branches on mount.
|
|
158
|
+
* @doc-file tree-select.usage.example.ts
|
|
159
|
+
* @doc-example Multi-select
|
|
160
|
+
* `kjSelectionMode="multiple"` renders a checkbox per row and emits an array.
|
|
161
|
+
* @doc-file tree-select.multi.example.ts
|
|
162
|
+
* @doc-example Pre-expanded
|
|
163
|
+
* `[(kjExpandedKeys)]` seeds the open branches on mount.
|
|
164
|
+
* @doc-file tree-select.expanded.example.ts
|
|
165
|
+
* @doc-example In a field
|
|
166
|
+
* Compose under `<kj-field>` for label / error / hint association.
|
|
167
|
+
* @doc-file tree-select.field.example.ts
|
|
168
|
+
* @doc-example Disabled
|
|
169
|
+
* `[disabled]="true"` removes the trigger from the tab order.
|
|
170
|
+
* @doc-file tree-select.disabled.example.ts
|
|
171
|
+
*
|
|
172
|
+
* @doc-keyboard
|
|
173
|
+
* Enter|Space — Opens the panel from the trigger; selects the focused node when open
|
|
174
|
+
* ArrowDown — Moves focus to the next visible node
|
|
175
|
+
* ArrowUp — Moves focus to the previous visible node
|
|
176
|
+
* ArrowRight — Expands the focused branch (or moves into its children)
|
|
177
|
+
* ArrowLeft — Collapses the focused branch (or moves to its parent)
|
|
178
|
+
* Home|End — Jumps to the first/last visible node
|
|
179
|
+
* Escape — Closes the panel and returns focus to the trigger
|
|
180
|
+
* Type-ahead — Letters/digits jump to the next matching visible label
|
|
181
|
+
*
|
|
182
|
+
* @doc-aria
|
|
183
|
+
* role="combobox" — applied to the trigger button
|
|
184
|
+
* role="tree" — applied to the panel content
|
|
185
|
+
* role="treeitem" — applied to each rendered node
|
|
186
|
+
* aria-level / setsize / posinset — wired per node for AT tree semantics
|
|
187
|
+
* aria-expanded — set on branch nodes; mirrors expansion state
|
|
188
|
+
* aria-selected — set on selected nodes
|
|
189
|
+
* aria-multiselectable — set on the tree when in multi mode
|
|
190
|
+
* data-multi — Mirrors multi-mode on the host for CSS hooks
|
|
191
|
+
*
|
|
192
|
+
* @doc-touch
|
|
193
|
+
* Trigger and rows default to a 40px hit area at `md` density. For touch-first
|
|
194
|
+
* surfaces, bump the parent's density token to reach the WCAG 2.5.5 floor.
|
|
195
|
+
*
|
|
196
|
+
* @doc-a11y
|
|
197
|
+
* Implements the WAI-ARIA Tree APG pattern. All nodes stay in the DOM with
|
|
198
|
+
* `[hidden]` toggling visibility so the ARIA tree structure (`aria-setsize`,
|
|
199
|
+
* `aria-level`, `aria-posinset`) is stable across collapse/expand. Focus is
|
|
200
|
+
* restored to the trigger when the panel closes.
|
|
201
|
+
*
|
|
202
|
+
* @doc-related select,cascade-select,combobox
|
|
203
|
+
*
|
|
204
|
+
* @doc-category Library/Data input
|
|
205
|
+
* @doc
|
|
206
|
+
* @doc-name tree-select
|
|
207
|
+
* @doc-description Themed dropdown that surfaces a hierarchical tree of options with single or multi-select and arrow-key navigation.
|
|
208
|
+
* @doc-is-main
|
|
209
|
+
*/
|
|
210
|
+
@Component({
|
|
211
|
+
selector: 'kj-tree-select',
|
|
212
|
+
standalone: true,
|
|
213
|
+
hostDirectives: [
|
|
214
|
+
{
|
|
215
|
+
directive: KjTreeSelect,
|
|
216
|
+
inputs: [
|
|
217
|
+
'kjNodes',
|
|
218
|
+
'kjSelectionMode',
|
|
219
|
+
'kjValue',
|
|
220
|
+
'kjExpandedKeys',
|
|
221
|
+
],
|
|
222
|
+
outputs: [
|
|
223
|
+
'kjValueChange',
|
|
224
|
+
'kjExpandedKeysChange',
|
|
225
|
+
'kjNodeSelect',
|
|
226
|
+
'kjNodeExpand',
|
|
227
|
+
'kjNodeCollapse',
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
imports: [KjTreeSelectTrigger, KjTreeSelectContent, KjTreeSelectNodeComponent],
|
|
232
|
+
template: `
|
|
233
|
+
<button
|
|
234
|
+
type="button"
|
|
235
|
+
kjTreeSelectTrigger
|
|
236
|
+
#trig="kjTreeSelectTrigger"
|
|
237
|
+
class="kj-tree-select-trigger"
|
|
238
|
+
[attr.aria-label]="ariaLabel() || null"
|
|
239
|
+
[disabled]="disabled() || null"
|
|
240
|
+
>
|
|
241
|
+
<span class="kj-tree-select-trigger-label">{{ displayLabel() }}</span>
|
|
242
|
+
<span class="kj-tree-select-caret" aria-hidden="true">▾</span>
|
|
243
|
+
</button>
|
|
244
|
+
<kj-tree-select-content [kjFor]="trig" class="kj-tree-select-panel">
|
|
245
|
+
@for (row of flatNodes(); track row.node.value) {
|
|
246
|
+
<kj-tree-select-node
|
|
247
|
+
[value]="row.node.value"
|
|
248
|
+
[label]="row.node.label"
|
|
249
|
+
[level]="row.level"
|
|
250
|
+
[size]="row.size"
|
|
251
|
+
[pos]="row.pos"
|
|
252
|
+
[disabled]="!!row.node.disabled"
|
|
253
|
+
[hasChildren]="row.hasChildren"
|
|
254
|
+
[multiMode]="ts.selectionMode() === 'multiple'"
|
|
255
|
+
[hidden]="isRowHidden(row)"
|
|
256
|
+
>{{ row.node.label }}</kj-tree-select-node>
|
|
257
|
+
}
|
|
258
|
+
@if (flatNodes().length === 0) {
|
|
259
|
+
<div class="kj-tree-select-empty">No options</div>
|
|
260
|
+
}
|
|
261
|
+
</kj-tree-select-content>
|
|
262
|
+
`,
|
|
263
|
+
styleUrl: './tree-select.css',
|
|
264
|
+
encapsulation: ViewEncapsulation.None,
|
|
265
|
+
host: {
|
|
266
|
+
class: 'kj-tree-select',
|
|
267
|
+
'[attr.data-disabled]': "disabled() ? '' : null",
|
|
268
|
+
'[attr.data-multi]': "ts.selectionMode() === 'multiple' ? '' : null",
|
|
269
|
+
},
|
|
270
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
271
|
+
})
|
|
272
|
+
export class KjTreeSelectComponent {
|
|
273
|
+
/** Placeholder text shown when nothing is selected. */
|
|
274
|
+
readonly placeholder = input<string>('Select…');
|
|
275
|
+
|
|
276
|
+
/** Whether the trigger is disabled. */
|
|
277
|
+
readonly disabled = input(false, { transform: booleanAttribute });
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Optional resolver for value → display label in the trigger. When omitted
|
|
281
|
+
* the component searches the `kjNodes` tree by value. Falls back to
|
|
282
|
+
* `String(value)` for primitives.
|
|
283
|
+
*/
|
|
284
|
+
readonly getLabel = input<(value: unknown) => string | undefined>(
|
|
285
|
+
() => undefined,
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
/** Optional ARIA label for the trigger when no visible label exists. */
|
|
289
|
+
readonly ariaLabel = input<string | undefined>(undefined);
|
|
290
|
+
|
|
291
|
+
/** @internal — reference to the headless root directive. */
|
|
292
|
+
readonly ts = inject(KjTreeSelect);
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* @internal — flat projected list of all tree nodes for rendering.
|
|
296
|
+
* Children of collapsed branches are still in the list but have `[hidden]`
|
|
297
|
+
* applied to keep them out of the visual and tab order.
|
|
298
|
+
*/
|
|
299
|
+
readonly flatNodes = computed<FlatNode[]>(() =>
|
|
300
|
+
flattenTree(this.ts.nodes() as readonly KjTreeNode[]),
|
|
301
|
+
);
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* @internal — whether a row's ancestors include any collapsed branch, making
|
|
305
|
+
* this row invisible. Reads `expandedValues` signal so Angular tracks it.
|
|
306
|
+
*/
|
|
307
|
+
isRowHidden(row: FlatNode): boolean {
|
|
308
|
+
if (row.ancestorValues.length === 0) return false;
|
|
309
|
+
const expanded = this.ts.expandedValues();
|
|
310
|
+
// If any ancestor value is NOT expanded, the row is hidden
|
|
311
|
+
for (const ancestorValue of row.ancestorValues) {
|
|
312
|
+
if (!expanded.has(ancestorValue)) return true;
|
|
313
|
+
}
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** @internal — display label shown in the trigger button. */
|
|
318
|
+
readonly displayLabel = computed(() => {
|
|
319
|
+
const mode = this.ts.selectionMode();
|
|
320
|
+
const raw = this.ts.value();
|
|
321
|
+
const selected: readonly unknown[] = Array.isArray(raw)
|
|
322
|
+
? raw
|
|
323
|
+
: raw === null || raw === undefined
|
|
324
|
+
? []
|
|
325
|
+
: [raw];
|
|
326
|
+
if (selected.length === 0) return this.placeholder();
|
|
327
|
+
if (mode === 'multiple') {
|
|
328
|
+
return `${selected.length} selected`;
|
|
329
|
+
}
|
|
330
|
+
// Single mode: look up label from the flat node list
|
|
331
|
+
const val = selected[0];
|
|
332
|
+
const customLabel = this.getLabel()(val);
|
|
333
|
+
if (customLabel !== undefined) return customLabel;
|
|
334
|
+
const found = this._findLabel(val, this.ts.nodes() as readonly KjTreeNode[]);
|
|
335
|
+
return found ?? String(val);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
private _findLabel(value: unknown, nodes: readonly KjTreeNode[]): string | undefined {
|
|
339
|
+
for (const node of nodes) {
|
|
340
|
+
if (node.value === value) return node.label;
|
|
341
|
+
if (node.children) {
|
|
342
|
+
const found = this._findLabel(value, node.children);
|
|
343
|
+
if (found !== undefined) return found;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/migrate-examples.mjs
|
|
2
|
+
// One barrel per component folder — used by the docs app as a lazy chunk.
|
|
3
|
+
export { KjTypographyBlockquoteExample } from './typography.blockquote.example';
|
|
4
|
+
export { KjTypographyCodeExample } from './typography.code.example';
|
|
5
|
+
export { KjTypographyExample } from './typography.example';
|
|
6
|
+
export { KjTypographyLeadExample } from './typography.lead.example';
|
|
7
|
+
export { KjTypographyMutedExample } from './typography.muted.example';
|
|
8
|
+
export { KjTypographyTruncateExample } from './typography.truncate.example';
|
|
9
|
+
export { KjTypographyUsageExample } from './typography.usage.example';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { KjBlockquote } from '@kouji-ui/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Blockquote example using the `kjBlockquote` directive.
|
|
6
|
+
*
|
|
7
|
+
* Reflects `data-tone="blockquote"` on a `<blockquote>` host. Useful when the
|
|
8
|
+
* blockquote sits outside a `kj-prose` container — for example a testimonial
|
|
9
|
+
* pulled into a marketing-page hero — and still needs the kouji left-rule,
|
|
10
|
+
* italic, and indent treatment.
|
|
11
|
+
*/
|
|
12
|
+
@Component({
|
|
13
|
+
selector: 'kj-typography-blockquote-example',
|
|
14
|
+
standalone: true,
|
|
15
|
+
imports: [KjBlockquote],
|
|
16
|
+
styles: [
|
|
17
|
+
`
|
|
18
|
+
:host {
|
|
19
|
+
display: block;
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
],
|
|
23
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
24
|
+
template: `
|
|
25
|
+
<figure>
|
|
26
|
+
<blockquote kjBlockquote>
|
|
27
|
+
Atlas turned our quarterly planning from a five-day rite of passage into a single afternoon.
|
|
28
|
+
The whole team finally agrees on what we are — and are not — shipping next quarter.
|
|
29
|
+
</blockquote>
|
|
30
|
+
<figcaption>— Priya Raman, Director of Engineering, Northwind</figcaption>
|
|
31
|
+
</figure>
|
|
32
|
+
`,
|
|
33
|
+
})
|
|
34
|
+
export class KjTypographyBlockquoteExample {}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { KjCode } from '@kouji-ui/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Inline code example using the `kjCode` directive.
|
|
6
|
+
*
|
|
7
|
+
* Reflects `data-tone="code"` on a `<code>` host so the kouji type system
|
|
8
|
+
* applies the inline code styling (mono font, subtle background, padding)
|
|
9
|
+
* outside a `kj-prose` container, where it would otherwise apply
|
|
10
|
+
* automatically.
|
|
11
|
+
*/
|
|
12
|
+
@Component({
|
|
13
|
+
selector: 'kj-typography-code-example',
|
|
14
|
+
standalone: true,
|
|
15
|
+
imports: [KjCode],
|
|
16
|
+
styles: [
|
|
17
|
+
`
|
|
18
|
+
:host {
|
|
19
|
+
display: block;
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
],
|
|
23
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
24
|
+
template: `
|
|
25
|
+
<p>
|
|
26
|
+
Run <code kjCode>npm install @kouji-ui/core</code> to install the headless directives,
|
|
27
|
+
then import the prose stylesheet from
|
|
28
|
+
<code kjCode>@kouji-ui/core/typography/prose.css</code>.
|
|
29
|
+
</p>
|
|
30
|
+
`,
|
|
31
|
+
})
|
|
32
|
+
export class KjTypographyCodeExample {}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Default usage example for the kouji typography surface.
|
|
5
|
+
*
|
|
6
|
+
* Shows the `kj-prose` CSS container in action: drop the class on a wrapping
|
|
7
|
+
* `<article>` and every descendant flow element (headings, paragraphs, lists,
|
|
8
|
+
* blockquote, inline code) is restyled by the kouji type system.
|
|
9
|
+
*/
|
|
10
|
+
@Component({
|
|
11
|
+
selector: 'kj-typography-example',
|
|
12
|
+
standalone: true,
|
|
13
|
+
styles: [
|
|
14
|
+
`
|
|
15
|
+
:host {
|
|
16
|
+
display: block;
|
|
17
|
+
}
|
|
18
|
+
`,
|
|
19
|
+
],
|
|
20
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
21
|
+
template: `
|
|
22
|
+
<article class="kj-prose">
|
|
23
|
+
<h1>Roadmap planning, in plain prose</h1>
|
|
24
|
+
<h2>Why a prose container</h2>
|
|
25
|
+
<p>
|
|
26
|
+
The <code>kj-prose</code> class restyles every descendant flow element according to the
|
|
27
|
+
kouji type system, so authored content reads cleanly without per-element wiring.
|
|
28
|
+
</p>
|
|
29
|
+
<h3>What it covers</h3>
|
|
30
|
+
<ul>
|
|
31
|
+
<li>Headings <code>h1</code> through <code>h6</code></li>
|
|
32
|
+
<li>Paragraphs, lists, definition lists</li>
|
|
33
|
+
<li>Blockquotes, inline code, anchors</li>
|
|
34
|
+
</ul>
|
|
35
|
+
<blockquote>
|
|
36
|
+
Good prose styling stays out of the way until you need it — and then it does the right thing
|
|
37
|
+
without per-paragraph configuration.
|
|
38
|
+
</blockquote>
|
|
39
|
+
</article>
|
|
40
|
+
`,
|
|
41
|
+
})
|
|
42
|
+
export class KjTypographyExample {}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { KjLead } from '@kouji-ui/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Lead paragraph example using the `kjLead` directive.
|
|
6
|
+
*
|
|
7
|
+
* Marks the opening paragraph of a section with a slightly larger size and a
|
|
8
|
+
* softer tone via `data-tone="lead"`. The directive keeps lead semantics
|
|
9
|
+
* paragraph-bound and warns in dev mode when applied to a non-`<p>` host.
|
|
10
|
+
*/
|
|
11
|
+
@Component({
|
|
12
|
+
selector: 'kj-typography-lead-example',
|
|
13
|
+
standalone: true,
|
|
14
|
+
imports: [KjLead],
|
|
15
|
+
styles: [
|
|
16
|
+
`
|
|
17
|
+
:host {
|
|
18
|
+
display: block;
|
|
19
|
+
}
|
|
20
|
+
`,
|
|
21
|
+
],
|
|
22
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
23
|
+
template: `
|
|
24
|
+
<article>
|
|
25
|
+
<h1>Atlas — quarterly roadmap planning</h1>
|
|
26
|
+
<p kjLead>
|
|
27
|
+
Atlas helps engineering teams plan quarterly roadmaps with shared context, calibrated
|
|
28
|
+
estimates, and a clean handoff to delivery.
|
|
29
|
+
</p>
|
|
30
|
+
<p>
|
|
31
|
+
The lead paragraph anchors the section's tone; the body paragraphs below carry the
|
|
32
|
+
supporting detail at the regular reading size.
|
|
33
|
+
</p>
|
|
34
|
+
</article>
|
|
35
|
+
`,
|
|
36
|
+
})
|
|
37
|
+
export class KjTypographyLeadExample {}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { KjMuted } from '@kouji-ui/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Muted text example using the `kjMuted` directive.
|
|
6
|
+
*
|
|
7
|
+
* Reflects `data-tone="muted"` on the host so theme CSS keys off it; the
|
|
8
|
+
* directive owns no styling itself. Use for secondary metadata that should
|
|
9
|
+
* read at a lower visual weight while still meeting AAA contrast.
|
|
10
|
+
*/
|
|
11
|
+
@Component({
|
|
12
|
+
selector: 'kj-typography-muted-example',
|
|
13
|
+
standalone: true,
|
|
14
|
+
imports: [KjMuted],
|
|
15
|
+
styles: [
|
|
16
|
+
`
|
|
17
|
+
:host {
|
|
18
|
+
display: block;
|
|
19
|
+
}
|
|
20
|
+
`,
|
|
21
|
+
],
|
|
22
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
23
|
+
template: `
|
|
24
|
+
<p>Last updated <span kjMuted>3 minutes ago</span> by <span kjMuted>Jamie Cole</span>.</p>
|
|
25
|
+
`,
|
|
26
|
+
})
|
|
27
|
+
export class KjTypographyMutedExample {}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { KjTruncate } from '@kouji-ui/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Multi-line truncate example using the `kjTruncate` directive.
|
|
6
|
+
*
|
|
7
|
+
* Clamps the host's text content to a fixed number of lines via
|
|
8
|
+
* `data-truncate="N"`. After first render the directive injects a
|
|
9
|
+
* normalised `[title]` attribute (when the consumer has not supplied
|
|
10
|
+
* `title` or `aria-label`) so sighted-but-zoomed users can still read the
|
|
11
|
+
* full text on hover.
|
|
12
|
+
*/
|
|
13
|
+
@Component({
|
|
14
|
+
selector: 'kj-typography-truncate-example',
|
|
15
|
+
standalone: true,
|
|
16
|
+
imports: [KjTruncate],
|
|
17
|
+
styles: [
|
|
18
|
+
`
|
|
19
|
+
:host {
|
|
20
|
+
display: block;
|
|
21
|
+
}
|
|
22
|
+
.card {
|
|
23
|
+
max-width: 28rem;
|
|
24
|
+
padding: var(--kj-space-md);
|
|
25
|
+
border-radius: var(--kj-radius-md);
|
|
26
|
+
}
|
|
27
|
+
`,
|
|
28
|
+
],
|
|
29
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
30
|
+
template: `
|
|
31
|
+
<article class="card">
|
|
32
|
+
<h3>Atlas — quarterly planning</h3>
|
|
33
|
+
<p [kjTruncate]="2">
|
|
34
|
+
Atlas helps engineering teams plan quarterly roadmaps with shared context, calibrated
|
|
35
|
+
estimates, and a clean handoff to delivery — so every team starts the quarter aligned on
|
|
36
|
+
what is shipping, what is deferred, and why.
|
|
37
|
+
</p>
|
|
38
|
+
</article>
|
|
39
|
+
`,
|
|
40
|
+
})
|
|
41
|
+
export class KjTypographyTruncateExample {}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { KjLead, KjMuted, KjCode, KjBlockquote, KjTruncate } from '@kouji-ui/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A walkthrough of the most common typography usages — a `.kj-prose` container,
|
|
6
|
+
* a `kjLead` opening paragraph, inline `kjCode`, a `kjMuted` aside, a
|
|
7
|
+
* `kjBlockquote` pulled quote, and a `[kjTruncate]="2"` clamped block.
|
|
8
|
+
*/
|
|
9
|
+
@Component({
|
|
10
|
+
selector: 'kj-typography-usage-example',
|
|
11
|
+
standalone: true,
|
|
12
|
+
imports: [KjLead, KjMuted, KjCode, KjBlockquote, KjTruncate],
|
|
13
|
+
styles: [
|
|
14
|
+
`
|
|
15
|
+
:host {
|
|
16
|
+
display: block;
|
|
17
|
+
}
|
|
18
|
+
`,
|
|
19
|
+
],
|
|
20
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
21
|
+
template: `
|
|
22
|
+
<article class="kj-prose">
|
|
23
|
+
<h1>Roadmap planning, in plain prose</h1>
|
|
24
|
+
<p kjLead>
|
|
25
|
+
The kouji typography system styles authored content without per-element wiring — drop the
|
|
26
|
+
prose class and write.
|
|
27
|
+
</p>
|
|
28
|
+
<p>
|
|
29
|
+
Use <code kjCode>kjLead</code> for the opening paragraph, <code kjCode>kjMuted</code> for
|
|
30
|
+
secondary copy, and <code kjCode>kjTruncate</code> when a block must clamp.
|
|
31
|
+
</p>
|
|
32
|
+
<blockquote kjBlockquote>
|
|
33
|
+
Good prose styling stays out of the way until you need it.
|
|
34
|
+
</blockquote>
|
|
35
|
+
<p [kjTruncate]="2">
|
|
36
|
+
The full sentence is preserved in the accessibility tree even when the visual clamp hides
|
|
37
|
+
the overflow — screen readers still get the complete content, only the visible glyphs are
|
|
38
|
+
clipped at the line count you specify.
|
|
39
|
+
</p>
|
|
40
|
+
<p><span kjMuted>Last updated 3 minutes ago.</span></p>
|
|
41
|
+
</article>
|
|
42
|
+
`,
|
|
43
|
+
})
|
|
44
|
+
export class KjTypographyUsageExample {}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Typography surface — directives only, no wrapper components.
|
|
2
|
+
// Per the analysis, Typography ships no `<kj-h1>` / `<kj-prose>` Angular
|
|
3
|
+
// components: the CSS class `kj-prose` plus five attribute directives are
|
|
4
|
+
// the entire surface. The components package re-exports the directives
|
|
5
|
+
// from `@kouji-ui/core` for ergonomic consumption alongside the rest of
|
|
6
|
+
// the library, and ships the `kj-prose` stylesheet via the package's
|
|
7
|
+
// stylesheet pipeline.
|
|
8
|
+
export { KjLead, KjMuted, KjCode, KjBlockquote, KjTruncate } from '@kouji-ui/core';
|