@nectary/components 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/index.d.ts +11 -0
- package/accordion/index.js +86 -0
- package/accordion/types.d.ts +21 -0
- package/accordion/types.js +1 -0
- package/accordion-item/index.d.ts +14 -0
- package/accordion-item/index.js +95 -0
- package/accordion-item/types.d.ts +36 -0
- package/accordion-item/types.js +1 -0
- package/accordion-item/utils.d.ts +2 -0
- package/accordion-item/utils.js +1 -0
- package/action-menu/index.d.ts +11 -0
- package/action-menu/index.js +195 -0
- package/action-menu/types.d.ts +13 -0
- package/action-menu/types.js +1 -0
- package/action-menu-option/index.d.ts +12 -0
- package/action-menu-option/index.js +82 -0
- package/action-menu-option/types.d.ts +23 -0
- package/action-menu-option/types.js +1 -0
- package/action-menu-option/utils.d.ts +2 -0
- package/action-menu-option/utils.js +3 -0
- package/alert/index.d.ts +14 -0
- package/alert/index.js +48 -0
- package/alert/types.d.ts +18 -0
- package/alert/types.js +1 -0
- package/alert/utils.d.ts +2 -0
- package/alert/utils.js +1 -0
- package/avatar/index.d.ts +11 -0
- package/avatar/index.js +94 -0
- package/avatar/types.d.ts +37 -0
- package/avatar/types.js +1 -0
- package/avatar/utils.d.ts +4 -0
- package/avatar/utils.js +7 -0
- package/badge/index.d.ts +11 -0
- package/badge/index.js +114 -0
- package/badge/types.d.ts +34 -0
- package/badge/types.js +1 -0
- package/badge/utils.d.ts +2 -0
- package/badge/utils.js +1 -0
- package/button/index.d.ts +11 -0
- package/button/index.js +168 -0
- package/button/types.d.ts +45 -0
- package/button/types.js +1 -0
- package/button/utils.d.ts +2 -0
- package/button/utils.js +1 -0
- package/card/index.d.ts +13 -0
- package/card/index.js +133 -0
- package/card/types.d.ts +28 -0
- package/card/types.js +1 -0
- package/card-container/index.d.ts +11 -0
- package/card-container/index.js +11 -0
- package/card-container/types.d.ts +3 -0
- package/card-container/types.js +1 -0
- package/chat/index.d.ts +11 -0
- package/chat/index.js +11 -0
- package/chat/types.d.ts +3 -0
- package/chat/types.js +1 -0
- package/chat-block/index.d.ts +11 -0
- package/chat-block/index.js +86 -0
- package/chat-block/types.d.ts +30 -0
- package/chat-block/types.js +1 -0
- package/chat-bubble/index.d.ts +11 -0
- package/chat-bubble/index.js +41 -0
- package/chat-bubble/types.d.ts +20 -0
- package/chat-bubble/types.js +1 -0
- package/chat-bubble/utils.d.ts +3 -0
- package/chat-bubble/utils.js +2 -0
- package/checkbox/index.d.ts +11 -0
- package/checkbox/index.js +126 -0
- package/checkbox/types.d.ts +49 -0
- package/checkbox/types.js +1 -0
- package/chip/index.d.ts +13 -0
- package/chip/index.js +144 -0
- package/chip/types.d.ts +37 -0
- package/chip/types.js +1 -0
- package/chip/utils.d.ts +2 -0
- package/chip/utils.js +6 -0
- package/code-tag/index.d.ts +11 -0
- package/code-tag/index.js +31 -0
- package/code-tag/types.d.ts +11 -0
- package/code-tag/types.js +1 -0
- package/color-menu/index.d.ts +11 -0
- package/color-menu/index.js +308 -0
- package/color-menu/types.d.ts +32 -0
- package/color-menu/types.js +1 -0
- package/color-menu/utils.d.ts +1 -0
- package/color-menu/utils.js +11 -0
- package/color-menu-option/index.d.ts +13 -0
- package/color-menu-option/index.js +48 -0
- package/color-menu-option/types.d.ts +11 -0
- package/color-menu-option/types.js +1 -0
- package/color-menu-option/utils.d.ts +1 -0
- package/color-menu-option/utils.js +11 -0
- package/color-swatch/index.d.ts +12 -0
- package/color-swatch/index.js +54 -0
- package/color-swatch/types.d.ts +11 -0
- package/color-swatch/types.js +1 -0
- package/color-swatch/utils.d.ts +2 -0
- package/color-swatch/utils.js +6 -0
- package/colors.json +88 -0
- package/date-picker/index.d.ts +14 -0
- package/date-picker/index.js +381 -0
- package/date-picker/types.d.ts +70 -0
- package/date-picker/types.js +1 -0
- package/date-picker/utils.d.ts +28 -0
- package/date-picker/utils.js +142 -0
- package/dialog/index.d.ts +15 -0
- package/dialog/index.js +144 -0
- package/dialog/types.d.ts +28 -0
- package/dialog/types.js +1 -0
- package/dialog/utils.d.ts +2 -0
- package/dialog/utils.js +18 -0
- package/emoji/index.d.ts +11 -0
- package/emoji/index.js +46 -0
- package/emoji/types.d.ts +11 -0
- package/emoji/types.js +1 -0
- package/emoji/utils.d.ts +1 -0
- package/emoji/utils.js +42 -0
- package/emoji-picker/data.json +1 -0
- package/emoji-picker/index.d.ts +22 -0
- package/emoji-picker/index.js +304 -0
- package/emoji-picker/types.d.ts +26 -0
- package/emoji-picker/types.js +1 -0
- package/field/index.d.ts +11 -0
- package/field/index.js +112 -0
- package/field/types.d.ts +35 -0
- package/field/types.js +1 -0
- package/file-drop/index.d.ts +13 -0
- package/file-drop/index.js +205 -0
- package/file-drop/types.d.ts +50 -0
- package/file-drop/types.js +1 -0
- package/file-drop/utils.d.ts +2 -0
- package/file-drop/utils.js +31 -0
- package/file-picker/index.d.ts +11 -0
- package/file-picker/index.js +103 -0
- package/file-picker/types.d.ts +32 -0
- package/file-picker/types.js +1 -0
- package/file-picker/utils.d.ts +1 -0
- package/file-picker/utils.js +8 -0
- package/file-status/index.d.ts +14 -0
- package/file-status/index.js +61 -0
- package/file-status/types.d.ts +18 -0
- package/file-status/types.js +1 -0
- package/file-status/utils.d.ts +2 -0
- package/file-status/utils.js +1 -0
- package/flag/index.d.ts +11 -0
- package/flag/index.js +46 -0
- package/flag/types.d.ts +11 -0
- package/flag/types.js +1 -0
- package/flag/utils.d.ts +1 -0
- package/flag/utils.js +17 -0
- package/grid/index.d.ts +11 -0
- package/grid/index.js +11 -0
- package/grid/types.d.ts +3 -0
- package/grid/types.js +1 -0
- package/grid-item/index.d.ts +11 -0
- package/grid-item/index.js +35 -0
- package/grid-item/types.d.ts +17 -0
- package/grid-item/types.js +1 -0
- package/help-tooltip/index.d.ts +13 -0
- package/help-tooltip/index.js +74 -0
- package/help-tooltip/types.d.ts +3 -0
- package/help-tooltip/types.js +1 -0
- package/horizontal-stepper/index.d.ts +11 -0
- package/horizontal-stepper/index.js +61 -0
- package/horizontal-stepper/types.d.ts +13 -0
- package/horizontal-stepper/types.js +1 -0
- package/horizontal-stepper-item/index.d.ts +14 -0
- package/horizontal-stepper-item/index.js +61 -0
- package/horizontal-stepper-item/types.d.ts +24 -0
- package/horizontal-stepper-item/types.js +1 -0
- package/horizontal-stepper-item/utils.d.ts +2 -0
- package/horizontal-stepper-item/utils.js +1 -0
- package/icon/index.d.ts +11 -0
- package/icon/index.js +32 -0
- package/icon/types.d.ts +11 -0
- package/icon/types.js +1 -0
- package/icon-button/index.d.ts +12 -0
- package/icon-button/index.js +173 -0
- package/icon-button/types.d.ts +44 -0
- package/icon-button/types.js +1 -0
- package/icon-button/utils.d.ts +2 -0
- package/icon-button/utils.js +1 -0
- package/inline-alert/index.d.ts +15 -0
- package/inline-alert/index.js +83 -0
- package/inline-alert/types.d.ts +15 -0
- package/inline-alert/types.js +1 -0
- package/inline-alert/utils.d.ts +2 -0
- package/inline-alert/utils.js +1 -0
- package/input/index.d.ts +11 -0
- package/input/index.js +620 -0
- package/input/types.d.ts +80 -0
- package/input/types.js +1 -0
- package/input/utils.d.ts +26 -0
- package/input/utils.js +302 -0
- package/link/index.d.ts +12 -0
- package/link/index.js +132 -0
- package/link/types.d.ts +55 -0
- package/link/types.js +1 -0
- package/list/index.d.ts +11 -0
- package/list/index.js +14 -0
- package/list/types.d.ts +3 -0
- package/list/types.js +1 -0
- package/list-item/index.d.ts +11 -0
- package/list-item/index.js +14 -0
- package/list-item/types.d.ts +3 -0
- package/list-item/types.js +1 -0
- package/package.json +30 -0
- package/pagination/index.d.ts +12 -0
- package/pagination/index.js +147 -0
- package/pagination/types.d.ts +16 -0
- package/pagination/types.js +1 -0
- package/pop/index.d.ts +11 -0
- package/pop/index.js +425 -0
- package/pop/types.d.ts +35 -0
- package/pop/types.js +1 -0
- package/pop/utils.d.ts +4 -0
- package/pop/utils.js +16 -0
- package/popover/index.d.ts +12 -0
- package/popover/index.js +140 -0
- package/popover/types.d.ts +40 -0
- package/popover/types.js +1 -0
- package/popover/utils.d.ts +4 -0
- package/popover/utils.js +10 -0
- package/progress/index.d.ts +12 -0
- package/progress/index.js +58 -0
- package/progress/types.d.ts +12 -0
- package/progress/types.js +1 -0
- package/progress-stepper/index.d.ts +11 -0
- package/progress-stepper/index.js +206 -0
- package/progress-stepper/types.d.ts +22 -0
- package/progress-stepper/types.js +1 -0
- package/progress-stepper-item/index.d.ts +12 -0
- package/progress-stepper-item/index.js +82 -0
- package/progress-stepper-item/types.d.ts +23 -0
- package/progress-stepper-item/types.js +1 -0
- package/progress-stepper-item/utils.d.ts +11 -0
- package/progress-stepper-item/utils.js +13 -0
- package/radio/index.d.ts +11 -0
- package/radio/index.js +154 -0
- package/radio/types.d.ts +14 -0
- package/radio/types.js +1 -0
- package/radio-option/index.d.ts +11 -0
- package/radio-option/index.js +79 -0
- package/radio-option/types.d.ts +17 -0
- package/radio-option/types.js +1 -0
- package/readme.md +179 -0
- package/rich-text/index.d.ts +11 -0
- package/rich-text/index.js +48 -0
- package/rich-text/types.d.ts +12 -0
- package/rich-text/types.js +1 -0
- package/rich-text/utils.d.ts +2 -0
- package/rich-text/utils.js +1 -0
- package/segment/index.d.ts +12 -0
- package/segment/index.js +109 -0
- package/segment/types.d.ts +16 -0
- package/segment/types.js +1 -0
- package/segment/utils.d.ts +3 -0
- package/segment/utils.js +16 -0
- package/segment-collapse/index.d.ts +13 -0
- package/segment-collapse/index.js +60 -0
- package/segment-collapse/types.d.ts +11 -0
- package/segment-collapse/types.js +1 -0
- package/segmented-control/index.d.ts +11 -0
- package/segmented-control/index.js +85 -0
- package/segmented-control/types.d.ts +11 -0
- package/segmented-control/types.js +1 -0
- package/segmented-control-option/index.d.ts +11 -0
- package/segmented-control-option/index.js +95 -0
- package/segmented-control-option/types.d.ts +19 -0
- package/segmented-control-option/types.js +1 -0
- package/segmented-icon-control/index.d.ts +11 -0
- package/segmented-icon-control/index.js +101 -0
- package/segmented-icon-control/types.d.ts +14 -0
- package/segmented-icon-control/types.js +1 -0
- package/segmented-icon-control-option/index.d.ts +11 -0
- package/segmented-icon-control-option/index.js +82 -0
- package/segmented-icon-control-option/types.d.ts +16 -0
- package/segmented-icon-control-option/types.js +1 -0
- package/select-button/index.d.ts +13 -0
- package/select-button/index.js +200 -0
- package/select-button/types.d.ts +50 -0
- package/select-button/types.js +1 -0
- package/select-menu/index.d.ts +15 -0
- package/select-menu/index.js +307 -0
- package/select-menu/types.d.ts +29 -0
- package/select-menu/types.js +1 -0
- package/select-menu-option/index.d.ts +28 -0
- package/select-menu-option/index.js +65 -0
- package/select-menu-option/types.d.ts +26 -0
- package/select-menu-option/types.js +1 -0
- package/skeleton/index.d.ts +11 -0
- package/skeleton/index.js +108 -0
- package/skeleton/types.d.ts +9 -0
- package/skeleton/types.js +1 -0
- package/skeleton-item/index.d.ts +11 -0
- package/skeleton-item/index.js +11 -0
- package/skeleton-item/types.d.ts +13 -0
- package/skeleton-item/types.js +1 -0
- package/spinner/index.d.ts +11 -0
- package/spinner/index.js +58 -0
- package/spinner/types.d.ts +12 -0
- package/spinner/types.js +1 -0
- package/stop-events/index.d.ts +1 -0
- package/stop-events/index.js +27 -0
- package/table/index.d.ts +11 -0
- package/table/index.js +14 -0
- package/table/types.d.ts +3 -0
- package/table/types.js +1 -0
- package/table-body/index.d.ts +11 -0
- package/table-body/index.js +14 -0
- package/table-body/types.d.ts +3 -0
- package/table-body/types.js +1 -0
- package/table-cell/index.d.ts +11 -0
- package/table-cell/index.js +21 -0
- package/table-cell/types.d.ts +9 -0
- package/table-cell/types.js +1 -0
- package/table-cell/utils.d.ts +2 -0
- package/table-cell/utils.js +1 -0
- package/table-head/index.d.ts +11 -0
- package/table-head/index.js +14 -0
- package/table-head/types.d.ts +3 -0
- package/table-head/types.js +1 -0
- package/table-head-cell/index.d.ts +12 -0
- package/table-head-cell/index.js +57 -0
- package/table-head-cell/types.d.ts +15 -0
- package/table-head-cell/types.js +1 -0
- package/table-row/index.d.ts +11 -0
- package/table-row/index.js +42 -0
- package/table-row/types.d.ts +11 -0
- package/table-row/types.js +1 -0
- package/tabs/index.d.ts +11 -0
- package/tabs/index.js +80 -0
- package/tabs/types.d.ts +18 -0
- package/tabs/types.js +1 -0
- package/tabs-icon-option/index.d.ts +11 -0
- package/tabs-icon-option/index.js +79 -0
- package/tabs-icon-option/types.d.ts +19 -0
- package/tabs-icon-option/types.js +1 -0
- package/tabs-option/index.d.ts +12 -0
- package/tabs-option/index.js +86 -0
- package/tabs-option/types.d.ts +25 -0
- package/tabs-option/types.js +1 -0
- package/tag/index.d.ts +12 -0
- package/tag/index.js +84 -0
- package/tag/types.d.ts +23 -0
- package/tag/types.js +1 -0
- package/tag/utils.d.ts +2 -0
- package/tag/utils.js +6 -0
- package/text/index.d.ts +11 -0
- package/text/index.js +64 -0
- package/text/types.d.ts +30 -0
- package/text/types.js +1 -0
- package/text/utils.d.ts +2 -0
- package/text/utils.js +1 -0
- package/textarea/index.d.ts +11 -0
- package/textarea/index.js +228 -0
- package/textarea/types.d.ts +57 -0
- package/textarea/types.js +1 -0
- package/tile-control/index.d.ts +11 -0
- package/tile-control/index.js +110 -0
- package/tile-control/types.d.ts +35 -0
- package/tile-control/types.js +1 -0
- package/tile-control-option/index.d.ts +11 -0
- package/tile-control-option/index.js +98 -0
- package/tile-control-option/types.d.ts +37 -0
- package/tile-control-option/types.js +1 -0
- package/time-picker/index.d.ts +15 -0
- package/time-picker/index.js +337 -0
- package/time-picker/types.d.ts +34 -0
- package/time-picker/types.js +1 -0
- package/time-picker/utils.d.ts +11 -0
- package/time-picker/utils.js +75 -0
- package/title/index.d.ts +11 -0
- package/title/index.js +60 -0
- package/title/types.d.ts +31 -0
- package/title/types.js +1 -0
- package/title/utils.d.ts +3 -0
- package/title/utils.js +17 -0
- package/toast/index.d.ts +14 -0
- package/toast/index.js +87 -0
- package/toast/types.d.ts +28 -0
- package/toast/types.js +1 -0
- package/toast/utils.d.ts +2 -0
- package/toast/utils.js +1 -0
- package/toast-manager/index.d.ts +13 -0
- package/toast-manager/index.js +163 -0
- package/toast-manager/types.d.ts +7 -0
- package/toast-manager/types.js +1 -0
- package/toggle/index.d.ts +11 -0
- package/toggle/index.js +126 -0
- package/toggle/types.d.ts +23 -0
- package/toggle/types.js +1 -0
- package/tooltip/index.d.ts +13 -0
- package/tooltip/index.js +258 -0
- package/tooltip/tooltip-state.d.ts +19 -0
- package/tooltip/tooltip-state.js +126 -0
- package/tooltip/types.d.ts +35 -0
- package/tooltip/types.js +1 -0
- package/tooltip/utils.d.ts +5 -0
- package/tooltip/utils.js +17 -0
- package/types.d.ts +14 -0
- package/utils/context.d.ts +20 -0
- package/utils/context.js +84 -0
- package/utils/countries.d.ts +6 -0
- package/utils/countries.js +2 -0
- package/utils/countries.json +1217 -0
- package/utils/csv.d.ts +5 -0
- package/utils/csv.js +22 -0
- package/utils/debounce.d.ts +8 -0
- package/utils/debounce.js +22 -0
- package/utils/dom.d.ts +34 -0
- package/utils/dom.js +154 -0
- package/utils/element.d.ts +16 -0
- package/utils/element.js +48 -0
- package/utils/event-target.d.ts +4 -0
- package/utils/event-target.js +26 -0
- package/utils/get-react-event-handler.d.ts +1 -0
- package/utils/get-react-event-handler.js +8 -0
- package/utils/index.d.ts +12 -0
- package/utils/index.js +12 -0
- package/utils/markdown.d.ts +1 -0
- package/utils/markdown.js +128 -0
- package/utils/rect.d.ts +4 -0
- package/utils/rect.js +28 -0
- package/utils/size.d.ts +5 -0
- package/utils/size.js +3 -0
- package/utils/slot.d.ts +4 -0
- package/utils/slot.js +38 -0
- package/utils/throttle.d.ts +4 -0
- package/utils/throttle.js +20 -0
- package/utils/uid.d.ts +1 -0
- package/utils/uid.js +13 -0
- package/vertical-stepper/index.d.ts +11 -0
- package/vertical-stepper/index.js +57 -0
- package/vertical-stepper/types.d.ts +13 -0
- package/vertical-stepper/types.js +1 -0
- package/vertical-stepper-item/index.d.ts +14 -0
- package/vertical-stepper-item/index.js +61 -0
- package/vertical-stepper-item/types.d.ts +24 -0
- package/vertical-stepper-item/types.js +1 -0
- package/vertical-stepper-item/utils.d.ts +2 -0
- package/vertical-stepper-item/utils.js +1 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type TSinchProgressStepperItemStatus = 'inactive' | 'incomplete' | 'invalid' | 'complete';
|
|
2
|
+
export declare const ATTR_PROGRESS_STEPPER_ITEM_CHECKED = "data-checked";
|
|
3
|
+
export declare const ATTR_PROGRESS_STEPPER_ITEM_STATUS = "data-status";
|
|
4
|
+
export declare const ATTR_PROGRESS_STEPPER_ITEM_ACTIVE_DESCENDANT = "data-active-descendant";
|
|
5
|
+
export declare const isProgressStepperItemChecked: ($el: Element) => boolean;
|
|
6
|
+
export declare const setProgressStepperItemChecked: ($el: Element, isChecked: boolean) => void;
|
|
7
|
+
export declare const isProgressStepperItemActive: ($el: Element) => boolean;
|
|
8
|
+
export declare const setProgressStepperItemStatus: ($el: Element, status: TSinchProgressStepperItemStatus) => void;
|
|
9
|
+
export declare const isProgressStepperItemActiveDescendant: ($el: Element) => boolean;
|
|
10
|
+
export declare const setProgressStepperItemActiveDescendant: ($el: Element, isActiveDescendant: boolean) => void;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getAttribute, getBooleanAttribute, updateAttribute, updateBooleanAttribute } from '../utils';
|
|
2
|
+
export const ATTR_PROGRESS_STEPPER_ITEM_CHECKED = 'data-checked';
|
|
3
|
+
export const ATTR_PROGRESS_STEPPER_ITEM_STATUS = 'data-status';
|
|
4
|
+
export const ATTR_PROGRESS_STEPPER_ITEM_ACTIVE_DESCENDANT = 'data-active-descendant';
|
|
5
|
+
export const isProgressStepperItemChecked = $el => getBooleanAttribute($el, ATTR_PROGRESS_STEPPER_ITEM_CHECKED);
|
|
6
|
+
export const setProgressStepperItemChecked = ($el, isChecked) => updateBooleanAttribute($el, ATTR_PROGRESS_STEPPER_ITEM_CHECKED, isChecked);
|
|
7
|
+
export const isProgressStepperItemActive = $el => {
|
|
8
|
+
const attrValue = getAttribute($el, ATTR_PROGRESS_STEPPER_ITEM_STATUS);
|
|
9
|
+
return attrValue !== null && attrValue !== 'inactive';
|
|
10
|
+
};
|
|
11
|
+
export const setProgressStepperItemStatus = ($el, status) => updateAttribute($el, ATTR_PROGRESS_STEPPER_ITEM_STATUS, status);
|
|
12
|
+
export const isProgressStepperItemActiveDescendant = $el => getBooleanAttribute($el, ATTR_PROGRESS_STEPPER_ITEM_ACTIVE_DESCENDANT);
|
|
13
|
+
export const setProgressStepperItemActiveDescendant = ($el, isActiveDescendant) => updateBooleanAttribute($el, ATTR_PROGRESS_STEPPER_ITEM_ACTIVE_DESCENDANT, isActiveDescendant);
|
package/radio/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TSinchRadioElement, TSinchRadioReact } from './types';
|
|
2
|
+
declare global {
|
|
3
|
+
namespace JSX {
|
|
4
|
+
interface IntrinsicElements {
|
|
5
|
+
'sinch-radio': TSinchRadioReact;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
interface HTMLElementTagNameMap {
|
|
9
|
+
'sinch-radio': TSinchRadioElement;
|
|
10
|
+
}
|
|
11
|
+
}
|
package/radio/index.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { defineCustomElement, getAttribute, getBooleanAttribute, getReactEventHandler, getTargetByAttribute, isAttrTrue, NectaryElement, updateAttribute, updateBooleanAttribute } from '../utils';
|
|
2
|
+
const templateHTML = '<style>:host{display:block}#wrapper{display:flex;flex-direction:column;gap:8px;box-sizing:border-box;width:100%}</style><div id="wrapper"><slot></slot></div>';
|
|
3
|
+
const template = document.createElement('template');
|
|
4
|
+
template.innerHTML = templateHTML;
|
|
5
|
+
defineCustomElement('sinch-radio', class extends NectaryElement {
|
|
6
|
+
#$slot;
|
|
7
|
+
#controller = null;
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
const shadowRoot = this.attachShadow();
|
|
11
|
+
shadowRoot.appendChild(template.content.cloneNode(true));
|
|
12
|
+
this.#$slot = shadowRoot.querySelector('slot');
|
|
13
|
+
}
|
|
14
|
+
connectedCallback() {
|
|
15
|
+
this.#controller = new AbortController();
|
|
16
|
+
const {
|
|
17
|
+
signal
|
|
18
|
+
} = this.#controller;
|
|
19
|
+
const options = {
|
|
20
|
+
signal
|
|
21
|
+
};
|
|
22
|
+
this.role = 'radiogroup';
|
|
23
|
+
this.#$slot.addEventListener('slotchange', this.#onSlotChange, options);
|
|
24
|
+
this.#$slot.addEventListener('keydown', this.#onOptionKeyDown, options);
|
|
25
|
+
this.#$slot.addEventListener('click', this.#onOptionClick, options);
|
|
26
|
+
this.addEventListener('-change', this.#onChangeReactHandler, options);
|
|
27
|
+
}
|
|
28
|
+
disconnectedCallback() {
|
|
29
|
+
this.#controller.abort();
|
|
30
|
+
this.#controller = null;
|
|
31
|
+
}
|
|
32
|
+
static get observedAttributes() {
|
|
33
|
+
return ['value', 'invalid'];
|
|
34
|
+
}
|
|
35
|
+
set value(value) {
|
|
36
|
+
updateAttribute(this, 'value', value);
|
|
37
|
+
}
|
|
38
|
+
get value() {
|
|
39
|
+
return getAttribute(this, 'value', '');
|
|
40
|
+
}
|
|
41
|
+
set invalid(isInvalid) {
|
|
42
|
+
updateBooleanAttribute(this, 'invalid', isInvalid);
|
|
43
|
+
}
|
|
44
|
+
get invalid() {
|
|
45
|
+
return getBooleanAttribute(this, 'invalid');
|
|
46
|
+
}
|
|
47
|
+
attributeChangedCallback(name, oldVal, newVal) {
|
|
48
|
+
switch (name) {
|
|
49
|
+
case 'value':
|
|
50
|
+
{
|
|
51
|
+
this.#onValueChange(newVal ?? '');
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'invalid':
|
|
55
|
+
{
|
|
56
|
+
this.#updateInvalid(isAttrTrue(newVal));
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
#onOptionKeyDown = e => {
|
|
62
|
+
switch (e.code) {
|
|
63
|
+
case 'ArrowUp':
|
|
64
|
+
case 'ArrowLeft':
|
|
65
|
+
{
|
|
66
|
+
e.preventDefault();
|
|
67
|
+
const $option = this.#getPrevOption();
|
|
68
|
+
if ($option !== null) {
|
|
69
|
+
$option.focus();
|
|
70
|
+
$option.click();
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'ArrowDown':
|
|
75
|
+
case 'ArrowRight':
|
|
76
|
+
{
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
const $option = this.#getNextOption();
|
|
79
|
+
if ($option !== null) {
|
|
80
|
+
$option.focus();
|
|
81
|
+
$option.click();
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
#onSlotChange = () => {
|
|
88
|
+
this.#onValueChange(this.value);
|
|
89
|
+
};
|
|
90
|
+
#onOptionClick = e => {
|
|
91
|
+
const target = getTargetByAttribute(e, 'value');
|
|
92
|
+
if (target === null || target.hasAttribute('disabled')) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const value = getAttribute(target, 'value');
|
|
96
|
+
this.dispatchEvent(new CustomEvent('-change', {
|
|
97
|
+
detail: value
|
|
98
|
+
}));
|
|
99
|
+
};
|
|
100
|
+
#onValueChange(value) {
|
|
101
|
+
for (const $option of this.#$slot.assignedElements()) {
|
|
102
|
+
const isChecked = value === getAttribute($option, 'value', '');
|
|
103
|
+
updateBooleanAttribute($option, 'checked', isChecked);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
#getFirstOption() {
|
|
107
|
+
for (const $option of this.#$slot.assignedElements()) {
|
|
108
|
+
if ($option.disabled !== true) {
|
|
109
|
+
return $option;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
#getLastOption() {
|
|
115
|
+
for (const $option of this.#$slot.assignedElements().reverse()) {
|
|
116
|
+
if ($option.disabled !== true) {
|
|
117
|
+
return $option;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
#getNextOption() {
|
|
123
|
+
const $options = this.#getEnabledRadioElements();
|
|
124
|
+
const $selectedOption = this.#findSelectedOption($options);
|
|
125
|
+
const currentIndex = $selectedOption !== null ? $options.indexOf($selectedOption) : -1;
|
|
126
|
+
if (currentIndex < 0) {
|
|
127
|
+
return this.#getFirstOption();
|
|
128
|
+
}
|
|
129
|
+
return $options[(currentIndex + 1) % $options.length];
|
|
130
|
+
}
|
|
131
|
+
#getPrevOption() {
|
|
132
|
+
const $options = this.#getEnabledRadioElements();
|
|
133
|
+
const $selectedOption = this.#findSelectedOption($options);
|
|
134
|
+
const currentIndex = $selectedOption !== null ? $options.indexOf($selectedOption) : -1;
|
|
135
|
+
if (currentIndex < 0) {
|
|
136
|
+
return this.#getLastOption();
|
|
137
|
+
}
|
|
138
|
+
return $options[(currentIndex - 1 + $options.length) % $options.length];
|
|
139
|
+
}
|
|
140
|
+
#getEnabledRadioElements() {
|
|
141
|
+
return this.#$slot.assignedElements().filter(el => !el.hasAttribute('disabled'));
|
|
142
|
+
}
|
|
143
|
+
#findSelectedOption(elements) {
|
|
144
|
+
return elements.find(el => el.checked) ?? null;
|
|
145
|
+
}
|
|
146
|
+
#updateInvalid(isInvalid) {
|
|
147
|
+
for (const opt of this.#$slot.assignedElements()) {
|
|
148
|
+
updateBooleanAttribute(opt, 'data-invalid', isInvalid);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
#onChangeReactHandler = e => {
|
|
152
|
+
getReactEventHandler(this, 'on-change')?.(e);
|
|
153
|
+
};
|
|
154
|
+
});
|
package/radio/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TSinchElementReact } from '../types';
|
|
2
|
+
export type TSinchRadioElement = HTMLElement & {
|
|
3
|
+
value: string;
|
|
4
|
+
invalid: boolean;
|
|
5
|
+
addEventListener(type: '-change', listener: (e: CustomEvent<boolean>) => void): void;
|
|
6
|
+
setAttribute(name: 'value', value: string): void;
|
|
7
|
+
setAttribute(name: 'invalid', value: ''): void;
|
|
8
|
+
};
|
|
9
|
+
export type TSinchRadioReact = TSinchElementReact<TSinchRadioElement> & {
|
|
10
|
+
value: string;
|
|
11
|
+
invalid?: boolean;
|
|
12
|
+
'aria-label': string;
|
|
13
|
+
'on-change'?: (e: CustomEvent<string>) => void;
|
|
14
|
+
};
|
package/radio/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TSinchRadioOptionElement, TSinchRadioOptionReact } from './types';
|
|
2
|
+
declare global {
|
|
3
|
+
namespace JSX {
|
|
4
|
+
interface IntrinsicElements {
|
|
5
|
+
'sinch-radio-option': TSinchRadioOptionReact;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
interface HTMLElementTagNameMap {
|
|
9
|
+
'sinch-radio-option': TSinchRadioOptionElement;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { defineCustomElement, getAttribute, getBooleanAttribute, isAttrEqual, isAttrTrue, NectaryElement, updateAttribute, updateBooleanAttribute, updateExplicitBooleanAttribute } from '../utils';
|
|
2
|
+
const templateHTML = '<style>:host{display:block;outline:0}#wrapper{display:flex;flex-direction:row;box-sizing:border-box;width:100%;min-height:24px;--sinch-local-color-background:var(--sinch-comp-radio-color-default-background-initial);--sinch-local-color-background-hover:var(--sinch-comp-radio-color-default-background-hover);--sinch-local-color-background-active:var(--sinch-comp-radio-color-default-background-active);--sinch-local-color-border:var(--sinch-comp-radio-color-default-border-initial);--sinch-local-color-border-hover:var(--sinch-comp-radio-color-default-border-hover);--sinch-local-color-border-active:var(--sinch-comp-radio-color-default-border-active);--sinch-local-color-knob:var(--sinch-comp-radio-color-checked-knob-initial);--sinch-local-color-knob-hover:var(--sinch-comp-radio-color-checked-knob-hover);--sinch-local-color-knob-active:var(--sinch-comp-radio-color-checked-knob-active);--sinch-local-color-text:var(--sinch-comp-radio-color-default-label-initial)}:host([data-invalid])>#wrapper{--sinch-local-color-border:var(--sinch-comp-radio-color-invalid-border-initial);--sinch-local-color-border-hover:var(--sinch-comp-radio-color-invalid-border-hover);--sinch-local-color-border-active:var(--sinch-comp-radio-color-invalid-border-active);--sinch-local-color-text:var(--sinch-comp-radio-color-invalid-label-initial)}:host([checked])>#wrapper{--sinch-local-color-border:var(--sinch-comp-radio-color-checked-border-initial);--sinch-local-color-border-hover:var(--sinch-comp-radio-color-checked-border-hover);--sinch-local-color-border-active:var(--sinch-comp-radio-color-checked-border-active)}:host([disabled])>#wrapper{--sinch-local-color-background:var(--sinch-comp-radio-color-disabled-background-initial);--sinch-local-color-border:var(--sinch-comp-radio-color-disabled-border-initial);--sinch-local-color-text:var(--sinch-comp-radio-color-disabled-label-initial)}:host([disabled][checked])>#wrapper{--sinch-local-color-border:var(--sinch-comp-radio-color-checked-disabled-border-initial);--sinch-local-color-knob:var(--sinch-comp-radio-color-checked-disabled-knob-initial);--sinch-local-color-text:var(--sinch-comp-radio-color-checked-disabled-label-initial)}#input{all:initial;display:block;width:18px;height:18px;cursor:pointer}:host([disabled]) #input{cursor:initial}#input-wrapper{position:relative;width:18px;height:18px;align-self:flex-start;margin-top:3px}#input::before{content:"";position:absolute;inset:-3px;border:2px solid var(--sinch-comp-radio-color-default-outline-focus);border-radius:50%;transition:opacity .1s linear;opacity:0;box-sizing:border-box;pointer-events:none}:host(:focus-visible) #input::before{opacity:1}#input::after{content:"";position:absolute;width:18px;height:18px;inset:0;margin:auto;background-color:var(--sinch-local-color-background);border:1px solid var(--sinch-local-color-border);border-radius:50%;box-sizing:border-box;pointer-events:none}:host(:hover:not([disabled])) #input::after{background-color:var(--sinch-local-color-background-hover);border-color:var(--sinch-local-color-border-hover)}:host(:active:not([disabled])) #input::after{background-color:var(--sinch-local-color-background-active);border-color:var(--sinch-local-color-border-active)}#knob{position:absolute;width:10px;height:10px;inset:0;margin:auto;border-radius:50%;transition:opacity .1s linear;opacity:0;background-color:var(--sinch-local-color-knob);pointer-events:none}:host([checked]) #knob{opacity:1}:host(:hover:not([disabled])) #knob{background-color:var(--sinch-local-color-knob-hover)}:host(:active:not([disabled])) #knob{background-color:var(--sinch-local-color-knob-active)}@media (prefers-reduced-motion){#input::after,#input::before,#knob{transition:none}}#label{flex:1;align-self:center;padding-left:8px;font:var(--sinch-comp-radio-font-label);color:var(--sinch-local-color-text);cursor:pointer}#label:empty{display:none}:host([disabled]) #label{cursor:initial}</style><div id="wrapper"><div id="input-wrapper"><div id="input"></div><div id="knob"></div></div><span id="label"></span></div>';
|
|
3
|
+
const template = document.createElement('template');
|
|
4
|
+
template.innerHTML = templateHTML;
|
|
5
|
+
defineCustomElement('sinch-radio-option', class extends NectaryElement {
|
|
6
|
+
#$label;
|
|
7
|
+
constructor() {
|
|
8
|
+
super();
|
|
9
|
+
const shadowRoot = this.attachShadow();
|
|
10
|
+
shadowRoot.appendChild(template.content.cloneNode(true));
|
|
11
|
+
this.#$label = shadowRoot.querySelector('#label');
|
|
12
|
+
}
|
|
13
|
+
connectedCallback() {
|
|
14
|
+
this.role = 'radio';
|
|
15
|
+
this.tabIndex = 0;
|
|
16
|
+
}
|
|
17
|
+
disconnectedCallback() {}
|
|
18
|
+
static get observedAttributes() {
|
|
19
|
+
return ['checked', 'disabled', 'text', 'data-invalid'];
|
|
20
|
+
}
|
|
21
|
+
attributeChangedCallback(name, oldVal, newVal) {
|
|
22
|
+
if (isAttrEqual(oldVal, newVal)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
switch (name) {
|
|
26
|
+
case 'text':
|
|
27
|
+
{
|
|
28
|
+
this.#$label.textContent = newVal;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case 'checked':
|
|
32
|
+
{
|
|
33
|
+
const isChecked = isAttrTrue(newVal);
|
|
34
|
+
updateExplicitBooleanAttribute(this, 'aria-checked', isChecked);
|
|
35
|
+
updateBooleanAttribute(this, 'checked', isChecked);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case 'disabled':
|
|
39
|
+
{
|
|
40
|
+
const isDisabled = isAttrTrue(newVal);
|
|
41
|
+
updateExplicitBooleanAttribute(this, 'aria-disabled', isDisabled);
|
|
42
|
+
updateBooleanAttribute(this, 'disabled', isDisabled);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'data-invalid':
|
|
46
|
+
{
|
|
47
|
+
updateBooleanAttribute(this, 'data-invalid', isAttrTrue(newVal));
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
set checked(isChecked) {
|
|
53
|
+
updateBooleanAttribute(this, 'checked', isChecked);
|
|
54
|
+
}
|
|
55
|
+
get checked() {
|
|
56
|
+
return getBooleanAttribute(this, 'checked');
|
|
57
|
+
}
|
|
58
|
+
set value(value) {
|
|
59
|
+
updateAttribute(this, 'value', value);
|
|
60
|
+
}
|
|
61
|
+
get value() {
|
|
62
|
+
return getAttribute(this, 'value', '');
|
|
63
|
+
}
|
|
64
|
+
set disabled(isDisabled) {
|
|
65
|
+
updateBooleanAttribute(this, 'disabled', isDisabled);
|
|
66
|
+
}
|
|
67
|
+
get disabled() {
|
|
68
|
+
return getBooleanAttribute(this, 'disabled');
|
|
69
|
+
}
|
|
70
|
+
set text(value) {
|
|
71
|
+
updateAttribute(this, 'text', value);
|
|
72
|
+
}
|
|
73
|
+
get text() {
|
|
74
|
+
return getAttribute(this, 'text', '');
|
|
75
|
+
}
|
|
76
|
+
get focusable() {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TSinchElementReact } from '../types';
|
|
2
|
+
export type TSinchRadioOptionElement = HTMLElement & {
|
|
3
|
+
value: string;
|
|
4
|
+
checked: boolean;
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
text: string;
|
|
7
|
+
setAttribute(name: 'value', value: string): void;
|
|
8
|
+
setAttribute(name: 'checked', value: ''): void;
|
|
9
|
+
setAttribute(name: 'disabled', value: ''): void;
|
|
10
|
+
setAttribute(name: 'text', value: string): void;
|
|
11
|
+
};
|
|
12
|
+
export type TSinchRadioOptionReact = TSinchElementReact<TSinchRadioOptionElement> & {
|
|
13
|
+
value: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
text: string;
|
|
16
|
+
'aria-label': string;
|
|
17
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/readme.md
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# 🐝 Nectary
|
|
2
|
+
|
|
3
|
+
Design System's framework-agnostic Component Library implementation.
|
|
4
|
+
|
|
5
|
+
>Nectaries are specialized nectar-producing structures of the flower.
|
|
6
|
+
|
|
7
|
+
>Bumblebees eat nectar and pollen made by flowers. The sugary nectar provides the bees with energy while the pollen provides them with protein.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
Add the following line to `.npmrc` in the project root:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
//registry.npmjs.org/:_authToken=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
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Add the component library dependency to `package.json`:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
npm install @nectary/components
|
|
21
|
+
# or
|
|
22
|
+
yarn add @nectary/components
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
### Registry
|
|
28
|
+
|
|
29
|
+
Nectary needs a custom elements registry to work with, even if it's a global default one:
|
|
30
|
+
|
|
31
|
+
```js
|
|
32
|
+
import { setNectaryRegistry } from '@nectary/components/utils'
|
|
33
|
+
|
|
34
|
+
setNectaryRegistry(window.customElements)
|
|
35
|
+
|
|
36
|
+
// App
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Or a custom one for the Shell/MFE use case, see [mfe-helper-react](https://gitlab.com/sinch/sinch-projects/applications/teams/core/core-npm-packages/-/tree/main/packages/mfe-helper-react) as an example for more details:
|
|
40
|
+
|
|
41
|
+
```js
|
|
42
|
+
import { setNectaryRegistry } from '@nectary/components/utils'
|
|
43
|
+
|
|
44
|
+
const customRegistry = new CustomElementRegistry();
|
|
45
|
+
|
|
46
|
+
setNectaryRegistry(customRegistry)
|
|
47
|
+
|
|
48
|
+
// ShadowRoot wrapper
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Theme
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
import '@nectary/theme-base'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Use color palette or custom font face:
|
|
58
|
+
|
|
59
|
+
```css
|
|
60
|
+
span {
|
|
61
|
+
color: var(--sinch-color-honey-700);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
h2 {
|
|
65
|
+
font: var(--sinch-font-title-l);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Components
|
|
70
|
+
|
|
71
|
+
Import component:
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
import '@nectary/components/button'
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Use it in React/Vue/Angular/etc, for example:
|
|
78
|
+
|
|
79
|
+
```jsx
|
|
80
|
+
<sinch-button value="Click me" onClick={() => console.log('click')}></sinch-button>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
⚠️ Note that it's not allowed to self-close custom element tags.
|
|
84
|
+
|
|
85
|
+
## Testing
|
|
86
|
+
|
|
87
|
+
If you are testing your application using Nectary components with Jest, you might run into some problems, as it does not work out of the box. Here are the common pitfalls and their solutions.
|
|
88
|
+
|
|
89
|
+
### Example configuration
|
|
90
|
+
|
|
91
|
+
jest.config.js
|
|
92
|
+
|
|
93
|
+
```js
|
|
94
|
+
/** @type {import("ts-jest/dist/types").InitialOptionsTsJest} */
|
|
95
|
+
module.exports = {
|
|
96
|
+
preset: "ts-jest",
|
|
97
|
+
testEnvironment: "jsdom",
|
|
98
|
+
moduleNameMapper: {
|
|
99
|
+
"\\.(css)$": "identity-obj-proxy"
|
|
100
|
+
},
|
|
101
|
+
transform: {
|
|
102
|
+
"^.+\\.(ts|tsx)?$": "ts-jest",
|
|
103
|
+
"^.+\\.(js|jsx)$": "babel-jest"
|
|
104
|
+
},
|
|
105
|
+
transformIgnorePatterns: [
|
|
106
|
+
"node_modules/(?!@nectary)"
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
babel.config.js
|
|
112
|
+
|
|
113
|
+
```js
|
|
114
|
+
module.exports = {presets: ['@babel/preset-env']}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### CSS
|
|
118
|
+
|
|
119
|
+
If you already have a babel loader for CSS, you might not need this part. If you do not, you can use [identity-obj-proxy](https://www.npmjs.com/package/identity-obj-proxy) to mock your CSS imports:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
npm install identity-obj-proxy
|
|
123
|
+
# or
|
|
124
|
+
yarn add identity-obj-proxy
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Then add this part to your jest.config.js file:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
moduleNameMapper: {
|
|
131
|
+
"\\.(css)$": "identity-obj-proxy"
|
|
132
|
+
},
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
It lets Jest know how to mock the css imports in your codebase, like for example when you import the theme:
|
|
136
|
+
|
|
137
|
+
```js
|
|
138
|
+
import '@nectary/theme-base'
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
This import should not throw an error now.
|
|
142
|
+
|
|
143
|
+
### JS and TS
|
|
144
|
+
|
|
145
|
+
You are going to need to install [babel-jest](https://www.npmjs.com/package/babel-jest) if it is not already done:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
npm install babel-jest
|
|
149
|
+
# or
|
|
150
|
+
yarn add babel-jest
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Then add this lines to your jest.config.js file:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
transform: {
|
|
157
|
+
"^.+\\.(ts|tsx)?$": "ts-jest", // if you are using Typescript and ts-jest
|
|
158
|
+
"^.+\\.(js|jsx)$": "babel-jest"
|
|
159
|
+
},
|
|
160
|
+
transformIgnorePatterns: [
|
|
161
|
+
"node_modules/(?!@nectary)"
|
|
162
|
+
]
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
It is necessary to export the env preset in the babel.js.config file:
|
|
166
|
+
|
|
167
|
+
```js
|
|
168
|
+
module.exports = {presets: ['@babel/preset-env']}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
If you import any component:
|
|
172
|
+
|
|
173
|
+
```js
|
|
174
|
+
import '@nectary/components/input'
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
It should not throw the error:
|
|
178
|
+
|
|
179
|
+
```Jest encountered an unexpected token```
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TSinchRichTextElement, TSinchRichTextReact } from './types';
|
|
2
|
+
declare global {
|
|
3
|
+
namespace JSX {
|
|
4
|
+
interface IntrinsicElements {
|
|
5
|
+
'sinch-rich-text': TSinchRichTextReact;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
interface HTMLElementTagNameMap {
|
|
9
|
+
'sinch-rich-text': TSinchRichTextElement;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { defineCustomElement, NectaryElement, getLiteralAttribute, updateLiteralAttribute, getAttribute, updateAttribute, parseMarkdown } from '../utils';
|
|
2
|
+
const templateHTML = '<style>:host{display:block;--sinch-comp-rich-text-font:var(--sinch-sys-font-body-m)}:host([size="s"]){--sinch-comp-rich-text-font:var(--sinch-sys-font-body-s)}:host([size=xs]){--sinch-comp-rich-text-font:var(--sinch-sys-font-body-xs)}:host([size=xxs]){--sinch-comp-rich-text-font:var(--sinch-sys-font-body-xxs)}#wrapper{font:var(--sinch-comp-rich-text-font);color:var(--sinch-global-color-text,var(--sinch-sys-color-text-default))}.em1{font-style:italic}.em2{font-weight:var(--sinch-ref-typography-font-weight-700)}.em3{font-style:italic;font-weight:var(--sinch-ref-typography-font-weight-700)}.strikethrough{text-decoration:line-through}.link{font:var(--sinch-comp-link-default-font-initial);color:var(--sinch-comp-link-color-default-text-initial);text-decoration:underline}.link:hover{color:var(--sinch-comp-link-color-default-text-hover);text-decoration:none}.code{font:var(--sinch-comp-code-tag-font-text);line-height:inherit;font-size:inherit;border:1px solid var(--sinch-comp-code-tag-color-default-border-initial);background-color:var(--sinch-comp-code-tag-color-default-background-initial);padding:0 .25em;border-radius:var(--sinch-comp-code-tag-shape-radius)}.paragraph{margin:0}.paragraph+.paragraph{margin-top:12px}</style><div id="wrapper"></div>';
|
|
3
|
+
import { sizeValues } from './utils';
|
|
4
|
+
const template = document.createElement('template');
|
|
5
|
+
template.innerHTML = templateHTML;
|
|
6
|
+
defineCustomElement('sinch-rich-text', class extends NectaryElement {
|
|
7
|
+
#wrapper;
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
const shadowRoot = this.attachShadow();
|
|
11
|
+
shadowRoot.appendChild(template.content.cloneNode(true));
|
|
12
|
+
this.#wrapper = shadowRoot.querySelector('#wrapper');
|
|
13
|
+
}
|
|
14
|
+
connectedCallback() {
|
|
15
|
+
this.setAttribute('role', 'paragraph');
|
|
16
|
+
}
|
|
17
|
+
static get observedAttributes() {
|
|
18
|
+
return ['text'];
|
|
19
|
+
}
|
|
20
|
+
attributeChangedCallback(name, _, newVal) {
|
|
21
|
+
switch (name) {
|
|
22
|
+
case 'text':
|
|
23
|
+
{
|
|
24
|
+
this.#updateText(newVal);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
get size() {
|
|
30
|
+
return getLiteralAttribute(this, sizeValues, 'size', 'm');
|
|
31
|
+
}
|
|
32
|
+
set size(value) {
|
|
33
|
+
updateLiteralAttribute(this, sizeValues, 'size', value);
|
|
34
|
+
}
|
|
35
|
+
get text() {
|
|
36
|
+
return getAttribute(this, 'text', '');
|
|
37
|
+
}
|
|
38
|
+
set text(value) {
|
|
39
|
+
updateAttribute(this, 'text', value);
|
|
40
|
+
}
|
|
41
|
+
#updateText(text) {
|
|
42
|
+
if (text === null) {
|
|
43
|
+
this.#wrapper.innerHTML = '';
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.#wrapper.innerHTML = parseMarkdown(text);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TSinchTextType } from '../text/types';
|
|
2
|
+
import type { TSinchElementReact } from '../types';
|
|
3
|
+
export type TSinchRichTextElement = HTMLElement & {
|
|
4
|
+
size: TSinchTextType;
|
|
5
|
+
text: string;
|
|
6
|
+
setAttribute(name: 'size', value: TSinchTextType): void;
|
|
7
|
+
setAttribute(name: 'text', value: string): void;
|
|
8
|
+
};
|
|
9
|
+
export type TSinchRichTextReact = TSinchElementReact<TSinchRichTextElement> & {
|
|
10
|
+
size?: TSinchTextType;
|
|
11
|
+
text: string;
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const sizeValues = ['m', 's', 'xs', 'xxs'];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import '../title';
|
|
2
|
+
import type { TSinchSegmentElement, TSinchSegmentReact } from './types';
|
|
3
|
+
declare global {
|
|
4
|
+
namespace JSX {
|
|
5
|
+
interface IntrinsicElements {
|
|
6
|
+
'sinch-segment': TSinchSegmentReact;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
interface HTMLElementTagNameMap {
|
|
10
|
+
'sinch-segment': TSinchSegmentElement;
|
|
11
|
+
}
|
|
12
|
+
}
|