mtrl 0.7.0 → 0.8.0-next.4
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/dist/components/button/api.d.ts +4 -0
- package/dist/components/button/features/toggle.d.ts +42 -0
- package/dist/components/button/types.d.ts +30 -0
- package/dist/components/button-group/button-group.d.ts +6 -4
- package/dist/components/button-group/config.d.ts +15 -7
- package/dist/components/button-group/constants.d.ts +85 -17
- package/dist/components/button-group/index.d.ts +1 -1
- package/dist/components/button-group/types.d.ts +68 -4
- package/dist/components/carousel/api.d.ts +11 -30
- package/dist/components/carousel/arrangement.d.ts +23 -0
- package/dist/components/carousel/carousel.d.ts +13 -63
- package/dist/components/carousel/config.d.ts +2 -31
- package/dist/components/carousel/constants.d.ts +25 -151
- package/dist/components/carousel/features/index.d.ts +2 -5
- package/dist/components/carousel/features/scroll.d.ts +19 -0
- package/dist/components/carousel/features/slides.d.ts +18 -8
- package/dist/components/carousel/index.d.ts +3 -37
- package/dist/components/carousel/keylines.d.ts +65 -0
- package/dist/components/carousel/strategy.d.ts +36 -0
- package/dist/components/carousel/types.d.ts +36 -242
- package/dist/components/dialog/api.d.ts +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/slider/constants.d.ts +8 -8
- package/dist/components/slider/types.d.ts +4 -1
- package/dist/components/snackbar/api.d.ts +1 -1
- package/dist/components/snackbar/config.d.ts +2 -1
- package/dist/components/snackbar/constants.d.ts +18 -0
- package/dist/components/snackbar/index.d.ts +2 -1
- package/dist/components/snackbar/queue.d.ts +10 -2
- package/dist/components/snackbar/types.d.ts +37 -1
- package/dist/index.cjs +20 -10
- package/dist/index.cjs.map +54 -38
- package/dist/index.js +20 -10
- package/dist/index.js.map +54 -38
- package/dist/package.json +1 -1
- package/dist/styles.css +2 -2
- package/package.json +3 -6
- package/src/styles/abstract/_theme.scss +4 -2
- package/src/styles/abstract/_variables.scss +59 -12
- package/src/styles/components/_button-group.scss +122 -349
- package/src/styles/components/_button.scss +333 -591
- package/src/styles/components/_carousel.scss +131 -611
- package/src/styles/components/_icon-button.scss +23 -23
- package/src/styles/components/_select.scss +9 -1
- package/src/styles/components/_slider.scss +10 -9
- package/src/styles/themes/_index.scss +1 -0
- package/src/styles/themes/_legacy.scss +73 -0
- package/dist/components/carousel/features/drag.d.ts +0 -8
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/core/compose/pipe.ts", "../src/core/compose/base.ts", "../src/core/dom/attributes.ts", "../src/core/config.ts", "../src/core/dom/classes.ts", "../src/core/dom/create.ts", "../src/core/utils/mobile.ts", "../src/core/compose/component.ts", "../src/core/state/emitter.ts", "../src/core/compose/features/events.ts", "../src/core/compose/features/text.ts", "../src/core/compose/features/icon.ts", "../src/core/compose/features/variant.ts", "../src/core/compose/features/size.ts", "../src/core/compose/features/position.ts", "../src/core/compose/features/constants.ts", "../src/core/compose/features/ripple.ts", "../src/core/compose/features/input.ts", "../src/core/compose/features/checkable.ts", "../src/core/compose/features/style.ts", "../src/core/compose/utils/type-guards.ts", "../src/core/compose/features/textinput.ts", "../src/core/compose/features/textlabel.ts", "../src/core/compose/features/track.ts", "../src/core/state/events.ts", "../src/core/compose/features/withEvents.ts", "../src/core/utils/performance.ts", "../src/core/compose/features/throttle.ts", "../src/core/compose/features/debounce.ts", "../src/core/compose/features/disabled.ts", "../src/core/compose/features/lifecycle.ts", "../src/core/compose/features/index.ts", "../src/core/compose/index.ts", "../src/core/config/global.ts", "../src/core/config/component.ts", "../src/components/badge/constants.ts", "../src/components/badge/config.ts", "../src/components/badge/features.ts", "../src/components/badge/api.ts", "../src/components/badge/badge.ts", "../src/components/badge/index.ts", "../src/core/dom/events.ts", "../src/core/dom/index.ts", "../src/components/progress/constants.ts", "../src/core/utils/object.ts", "../src/core/utils/background.ts", "../src/core/utils/theme.ts", "../src/core/utils/color.ts", "../src/core/utils/index.ts", "../src/core/canvas/resize.ts", "../src/components/progress/features/circular.ts", "../src/components/progress/features/linear.ts", "../src/components/progress/features/canvas.ts", "../src/components/progress/features/state.ts", "../src/components/progress/api.ts", "../src/components/progress/config.ts", "../src/components/progress/progress.ts", "../src/components/button/features/progress.ts", "../src/core/state/store.ts", "../src/core/state/lifecycle.ts", "../src/core/state/disabled.ts", "../src/core/canvas/drawing.ts", "../src/core/canvas/animation.ts", "../src/core/canvas/utils.ts", "../src/core/canvas/index.ts", "../src/core/index.ts", "../src/components/button/api.ts", "../src/components/button/constants.ts", "../src/components/button/config.ts", "../src/components/button/button.ts", "../src/components/button/index.ts", "../src/components/index.ts", "../src/components/bottom-app-bar/bottom-app-bar.ts", "../src/components/bottom-app-bar/config.ts", "../src/components/bottom-app-bar/constants.ts", "../src/components/bottom-app-bar/index.ts", "../src/components/button-group/button-group.ts", "../src/components/button-group/config.ts", "../src/components/button-group/constants.ts", "../src/components/card/card.ts", "../src/components/card/api.ts", "../src/components/card/config.ts", "../src/components/card/content.ts", "../src/components/card/constants.ts", "../src/components/card/features.ts", "../src/components/carousel/carousel.ts", "../src/components/carousel/constants.ts", "../src/components/carousel/features/slides.ts", "../src/components/carousel/features/drag.ts", "../src/components/carousel/api.ts", "../src/components/carousel/config.ts", "../src/components/checkbox/checkbox.ts", "../src/components/checkbox/api.ts", "../src/components/checkbox/config.ts", "../src/components/chips/chip/chip.ts", "../src/components/chips/chip/api.ts", "../src/components/chips/chip/config.ts", "../src/components/chips/chips.ts", "../src/components/chips/features/container.ts", "../src/components/chips/features/chip-items.ts", "../src/components/chips/constants.ts", "../src/components/chips/features/controller.ts", "../src/components/chips/features/dom.ts", "../src/components/chips/api.ts", "../src/components/chips/config.ts", "../src/components/datepicker/datepicker.ts", "../src/components/datepicker/types.ts", "../src/components/datepicker/utils.ts", "../src/components/datepicker/api.ts", "../src/components/datepicker/config.ts", "../src/components/datepicker/render.ts", "../src/components/dialog/dialog.ts", "../src/components/dialog/config.ts", "../src/components/dialog/features.ts", "../src/components/divider/divider.ts", "../src/components/divider/config.ts", "../src/components/divider/features.ts", "../src/components/dialog/api.ts", "../src/components/drawer/drawer.ts", "../src/components/drawer/constants.ts", "../src/components/drawer/features/items.ts", "../src/components/drawer/features/state.ts", "../src/components/drawer/features/headline.ts", "../src/components/drawer/api.ts", "../src/components/drawer/config.ts", "../src/components/fab/fab.ts", "../src/components/fab/api.ts", "../src/components/fab/config.ts", "../src/components/extended-fab/extended-fab.ts", "../src/components/extended-fab/api.ts", "../src/components/extended-fab/config.ts", "../src/components/icon-button/icon-button.ts", "../src/components/icon-button/features/toggle.ts", "../src/components/icon-button/api.ts", "../src/components/icon-button/config.ts", "../src/components/icon-button/constants.ts", "../src/components/list/list.ts", "../src/components/list/constants.ts", "../src/components/list/features/renderer.ts", "../src/components/list/features/selection.ts", "../src/components/list/api.ts", "../src/components/list/config.ts", "../src/components/menu/menu.ts", "../src/components/menu/features/controller.ts", "../src/components/menu/features/opener.ts", "../src/components/menu/features/position.ts", "../src/components/menu/features/keyboard.ts", "../src/components/menu/features/submenu.ts", "../src/components/menu/api.ts", "../src/components/menu/config.ts", "../src/components/menu/constants.ts", "../src/components/progress/index.ts", "../src/components/radios/radios.ts", "../src/components/radios/radio.ts", "../src/components/radios/api.ts", "../src/components/radios/config.ts", "../src/components/search/search.ts", "../src/components/search/constants.ts", "../src/components/search/features/structure.ts", "../src/components/search/features/states.ts", "../src/components/search/features/input.ts", "../src/components/search/features/suggestions.ts", "../src/components/search/api.ts", "../src/components/search/config.ts", "../src/components/select/select.ts", "../src/components/textfield/textfield.ts", "../src/components/textfield/api.ts", "../src/components/textfield/features/leading-icon.ts", "../src/components/textfield/features/trailing-icon.ts", "../src/components/textfield/features/prefix-text.ts", "../src/components/textfield/features/suffix-text.ts", "../src/components/textfield/features/supporting-text.ts", "../src/components/textfield/features/placement.ts", "../src/components/textfield/features/density.ts", "../src/components/textfield/features/error.ts", "../src/components/textfield/config.ts", "../src/components/textfield/constants.ts", "../src/components/select/features.ts", "../src/components/select/api.ts", "../src/components/select/config.ts", "../src/components/select/constants.ts", "../src/components/segmented-button/segmented-button.ts", "../src/components/segmented-button/config.ts", "../src/components/segmented-button/constants.ts", "../src/components/segmented-button/segment.ts", "../src/components/sheet/sheet.ts", "../src/components/sheet/types.ts", "../src/components/sheet/features/position.ts", "../src/components/sheet/features/content.ts", "../src/components/sheet/features/title.ts", "../src/components/sheet/features/state.ts", "../src/components/sheet/features/gestures.ts", "../src/components/sheet/api.ts", "../src/components/sheet/config.ts", "../src/components/sheet/constants.ts", "../src/components/slider/slider.ts", "../src/components/slider/features/range.ts", "../src/components/slider/constants.ts", "../src/components/slider/features/states.ts", "../src/components/slider/features/handlers.ts", "../src/components/slider/features/controller.ts", "../src/components/slider/features/canvas.ts", "../src/components/slider/features/dom.ts", "../src/core/dom/utils.ts", "../src/components/slider/api.ts", "../src/components/slider/config.ts", "../src/components/snackbar/snackbar.ts", "../src/components/snackbar/features.ts", "../src/components/snackbar/constants.ts", "../src/components/snackbar/position.ts", "../src/components/snackbar/api.ts", "../src/components/snackbar/queue.ts", "../src/components/snackbar/config.ts", "../src/components/switch/switch.ts", "../src/components/switch/api.ts", "../src/components/switch/features.ts", "../src/components/switch/config.ts", "../src/components/tabs/tabs.ts", "../src/components/tabs/tab.ts", "../src/components/tabs/constants.ts", "../src/components/tabs/config.ts", "../src/components/tabs/api.ts", "../src/components/tabs/utils.ts", "../src/components/tabs/indicator.ts", "../src/components/tabs/features.ts", "../src/components/tabs/state.ts", "../src/components/tabs/index.ts", "../src/components/timepicker/timepicker.ts", "../src/components/timepicker/config.ts", "../src/components/timepicker/constants.ts", "../src/components/timepicker/utils.ts", "../src/components/timepicker/clockdial.ts", "../src/components/timepicker/render.ts", "../src/components/timepicker/api.ts", "../src/components/top-app-bar/top-app-bar.ts", "../src/components/top-app-bar/config.ts", "../src/components/top-app-bar/constants.ts", "../src/components/top-app-bar/index.ts", "../src/components/tooltip/tooltip.ts", "../src/components/tooltip/types.ts", "../src/components/tooltip/api.ts", "../src/components/tooltip/config.ts", "../src/components/tooltip/constants.ts", "../src/index.ts"],
|
|
3
|
+
"sources": ["../src/core/compose/pipe.ts", "../src/core/compose/base.ts", "../src/core/dom/attributes.ts", "../src/core/config.ts", "../src/core/dom/classes.ts", "../src/core/dom/create.ts", "../src/core/utils/mobile.ts", "../src/core/compose/component.ts", "../src/core/state/emitter.ts", "../src/core/compose/features/events.ts", "../src/core/compose/features/text.ts", "../src/core/compose/features/icon.ts", "../src/core/compose/features/variant.ts", "../src/core/compose/features/size.ts", "../src/core/compose/features/position.ts", "../src/core/compose/features/constants.ts", "../src/core/compose/features/ripple.ts", "../src/core/compose/features/input.ts", "../src/core/compose/features/checkable.ts", "../src/core/compose/features/style.ts", "../src/core/compose/utils/type-guards.ts", "../src/core/compose/features/textinput.ts", "../src/core/compose/features/textlabel.ts", "../src/core/compose/features/track.ts", "../src/core/state/events.ts", "../src/core/compose/features/withEvents.ts", "../src/core/utils/performance.ts", "../src/core/compose/features/throttle.ts", "../src/core/compose/features/debounce.ts", "../src/core/compose/features/disabled.ts", "../src/core/compose/features/lifecycle.ts", "../src/core/compose/features/index.ts", "../src/core/compose/index.ts", "../src/core/config/global.ts", "../src/core/config/component.ts", "../src/core/dom/events.ts", "../src/core/dom/index.ts", "../src/components/progress/constants.ts", "../src/core/utils/object.ts", "../src/core/utils/background.ts", "../src/core/utils/theme.ts", "../src/core/utils/color.ts", "../src/core/utils/index.ts", "../src/core/canvas/resize.ts", "../src/components/progress/features/circular.ts", "../src/components/progress/features/linear.ts", "../src/components/progress/features/canvas.ts", "../src/components/progress/features/state.ts", "../src/components/progress/api.ts", "../src/components/progress/config.ts", "../src/components/progress/progress.ts", "../src/components/button/features/progress.ts", "../src/components/button/features/toggle.ts", "../src/core/state/store.ts", "../src/core/state/lifecycle.ts", "../src/core/state/disabled.ts", "../src/core/canvas/drawing.ts", "../src/core/canvas/animation.ts", "../src/core/canvas/utils.ts", "../src/core/canvas/index.ts", "../src/core/index.ts", "../src/components/button/api.ts", "../src/components/button/constants.ts", "../src/components/button/config.ts", "../src/components/button/button.ts", "../src/components/button/index.ts", "../src/components/badge/badge.ts", "../src/components/badge/config.ts", "../src/components/badge/constants.ts", "../src/components/badge/features.ts", "../src/components/badge/api.ts", "../src/components/bottom-app-bar/bottom-app-bar.ts", "../src/components/bottom-app-bar/config.ts", "../src/components/bottom-app-bar/constants.ts", "../src/components/bottom-app-bar/index.ts", "../src/components/index.ts", "../src/components/button-group/button-group.ts", "../src/components/icon-button/icon-button.ts", "../src/components/icon-button/features/toggle.ts", "../src/components/icon-button/api.ts", "../src/components/icon-button/config.ts", "../src/components/icon-button/constants.ts", "../src/components/button-group/config.ts", "../src/components/button-group/constants.ts", "../src/components/card/card.ts", "../src/components/card/api.ts", "../src/components/card/config.ts", "../src/components/card/content.ts", "../src/components/card/constants.ts", "../src/components/card/features.ts", "../src/components/carousel/carousel.ts", "../src/components/carousel/features/slides.ts", "../src/components/carousel/constants.ts", "../src/components/carousel/config.ts", "../src/components/carousel/arrangement.ts", "../src/components/carousel/keylines.ts", "../src/components/carousel/strategy.ts", "../src/components/carousel/features/scroll.ts", "../src/components/carousel/api.ts", "../src/components/checkbox/checkbox.ts", "../src/components/checkbox/api.ts", "../src/components/checkbox/config.ts", "../src/components/chips/chip/chip.ts", "../src/components/chips/chip/api.ts", "../src/components/chips/chip/config.ts", "../src/components/chips/chips.ts", "../src/components/chips/features/container.ts", "../src/components/chips/features/chip-items.ts", "../src/components/chips/constants.ts", "../src/components/chips/features/controller.ts", "../src/components/chips/features/dom.ts", "../src/components/chips/api.ts", "../src/components/chips/config.ts", "../src/components/datepicker/datepicker.ts", "../src/components/datepicker/types.ts", "../src/components/datepicker/utils.ts", "../src/components/datepicker/api.ts", "../src/components/datepicker/config.ts", "../src/components/datepicker/render.ts", "../src/components/dialog/dialog.ts", "../src/components/dialog/config.ts", "../src/components/dialog/features.ts", "../src/components/divider/divider.ts", "../src/components/divider/config.ts", "../src/components/divider/features.ts", "../src/components/dialog/api.ts", "../src/components/drawer/drawer.ts", "../src/components/drawer/constants.ts", "../src/components/drawer/features/items.ts", "../src/components/drawer/features/state.ts", "../src/components/drawer/features/headline.ts", "../src/components/drawer/api.ts", "../src/components/drawer/config.ts", "../src/components/fab/fab.ts", "../src/components/fab/api.ts", "../src/components/fab/config.ts", "../src/components/extended-fab/extended-fab.ts", "../src/components/extended-fab/api.ts", "../src/components/extended-fab/config.ts", "../src/components/list/list.ts", "../src/components/list/constants.ts", "../src/components/list/features/renderer.ts", "../src/components/list/features/selection.ts", "../src/components/list/api.ts", "../src/components/list/config.ts", "../src/components/menu/menu.ts", "../src/components/menu/features/controller.ts", "../src/components/menu/features/opener.ts", "../src/components/menu/features/position.ts", "../src/components/menu/features/keyboard.ts", "../src/components/menu/features/submenu.ts", "../src/components/menu/api.ts", "../src/components/menu/config.ts", "../src/components/menu/constants.ts", "../src/components/navigation/navigation.ts", "../src/components/navigation/api.ts", "../src/components/navigation/constants.ts", "../src/components/navigation/nav-item.ts", "../src/components/navigation/features/items.ts", "../src/components/navigation/types.ts", "../src/components/navigation/features/controller.ts", "../src/components/navigation/config.ts", "../src/components/navigation/system/state.ts", "../src/components/navigation/system/core.ts", "../src/components/navigation/system/events.ts", "../src/components/navigation/system/mobile.ts", "../src/components/navigation/system/index.ts", "../src/components/progress/index.ts", "../src/components/radios/radios.ts", "../src/components/radios/radio.ts", "../src/components/radios/api.ts", "../src/components/radios/config.ts", "../src/components/search/search.ts", "../src/components/search/constants.ts", "../src/components/search/features/structure.ts", "../src/components/search/features/states.ts", "../src/components/search/features/input.ts", "../src/components/search/features/suggestions.ts", "../src/components/search/api.ts", "../src/components/search/config.ts", "../src/components/select/select.ts", "../src/components/textfield/textfield.ts", "../src/components/textfield/api.ts", "../src/components/textfield/features/leading-icon.ts", "../src/components/textfield/features/trailing-icon.ts", "../src/components/textfield/features/prefix-text.ts", "../src/components/textfield/features/suffix-text.ts", "../src/components/textfield/features/supporting-text.ts", "../src/components/textfield/features/placement.ts", "../src/components/textfield/features/density.ts", "../src/components/textfield/features/error.ts", "../src/components/textfield/config.ts", "../src/components/textfield/constants.ts", "../src/components/select/features.ts", "../src/components/select/api.ts", "../src/components/select/config.ts", "../src/components/select/constants.ts", "../src/components/segmented-button/segmented-button.ts", "../src/components/segmented-button/config.ts", "../src/components/segmented-button/constants.ts", "../src/components/segmented-button/segment.ts", "../src/components/sheet/sheet.ts", "../src/components/sheet/types.ts", "../src/components/sheet/features/position.ts", "../src/components/sheet/features/content.ts", "../src/components/sheet/features/title.ts", "../src/components/sheet/features/state.ts", "../src/components/sheet/features/gestures.ts", "../src/components/sheet/api.ts", "../src/components/sheet/config.ts", "../src/components/sheet/constants.ts", "../src/components/slider/slider.ts", "../src/components/slider/features/range.ts", "../src/components/slider/constants.ts", "../src/components/slider/features/states.ts", "../src/components/slider/features/handlers.ts", "../src/components/slider/features/controller.ts", "../src/components/slider/features/canvas.ts", "../src/components/slider/features/dom.ts", "../src/core/dom/utils.ts", "../src/components/slider/api.ts", "../src/components/slider/config.ts", "../src/components/snackbar/snackbar.ts", "../src/components/snackbar/features.ts", "../src/components/snackbar/constants.ts", "../src/components/snackbar/position.ts", "../src/components/snackbar/api.ts", "../src/components/snackbar/queue.ts", "../src/components/snackbar/config.ts", "../src/components/switch/switch.ts", "../src/components/switch/api.ts", "../src/components/switch/features.ts", "../src/components/switch/config.ts", "../src/components/tabs/tabs.ts", "../src/components/tabs/tab.ts", "../src/components/tabs/constants.ts", "../src/components/tabs/config.ts", "../src/components/tabs/api.ts", "../src/components/tabs/utils.ts", "../src/components/tabs/indicator.ts", "../src/components/tabs/features.ts", "../src/components/tabs/state.ts", "../src/components/tabs/index.ts", "../src/components/timepicker/timepicker.ts", "../src/components/timepicker/config.ts", "../src/components/timepicker/constants.ts", "../src/components/timepicker/utils.ts", "../src/components/timepicker/clockdial.ts", "../src/components/timepicker/render.ts", "../src/components/timepicker/api.ts", "../src/components/top-app-bar/top-app-bar.ts", "../src/components/top-app-bar/config.ts", "../src/components/top-app-bar/constants.ts", "../src/components/top-app-bar/index.ts", "../src/components/tooltip/tooltip.ts", "../src/components/tooltip/types.ts", "../src/components/tooltip/api.ts", "../src/components/tooltip/config.ts", "../src/components/tooltip/constants.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// src/core/compose/pipe.ts\n/**\n * @namespace compose\n * @description Core composition utilities for creating and combining components\n */\n\n/**\n * Performs left-to-right function composition.\n * Each function takes the return value of the previous function as its input.\n *\n * @memberof compose\n * @function pipe\n * @param {...Function} fns - Functions to compose\n * @returns {Function} Composed function that passes its argument through the pipeline\n *\n * @example\n * const addOne = x => x + 1;\n * const double = x => x * 2;\n * const addOneThenDouble = pipe(addOne, double);\n * console.log(addOneThenDouble(3)); // Output: 8\n */\nexport const pipe = <T>(...fns: Array<(arg: any) => any>) => \n (x: T): any => fns.reduce((v, f) => f(v), x);\n\n/**\n * Performs right-to-left function composition.\n * This is the mathematical composition order: (f ∘ g)(x) = f(g(x))\n *\n * @memberof compose\n * @function compose\n * @param {...Function} fns - Functions to compose\n * @returns {Function} Composed function following mathematical composition order\n *\n * @example\n * const addOne = x => x + 1;\n * const double = x => x * 2;\n * const doubleTheAddOne = compose(addOne, double);\n * console.log(doubleTheAddOne(3)); // Output: 7\n */\nexport const compose = <T>(...fns: Array<(arg: any) => any>) => \n (x: T): any => fns.reduceRight((v, f) => f(v), x);\n\n/**\n * Creates a function that applies transformations to an object with shared context.\n * Useful for applying multiple transformations while maintaining a shared state.\n *\n * @memberof compose\n * @function transform\n * @param {...Function} transformers - Functions that transform the object\n * @returns {Function} Function that applies all transformations with shared context\n *\n * @example\n * const withName = (obj, context) => ({ ...obj, name: context.name });\n * const withAge = (obj, context) => ({ ...obj, age: context.age });\n * const createPerson = transform(withName, withAge);\n *\n * const person = createPerson({}, { name: 'John', age: 30 });\n * // Result: { name: 'John', age: 30 }\n */\nexport const transform = <T, C = Record<string, any>>(\n ...transformers: Array<(obj: T, context: C) => Partial<T>>\n) => (obj: T, context: C = {} as C): T => \n transformers.reduce(\n (acc, transformer) => ({\n ...acc,\n ...transformer(acc, context)\n }), \n obj\n );\n\n/**\n * @typedef {Object} TransformContext\n * @property {any} [key] - Any contextual data needed by transformers\n */",
|
|
6
6
|
"// src/core/compose/base.ts\n\n/**\n * Configuration for component creation\n */\nexport interface ComponentConfig {\n [key: string]: any;\n}\n\n/**\n * Basic component interface\n */\nexport interface Component {\n /**\n * Component element\n */\n element: HTMLElement | null;\n \n /**\n * Component configuration\n */\n config: ComponentConfig;\n \n /**\n * Setup method\n * @returns Component for chaining\n */\n setup: () => Component;\n}\n\n/**\n * Creates a basic component with minimal structure\n * \n * @param config - Component configuration\n * @returns Basic component structure\n */\nexport const createComponent = (config: ComponentConfig = {}): Component => ({\n element: null,\n config,\n setup() {\n return this;\n }\n});",
|
|
@@ -37,18 +37,12 @@
|
|
|
37
37
|
"// src/core/compose/index.ts\n/**\n * @module core/compose\n * @description Core composition utilities for creating and combining components\n */\n\nexport { pipe, compose, transform } from \"./pipe\";\nexport { createComponent } from \"./base\";\nexport { createBase, withElement } from \"./component\";\nexport {\n withEvents,\n withIcon,\n withSize,\n withPosition,\n withText,\n withVariant,\n withDisabled,\n withLifecycle,\n withRipple,\n withInput,\n withCheckable,\n withStyle,\n withTextInput,\n withTextLabel,\n withTrack,\n withEnhancedEvents,\n withThrottle,\n withDebounce,\n} from \"./features\";\n\n// Component feature interfaces\nexport type { Component } from \"./base\";\nexport type {\n BaseComponent,\n ElementComponent,\n TouchState,\n WithElementOptions,\n} from \"./component\";\n\nexport type {\n EventComponent,\n TextComponent,\n IconComponent,\n LifecycleComponent,\n Lifecycle,\n DisabledComponent,\n DisabledManager,\n RippleComponent,\n InputComponent,\n CheckableComponent,\n CheckableManager,\n TextInputComponent,\n LabelComponent,\n TrackComponent,\n EnhancedEventComponent,\n ThrottleComponent,\n ThrottleConfig,\n DebounceComponent,\n DebounceConfig,\n} from \"./features\";\n\n// Type guards export\nexport { hasLifecycle, hasEmit } from \"./utils/type-guards\";\nexport type {\n ComponentWithLifecycle,\n ComponentWithEmit,\n} from \"./utils/type-guards\";\n",
|
|
38
38
|
"/**\n * Lightweight Global Configuration System for mtrl\n * \n * This system allows setting default configurations for all components\n * without adding complexity or performance overhead.\n */\n\nimport { ButtonConfig } from '../../components/button/types';\nimport { TextfieldConfig } from '../../components/textfield/types';\n// Import other component configs as needed\n\n/**\n * Component configuration map\n * Add new components here as they support global config\n * \n * For components not yet integrated, use Partial<any> as a placeholder\n */\nexport interface ComponentConfigMap {\n button?: Partial<ButtonConfig>;\n textfield?: Partial<TextfieldConfig>;\n checkbox?: Partial<any>;\n switch?: Partial<any>;\n slider?: Partial<any>;\n card?: Partial<any>;\n chip?: Partial<any>;\n dialog?: Partial<any>;\n // Add other components as needed\n}\n\n/**\n * Internal storage for component configurations\n * Using a simple object for maximum performance\n */\nconst configStore: ComponentConfigMap = {};\n\n/**\n * Sets global defaults for a specific component\n * \n * @param component - Component name\n * @param config - Default configuration to apply\n * \n * @example\n * ```typescript\n * // Set all buttons to be square by default\n * setComponentDefaults('button', {\n * shape: 'square',\n * size: 'm'\n * });\n * ```\n */\nexport function setComponentDefaults<K extends keyof ComponentConfigMap>(\n component: K,\n config: ComponentConfigMap[K]\n): void {\n configStore[component] = config;\n}\n\n/**\n * Gets global defaults for a component\n * \n * @param component - Component name\n * @returns Component defaults or empty object\n */\nexport function getComponentDefaults<K extends keyof ComponentConfigMap>(\n component: K\n): ComponentConfigMap[K] {\n return configStore[component] || {} as ComponentConfigMap[K];\n}\n\n/**\n * Sets global defaults for multiple components at once\n * \n * @param configs - Map of component names to their default configs\n * \n * @example\n * ```typescript\n * setGlobalDefaults({\n * button: { shape: 'square', size: 'm' },\n * textfield: { variant: 'outlined' }\n * });\n * ```\n */\nexport function setGlobalDefaults(configs: Partial<ComponentConfigMap>): void {\n Object.assign(configStore, configs);\n}\n\n/**\n * Clears all global defaults\n */\nexport function clearGlobalDefaults(): void {\n Object.keys(configStore).forEach(key => {\n delete configStore[key as keyof ComponentConfigMap];\n });\n} ",
|
|
39
39
|
"// src/core/config/component-config.ts\nimport { PREFIX } from \"../config\";\nimport { getComponentDefaults } from \"./global\";\n\n/**\n * Base component configuration interface\n * Common configuration properties shared by all components\n */\nexport interface BaseComponentConfig {\n componentName?: string;\n prefix?: string;\n class?: string | string[]; // Support both string and array\n className?: string | string[]; // Alternative to class\n rawClass?: string | string[]; // Classes that should not be prefixed\n parent?: HTMLElement | string | null; // Parent element to append to (element or selector)\n // Common HTML attributes\n id?: string; // Element ID\n name?: string; // Form element name\n title?: string; // Tooltip text (native browser tooltip on hover)\n tabIndex?: number; // Keyboard navigation order (-1 to remove from tab order, 0+ for custom order)\n style?: string | Partial<CSSStyleDeclaration>; // Inline styles (string or object)\n // Data attributes\n data?: Record<string, string>; // Data attributes (e.g., { name: 'value' } → data-name=\"value\")\n // ARIA attributes for accessibility\n role?: string; // ARIA role (e.g., 'button', 'menuitem', 'dialog')\n ariaLabel?: string; // Accessible label for screen readers\n ariaDescribedBy?: string; // ID of element that describes this element\n ariaLabelledBy?: string; // ID of element that labels this element\n ariaHidden?: boolean; // Hide from screen readers\n [key: string]: any;\n}\n\n/**\n * Creates a base configuration for any component\n * Automatically merges global defaults if available\n *\n * @param {BaseComponentConfig} defaults - Default configuration for the component\n * @param {BaseComponentConfig} userConfig - User provided configuration\n * @param {string} componentName - The name of the component\n * @returns {BaseComponentConfig} Complete configuration with defaults applied\n *\n * @example\n * // In button/config.ts\n * export const createBaseConfig = (config: ButtonConfig = {}) =>\n * createComponentConfig(defaultConfig, config, 'button');\n */\nexport const createComponentConfig = (\n defaults: BaseComponentConfig,\n userConfig: BaseComponentConfig = {},\n componentName: string,\n): BaseComponentConfig => {\n // Get global defaults for this component (if any)\n const globalDefaults = getComponentDefaults(componentName as any);\n\n // First check for className, fall back to class\n const userClassName =\n userConfig.className !== undefined\n ? userConfig.className\n : userConfig.class;\n const defaultClassName =\n defaults.className !== undefined ? defaults.className : defaults.class;\n\n // Create a new object with proper precedence:\n // 1. Component defaults (lowest priority)\n // 2. Global defaults (medium priority)\n // 3. User config (highest priority)\n const config = {\n ...defaults,\n ...globalDefaults,\n ...userConfig,\n // Force these values to ensure consistency\n componentName,\n prefix: PREFIX,\n // Use className as the canonical property, falling back to alternatives\n className: userClassName !== undefined ? userClassName : defaultClassName,\n };\n\n // Remove potentially confusing duplicate class property\n if (\"class\" in config && config.className !== undefined) {\n delete config.class;\n }\n\n return config;\n};\n\n/**\n * Creates a class name with proper prefixing\n *\n * @param {string} componentName - The name of the component\n * @param {string} [element] - Optional element name for BEM notation\n * @param {string} [modifier] - Optional modifier name for BEM notation\n * @returns {string} Properly formatted class name\n *\n * @example\n * // Returns 'mtrl-button'\n * createClassName('button');\n *\n * // Returns 'mtrl-button__icon'\n * createClassName('button', 'icon');\n *\n * // Returns 'mtrl-button--primary'\n * createClassName('button', null, 'primary');\n *\n * // Returns 'mtrl-button__icon--small'\n * createClassName('button', 'icon', 'small');\n */\nexport const createClassName = (\n componentName: string,\n element?: string | null,\n modifier?: string | null,\n): string => {\n let className = `${PREFIX}-${componentName}`;\n\n if (element) {\n className += `__${element}`;\n }\n\n if (modifier) {\n className += `--${modifier}`;\n }\n\n return className;\n};\n\n/**\n * Processes class names for an element, handling arrays, nulls and conditional classes\n *\n * @param {string | string[] | null} classNames - Class names to process\n * @returns {string} Space-separated class names as a string\n *\n * @example\n * // Returns 'mtrl-card mtrl-card--elevated custom-class'\n * processClassNames(['mtrl-card', 'mtrl-card--elevated', 'custom-class']);\n *\n * // Returns 'mtrl-card'\n * processClassNames(['mtrl-card', null, undefined]);\n */\nexport const processClassNames = (\n classNames: string | string[] | null,\n): string => {\n if (!classNames) return \"\";\n\n if (typeof classNames === \"string\") return classNames;\n\n return classNames\n .filter(Boolean) // Remove null, undefined, empty strings\n .join(\" \");\n};\n\n/**\n * Creates a configuration object for withElement HOC\n *\n * @param {BaseComponentConfig} config - Component configuration\n * @param {Object} options - Element options\n * @returns {Object} Configuration object for withElement\n */\nexport const createElementConfig = (\n config: BaseComponentConfig,\n options: {\n tag: string;\n attributes?: Record<string, any>;\n className?: string | string[] | null;\n html?: string;\n text?: string;\n forwardEvents?: Record<\n string,\n boolean | ((component: any, event: Event) => boolean)\n >;\n interactive?: boolean;\n },\n) => {\n // Handle class and className from both sources\n const configClasses = config.className || config.class;\n const optionsClasses = options.className;\n\n // Combine all classes\n const combinedClassNames = [\n ...(Array.isArray(configClasses) ? configClasses : [configClasses]),\n ...(Array.isArray(optionsClasses) ? optionsClasses : [optionsClasses]),\n ].filter(Boolean);\n\n // Set up element attributes\n const elementAttributes = options.attributes || {};\n\n return {\n tag: options.tag,\n componentName: config.componentName,\n attributes: elementAttributes,\n className: combinedClassNames.length > 0 ? combinedClassNames : undefined,\n rawClass: config.rawClass,\n // Common HTML attributes\n id: config.id,\n name: config.name,\n title: config.title,\n tabIndex: config.tabIndex,\n style: config.style,\n // Data attributes\n data: config.data,\n // ARIA attributes\n role: config.role,\n ariaLabel: config.ariaLabel,\n ariaDescribedBy: config.ariaDescribedBy,\n ariaLabelledBy: config.ariaLabelledBy,\n ariaHidden: config.ariaHidden,\n html: options.html,\n text: options.text,\n forwardEvents: options.forwardEvents || {},\n interactive: options.interactive,\n };\n};\n",
|
|
40
|
-
"// src/components/badge/constants.ts\n\n/**\n * Badge variants\n * - SMALL: Simple dot badge (6dp diameter)\n * - LARGE: Numbered badge (16dp height)\n */\nexport const BADGE_VARIANTS = {\n SMALL: 'small',\n LARGE: 'large'\n} as const;\n\n/**\n * Badge colors\n * ERROR is the default\n */\nexport const BADGE_COLORS = {\n ERROR: 'error', // Default\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SUCCESS: 'success',\n WARNING: 'warning',\n INFO: 'info'\n} as const;\n\n/**\n * Badge positions relative to its container\n */\nexport const BADGE_POSITIONS = {\n TOP_RIGHT: 'top-right', // Default\n TOP_LEFT: 'top-left',\n BOTTOM_RIGHT: 'bottom-right',\n BOTTOM_LEFT: 'bottom-left'\n} as const;\n\n/**\n * Maximum character count for badge labels\n */\nexport const BADGE_MAX_CHARACTERS = 4;",
|
|
41
|
-
"// src/components/badge/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { BadgeConfig } from \"./types\";\nimport {\n BADGE_VARIANTS,\n BADGE_COLORS,\n BADGE_POSITIONS,\n BADGE_MAX_CHARACTERS,\n} from \"./constants\";\n\n/**\n * Default configuration for the Badge component\n * These values will be used when not explicitly specified by the user.\n *\n * @category Components\n */\nexport const defaultConfig: BadgeConfig = {\n /** Default to large badge (with text capability) */\n variant: BADGE_VARIANTS.LARGE,\n /** Default to error (red) color */\n color: BADGE_COLORS.ERROR,\n /** Default to top-right corner positioning */\n position: BADGE_POSITIONS.TOP_RIGHT,\n /** Default to empty label */\n label: \"\",\n /** Default to visible */\n visible: true,\n};\n\n/**\n * Creates the base configuration for Badge component by merging user-provided\n * config with default values.\n *\n * @param {BadgeConfig} config - User provided configuration\n * @returns {BadgeConfig} Complete configuration with defaults applied\n * @category Components\n * @internal\n */\nexport const createBaseConfig = (config: BadgeConfig = {}): BadgeConfig =>\n createComponentConfig(defaultConfig, config, \"badge\") as BadgeConfig;\n\n/**\n * Generates element configuration for the Badge component.\n * This function creates the necessary attributes and configuration\n * for the DOM element creation process.\n *\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Object} Element configuration object for withElement\n * @category Components\n * @internal\n */\nexport const getElementConfig = (config: BadgeConfig) => {\n // Create the attributes object\n const attributes: Record<string, string | number | boolean> = {};\n\n // For large badges, set appropriate ARIA attributes for screen readers\n if (config.variant !== \"small\") {\n attributes.role = \"status\";\n }\n\n // Format the label if needed - small badges have no text\n const formattedLabel =\n config.variant === \"small\"\n ? \"\"\n : formatBadgeLabel(config.label || \"\", config.max);\n\n return createElementConfig(config, {\n tag: \"span\",\n attributes,\n className: config.class,\n text: formattedLabel, // Use the formatted label\n });\n};\n\n/**\n * Creates API configuration for the Badge component.\n * This connects the core component features (like visibility)\n * to the public API methods exposed to users.\n *\n * @param {Object} comp - Component with visibility and lifecycle features\n * @returns {Object} API configuration object\n * @category Components\n * @internal\n */\nexport const getApiConfig = (comp: {\n visibility: {\n show: () => void;\n hide: () => void;\n toggle: (visible?: boolean) => void;\n isVisible: () => boolean;\n };\n lifecycle: {\n destroy: () => void;\n };\n}) => ({\n visibility: {\n show: () => comp.visibility.show(),\n hide: () => comp.visibility.hide(),\n toggle: (visible?: boolean) => comp.visibility.toggle(visible),\n isVisible: () => comp.visibility.isVisible(),\n },\n lifecycle: {\n destroy: () => comp.lifecycle.destroy(),\n },\n});\n\n/**\n * Format a badge label following Material Design 3 guidelines:\n * - Max 4 characters including \"+\" for overflow\n * - Add \"+\" for numeric values exceeding max\n *\n * @param {string|number} label - Original label\n * @param {number} max - Maximum value before using \"+\"\n * @returns {string} Formatted label that fits within badge constraints\n * @category Components\n * @internal\n *\n * @example\n * formatBadgeLabel(5) // \"5\"\n * formatBadgeLabel(1250, 999) // \"999+\"\n * formatBadgeLabel(\"New\") // \"New\"\n * formatBadgeLabel(\"VeryLong\") // \"Very\" (truncated)\n */\nexport const formatBadgeLabel = (\n label: string | number,\n max?: number\n): string => {\n // Handle empty or undefined labels\n if (label === undefined || label === null || label === \"\") {\n return \"\";\n }\n\n let formattedLabel = String(label);\n\n const numericLabel = Number(label);\n\n // Apply max value formatting for numbers\n if (max !== undefined && !isNaN(numericLabel) && numericLabel > max) {\n formattedLabel = `${max}+`;\n }\n\n // Ensure label doesn't exceed max characters\n if (formattedLabel.length > BADGE_MAX_CHARACTERS) {\n // Try to preserve as much information as possible\n // For large numbers, use abbreviated format with \"+\"\n const numericValue = Number(label);\n if (!isNaN(numericValue)) {\n if (numericValue >= 1000) {\n formattedLabel = \"999+\";\n } else {\n // For numbers under 1000 but still too long, truncate\n formattedLabel =\n formattedLabel.substring(0, BADGE_MAX_CHARACTERS - 1) + \"+\";\n }\n } else {\n // For non-numeric values, simply truncate\n formattedLabel = formattedLabel.substring(0, BADGE_MAX_CHARACTERS);\n }\n }\n\n return formattedLabel;\n};\n\nexport default defaultConfig;\n",
|
|
42
|
-
"// src/components/badge/features.ts\nimport { BadgeConfig } from './types';\nimport { formatBadgeLabel } from './config';\n\n// Common badge variants\nconst VARIANT_SMALL = 'small';\nconst VARIANT_LARGE = 'large';\n\n// Common badge colors\nconst COLOR_ERROR = 'error';\n\n// Common badge positions\nconst POSITION_TOP_RIGHT = 'top-right';\n\n/**\n * Higher-order function that adds visibility control features to a component\n * @returns {Function} Component enhancer with visibility features\n */\nexport const withVisibility = () => component => {\n // Get config values\n const visible = component.config.visible !== false; // Default to true if not specified\n \n // Initialize visibility state based on config\n if (!visible) {\n component.element.classList.add(`${component.getClass('badge')}--invisible`);\n }\n \n return {\n ...component,\n visibility: {\n /**\n * Shows the badge\n */\n show() {\n component.element.classList.remove(`${component.getClass('badge')}--invisible`);\n },\n \n /**\n * Hides the badge\n */\n hide() {\n component.element.classList.add(`${component.getClass('badge')}--invisible`);\n },\n \n /**\n * Toggles badge visibility\n * @param {boolean} [visible] - Optional flag to force visibility state\n */\n toggle(visible?: boolean) {\n if (visible === undefined) {\n component.element.classList.toggle(`${component.getClass('badge')}--invisible`);\n } else if (visible) {\n this.show();\n } else {\n this.hide();\n }\n },\n \n /**\n * Checks if the badge is visible\n * @returns {boolean} True if badge is visible\n */\n isVisible() {\n return !component.element.classList.contains(`${component.getClass('badge')}--invisible`);\n }\n }\n };\n};\n\n/**\n * Higher-order function that adds variant features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with variant features\n */\nexport const withVariant = (config: BadgeConfig) => component => {\n // Get variant from config with fallback to default\n const variant = config.variant || VARIANT_LARGE;\n \n // Apply variant class\n component.element.classList.add(`${component.getClass('badge')}--${variant}`);\n \n // Small badges (dot variant) don't have text\n if (variant === VARIANT_SMALL) {\n component.element.textContent = '';\n component.element.setAttribute('aria-hidden', 'true');\n } else {\n // Add accessibility for large badges\n component.element.setAttribute('role', 'status');\n \n // Set the label if available and variant is large\n if (config.label !== undefined && config.label !== '') {\n // Format the label according to max value\n const formattedLabel = formatBadgeLabel(config.label, config.max);\n component.element.textContent = formattedLabel;\n }\n }\n \n return component;\n};\n\n/**\n * Higher-order function that adds color features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with color features\n */\nexport const withColor = (config: BadgeConfig) => component => {\n // Get color from config with fallback to default\n const color = config.color || COLOR_ERROR;\n \n // Apply color class\n component.element.classList.add(`${component.getClass('badge')}--${color}`);\n \n return component;\n};\n\n/**\n * Higher-order function that adds positioning features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with positioning features\n */\nexport const withPosition = (config: BadgeConfig) => component => {\n // Get position from config with fallback to default\n const position = config.position || POSITION_TOP_RIGHT;\n \n // Apply position class\n component.element.classList.add(`${component.getClass('badge')}--${position}`);\n \n // If there's a target, add positioned class\n if (config.target) {\n component.element.classList.add(`${component.getClass('badge')}--positioned`);\n }\n \n return component;\n};\n\n/**\n * Higher-order function that adds max value features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with max value features\n */\nexport const withMax = (config: BadgeConfig) => component => {\n // Skip if no max is defined or for small badges\n if (config.max === undefined || config.variant === VARIANT_SMALL) {\n return component;\n }\n \n // Store max value in config for later use\n component.config.max = config.max;\n \n // Apply max formatting if needed\n if (config.label !== undefined && config.label !== '') {\n const formattedLabel = formatBadgeLabel(config.label, config.max);\n component.element.textContent = formattedLabel;\n \n // Add overflow class if label was truncated\n if (typeof config.label === 'number' && config.label > config.max) {\n component.element.classList.add(`${component.getClass('badge')}--overflow`);\n }\n }\n \n return component;\n};\n\n/**\n * Higher-order function that attaches badge to a target element\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with attachment features\n */\nexport const withAttachment = (config: BadgeConfig) => component => {\n // Skip if no target is provided\n if (!config.target) {\n return component;\n }\n \n // Create wrapper to hold the target and badge\n const wrapper = document.createElement('div');\n wrapper.classList.add(component.getClass('badge-wrapper'));\n \n // Make sure positioning context is correct\n wrapper.style.position = 'relative';\n \n // Replace the target with the wrapper\n const parent = config.target.parentNode;\n if (parent) {\n parent.replaceChild(wrapper, config.target);\n wrapper.appendChild(config.target);\n wrapper.appendChild(component.element);\n \n // Save the wrapper reference\n component.wrapper = wrapper;\n }\n \n return component;\n};",
|
|
43
|
-
"// src/components/badge/api.ts\nimport {\n BadgeComponent,\n BadgeColor,\n BadgeVariant,\n BadgePosition,\n} from \"./types\";\nimport { formatBadgeLabel } from \"./config\";\n\n/**\n * API configuration options for badge component\n * @category Components\n * @internal\n */\ninterface ApiOptions {\n visibility: {\n show: () => void;\n hide: () => void;\n toggle: (visible?: boolean) => void;\n isVisible: () => boolean;\n };\n lifecycle: {\n destroy: () => void;\n };\n}\n\n/**\n * Component with required elements and methods for API enhancement\n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n element: HTMLElement;\n wrapper?: HTMLElement;\n config: {\n max?: number;\n label?: string | number;\n variant?: string;\n };\n getClass: (name: string) => string;\n addClass: (...classes: string[]) => ComponentWithElements;\n removeClass: (...classes: string[]) => ComponentWithElements;\n on: (event: string, handler: Function) => ComponentWithElements;\n off: (event: string, handler: Function) => ComponentWithElements;\n}\n\n// Common variant constants for internal use\nconst VARIANT_SMALL = \"small\";\n\n// Map of all badge colors for class removal\nconst ALL_COLORS = [\n \"error\",\n \"primary\",\n \"secondary\",\n \"tertiary\",\n \"success\",\n \"warning\",\n \"info\",\n];\n\n// Map of all badge variants for class removal\nconst ALL_VARIANTS = [\"small\", \"large\"];\n\n// Map of all badge positions for class removal\nconst ALL_POSITIONS = [\"top-right\", \"top-left\", \"bottom-right\", \"bottom-left\"];\n\n/**\n * Enhances a badge component with API methods.\n * This follows the higher-order function pattern to add public API methods\n * to the component, making them available to the end user.\n *\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @category Components\n * @internal This is an internal utility for the Badge component\n */\nexport const withAPI =\n ({ visibility, lifecycle }: ApiOptions) =>\n (component: ComponentWithElements): BadgeComponent => {\n const badgeComponent: BadgeComponent = {\n // Spread component properties\n element: component.element,\n wrapper: component.wrapper,\n getClass: component.getClass,\n\n /**\n * Sets the badge label\n * @param {string|number} label - Label to display in the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setLabel(label: string | number) {\n component.config.label = label;\n\n // Small badges (dot variant) don't have text\n if (component.config.variant === VARIANT_SMALL) {\n component.element.textContent = \"\";\n return badgeComponent;\n }\n\n // Format the label\n const formattedLabel = formatBadgeLabel(label, component.config.max);\n component.element.textContent = formattedLabel;\n\n // Add overflow class if label was truncated\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--overflow`\n );\n if (\n typeof label === \"number\" &&\n component.config.max !== undefined &&\n label > component.config.max\n ) {\n component.element.classList.add(\n `${component.getClass(\"badge\")}--overflow`\n );\n }\n\n // Toggle visibility based on whether label is empty\n if (formattedLabel === \"\" || formattedLabel === \"0\") {\n badgeComponent.hide();\n } else {\n badgeComponent.show();\n }\n\n return badgeComponent;\n },\n\n /**\n * Gets the badge label\n * @returns {string} Current badge label\n */\n getLabel() {\n return component.element.textContent || \"\";\n },\n\n /**\n * Sets the badge content (alias for setLabel)\n * @param {string|number} content - Content to display in the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setContent(content: string | number) {\n return badgeComponent.setLabel(content);\n },\n\n /**\n * Gets the badge content (alias for getLabel)\n * @returns {string} Current badge content\n */\n getContent() {\n return badgeComponent.getLabel();\n },\n\n /**\n * Shows the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n show() {\n visibility.show();\n return badgeComponent;\n },\n\n /**\n * Hides the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n hide() {\n visibility.hide();\n return badgeComponent;\n },\n\n /**\n * Toggles badge visibility\n * @param {boolean} [visible] - Optional flag to force visibility state\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n toggle(visible?: boolean) {\n visibility.toggle(visible);\n return badgeComponent;\n },\n\n /**\n * Checks if the badge is visible\n * @returns {boolean} True if badge is visible\n */\n isVisible() {\n return visibility.isVisible();\n },\n\n /**\n * Sets maximum value (after which badge shows max+)\n *\n * @param {number} max - Maximum value to display\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setMax(max: number) {\n component.config.max = max;\n\n // Apply max formatting if current label exceeds max\n if (component.config.label !== undefined) {\n badgeComponent.setLabel(component.config.label);\n }\n\n return badgeComponent;\n },\n\n /**\n * Sets badge color\n * @param {string} color - Color variant to apply\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setColor(color: BadgeColor | string) {\n // Remove existing color classes\n ALL_COLORS.forEach((colorName) => {\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--${colorName}`\n );\n });\n\n // Add new color class\n component.element.classList.add(\n `${component.getClass(\"badge\")}--${color}`\n );\n return badgeComponent;\n },\n\n /**\n * Sets badge variant\n * @param {string} variant - Variant to apply (small or large)\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setVariant(variant: BadgeVariant | string) {\n // Remove existing variant classes\n ALL_VARIANTS.forEach((variantName) => {\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--${variantName}`\n );\n });\n\n // Add new variant class\n component.element.classList.add(\n `${component.getClass(\"badge\")}--${variant}`\n );\n\n // Update component config\n component.config.variant = variant;\n\n // Update accessibility attributes\n if (variant === VARIANT_SMALL) {\n component.element.textContent = \"\";\n component.element.setAttribute(\"aria-hidden\", \"true\");\n } else {\n component.element.setAttribute(\"role\", \"status\");\n\n // Restore label for large badges\n if (component.config.label !== undefined) {\n badgeComponent.setLabel(component.config.label);\n }\n }\n\n return badgeComponent;\n },\n\n /**\n * Sets badge position\n * @param {string} position - Position variant to apply\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setPosition(position: BadgePosition | string) {\n // Remove existing position classes\n ALL_POSITIONS.forEach((posName) => {\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--${posName}`\n );\n });\n\n // Add new position class\n component.element.classList.add(\n `${component.getClass(\"badge\")}--${position}`\n );\n\n return badgeComponent;\n },\n\n /**\n * Attaches badge to a target element\n * @param {HTMLElement} target - Element to attach badge to\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n attachTo(target: HTMLElement) {\n // If we already have a wrapper, remove the badge from it\n if (\n component.wrapper &&\n component.wrapper.contains(component.element)\n ) {\n component.wrapper.removeChild(component.element);\n }\n\n // Create a new wrapper to hold the target and badge\n const wrapper = document.createElement(\"div\");\n wrapper.classList.add(component.getClass(\"badge-wrapper\"));\n wrapper.style.position = \"relative\";\n\n // Replace the target with the wrapper\n const parent = target.parentNode;\n if (parent) {\n parent.replaceChild(wrapper, target);\n wrapper.appendChild(target);\n wrapper.appendChild(component.element);\n\n // Make sure the badge is positioned\n component.element.classList.add(\n `${component.getClass(\"badge\")}--positioned`\n );\n\n // Save the wrapper reference\n component.wrapper = wrapper;\n badgeComponent.wrapper = wrapper;\n }\n\n return badgeComponent;\n },\n\n /**\n * Makes badge standalone (removes from wrapper)\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n detach() {\n if (\n component.wrapper &&\n component.wrapper.contains(component.element)\n ) {\n // Remove the badge from the wrapper\n component.wrapper.removeChild(component.element);\n\n // Remove the positioned class\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--positioned`\n );\n\n // Add the badge to the document body or another container\n document.body.appendChild(component.element);\n\n // Clear the wrapper reference\n component.wrapper = undefined;\n badgeComponent.wrapper = undefined;\n }\n\n return badgeComponent;\n },\n\n /**\n * Destroys the badge component and cleans up resources\n */\n destroy() {\n lifecycle.destroy();\n\n // If badge is in a wrapper, restore the original DOM structure\n if (component.wrapper) {\n const target = component.wrapper.firstChild as HTMLElement;\n const parent = component.wrapper.parentNode;\n\n if (parent && target) {\n parent.replaceChild(target, component.wrapper);\n }\n }\n },\n\n // Forward basic component methods for API consistency\n addClass: (...classes: string[]) => {\n component.addClass(...classes);\n return badgeComponent;\n },\n removeClass: (...classes: string[]) => {\n component.removeClass(...classes);\n return badgeComponent;\n },\n on: (event: string, handler: Function) => {\n component.on(event, handler);\n return badgeComponent;\n },\n off: (event: string, handler: Function) => {\n component.off(event, handler);\n return badgeComponent;\n },\n };\n\n return badgeComponent;\n };\n",
|
|
44
|
-
"// src/components/badge/badge.ts\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport {\n withEvents,\n withLifecycle\n} from '../../core/compose/features';\nimport { \n withVisibility,\n withVariant,\n withColor, \n withPosition,\n withMax,\n withAttachment\n} from './features';\nimport { withAPI } from './api';\nimport { BadgeConfig, BadgeComponent } from './types';\nimport { createBaseConfig, getElementConfig, getApiConfig } from './config';\n\n/**\n * Creates a new Badge component following Material Design 3 guidelines.\n * \n * The Badge component displays a small circle or numerical indicator to \n * draw attention to items requiring user attention, like notifications \n * or counts. Badges can be attached to any element.\n * \n * @param {BadgeConfig} config - Badge configuration object\n * @returns {BadgeComponent} Badge component instance with methods for\n * managing the badge appearance, content, and visibility\n * \n * @throws {Error} Throws an error if badge creation fails\n * \n * @category Components\n * \n * @example\n * // Create a small dot badge (notification indicator)\n * const notificationBadge = createBadge({ \n * variant: 'small',\n * color: 'error',\n * target: document.querySelector('.icon-button')\n * });\n * \n * @example\n * // Create a large badge with a count (numbered indicator)\n * const countBadge = createBadge({\n * variant: 'large',\n * label: 5,\n * color: 'primary',\n * target: document.querySelector('.notification-icon')\n * });\n * \n * @example\n * // Create a badge with a maximum value\n * const messagesBadge = createBadge({\n * variant: 'large',\n * label: 1250,\n * max: 999, // Will display \"999+\"\n * color: 'info',\n * position: 'bottom-right'\n * });\n * \n * @example\n * // Control badge visibility programmatically\n * const toggleBadge = createBadge({\n * variant: 'small',\n * color: 'success',\n * target: document.querySelector('.toggle-button')\n * });\n * \n * // Toggle badge visibility\n * function toggleNotification() {\n * if (toggleBadge.isVisible()) {\n * toggleBadge.hide();\n * } else {\n * toggleBadge.show();\n * }\n * }\n */\nconst createBadge = (config: BadgeConfig = {}): BadgeComponent => {\n const baseConfig = createBaseConfig(config);\n\n try {\n // Compose the badge component from multiple feature enhancers\n const badge = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withColor(baseConfig),\n withPosition(baseConfig),\n withMax(baseConfig),\n withVisibility(),\n withAttachment(baseConfig),\n withLifecycle(),\n comp => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n\n return badge;\n } catch (error) {\n console.error('Badge creation error:', error);\n throw new Error(`Failed to create badge: ${(error as Error).message}`);\n }\n};\n\nexport default createBadge;",
|
|
45
|
-
"// src/components/badge/index.ts\n\n/**\n * Badge component module\n * @module components/badge\n * @description A small element that communicates status, shows a count,\n * or highlights an element requiring attention.\n */\n\nexport { default } from \"./badge\";\n\nexport type {\n BadgeConfig,\n BadgeComponent,\n BadgeVariant,\n BadgeColor,\n BadgePosition,\n} from \"./types\";\n",
|
|
46
40
|
"// src/core/dom/events.ts\n/**\n * @module core/dom\n * @description DOM manipulation utilities\n */\n\n/**\n * Event manager interface for handling DOM events\n */\nexport interface EventManager {\n /**\n * Add an event listener with options\n * @param event - Event name\n * @param handler - Event handler\n * @param options - addEventListener options\n * @returns EventManager instance for chaining\n */\n on: <T extends Event>(event: string, handler: (e: T) => void, options?: AddEventListenerOptions) => EventManager;\n \n /**\n * Remove an event listener\n * @param event - Event name\n * @param handler - Event handler\n * @returns EventManager instance for chaining\n */\n off: <T extends Event>(event: string, handler: (e: T) => void) => EventManager;\n \n /**\n * Temporarily disable all event listeners\n * @returns EventManager instance for chaining\n */\n pause: () => EventManager;\n \n /**\n * Re-enable all event listeners\n * @returns EventManager instance for chaining\n */\n resume: () => EventManager;\n \n /**\n * Remove all event listeners and clean up\n */\n destroy: () => void;\n \n /**\n * Get all active handlers\n * @returns Map of active handlers\n */\n getHandlers: () => Map<string, HandlerInfo>;\n \n /**\n * Check if a specific handler exists\n * @param event - Event name\n * @param handler - Event handler\n * @returns Whether handler exists\n */\n hasHandler: <T extends Event>(event: string, handler: (e: T) => void) => boolean;\n}\n\n/**\n * Handler information\n */\ninterface HandlerInfo {\n original: EventListener;\n enhanced: EventListener;\n event: string;\n options: AddEventListenerOptions;\n}\n\n/**\n * Creates an event manager to handle DOM events with enhanced functionality.\n * Provides a robust interface for managing event listeners with error handling,\n * cleanup, and lifecycle management.\n *\n * @param element - DOM element to attach events to\n * @returns Event manager interface\n */\nexport const createEventManager = (element: HTMLElement): EventManager => {\n // Store handlers with their metadata\n const handlers = new Map<string, HandlerInfo>();\n\n /**\n * Creates a unique handler identifier\n * @param event - Event name\n * @param handler - EventListener\n * @returns Unique identifier\n */\n const createHandlerId = (event: string, handler: EventListener): string =>\n `${event}_${handler.toString()}`;\n\n /**\n * Wraps an event handler with error boundary and logging\n * @param handler - Original event handler\n * @param event - Event name for error context\n * @returns Enhanced handler with error boundary\n */\n const enhanceHandler = (handler: EventListener, event: string): EventListener => (e: Event) => {\n try {\n handler(e);\n } catch (error) {\n console.error(`Error in ${event} handler:`, error);\n }\n };\n\n /**\n * Safely removes event listener\n * @param event - Event name\n * @param handler - Event handler\n */\n const safeRemoveListener = (event: string, handler: EventListener): void => {\n try {\n element.removeEventListener(event, handler);\n } catch (error) {\n console.warn(`Failed to remove ${event} listener:`, error);\n }\n };\n\n return {\n /**\n * Adds an event listener with options\n * @param event - Event name\n * @param handler - Event handler\n * @param options - addEventListener options\n * @returns EventManager instance for chaining\n */\n on<T extends Event>(event: string, handler: (e: T) => void, options: AddEventListenerOptions = {}): EventManager {\n const enhanced = enhanceHandler(handler as EventListener, event);\n const id = createHandlerId(event, handler as EventListener);\n\n handlers.set(id, {\n original: handler as EventListener,\n enhanced,\n event,\n options\n });\n\n element.addEventListener(event, enhanced, options);\n return this;\n },\n\n /**\n * Removes an event listener\n * @param event - Event name\n * @param handler - Event handler\n * @returns EventManager instance for chaining\n */\n off<T extends Event>(event: string, handler: (e: T) => void): EventManager {\n const id = createHandlerId(event, handler as EventListener);\n const stored = handlers.get(id);\n\n if (stored) {\n safeRemoveListener(event, stored.enhanced);\n handlers.delete(id);\n }\n return this;\n },\n\n /**\n * Temporarily disables all event listeners\n * @returns EventManager instance for chaining\n */\n pause(): EventManager {\n handlers.forEach(({ enhanced, event }) => {\n safeRemoveListener(event, enhanced);\n });\n return this;\n },\n\n /**\n * Re-enables all event listeners\n * @returns EventManager instance for chaining\n */\n resume(): EventManager {\n handlers.forEach(({ enhanced, event, options }) => {\n element.addEventListener(event, enhanced, options);\n });\n return this;\n },\n\n /**\n * Removes all event listeners and cleans up\n */\n destroy(): void {\n handlers.forEach(({ enhanced, event }) => {\n safeRemoveListener(event, enhanced);\n });\n handlers.clear();\n },\n\n /**\n * Gets all active handlers\n * @returns Map of active handlers\n */\n getHandlers(): Map<string, HandlerInfo> {\n return new Map(handlers);\n },\n\n /**\n * Checks if a specific handler exists\n * @param event - Event name\n * @param handler - Event handler\n * @returns Whether handler exists\n */\n hasHandler<T extends Event>(event: string, handler: (e: T) => void): boolean {\n const id = createHandlerId(event, handler as EventListener);\n return handlers.has(id);\n }\n };\n};",
|
|
47
41
|
"// src/core/dom/index.ts\n\nexport { createElement, createSVGElement } from \"./create\";\nexport type { CreateElementOptions } from \"./create\";\n\nexport {\n setAttributes,\n removeAttributes,\n batchAttributes,\n hasAttribute,\n getAttribute,\n} from \"./attributes\";\nexport {\n addClass,\n removeClass,\n toggleClass,\n hasClass,\n normalizeClasses,\n} from \"./classes\";\n\nexport { createEventManager } from \"./events\";\nexport type { EventManager } from \"./events\";\n",
|
|
48
42
|
"// src/components/progress/constants.ts\n\n/**\n * Progress component variants\n */\nexport const PROGRESS_VARIANTS = {\n /** Standard horizontal progress bar */\n LINEAR: \"linear\",\n /** Circular spinner progress indicator */\n CIRCULAR: \"circular\",\n} as const;\n\n/**\n * Progress component shapes (linear only)\n */\nexport const PROGRESS_SHAPES = {\n /** Standard flat progress */\n FLAT: \"flat\",\n /** Wavy animated progress */\n WAVY: \"wavy\",\n} as const;\n\n/**\n * Progress component events\n */\nexport const PROGRESS_EVENTS = {\n /** Fired when progress value changes */\n CHANGE: \"change\",\n /** Fired when progress reaches 100% */\n COMPLETE: \"complete\",\n} as const;\n\n/**\n * Default configuration values\n */\nexport const PROGRESS_DEFAULTS = {\n /** Default progress variant */\n VARIANT: \"linear\",\n /** Initial progress value */\n VALUE: 0,\n /** Maximum progress value */\n MAX: 100,\n /** Buffer value for linear progress with buffer */\n BUFFER: 0,\n /** Default shape for linear indeterminate progress */\n SHAPE: \"flat\",\n /** Whether to show percentage label */\n SHOW_LABEL: false,\n /** Whether progress is indeterminate */\n INDETERMINATE: false,\n} as const;\n\n/**\n * CSS classes for progress elements\n */\nexport const PROGRESS_CLASSES = {\n /** Container element class */\n CONTAINER: \"progress\",\n /** Linear variant class */\n LINEAR: \"progress--linear\",\n /** Circular variant class */\n CIRCULAR: \"progress--circular\",\n /** Track element (unfilled part) class */\n TRACK: \"progress__track\",\n /** Indicator element (filled part) class */\n INDICATOR: \"progress__indicator\",\n /** Buffer element class */\n BUFFER: \"progress__buffer\",\n /** Label element class */\n LABEL: \"progress__label\",\n /** Indeterminate state class */\n INDETERMINATE: \"progress--indeterminate\",\n /** Disabled state class */\n DISABLED: \"progress--disabled\",\n /** Test state class */\n TEST: \"progress--test\",\n TRANSITION: \"progress--transition\",\n} as const;\n\n/**\n * Progress component measurements\n */\nexport const PROGRESS_MEASUREMENTS = {\n LINEAR: {\n MIN_HEIGHT: 4,\n GAP: 4,\n STOP_INDICATOR: 4,\n HEIGHT: 4, // Added default height\n },\n CIRCULAR: {\n SIZE: 48,\n GAP: 8,\n },\n COMMON: {\n // Added common measurements\n STROKE_WIDTH: 4,\n },\n} as const;\n\n/**\n * Thickness presets for progress component\n * These are the standard thickness options following Material Design 3\n */\nexport const PROGRESS_THICKNESS = {\n /** Thin stroke width (4px) - default */\n THIN: 4,\n /** Thick stroke width (8px) */\n THICK: 8,\n} as const;\n\n/**\n * Wave animation parameters for progress components\n */\nexport const PROGRESS_WAVE = {\n /** Linear progress wave parameters */\n LINEAR: {\n /** Base amplitude of the wave in pixels */\n AMPLITUDE: 4,\n /** Speed of wave animation in waves per second (Hz) */\n SPEED: 1,\n /** Number of complete waves per 100 pixels */\n FREQUENCY: 2,\n /** Number of complete waves per 100 pixels for indeterminate */\n INDETERMINATE_FREQUENCY: 4,\n /** Amplitude for indeterminate animation */\n INDETERMINATE_AMPLITUDE: 2,\n /** Wave shape power (lower = rounder peaks, higher = sharper) */\n POWER: 0.8,\n /** Percentage at which wave amplitude reaches full strength from start */\n START_TRANSITION_END: 0,\n /** Percentage at which wave amplitude begins to decrease near end */\n END_TRANSITION_START: 0.92,\n },\n /** Circular progress wave parameters */\n CIRCULAR: {\n /** Amplitude as percentage of radius (7 = 7%) */\n AMPLITUDE: 6,\n /** Amplitude as percentage of radius for indeterminate (4 = 4%) */\n INDETERMINATE_AMPLITUDE: 4,\n /** Speed of wave rotation in rotations per second (Hz), negative value means clockwise */\n SPEED: 1,\n /** Number of complete waves around the circle */\n FREQUENCY: 10,\n /** Number of complete waves for indeterminate animation */\n INDETERMINATE_FREQUENCY: 16,\n /** Wave shape power (lower = rounder peaks, higher = sharper) */\n POWER: 0.8,\n /** Percentage at which wave amplitude reaches full strength from start */\n START_TRANSITION_END: 0,\n /** Percentage at which wave amplitude begins to decrease near end */\n END_TRANSITION_START: 0.92,\n },\n} as const;\n",
|
|
49
43
|
"// src/core/utils/object.ts\n\n/**\n * Checks if a value is a plain object\n * @param value - The value to check\n * @returns true if the value is a plain object\n */\nexport const isObject = (value: unknown): value is Record<string, any> => {\n return Boolean(\n value &&\n typeof value === 'object' &&\n Object.getPrototypeOf(value) === Object.getPrototypeOf({})\n );\n};\n\n/**\n * Accesses a nested property of an object using a string path\n * @param obj - The object to traverse\n * @param path - The property path (e.g. 'user.address.street')\n * @returns The value at the specified path or undefined if not found\n */\nexport const byString = <T extends Record<string, any>, R = any>(obj: T, path: string): R | undefined => {\n // Convert indexes to properties\n const normalizedPath = path.replace(/\\[(\\w+)\\]/g, '.$1');\n // Strip a leading dot\n const cleanPath = normalizedPath.replace(/^\\./, '');\n const keys = cleanPath.split('.');\n \n let result: any = obj;\n \n for (let i = 0, n = keys.length; i < n; ++i) {\n const key = keys[i];\n if (key in result) {\n result = result[key];\n } else {\n return undefined;\n }\n }\n \n return result as R;\n};",
|
|
50
44
|
"/**\n * Result interface for background color lookup\n */\nexport interface BackgroundResult {\n /** The computed background color value */\n color: string;\n /** The element from which the color was obtained */\n element: HTMLElement | null;\n}\n\n/**\n * Gets the computed background color of an element or its ancestors.\n * Recursively traverses the DOM tree upward until it finds a non-transparent background.\n * Resolves CSS variables if used in background color.\n * \n * @param {HTMLElement} element - The starting element to check\n * @param {number} [maxDepth=20] - Maximum number of parent levels to check\n * @returns {BackgroundResult} Object containing the color and source element\n * \n * @example\n * // Get the inherited background color and its source element\n * const { color, element: sourceElement } = getInheritedBackground(myElement);\n * console.log(color); // 'rgb(255, 255, 255)' or '#1c2526' for dark mode\n * \n * // Observe the source element for changes\n * if (sourceElement) {\n * const observer = new MutationObserver(() => {\n * const { color } = getInheritedBackground(myElement);\n * myElement.style.backgroundColor = color;\n * });\n * \n * observer.observe(sourceElement, { attributes: true, attributeFilter: ['style', 'class'] });\n * }\n */\nexport const getInheritedBackground = (element: HTMLElement, maxDepth = 17): BackgroundResult => {\n // Safety checks\n if (!element || !(element instanceof HTMLElement)) {\n return { color: '', element: null };\n }\n\n // Prevent infinite loops\n let depth = 0;\n let currentElement: HTMLElement | null = element;\n\n while (currentElement && depth < maxDepth) {\n // Get computed style\n const computedStyle = window.getComputedStyle(currentElement);\n let bgColor = computedStyle.backgroundColor;\n\n // Resolve CSS variables\n if (bgColor.startsWith('var(')) {\n const varMatch = bgColor.match(/var\\((--[\\w-]+)\\)/);\n if (varMatch) {\n const varName = varMatch[1];\n bgColor = window.getComputedStyle(document.documentElement).getPropertyValue(varName).trim() || 'transparent';\n }\n }\n\n // Check if the background color is set and not transparent\n if (bgColor && \n bgColor !== 'transparent' && \n bgColor !== 'rgba(0, 0, 0, 0)' && \n bgColor !== 'rgba(0,0,0,0)') {\n return { color: bgColor, element: currentElement };\n }\n\n // Move up to parent element\n currentElement = currentElement.parentElement;\n depth++;\n }\n\n // Fall back to document body\n const documentBG = window.getComputedStyle(document.body).backgroundColor;\n if (documentBG !== 'transparent' && documentBG !== 'rgba(0, 0, 0, 0)') {\n return { color: documentBG, element: document.body };\n }\n\n // Default to white\n return { color: 'rgb(255, 255, 255)', element: null };\n};\n\n/**\n * For backwards compatibility\n * @deprecated Use getInheritedBackground instead\n */\nexport const getInheritedBG = (element: HTMLElement, maxDepth = 17): string => {\n return getInheritedBackground(element, maxDepth).color;\n};\n\nexport default getInheritedBackground;",
|
|
51
|
-
"import { PREFIX } from '../config';\n\n// Store callbacks for theme change notifications\ntype ThemeChangeCallback = () => void;\nconst themeChangeCallbacks = new Set<ThemeChangeCallback>();\n\n// Setup theme change observer\nlet themeObserver: MutationObserver | null = null;\n\n/**\n * Setup observer for theme changes on body element\n */\nconst setupThemeObserver = (): void => {\n if (themeObserver) return; // Already set up\n\n themeObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (\n mutation.type === 'attributes' && \n (mutation.attributeName === 'data-theme' || mutation.attributeName === 'data-theme-mode')\n ) {\n // Notify all registered callbacks\n themeChangeCallbacks.forEach(callback => callback());\n break;\n }\n }\n });\n\n //
|
|
45
|
+
"import { PREFIX } from '../config';\n\n// Store callbacks for theme change notifications\ntype ThemeChangeCallback = () => void;\nconst themeChangeCallbacks = new Set<ThemeChangeCallback>();\n\n// Setup theme change observer\nlet themeObserver: MutationObserver | null = null;\n\n/**\n * Setup observer for theme changes on body element\n */\nconst setupThemeObserver = (): void => {\n if (themeObserver) return; // Already set up\n\n themeObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (\n mutation.type === 'attributes' && \n (mutation.attributeName === 'data-theme' || mutation.attributeName === 'data-theme-mode')\n ) {\n // Notify all registered callbacks\n themeChangeCallbacks.forEach(callback => callback());\n break;\n }\n }\n });\n\n // Themes are set with data-theme / data-theme-mode on <html> or on <body>;\n // observe both so a change on either notifies.\n const options = { attributes: true, attributeFilter: ['data-theme', 'data-theme-mode'] };\n themeObserver.observe(document.documentElement, options);\n if (document.body) {\n themeObserver.observe(document.body, options);\n }\n};\n\n/**\n * Register a callback to be notified of theme changes\n * @param callback Function to call when theme changes\n * @returns Function to unregister the callback\n */\nexport const onThemeChange = (callback: ThemeChangeCallback): (() => void) => {\n // Setup observer if not already done\n if (!themeObserver) {\n setupThemeObserver();\n }\n\n themeChangeCallbacks.add(callback);\n \n // Return function to unregister\n return () => {\n themeChangeCallbacks.delete(callback);\n };\n};\n\n/**\n * Gets a theme color from CSS variables, with optional alpha/opacity support.\n * The prefix is automatically added to the variable name.\n * Colors are retrieved from the active theme (defined on body element) if available,\n * falling back to the default theme (defined on :root) if not found.\n *\n * @param {string} varName - The CSS variable name without prefix (e.g. 'sys-color-primary' or 'sys-color-primary-rgb')\n * @param {object} [options] - Options for color retrieval\n * @param {number} [options.alpha] - Alpha value (0-1) for rgba output (only works with --*-rgb variables)\n * @param {string} [options.fallback] - Fallback color if variable is not found\n * @param {ThemeChangeCallback} [options.onThemeChange] - Optional callback for theme changes\n * @returns {string} The color value (hex, rgb, or rgba)\n *\n * @example\n * // Basic usage\n * getThemeColor('sys-color-primary') // '#006493' (from active theme)\n * \n * // With theme change notification\n * getThemeColor('sys-color-primary', {\n * onThemeChange: () => {\n * // Re-render or update component\n * component.update();\n * }\n * });\n */\nexport function getThemeColor(\n varName: string, \n options?: { \n alpha?: number, \n fallback?: string,\n onThemeChange?: ThemeChangeCallback \n }\n): string {\n const prefixedVarName = `--${PREFIX}-${varName}`;\n \n // Register theme change callback if provided\n if (options?.onThemeChange) {\n onThemeChange(options.onThemeChange);\n }\n \n // First try to get the color from the active theme (body element)\n const bodyStyles = getComputedStyle(document.body);\n let value = bodyStyles.getPropertyValue(prefixedVarName).trim();\n \n // If not found in active theme, fall back to default theme (:root)\n if (!value) {\n const rootStyles = getComputedStyle(document.documentElement);\n value = rootStyles.getPropertyValue(prefixedVarName).trim();\n }\n \n // If still not found, use fallback or return empty\n if (!value && options?.fallback) return options.fallback;\n if (!value) return '';\n\n // If alpha is requested and value is rgb (e.g. '103, 80, 164')\n if (typeof options?.alpha === 'number' && /\\d+,\\s*\\d+,\\s*\\d+/.test(value)) {\n return `rgba(${value}, ${options.alpha})`;\n }\n\n // If value is a hex color and alpha is requested, convert to rgba\n if (typeof options?.alpha === 'number' && /^#([\\da-f]{6}|[\\da-f]{3})$/i.test(value)) {\n const hex = value.replace('#', '');\n let r, g, b;\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n } else {\n r = parseInt(hex.substring(0, 2), 16);\n g = parseInt(hex.substring(2, 4), 16);\n b = parseInt(hex.substring(4, 6), 16);\n }\n return `rgba(${r}, ${g}, ${b}, ${options.alpha})`;\n }\n\n return value;\n}\n\n// Cleanup observer when module is unloaded\nif (typeof window !== 'undefined') {\n window.addEventListener('unload', () => {\n if (themeObserver) {\n themeObserver.disconnect();\n themeObserver = null;\n }\n themeChangeCallbacks.clear();\n });\n} ",
|
|
52
46
|
"/**\n * Converts a color to RGBA format with specified opacity\n * Handles hex, rgb, rgba, and named colors\n * \n * @param color - The color string to convert (hex, rgb, rgba, or named color)\n * @param opacity - The opacity value (0-1)\n * @returns RGBA color string\n * \n * @example\n * colorToRGBA('#ff0000', 0.5) // 'rgba(255, 0, 0, 0.5)'\n * colorToRGBA('rgb(255, 0, 0)', 0.5) // 'rgba(255, 0, 0, 0.5)'\n * colorToRGBA('red', 0.5) // 'rgba(255, 0, 0, 0.5)'\n */\nexport const colorToRGBA = (color: string, opacity: number): string => {\n // Create a temporary canvas to get computed color\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return `rgba(0, 0, 0, ${opacity})`;\n \n // Set the color and get computed value\n ctx.fillStyle = color;\n const computedColor = ctx.fillStyle;\n \n // Handle hex colors\n if (computedColor.startsWith('#')) {\n const hex = computedColor.substring(1);\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n \n // Handle rgb/rgba colors\n if (computedColor.startsWith('rgb')) {\n const match = computedColor.match(/\\d+/g);\n if (match) {\n const [r, g, b] = match;\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n }\n \n // Fallback\n return `rgba(0, 0, 0, ${opacity})`;\n}; ",
|
|
53
47
|
"// src/core/utils/index.ts\n\nexport { isObject, byString } from './object';\nexport { normalizeEvent, hasTouchSupport, TOUCH_CONFIG, PASSIVE_EVENTS } from './mobile';\nexport { getInheritedBackground } from './background';\nexport { throttle, debounce, once } from './performance';\nexport { getThemeColor } from './theme';\nexport { colorToRGBA } from './color';\n\n/**\n * Creates a transformer that only runs if a condition is met\n * @param {Function} predicate - Condition to check\n * @param {Function} transformer - Transformer to run if condition is true\n * @returns {Function} Conditional transformer\n */\nexport const when = <T, C>(\n predicate: (obj: T, context: C) => boolean, \n transformer: (obj: T, context: C) => T\n) => \n (obj: T, context: C): T =>\n predicate(obj, context) ? transformer(obj, context) : obj;\n\n/**\n * Joins class names, filtering out falsy values\n * @param {...(string | undefined | null | false)} classes - Class names to join\n * @returns {string} Joined class names\n */\nexport const classNames = (...classes: (string | undefined | null | false)[]): string => \n classes.filter(Boolean).join(' ');",
|
|
54
48
|
"/**\n * Canvas resize utilities\n * Provides utilities for observing and handling canvas resize events\n */\n\n/**\n * Observes resize events on an element and triggers a callback\n * Watches the specified element and debounces resize events\n * \n * @param element - The element to observe for size changes\n * @param canvas - The canvas element (for context)\n * @param onResize - Callback to execute when the element resizes\n * @returns Cleanup function to stop observing\n */\nexport const observeCanvasResize = (\n element: HTMLElement,\n canvas: HTMLCanvasElement,\n onResize: () => void\n): (() => void) => {\n \n let timeoutId: number | null = null;\n \n // Debounced resize handler\n const debouncedResize = (): void => {\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => {\n onResize();\n }, 100);\n };\n \n // Use ResizeObserver if available\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width } = entry.contentRect;\n const currentWidth = parseFloat(canvas.style.width || '0');\n \n // Only trigger if the element actually changed size significantly\n if (Math.abs(width - currentWidth) > 2) {\n debouncedResize();\n }\n }\n });\n \n // Observe the specified element\n observer.observe(element);\n \n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n observer.disconnect();\n };\n } else {\n // Fallback to window resize\n window.addEventListener('resize', debouncedResize);\n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n window.removeEventListener('resize', debouncedResize);\n };\n }\n}; ",
|
|
@@ -60,6 +54,7 @@
|
|
|
60
54
|
"// src/components/progress/config.ts - Simplified for canvas\n\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { ProgressConfig, ProgressThickness, ProgressShape } from \"./types\";\nimport {\n PROGRESS_CLASSES,\n PROGRESS_VARIANTS,\n PROGRESS_SHAPES,\n PROGRESS_THICKNESS,\n PROGRESS_DEFAULTS,\n} from \"./constants\";\n\n/**\n * Default configuration for the Progress component\n */\nexport const defaultConfig: ProgressConfig = {\n variant: PROGRESS_DEFAULTS.VARIANT,\n value: PROGRESS_DEFAULTS.VALUE,\n max: PROGRESS_DEFAULTS.MAX,\n buffer: PROGRESS_DEFAULTS.BUFFER,\n showLabel: PROGRESS_DEFAULTS.SHOW_LABEL,\n thickness: \"thin\",\n shape: PROGRESS_DEFAULTS.SHAPE,\n};\n\n/**\n * Creates the base configuration for the Progress component\n * with all defaults applied (no complex schema needed for canvas)\n *\n * @param config User-provided configuration\n * @returns Complete configuration with defaults\n */\nexport const createBaseConfig = (\n config: ProgressConfig = {}\n): ProgressConfig => {\n // Create configuration with defaults - no schema needed for canvas approach\n return createComponentConfig(\n defaultConfig,\n config,\n \"progress\"\n ) as ProgressConfig;\n};\n\n/**\n * Generates element configuration for the Progress container\n * Canvas will be added by withCanvas feature\n *\n * @param {ProgressConfig} config - Progress configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: ProgressConfig) => {\n const isIndeterminate = config.indeterminate === true;\n const isCircular = config.variant === PROGRESS_VARIANTS.CIRCULAR;\n\n // Create the attributes object\n const attributes: Record<string, any> = {\n role: \"progressbar\",\n \"aria-valuemin\": \"0\",\n \"aria-valuemax\": (config.max || 100).toString(),\n };\n\n // Only add aria-valuenow if not indeterminate\n if (!isIndeterminate && config.value !== undefined) {\n attributes[\"aria-valuenow\"] = config.value.toString();\n }\n\n // Only add disabled attribute if it's explicitly true\n if (config.disabled === true) {\n attributes[\"aria-disabled\"] = \"true\";\n }\n\n // Build class list\n const classList = [\n config.class,\n PROGRESS_CLASSES.CONTAINER,\n isCircular ? PROGRESS_CLASSES.CIRCULAR : PROGRESS_CLASSES.LINEAR,\n ].filter(Boolean);\n\n // Add shape class for linear progress\n if (!isCircular && config.shape && config.shape !== PROGRESS_SHAPES.FLAT) {\n classList.push(`${PROGRESS_CLASSES.CONTAINER}--${config.shape}`);\n }\n\n return createElementConfig(config, {\n tag: \"div\",\n attributes,\n className: classList,\n });\n};\n\n/**\n * Creates API configuration for the Progress component\n */\nexport const getApiConfig = (comp) => {\n // Use component's state directly\n if (!comp.state) {\n comp.state = {\n value: 0,\n max: 100,\n buffer: 0,\n indeterminate: false,\n thickness: \"thin\",\n shape: PROGRESS_DEFAULTS.SHAPE,\n labelFormatter: (v, m) => `${Math.round((v / m) * 100)}%`,\n };\n }\n\n return {\n value: {\n getValue: () => comp.state.value,\n setValue: (value: number) => {\n if (comp.state) {\n // Clamp value between 0 and max\n const clampedValue = Math.max(0, Math.min(comp.state.max, value));\n // Store the previous value for animation\n comp.state.previousValue = comp.state.value;\n // Update the state value\n comp.state.value = clampedValue;\n // Update label if it exists\n if (comp.state.label) {\n comp.state.label.textContent = comp.state.labelFormatter(\n clampedValue,\n comp.state.max\n );\n }\n // Trigger animation through canvas component\n if (typeof comp.setValue === \"function\") {\n comp.setValue(clampedValue);\n } else if (comp.draw) {\n // Fallback to immediate redraw if setValue is not available\n comp.draw();\n }\n }\n },\n getMax: () => comp.state.max,\n },\n buffer: {\n getBuffer: () => comp.state.buffer,\n setBuffer: (value: number) => {\n comp.state.buffer = Math.max(0, Math.min(comp.state.max, value));\n },\n },\n disabled: {\n enable: () => comp.disabled?.enable?.() || undefined,\n disable: () => comp.disabled?.disable?.() || undefined,\n isDisabled: () => comp.disabled?.isDisabled?.() || false,\n },\n label: {\n show: () => {\n if (!comp.state.label) {\n const label = document.createElement(\"div\");\n label.className = `${comp.getClass(PROGRESS_CLASSES.LABEL)}`;\n label.textContent = comp.state.labelFormatter(\n comp.state.value,\n comp.state.max\n );\n comp.element.appendChild(label);\n comp.state.label = label;\n comp.label = label;\n }\n },\n hide: () => {\n if (comp.state.label) {\n comp.state.label.remove();\n comp.state.label = undefined;\n comp.label = undefined;\n }\n },\n format: (formatter) => {\n comp.state.labelFormatter = formatter;\n },\n formatter: comp.state.labelFormatter,\n },\n thickness: {\n getThickness: () => {\n const thickness = comp.state.thickness;\n if (thickness === \"thin\") {\n return PROGRESS_THICKNESS.THIN;\n } else if (thickness === \"thick\") {\n return PROGRESS_THICKNESS.THICK;\n } else if (typeof thickness === \"number\") {\n return thickness;\n }\n return PROGRESS_THICKNESS.THIN;\n },\n setThickness: (thickness: ProgressThickness) => {\n comp.state.thickness = thickness;\n if (comp.draw) {\n comp.draw();\n }\n },\n },\n shape: {\n getShape: () => comp.state.shape,\n setShape: (shape: ProgressShape) => {\n comp.state.shape = shape;\n if (comp.setShape) {\n comp.setShape(shape);\n }\n },\n },\n state: {\n setIndeterminate: (indeterminate: boolean) => {\n if (comp.state) {\n comp.state.indeterminate = indeterminate;\n if (typeof comp.setIndeterminate === \"function\") {\n comp.setIndeterminate(indeterminate);\n } else if (comp.draw) {\n comp.draw();\n }\n }\n },\n isIndeterminate: () => comp.state.indeterminate,\n },\n lifecycle: {\n destroy: () => comp.lifecycle?.destroy?.() || undefined,\n },\n };\n};\n\nexport default defaultConfig;\n",
|
|
61
55
|
"// src/components/progress/progress.ts\n\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withVariant,\n withDisabled,\n withLifecycle,\n} from \"../../core/compose/features\";\nimport { withCanvas } from \"./features/canvas\";\nimport { withState } from \"./features/state\";\nimport { withAPI } from \"./api\";\nimport { ProgressConfig, ProgressComponent } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new Progress component using canvas rendering\n * @param {ProgressConfig} config - Progress configuration object\n * @returns {ProgressComponent} Progress component instance\n *\n * @example\n * ```ts\n * // Create a linear determinate progress bar\n * const progress = createProgress({\n * variant: 'linear',\n * value: 42,\n * showLabel: true\n * });\n *\n * // Create an indeterminate circular progress\n * const loader = createProgress({\n * variant: 'circular',\n * indeterminate: true\n * });\n * ```\n */\nconst createProgress = (config: ProgressConfig = {}): ProgressComponent => {\n // Create base configuration\n const baseConfig = createBaseConfig(config);\n\n try {\n // Create the component with the pipe pattern using canvas instead of complex DOM\n const component = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)), // Simple container element\n withVariant(baseConfig), // Add variant classes\n withDisabled(baseConfig), // Add disabled state\n withState(baseConfig), // Add state management first\n withCanvas(baseConfig), // Add canvas rendering after state\n (comp) => {\n // Add API after both state and canvas\n return withAPI(getApiConfig(comp))(comp);\n },\n withLifecycle()\n )(baseConfig);\n\n // Initialize the component lifecycle if it has an init method\n if (component.lifecycle?.init) {\n component.lifecycle.init();\n }\n\n return component;\n } catch (error) {\n console.error(\"Progress creation error:\", error);\n throw new Error(`Failed to create progress: ${(error as Error).message}`);\n }\n};\n\nexport default createProgress;\n",
|
|
62
56
|
"// src/components/button/features/progress.ts\nimport type { ProgressConfig, ProgressComponent } from \"../../progress/types\";\nimport { addClass, removeClass } from \"../../../core/dom\";\nimport { ButtonConfig } from \"../types\";\n\n/**\n * Component with progress capabilities\n */\ninterface ProgressEnhancedComponent {\n element: HTMLElement;\n icon?: any;\n getClass: (name: string) => string;\n progress?: ProgressComponent;\n disabled?: {\n enable: () => void;\n disable: () => void;\n };\n setText?: (text: string) => any;\n getText?: () => string;\n [key: string]: any;\n}\n\n/**\n * Dynamically imports and creates a progress component\n * @param config Progress configuration\n * @returns Promise resolving to the progress component\n */\nconst createProgressLazy = async (\n config: ProgressConfig\n): Promise<ProgressComponent> => {\n // Dynamic import directly from progress.ts to avoid index re-exports\n const { default: createProgress } = await import(\"../../progress/progress\");\n return createProgress(config);\n};\n\n/**\n * Adds progress functionality to a button component\n *\n * @param config - Button configuration with progress options\n * @returns Component enhancer function\n */\nexport const withProgress =\n (config: ButtonConfig) =>\n (component: ProgressEnhancedComponent): ProgressEnhancedComponent => {\n // Skip if no progress config\n if (!config.progress) {\n return component;\n }\n\n // Extract event handlers if present\n let progressEventHandlers: Record<string, Function> = {};\n\n // Determine progress configuration\n const progressConfig: ProgressConfig =\n typeof config.progress === \"boolean\"\n ? { variant: \"circular\", size: 20, thickness: 2, indeterminate: true }\n : (() => {\n const { on, ...restConfig } = config.progress as any;\n if (on) {\n progressEventHandlers = on;\n }\n return {\n variant: \"circular\",\n size: 20,\n thickness: 2,\n indeterminate: true,\n ...restConfig,\n };\n })();\n\n // Progress will be created lazily\n let progress: ProgressComponent | null = null;\n let progressPromise: Promise<ProgressComponent> | null = null;\n let isLoading = false;\n let originalText = \"\";\n\n // Helper to ensure progress is loaded\n const ensureProgress = async (): Promise<ProgressComponent> => {\n if (progress) return progress;\n\n if (!progressPromise) {\n progressPromise = createProgressLazy(progressConfig).then((p) => {\n progress = p;\n\n // Add button-specific class to the progress element\n addClass(progress.element, component.getClass(\"button-progress\"));\n\n // Initially hide progress\n progress.element.style.display = \"none\";\n\n // Attach event handlers if any were provided\n Object.entries(progressEventHandlers).forEach(([event, handler]) => {\n progress!.on(event, handler);\n });\n\n // Store progress reference\n component.progress = progress;\n\n return progress;\n });\n }\n\n return progressPromise;\n };\n\n // Helper to get insertion point for progress\n const getProgressInsertionPoint = () => {\n // Try to insert after icon if it exists\n const iconElement = component.element.querySelector(\n `.${component.getClass(\"button-icon\")}`\n );\n if (iconElement && iconElement.nextSibling) {\n return iconElement.nextSibling;\n }\n\n // Otherwise insert at the beginning\n return component.element.firstChild;\n };\n\n // Add progress methods that lazy-load the progress component\n component.showProgress = async function () {\n const p = await ensureProgress();\n\n if (p.element) {\n // Ensure progress element is in the DOM\n if (!component.element.contains(p.element)) {\n const insertPoint = getProgressInsertionPoint();\n if (insertPoint) {\n component.element.insertBefore(p.element, insertPoint);\n } else {\n component.element.appendChild(p.element);\n }\n }\n\n p.element.style.display = \"\";\n addClass(\n component.element,\n `${component.getClass(\"button\")}--progress`\n );\n\n // Hide the icon if it exists\n const iconElement = component.element.querySelector(\n `.${component.getClass(\"button-icon\")}`\n );\n if (iconElement instanceof HTMLElement) {\n iconElement.style.display = \"none\";\n }\n }\n return component;\n };\n\n // Synchronous wrapper for convenience\n component.showProgressSync = function () {\n component.showProgress();\n return component;\n };\n\n component.hideProgress = async function () {\n // If progress hasn't been created yet, just return\n if (!progress) return component;\n\n progress.element.style.display = \"none\";\n removeClass(\n component.element,\n `${component.getClass(\"button\")}--progress`\n );\n\n // Show the icon again if it exists\n const iconElement = component.element.querySelector(\n `.${component.getClass(\"button-icon\")}`\n );\n if (iconElement instanceof HTMLElement) {\n iconElement.style.display = \"\";\n }\n\n return component;\n };\n\n // Synchronous wrapper\n component.hideProgressSync = function () {\n component.hideProgress();\n return component;\n };\n\n component.setProgress = async function (value: number) {\n const p = await ensureProgress();\n p.setValue(value);\n return component;\n };\n\n // Synchronous wrapper\n component.setProgressSync = function (value: number) {\n component.setProgress(value);\n return component;\n };\n\n component.setIndeterminate = async function (indeterminate: boolean) {\n const p = await ensureProgress();\n p.setIndeterminate(indeterminate);\n return component;\n };\n\n // Synchronous wrapper\n component.setIndeterminateSync = function (indeterminate: boolean) {\n component.setIndeterminate(indeterminate);\n return component;\n };\n\n component.setLoading = async function (loading: boolean, text?: string) {\n if (loading && !isLoading) {\n // Store original text if we have setText method\n if (component.setText && component.getText) {\n originalText = component.getText();\n }\n isLoading = true;\n await component.showProgress();\n // Call disable on the internal disabled manager\n if (component.disabled?.disable) {\n component.disabled.disable();\n }\n if (text && component.setText) {\n component.setText(text);\n }\n } else if (!loading && isLoading) {\n isLoading = false;\n await component.hideProgress();\n // Call enable on the internal disabled manager\n if (component.disabled?.enable) {\n component.disabled.enable();\n }\n if (text && component.setText) {\n component.setText(text);\n } else if (originalText && component.setText) {\n component.setText(originalText);\n }\n }\n return component;\n };\n\n // Synchronous wrapper - most commonly used\n component.setLoadingSync = function (loading: boolean, text?: string) {\n component.setLoading(loading, text);\n return component;\n };\n\n // Update destroy to clean up progress if it was created\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy;\n component.lifecycle.destroy = () => {\n if (progress) {\n progress.destroy();\n }\n if (progress && progress.element.parentNode) {\n progress.element.parentNode.removeChild(progress.element);\n }\n originalDestroy();\n };\n }\n\n // If showProgress is true, initialize immediately\n if (config.showProgress) {\n ensureProgress().then(() => {\n component.showProgress();\n });\n }\n\n return component;\n };\n",
|
|
57
|
+
"// src/components/button/features/toggle.ts\nimport { ButtonConfig } from \"../types\";\n\n/**\n * Toggle state manager\n * @category Components\n */\nexport interface ToggleManager {\n /** Sets the selected state */\n setSelected: (selected: boolean) => void;\n /** Whether the button is selected */\n isSelected: () => boolean;\n}\n\n/**\n * Component with the elements the toggle feature needs\n * @internal\n */\ninterface ToggleableComponent {\n element: HTMLElement;\n getClass: (name: string) => string;\n emit?: (event: string, data?: unknown) => unknown;\n}\n\n/**\n * Component enhanced with toggle capabilities\n * @category Components\n */\nexport interface ToggleComponent {\n toggle: ToggleManager;\n}\n\n/**\n * Turns a button into an M3 toggle button: a click flips the selected\n * state, the element carries `aria-pressed`, and the `--toggle` and\n * `--selected` classes drive the selected colours and the shape swap.\n *\n * Emits a `change` event with `{ selected }` when the user toggles it.\n * With `toggleOnClick: false` the click does nothing and a container\n * (button group) drives the state through `setSelected`.\n *\n * @param config - Button configuration (`toggle`, `selected`, `toggleOnClick`)\n * @returns Component enhancer\n * @category Components\n */\nexport const withToggle =\n (config: ButtonConfig) =>\n <C extends ToggleableComponent>(component: C): C & Partial<ToggleComponent> => {\n if (!config.toggle) {\n return component;\n }\n\n const { element } = component;\n const buttonClass = component.getClass(\"button\");\n let selected = false;\n\n const apply = (next: boolean): void => {\n selected = next;\n element.classList.toggle(`${buttonClass}--selected`, next);\n element.setAttribute(\"aria-pressed\", String(next));\n };\n\n element.classList.add(`${buttonClass}--toggle`);\n apply(config.selected === true);\n\n if (config.toggleOnClick !== false) {\n element.addEventListener(\"click\", () => {\n if ((element as HTMLButtonElement).disabled) return;\n apply(!selected);\n component.emit?.(\"change\", { selected });\n });\n }\n\n return {\n ...component,\n toggle: {\n setSelected: (next: boolean) => {\n if (next !== selected) apply(next);\n },\n isSelected: () => selected,\n },\n };\n };\n",
|
|
63
58
|
"// src/core/state/store.ts\n\nimport { createEmitter, Emitter } from './emitter';\n\n/**\n * State store options\n */\nexport interface StoreOptions<T> {\n /**\n * Middleware functions that process state changes\n */\n middleware?: Array<(newState: T, oldState: T) => T>;\n}\n\n/**\n * State selector function type\n */\nexport type Selector<T, R> = (state: T) => R;\n\n/**\n * State computation function type for derived state\n */\nexport type Computation<T, R> = (state: T) => R;\n\n/**\n * State updater function type\n */\nexport type Updater<T> = (state: T) => T;\n\n/**\n * State store interface\n */\nexport interface Store<T> {\n /**\n * Gets current state including derived values\n * @returns Current state\n */\n getState: () => T;\n \n /**\n * Updates state\n * @param update - State update object or updater function\n */\n setState: (update: Partial<T> | Updater<T>) => void;\n \n /**\n * Subscribes to state changes\n * @param listener - Change listener\n * @returns Unsubscribe function\n */\n subscribe: (listener: (state: T, oldState: T) => void) => () => void;\n \n /**\n * Creates a derived state value\n * @param key - Derived state key\n * @param computation - Function to compute derived value\n * @returns Function to remove derived state\n */\n derive: <K extends string, R>(key: K, computation: Computation<T, R>) => () => void;\n \n /**\n * Selects a specific slice of state\n * @param selector - State selector function\n * @returns Selected state\n */\n select: <R>(selector: Selector<T, R>) => R;\n \n /**\n * Resets state to initial values\n */\n reset: () => void;\n}\n\n/**\n * Creates a state store with support for derived state and middleware\n * \n * @param initialState - Initial state object\n * @param options - Store options\n * @returns State store interface\n */\nexport const createStore = <T extends Record<string, any>>(\n initialState: T = {} as T, \n options: StoreOptions<T> = {}\n): Store<T> => {\n let state = { ...initialState };\n const emitter: Emitter = createEmitter();\n const derivedStates = new Map<string, Computation<T, any>>();\n const middleware = options.middleware || [];\n\n const notifyListeners = (newState: T, oldState: T): void => {\n emitter.emit('change', newState, oldState);\n };\n\n const applyMiddleware = (newState: T, oldState: T): T => {\n return middleware.reduce((state, fn) => fn(state, oldState), newState);\n };\n\n return {\n /**\n * Gets current state including derived values\n * @returns Current state\n */\n getState: (): T => {\n const derivedValues: Record<string, any> = {};\n derivedStates.forEach((compute, key) => {\n derivedValues[key] = compute(state);\n });\n return { ...state, ...derivedValues };\n },\n\n /**\n * Updates state\n * @param update - State update object or updater function\n */\n setState: (update: Partial<T> | Updater<T>): void => {\n const oldState = { ...state };\n const newState = typeof update === 'function' \n ? update(state)\n : { ...state, ...update };\n\n state = applyMiddleware(newState as T, oldState);\n notifyListeners(state, oldState);\n },\n\n /**\n * Subscribes to state changes\n * @param listener - Change listener\n * @returns Unsubscribe function\n */\n subscribe: (listener: (state: T, oldState: T) => void): (() => void) => \n emitter.on('change', listener),\n\n /**\n * Creates a derived state value\n * @param key - Derived state key\n * @param computation - Function to compute derived value\n * @returns Function to remove derived state\n */\n derive: <K extends string, R>(key: K, computation: Computation<T, R>): (() => void) => {\n derivedStates.set(key, computation);\n return () => {\n derivedStates.delete(key);\n };\n },\n\n /**\n * Selects a specific slice of state\n * @param selector - State selector function\n * @returns Selected state\n */\n select: <R>(selector: Selector<T, R>): R => selector(state),\n\n /**\n * Resets state to initial values\n */\n reset: (): void => {\n state = { ...initialState };\n notifyListeners(state, {} as T);\n }\n };\n};\n\n/**\n * Example middleware that logs state changes\n * \n * @param newState - New state after change\n * @param oldState - Previous state before change\n * @returns Processed state (unchanged in this middleware)\n */\nexport const loggingMiddleware = <T extends Record<string, any>>(newState: T, oldState: T): T => {\n console.log('State change:', { \n old: oldState, \n new: newState, \n diff: Object.keys(newState).reduce((acc, key) => {\n if (newState[key] !== oldState[key]) {\n acc[key] = { from: oldState[key], to: newState[key] };\n }\n return acc;\n }, {} as Record<string, { from: any; to: any }>)\n });\n return newState;\n};\n\n/**\n * Creates a derived state selector for filtering objects\n * \n * @param predicate - Filter predicate function\n * @returns Computation function for derived state\n */\nexport const deriveFiltered = <T>(predicate: (value: any, key: string) => boolean) => \n (state: Record<string, T>): Record<string, T> => \n Object.keys(state).reduce((acc, key) => {\n if (predicate(state[key], key)) {\n acc[key] = state[key];\n }\n return acc;\n }, {} as Record<string, T>);",
|
|
64
59
|
"// src/core/state/lifecycle.ts\n\nimport { createEmitter, Emitter } from './emitter';\n\n/**\n * Component managers that can be managed by the lifecycle\n */\nexport interface LifecycleManagers {\n events?: {\n destroy: () => void;\n };\n text?: {\n getElement: () => HTMLElement | null;\n };\n icon?: {\n getElement: () => HTMLElement | null;\n };\n [key: string]: any;\n}\n\n/**\n * Lifecycle manager interface\n */\nexport interface LifecycleManager {\n /**\n * Registers a handler for mount event\n * @param handler - Function to call when component is mounted\n * @returns Unsubscribe function\n */\n onMount: (handler: () => void) => () => void;\n \n /**\n * Registers a handler for unmount event\n * @param handler - Function to call when component is unmounted\n * @returns Unsubscribe function\n */\n onUnmount: (handler: () => void) => () => void;\n \n /**\n * Mounts the component\n */\n mount: () => void;\n \n /**\n * Unmounts the component\n */\n unmount: () => void;\n \n /**\n * Checks if component is mounted\n * @returns true if mounted\n */\n isMounted: () => boolean;\n \n /**\n * Destroys the component\n */\n destroy: () => void;\n}\n\n/**\n * Creates a lifecycle manager for a component\n * \n * @param element - Component's DOM element\n * @param managers - Optional component managers to integrate with lifecycle\n * @returns Lifecycle manager interface\n */\nexport const createLifecycle = (\n element: HTMLElement, \n managers: LifecycleManagers = {}\n): LifecycleManager => {\n let mounted = false;\n const emitter: Emitter = createEmitter();\n\n return {\n // Mount/Unmount state management\n onMount: (handler: () => void) => emitter.on('mount', handler),\n onUnmount: (handler: () => void) => emitter.on('unmount', handler),\n \n mount: () => {\n if (!mounted) {\n mounted = true;\n emitter.emit('mount');\n }\n },\n\n unmount: () => {\n if (mounted) {\n mounted = false;\n emitter.emit('unmount');\n emitter.clear();\n }\n },\n\n isMounted: () => mounted,\n\n // Cleanup and destruction\n destroy() {\n // First trigger unmount\n if (mounted) {\n this.unmount();\n }\n\n // Clean up all event listeners\n if (managers.events) {\n managers.events.destroy();\n }\n \n // Clean up text element\n if (managers.text) {\n const textElement = managers.text.getElement();\n if (textElement) {\n textElement.remove();\n }\n }\n \n // Clean up icon element\n if (managers.icon) {\n const iconElement = managers.icon.getElement();\n if (iconElement) {\n iconElement.remove();\n }\n }\n \n // Remove the main element\n if (element) {\n element.remove();\n }\n }\n };\n};",
|
|
65
60
|
"// src/core/state/disabled.ts\n\n/**\n * Disabled state manager interface\n */\nexport interface DisabledState {\n /**\n * Enables the element\n * @returns DisabledState instance for chaining\n */\n enable(): DisabledState;\n \n /**\n * Disables the element\n * @returns DisabledState instance for chaining\n */\n disable(): DisabledState;\n \n /**\n * Toggles the disabled state\n * @returns DisabledState instance for chaining\n */\n toggle(): DisabledState;\n \n /**\n * Checks if the element is disabled\n * @returns true if disabled\n */\n isDisabled(): boolean;\n}\n\n/**\n * Creates a controller for managing the disabled state of an element\n * \n * @param element - The element to control\n * @returns Disabled state controller\n */\nexport const createDisabled = (element: HTMLElement): DisabledState => {\n return {\n /**\n * Enables the element\n * @returns DisabledState instance for chaining\n */\n enable() {\n (element as HTMLButtonElement | HTMLInputElement).disabled = false;\n element.removeAttribute('disabled');\n return this;\n },\n\n /**\n * Disables the element\n * @returns DisabledState instance for chaining\n */\n disable() {\n (element as HTMLButtonElement | HTMLInputElement).disabled = true;\n element.setAttribute('disabled', 'true');\n return this;\n },\n\n /**\n * Toggles the disabled state\n * @returns DisabledState instance for chaining\n */\n toggle() {\n if ((element as HTMLButtonElement | HTMLInputElement).disabled) {\n this.enable();\n } else {\n this.disable();\n }\n return this;\n },\n\n /**\n * Checks if the element is disabled\n * @returns true if disabled\n */\n isDisabled() {\n return (element as HTMLButtonElement | HTMLInputElement).disabled === true;\n }\n };\n};",
|
|
@@ -68,31 +63,44 @@
|
|
|
68
63
|
"import { getThemeColor } from '../utils';\n\n/**\n * Common canvas context interface used by components\n */\nexport interface CanvasContext {\n canvas: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n width: number;\n height: number;\n pixelRatio: number;\n}\n\n/**\n * Creates and initializes a canvas context with proper pixel ratio handling\n * \n * @param canvas - The canvas element\n * @param width - Canvas width\n * @param height - Canvas height\n * @returns Initialized canvas context\n */\nexport const createCanvasContext = (\n canvas: HTMLCanvasElement, \n width: number, \n height: number\n): CanvasContext => {\n const pixelRatio = window.devicePixelRatio || 1;\n const ctx = canvas.getContext('2d')!;\n \n // Set display size\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n \n // Set actual size with pixel ratio\n canvas.width = Math.round(width * pixelRatio);\n canvas.height = Math.round(height * pixelRatio);\n \n // Scale context to match pixel ratio\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.scale(pixelRatio, pixelRatio);\n \n return {\n canvas,\n ctx,\n width,\n height,\n pixelRatio\n };\n};\n\n/**\n * Updates canvas dimensions while preserving pixel ratio\n * \n * @param context - The canvas context to update\n * @param width - New width\n * @param height - New height\n */\nexport const updateCanvasDimensions = (\n context: CanvasContext,\n width: number,\n height: number\n): void => {\n const { canvas, ctx, pixelRatio } = context;\n \n // Update display size\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n \n // Update actual size with pixel ratio\n canvas.width = Math.round(width * pixelRatio);\n canvas.height = Math.round(height * pixelRatio);\n \n // Update context dimensions\n context.width = width;\n context.height = height;\n \n // Reapply scale transform\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.scale(pixelRatio, pixelRatio);\n};\n\n/**\n * Tries to initialize a canvas with retry mechanism\n * \n * @param initFn - Function that performs initialization\n * @param onSuccess - Optional callback on successful initialization\n * @returns Whether initialization was immediately successful\n */\nexport const initializeCanvasWithRetry = (\n initFn: () => boolean,\n onSuccess?: () => void\n): boolean => {\n // Try to initialize immediately\n if (initFn()) {\n onSuccess?.();\n return true;\n }\n \n // Retry with requestAnimationFrame\n requestAnimationFrame(() => {\n if (initFn()) {\n onSuccess?.();\n } else {\n // Final retry with setTimeout\n setTimeout(() => {\n if (initFn()) {\n onSuccess?.();\n }\n }, 100);\n }\n });\n \n return false;\n};\n\n/**\n * Creates a theme observer that triggers a callback on theme changes\n * \n * @param color - The theme color to observe (e.g., 'primary', 'secondary')\n * @param callback - Function to call when theme changes\n * @returns Cleanup function or null\n */\nexport const createCanvasThemeObserver = (\n color: string,\n callback: () => void\n): (() => void) | null => {\n const cleanup = getThemeColor(`sys-color-${color}`, { \n onThemeChange: callback \n });\n return typeof cleanup === 'function' ? cleanup : null;\n};\n\n/**\n * Standard animation frame manager for components\n */\nexport class AnimationFrameManager {\n private animationId: number | null = null;\n \n /**\n * Starts an animation loop\n * @param callback - Animation callback receiving timestamp\n */\n start(callback: (timestamp: number) => void): void {\n this.stop();\n \n const animate = (timestamp: number) => {\n callback(timestamp);\n this.animationId = requestAnimationFrame(animate);\n };\n \n this.animationId = requestAnimationFrame(animate);\n }\n \n /**\n * Stops the animation loop\n */\n stop(): void {\n if (this.animationId !== null) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n }\n \n /**\n * Whether animation is currently running\n */\n get isRunning(): boolean {\n return this.animationId !== null;\n }\n}\n\n/**\n * Manages multiple cleanup functions for components\n */\nexport class CleanupManager {\n private cleanupFunctions: Array<() => void> = [];\n \n /**\n * Adds a cleanup function\n */\n add(cleanup: (() => void) | null | undefined): void {\n if (cleanup) {\n this.cleanupFunctions.push(cleanup);\n }\n }\n \n /**\n * Runs all cleanup functions and clears the list\n */\n cleanup(): void {\n this.cleanupFunctions.forEach(fn => fn());\n this.cleanupFunctions = [];\n }\n}\n\n/**\n * Creates a standard canvas element with common styles\n * \n * @param className - CSS class name for the canvas\n * @param additionalStyles - Additional styles to apply\n * @returns Canvas element\n */\nexport const createStyledCanvas = (\n className: string,\n additionalStyles: Partial<CSSStyleDeclaration> = {}\n): HTMLCanvasElement => {\n const canvas = document.createElement('canvas');\n canvas.className = className;\n \n Object.assign(canvas.style, {\n position: 'absolute',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n ...additionalStyles\n });\n \n return canvas;\n}; ",
|
|
69
64
|
"/**\n * Canvas utilities for high-performance rendering\n * Provides tools for drawing, animation, and resize handling\n */\n\nexport * from './drawing';\nexport * from './resize';\nexport * from './animation';\nexport * from './utils'; ",
|
|
70
65
|
"// src/core/index.ts\n/**\n * @module core\n * @description Core utilities and building blocks for the component system\n *\n * This module provides the foundational elements used to build components\n * in a functional, composable way.\n *\n * @packageDocumentation\n */\n\n// Re-export core modules by category\n// This makes imports cleaner for library users while maintaining an organized codebase\n\n// 1. Component composition system\nexport * from \"./compose\";\n\n// 2. DOM manipulation utilities\nexport * from \"./dom\";\n\n// 3. State management\n// Explicit re-exports to avoid ambiguity\nexport { createEmitter } from \"./state/emitter\";\nexport type { Emitter, EventCallback } from \"./state/emitter\";\n\nexport { createComponentConfig, createElementConfig } from \"./config/component\";\n\nexport { createStore, loggingMiddleware, deriveFiltered } from \"./state/store\";\nexport type {\n Store,\n StoreOptions,\n Selector,\n Computation,\n Updater,\n} from \"./state/store\";\n\nexport { createLifecycle } from \"./state/lifecycle\";\nexport type { LifecycleManager, LifecycleManagers } from \"./state/lifecycle\";\n\nexport { createDisabled } from \"./state/disabled\";\nexport type { DisabledState } from \"./state/disabled\";\n\n// Renamed to avoid conflict with DOM's createEventManager\nexport { createEventManager as createStateEventManager } from './state/events';\nexport type { EventManagerState } from './state/events';\n\n// Canvas utilities\nexport * from \"./canvas\";\n\n// Canvas utilities\nexport * from \"./canvas\";\n\n// Config and constants\nexport {\n PREFIX,\n COMPONENTS,\n STATES,\n classNames,\n getComponentClass,\n getModifierClass,\n getElementClass,\n} from \"./config\";\n\n// Export global configuration system\nexport {\n setComponentDefaults,\n getComponentDefaults,\n setGlobalDefaults,\n clearGlobalDefaults,\n type ComponentConfigMap,\n} from \"./config/global\";\n\n// Utility functions\nexport {\n when,\n classNames as joinClasses,\n isObject,\n byString,\n hasTouchSupport,\n normalizeEvent,\n throttle,\n debounce,\n once,\n getInheritedBackground,\n} from \"./utils\";\n\n// Type re-exports for better developer experience\nexport type {\n ThemeConfig,\n ComponentConfig,\n ThemedComponentConfig,\n VariantComponentConfig,\n StateComponentConfig,\n} from \"./config\";\n\nexport type { NormalizedEvent } from \"./utils/mobile\";\n\n// Re-export useful TypeScript types\n",
|
|
71
|
-
"// src/components/button/api.ts\nimport { ButtonComponent } from \"./types\";\nimport { addClass } from \"../../core\";\nimport { ProgressComponent } from \"../progress/types\";\n\n/**\n * API configuration options for button component\n * @category Components\n * @internal\n */\ninterface ApiOptions {\n disabled: {\n enable: () => void;\n disable: () => void;\n isDisabled: () => boolean;\n };\n lifecycle: {\n destroy: () => void;\n };\n}\n\n/**\n * Component with required elements and methods for API enhancement\n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n element: HTMLElement;\n text: {\n setText: (content: string) => void;\n getText: () => string;\n getElement: () => HTMLElement | null;\n };\n icon: {\n setIcon: (html: string) => void;\n getIcon: () => string;\n getElement: () => HTMLElement | null;\n };\n getClass: (name: string) => string;\n componentName?: string;\n on?: (event: string, handler: Function) => ComponentWithElements;\n off?: (event: string, handler: Function) => ComponentWithElements;\n addClass?: (...classes: string[]) => ComponentWithElements;\n\n // Progress methods (if withProgress was applied)\n progress?: ProgressComponent;\n showProgress?: () => Promise<ComponentWithElements>;\n showProgressSync?: () => ComponentWithElements;\n hideProgress?: () => Promise<ComponentWithElements>;\n hideProgressSync?: () => ComponentWithElements;\n setProgress?: (value: number) => Promise<ComponentWithElements>;\n setProgressSync?: (value: number) => ComponentWithElements;\n setIndeterminate?: (indeterminate: boolean) => Promise<ComponentWithElements>;\n setIndeterminateSync?: (indeterminate: boolean) => ComponentWithElements;\n setLoading?: (\n loading: boolean,\n text?: string,\n ) => Promise<ComponentWithElements>;\n setLoadingSync?: (loading: boolean, text?: string) => ComponentWithElements;\n}\n\n/**\n * Enhances a button component with API methods.\n * This follows the higher-order function pattern to add public API methods\n * to the component, making them available to the end user.\n *\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @category Components\n * @internal This is an internal utility for the Button component\n */\nexport const withAPI =\n ({ disabled, lifecycle }: ApiOptions) =>\n (component: ComponentWithElements): ButtonComponent => {\n // Create wrapper objects that match the expected API interfaces\n const textAPI = {\n setText: (content: string) => {\n component.text.setText(content);\n return textAPI;\n },\n getText: () => component.text.getText(),\n getElement: () => component.text.getElement(),\n };\n\n const iconAPI = {\n setIcon: (html: string) => {\n component.icon.setIcon(html);\n return iconAPI;\n },\n getIcon: () => component.icon.getIcon(),\n getElement: () => component.icon.getElement(),\n };\n\n const buttonComponent: ButtonComponent = {\n element: component.element as HTMLButtonElement,\n text: textAPI,\n icon: iconAPI,\n disabled,\n lifecycle,\n getClass: component.getClass,\n\n on: (event: string, handler: Function) => {\n if (component.on) {\n component.on(event, handler);\n }\n return buttonComponent;\n },\n\n off: (event: string, handler: Function) => {\n if (component.off) {\n component.off(event, handler);\n }\n return buttonComponent;\n },\n\n addClass: (...classes: string[]) => {\n if (component.addClass) {\n component.addClass(...classes);\n } else {\n addClass(component.element, ...classes);\n }\n return buttonComponent;\n },\n\n /**\n * Gets the button's value attribute\n * @returns Current value of the button\n */\n getValue: () => (component.element as HTMLButtonElement).value,\n\n /**\n * Sets the button's value attribute\n * @param value - New value to set\n * @returns Button component for method chaining\n */\n setValue(value: string) {\n (component.element as HTMLButtonElement).value = value;\n return buttonComponent;\n },\n\n /**\n * Enables the button, making it interactive\n * @returns Button component for method chaining\n */\n enable() {\n disabled.enable();\n return buttonComponent;\n },\n\n /**\n * Disables the button, making it non-interactive\n * @returns Button component for method chaining\n */\n disable() {\n disabled.disable();\n return buttonComponent;\n },\n\n /**\n * Sets the button's text content\n * @param content - Text content to display\n * @returns Button component for method chaining\n */\n setText(content: string) {\n component.text.setText(content);\n return buttonComponent;\n },\n\n /**\n * Gets the button's current text content\n * @returns Current text content\n */\n getText() {\n return component.text.getText();\n },\n\n /**\n * Checks if the button has an icon\n * @returns True if the button has an icon, false otherwise\n */\n hasIcon() {\n const iconElement = component.icon.getElement();\n return (\n !!iconElement &&\n !!iconElement.innerHTML.trim() &&\n !!iconElement.parentNode\n );\n },\n\n /**\n * Sets the button's icon HTML content\n * If empty string is provided, completely removes the icon\n * @param icon - HTML string for the icon, or empty string to remove\n * @returns Button component for method chaining\n */\n setIcon(icon: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n if (!icon) {\n // Remove the icon if it exists\n const iconElement = component.icon.getElement();\n if (iconElement && iconElement.parentNode) {\n iconElement.parentNode.removeChild(iconElement);\n\n // Override getElement to return null for removed icon\n component.icon.getElement = () => null;\n component.icon.getIcon = () => \"\";\n }\n\n component.element.classList.remove(`${buttonClass}--icon`);\n } else if (!buttonComponent.hasIcon()) {\n // Create new icon element when re-adding\n const newIconElement = document.createElement(\"span\");\n newIconElement.className = `${component.getClass(\"button-icon\")}`;\n newIconElement.innerHTML = icon;\n\n // Insert at the beginning of button\n if (component.element.firstChild) {\n component.element.insertBefore(\n newIconElement,\n component.element.firstChild,\n );\n } else {\n component.element.appendChild(newIconElement);\n }\n\n // Update component's reference to the new element\n component.icon.getElement = () => newIconElement;\n component.icon.getIcon = () => icon;\n component.element.classList.add(`${buttonClass}--icon`);\n } else {\n // Update existing icon without creating a new one\n const iconElement = component.icon.getElement();\n if (iconElement) {\n iconElement.innerHTML = icon;\n }\n }\n\n return buttonComponent;\n },\n\n /**\n * Gets the button's current icon HTML content\n * @returns Current icon HTML or empty string if removed\n */\n getIcon() {\n return buttonComponent.hasIcon() ? component.icon.getIcon() : \"\";\n },\n\n /**\n * Sets the button's variant (visual style)\n * @param variant - New variant to apply ('filled', 'outlined', 'text', etc.)\n * @returns Button component for method chaining\n */\n setVariant(variant: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n\n // First remove all existing variant classes\n const variantClasses = [\n \"filled\",\n \"tonal\",\n \"outlined\",\n \"elevated\",\n \"text\",\n ].map((v) => `${buttonClass}--${v}`);\n\n variantClasses.forEach((cls) => {\n component.element.classList.remove(cls);\n });\n\n component.element.classList.add(`${buttonClass}--${variant}`);\n return buttonComponent;\n },\n\n /**\n * Gets the button's current variant\n * @returns Current variant name ('filled', 'outlined', etc.)\n */\n getVariant() {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n const variants = [\"filled\", \"tonal\", \"outlined\", \"elevated\", \"text\"];\n\n // Check which variant class is present on the element\n for (const variant of variants) {\n if (\n component.element.classList.contains(`${buttonClass}--${variant}`)\n ) {\n return variant;\n }\n }\n\n // If no variant class is found, return the default variant\n return \"filled\";\n },\n\n /**\n * Gets the button's current size\n * @returns Current size name ('xs', 's', 'm', 'l', 'xl')\n */\n getSize() {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n const sizes = [\"xs\", \"s\", \"m\", \"l\", \"xl\"];\n\n // Check which size class is present on the element\n for (const size of sizes) {\n if (component.element.classList.contains(`${buttonClass}--${size}`)) {\n return size;\n }\n }\n\n // If no size class is found, return the default size\n return \"s\";\n },\n\n /**\n * Sets the button's size\n * @param size - New size to apply ('xs', 's', 'm', 'l', 'xl')\n * @returns Button component for method chaining\n */\n setSize(size: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n\n // First remove all existing size classes\n const sizeClasses = [\"xs\", \"s\", \"m\", \"l\", \"xl\"].map(\n (s) => `${buttonClass}--${s}`,\n );\n\n sizeClasses.forEach((cls) => {\n component.element.classList.remove(cls);\n });\n\n component.element.classList.add(`${buttonClass}--${size}`);\n return buttonComponent;\n },\n\n /**\n * Gets the button's current shape\n * @returns Current shape name ('round', 'square')\n */\n getShape() {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n const shapes = [\"round\", \"square\"];\n\n // Check which shape class is present on the element\n for (const shape of shapes) {\n if (\n component.element.classList.contains(`${buttonClass}--${shape}`)\n ) {\n return shape;\n }\n }\n\n // If no shape class is found, return the default shape\n return \"round\";\n },\n\n /**\n * Sets the button's shape\n * @param shape - New shape to apply ('round', 'square')\n * @returns Button component for method chaining\n */\n setShape(shape: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n\n // First remove all existing shape classes\n const shapeClasses = [\"round\", \"square\"].map(\n (s) => `${buttonClass}--${s}`,\n );\n\n shapeClasses.forEach((cls) => {\n component.element.classList.remove(cls);\n });\n\n component.element.classList.add(`${buttonClass}--${shape}`);\n return buttonComponent;\n },\n\n /**\n * Sets the active state of the button\n * Used to visually indicate the button's active state, such as when it has a menu open\n *\n * @param active - Whether the button should appear active\n * @returns Button component for method chaining\n */\n setActive(active: boolean) {\n if (active) {\n component.element.classList.add(\n `${component.getClass(\"button\")}--active`,\n );\n } else {\n component.element.classList.remove(\n `${component.getClass(\"button\")}--active`,\n );\n }\n return buttonComponent;\n },\n\n /**\n * Sets the button's aria-label attribute for accessibility\n * @param label - Accessible label text\n * @returns Button component for method chaining\n */\n setAriaLabel(label: string) {\n component.element.setAttribute(\"aria-label\", label);\n return buttonComponent;\n },\n\n /**\n * Destroys the button component and cleans up resources\n */\n destroy() {\n lifecycle.destroy();\n },\n };\n\n // Forward progress methods if they exist\n if (component.progress) {\n buttonComponent.progress = component.progress;\n }\n\n if (component.showProgress) {\n buttonComponent.showProgress = async () => {\n await component.showProgress!();\n return buttonComponent;\n };\n }\n\n if (component.showProgressSync) {\n buttonComponent.showProgressSync = () => {\n component.showProgressSync!();\n return buttonComponent;\n };\n }\n\n if (component.hideProgress) {\n buttonComponent.hideProgress = async () => {\n await component.hideProgress!();\n return buttonComponent;\n };\n }\n\n if (component.hideProgressSync) {\n buttonComponent.hideProgressSync = () => {\n component.hideProgressSync!();\n return buttonComponent;\n };\n }\n\n if (component.setProgress) {\n buttonComponent.setProgress = async (value: number) => {\n await component.setProgress!(value);\n return buttonComponent;\n };\n }\n\n if (component.setProgressSync) {\n buttonComponent.setProgressSync = (value: number) => {\n component.setProgressSync!(value);\n return buttonComponent;\n };\n }\n\n if (component.setIndeterminate) {\n buttonComponent.setIndeterminate = async (indeterminate: boolean) => {\n await component.setIndeterminate!(indeterminate);\n return buttonComponent;\n };\n }\n\n if (component.setIndeterminateSync) {\n buttonComponent.setIndeterminateSync = (indeterminate: boolean) => {\n component.setIndeterminateSync!(indeterminate);\n return buttonComponent;\n };\n }\n\n if (component.setLoading) {\n buttonComponent.setLoading = async (loading: boolean, text?: string) => {\n await component.setLoading!(loading, text);\n return buttonComponent;\n };\n }\n\n if (component.setLoadingSync) {\n buttonComponent.setLoadingSync = (loading: boolean, text?: string) => {\n component.setLoadingSync!(loading, text);\n return buttonComponent;\n };\n }\n\n return buttonComponent;\n };\n",
|
|
66
|
+
"// src/components/button/api.ts\nimport { ButtonComponent } from \"./types\";\nimport { addClass } from \"../../core\";\nimport { ProgressComponent } from \"../progress/types\";\n\n/**\n * API configuration options for button component\n * @category Components\n * @internal\n */\ninterface ApiOptions {\n disabled: {\n enable: () => void;\n disable: () => void;\n isDisabled: () => boolean;\n };\n lifecycle: {\n destroy: () => void;\n };\n}\n\n/**\n * Component with required elements and methods for API enhancement\n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n element: HTMLElement;\n text: {\n setText: (content: string) => void;\n getText: () => string;\n getElement: () => HTMLElement | null;\n };\n icon: {\n setIcon: (html: string) => void;\n getIcon: () => string;\n getElement: () => HTMLElement | null;\n };\n getClass: (name: string) => string;\n componentName?: string;\n on?: (event: string, handler: Function) => ComponentWithElements;\n off?: (event: string, handler: Function) => ComponentWithElements;\n addClass?: (...classes: string[]) => ComponentWithElements;\n\n // Toggle manager (if withToggle was applied)\n toggle?: {\n setSelected: (selected: boolean) => void;\n isSelected: () => boolean;\n };\n\n // Progress methods (if withProgress was applied)\n progress?: ProgressComponent;\n showProgress?: () => Promise<ComponentWithElements>;\n showProgressSync?: () => ComponentWithElements;\n hideProgress?: () => Promise<ComponentWithElements>;\n hideProgressSync?: () => ComponentWithElements;\n setProgress?: (value: number) => Promise<ComponentWithElements>;\n setProgressSync?: (value: number) => ComponentWithElements;\n setIndeterminate?: (indeterminate: boolean) => Promise<ComponentWithElements>;\n setIndeterminateSync?: (indeterminate: boolean) => ComponentWithElements;\n setLoading?: (\n loading: boolean,\n text?: string,\n ) => Promise<ComponentWithElements>;\n setLoadingSync?: (loading: boolean, text?: string) => ComponentWithElements;\n}\n\n/**\n * Enhances a button component with API methods.\n * This follows the higher-order function pattern to add public API methods\n * to the component, making them available to the end user.\n *\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @category Components\n * @internal This is an internal utility for the Button component\n */\nexport const withAPI =\n ({ disabled, lifecycle }: ApiOptions) =>\n (component: ComponentWithElements): ButtonComponent => {\n // Create wrapper objects that match the expected API interfaces\n const textAPI = {\n setText: (content: string) => {\n component.text.setText(content);\n return textAPI;\n },\n getText: () => component.text.getText(),\n getElement: () => component.text.getElement(),\n };\n\n const iconAPI = {\n setIcon: (html: string) => {\n component.icon.setIcon(html);\n return iconAPI;\n },\n getIcon: () => component.icon.getIcon(),\n getElement: () => component.icon.getElement(),\n };\n\n const buttonComponent: ButtonComponent = {\n element: component.element as HTMLButtonElement,\n text: textAPI,\n icon: iconAPI,\n disabled,\n lifecycle,\n getClass: component.getClass,\n\n on: (event: string, handler: Function) => {\n if (component.on) {\n component.on(event, handler);\n }\n return buttonComponent;\n },\n\n off: (event: string, handler: Function) => {\n if (component.off) {\n component.off(event, handler);\n }\n return buttonComponent;\n },\n\n addClass: (...classes: string[]) => {\n if (component.addClass) {\n component.addClass(...classes);\n } else {\n addClass(component.element, ...classes);\n }\n return buttonComponent;\n },\n\n /**\n * Gets the button's value attribute\n * @returns Current value of the button\n */\n getValue: () => (component.element as HTMLButtonElement).value,\n\n /**\n * Sets the button's value attribute\n * @param value - New value to set\n * @returns Button component for method chaining\n */\n setValue(value: string) {\n (component.element as HTMLButtonElement).value = value;\n return buttonComponent;\n },\n\n /**\n * Enables the button, making it interactive\n * @returns Button component for method chaining\n */\n enable() {\n disabled.enable();\n return buttonComponent;\n },\n\n /**\n * Disables the button, making it non-interactive\n * @returns Button component for method chaining\n */\n disable() {\n disabled.disable();\n return buttonComponent;\n },\n\n /**\n * Sets the button's text content\n * @param content - Text content to display\n * @returns Button component for method chaining\n */\n setText(content: string) {\n component.text.setText(content);\n return buttonComponent;\n },\n\n /**\n * Gets the button's current text content\n * @returns Current text content\n */\n getText() {\n return component.text.getText();\n },\n\n /**\n * Checks if the button has an icon\n * @returns True if the button has an icon, false otherwise\n */\n hasIcon() {\n const iconElement = component.icon.getElement();\n return (\n !!iconElement &&\n !!iconElement.innerHTML.trim() &&\n !!iconElement.parentNode\n );\n },\n\n /**\n * Sets the button's icon HTML content\n * If empty string is provided, completely removes the icon\n * @param icon - HTML string for the icon, or empty string to remove\n * @returns Button component for method chaining\n */\n setIcon(icon: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n if (!icon) {\n // Remove the icon if it exists\n const iconElement = component.icon.getElement();\n if (iconElement && iconElement.parentNode) {\n iconElement.parentNode.removeChild(iconElement);\n\n // Override getElement to return null for removed icon\n component.icon.getElement = () => null;\n component.icon.getIcon = () => \"\";\n }\n\n component.element.classList.remove(`${buttonClass}--icon`);\n } else if (!buttonComponent.hasIcon()) {\n // Create new icon element when re-adding\n const newIconElement = document.createElement(\"span\");\n newIconElement.className = `${component.getClass(\"button-icon\")}`;\n newIconElement.innerHTML = icon;\n\n // Insert at the beginning of button\n if (component.element.firstChild) {\n component.element.insertBefore(\n newIconElement,\n component.element.firstChild,\n );\n } else {\n component.element.appendChild(newIconElement);\n }\n\n // Update component's reference to the new element\n component.icon.getElement = () => newIconElement;\n component.icon.getIcon = () => icon;\n component.element.classList.add(`${buttonClass}--icon`);\n } else {\n // Update existing icon without creating a new one\n const iconElement = component.icon.getElement();\n if (iconElement) {\n iconElement.innerHTML = icon;\n }\n }\n\n return buttonComponent;\n },\n\n /**\n * Gets the button's current icon HTML content\n * @returns Current icon HTML or empty string if removed\n */\n getIcon() {\n return buttonComponent.hasIcon() ? component.icon.getIcon() : \"\";\n },\n\n /**\n * Sets the button's variant (visual style)\n * @param variant - New variant to apply ('filled', 'outlined', 'text', etc.)\n * @returns Button component for method chaining\n */\n setVariant(variant: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n\n // First remove all existing variant classes\n const variantClasses = [\n \"filled\",\n \"tonal\",\n \"outlined\",\n \"elevated\",\n \"text\",\n ].map((v) => `${buttonClass}--${v}`);\n\n variantClasses.forEach((cls) => {\n component.element.classList.remove(cls);\n });\n\n component.element.classList.add(`${buttonClass}--${variant}`);\n return buttonComponent;\n },\n\n /**\n * Gets the button's current variant\n * @returns Current variant name ('filled', 'outlined', etc.)\n */\n getVariant() {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n const variants = [\"filled\", \"tonal\", \"outlined\", \"elevated\", \"text\"];\n\n // Check which variant class is present on the element\n for (const variant of variants) {\n if (\n component.element.classList.contains(`${buttonClass}--${variant}`)\n ) {\n return variant;\n }\n }\n\n // If no variant class is found, return the default variant\n return \"filled\";\n },\n\n /**\n * Gets the button's current size\n * @returns Current size name ('xs', 's', 'm', 'l', 'xl')\n */\n getSize() {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n const sizes = [\"xs\", \"s\", \"m\", \"l\", \"xl\"];\n\n // Check which size class is present on the element\n for (const size of sizes) {\n if (component.element.classList.contains(`${buttonClass}--${size}`)) {\n return size;\n }\n }\n\n // If no size class is found, return the default size\n return \"s\";\n },\n\n /**\n * Sets the button's size\n * @param size - New size to apply ('xs', 's', 'm', 'l', 'xl')\n * @returns Button component for method chaining\n */\n setSize(size: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n\n // First remove all existing size classes\n const sizeClasses = [\"xs\", \"s\", \"m\", \"l\", \"xl\"].map(\n (s) => `${buttonClass}--${s}`,\n );\n\n sizeClasses.forEach((cls) => {\n component.element.classList.remove(cls);\n });\n\n component.element.classList.add(`${buttonClass}--${size}`);\n return buttonComponent;\n },\n\n /**\n * Gets the button's current shape\n * @returns Current shape name ('round', 'square')\n */\n getShape() {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n const shapes = [\"round\", \"square\"];\n\n // Check which shape class is present on the element\n for (const shape of shapes) {\n if (\n component.element.classList.contains(`${buttonClass}--${shape}`)\n ) {\n return shape;\n }\n }\n\n // If no shape class is found, return the default shape\n return \"round\";\n },\n\n /**\n * Sets the button's shape\n * @param shape - New shape to apply ('round', 'square')\n * @returns Button component for method chaining\n */\n setShape(shape: string) {\n const compName = component.componentName || \"button\";\n const buttonClass = component.getClass(compName);\n\n // First remove all existing shape classes\n const shapeClasses = [\"round\", \"square\"].map(\n (s) => `${buttonClass}--${s}`,\n );\n\n shapeClasses.forEach((cls) => {\n component.element.classList.remove(cls);\n });\n\n component.element.classList.add(`${buttonClass}--${shape}`);\n return buttonComponent;\n },\n\n /**\n * Sets the active state of the button\n * Used to visually indicate the button's active state, such as when it has a menu open\n *\n * @param active - Whether the button should appear active\n * @returns Button component for method chaining\n */\n setActive(active: boolean) {\n if (active) {\n component.element.classList.add(\n `${component.getClass(\"button\")}--active`,\n );\n } else {\n component.element.classList.remove(\n `${component.getClass(\"button\")}--active`,\n );\n }\n return buttonComponent;\n },\n\n /**\n * Sets the selected state of a toggle button\n * @param selected - Whether the button is selected\n * @returns Button component for method chaining\n */\n setSelected(selected: boolean) {\n component.toggle?.setSelected(selected);\n return buttonComponent;\n },\n\n /**\n * Whether a toggle button is selected\n * @returns Selected state, false for non-toggle buttons\n */\n isSelected: () => component.toggle?.isSelected() ?? false,\n\n /**\n * Sets the button's aria-label attribute for accessibility\n * @param label - Accessible label text\n * @returns Button component for method chaining\n */\n setAriaLabel(label: string) {\n component.element.setAttribute(\"aria-label\", label);\n return buttonComponent;\n },\n\n /**\n * Destroys the button component and cleans up resources\n */\n destroy() {\n lifecycle.destroy();\n },\n };\n\n // Forward progress methods if they exist\n if (component.progress) {\n buttonComponent.progress = component.progress;\n }\n\n if (component.showProgress) {\n buttonComponent.showProgress = async () => {\n await component.showProgress!();\n return buttonComponent;\n };\n }\n\n if (component.showProgressSync) {\n buttonComponent.showProgressSync = () => {\n component.showProgressSync!();\n return buttonComponent;\n };\n }\n\n if (component.hideProgress) {\n buttonComponent.hideProgress = async () => {\n await component.hideProgress!();\n return buttonComponent;\n };\n }\n\n if (component.hideProgressSync) {\n buttonComponent.hideProgressSync = () => {\n component.hideProgressSync!();\n return buttonComponent;\n };\n }\n\n if (component.setProgress) {\n buttonComponent.setProgress = async (value: number) => {\n await component.setProgress!(value);\n return buttonComponent;\n };\n }\n\n if (component.setProgressSync) {\n buttonComponent.setProgressSync = (value: number) => {\n component.setProgressSync!(value);\n return buttonComponent;\n };\n }\n\n if (component.setIndeterminate) {\n buttonComponent.setIndeterminate = async (indeterminate: boolean) => {\n await component.setIndeterminate!(indeterminate);\n return buttonComponent;\n };\n }\n\n if (component.setIndeterminateSync) {\n buttonComponent.setIndeterminateSync = (indeterminate: boolean) => {\n component.setIndeterminateSync!(indeterminate);\n return buttonComponent;\n };\n }\n\n if (component.setLoading) {\n buttonComponent.setLoading = async (loading: boolean, text?: string) => {\n await component.setLoading!(loading, text);\n return buttonComponent;\n };\n }\n\n if (component.setLoadingSync) {\n buttonComponent.setLoadingSync = (loading: boolean, text?: string) => {\n component.setLoadingSync!(loading, text);\n return buttonComponent;\n };\n }\n\n return buttonComponent;\n };\n",
|
|
72
67
|
"// src/components/button/constants.ts\n\n/**\n * Button variants\n */\nexport const BUTTON_VARIANTS = {\n /** Primary action button with solid background (high emphasis) */\n FILLED: \"filled\",\n /** Secondary action button with medium emphasis */\n TONAL: \"tonal\",\n /** Button with outline border and transparent background */\n OUTLINED: \"outlined\",\n /** Button with slight elevation/shadow */\n ELEVATED: \"elevated\",\n /** Button that appears as text without background or border (low emphasis) */\n TEXT: \"text\",\n} as const;\n\n/**\n * Available button size variants matching MD3 specifications\n * @category Components\n */\nexport const BUTTON_SIZES = {\n /** Extra small size - 32px height */\n XS: \"xs\",\n /** Small size - 40px height (default) */\n S: \"s\",\n /** Medium size - 56px height */\n M: \"m\",\n /** Large size - 96px height */\n L: \"l\",\n /** Extra large size - 136px height */\n XL: \"xl\",\n} as const;\n\n/**\n * Button size type\n * @category Components\n */\nexport type ButtonSize = keyof typeof BUTTON_SIZES;\n\n/**\n * Available button shape variants\n * @category Components\n */\nexport const BUTTON_SHAPES = {\n /** Round shape - pill-shaped buttons (default) */\n ROUND: \"round\",\n /** Square shape - buttons with size-specific corner radius */\n SQUARE: \"square\",\n} as const;\n\n/**\n * Button shape type\n * @category Components\n */\nexport type ButtonShape = keyof typeof BUTTON_SHAPES;\n\n/**\n * Default button types\n */\nexport const BUTTON_TYPES = {\n BUTTON: \"button\",\n SUBMIT: \"submit\",\n RESET: \"reset\",\n} as const;\n\n/**\n * CSS classes used by the button component\n */\nexport const BUTTON_CLASSES = {\n ROOT: \"button\",\n ICON: \"button-icon\",\n TEXT: \"button-text\",\n ACTIVE: \"button-active\",\n DISABLED: \"button-disabled\",\n} as const;\n\n/**\n * Default ripple effect configuration\n * Enhanced for better visibility\n */\nexport const DEFAULT_RIPPLE_CONFIG = {\n DURATION: 450, // Duration in ms (slightly increased)\n TIMING: \"cubic-bezier(0.4, 0.0, 0.2, 1)\", // Material Design timing function\n OPACITY: [\"0.7\", \"0\"], // Increased initial opacity for better visibility\n} as const;\n",
|
|
73
68
|
"// src/components/button/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { ButtonConfig } from \"./types\";\nimport {\n BUTTON_VARIANTS,\n BUTTON_TYPES,\n DEFAULT_RIPPLE_CONFIG,\n BUTTON_SIZES,\n BUTTON_SHAPES,\n} from \"./constants\";\n\n/**\n * Default configuration for the Button component.\n * These values will be used when not explicitly specified by the user.\n *\n * @category Components\n */\nexport const defaultConfig: ButtonConfig = {\n variant: BUTTON_VARIANTS.FILLED,\n size: BUTTON_SIZES.S,\n shape: BUTTON_SHAPES.ROUND,\n disabled: false,\n type: BUTTON_TYPES.BUTTON,\n ripple: true, // Explicitly enable ripple effects by default\n rippleConfig: {\n duration: DEFAULT_RIPPLE_CONFIG.DURATION,\n timing: DEFAULT_RIPPLE_CONFIG.TIMING,\n opacity: DEFAULT_RIPPLE_CONFIG.OPACITY as [string, string],\n },\n};\n\n/**\n * Creates the base configuration for Button component by merging user-provided\n * config with default values. Global configuration is automatically applied\n * by createComponentConfig.\n *\n * @param {ButtonConfig} config - User provided configuration\n * @returns {ButtonConfig} Complete configuration with defaults applied\n * @category Components\n * @internal\n */\nexport const createBaseConfig = (config: ButtonConfig = {}): ButtonConfig =>\n createComponentConfig(defaultConfig, config, \"button\") as ButtonConfig;\n\n/**\n * Generates element configuration for the Button component.\n * This function creates the necessary attributes and configuration\n * for the DOM element creation process.\n *\n * @param {ButtonConfig} config - Button configuration\n * @returns {Object} Element configuration object for withElement\n * @category Components\n * @internal\n */\nexport const getElementConfig = (config: ButtonConfig) => {\n // Create the attributes object\n const attributes: Record<string, string | boolean | undefined> = {\n type: config.type || \"button\",\n };\n\n // Only add disabled attribute if it's explicitly true\n if (config.disabled === true) {\n attributes.disabled = true;\n }\n\n // Add value attribute only if it exists\n if (config.value !== undefined) {\n attributes.value = config.value;\n }\n\n // Add aria-label attribute for accessibility\n if (config.ariaLabel) {\n attributes[\"aria-label\"] = config.ariaLabel;\n }\n\n return createElementConfig(config, {\n tag: \"button\",\n attributes,\n className: config.class,\n forwardEvents: {\n click: (component: { element: HTMLButtonElement }) =>\n !component.element.disabled,\n focus: true,\n blur: true,\n },\n });\n};\n\n/**\n * Creates API configuration for the Button component.\n * This connects the core component features (like disabled state)\n * to the public API methods exposed to users.\n *\n * @param {Object} comp - Component with disabled and lifecycle features\n * @returns {Object} API configuration object\n * @category Components\n * @internal\n */\nexport const getApiConfig = (comp: {\n disabled: {\n enable: () => void;\n disable: () => void;\n isDisabled: () => boolean;\n };\n lifecycle: { destroy: () => void };\n}) => ({\n disabled: {\n enable: () => comp.disabled.enable(),\n disable: () => comp.disabled.disable(),\n isDisabled: () => comp.disabled.isDisabled(),\n },\n lifecycle: {\n destroy: () => comp.lifecycle.destroy(),\n },\n});\n\nexport default defaultConfig;\n",
|
|
74
|
-
"// src/components/button/button.ts\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withText,\n withIcon,\n withVariant,\n withSize,\n withRipple,\n withDisabled,\n withLifecycle,\n} from \"../../core/compose/features\";\nimport { withProgress } from \"./features/progress\";\nimport { withAPI } from \"./api\";\nimport { ButtonConfig } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new Button component with the specified configuration.\n *\n * The Button component implements support for different variants, states, and features.\n * It follows accessibility best practices and provides a rich API for state management.\n *\n * The Button component is created using a functional composition pattern,\n * applying various features through the pipe function. This approach allows\n * for flexible and modular component construction.\n *\n * @param {ButtonConfig} config - Configuration options for the button\n * This can include text content, icon options, variant styling, disabled state,\n * and other button properties. See {@link ButtonConfig} for available options.\n *\n * @returns {ButtonComponent} A fully configured button component instance with\n * all requested features applied. The returned component has methods for\n * manipulation, event handling, and lifecycle management.\n *\n * @throws {Error} Throws an error if button creation fails for any reason\n *\n * @example\n * ```ts\n * // Create a button with integrated progress\n * const submitButton = createButton({\n * text: 'Submit',\n * variant: 'filled',\n * progress: {\n * variant: 'circular',\n * size: 18,\n * indeterminate: true\n * }\n * });\n *\n * // Create a square button with different sizes\n * const squareButton = createButton({\n * text: 'Square Button',\n * variant: 'tonal',\n * shape: 'square',\n * size: 'm' // Square buttons have size-specific corner radius\n * });\n *\n * // Synchronous usage (common for UI interactions)\n * submitButton.on('click', () => {\n * submitButton.setLoadingSync(true, 'Submitting...');\n *\n * // Simulate async work\n * setTimeout(() => {\n * submitButton.setLoadingSync(false, 'Submit');\n * }, 2000);\n * });\n *\n * // Asynchronous usage (when you need to ensure progress is loaded)\n * submitButton.on('click', async () => {\n * await submitButton.setLoading(true, 'Processing...');\n * await submitButton.setProgress(50);\n * // ... more async operations\n * await submitButton.setLoading(false, 'Done');\n * });\n * ```\n *\n * @category Components\n */\nconst createButton = (config: ButtonConfig = {}) => {\n const baseConfig = createBaseConfig(config);\n try {\n const button = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withSize(baseConfig),\n withText(baseConfig),\n withIcon(baseConfig),\n withDisabled(baseConfig),\n withProgress(baseConfig),\n withRipple(baseConfig),\n withLifecycle(),\n (component) => {\n if (baseConfig.shape && component.element) {\n const className = `${baseConfig.prefix}-${baseConfig.componentName}--${baseConfig.shape}`;\n component.element.classList.add(className);\n }\n return component;\n },\n (comp) => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n return button;\n } catch (error) {\n console.error(\"Button creation error:\", error);\n throw new Error(`Failed to create button: ${(error as Error).message}`);\n }\n};\n\nexport default createButton;\n",
|
|
69
|
+
"// src/components/button/button.ts\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withText,\n withIcon,\n withVariant,\n withSize,\n withRipple,\n withDisabled,\n withLifecycle,\n} from \"../../core/compose/features\";\nimport { withProgress } from \"./features/progress\";\nimport { withToggle } from \"./features/toggle\";\nimport { withAPI } from \"./api\";\nimport { ButtonConfig } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new Button component with the specified configuration.\n *\n * The Button component implements support for different variants, states, and features.\n * It follows accessibility best practices and provides a rich API for state management.\n *\n * The Button component is created using a functional composition pattern,\n * applying various features through the pipe function. This approach allows\n * for flexible and modular component construction.\n *\n * @param {ButtonConfig} config - Configuration options for the button\n * This can include text content, icon options, variant styling, disabled state,\n * and other button properties. See {@link ButtonConfig} for available options.\n *\n * @returns {ButtonComponent} A fully configured button component instance with\n * all requested features applied. The returned component has methods for\n * manipulation, event handling, and lifecycle management.\n *\n * @throws {Error} Throws an error if button creation fails for any reason\n *\n * @example\n * ```ts\n * // Create a button with integrated progress\n * const submitButton = createButton({\n * text: 'Submit',\n * variant: 'filled',\n * progress: {\n * variant: 'circular',\n * size: 18,\n * indeterminate: true\n * }\n * });\n *\n * // Create a square button with different sizes\n * const squareButton = createButton({\n * text: 'Square Button',\n * variant: 'tonal',\n * shape: 'square',\n * size: 'm' // Square buttons have size-specific corner radius\n * });\n *\n * // Synchronous usage (common for UI interactions)\n * submitButton.on('click', () => {\n * submitButton.setLoadingSync(true, 'Submitting...');\n *\n * // Simulate async work\n * setTimeout(() => {\n * submitButton.setLoadingSync(false, 'Submit');\n * }, 2000);\n * });\n *\n * // Asynchronous usage (when you need to ensure progress is loaded)\n * submitButton.on('click', async () => {\n * await submitButton.setLoading(true, 'Processing...');\n * await submitButton.setProgress(50);\n * // ... more async operations\n * await submitButton.setLoading(false, 'Done');\n * });\n * ```\n *\n * @category Components\n */\nconst createButton = (config: ButtonConfig = {}) => {\n const baseConfig = createBaseConfig(config);\n try {\n const button = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withSize(baseConfig),\n withText(baseConfig),\n withIcon(baseConfig),\n withDisabled(baseConfig),\n withToggle(baseConfig),\n withProgress(baseConfig),\n withRipple(baseConfig),\n withLifecycle(),\n (component) => {\n if (baseConfig.shape && component.element) {\n const className = `${baseConfig.prefix}-${baseConfig.componentName}--${baseConfig.shape}`;\n component.element.classList.add(className);\n }\n return component;\n },\n (comp) => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n return button;\n } catch (error) {\n console.error(\"Button creation error:\", error);\n throw new Error(`Failed to create button: ${(error as Error).message}`);\n }\n};\n\nexport default createButton;\n",
|
|
75
70
|
"// src/components/button/index.ts\n\n/**\n * Button component module\n * @module components/button\n */\n\nexport { default } from \"./button\";\nexport type { ButtonConfig, ButtonComponent, ButtonVariant } from \"./types\";\nexport type { ButtonSize, ButtonShape } from \"./constants\";\n",
|
|
76
|
-
"// src/components/
|
|
71
|
+
"// src/components/badge/badge.ts\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport {\n withEvents,\n withLifecycle\n} from '../../core/compose/features';\nimport { \n withVisibility,\n withVariant,\n withColor, \n withPosition,\n withMax,\n withAttachment\n} from './features';\nimport { withAPI } from './api';\nimport { BadgeConfig, BadgeComponent } from './types';\nimport { createBaseConfig, getElementConfig, getApiConfig } from './config';\n\n/**\n * Creates a new Badge component following Material Design 3 guidelines.\n * \n * The Badge component displays a small circle or numerical indicator to \n * draw attention to items requiring user attention, like notifications \n * or counts. Badges can be attached to any element.\n * \n * @param {BadgeConfig} config - Badge configuration object\n * @returns {BadgeComponent} Badge component instance with methods for\n * managing the badge appearance, content, and visibility\n * \n * @throws {Error} Throws an error if badge creation fails\n * \n * @category Components\n * \n * @example\n * // Create a small dot badge (notification indicator)\n * const notificationBadge = createBadge({ \n * variant: 'small',\n * color: 'error',\n * target: document.querySelector('.icon-button')\n * });\n * \n * @example\n * // Create a large badge with a count (numbered indicator)\n * const countBadge = createBadge({\n * variant: 'large',\n * label: 5,\n * color: 'primary',\n * target: document.querySelector('.notification-icon')\n * });\n * \n * @example\n * // Create a badge with a maximum value\n * const messagesBadge = createBadge({\n * variant: 'large',\n * label: 1250,\n * max: 999, // Will display \"999+\"\n * color: 'info',\n * position: 'bottom-right'\n * });\n * \n * @example\n * // Control badge visibility programmatically\n * const toggleBadge = createBadge({\n * variant: 'small',\n * color: 'success',\n * target: document.querySelector('.toggle-button')\n * });\n * \n * // Toggle badge visibility\n * function toggleNotification() {\n * if (toggleBadge.isVisible()) {\n * toggleBadge.hide();\n * } else {\n * toggleBadge.show();\n * }\n * }\n */\nconst createBadge = (config: BadgeConfig = {}): BadgeComponent => {\n const baseConfig = createBaseConfig(config);\n\n try {\n // Compose the badge component from multiple feature enhancers\n const badge = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withColor(baseConfig),\n withPosition(baseConfig),\n withMax(baseConfig),\n withVisibility(),\n withAttachment(baseConfig),\n withLifecycle(),\n comp => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n\n return badge;\n } catch (error) {\n console.error('Badge creation error:', error);\n throw new Error(`Failed to create badge: ${(error as Error).message}`);\n }\n};\n\nexport default createBadge;",
|
|
72
|
+
"// src/components/badge/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { BadgeConfig } from \"./types\";\nimport {\n BADGE_VARIANTS,\n BADGE_COLORS,\n BADGE_POSITIONS,\n BADGE_MAX_CHARACTERS,\n} from \"./constants\";\n\n/**\n * Default configuration for the Badge component\n * These values will be used when not explicitly specified by the user.\n *\n * @category Components\n */\nexport const defaultConfig: BadgeConfig = {\n /** Default to large badge (with text capability) */\n variant: BADGE_VARIANTS.LARGE,\n /** Default to error (red) color */\n color: BADGE_COLORS.ERROR,\n /** Default to top-right corner positioning */\n position: BADGE_POSITIONS.TOP_RIGHT,\n /** Default to empty label */\n label: \"\",\n /** Default to visible */\n visible: true,\n};\n\n/**\n * Creates the base configuration for Badge component by merging user-provided\n * config with default values.\n *\n * @param {BadgeConfig} config - User provided configuration\n * @returns {BadgeConfig} Complete configuration with defaults applied\n * @category Components\n * @internal\n */\nexport const createBaseConfig = (config: BadgeConfig = {}): BadgeConfig =>\n createComponentConfig(defaultConfig, config, \"badge\") as BadgeConfig;\n\n/**\n * Generates element configuration for the Badge component.\n * This function creates the necessary attributes and configuration\n * for the DOM element creation process.\n *\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Object} Element configuration object for withElement\n * @category Components\n * @internal\n */\nexport const getElementConfig = (config: BadgeConfig) => {\n // Create the attributes object\n const attributes: Record<string, string | number | boolean> = {};\n\n // For large badges, set appropriate ARIA attributes for screen readers\n if (config.variant !== \"small\") {\n attributes.role = \"status\";\n }\n\n // Format the label if needed - small badges have no text\n const formattedLabel =\n config.variant === \"small\"\n ? \"\"\n : formatBadgeLabel(config.label || \"\", config.max);\n\n return createElementConfig(config, {\n tag: \"span\",\n attributes,\n className: config.class,\n text: formattedLabel, // Use the formatted label\n });\n};\n\n/**\n * Creates API configuration for the Badge component.\n * This connects the core component features (like visibility)\n * to the public API methods exposed to users.\n *\n * @param {Object} comp - Component with visibility and lifecycle features\n * @returns {Object} API configuration object\n * @category Components\n * @internal\n */\nexport const getApiConfig = (comp: {\n visibility: {\n show: () => void;\n hide: () => void;\n toggle: (visible?: boolean) => void;\n isVisible: () => boolean;\n };\n lifecycle: {\n destroy: () => void;\n };\n}) => ({\n visibility: {\n show: () => comp.visibility.show(),\n hide: () => comp.visibility.hide(),\n toggle: (visible?: boolean) => comp.visibility.toggle(visible),\n isVisible: () => comp.visibility.isVisible(),\n },\n lifecycle: {\n destroy: () => comp.lifecycle.destroy(),\n },\n});\n\n/**\n * Format a badge label following Material Design 3 guidelines:\n * - Max 4 characters including \"+\" for overflow\n * - Add \"+\" for numeric values exceeding max\n *\n * @param {string|number} label - Original label\n * @param {number} max - Maximum value before using \"+\"\n * @returns {string} Formatted label that fits within badge constraints\n * @category Components\n * @internal\n *\n * @example\n * formatBadgeLabel(5) // \"5\"\n * formatBadgeLabel(1250, 999) // \"999+\"\n * formatBadgeLabel(\"New\") // \"New\"\n * formatBadgeLabel(\"VeryLong\") // \"Very\" (truncated)\n */\nexport const formatBadgeLabel = (\n label: string | number,\n max?: number\n): string => {\n // Handle empty or undefined labels\n if (label === undefined || label === null || label === \"\") {\n return \"\";\n }\n\n let formattedLabel = String(label);\n\n const numericLabel = Number(label);\n\n // Apply max value formatting for numbers\n if (max !== undefined && !isNaN(numericLabel) && numericLabel > max) {\n formattedLabel = `${max}+`;\n }\n\n // Ensure label doesn't exceed max characters\n if (formattedLabel.length > BADGE_MAX_CHARACTERS) {\n // Try to preserve as much information as possible\n // For large numbers, use abbreviated format with \"+\"\n const numericValue = Number(label);\n if (!isNaN(numericValue)) {\n if (numericValue >= 1000) {\n formattedLabel = \"999+\";\n } else {\n // For numbers under 1000 but still too long, truncate\n formattedLabel =\n formattedLabel.substring(0, BADGE_MAX_CHARACTERS - 1) + \"+\";\n }\n } else {\n // For non-numeric values, simply truncate\n formattedLabel = formattedLabel.substring(0, BADGE_MAX_CHARACTERS);\n }\n }\n\n return formattedLabel;\n};\n\nexport default defaultConfig;\n",
|
|
73
|
+
"// src/components/badge/constants.ts\n\n/**\n * Badge variants\n * - SMALL: Simple dot badge (6dp diameter)\n * - LARGE: Numbered badge (16dp height)\n */\nexport const BADGE_VARIANTS = {\n SMALL: 'small',\n LARGE: 'large'\n} as const;\n\n/**\n * Badge colors\n * ERROR is the default\n */\nexport const BADGE_COLORS = {\n ERROR: 'error', // Default\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SUCCESS: 'success',\n WARNING: 'warning',\n INFO: 'info'\n} as const;\n\n/**\n * Badge positions relative to its container\n */\nexport const BADGE_POSITIONS = {\n TOP_RIGHT: 'top-right', // Default\n TOP_LEFT: 'top-left',\n BOTTOM_RIGHT: 'bottom-right',\n BOTTOM_LEFT: 'bottom-left'\n} as const;\n\n/**\n * Maximum character count for badge labels\n */\nexport const BADGE_MAX_CHARACTERS = 4;",
|
|
74
|
+
"// src/components/badge/features.ts\nimport { BadgeConfig } from './types';\nimport { formatBadgeLabel } from './config';\n\n// Common badge variants\nconst VARIANT_SMALL = 'small';\nconst VARIANT_LARGE = 'large';\n\n// Common badge colors\nconst COLOR_ERROR = 'error';\n\n// Common badge positions\nconst POSITION_TOP_RIGHT = 'top-right';\n\n/**\n * Higher-order function that adds visibility control features to a component\n * @returns {Function} Component enhancer with visibility features\n */\nexport const withVisibility = () => component => {\n // Get config values\n const visible = component.config.visible !== false; // Default to true if not specified\n \n // Initialize visibility state based on config\n if (!visible) {\n component.element.classList.add(`${component.getClass('badge')}--invisible`);\n }\n \n return {\n ...component,\n visibility: {\n /**\n * Shows the badge\n */\n show() {\n component.element.classList.remove(`${component.getClass('badge')}--invisible`);\n },\n \n /**\n * Hides the badge\n */\n hide() {\n component.element.classList.add(`${component.getClass('badge')}--invisible`);\n },\n \n /**\n * Toggles badge visibility\n * @param {boolean} [visible] - Optional flag to force visibility state\n */\n toggle(visible?: boolean) {\n if (visible === undefined) {\n component.element.classList.toggle(`${component.getClass('badge')}--invisible`);\n } else if (visible) {\n this.show();\n } else {\n this.hide();\n }\n },\n \n /**\n * Checks if the badge is visible\n * @returns {boolean} True if badge is visible\n */\n isVisible() {\n return !component.element.classList.contains(`${component.getClass('badge')}--invisible`);\n }\n }\n };\n};\n\n/**\n * Higher-order function that adds variant features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with variant features\n */\nexport const withVariant = (config: BadgeConfig) => component => {\n // Get variant from config with fallback to default\n const variant = config.variant || VARIANT_LARGE;\n \n // Apply variant class\n component.element.classList.add(`${component.getClass('badge')}--${variant}`);\n \n // Small badges (dot variant) don't have text\n if (variant === VARIANT_SMALL) {\n component.element.textContent = '';\n component.element.setAttribute('aria-hidden', 'true');\n } else {\n // Add accessibility for large badges\n component.element.setAttribute('role', 'status');\n \n // Set the label if available and variant is large\n if (config.label !== undefined && config.label !== '') {\n // Format the label according to max value\n const formattedLabel = formatBadgeLabel(config.label, config.max);\n component.element.textContent = formattedLabel;\n }\n }\n \n return component;\n};\n\n/**\n * Higher-order function that adds color features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with color features\n */\nexport const withColor = (config: BadgeConfig) => component => {\n // Get color from config with fallback to default\n const color = config.color || COLOR_ERROR;\n \n // Apply color class\n component.element.classList.add(`${component.getClass('badge')}--${color}`);\n \n return component;\n};\n\n/**\n * Higher-order function that adds positioning features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with positioning features\n */\nexport const withPosition = (config: BadgeConfig) => component => {\n // Get position from config with fallback to default\n const position = config.position || POSITION_TOP_RIGHT;\n \n // Apply position class\n component.element.classList.add(`${component.getClass('badge')}--${position}`);\n \n // If there's a target, add positioned class\n if (config.target) {\n component.element.classList.add(`${component.getClass('badge')}--positioned`);\n }\n \n return component;\n};\n\n/**\n * Higher-order function that adds max value features to a badge component\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with max value features\n */\nexport const withMax = (config: BadgeConfig) => component => {\n // Skip if no max is defined or for small badges\n if (config.max === undefined || config.variant === VARIANT_SMALL) {\n return component;\n }\n \n // Store max value in config for later use\n component.config.max = config.max;\n \n // Apply max formatting if needed\n if (config.label !== undefined && config.label !== '') {\n const formattedLabel = formatBadgeLabel(config.label, config.max);\n component.element.textContent = formattedLabel;\n \n // Add overflow class if label was truncated\n if (typeof config.label === 'number' && config.label > config.max) {\n component.element.classList.add(`${component.getClass('badge')}--overflow`);\n }\n }\n \n return component;\n};\n\n/**\n * Higher-order function that attaches badge to a target element\n * @param {BadgeConfig} config - Badge configuration\n * @returns {Function} Component enhancer with attachment features\n */\nexport const withAttachment = (config: BadgeConfig) => component => {\n // Skip if no target is provided\n if (!config.target) {\n return component;\n }\n \n // Create wrapper to hold the target and badge\n const wrapper = document.createElement('div');\n wrapper.classList.add(component.getClass('badge-wrapper'));\n \n // Make sure positioning context is correct\n wrapper.style.position = 'relative';\n \n // Replace the target with the wrapper\n const parent = config.target.parentNode;\n if (parent) {\n parent.replaceChild(wrapper, config.target);\n wrapper.appendChild(config.target);\n wrapper.appendChild(component.element);\n \n // Save the wrapper reference\n component.wrapper = wrapper;\n }\n \n return component;\n};",
|
|
75
|
+
"// src/components/badge/api.ts\nimport {\n BadgeComponent,\n BadgeColor,\n BadgeVariant,\n BadgePosition,\n} from \"./types\";\nimport { formatBadgeLabel } from \"./config\";\n\n/**\n * API configuration options for badge component\n * @category Components\n * @internal\n */\ninterface ApiOptions {\n visibility: {\n show: () => void;\n hide: () => void;\n toggle: (visible?: boolean) => void;\n isVisible: () => boolean;\n };\n lifecycle: {\n destroy: () => void;\n };\n}\n\n/**\n * Component with required elements and methods for API enhancement\n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n element: HTMLElement;\n wrapper?: HTMLElement;\n config: {\n max?: number;\n label?: string | number;\n variant?: string;\n };\n getClass: (name: string) => string;\n addClass: (...classes: string[]) => ComponentWithElements;\n removeClass: (...classes: string[]) => ComponentWithElements;\n on: (event: string, handler: Function) => ComponentWithElements;\n off: (event: string, handler: Function) => ComponentWithElements;\n}\n\n// Common variant constants for internal use\nconst VARIANT_SMALL = \"small\";\n\n// Map of all badge colors for class removal\nconst ALL_COLORS = [\n \"error\",\n \"primary\",\n \"secondary\",\n \"tertiary\",\n \"success\",\n \"warning\",\n \"info\",\n];\n\n// Map of all badge variants for class removal\nconst ALL_VARIANTS = [\"small\", \"large\"];\n\n// Map of all badge positions for class removal\nconst ALL_POSITIONS = [\"top-right\", \"top-left\", \"bottom-right\", \"bottom-left\"];\n\n/**\n * Enhances a badge component with API methods.\n * This follows the higher-order function pattern to add public API methods\n * to the component, making them available to the end user.\n *\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @category Components\n * @internal This is an internal utility for the Badge component\n */\nexport const withAPI =\n ({ visibility, lifecycle }: ApiOptions) =>\n (component: ComponentWithElements): BadgeComponent => {\n const badgeComponent: BadgeComponent = {\n // Spread component properties\n element: component.element,\n wrapper: component.wrapper,\n getClass: component.getClass,\n\n /**\n * Sets the badge label\n * @param {string|number} label - Label to display in the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setLabel(label: string | number) {\n component.config.label = label;\n\n // Small badges (dot variant) don't have text\n if (component.config.variant === VARIANT_SMALL) {\n component.element.textContent = \"\";\n return badgeComponent;\n }\n\n // Format the label\n const formattedLabel = formatBadgeLabel(label, component.config.max);\n component.element.textContent = formattedLabel;\n\n // Add overflow class if label was truncated\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--overflow`\n );\n if (\n typeof label === \"number\" &&\n component.config.max !== undefined &&\n label > component.config.max\n ) {\n component.element.classList.add(\n `${component.getClass(\"badge\")}--overflow`\n );\n }\n\n // Toggle visibility based on whether label is empty\n if (formattedLabel === \"\" || formattedLabel === \"0\") {\n badgeComponent.hide();\n } else {\n badgeComponent.show();\n }\n\n return badgeComponent;\n },\n\n /**\n * Gets the badge label\n * @returns {string} Current badge label\n */\n getLabel() {\n return component.element.textContent || \"\";\n },\n\n /**\n * Sets the badge content (alias for setLabel)\n * @param {string|number} content - Content to display in the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setContent(content: string | number) {\n return badgeComponent.setLabel(content);\n },\n\n /**\n * Gets the badge content (alias for getLabel)\n * @returns {string} Current badge content\n */\n getContent() {\n return badgeComponent.getLabel();\n },\n\n /**\n * Shows the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n show() {\n visibility.show();\n return badgeComponent;\n },\n\n /**\n * Hides the badge\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n hide() {\n visibility.hide();\n return badgeComponent;\n },\n\n /**\n * Toggles badge visibility\n * @param {boolean} [visible] - Optional flag to force visibility state\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n toggle(visible?: boolean) {\n visibility.toggle(visible);\n return badgeComponent;\n },\n\n /**\n * Checks if the badge is visible\n * @returns {boolean} True if badge is visible\n */\n isVisible() {\n return visibility.isVisible();\n },\n\n /**\n * Sets maximum value (after which badge shows max+)\n *\n * @param {number} max - Maximum value to display\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setMax(max: number) {\n component.config.max = max;\n\n // Apply max formatting if current label exceeds max\n if (component.config.label !== undefined) {\n badgeComponent.setLabel(component.config.label);\n }\n\n return badgeComponent;\n },\n\n /**\n * Sets badge color\n * @param {string} color - Color variant to apply\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setColor(color: BadgeColor | string) {\n // Remove existing color classes\n ALL_COLORS.forEach((colorName) => {\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--${colorName}`\n );\n });\n\n // Add new color class\n component.element.classList.add(\n `${component.getClass(\"badge\")}--${color}`\n );\n return badgeComponent;\n },\n\n /**\n * Sets badge variant\n * @param {string} variant - Variant to apply (small or large)\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setVariant(variant: BadgeVariant | string) {\n // Remove existing variant classes\n ALL_VARIANTS.forEach((variantName) => {\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--${variantName}`\n );\n });\n\n // Add new variant class\n component.element.classList.add(\n `${component.getClass(\"badge\")}--${variant}`\n );\n\n // Update component config\n component.config.variant = variant;\n\n // Update accessibility attributes\n if (variant === VARIANT_SMALL) {\n component.element.textContent = \"\";\n component.element.setAttribute(\"aria-hidden\", \"true\");\n } else {\n component.element.setAttribute(\"role\", \"status\");\n\n // Restore label for large badges\n if (component.config.label !== undefined) {\n badgeComponent.setLabel(component.config.label);\n }\n }\n\n return badgeComponent;\n },\n\n /**\n * Sets badge position\n * @param {string} position - Position variant to apply\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n setPosition(position: BadgePosition | string) {\n // Remove existing position classes\n ALL_POSITIONS.forEach((posName) => {\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--${posName}`\n );\n });\n\n // Add new position class\n component.element.classList.add(\n `${component.getClass(\"badge\")}--${position}`\n );\n\n return badgeComponent;\n },\n\n /**\n * Attaches badge to a target element\n * @param {HTMLElement} target - Element to attach badge to\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n attachTo(target: HTMLElement) {\n // If we already have a wrapper, remove the badge from it\n if (\n component.wrapper &&\n component.wrapper.contains(component.element)\n ) {\n component.wrapper.removeChild(component.element);\n }\n\n // Create a new wrapper to hold the target and badge\n const wrapper = document.createElement(\"div\");\n wrapper.classList.add(component.getClass(\"badge-wrapper\"));\n wrapper.style.position = \"relative\";\n\n // Replace the target with the wrapper\n const parent = target.parentNode;\n if (parent) {\n parent.replaceChild(wrapper, target);\n wrapper.appendChild(target);\n wrapper.appendChild(component.element);\n\n // Make sure the badge is positioned\n component.element.classList.add(\n `${component.getClass(\"badge\")}--positioned`\n );\n\n // Save the wrapper reference\n component.wrapper = wrapper;\n badgeComponent.wrapper = wrapper;\n }\n\n return badgeComponent;\n },\n\n /**\n * Makes badge standalone (removes from wrapper)\n * @returns {BadgeComponent} Badge component instance for chaining\n */\n detach() {\n if (\n component.wrapper &&\n component.wrapper.contains(component.element)\n ) {\n // Remove the badge from the wrapper\n component.wrapper.removeChild(component.element);\n\n // Remove the positioned class\n component.element.classList.remove(\n `${component.getClass(\"badge\")}--positioned`\n );\n\n // Add the badge to the document body or another container\n document.body.appendChild(component.element);\n\n // Clear the wrapper reference\n component.wrapper = undefined;\n badgeComponent.wrapper = undefined;\n }\n\n return badgeComponent;\n },\n\n /**\n * Destroys the badge component and cleans up resources\n */\n destroy() {\n lifecycle.destroy();\n\n // If badge is in a wrapper, restore the original DOM structure\n if (component.wrapper) {\n const target = component.wrapper.firstChild as HTMLElement;\n const parent = component.wrapper.parentNode;\n\n if (parent && target) {\n parent.replaceChild(target, component.wrapper);\n }\n }\n },\n\n // Forward basic component methods for API consistency\n addClass: (...classes: string[]) => {\n component.addClass(...classes);\n return badgeComponent;\n },\n removeClass: (...classes: string[]) => {\n component.removeClass(...classes);\n return badgeComponent;\n },\n on: (event: string, handler: Function) => {\n component.on(event, handler);\n return badgeComponent;\n },\n off: (event: string, handler: Function) => {\n component.off(event, handler);\n return badgeComponent;\n },\n };\n\n return badgeComponent;\n };\n",
|
|
77
76
|
"// src/components/bottom-app-bar/bottom-app-bar.ts\n/**\n * @module components/bottom-app-bar\n * @description Bottom app bar implementation\n */\n\nimport {\n createBase,\n withElement,\n withEvents,\n withLifecycle,\n} from \"../../core/compose\";\n\nimport { createConfig } from \"./config\";\nimport { BottomAppBar, BottomAppBarConfig } from \"./types\";\n\n/**\n * Creates a bottom app bar component\n *\n * @param {BottomAppBarConfig} config - Configuration options\n * @returns {BottomAppBar} Bottom app bar component instance\n */\nexport const createBottomAppBar = (\n config: BottomAppBarConfig = {}\n): BottomAppBar => {\n // Process configuration with defaults\n const componentConfig = createConfig(config);\n\n // Create base component\n const component = createBase(componentConfig);\n\n // Create actions container\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className = `${component.getClass(\n \"bottom-app-bar\"\n )}-actions`;\n\n // FAB container for proper positioning\n const fabContainer = document.createElement(\"div\");\n fabContainer.className = `${component.getClass(\n \"bottom-app-bar\"\n )}-fab-container`;\n\n // Apply Element enhancer\n const enhancedComponent = withElement({\n tag: componentConfig.tag,\n componentName: \"bottom-app-bar\",\n className: [\n componentConfig.hasFab\n ? `${component.getClass(\"bottom-app-bar\")}--with-fab`\n : \"\",\n componentConfig.fabPosition === \"center\"\n ? `${component.getClass(\"bottom-app-bar\")}--fab-center`\n : \"\",\n componentConfig.class,\n ],\n attributes: {\n role: \"toolbar\",\n \"aria-label\": \"Bottom app bar\",\n },\n interactive: true,\n })(component);\n\n // Apply events enhancer for component events\n const withEventsComponent = withEvents()(enhancedComponent);\n\n // Apply lifecycle enhancer for cleanup\n const withLifecycleComponent = withLifecycle()(withEventsComponent);\n\n // Append actions and FAB containers to the main element\n withLifecycleComponent.element.appendChild(actionsContainer);\n withLifecycleComponent.element.appendChild(fabContainer);\n\n // Flag to track visibility\n let isVisible = true;\n\n // Previous scroll position for determining scroll direction\n let prevScrollY = window.scrollY;\n\n // Handle scrolling behavior if autoHide is enabled\n if (componentConfig.autoHide) {\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n // Determine scroll direction\n if (currentScrollY > prevScrollY + 10) {\n // Scrolling down - hide the bottom bar\n if (isVisible) {\n bottomBar.hide();\n componentConfig.onVisibilityChange?.(false);\n }\n } else if (currentScrollY < prevScrollY - 10) {\n // Scrolling up - show the bottom bar\n if (!isVisible) {\n bottomBar.show();\n componentConfig.onVisibilityChange?.(true);\n }\n }\n\n prevScrollY = currentScrollY;\n };\n\n // Add scroll event listener\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // Clean up event listener on destroy\n const originalDestroy = withLifecycleComponent.lifecycle.destroy;\n withLifecycleComponent.lifecycle.destroy = () => {\n window.removeEventListener(\"scroll\", handleScroll);\n originalDestroy();\n };\n }\n\n const bottomBar: BottomAppBar = {\n ...withLifecycleComponent,\n\n addAction(button: HTMLElement) {\n actionsContainer.appendChild(button);\n return this;\n },\n\n addFab(fab: HTMLElement) {\n // Clear existing FAB if any\n fabContainer.innerHTML = \"\";\n\n // Add the new FAB\n fabContainer.appendChild(fab);\n\n // Update component class to indicate it has a FAB\n this.element.classList.add(\n `${component.getClass(\"bottom-app-bar\")}--with-fab`\n );\n\n return this;\n },\n\n show() {\n this.element.classList.remove(\n `${component.getClass(\"bottom-app-bar\")}--hidden`\n );\n isVisible = true;\n return this;\n },\n\n hide() {\n this.element.classList.add(\n `${component.getClass(\"bottom-app-bar\")}--hidden`\n );\n isVisible = false;\n return this;\n },\n\n isVisible() {\n return isVisible;\n },\n\n getActionsContainer() {\n return actionsContainer;\n },\n };\n\n // Set the appropriate styles for transitions if needed\n if (componentConfig.autoHide && componentConfig.transitionDuration) {\n bottomBar.element.style.transition = `transform ${componentConfig.transitionDuration}ms ease-in-out`;\n }\n\n return bottomBar;\n};\n",
|
|
78
77
|
"// src/components/bottom-app-bar/config.ts\n/**\n * @module components/bottom-app-bar\n * @description Configuration for bottom app bar component\n */\n\nimport { createComponentConfig } from \"../../core/config/component\";\nimport { BottomAppBarConfig } from \"./types\";\nimport { FAB_POSITIONS, DEFAULT_TRANSITION_DURATION } from \"./constants\";\n\n/**\n * Default configuration for bottom app bar\n */\nexport const defaultConfig: Partial<BottomAppBarConfig> = {\n tag: \"div\",\n hasFab: false,\n fabPosition: FAB_POSITIONS.END,\n autoHide: false,\n transitionDuration: DEFAULT_TRANSITION_DURATION,\n};\n\n/**\n * Creates the configuration for a bottom app bar component\n *\n * @param {BottomAppBarConfig} config - User provided configuration\n * @returns {BottomAppBarConfig} Complete configuration with defaults applied\n */\nexport const createConfig = (\n config: BottomAppBarConfig = {} as BottomAppBarConfig\n): BottomAppBarConfig =>\n createComponentConfig(\n defaultConfig,\n config,\n \"bottom-app-bar\"\n ) as BottomAppBarConfig;\n",
|
|
79
78
|
"// src/components/bottom-app-bar/constants.ts\n\n/**\n * FAB position constants for Bottom App Bar\n */\nexport const FAB_POSITIONS = {\n CENTER: 'center',\n END: 'end'\n} as const;\n\n/**\n * Default transition duration for show/hide animations\n */\nexport const DEFAULT_TRANSITION_DURATION = 300;\n\n/**\n * CSS class names used in the bottom app bar component\n */\nexport const BOTTOM_APP_BAR_CLASSES = {\n ROOT: 'bottom-app-bar',\n ACTIONS: 'bottom-app-bar-actions',\n FAB_CONTAINER: 'bottom-app-bar-fab',\n HIDDEN: 'bottom-app-bar--hidden',\n FAB_CENTER: 'bottom-app-bar--fab-center',\n FAB_END: 'bottom-app-bar--fab-end'\n} as const;",
|
|
80
79
|
"// src/components/bottom-app-bar/index.ts\n/**\n * @module components/bottom-app-bar\n * @description Bottom app bar component for mobile interfaces\n */\n\nimport { createBottomAppBar } from './bottom-app-bar';\n\nexport default createBottomAppBar;\nexport { createBottomAppBar };\nexport type { BottomAppBarConfig, BottomAppBar } from './types';",
|
|
81
|
-
"// src/components/button-group/button-group.ts\n\nimport { pipe } from '../../core/compose/pipe';\nimport { createBase, withElement } from '../../core/compose/component';\nimport { withEvents, withLifecycle } from '../../core/compose/features';\nimport { createEmitter } from '../../core/state/emitter';\nimport createButton from '../button';\nimport {\n ButtonGroupConfig,\n ButtonGroupComponent,\n ButtonGroupVariant,\n ButtonGroupOrientation,\n ButtonGroupDensity,\n ButtonGroupEvent\n} from './types';\nimport { ButtonComponent } from '../button/types';\nimport {\n createBaseConfig,\n getContainerConfig,\n getDensityStyles,\n getButtonConfig\n} from './config';\nimport {\n BUTTON_GROUP_DEFAULTS,\n BUTTON_GROUP_DENSITY\n} from './constants';\n\n/**\n * Creates a new Button Group component\n *\n * The Button Group component provides a container for grouping related action buttons.\n * Unlike Segmented Buttons (used for selection), Button Groups are for grouping\n * related actions where each button triggers an independent action.\n *\n * Per Material Design 3 specifications:\n * - Buttons are visually connected with shared borders\n * - Only outer corners are rounded\n * - All buttons share the same variant for visual consistency\n * - Supports horizontal and vertical orientations\n * - Supports density scaling\n *\n * @param {ButtonGroupConfig} config - Button Group configuration\n * @returns {ButtonGroupComponent} Button Group component instance\n *\n * @example\n * // Create a horizontal button group for text formatting\n * const formattingTools = createButtonGroup({\n * buttons: [\n * { icon: boldIcon, ariaLabel: 'Bold' },\n * { icon: italicIcon, ariaLabel: 'Italic' },\n * { icon: underlineIcon, ariaLabel: 'Underline' }\n * ],\n * variant: 'outlined',\n * ariaLabel: 'Text formatting options'\n * });\n *\n * // Listen for button clicks\n * formattingTools.on('click', (event) => {\n * console.log('Button clicked:', event.index);\n * });\n *\n * @example\n * // Create a vertical button group with text labels\n * const navigationGroup = createButtonGroup({\n * buttons: [\n * { text: 'Previous', icon: prevIcon },\n * { text: 'Play', icon: playIcon },\n * { text: 'Next', icon: nextIcon }\n * ],\n * orientation: 'vertical',\n * variant: 'tonal'\n * });\n *\n * @category Components\n */\nconst createButtonGroup = (config: ButtonGroupConfig = {}): ButtonGroupComponent => {\n // Process configuration\n const baseConfig = createBaseConfig(config);\n const emitter = createEmitter();\n\n // Track current state\n let currentVariant: ButtonGroupVariant = baseConfig.variant || BUTTON_GROUP_DEFAULTS.VARIANT;\n let currentOrientation: ButtonGroupOrientation = baseConfig.orientation || BUTTON_GROUP_DEFAULTS.ORIENTATION;\n let currentDensity: ButtonGroupDensity = baseConfig.density || BUTTON_GROUP_DEFAULTS.DENSITY;\n\n try {\n // Create the base component with container element\n const component = pipe(\n createBase,\n withEvents(),\n withElement(getContainerConfig(baseConfig)),\n withLifecycle()\n )(baseConfig);\n\n // Apply density styles\n const densityStyles = getDensityStyles(currentDensity);\n Object.entries(densityStyles).forEach(([prop, value]) => {\n component.element.style.setProperty(prop, value);\n });\n\n // Create buttons\n const buttons: ButtonComponent[] = [];\n const buttonConfigs = baseConfig.buttons || [];\n const totalButtons = buttonConfigs.length;\n\n buttonConfigs.forEach((buttonConfig, index) => {\n // Get configuration for this button with group-specific settings\n const resolvedConfig = getButtonConfig(\n buttonConfig,\n index,\n totalButtons,\n baseConfig\n );\n\n // Create button component\n const button = createButton(resolvedConfig);\n\n // Store reference to original config for later use\n (button as any)._groupConfig = buttonConfig;\n (button as any)._groupIndex = index;\n\n // Add click handler that emits group event\n button.on('click', (originalEvent: Event) => {\n if (!button.disabled?.isDisabled()) {\n const groupEvent: ButtonGroupEvent = {\n buttonGroup: buttonGroup,\n button: button,\n index: index,\n originalEvent: originalEvent\n };\n emitter.emit('click', groupEvent);\n }\n });\n\n // Add focus handler\n button.on('focus', (originalEvent: Event) => {\n const groupEvent: ButtonGroupEvent = {\n buttonGroup: buttonGroup,\n button: button,\n index: index,\n originalEvent: originalEvent\n };\n emitter.emit('focus', groupEvent);\n });\n\n // Add blur handler\n button.on('blur', (originalEvent: Event) => {\n const groupEvent: ButtonGroupEvent = {\n buttonGroup: buttonGroup,\n button: button,\n index: index,\n originalEvent: originalEvent\n };\n emitter.emit('blur', groupEvent);\n });\n\n // Add to container\n component.element.appendChild(button.element);\n buttons.push(button);\n });\n\n /**\n * Updates the variant for all buttons\n * @param {ButtonGroupVariant} variant - New variant\n * @private\n */\n const updateVariant = (variant: ButtonGroupVariant) => {\n // Update container class\n const variantClasses = ['filled', 'tonal', 'outlined', 'elevated', 'text'];\n variantClasses.forEach(v => {\n component.element.classList.remove(`${baseConfig.prefix}-button-group--${v}`);\n });\n component.element.classList.add(`${baseConfig.prefix}-button-group--${variant}`);\n component.element.setAttribute('data-variant', variant);\n\n // Update each button's variant\n buttons.forEach(button => {\n button.setVariant(variant);\n });\n\n currentVariant = variant;\n };\n\n /**\n * Updates the orientation of the button group\n * @param {ButtonGroupOrientation} orientation - New orientation\n * @private\n */\n const updateOrientation = (orientation: ButtonGroupOrientation) => {\n component.element.classList.remove(\n `${baseConfig.prefix}-button-group--horizontal`,\n `${baseConfig.prefix}-button-group--vertical`\n );\n component.element.classList.add(`${baseConfig.prefix}-button-group--${orientation}`);\n component.element.setAttribute('data-orientation', orientation);\n currentOrientation = orientation;\n };\n\n /**\n * Updates the density of the button group\n * @param {ButtonGroupDensity} density - New density\n * @private\n */\n const updateDensity = (density: ButtonGroupDensity) => {\n // Remove existing density classes\n Object.values(BUTTON_GROUP_DENSITY).forEach(d => {\n if (d !== BUTTON_GROUP_DENSITY.DEFAULT) {\n component.element.classList.remove(`${baseConfig.prefix}-button-group--density-${d}`);\n }\n });\n\n // Add new density class if not default\n if (density !== BUTTON_GROUP_DENSITY.DEFAULT) {\n component.element.classList.add(`${baseConfig.prefix}-button-group--density-${density}`);\n }\n\n // Update data attribute\n component.element.setAttribute('data-density', density);\n\n // Apply density styles\n const densityStyles = getDensityStyles(density);\n Object.entries(densityStyles).forEach(([prop, value]) => {\n component.element.style.setProperty(prop, value);\n });\n\n currentDensity = density;\n };\n\n // Create the component API\n const buttonGroup: ButtonGroupComponent = {\n element: component.element,\n buttons,\n\n getButton(index: number) {\n return buttons[index];\n },\n\n getButtonById(id: string) {\n return buttons.find(button => {\n const config = (button as any)._groupConfig;\n return config?.id === id || config?.value === id;\n });\n },\n\n getVariant() {\n return currentVariant;\n },\n\n setVariant(variant: ButtonGroupVariant) {\n updateVariant(variant);\n return this;\n },\n\n getOrientation() {\n return currentOrientation;\n },\n\n setOrientation(orientation: ButtonGroupOrientation) {\n updateOrientation(orientation);\n return this;\n },\n\n getDensity() {\n return currentDensity;\n },\n\n setDensity(density: ButtonGroupDensity) {\n updateDensity(density);\n return this;\n },\n\n enable() {\n component.element.classList.remove(`${baseConfig.prefix}-button-group--disabled`);\n buttons.forEach(button => {\n // Only enable if not individually disabled\n const config = (button as any)._groupConfig;\n if (!config?.disabled) {\n button.enable();\n }\n });\n return this;\n },\n\n disable() {\n component.element.classList.add(`${baseConfig.prefix}-button-group--disabled`);\n buttons.forEach(button => {\n button.disable();\n });\n return this;\n },\n\n enableButton(index: number) {\n const button = buttons[index];\n if (button) {\n button.enable();\n }\n return this;\n },\n\n disableButton(index: number) {\n const button = buttons[index];\n if (button) {\n button.disable();\n }\n return this;\n },\n\n on(event, handler) {\n emitter.on(event, handler);\n return this;\n },\n\n off(event, handler) {\n emitter.off(event, handler);\n return this;\n },\n\n destroy() {\n // Destroy all buttons\n buttons.forEach(button => {\n button.destroy();\n });\n\n // Clear buttons array\n buttons.length = 0;\n\n // Clear emitter\n emitter.clear();\n\n // Destroy base component\n component.lifecycle.destroy();\n }\n };\n\n return buttonGroup;\n } catch (error) {\n console.error('Button Group creation error:', error);\n throw new Error(`Failed to create button group: ${(error as Error).message}`);\n }\n};\n\nexport default createButtonGroup;\n",
|
|
82
|
-
"// src/components/button-group/config.ts\n\nimport { createComponentConfig } from '../../core/config/component';\nimport {\n ButtonGroupConfig,\n ButtonGroupVariant,\n ButtonGroupOrientation,\n ButtonGroupDensity\n} from './types';\nimport {\n BUTTON_GROUP_DEFAULTS,\n BUTTON_GROUP_DENSITY,\n BUTTON_GROUP_HEIGHTS,\n BUTTON_GROUP_RADII\n} from './constants';\n\n/**\n * Default configuration values for button groups\n * @internal\n */\nexport const DEFAULT_CONFIG: Partial<ButtonGroupConfig> = {\n variant: BUTTON_GROUP_DEFAULTS.VARIANT,\n orientation: BUTTON_GROUP_DEFAULTS.ORIENTATION,\n density: BUTTON_GROUP_DEFAULTS.DENSITY,\n ripple: BUTTON_GROUP_DEFAULTS.RIPPLE,\n equalWidth: BUTTON_GROUP_DEFAULTS.EQUAL_WIDTH,\n disabled: false,\n buttons: []\n};\n\n/**\n * Creates the base configuration for Button Group component\n * @param {ButtonGroupConfig} config - User provided configuration\n * @returns {ButtonGroupConfig} Complete configuration with defaults applied\n * @internal\n */\nexport const createBaseConfig = (\n config: ButtonGroupConfig = {}\n): ButtonGroupConfig =>\n createComponentConfig(\n DEFAULT_CONFIG,\n config,\n 'button-group'\n ) as ButtonGroupConfig;\n\n/**\n * Generates element configuration for the Button Group container\n * @param {ButtonGroupConfig} config - Button Group configuration\n * @returns {Object} Element configuration object for withElement\n * @internal\n */\nexport const getContainerConfig = (config: ButtonGroupConfig) => {\n const variant = config.variant || BUTTON_GROUP_DEFAULTS.VARIANT;\n const orientation = config.orientation || BUTTON_GROUP_DEFAULTS.ORIENTATION;\n const density = config.density || BUTTON_GROUP_DEFAULTS.DENSITY;\n\n return {\n tag: 'div',\n componentName: 'button-group',\n attributes: {\n role: 'group',\n 'aria-label': config.ariaLabel || 'Button group',\n 'data-variant': variant,\n 'data-orientation': orientation,\n 'data-density': density\n },\n className: [\n config.class,\n config.disabled ? `${config.prefix}-button-group--disabled` : null,\n `${config.prefix}-button-group--${orientation}`,\n `${config.prefix}-button-group--${variant}`,\n density !== BUTTON_GROUP_DENSITY.DEFAULT\n ? `${config.prefix}-button-group--density-${density}`\n : null,\n config.equalWidth ? `${config.prefix}-button-group--equal-width` : null\n ],\n interactive: true\n };\n};\n\n/**\n * Gets density-specific sizing values per MD3 specifications\n * @param {ButtonGroupDensity} density - The density level\n * @returns {Object} CSS variables with sizing values\n * @internal\n */\nexport const getDensityStyles = (\n density: ButtonGroupDensity\n): Record<string, string> => {\n const height = BUTTON_GROUP_HEIGHTS[density] || BUTTON_GROUP_HEIGHTS.default;\n const radius = BUTTON_GROUP_RADII[density] || BUTTON_GROUP_RADII.default;\n\n return {\n '--button-group-height': `${height}px`,\n '--button-group-radius': `${radius}px`\n };\n};\n\n/**\n * Generates configuration for a button element within the group\n * @param {Object} buttonConfig - Button configuration\n * @param {number} index - Button index in the group\n * @param {number} total - Total number of buttons\n * @param {ButtonGroupConfig} groupConfig - Parent group configuration\n * @returns {Object} Button configuration with group-specific settings\n * @internal\n */\nexport const getButtonConfig = (\n buttonConfig: ButtonGroupConfig['buttons'][number],\n index: number,\n total: number,\n groupConfig: ButtonGroupConfig\n) => {\n const isFirst = index === 0;\n const isLast = index === total - 1;\n const isSingle = total === 1;\n\n // Determine position class\n let positionClass = '';\n if (isSingle) {\n positionClass = `${groupConfig.prefix}-button-group__button--single`;\n } else if (isFirst) {\n positionClass = `${groupConfig.prefix}-button-group__button--first`;\n } else if (isLast) {\n positionClass = `${groupConfig.prefix}-button-group__button--last`;\n } else {\n positionClass = `${groupConfig.prefix}-button-group__button--middle`;\n }\n\n return {\n ...buttonConfig,\n variant: groupConfig.variant,\n disabled: groupConfig.disabled || buttonConfig.disabled,\n ripple: groupConfig.ripple,\n rippleConfig: groupConfig.rippleConfig,\n class: [\n `${groupConfig.prefix}-button-group__button`,\n positionClass,\n buttonConfig.class\n ].filter(Boolean).join(' ')\n };\n};\n\n/**\n * Maps variant name to button variant\n * @param {ButtonGroupVariant} variant - Group variant\n * @returns {string} Button variant name\n * @internal\n */\nexport const mapVariantToButton = (variant: ButtonGroupVariant): string => {\n return variant;\n};\n\n/**\n * Validates button group configuration\n * @param {ButtonGroupConfig} config - Configuration to validate\n * @returns {boolean} Whether configuration is valid\n * @internal\n */\nexport const validateConfig = (config: ButtonGroupConfig): boolean => {\n // Ensure buttons array exists\n if (!config.buttons || !Array.isArray(config.buttons)) {\n return false;\n }\n\n // Ensure icon-only buttons have aria-label\n for (const button of config.buttons) {\n if (button.icon && !button.text && !button.ariaLabel) {\n console.warn(\n 'Button Group: Icon-only buttons require an ariaLabel for accessibility'\n );\n }\n }\n\n return true;\n};\n",
|
|
83
|
-
"// src/components/button-
|
|
80
|
+
"// src/components/index.ts\n/**\n * Component library exports\n *\n * This file exports all component creators and their types.\n * Constants are NOT re-exported here to enable proper tree-shaking.\n * Import constants directly from component paths if needed.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Component Creators\n// ============================================================================\n\nexport { default as createBadge } from \"./badge\";\nexport { default as createBottomAppBar } from \"./bottom-app-bar\";\nexport { default as createButton } from \"./button\";\nexport { default as createButtonGroup } from \"./button-group\";\nexport { default as createCard } from \"./card\";\nexport { default as createCarousel } from \"./carousel\";\nexport { default as createCheckbox } from \"./checkbox\";\nexport { createChip, createChips } from \"./chips\";\nexport { default as createDatePicker } from \"./datepicker\";\nexport { default as createDialog } from \"./dialog\";\nexport { createDivider } from \"./divider\";\nexport { default as createDrawer } from \"./drawer\";\nexport { default as createFab } from \"./fab\";\nexport { default as createExtendedFab } from \"./extended-fab\";\nexport { default as createIconButton } from \"./icon-button\";\nexport { default as createList } from \"./list\";\nexport { default as createMenu } from \"./menu\";\nexport { default as createNavigation } from \"./navigation\";\nexport { default as createNavigationSystem } from \"./navigation/system\";\n\nexport { default as createProgress } from \"./progress\";\nexport { default as createRadios } from \"./radios\";\nexport { default as createSearch } from \"./search\";\nexport { default as createSelect } from \"./select\";\nexport { default as createSegmentedButton } from \"./segmented-button\";\nexport { createSegment } from \"./segmented-button/segment\";\nexport { default as createSheet } from \"./sheet\";\nexport { default as createSlider } from \"./slider\";\nexport { default as createSnackbar } from \"./snackbar\";\nexport { default as createSwitch } from \"./switch\";\nexport { default as createTabs } from \"./tabs\";\nexport { createTab } from \"./tabs/tab\";\nexport { default as createTextfield } from \"./textfield\";\nexport { default as createTimePicker } from \"./timepicker\";\nexport { default as createTopAppBar } from \"./top-app-bar\";\nexport { default as createTooltip } from \"./tooltip\";\n\n// Card content components\nexport {\n createCardContent,\n createCardHeader,\n createCardActions,\n createCardMedia,\n} from \"./card/content\";\n\n// ============================================================================\n// Type Exports (these are erased at compile time, zero bundle impact)\n// ============================================================================\n\n// Badge\nexport type { BadgeConfig, BadgeComponent } from \"./badge/types\";\n\n// Bottom App Bar\nexport type { BottomAppBarConfig, BottomAppBar } from \"./bottom-app-bar/types\";\n\n// Button\nexport type {\n ButtonConfig,\n ButtonComponent,\n ButtonVariant,\n} from \"./button/types\";\n\n// Button Group\nexport type {\n ButtonGroupConfig,\n ButtonGroupComponent,\n ButtonGroupItemConfig,\n ButtonGroupEvent,\n ButtonGroupEventType,\n ButtonGroupVariant,\n ButtonGroupOrientation,\n ButtonGroupDensity,\n} from \"./button-group/types\";\n\n// Card\nexport type { CardSchema } from \"./card/types\";\n\n// Carousel\nexport type { CarouselConfig, CarouselComponent } from \"./carousel/types\";\n\n// Checkbox\nexport type { CheckboxConfig, CheckboxComponent } from \"./checkbox/types\";\n\n// Chips\nexport type {\n ChipConfig,\n ChipComponent,\n ChipVariant,\n ChipsConfig,\n ChipsComponent,\n} from \"./chips/types\";\n\n// Datepicker\nexport type { DatePickerConfig, DatePickerComponent } from \"./datepicker/types\";\n\n// Dialog\nexport type { DialogConfig, DialogComponent } from \"./dialog/types\";\n\n// Drawer\nexport type {\n DrawerConfig,\n DrawerComponent,\n DrawerVariant,\n DrawerPosition,\n DrawerItemConfig,\n DrawerSelectEvent,\n} from \"./drawer/types\";\n\n// Divider\nexport type { DividerConfig } from \"./divider/config\";\nexport type { DividerComponent } from \"./divider/types\";\n\n// FAB\nexport type { FabConfig, FabComponent } from \"./fab/types\";\n\n// Extended FAB\nexport type {\n ExtendedFabConfig,\n ExtendedFabComponent,\n} from \"./extended-fab/types\";\n\n// Icon Button\nexport type {\n IconButtonConfig,\n IconButtonComponent,\n} from \"./icon-button/types\";\n\n// List\nexport type {\n ListConfig,\n ListComponent,\n SelectEvent as ListSelectEvent,\n LoadEvent,\n} from \"./list/types\";\n\n// Menu\nexport type { MenuConfig, MenuComponent, MenuItem } from \"./menu/types\";\n\n// Progress\nexport type {\n ProgressConfig,\n ProgressComponent,\n ProgressShape,\n} from \"./progress/types\";\n\n// Radios\nexport type {\n RadiosConfig,\n RadiosComponent,\n RadioOptionConfig,\n} from \"./radios/types\";\n\n// Search\nexport type { SearchConfig, SearchComponent } from \"./search/types\";\n\n// Select\nexport type {\n SelectConfig,\n SelectComponent,\n SelectOption,\n SelectEvent,\n SelectChangeEvent,\n} from \"./select/types\";\n\n// Segmented Button\nexport type {\n SegmentedButtonConfig,\n SegmentedButtonComponent,\n} from \"./segmented-button/types\";\n\n// Sheet\nexport type { SheetConfig, SheetComponent } from \"./sheet/types\";\n\n// Slider\nexport type {\n SliderConfig,\n SliderComponent,\n SliderEvent,\n} from \"./slider/types\";\n\n// Snackbar\nexport type { SnackbarConfig, SnackbarComponent } from \"./snackbar/types\";\n\n// Switch\nexport type { SwitchConfig, SwitchComponent } from \"./switch/types\";\n\n// Tabs\nexport type {\n TabsConfig,\n TabsComponent,\n TabConfig,\n TabComponent,\n} from \"./tabs/types\";\n\n// Textfield\nexport type { TextfieldConfig, TextfieldComponent } from \"./textfield/types\";\n\n// Timepicker\nexport type { TimePickerConfig, TimePickerComponent } from \"./timepicker/types\";\n\n// Top App Bar\nexport type { TopAppBarConfig, TopAppBar } from \"./top-app-bar/types\";\n\n// Tooltip\nexport type { TooltipConfig, TooltipComponent } from \"./tooltip/types\";\n",
|
|
81
|
+
"// src/components/button-group/button-group.ts\n\nimport { pipe } from '../../core/compose/pipe';\nimport { createBase, withElement } from '../../core/compose/component';\nimport { withEvents, withLifecycle } from '../../core/compose/features';\nimport { createEmitter } from '../../core/state/emitter';\nimport createIconButton from '../icon-button/icon-button';\nimport createButton from '../button';\nimport {\n ButtonGroupConfig,\n ButtonGroupComponent,\n ButtonGroupVariant,\n ButtonGroupOrientation,\n ButtonGroupDensity,\n ButtonGroupEvent,\n ButtonGroupChangeEvent,\n ButtonGroupKind,\n ButtonGroupSelection\n} from './types';\nimport { ButtonComponent } from '../button/types';\nimport {\n createBaseConfig,\n getContainerConfig,\n getSizeStyles,\n getButtonConfig\n} from './config';\nimport {\n BUTTON_GROUP_DEFAULTS,\n BUTTON_GROUP_DENSITY,\n BUTTON_GROUP_EXPANDED_RATIO\n} from './constants';\n\n/**\n * Creates a new Button Group component\n *\n * The Button Group component provides a container for grouping related action buttons.\n * Unlike Segmented Buttons (used for selection), Button Groups are for grouping\n * related actions where each button triggers an independent action.\n *\n * Per Material Design 3 specifications:\n * - Standard groups space their buttons (18/12/8/8/8dp by size) and a\n * pressed button briefly widens while its neighbours narrow\n * - Connected groups space their buttons 2dp apart with square inner\n * corners and round outer corners; a selected button becomes a pill\n * - All buttons share the same variant, size and shape\n * - Supports horizontal and vertical orientations\n * - Supports density scaling (4dp per step)\n *\n * @param {ButtonGroupConfig} config - Button Group configuration\n * @returns {ButtonGroupComponent} Button Group component instance\n *\n * @example\n * // Create a horizontal button group for text formatting\n * const formattingTools = createButtonGroup({\n * buttons: [\n * { icon: boldIcon, ariaLabel: 'Bold' },\n * { icon: italicIcon, ariaLabel: 'Italic' },\n * { icon: underlineIcon, ariaLabel: 'Underline' }\n * ],\n * variant: 'outlined',\n * ariaLabel: 'Text formatting options'\n * });\n *\n * // Listen for button clicks\n * formattingTools.on('click', (event) => {\n * console.log('Button clicked:', event.index);\n * });\n *\n * @example\n * // Create a vertical button group with text labels\n * const navigationGroup = createButtonGroup({\n * buttons: [\n * { text: 'Previous', icon: prevIcon },\n * { text: 'Play', icon: playIcon },\n * { text: 'Next', icon: nextIcon }\n * ],\n * orientation: 'vertical',\n * variant: 'tonal'\n * });\n *\n * @category Components\n */\nconst createButtonGroup = (config: ButtonGroupConfig = {}): ButtonGroupComponent => {\n // Process configuration\n const baseConfig = createBaseConfig(config);\n const emitter = createEmitter();\n\n // Track current state\n let currentVariant: ButtonGroupVariant = baseConfig.variant || BUTTON_GROUP_DEFAULTS.VARIANT;\n let currentOrientation: ButtonGroupOrientation = baseConfig.orientation || BUTTON_GROUP_DEFAULTS.ORIENTATION;\n let currentDensity: ButtonGroupDensity = baseConfig.density || BUTTON_GROUP_DEFAULTS.DENSITY;\n const kind: ButtonGroupKind = baseConfig.kind || BUTTON_GROUP_DEFAULTS.KIND;\n const selection: ButtonGroupSelection = baseConfig.selection || BUTTON_GROUP_DEFAULTS.SELECTION;\n const required = Boolean(baseConfig.required);\n const selectedValues = new Set<string>();\n\n try {\n // Create the base component with container element\n const component = pipe(\n createBase,\n withEvents(),\n withElement(getContainerConfig(baseConfig)),\n withLifecycle()\n )(baseConfig);\n\n // Material 3 size, kind and density tokens (height, gap, corners)\n const applySizeStyles = (density: ButtonGroupDensity) => {\n Object.entries(getSizeStyles(baseConfig.size, kind, density)).forEach(([prop, value]) => {\n component.element.style.setProperty(prop, value);\n });\n };\n applySizeStyles(currentDensity);\n\n // Create buttons\n const buttons: ButtonComponent[] = [];\n const buttonConfigs = baseConfig.buttons || [];\n const totalButtons = buttonConfigs.length;\n\n const valueOf = (button: ButtonComponent): string => {\n const config = (button as any)._groupConfig;\n return String(config?.value ?? config?.id ?? (button as any)._groupIndex);\n };\n\n // The buttons carry the M3 toggle colours and shapes themselves; the group\n // only owns which of them is selected.\n const applySelectedState = (button: ButtonComponent, selected: boolean) => {\n const selectedClass = `${baseConfig.prefix}-button-group__button--selected`;\n button.element.classList.toggle(selectedClass, selected);\n button.element.setAttribute('aria-pressed', String(selected));\n const toggleState = (button as any).toggleState;\n if (toggleState?.isToggle?.()) {\n if (selected) toggleState.select();\n else toggleState.deselect();\n } else {\n button.setSelected?.(selected);\n }\n };\n\n // Standard groups: while pressed, a button widens by the expanded ratio\n // of its width and each neighbour gives up the same amount, limited to\n // the neighbour's padding on the facing side so its label never clips\n // (ButtonGroupDefaults.ExpandedRatio and the ButtonGroup measure policy;\n // m3.material.io button group states)\n const expandedRatio = baseConfig.expandedRatio ?? BUTTON_GROUP_EXPANDED_RATIO;\n const releasePress = () => {\n buttons.forEach(b => {\n b.element.style.width = '';\n b.element.style.paddingLeft = '';\n b.element.style.paddingRight = '';\n });\n document.removeEventListener('pointerup', releasePress);\n document.removeEventListener('pointercancel', releasePress);\n };\n const pressExpand = (index: number) => {\n if (kind !== 'standard' || expandedRatio <= 0 || currentOrientation !== 'horizontal') return;\n const widths = buttons.map(b => b.element.getBoundingClientRect().width);\n if (!widths[index]) return;\n const view = component.element.ownerDocument.defaultView;\n const padding = (i: number, side: 'paddingLeft' | 'paddingRight') =>\n view ? parseFloat(view.getComputedStyle(buttons[i].element)[side]) || 0 : 0;\n const previous = buttons[index - 1] ? index - 1 : -1;\n const next = buttons[index + 1] ? index + 1 : -1;\n const middle = previous >= 0 && next >= 0;\n // a middle button shares its growth between both sides, an end button\n // takes all of it from its only neighbour\n const share = expandedRatio * widths[index] / (middle ? 2 : 1);\n let growth = 0;\n const compress = (i: number, side: 'paddingLeft' | 'paddingRight') => {\n const limit = Math.min(share, padding(i, side), widths[i]);\n if (limit <= 0) return;\n buttons[i].element.style.width = `${widths[i] - limit}px`;\n buttons[i].element.style[side] = `${padding(i, side) - limit}px`;\n growth += limit;\n };\n if (previous >= 0) compress(previous, 'paddingRight');\n if (next >= 0) compress(next, 'paddingLeft');\n buttons[index].element.style.width = `${widths[index] + growth}px`;\n document.addEventListener('pointerup', releasePress);\n document.addEventListener('pointercancel', releasePress);\n };\n\n const emitChange = (button?: ButtonComponent, originalEvent?: Event) => {\n const selected = buttons.filter(b => selectedValues.has(valueOf(b)));\n const changeEvent: ButtonGroupChangeEvent = {\n buttonGroup,\n values: selected.map(valueOf),\n selected,\n button,\n originalEvent\n };\n emitter.emit('change', changeEvent);\n };\n\n /** Applies a selection change; returns false when nothing changed. */\n const setSelected = (value: string, selected: boolean, button?: ButtonComponent, originalEvent?: Event): boolean => {\n if (selection === 'none') return false;\n const target = buttons.find(b => valueOf(b) === value);\n if (!target) return false;\n if (selected === selectedValues.has(value)) return false;\n if (!selected && required && selectedValues.size === 1) return false;\n if (selected && selection === 'single') {\n for (const other of buttons) {\n const otherValue = valueOf(other);\n if (otherValue !== value && selectedValues.has(otherValue)) {\n selectedValues.delete(otherValue);\n applySelectedState(other, false);\n }\n }\n }\n if (selected) selectedValues.add(value);\n else selectedValues.delete(value);\n applySelectedState(target, selected);\n emitChange(button ?? target, originalEvent);\n return true;\n };\n\n buttonConfigs.forEach((buttonConfig, index) => {\n const resolvedConfig = getButtonConfig(\n buttonConfig,\n index,\n totalButtons,\n baseConfig\n );\n const selectable = selection !== 'none';\n const iconOnly = Boolean(buttonConfig.icon) && !buttonConfig.text;\n // Icon-only items are icon buttons (the Material spec allows both in a\n // group); they carry their own toggle state and selected icon.\n const button = (iconOnly\n ? createIconButton({\n ...resolvedConfig,\n toggle: selectable,\n toggleOnClick: false,\n selectedIcon: buttonConfig.selectedIcon,\n variant: resolvedConfig.variant === 'text' ? 'standard' : resolvedConfig.variant\n } as any)\n : createButton({\n ...resolvedConfig,\n toggle: selectable,\n toggleOnClick: false\n })) as unknown as ButtonComponent;\n (button as any)._groupConfig = buttonConfig;\n (button as any)._groupIndex = index;\n if (selectable) {\n button.element.setAttribute('aria-pressed', 'false');\n }\n button.element.addEventListener('pointerdown', () => {\n if (!button.disabled?.isDisabled()) pressExpand(index);\n });\n button.on('click', (originalEvent: Event) => {\n if (!button.disabled?.isDisabled()) {\n const groupEvent: ButtonGroupEvent = {\n buttonGroup: buttonGroup,\n button: button,\n index: index,\n originalEvent: originalEvent\n };\n emitter.emit('click', groupEvent);\n if (selection !== 'none') {\n const value = valueOf(button);\n const isSelected = selectedValues.has(value);\n if (selection === 'single') {\n if (!isSelected) setSelected(value, true, button, originalEvent);\n else if (!required) setSelected(value, false, button, originalEvent);\n } else {\n setSelected(value, !isSelected, button, originalEvent);\n }\n }\n }\n });\n button.on('focus', (originalEvent: Event) => {\n const groupEvent: ButtonGroupEvent = {\n buttonGroup: buttonGroup,\n button: button,\n index: index,\n originalEvent: originalEvent\n };\n emitter.emit('focus', groupEvent);\n });\n button.on('blur', (originalEvent: Event) => {\n const groupEvent: ButtonGroupEvent = {\n buttonGroup: buttonGroup,\n button: button,\n index: index,\n originalEvent: originalEvent\n };\n emitter.emit('blur', groupEvent);\n });\n component.element.appendChild(button.element);\n buttons.push(button);\n });\n\n // Initial selection, without events\n if (selection !== 'none') {\n buttons.forEach(button => {\n const config = (button as any)._groupConfig;\n if (config?.selected && (selection === 'multi' || selectedValues.size === 0)) {\n selectedValues.add(valueOf(button));\n applySelectedState(button, true);\n }\n });\n }\n\n const updateVariant = (variant: ButtonGroupVariant) => {\n // Update container class\n const variantClasses = ['filled', 'tonal', 'outlined', 'elevated', 'text'];\n variantClasses.forEach(v => {\n component.element.classList.remove(`${baseConfig.prefix}-button-group--${v}`);\n });\n component.element.classList.add(`${baseConfig.prefix}-button-group--${variant}`);\n component.element.setAttribute('data-variant', variant);\n\n // Update each button's variant\n buttons.forEach(button => {\n button.setVariant(variant);\n });\n\n currentVariant = variant;\n };\n\n /**\n * Updates the orientation of the button group\n * @param {ButtonGroupOrientation} orientation - New orientation\n * @private\n */\n const updateOrientation = (orientation: ButtonGroupOrientation) => {\n component.element.classList.remove(\n `${baseConfig.prefix}-button-group--horizontal`,\n `${baseConfig.prefix}-button-group--vertical`\n );\n component.element.classList.add(`${baseConfig.prefix}-button-group--${orientation}`);\n component.element.setAttribute('data-orientation', orientation);\n currentOrientation = orientation;\n };\n\n /**\n * Updates the density of the button group\n * @param {ButtonGroupDensity} density - New density\n * @private\n */\n const updateDensity = (density: ButtonGroupDensity) => {\n // Remove existing density classes\n Object.values(BUTTON_GROUP_DENSITY).forEach(d => {\n if (d !== BUTTON_GROUP_DENSITY.DEFAULT) {\n component.element.classList.remove(`${baseConfig.prefix}-button-group--density-${d}`);\n }\n });\n\n // Add new density class if not default\n if (density !== BUTTON_GROUP_DENSITY.DEFAULT) {\n component.element.classList.add(`${baseConfig.prefix}-button-group--density-${density}`);\n }\n\n // Update data attribute\n component.element.setAttribute('data-density', density);\n\n applySizeStyles(density);\n currentDensity = density;\n };\n\n // Create the component API\n const buttonGroup: ButtonGroupComponent = {\n element: component.element,\n buttons,\n\n getButton(index: number) {\n return buttons[index];\n },\n\n getButtonById(id: string) {\n return buttons.find(button => {\n const config = (button as any)._groupConfig;\n return config?.id === id || config?.value === id;\n });\n },\n\n getVariant() {\n return currentVariant;\n },\n\n setVariant(variant: ButtonGroupVariant) {\n updateVariant(variant);\n return this;\n },\n\n getOrientation() {\n return currentOrientation;\n },\n\n setOrientation(orientation: ButtonGroupOrientation) {\n updateOrientation(orientation);\n return this;\n },\n\n getDensity() {\n return currentDensity;\n },\n\n setDensity(density: ButtonGroupDensity) {\n updateDensity(density);\n return this;\n },\n\n enable() {\n component.element.classList.remove(`${baseConfig.prefix}-button-group--disabled`);\n buttons.forEach(button => {\n // Only enable if not individually disabled\n const config = (button as any)._groupConfig;\n if (!config?.disabled) {\n button.enable();\n }\n });\n return this;\n },\n\n disable() {\n component.element.classList.add(`${baseConfig.prefix}-button-group--disabled`);\n buttons.forEach(button => {\n button.disable();\n });\n return this;\n },\n\n enableButton(index: number) {\n const button = buttons[index];\n if (button) {\n button.enable();\n }\n return this;\n },\n getSelected() {\n return buttons.filter(b => selectedValues.has(valueOf(b))).map(valueOf);\n },\n isSelected(value: string) {\n return selectedValues.has(value);\n },\n select(value: string) {\n setSelected(value, true);\n return this;\n },\n deselect(value: string) {\n setSelected(value, false);\n return this;\n },\n toggle(value: string) {\n setSelected(value, !selectedValues.has(value));\n return this;\n },\n getKind() {\n return kind;\n },\n getSelection() {\n return selection;\n },\n\n disableButton(index: number) {\n const button = buttons[index];\n if (button) {\n button.disable();\n }\n return this;\n },\n\n on(event, handler) {\n emitter.on(event, handler);\n return this;\n },\n\n off(event, handler) {\n emitter.off(event, handler);\n return this;\n },\n\n destroy() {\n releasePress();\n\n // Destroy all buttons\n buttons.forEach(button => {\n button.destroy();\n });\n\n // Clear buttons array\n buttons.length = 0;\n\n // Clear emitter\n emitter.clear();\n\n // Destroy base component\n component.lifecycle.destroy();\n }\n };\n\n return buttonGroup;\n } catch (error) {\n console.error('Button Group creation error:', error);\n throw new Error(`Failed to create button group: ${(error as Error).message}`);\n }\n};\n\nexport default createButtonGroup;\n",
|
|
82
|
+
"// src/components/icon-button/icon-button.ts\n\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport {\n withEvents,\n withIcon,\n withVariant,\n withSize,\n withRipple,\n withDisabled,\n withLifecycle\n} from '../../core/compose/features';\nimport { withToggle } from './features/toggle';\nimport { withAPI } from './api';\nimport { IconButtonConfig, IconButtonComponent } from './types';\nimport { createBaseConfig, getElementConfig, getApiConfig } from './config';\n\n/**\n * Creates a new IconButton component with the specified configuration.\n *\n * IconButtons display actions in a compact form using icons. They must use\n * a system icon with a clear meaning. IconButtons support both default\n * (single action) and toggle (binary state) modes.\n *\n * The IconButton component is created using a functional composition pattern,\n * applying various features through the pipe function. This approach allows\n * for flexible and modular component construction.\n *\n * @param config - Configuration options for the icon button\n * This can include icon content, variant styling, size, shape, width,\n * toggle behavior, and other properties. See {@link IconButtonConfig}\n * for available options.\n *\n * @returns A fully configured IconButton component instance with\n * all requested features applied. The returned component has methods for\n * manipulation, event handling, and lifecycle management.\n *\n * @throws Error if IconButton creation fails for any reason\n *\n * @example\n * ```ts\n * // Create a standard icon button\n * const menuButton = createIconButton({\n * icon: '<svg>...</svg>',\n * ariaLabel: 'Open menu'\n * });\n *\n * // Create a filled icon button\n * const addButton = createIconButton({\n * icon: '<svg>...</svg>',\n * variant: 'filled',\n * ariaLabel: 'Add item'\n * });\n *\n * // Create a toggle icon button (favorite)\n * const favoriteButton = createIconButton({\n * icon: '<svg>...</svg>', // outlined heart\n * selectedIcon: '<svg>...</svg>', // filled heart\n * toggle: true,\n * variant: 'standard',\n * ariaLabel: 'Add to favorites'\n * });\n *\n * // Listen for toggle events\n * favoriteButton.on('toggle', (e) => {\n * console.log('Selected:', e.detail.selected);\n * });\n *\n * // Create different sizes\n * const smallButton = createIconButton({\n * icon: '<svg>...</svg>',\n * size: 'xs',\n * ariaLabel: 'Small action'\n * });\n *\n * const largeButton = createIconButton({\n * icon: '<svg>...</svg>',\n * size: 'xl',\n * variant: 'tonal',\n * ariaLabel: 'Large action'\n * });\n *\n * // Create square shaped button\n * const squareButton = createIconButton({\n * icon: '<svg>...</svg>',\n * shape: 'square',\n * variant: 'outlined',\n * ariaLabel: 'Square action'\n * });\n *\n * // Create with different widths\n * const wideButton = createIconButton({\n * icon: '<svg>...</svg>',\n * width: 'wide',\n * ariaLabel: 'Wide action'\n * });\n * ```\n *\n * @category Components\n */\nconst createIconButton = (config: IconButtonConfig = {}): IconButtonComponent => {\n const baseConfig = createBaseConfig(config);\n\n try {\n const iconButton = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withSize(baseConfig),\n withIcon(baseConfig),\n withDisabled(baseConfig),\n withToggle(baseConfig),\n withRipple(baseConfig),\n withLifecycle(),\n // Add shape class if specified and not default\n (component) => {\n if (baseConfig.shape && baseConfig.shape !== 'round' && component.element) {\n const className = `${baseConfig.prefix}-${baseConfig.componentName}--${baseConfig.shape}`;\n component.element.classList.add(className);\n }\n return component;\n },\n // Add width class if specified and not default\n (component) => {\n if (baseConfig.width && baseConfig.width !== 'default' && component.element) {\n const className = `${baseConfig.prefix}-${baseConfig.componentName}--${baseConfig.width}`;\n component.element.classList.add(className);\n }\n return component;\n },\n (comp) => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n\n return iconButton;\n } catch (error) {\n console.error('IconButton creation error:', error);\n throw new Error(`Failed to create icon button: ${(error as Error).message}`);\n }\n};\n\nexport default createIconButton;\n",
|
|
83
|
+
"// src/components/icon-button/features/toggle.ts\n\nimport { ElementComponent } from \"../../../core/compose/component\";\n\n/**\n * Configuration for toggle feature\n */\nexport interface ToggleConfig {\n /**\n * Whether toggle mode is enabled\n */\n toggle?: boolean;\n\n /**\n * Whether clicking toggles the state automatically\n * Set to false to control selection programmatically only\n * @default true\n */\n toggleOnClick?: boolean;\n\n /**\n * Initial selected state\n */\n selected?: boolean;\n\n /**\n * Icon HTML for unselected state\n */\n icon?: string;\n\n /**\n * Icon HTML for selected state\n */\n selectedIcon?: string;\n\n /**\n * Component prefix for class names\n */\n prefix?: string;\n\n /**\n * Component name for class generation\n */\n componentName?: string;\n\n /**\n * Additional configuration options\n */\n [key: string]: unknown;\n}\n\n/**\n * Toggle state manager interface\n */\nexport interface ToggleManager {\n /**\n * Selects the component (toggle on)\n * @returns ToggleManager instance for chaining\n */\n select: () => ToggleManager;\n\n /**\n * Deselects the component (toggle off)\n * @returns ToggleManager instance for chaining\n */\n deselect: () => ToggleManager;\n\n /**\n * Toggles the selection state\n * @returns ToggleManager instance for chaining\n */\n toggle: () => ToggleManager;\n\n /**\n * Checks if the component is currently selected\n * @returns true if selected\n */\n isSelected: () => boolean;\n\n /**\n * Checks if toggle mode is enabled\n * @returns true if toggle mode is enabled\n */\n isToggle: () => boolean;\n\n /**\n * Sets the icon for unselected state\n * @param html - Icon HTML content\n * @returns ToggleManager instance for chaining\n */\n setIcon: (html: string) => ToggleManager;\n\n /**\n * Sets the icon for selected state\n * @param html - Icon HTML content\n * @returns ToggleManager instance for chaining\n */\n setSelectedIcon: (html: string) => ToggleManager;\n\n /**\n * Gets the selected state icon\n * @returns Selected icon HTML or empty string\n */\n getSelectedIcon: () => string;\n}\n\n/**\n * Component with toggle capabilities\n */\nexport interface ToggleComponent {\n toggleState: ToggleManager;\n}\n\n/**\n * Component with icon capabilities (for updating icon on toggle)\n */\ninterface ComponentWithIcon extends ElementComponent {\n icon?: {\n setIcon: (html: string) => unknown;\n getIcon: () => string;\n getElement: () => HTMLElement | null;\n };\n lifecycle?: {\n mount: () => void;\n destroy: () => void;\n };\n}\n\n/**\n * Adds toggle (selection) state management to a component\n *\n * This feature enables icon buttons to function as toggle buttons,\n * switching between selected and unselected states. Following MD3 guidelines:\n * - Unselected state uses outlined icon style\n * - Selected state uses filled icon style\n * - Shape can morph on selection (handled by CSS)\n *\n * @param config - Configuration object\n * @returns Function that enhances a component with toggle capabilities\n *\n * @example\n * ```typescript\n * const iconButton = pipe(\n * createBase,\n * withElement(config),\n * withIcon(config),\n * withToggle({\n * toggle: true,\n * selected: false,\n * icon: '<svg>...</svg>', // outlined heart\n * selectedIcon: '<svg>...</svg>' // filled heart\n * })\n * )(config);\n * ```\n */\nexport const withToggle =\n <T extends ToggleConfig>(config: T) =>\n <C extends ComponentWithIcon>(component: C): C & ToggleComponent => {\n // If toggle is not enabled, return component with minimal toggle interface\n if (!config.toggle) {\n return {\n ...component,\n toggleState: {\n select: function () {\n return this;\n },\n deselect: function () {\n return this;\n },\n toggle: function () {\n return this;\n },\n isSelected: () => false,\n isToggle: () => false,\n setIcon: function () {\n return this;\n },\n setSelectedIcon: function () {\n return this;\n },\n getSelectedIcon: () => \"\",\n },\n };\n }\n\n const prefix = config.prefix || \"mtrl\";\n const componentName = config.componentName || \"icon-button\";\n const selectedClass = `${prefix}-${componentName}--selected`;\n\n // Internal state\n let isSelected = config.selected || false;\n let unselectedIcon = config.icon || \"\";\n let selectedIcon = config.selectedIcon || \"\";\n\n /**\n * Updates the icon based on current selection state\n */\n const updateIcon = (): void => {\n if (!component.icon) return;\n\n const iconToShow =\n isSelected && selectedIcon ? selectedIcon : unselectedIcon;\n if (iconToShow) {\n component.icon.setIcon(iconToShow);\n }\n };\n\n /**\n * Updates aria-pressed attribute for accessibility\n */\n const updateAriaPressed = (): void => {\n component.element.setAttribute(\"aria-pressed\", String(isSelected));\n };\n\n // Create toggle manager\n const toggleState: ToggleManager = {\n select() {\n if (!isSelected) {\n isSelected = true;\n component.element.classList.add(selectedClass);\n updateIcon();\n updateAriaPressed();\n }\n return this;\n },\n\n deselect() {\n if (isSelected) {\n isSelected = false;\n component.element.classList.remove(selectedClass);\n updateIcon();\n updateAriaPressed();\n }\n return this;\n },\n\n toggle() {\n if (isSelected) {\n this.deselect();\n } else {\n this.select();\n }\n return this;\n },\n\n isSelected() {\n return isSelected;\n },\n\n isToggle() {\n return true;\n },\n\n setIcon(html: string) {\n unselectedIcon = html;\n if (!isSelected) {\n updateIcon();\n }\n return this;\n },\n\n setSelectedIcon(html: string) {\n selectedIcon = html;\n if (isSelected) {\n updateIcon();\n }\n return this;\n },\n\n getSelectedIcon() {\n return selectedIcon;\n },\n };\n\n // Initialize state\n if (isSelected) {\n component.element.classList.add(selectedClass);\n updateAriaPressed();\n updateIcon();\n } else {\n updateAriaPressed();\n }\n\n // Add click handler for toggle behavior (unless toggleOnClick is false)\n const toggleOnClick = config.toggleOnClick !== false;\n\n const handleClick = (): void => {\n toggleState.toggle();\n\n // Emit custom toggle event\n const event = new CustomEvent(\"toggle\", {\n bubbles: true,\n detail: { selected: isSelected },\n });\n component.element.dispatchEvent(event);\n };\n\n if (toggleOnClick) {\n component.element.addEventListener(\"click\", handleClick);\n }\n\n // Store cleanup handler if lifecycle exists\n const originalDestroy = component.lifecycle?.destroy;\n if (component.lifecycle) {\n component.lifecycle.destroy = () => {\n if (toggleOnClick) {\n component.element.removeEventListener(\"click\", handleClick);\n }\n if (originalDestroy) {\n originalDestroy();\n }\n };\n }\n\n return {\n ...component,\n toggleState,\n };\n };\n",
|
|
84
|
+
"// src/components/icon-button/api.ts\n\nimport { IconButtonComponent } from \"./types\";\nimport {\n IconButtonVariant,\n IconButtonSize,\n IconButtonShape,\n IconButtonWidth,\n} from \"./constants\";\n\n/**\n * API configuration options for the IconButton component\n *\n * @category Components\n * @internal\n */\ninterface ApiOptions {\n /**\n * Disabled state management API\n */\n disabled: {\n /** Enables the component */\n enable: () => void;\n /** Disables the component */\n disable: () => void;\n /** Checks if component is disabled */\n isDisabled: () => boolean;\n };\n\n /**\n * Lifecycle management API\n */\n lifecycle: {\n /** Destroys the component */\n destroy: () => void;\n };\n\n /**\n * Toggle state management API (optional)\n */\n toggleState?: {\n select: () => unknown;\n deselect: () => unknown;\n toggle: () => unknown;\n isSelected: () => boolean;\n isToggle: () => boolean;\n setIcon: (html: string) => unknown;\n setSelectedIcon: (html: string) => unknown;\n getSelectedIcon: () => string;\n };\n}\n\n/**\n * Base component with element properties\n *\n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n /** The DOM element */\n element: HTMLElement;\n\n /** Icon management */\n icon: {\n /** Sets icon HTML content */\n setIcon: (html: string) => unknown;\n /** Gets icon HTML content */\n getIcon: () => string;\n /** Gets icon DOM element */\n getElement: () => HTMLElement | null;\n };\n\n /** Gets a class name with component's prefix */\n getClass: (name: string) => string;\n\n /** Component name */\n componentName?: string;\n\n /** Event listener methods */\n on?: (event: string, handler: Function) => unknown;\n off?: (event: string, handler: Function) => unknown;\n\n /** Class manipulation */\n addClass?: (...classes: string[]) => unknown;\n removeClass?: (...classes: string[]) => unknown;\n}\n\n/**\n * Enhances an IconButton component with public API methods\n *\n * Higher-order function that adds the full public API to the IconButton component,\n * exposing methods for changing appearance, handling state, and managing toggle behavior.\n *\n * @param options - API configuration options\n * @returns Higher-order function that adds API methods to component\n *\n * @category Components\n * @internal\n */\nexport const withAPI =\n ({ disabled, lifecycle, toggleState }: ApiOptions) =>\n (component: ComponentWithElements): IconButtonComponent => {\n const compName = component.componentName || \"icon-button\";\n const baseClass = component.getClass(compName);\n\n // Create the icon API wrapper\n const iconAPI = {\n setIcon: (html: string) => {\n component.icon.setIcon(html);\n return iconAPI;\n },\n getIcon: () => component.icon.getIcon(),\n getElement: () => component.icon.getElement(),\n };\n\n // Create the IconButton component with all API methods\n const iconButtonComponent: IconButtonComponent = {\n element: component.element as HTMLButtonElement,\n icon: iconAPI,\n\n disabled: {\n enable: () => disabled.enable(),\n disable: () => disabled.disable(),\n isDisabled: () => disabled.isDisabled(),\n },\n\n lifecycle: {\n destroy: () => lifecycle.destroy(),\n },\n\n getClass: component.getClass,\n\n getValue: () => (component.element as HTMLButtonElement).value,\n\n setValue(value: string) {\n (component.element as HTMLButtonElement).value = value;\n return iconButtonComponent;\n },\n\n getVariant() {\n const variants: IconButtonVariant[] = [\n \"filled\",\n \"tonal\",\n \"outlined\",\n \"standard\",\n ];\n for (const variant of variants) {\n if (\n component.element.classList.contains(`${baseClass}--${variant}`)\n ) {\n return variant;\n }\n }\n return \"standard\";\n },\n\n setVariant(variant: IconButtonVariant | string) {\n const variants = [\"filled\", \"tonal\", \"outlined\", \"standard\"];\n variants.forEach((v) => {\n component.element.classList.remove(`${baseClass}--${v}`);\n });\n component.element.classList.add(`${baseClass}--${variant}`);\n return iconButtonComponent;\n },\n\n getSize() {\n const sizes: IconButtonSize[] = [\"xs\", \"s\", \"m\", \"l\", \"xl\"];\n for (const size of sizes) {\n if (component.element.classList.contains(`${baseClass}--${size}`)) {\n return size;\n }\n }\n return \"s\";\n },\n\n setSize(size: IconButtonSize | string) {\n const sizes = [\"xs\", \"s\", \"m\", \"l\", \"xl\"];\n sizes.forEach((s) => {\n component.element.classList.remove(`${baseClass}--${s}`);\n });\n if (size !== \"s\") {\n component.element.classList.add(`${baseClass}--${size}`);\n }\n return iconButtonComponent;\n },\n\n getShape() {\n const shapes: IconButtonShape[] = [\"round\", \"square\"];\n for (const shape of shapes) {\n if (component.element.classList.contains(`${baseClass}--${shape}`)) {\n return shape;\n }\n }\n return \"round\";\n },\n\n setShape(shape: IconButtonShape | string) {\n const shapes = [\"round\", \"square\"];\n shapes.forEach((s) => {\n component.element.classList.remove(`${baseClass}--${s}`);\n });\n if (shape !== \"round\") {\n component.element.classList.add(`${baseClass}--${shape}`);\n }\n return iconButtonComponent;\n },\n\n getWidth() {\n const widths: IconButtonWidth[] = [\"narrow\", \"default\", \"wide\"];\n for (const width of widths) {\n if (component.element.classList.contains(`${baseClass}--${width}`)) {\n return width;\n }\n }\n return \"default\";\n },\n\n setWidth(width: IconButtonWidth | string) {\n const widths = [\"narrow\", \"default\", \"wide\"];\n widths.forEach((w) => {\n component.element.classList.remove(`${baseClass}--${w}`);\n });\n if (width !== \"default\") {\n component.element.classList.add(`${baseClass}--${width}`);\n }\n return iconButtonComponent;\n },\n\n enable() {\n disabled.enable();\n return iconButtonComponent;\n },\n\n disable() {\n disabled.disable();\n return iconButtonComponent;\n },\n\n setIcon(icon: string) {\n // If in toggle mode and not selected, update the unselected icon\n if (toggleState?.isToggle() && !toggleState.isSelected()) {\n toggleState.setIcon(icon);\n }\n component.icon.setIcon(icon);\n return iconButtonComponent;\n },\n\n getIcon() {\n return component.icon.getIcon();\n },\n\n setSelectedIcon(icon: string) {\n if (toggleState) {\n toggleState.setSelectedIcon(icon);\n }\n return iconButtonComponent;\n },\n\n getSelectedIcon() {\n return toggleState?.getSelectedIcon() || \"\";\n },\n\n isToggle() {\n return toggleState?.isToggle() || false;\n },\n\n select() {\n if (toggleState) {\n toggleState.select();\n }\n return iconButtonComponent;\n },\n\n deselect() {\n if (toggleState) {\n toggleState.deselect();\n }\n return iconButtonComponent;\n },\n\n toggleSelected() {\n if (toggleState) {\n toggleState.toggle();\n }\n return iconButtonComponent;\n },\n\n isSelected() {\n return toggleState?.isSelected() || false;\n },\n\n setAriaLabel(label: string) {\n component.element.setAttribute(\"aria-label\", label);\n return iconButtonComponent;\n },\n\n destroy() {\n lifecycle.destroy();\n },\n\n on(event: string, handler: Function) {\n if (component.on) {\n component.on(event, handler);\n } else {\n component.element.addEventListener(event, handler as EventListener);\n }\n return iconButtonComponent;\n },\n\n off(event: string, handler: Function) {\n if (component.off) {\n component.off(event, handler);\n } else {\n component.element.removeEventListener(\n event,\n handler as EventListener,\n );\n }\n return iconButtonComponent;\n },\n\n addClass(...classes: string[]) {\n if (component.addClass) {\n component.addClass(...classes);\n } else {\n classes.forEach((cls) => component.element.classList.add(cls));\n }\n return iconButtonComponent;\n },\n\n removeClass(...classes: string[]) {\n if (component.removeClass) {\n component.removeClass(...classes);\n } else {\n classes.forEach((cls) => component.element.classList.remove(cls));\n }\n return iconButtonComponent;\n },\n };\n\n return iconButtonComponent;\n };\n",
|
|
85
|
+
"// src/components/icon-button/config.ts\n\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { IconButtonConfig } from \"./types\";\nimport {\n ICON_BUTTON_VARIANTS,\n ICON_BUTTON_SIZES,\n ICON_BUTTON_SHAPES,\n ICON_BUTTON_WIDTHS,\n ICON_BUTTON_TYPES,\n DEFAULT_RIPPLE_CONFIG,\n} from \"./constants\";\n\n/**\n * Default configuration for the IconButton component\n *\n * Provides reasonable defaults for creating icon buttons\n * according to Material Design 3 guidelines.\n *\n * @category Components\n * @internal\n */\nexport const defaultConfig: IconButtonConfig = {\n variant: ICON_BUTTON_VARIANTS.STANDARD,\n size: ICON_BUTTON_SIZES.S,\n shape: ICON_BUTTON_SHAPES.ROUND,\n width: ICON_BUTTON_WIDTHS.DEFAULT,\n disabled: false,\n type: ICON_BUTTON_TYPES.BUTTON,\n toggle: false,\n selected: false,\n ripple: true,\n tooltip: true,\n rippleConfig: {\n duration: DEFAULT_RIPPLE_CONFIG.DURATION,\n timing: DEFAULT_RIPPLE_CONFIG.TIMING,\n opacity: DEFAULT_RIPPLE_CONFIG.OPACITY,\n },\n};\n\n/**\n * Creates the base configuration for IconButton component\n *\n * Merges user-provided configuration with default values and validates\n * the configuration to ensure all required properties have values.\n *\n * @param config - User provided configuration\n * @returns Complete configuration with defaults applied\n *\n * @category Components\n * @internal\n */\nexport const createBaseConfig = (\n config: IconButtonConfig = {},\n): IconButtonConfig =>\n createComponentConfig(\n defaultConfig,\n config,\n \"icon-button\",\n ) as IconButtonConfig;\n\n/**\n * Generates element configuration for the IconButton component\n *\n * Transforms the user-friendly IconButtonConfig into the internal format required\n * by the withElement function. Creates all the appropriate CSS classes and attributes\n * needed to properly render the IconButton in the DOM.\n *\n * @param config - IconButton configuration\n * @returns Element configuration object for withElement\n *\n * @category Components\n * @internal\n */\nexport const getElementConfig = (config: IconButtonConfig) => {\n // Create the attributes object\n const attributes: Record<string, string | boolean | undefined> = {\n type: config.type || \"button\",\n };\n\n // Add aria-label for accessibility (required for icon buttons)\n if (config.ariaLabel) {\n attributes[\"aria-label\"] = config.ariaLabel;\n }\n\n // Add aria-pressed for toggle buttons\n if (config.toggle) {\n attributes[\"aria-pressed\"] = config.selected ? \"true\" : \"false\";\n }\n\n // Only add disabled attribute if it's explicitly true\n if (config.disabled === true) {\n attributes.disabled = true;\n }\n\n // Add value attribute if provided\n if (config.value !== undefined) {\n attributes.value = config.value;\n }\n\n // Create component-specific classes\n const componentClasses: string[] = [];\n\n // Add size class (default is 's')\n if (config.size && config.size !== \"s\") {\n componentClasses.push(`icon-button--${config.size}`);\n }\n\n // Add shape class (default is 'round')\n if (config.shape && config.shape !== \"round\") {\n componentClasses.push(`icon-button--${config.shape}`);\n }\n\n // Add width class (default is 'default')\n if (config.width && config.width !== \"default\") {\n componentClasses.push(`icon-button--${config.width}`);\n }\n\n // Add toggle class if in toggle mode\n if (config.toggle) {\n componentClasses.push(\"icon-button--toggle\");\n }\n\n // Add selected class if initially selected\n if (config.toggle && config.selected) {\n componentClasses.push(\"icon-button--selected\");\n }\n\n // Add disabled class if disabled\n if (config.disabled === true) {\n componentClasses.push(\"icon-button--disabled\");\n }\n\n // Merge user-provided class/className with component classes\n const userClasses = config.className || config.class;\n const mergedClasses = [\n ...componentClasses,\n ...(Array.isArray(userClasses)\n ? userClasses\n : userClasses\n ? [userClasses]\n : []),\n ];\n\n // Create enhanced config with merged classes\n const enhancedConfig = {\n ...config,\n className: mergedClasses,\n };\n\n return createElementConfig(enhancedConfig, {\n tag: \"button\",\n attributes,\n forwardEvents: {\n click: (component: { element: HTMLButtonElement }) =>\n !component.element.disabled,\n focus: true,\n blur: true,\n },\n interactive: true,\n });\n};\n\n/**\n * Creates API configuration for the IconButton component\n *\n * Provides access to various component sub-features like disabled state\n * and lifecycle management.\n *\n * @param comp - Component with disabled and lifecycle features\n * @returns API configuration object for withAPI\n *\n * @category Components\n * @internal\n */\nexport const getApiConfig = (comp: {\n disabled: {\n enable: () => void;\n disable: () => void;\n isDisabled: () => boolean;\n };\n lifecycle: { destroy: () => void };\n toggleState?: {\n select: () => unknown;\n deselect: () => unknown;\n toggle: () => unknown;\n isSelected: () => boolean;\n isToggle: () => boolean;\n setIcon: (html: string) => unknown;\n setSelectedIcon: (html: string) => unknown;\n getSelectedIcon: () => string;\n };\n}) => ({\n disabled: {\n enable: () => comp.disabled.enable(),\n disable: () => comp.disabled.disable(),\n isDisabled: () => comp.disabled.isDisabled(),\n },\n lifecycle: {\n destroy: () => comp.lifecycle.destroy(),\n },\n toggleState: comp.toggleState,\n});\n\nexport default defaultConfig;\n",
|
|
86
|
+
"// src/components/icon-button/constants.ts\n\n/**\n * IconButton variants following Material Design 3 guidelines\n *\n * Four built-in color styles, in order of emphasis:\n * - filled: Highest emphasis, key actions\n * - tonal: High emphasis, secondary actions\n * - outlined: Medium emphasis, not main focus\n * - standard: Lowest emphasis, on colorful surfaces\n */\nexport const ICON_BUTTON_VARIANTS = {\n /** Primary action button with solid background (highest emphasis) */\n FILLED: 'filled',\n /** Secondary action button with tonal background (high emphasis) */\n TONAL: 'tonal',\n /** Button with outline border and transparent background (medium emphasis) */\n OUTLINED: 'outlined',\n /** Button with no background, just icon (lowest emphasis) */\n STANDARD: 'standard'\n} as const;\n\n/**\n * IconButton variant type\n */\nexport type IconButtonVariant = typeof ICON_BUTTON_VARIANTS[keyof typeof ICON_BUTTON_VARIANTS];\n\n/**\n * IconButton sizes following Material Design 3 specifications\n *\n * | Size | Container | Icon Size |\n * |------|-----------|-----------|\n * | XS | 32dp | 18dp |\n * | S | 40dp | 24dp |\n * | M | 56dp | 24dp |\n * | L | 96dp | 36dp |\n * | XL | 136dp | 48dp |\n */\nexport const ICON_BUTTON_SIZES = {\n /** Extra small - 32px container, 18px icon */\n XS: 'xs',\n /** Small - 40px container, 24px icon (default) */\n S: 's',\n /** Medium - 56px container, 24px icon */\n M: 'm',\n /** Large - 96px container, 36px icon */\n L: 'l',\n /** Extra large - 136px container, 48px icon */\n XL: 'xl'\n} as const;\n\n/**\n * IconButton size type\n */\nexport type IconButtonSize = typeof ICON_BUTTON_SIZES[keyof typeof ICON_BUTTON_SIZES];\n\n/**\n * IconButton shapes following Material Design 3 specifications\n *\n * - round: Full corner radius (default)\n * - square: Fixed corner radius per size\n */\nexport const ICON_BUTTON_SHAPES = {\n /** Round shape - full corner radius (default) */\n ROUND: 'round',\n /** Square shape - fixed corner radius based on size */\n SQUARE: 'square'\n} as const;\n\n/**\n * IconButton shape type\n */\nexport type IconButtonShape = typeof ICON_BUTTON_SHAPES[keyof typeof ICON_BUTTON_SHAPES];\n\n/**\n * IconButton width variants following Material Design 3 specifications\n *\n * | Size | Narrow | Default | Wide |\n * |------|--------|---------|--------|\n * | XS | 28dp | 32dp | 36dp |\n * | S | 32dp | 40dp | 48dp |\n * | M | 48dp | 56dp | 64dp |\n * | L | 80dp | 96dp | 112dp |\n * | XL | 112dp | 136dp | 160dp |\n */\nexport const ICON_BUTTON_WIDTHS = {\n /** Narrow width */\n NARROW: 'narrow',\n /** Default width */\n DEFAULT: 'default',\n /** Wide width */\n WIDE: 'wide'\n} as const;\n\n/**\n * IconButton width type\n */\nexport type IconButtonWidth = typeof ICON_BUTTON_WIDTHS[keyof typeof ICON_BUTTON_WIDTHS];\n\n/**\n * Button types for IconButton\n */\nexport const ICON_BUTTON_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset'\n} as const;\n\n/**\n * CSS classes used by the IconButton component\n */\nexport const ICON_BUTTON_CLASSES = {\n /** Root element class */\n ROOT: 'icon-button',\n /** Class for the icon container */\n ICON: 'icon-button__icon',\n /** Applied when button is selected (toggle state) */\n SELECTED: 'icon-button--selected',\n /** Applied when button is disabled */\n DISABLED: 'icon-button--disabled',\n /** Applied when button is pressed (for shape morph) */\n PRESSED: 'icon-button--pressed'\n} as const;\n\n/**\n * Default ripple effect configuration for IconButton\n */\nexport const DEFAULT_RIPPLE_CONFIG = {\n DURATION: 450,\n TIMING: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\n OPACITY: ['0.7', '0'] as [string, string]\n} as const;\n\n/**\n * Corner radius values for square shape per size (in dp)\n * Round shape uses full corner radius (50%)\n */\nexport const ICON_BUTTON_CORNER_RADIUS = {\n XS: { square: 12, pressed: 8 },\n S: { square: 12, pressed: 8 },\n M: { square: 16, pressed: 12 },\n L: { square: 28, pressed: 16 },\n XL: { square: 28, pressed: 16 }\n} as const;\n\n/**\n * Icon sizes per button size (in dp)\n */\nexport const ICON_BUTTON_ICON_SIZES = {\n XS: 18,\n S: 24,\n M: 24,\n L: 36,\n XL: 48\n} as const;\n\n/**\n * Container sizes per button size (in dp)\n */\nexport const ICON_BUTTON_CONTAINER_SIZES = {\n XS: 32,\n S: 40,\n M: 56,\n L: 96,\n XL: 136\n} as const;\n\n/**\n * Width values per size and width variant (in dp)\n */\nexport const ICON_BUTTON_WIDTH_VALUES = {\n XS: { narrow: 28, default: 32, wide: 36 },\n S: { narrow: 32, default: 40, wide: 48 },\n M: { narrow: 48, default: 56, wide: 64 },\n L: { narrow: 80, default: 96, wide: 112 },\n XL: { narrow: 112, default: 136, wide: 160 }\n} as const;\n",
|
|
87
|
+
"// src/components/button-group/config.ts\n\nimport { createComponentConfig } from '../../core/config/component';\nimport {\n ButtonGroupConfig,\n ButtonGroupVariant,\n ButtonGroupDensity\n} from './types';\nimport {\n BUTTON_GROUP_DEFAULTS,\n BUTTON_GROUP_DENSITY,\n BUTTON_GROUP_SIZE_TOKENS,\n BUTTON_GROUP_CONNECTED_GAP,\n BUTTON_GROUP_CONNECTED_PRESSED_CORNER,\n BUTTON_GROUP_DENSITY_STEP\n} from './constants';\n\n/**\n * Default configuration values for button groups\n * @internal\n */\nexport const DEFAULT_CONFIG: Partial<ButtonGroupConfig> = {\n kind: BUTTON_GROUP_DEFAULTS.KIND,\n selection: BUTTON_GROUP_DEFAULTS.SELECTION,\n shape: BUTTON_GROUP_DEFAULTS.SHAPE,\n size: BUTTON_GROUP_DEFAULTS.SIZE,\n required: false,\n variant: BUTTON_GROUP_DEFAULTS.VARIANT,\n orientation: BUTTON_GROUP_DEFAULTS.ORIENTATION,\n density: BUTTON_GROUP_DEFAULTS.DENSITY,\n ripple: BUTTON_GROUP_DEFAULTS.RIPPLE,\n equalWidth: BUTTON_GROUP_DEFAULTS.EQUAL_WIDTH,\n disabled: false,\n buttons: []\n};\n\n/**\n * Creates the base configuration for Button Group component\n * @param {ButtonGroupConfig} config - User provided configuration\n * @returns {ButtonGroupConfig} Complete configuration with defaults applied\n * @internal\n */\nexport const createBaseConfig = (\n config: ButtonGroupConfig = {}\n): ButtonGroupConfig =>\n createComponentConfig(\n DEFAULT_CONFIG,\n config,\n 'button-group'\n ) as ButtonGroupConfig;\n\n/**\n * Generates element configuration for the Button Group container\n * @param {ButtonGroupConfig} config - Button Group configuration\n * @returns {Object} Element configuration object for withElement\n * @internal\n */\nexport const getContainerConfig = (config: ButtonGroupConfig) => {\n const variant = config.variant || BUTTON_GROUP_DEFAULTS.VARIANT;\n const orientation = config.orientation || BUTTON_GROUP_DEFAULTS.ORIENTATION;\n const density = config.density || BUTTON_GROUP_DEFAULTS.DENSITY;\n const kind = config.kind || BUTTON_GROUP_DEFAULTS.KIND;\n const selection = config.selection || BUTTON_GROUP_DEFAULTS.SELECTION;\n const labels = config.labels || BUTTON_GROUP_DEFAULTS.LABELS;\n const shape = config.shape || BUTTON_GROUP_DEFAULTS.SHAPE;\n const size = config.size || BUTTON_GROUP_DEFAULTS.SIZE;\n\n return {\n tag: 'div',\n componentName: 'button-group',\n attributes: {\n role: 'group',\n 'aria-label': config.ariaLabel || 'Button group',\n 'data-variant': variant,\n 'data-orientation': orientation,\n 'data-density': density,\n 'data-kind': kind,\n 'data-selection': selection,\n 'data-shape': shape,\n 'data-size': size,\n 'data-labels': labels\n },\n className: [\n config.class,\n labels === 'selected' ? `${config.prefix}-button-group--labels-selected` : null,\n config.disabled ? `${config.prefix}-button-group--disabled` : null,\n `${config.prefix}-button-group--${orientation}`,\n `${config.prefix}-button-group--${variant}`,\n `${config.prefix}-button-group--${kind}`,\n `${config.prefix}-button-group--${shape}`,\n `${config.prefix}-button-group--size-${size}`,\n selection !== 'none' ? `${config.prefix}-button-group--selectable` : null,\n density !== BUTTON_GROUP_DENSITY.DEFAULT\n ? `${config.prefix}-button-group--density-${density}`\n : null,\n config.equalWidth ? `${config.prefix}-button-group--equal-width` : null\n ],\n interactive: true\n };\n};\n\n/** Height steps removed by each density level (4dp per step) */\nconst DENSITY_STEPS: Record<ButtonGroupDensity, number> = {\n [BUTTON_GROUP_DENSITY.DEFAULT]: 0,\n [BUTTON_GROUP_DENSITY.COMFORTABLE]: 1,\n [BUTTON_GROUP_DENSITY.COMPACT]: 2\n};\n\n/**\n * Size, kind and density tokens as custom properties on the container\n * (Material 3 button group specs). Density lowers the container height by\n * 4dp per step; the buttons follow the container height.\n */\nexport const getSizeStyles = (\n size: ButtonGroupConfig['size'],\n kind: ButtonGroupConfig['kind'],\n density: ButtonGroupDensity = BUTTON_GROUP_DENSITY.DEFAULT\n): Record<string, string> => {\n const tokens = BUTTON_GROUP_SIZE_TOKENS[size || BUTTON_GROUP_DEFAULTS.SIZE] || BUTTON_GROUP_SIZE_TOKENS.s;\n const gap = kind === 'connected' ? BUTTON_GROUP_CONNECTED_GAP : tokens.standardGap;\n const height = tokens.height - BUTTON_GROUP_DENSITY_STEP * (DENSITY_STEPS[density] ?? 0);\n return {\n '--button-group-height': `${height}px`,\n '--button-group-icon': `${tokens.icon}px`,\n '--button-group-gap': `${gap}px`,\n '--button-group-inner-corner': `${tokens.connectedCorner}px`,\n '--button-group-pressed-corner': `${BUTTON_GROUP_CONNECTED_PRESSED_CORNER}px`,\n '--button-group-radius': `${height / 2}px`\n };\n};\n\n/**\n * Generates configuration for a button element within the group\n * @param {Object} buttonConfig - Button configuration\n * @param {number} index - Button index in the group\n * @param {number} total - Total number of buttons\n * @param {ButtonGroupConfig} groupConfig - Parent group configuration\n * @returns {Object} Button configuration with group-specific settings\n * @internal\n */\nexport const getButtonConfig = (\n buttonConfig: ButtonGroupConfig['buttons'][number],\n index: number,\n total: number,\n groupConfig: ButtonGroupConfig\n) => {\n const isFirst = index === 0;\n const isLast = index === total - 1;\n const isSingle = total === 1;\n\n // Determine position class\n let positionClass = '';\n if (isSingle) {\n positionClass = `${groupConfig.prefix}-button-group__button--single`;\n } else if (isFirst) {\n positionClass = `${groupConfig.prefix}-button-group__button--first`;\n } else if (isLast) {\n positionClass = `${groupConfig.prefix}-button-group__button--last`;\n } else {\n positionClass = `${groupConfig.prefix}-button-group__button--middle`;\n }\n\n return {\n ...buttonConfig,\n variant: groupConfig.variant,\n size: groupConfig.size || BUTTON_GROUP_DEFAULTS.SIZE,\n shape: groupConfig.shape || BUTTON_GROUP_DEFAULTS.SHAPE,\n disabled: groupConfig.disabled || buttonConfig.disabled,\n ripple: groupConfig.ripple,\n rippleConfig: groupConfig.rippleConfig,\n class: [\n `${groupConfig.prefix}-button-group__button`,\n positionClass,\n buttonConfig.class\n ].filter(Boolean).join(' ')\n };\n};\n\n/**\n * Maps variant name to button variant\n * @param {ButtonGroupVariant} variant - Group variant\n * @returns {string} Button variant name\n * @internal\n */\nexport const mapVariantToButton = (variant: ButtonGroupVariant): string => {\n return variant;\n};\n\n/**\n * Validates button group configuration\n * @param {ButtonGroupConfig} config - Configuration to validate\n * @returns {boolean} Whether configuration is valid\n * @internal\n */\nexport const validateConfig = (config: ButtonGroupConfig): boolean => {\n // Ensure buttons array exists\n if (!config.buttons || !Array.isArray(config.buttons)) {\n return false;\n }\n\n // Ensure icon-only buttons have aria-label\n for (const button of config.buttons) {\n if (button.icon && !button.text && !button.ariaLabel) {\n console.warn(\n 'Button Group: Icon-only buttons require an ariaLabel for accessibility'\n );\n }\n }\n\n return true;\n};\n",
|
|
88
|
+
"// src/components/button-group/constants.ts\n\n/**\n * Button group variants\n * All buttons in the group share the same variant for visual consistency\n */\nexport const BUTTON_GROUP_VARIANTS = {\n /** Primary action buttons with solid background */\n FILLED: 'filled',\n /** Secondary action buttons with medium emphasis */\n TONAL: 'tonal',\n /** Buttons with outline border (default for button groups per MD3) */\n OUTLINED: 'outlined',\n /** Buttons with slight elevation/shadow */\n ELEVATED: 'elevated',\n /** Text-only buttons without background or border */\n TEXT: 'text'\n} as const;\n\n/**\n * Button group orientations\n */\nexport const BUTTON_GROUP_ORIENTATIONS = {\n /** Buttons arranged horizontally (default) */\n HORIZONTAL: 'horizontal',\n /** Buttons arranged vertically */\n VERTICAL: 'vertical'\n} as const;\n\n/**\n * Density levels for button groups\n * Controls sizing and spacing per MD3 density specifications\n */\nexport const BUTTON_GROUP_DENSITY = {\n /** Default size with standard spacing (40px height) */\n DEFAULT: 'default',\n /** Reduced size and spacing (36px height) */\n COMFORTABLE: 'comfortable',\n /** Minimal size and spacing (32px height) */\n COMPACT: 'compact'\n} as const;\n\n/**\n * Button group events\n */\nexport const BUTTON_GROUP_EVENTS = {\n /** Fired when any button in the group is clicked */\n CLICK: 'click',\n /** Fired when a button receives focus */\n FOCUS: 'focus',\n /** Fired when a button loses focus */\n BLUR: 'blur',\n /** Fired when the selection changes (selection groups) */\n CHANGE: 'change'\n} as const;\n\n/** Material 3 button group kinds */\nexport const BUTTON_GROUP_KINDS = {\n STANDARD: 'standard',\n CONNECTED: 'connected'\n} as const;\n\n/** Selection behaviour of the group */\nexport const BUTTON_GROUP_SELECTION = {\n NONE: 'none',\n SINGLE: 'single',\n MULTI: 'multi'\n} as const;\n\nexport const BUTTON_GROUP_SHAPES = {\n ROUND: 'round',\n SQUARE: 'square'\n} as const;\n\nexport const BUTTON_GROUP_SIZES = {\n XS: 'xs',\n S: 's',\n M: 'm',\n L: 'l',\n XL: 'xl'\n} as const;\n\n/**\n * Material 3 button group tokens per size (dp): container height, button\n * icon size, standard between-space, connected inner corner\n * (m3.material.io button group specs; ButtonGroupSmallTokens.kt and\n * ConnectedButtonGroupSmallTokens.kt for the s size)\n */\nexport const BUTTON_GROUP_SIZE_TOKENS = {\n xs: { height: 32, icon: 20, standardGap: 18, connectedCorner: 4 },\n s: { height: 40, icon: 20, standardGap: 12, connectedCorner: 8 },\n m: { height: 56, icon: 24, standardGap: 8, connectedCorner: 8 },\n l: { height: 96, icon: 32, standardGap: 8, connectedCorner: 16 },\n xl: { height: 136, icon: 40, standardGap: 8, connectedCorner: 20 }\n} as const;\n\n/** Connected groups use 2dp between buttons at every size */\nexport const BUTTON_GROUP_CONNECTED_GAP = 2;\n\n/** Connected pressed inner corner: extra-small (ConnectedButtonGroupSmallTokens.PressedInnerCornerCornerSize) */\nexport const BUTTON_GROUP_CONNECTED_PRESSED_CORNER = 4;\n\n/** Connected xs and s groups keep a 48dp minimum width per button */\nexport const BUTTON_GROUP_CONNECTED_MIN_WIDTH = 48;\n\n/**\n * Standard groups: a pressed button widens by this share of its width and\n * its neighbours give up the difference (ButtonGroupDefaults.ExpandedRatio)\n */\nexport const BUTTON_GROUP_EXPANDED_RATIO = 0.15;\n\n/** Density reduces the container height by 4dp per step */\nexport const BUTTON_GROUP_DENSITY_STEP = 4;\n\n/**\n * Default configuration values\n */\n/** Label display in selection groups */\nexport const BUTTON_GROUP_LABELS = {\n ALWAYS: 'always',\n SELECTED: 'selected'\n} as const;\n\nexport const BUTTON_GROUP_DEFAULTS = {\n KIND: BUTTON_GROUP_KINDS.STANDARD,\n SELECTION: BUTTON_GROUP_SELECTION.NONE,\n SHAPE: BUTTON_GROUP_SHAPES.ROUND,\n SIZE: BUTTON_GROUP_SIZES.S,\n LABELS: BUTTON_GROUP_LABELS.ALWAYS,\n /** Default variant (outlined per MD3 button group specs) */\n VARIANT: BUTTON_GROUP_VARIANTS.OUTLINED,\n /** Default orientation */\n ORIENTATION: BUTTON_GROUP_ORIENTATIONS.HORIZONTAL,\n /** Default density level */\n DENSITY: BUTTON_GROUP_DENSITY.DEFAULT,\n /** Whether ripple effect is enabled by default */\n RIPPLE: true,\n /** Whether buttons have equal width by default */\n EQUAL_WIDTH: false,\n /** Default ripple animation duration in milliseconds */\n RIPPLE_DURATION: 300,\n /** Default ripple animation timing function */\n RIPPLE_TIMING: 'cubic-bezier(0.4, 0, 0.2, 1)',\n /** Default ripple opacity values [start, end] */\n RIPPLE_OPACITY: ['0.2', '0'] as [string, string]\n} as const;\n\n/**\n * CSS classes for button group elements\n * Following BEM naming convention\n */\nexport const BUTTON_GROUP_CLASSES = {\n /** Container element */\n ROOT: 'button-group',\n /** Individual button within group */\n BUTTON: 'button-group__button',\n /** First button in group */\n FIRST: 'button-group__button--first',\n /** Last button in group */\n LAST: 'button-group__button--last',\n /** Middle buttons (neither first nor last) */\n MIDDLE: 'button-group__button--middle',\n /** Single button (only one in group) */\n SINGLE: 'button-group__button--single',\n /** Disabled state */\n DISABLED: 'button-group--disabled',\n /** Horizontal orientation */\n HORIZONTAL: 'button-group--horizontal',\n /** Vertical orientation */\n VERTICAL: 'button-group--vertical',\n /** Equal width buttons */\n EQUAL_WIDTH: 'button-group--equal-width',\n /** Filled variant */\n FILLED: 'button-group--filled',\n /** Tonal variant */\n TONAL: 'button-group--tonal',\n /** Outlined variant */\n OUTLINED: 'button-group--outlined',\n /** Elevated variant */\n ELEVATED: 'button-group--elevated',\n /** Text variant */\n TEXT: 'button-group--text',\n /** Default density */\n DENSITY_DEFAULT: 'button-group--density-default',\n /** Comfortable density */\n DENSITY_COMFORTABLE: 'button-group--density-comfortable',\n /** Compact density */\n DENSITY_COMPACT: 'button-group--density-compact'\n} as const;\n",
|
|
84
89
|
"// src/components/card/card.ts\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport {\n withEvents,\n withVariant,\n withRipple,\n withLifecycle\n} from '../../core/compose/features';\nimport { withAPI } from './api';\nimport { CardComponent, BaseComponent, CardSchema } from './types';\nimport { \n createBaseConfig, \n getElementConfig, \n getApiConfig, \n withInteractiveBehavior,\n processInlineConfig,\n applyInlineConfiguration\n} from './config';\nimport { withElevation } from './features';\n\n/**\n * Creates a new Card component following Material Design 3 principles.\n * \n * Material Design 3 Cards are surfaces that display content and actions about a single topic.\n * Cards can contain text, media, and UI controls. They provide entry points to more \n * detailed information and can include interactive elements.\n * \n * @param {CardSchema} config - Card configuration object\n * @returns {CardComponent} Card component instance with the following API methods:\n * - `addContent(contentElement)`: Adds content to the card\n * - `setHeader(headerElement)`: Sets the card header\n * - `addMedia(mediaElement, position)`: Adds media to the card\n * - `setActions(actionsElement)`: Sets the card actions section\n * - `makeDraggable(dragStartCallback)`: Makes the card draggable\n * - `focus()`: Sets focus to the card\n * - `destroy()`: Destroys the card component and removes event listeners\n * \n * @throws {Error} Throws an error if card creation fails\n * @category Components\n * @example\n * ```typescript\n * // Create a basic card\n * const card = createCard({\n * variant: 'elevated',\n * header: {\n * title: 'Card Title',\n * subtitle: 'Secondary text'\n * },\n * content: {\n * text: 'Card content goes here.'\n * }\n * });\n * \n * // Create an interactive card with actions\n * const cardWithActions = createCard({\n * variant: 'filled',\n * interactive: true,\n * header: { title: 'Interactive Card' },\n * content: { text: 'Click the buttons below.' },\n * buttons: [\n * { text: 'Action 1', variant: 'text' },\n * { text: 'Action 2', variant: 'filled' }\n * ]\n * });\n * \n * // Card with media\n * const mediaCard = createCard({\n * media: {\n * src: '/path/to/image.jpg',\n * alt: 'Descriptive alt text',\n * aspectRatio: '16:9'\n * },\n * header: { title: 'Media Card' }\n * });\n * \n * // Using API methods\n * const card = createCard();\n * const content = document.createElement('div');\n * content.className = 'mtrl-card-content';\n * content.textContent = 'Added programmatically';\n * card.addContent(content);\n * card.makeDraggable();\n * ```\n */\nconst createCard = (config: CardSchema = {}): CardComponent => {\n // Process inline configuration (map shorthand properties)\n const processedConfig = processInlineConfig(config);\n const baseConfig = createBaseConfig(processedConfig);\n\n try {\n // Create the core card component\n const card = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n baseConfig.clickable ? withRipple(baseConfig) : (c: BaseComponent) => c,\n withLifecycle(),\n withInteractiveBehavior,\n withElevation,\n comp => withAPI(getApiConfig(comp))(comp)\n )(baseConfig) as CardComponent;\n \n // Apply any inline configuration\n applyInlineConfiguration(card, processedConfig);\n \n return card;\n } catch (error) {\n console.error('Card creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create card: ${error instanceof Error ? error.message : String(error)}`);\n }\n};\n\nexport default createCard;",
|
|
85
90
|
"// src/components/card/api.ts\nimport { BaseComponent, CardComponent, ApiOptions } from './types';\n\n/**\n * Enhances a card component with API methods.\n * This follows the higher-order function pattern to add public API methods\n * to the component, making them available to the end user.\n * \n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @category Components\n */\nexport const withAPI = ({ lifecycle }: ApiOptions) => (component: BaseComponent): CardComponent => ({\n ...component,\n element: component.element,\n\n /**\n * Adds content to the card.\n * This method appends content to the card component.\n * \n * @param {HTMLElement} contentElement - The content element to add\n * @returns {CardComponent} The card instance for chaining\n * @example\n * ```typescript\n * const content = document.createElement('div');\n * content.className = 'mtrl-card-content';\n * content.textContent = 'Card content goes here';\n * card.addContent(content);\n * ```\n */\n addContent(contentElement: HTMLElement): CardComponent {\n if (contentElement && contentElement.classList.contains(`${component.getClass('card')}-content`)) {\n component.element.appendChild(contentElement);\n }\n return this;\n },\n\n /**\n * Sets the card header\n * \n * Places the header element in the card. When media elements exist,\n * the header is placed after the last media element to ensure proper \n * visual hierarchy following Material Design guidelines.\n * \n * @param {HTMLElement} headerElement - The header element to add\n * @returns {CardComponent} The card instance for chaining\n * @example\n * ```typescript\n * // Add a header after media\n * card.setHeader(headerElement);\n * ```\n */\n setHeader(headerElement: HTMLElement): CardComponent {\n if (headerElement && headerElement.classList.contains(`${component.getClass('card')}-header`)) {\n // Remove existing header if present\n const existingHeader = component.element.querySelector(`.${component.getClass('card')}-header`);\n if (existingHeader) {\n existingHeader.remove();\n }\n\n // Look for media element\n const mediaElement = component.element.querySelector(`.${component.getClass('card')}-media`);\n \n if (mediaElement) {\n // If media exists, insert after the LAST media element\n // Find all media elements\n const mediaElements = component.element.querySelectorAll(`.${component.getClass('card')}-media`);\n const lastMedia = mediaElements[mediaElements.length - 1];\n \n // Insert after the last media element\n if (lastMedia.nextSibling) {\n component.element.insertBefore(headerElement, lastMedia.nextSibling);\n } else {\n component.element.appendChild(headerElement);\n }\n } else {\n // No media, insert at the beginning\n component.element.insertBefore(headerElement, component.element.firstChild);\n }\n }\n return this;\n },\n\n /**\n * Adds media to the card.\n * Places media elements at the specified position in the card.\n * \n * @param {HTMLElement} mediaElement - The media element to add\n * @param {string} [position='top'] - Position to place media ('top', 'bottom')\n * @returns {CardComponent} The card instance for chaining\n * @example\n * ```typescript\n * // Creating media element\n * const media = document.createElement('div');\n * media.className = 'mtrl-card-media';\n * \n * // Adding at the top (default)\n * card.addMedia(media);\n * \n * // Or adding at the bottom\n * card.addMedia(media, 'bottom');\n * ```\n */\n addMedia(mediaElement: HTMLElement, position: 'top' | 'bottom' = 'top'): CardComponent {\n if (mediaElement && mediaElement.classList.contains(`${component.getClass('card')}-media`)) {\n if (position === 'top') {\n component.element.insertBefore(mediaElement, component.element.firstChild);\n } else {\n component.element.appendChild(mediaElement);\n }\n }\n return this;\n },\n\n /**\n * Sets the card actions section.\n * Replaces any existing actions with the provided actions element.\n * Actions typically contain buttons or other interactive controls,\n * and are placed at the bottom of the card.\n * \n * @param {HTMLElement} actionsElement - The actions element to add\n * @returns {CardComponent} The card instance for chaining\n * @example\n * ```typescript\n * // Create actions container\n * const actions = document.createElement('div');\n * actions.className = 'mtrl-card-actions';\n * \n * // Add buttons to actions\n * const button = document.createElement('button');\n * button.textContent = 'Action';\n * actions.appendChild(button);\n * \n * // Set actions on card\n * card.setActions(actions);\n * ```\n */\n setActions(actionsElement: HTMLElement): CardComponent {\n if (actionsElement && actionsElement.classList.contains(`${component.getClass('card')}-actions`)) {\n // Remove existing actions if present\n const existingActions = component.element.querySelector(`.${component.getClass('card')}-actions`);\n if (existingActions) {\n existingActions.remove();\n }\n\n // Add actions at the end\n component.element.appendChild(actionsElement);\n }\n return this;\n },\n\n /**\n * Makes the card draggable.\n * Sets up native HTML5 drag and drop functionality and adds appropriate\n * accessibility attributes. Automatically updates ARIA attributes during drag.\n * \n * @param {Function} [dragStartCallback] - Callback for drag start event\n * @returns {CardComponent} The card instance for chaining\n * @example\n * ```typescript\n * // Basic draggable card\n * card.makeDraggable();\n * \n * // With custom drag start handler\n * card.makeDraggable((event) => {\n * // Set custom data or perform other actions on drag start\n * event.dataTransfer.setData('text/plain', 'Card data');\n * });\n * ```\n */\n makeDraggable(dragStartCallback?: (event: DragEvent) => void): CardComponent {\n component.element.setAttribute('draggable', 'true');\n component.element.setAttribute('aria-grabbed', 'false');\n\n if (typeof dragStartCallback === 'function') {\n component.element.addEventListener('dragstart', (e: DragEvent) => {\n component.element.setAttribute('aria-grabbed', 'true');\n dragStartCallback(e);\n });\n \n component.element.addEventListener('dragend', () => {\n component.element.setAttribute('aria-grabbed', 'false');\n });\n }\n\n return this;\n },\n\n /**\n * Sets focus to the card.\n * Useful for programmatic focus management, especially in keyboard navigation\n * scenarios or after dynamic content changes.\n * \n * @returns {CardComponent} The card instance for chaining\n * @example\n * ```typescript\n * // Focus the card\n * card.focus();\n * \n * // Can be chained with other methods\n * card.setHeader(headerElement).focus();\n * ```\n */\n focus(): CardComponent {\n component.element.focus();\n return this;\n },\n\n /**\n * Destroys the card component and removes event listeners.\n * Call this method when the card is no longer needed to prevent memory leaks.\n * \n * @example\n * ```typescript\n * // Clean up resources when done with the card\n * card.destroy();\n * ```\n */\n destroy(): void {\n lifecycle.destroy();\n }\n});",
|
|
86
91
|
"// src/components/card/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport {\n createCardHeader,\n createCardContent,\n createCardMedia,\n createCardActions,\n} from \"./content\";\nimport { CardComponent, CardSchema, BaseComponent } from \"./types\";\nimport { CARD_VARIANTS, CARD_ELEVATIONS } from \"./constants\";\n\n/**\n * Default configuration for the Card component.\n * These values are used when no configuration is provided.\n *\n * @const {CardSchema}\n * @category Components\n */\nexport const defaultConfig: CardSchema = {\n variant: CARD_VARIANTS.ELEVATED,\n interactive: false,\n fullWidth: false,\n clickable: false,\n draggable: false,\n};\n\n/**\n * Processes inline configuration options into standard config format.\n * Maps shorthand properties to their proper config counterparts for ease of use.\n *\n * @param {CardSchema} config - Raw card configuration\n * @returns {CardSchema} Processed configuration\n * @category Components\n * @example\n * ```typescript\n * // Before processing, these are equivalent:\n * { header: { title: 'Example' } }\n * { headerConfig: { title: 'Example' } }\n * ```\n */\nexport const processInlineConfig = (config: CardSchema): CardSchema => {\n const processedConfig: CardSchema = { ...config };\n\n // Map inline properties to their *Config counterparts\n if (config.header) {\n processedConfig.headerConfig = config.header;\n }\n\n if (config.content) {\n processedConfig.contentConfig = config.content;\n }\n\n if (config.media) {\n processedConfig.mediaConfig = config.media;\n }\n\n if (config.actions) {\n processedConfig.actionsConfig = config.actions;\n }\n\n return processedConfig;\n};\n\n/**\n * Applies inline configuration to a card component.\n * Adds configured elements to the card in the correct order following\n * Material Design layout guidelines. Handles media, header, content, and actions placement.\n *\n * @param {CardComponent} card - Card component to configure\n * @param {CardSchema} config - Processed configuration\n * @category Components\n */\nexport const applyInlineConfiguration = (\n card: CardComponent,\n config: CardSchema\n): void => {\n // Add media (top position) if configured\n if (\n config.mediaConfig &&\n (!config.mediaConfig.position || config.mediaConfig.position === \"top\")\n ) {\n const mediaElement = createCardMedia({\n ...config.mediaConfig,\n position: undefined,\n });\n card.addMedia(mediaElement, \"top\");\n }\n\n // Add header if configured\n if (config.headerConfig) {\n const headerElement = createCardHeader(config.headerConfig);\n card.setHeader(headerElement);\n }\n\n // Add content if configured\n if (config.contentConfig) {\n const contentElement = createCardContent(config.contentConfig);\n card.addContent(contentElement);\n }\n\n // Add media (bottom position) if configured\n if (config.mediaConfig && config.mediaConfig.position === \"bottom\") {\n const mediaElement = createCardMedia({\n ...config.mediaConfig,\n position: undefined,\n });\n card.addMedia(mediaElement, \"bottom\");\n }\n\n // Add actions if configured\n if (config.actionsConfig) {\n const actionsElement = createCardActions(config.actionsConfig);\n card.setActions(actionsElement);\n }\n\n // Process buttons if provided (asynchronously)\n if (Array.isArray(config.buttons) && config.buttons.length > 0) {\n import(\"../button\")\n .then(({ default: createButton }) => {\n // Create buttons from configuration\n const actionButtons = config.buttons!.map(\n (buttonConfig) => createButton(buttonConfig).element\n );\n\n // Create actions container\n const actionsElement = createCardActions({\n actions: actionButtons,\n align: config.actionsConfig?.align || \"end\",\n });\n\n // Add the actions to the card\n card.setActions(actionsElement);\n })\n .catch((error) => {\n console.error(\"Error processing buttons:\", error);\n });\n }\n};\n\n/**\n * Creates the base configuration for Card component.\n * Merges user-provided configuration with default values,\n * ensuring all required properties are set.\n *\n * @param {CardSchema} config - User provided configuration\n * @returns {CardSchema} Complete configuration with defaults applied\n * @category Components\n *\n */\nexport const createBaseConfig = (config: CardSchema = {}): CardSchema =>\n createComponentConfig(defaultConfig, config, \"card\") as CardSchema;\n\n/**\n * Generates element configuration for the Card component.\n * Sets up DOM attributes, accessibility features, and event forwarding\n * based on the card's configuration.\n *\n * @param {CardSchema} config - Card configuration\n * @returns {Object} Element configuration object for withElement\n * @category Components\n *\n */\nexport const getElementConfig = (config: CardSchema) => {\n const isInteractive = config.interactive || config.clickable;\n const defaultRole = isInteractive ? \"button\" : \"region\";\n\n // Prepare ARIA attributes\n const ariaAttributes: Record<string, string> = {};\n if (config.aria) {\n // Add all ARIA attributes from config\n Object.entries(config.aria).forEach(([key, value]) => {\n if (value !== undefined) {\n // Convert attribute name to aria-* format if not already\n const attrName = key.startsWith(\"aria-\") ? key : `aria-${key}`;\n ariaAttributes[attrName] = value;\n }\n });\n }\n\n // Set default ARIA role if not specified\n if (!ariaAttributes[\"role\"] && !config.aria?.role) {\n ariaAttributes[\"role\"] = defaultRole;\n }\n\n // Add tabindex for interactive cards if not specified\n if (isInteractive && !ariaAttributes[\"tabindex\"]) {\n ariaAttributes[\"tabindex\"] = \"0\";\n }\n\n return createElementConfig(config, {\n tag: \"div\",\n className: [\n config.class,\n config.fullWidth ? `${config.prefix}-card--full-width` : null,\n isInteractive ? `${config.prefix}-card--interactive` : null,\n ],\n attributes: ariaAttributes,\n forwardEvents: {\n click: () => !!config.clickable,\n mouseenter: () => !!isInteractive,\n mouseleave: () => !!isInteractive,\n keydown: () => !!isInteractive,\n focus: () => !!isInteractive,\n blur: () => !!isInteractive,\n },\n interactive: isInteractive,\n });\n};\n\n/**\n * Creates API configuration for the Card component.\n * Prepares the configuration needed for the card's public API methods.\n *\n * @param {Object} comp - Component with lifecycle feature\n * @returns {Object} API configuration object\n * @category Components\n *\n */\nexport const getApiConfig = (comp: any) => ({\n lifecycle: {\n destroy: () => comp.lifecycle?.destroy?.(),\n },\n});\n\n/**\n * Card elevation levels in density-independent pixels (dp).\n * Following Material Design 3 elevation system guidelines.\n *\n * @category Components\n */\nexport const CARD_ELEVATION_LEVELS = CARD_ELEVATIONS;\n\n/**\n * Adds interactive behavior to card component.\n * Uses the mtrl elevation system for proper elevation levels according to Material Design 3\n * guidelines. Implements mouse, keyboard, and touch interactions with appropriate\n * visual feedback and accessibility support.\n *\n * @param {BaseComponent} comp - Card component\n * @returns {BaseComponent} Enhanced card component\n * @category Components\n *\n */\nexport const withInteractiveBehavior = (comp: BaseComponent): BaseComponent => {\n const config = comp.config;\n const isInteractive = config.interactive || config.clickable;\n\n // Implement MD3 elevation changes for interactive cards\n if (isInteractive) {\n // Mouse interactions\n comp.element.addEventListener(\"mouseenter\", () => {\n if (config.variant === CARD_VARIANTS.ELEVATED) {\n comp.element.style.setProperty(\n \"--card-elevation\",\n String(CARD_ELEVATION_LEVELS.LEVEL2)\n );\n }\n });\n\n comp.element.addEventListener(\"mouseleave\", () => {\n if (config.variant === CARD_VARIANTS.ELEVATED) {\n comp.element.style.setProperty(\n \"--card-elevation\",\n String(CARD_ELEVATION_LEVELS.LEVEL1)\n );\n }\n });\n\n // Keyboard interactions for accessibility\n comp.element.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n // Activate on Enter or Space\n if ((e.key === \"Enter\" || e.key === \" \") && config.clickable) {\n e.preventDefault();\n comp.element.click();\n }\n });\n\n // Focus state handling\n comp.element.addEventListener(\"focus\", () => {\n comp.element.classList.add(`${comp.getClass(\"card\")}--focused`);\n });\n\n comp.element.addEventListener(\"blur\", () => {\n comp.element.classList.remove(`${comp.getClass(\"card\")}--focused`);\n });\n }\n\n // Set up draggable behavior\n if (config.draggable) {\n comp.element.setAttribute(\"draggable\", \"true\");\n\n comp.element.addEventListener(\"dragstart\", (e: DragEvent) => {\n comp.element.style.setProperty(\n \"--card-elevation\",\n String(CARD_ELEVATION_LEVELS.LEVEL4)\n );\n comp.element.classList.add(`${comp.getClass(\"card\")}--dragging`);\n comp.emit?.(\"dragstart\", { event: e });\n\n // Ensure keyboard users can see what's being dragged\n if (e.dataTransfer) {\n // Set drag image and data\n const cardTitle =\n comp.element.querySelector(`.${comp.getClass(\"card\")}-header-title`)\n ?.textContent || \"Card\";\n e.dataTransfer.setData(\"text/plain\", cardTitle);\n }\n });\n\n comp.element.addEventListener(\"dragend\", (e: DragEvent) => {\n comp.element.style.setProperty(\n \"--card-elevation\",\n String(CARD_ELEVATION_LEVELS.LEVEL1)\n );\n comp.element.classList.remove(`${comp.getClass(\"card\")}--dragging`);\n comp.emit?.(\"dragend\", { event: e });\n });\n }\n\n return comp;\n};\n\nexport default defaultConfig;\n",
|
|
87
92
|
"// src/components/card/content.ts\nimport { PREFIX } from '../../core/config';\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport { createElement } from '../../core/dom/create';\nimport { CardContentConfig, CardHeaderConfig, CardMediaConfig, CardActionsConfig } from './types';\n\n// Constants for content padding\nexport const CARD_CONTENT_PADDING = true;\n\n/**\n * Creates a card content component\n * \n * @param {CardContentConfig} config - Content configuration\n * @returns {HTMLElement} Card content element\n * \n * @example\n * ```typescript\n * // Create text content\n * const textContent = createCardContent({ text: 'Simple text content' });\n * \n * // Create HTML content with no padding\n * const htmlContent = createCardContent({\n * html: '<p>Formatted <strong>HTML</strong> content</p>',\n * padding: false\n * });\n * ```\n */\nexport const createCardContent = (config: CardContentConfig = {}): HTMLElement => {\n const baseConfig = {\n ...config,\n componentName: 'card-content',\n prefix: PREFIX\n };\n\n try {\n // Create element with innerHTML instead of html/text properties\n // for more reliable content rendering\n const content = pipe(\n createBase,\n withElement({\n tag: 'div',\n componentName: 'card-content',\n className: [\n config.class,\n config.padding === false ? `${PREFIX}-card-content--no-padding` : null\n ],\n attributes: {\n 'role': 'region',\n // Add explicit style attributes to ensure visibility\n 'style': 'display: block; color: inherit;'\n }\n })\n )(baseConfig);\n\n // Explicitly set the innerHTML for more reliable rendering\n if (config.html) {\n content.element.innerHTML = config.html;\n } else if (config.text) {\n // Wrap text in paragraph for proper formatting\n content.element.innerHTML = `<p>${config.text}</p>`;\n }\n\n // Add children if provided\n if (Array.isArray(config.children)) {\n config.children.forEach(child => {\n if (child instanceof HTMLElement) {\n content.element.appendChild(child);\n }\n });\n }\n\n // Add debug class to make troubleshooting easier\n // Remove this in production\n content.element.classList.add('debug-content');\n\n return content.element;\n } catch (error) {\n console.error('Card content creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create card content: ${error instanceof Error ? error.message : String(error)}`);\n }\n};\n\n/**\n * Creates a card header component\n * \n * @param {CardHeaderConfig} config - Header configuration\n * @returns {HTMLElement} Card header element\n * \n * @example\n * ```typescript\n * // Create a header with title and subtitle\n * const header = createCardHeader({\n * title: 'Card Title',\n * subtitle: 'Supporting text'\n * });\n * \n * // Create a header with an avatar and action\n * const avatarHeader = createCardHeader({\n * title: 'User Profile',\n * avatar: '<img src=\"user.jpg\" alt=\"User avatar\">',\n * action: createIconButton({ icon: 'more_vert' })\n * });\n * ```\n */\nexport const createCardHeader = (config: CardHeaderConfig = {}): HTMLElement => {\n const baseConfig = {\n ...config,\n componentName: 'card-header',\n prefix: PREFIX\n };\n\n try {\n const header = pipe(\n createBase,\n withElement({\n tag: 'div',\n componentName: 'card-header',\n className: config.class,\n attributes: {\n 'role': 'heading',\n 'aria-level': '3' // Default heading level\n }\n })\n )(baseConfig);\n\n // Create text container for title and subtitle\n const textContainer = createElement({\n tag: 'div',\n className: `${PREFIX}-card-header-text`,\n container: header.element\n });\n\n // Add title if provided\n if (config.title) {\n createElement({\n tag: 'h3',\n className: `${PREFIX}-card-header-title`,\n text: config.title,\n container: textContainer,\n attributes: {\n id: `${header.element.id || 'card-header'}-title`\n }\n });\n\n // Link the title ID to the card for accessibility if parent card exists\n const parentCard = header.element.closest(`.${PREFIX}-card`);\n if (parentCard && !parentCard.hasAttribute('aria-labelledby')) {\n parentCard.setAttribute('aria-labelledby', `${header.element.id || 'card-header'}-title`);\n }\n }\n\n // Add subtitle if provided\n if (config.subtitle) {\n createElement({\n tag: 'h4',\n className: `${PREFIX}-card-header-subtitle`,\n text: config.subtitle,\n container: textContainer\n });\n }\n\n // Add avatar if provided\n if (config.avatar) {\n const avatarElement = typeof config.avatar === 'string'\n ? createElement({\n tag: 'div',\n className: `${PREFIX}-card-header-avatar`,\n html: config.avatar\n })\n : config.avatar;\n\n // Ensure avatar has correct ARIA attributes if it's an image\n const avatarImg = avatarElement.querySelector('img');\n if (avatarImg && !avatarImg.hasAttribute('alt')) {\n avatarImg.setAttribute('alt', ''); // Decorative image\n avatarImg.setAttribute('aria-hidden', 'true');\n }\n\n header.element.insertBefore(avatarElement, header.element.firstChild);\n }\n\n // Add action if provided\n if (config.action) {\n const actionElement = typeof config.action === 'string'\n ? createElement({\n tag: 'div',\n className: `${PREFIX}-card-header-action`,\n html: config.action\n })\n : config.action;\n\n header.element.appendChild(actionElement);\n }\n\n return header.element;\n } catch (error) {\n console.error('Card header creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create card header: ${error instanceof Error ? error.message : String(error)}`);\n }\n};\n\n/**\n * Creates a card actions component\n * \n * @param {CardActionsConfig} config - Actions configuration\n * @returns {HTMLElement} Card actions element\n * \n * @example\n * ```typescript\n * // Create simple actions container with buttons\n * const actions = createCardActions({\n * actions: [\n * createButton({ text: 'Cancel' }),\n * createButton({ text: 'OK', variant: 'filled' })\n * ],\n * align: 'end'\n * });\n * \n * // Create full-bleed actions\n * const fullBleedActions = createCardActions({\n * actions: [createButton({ text: 'View Details', fullWidth: true })],\n * fullBleed: true\n * });\n * ```\n */\nexport const createCardActions = (config: CardActionsConfig = {}): HTMLElement => {\n const baseConfig = {\n ...config,\n componentName: 'card-actions',\n prefix: PREFIX\n };\n\n try {\n const actions = pipe(\n createBase,\n withElement({\n tag: 'div',\n componentName: 'card-actions',\n className: [\n config.class,\n config.fullBleed ? `${PREFIX}-card-actions--full-bleed` : null,\n config.vertical ? `${PREFIX}-card-actions--vertical` : null,\n config.align ? `${PREFIX}-card-actions--${config.align}` : null\n ],\n attributes: {\n 'role': 'group' // Semantically group actions together\n }\n })\n )(baseConfig);\n\n // Add action elements if provided\n if (Array.isArray(config.actions)) {\n config.actions.forEach((action, index) => {\n if (action instanceof HTMLElement) {\n // Ensure each action has accessible attributes\n if (!action.hasAttribute('aria-label') && \n !action.hasAttribute('aria-labelledby') &&\n action.textContent?.trim() === '') {\n action.setAttribute('aria-label', `Action ${index + 1}`);\n }\n \n actions.element.appendChild(action);\n }\n });\n }\n\n return actions.element;\n } catch (error) {\n console.error('Card actions creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create card actions: ${error instanceof Error ? error.message : String(error)}`);\n }\n};\n\n/**\n * Creates a card media component\n * \n * @param {CardMediaConfig} config - Media configuration\n * @returns {HTMLElement} Card media element\n * \n * @example\n * ```typescript\n * // Create a media component with an image\n * const media = createCardMedia({\n * src: 'image.jpg',\n * alt: 'Descriptive alt text',\n * aspectRatio: '16:9'\n * });\n * \n * // Create a media component with a custom element\n * const customMedia = createCardMedia({\n * element: videoElement,\n * aspectRatio: '4:3'\n * });\n * ```\n */\nexport const createCardMedia = (config: CardMediaConfig = {}): HTMLElement => {\n const baseConfig = {\n ...config,\n componentName: 'card-media',\n prefix: PREFIX\n };\n\n try {\n const media = pipe(\n createBase,\n withElement({\n tag: 'div',\n componentName: 'card-media',\n className: [\n config.class,\n config.aspectRatio ? `${PREFIX}-card-media--${config.aspectRatio.replace(':', '-')}` : null,\n config.contain ? `${PREFIX}-card-media--contain` : null\n ]\n })\n )(baseConfig);\n\n // If custom element is provided, use it\n if (config.element instanceof HTMLElement) {\n media.element.appendChild(config.element);\n }\n // Otherwise create an image if src is provided\n else if (config.src) {\n const img = document.createElement('img');\n img.src = config.src;\n img.className = `${PREFIX}-card-media-img`;\n \n // Ensure alt text is always provided for accessibility\n img.alt = config.alt || '';\n if (!config.alt) {\n // If no alt text is provided, mark as decorative\n img.setAttribute('aria-hidden', 'true');\n }\n \n media.element.appendChild(img);\n }\n\n return media.element;\n } catch (error) {\n console.error('Card media creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create card media: ${error instanceof Error ? error.message : String(error)}`);\n }\n};",
|
|
88
93
|
"// src/components/card/constants.ts\n\n/**\n * Card variants following Material Design 3 guidelines\n * - ELEVATED: Card with shadow elevation (default)\n * - FILLED: Card with filled background color and no elevation\n * - OUTLINED: Card with outline border and no elevation\n */\nexport const CARD_VARIANTS = {\n ELEVATED: 'elevated',\n FILLED: 'filled',\n OUTLINED: 'outlined'\n} as const;\n\n/**\n * Card elevation levels in Material Design 3\n * Specifies the shadow height in density-independent pixels (dp)\n */\nexport const CARD_ELEVATIONS = {\n LEVEL0: 0,\n LEVEL1: 1,\n LEVEL2: 2,\n LEVEL4: 4\n} as const;\n\n/**\n * Card width constants\n * Provides standardized card widths based on Material Design\n */\nexport const CARD_WIDTHS = {\n SMALL: '344px',\n MEDIUM: '480px',\n LARGE: '624px',\n FULL: '100%'\n} as const;\n\n/**\n * Card corner radius options\n * Provides standardized corner radius values\n */\nexport const CARD_CORNER_RADIUS = {\n SMALL: '8px',\n MEDIUM: '12px',\n LARGE: '16px'\n} as const;\n\n/**\n * Card media aspect ratio options\n */\nexport const CARD_ASPECT_RATIOS = {\n SQUARE: '1:1',\n STANDARD: '4:3',\n WIDESCREEN: '16:9'\n} as const;\n\n/**\n * Card action alignment options\n */\nexport const CARD_ACTION_ALIGNMENT = {\n START: 'start',\n CENTER: 'center',\n END: 'end',\n SPACE_BETWEEN: 'space-between'\n} as const;\n\n/**\n * Card media position options\n */\nexport const CARD_MEDIA_POSITION = {\n TOP: 'top',\n BOTTOM: 'bottom'\n} as const;\n\n/**\n * CSS class names used in the card component\n */\nexport const CARD_CLASSES = {\n ROOT: 'card',\n HEADER: 'card-header',\n TITLE: 'card-title',\n SUBTITLE: 'card-subtitle',\n AVATAR: 'card-avatar',\n HEADER_ACTION: 'card-header-action',\n CONTENT: 'card-content',\n MEDIA: 'card-media',\n ACTIONS: 'card-actions',\n DRAGGABLE: 'card-draggable',\n INTERACTIVE: 'card-interactive',\n FULL_WIDTH: 'card-full-width',\n CLICKABLE: 'card-clickable',\n LOADING: 'card-loading',\n EXPANDED: 'card-expanded',\n ELEVATION_PREFIX: 'card-elevation-'\n} as const;",
|
|
89
94
|
"// src/components/card/features.ts\nimport { PREFIX } from \"../../core/config\";\nimport { createElement } from \"../../core/dom/create\";\nimport {\n BaseComponent,\n CardComponent,\n LoadingFeature,\n ExpandableFeature,\n SwipeableFeature,\n} from \"./types\";\nimport { CARD_ELEVATION_LEVELS } from \"./config\";\n\ninterface LoadingConfig {\n initialState?: boolean;\n}\n\ninterface ExpandableConfig {\n initialExpanded?: boolean;\n expandableContent?: HTMLElement;\n}\n\ninterface SwipeableConfig {\n onSwipeLeft?: (component: CardComponent) => void;\n onSwipeRight?: (component: CardComponent) => void;\n threshold?: number;\n}\n\n// Common type aliases to replace any\nexport type JSONValue =\n | string\n | number\n | boolean\n | null\n | JSONObject\n | JSONArray;\nexport type JSONObject = { [key: string]: JSONValue };\nexport type JSONArray = JSONValue[];\n\n// For when you truly need flexibility\nexport type UnknownObject = Record<string, unknown>;\nexport type UnknownArray = unknown[];\nexport type UnknownFunction = (...args: unknown[]) => unknown;\n\n// For API responses\nexport type APIResponse<T = unknown> = {\n data: T;\n meta?: Record<string, unknown>;\n error?: string;\n};\n\n/**\n * Higher-order function to add loading state to a card.\n * Adds a loading overlay with spinner and proper ARIA attributes\n * for accessibility during asynchronous operations.\n *\n * @param {LoadingConfig} config - Loading state configuration\n * @returns {Function} Card component enhancer\n * @category Components\n * @example\n * ```typescript\n * // Create a card with loading state\n * const card = pipe(\n * createCard,\n * withLoading({ initialState: true })\n * )();\n *\n * // Toggle loading state\n * setTimeout(() => card.loading.setLoading(false), 2000);\n *\n * // Check loading state\n * console.log(card.loading.isLoading()); // false after timeout\n * ```\n */\nexport const withLoading =\n (config: LoadingConfig = {}) =>\n (component: BaseComponent): BaseComponent & { loading: LoadingFeature } => {\n const initialState = config.initialState || false;\n let loadingElement: HTMLElement | null = null;\n let isLoading = initialState;\n\n function setLoading(loading: boolean): void {\n isLoading = loading;\n\n if (loading && !loadingElement) {\n // Create and add loading overlay\n loadingElement = createElement({\n tag: \"div\",\n className: `${PREFIX}-card-loading-overlay`,\n container: component.element,\n attributes: {\n role: \"progressbar\",\n \"aria-busy\": \"true\",\n \"aria-label\": \"Loading\",\n },\n });\n\n // Add spinner\n createElement({\n tag: \"div\",\n className: `${PREFIX}-card-loading-spinner`,\n container: loadingElement,\n });\n\n component.element.classList.add(`${PREFIX}-card--state-loading`);\n component.element.setAttribute(\"aria-busy\", \"true\");\n } else if (!loading && loadingElement) {\n // Remove loading overlay\n loadingElement.remove();\n loadingElement = null;\n component.element.classList.remove(`${PREFIX}-card--state-loading`);\n component.element.setAttribute(\"aria-busy\", \"false\");\n }\n }\n\n if (initialState) {\n setLoading(true);\n }\n\n return {\n ...component,\n loading: {\n isLoading: () => isLoading,\n setLoading,\n },\n };\n };\n\n/**\n * Higher-order function to add elevation to a card based on its variant.\n *\n * Sets the initial elevation CSS variable according to Material Design 3 guidelines:\n * - Elevated variant: 1dp elevation\n * - Filled and outlined variants: 0dp elevation\n *\n * These elevation values affect shadows and surface appearance of the card\n * to create appropriate visual hierarchy.\n *\n * @param {BaseComponent} component - Card component\n * @returns {BaseComponent} Card component with elevation applied\n * @category Components\n * @example\n * ```typescript\n * // Apply elevation in the composition chain\n * const card = pipe(\n * createBase,\n * withElement(config),\n * withElevation\n * )(baseConfig);\n * ```\n */\nexport const withElevation = (component: BaseComponent): BaseComponent => {\n const config = component.config;\n\n // Set initial elevation based on variant\n if (config.variant === \"elevated\") {\n component.element.style.setProperty(\n \"--card-elevation\",\n String(CARD_ELEVATION_LEVELS.LEVEL1),\n );\n } else {\n component.element.style.setProperty(\n \"--card-elevation\",\n String(CARD_ELEVATION_LEVELS.LEVEL0),\n );\n }\n\n return component;\n};\n\n/**\n * Higher-order function to add expandable behavior to a card.\n * Creates a collapsible section with proper accessibility attributes and\n * toggle controls. Supports keyboard interaction and screen readers.\n *\n * @param {ExpandableConfig} config - Expandable configuration\n * @returns {Function} Card component enhancer\n * @category Components\n * @example\n * ```typescript\n * // Create a card with expandable content\n * const expandableContent = document.createElement('div');\n * expandableContent.textContent = 'Additional content that can be expanded';\n *\n * const card = pipe(\n * createCard,\n * withExpandable({\n * initialExpanded: false,\n * expandableContent\n * })\n * )();\n *\n * // Later toggle the expanded state\n * card.expandable.toggleExpanded();\n *\n * // Or check current state\n * if (card.expandable.isExpanded()) {\n * console.log('Card is expanded');\n * }\n * ```\n */\nexport const withExpandable =\n (config: ExpandableConfig = {}) =>\n (\n component: BaseComponent,\n ): BaseComponent & { expandable: ExpandableFeature } => {\n const initialExpanded = config.initialExpanded || false;\n let isExpanded = initialExpanded;\n const expandableContent = config.expandableContent;\n\n // Create expand/collapse button\n const expandButton = createElement({\n tag: \"button\",\n className: `${PREFIX}-card-expand-button`,\n attributes: {\n \"aria-expanded\": isExpanded ? \"true\" : \"false\",\n \"aria-label\": isExpanded ? \"Collapse content\" : \"Expand content\",\n \"aria-controls\":\n expandableContent?.id ||\n `${component.element.id || \"card\"}-expandable-content`,\n },\n }) as HTMLButtonElement;\n\n // Add to card as action if not already present\n const actionsContainer = component.element.querySelector(\n `.${PREFIX}-card-actions`,\n );\n if (actionsContainer) {\n actionsContainer.appendChild(expandButton);\n } else {\n // Create actions container if not present\n const newActionsContainer = createElement({\n tag: \"div\",\n className: `${PREFIX}-card-actions`,\n container: component.element,\n attributes: {\n role: \"group\",\n },\n });\n newActionsContainer.appendChild(expandButton);\n }\n\n // Set initial state\n if (expandableContent) {\n expandableContent.classList.add(`${PREFIX}-card-expandable-content`);\n\n // Ensure the expandable content has an ID for ARIA controls\n if (!expandableContent.id) {\n expandableContent.id = `${\n component.element.id || \"card\"\n }-expandable-content`;\n }\n\n if (!initialExpanded) {\n expandableContent.style.display = \"none\";\n expandableContent.setAttribute(\"aria-hidden\", \"true\");\n } else {\n expandableContent.setAttribute(\"aria-hidden\", \"false\");\n }\n\n component.element.appendChild(expandableContent);\n }\n\n // Set expanded state\n function setExpanded(expanded: boolean): void {\n isExpanded = expanded;\n\n if (expandableContent) {\n expandableContent.style.display = expanded ? \"block\" : \"none\";\n expandableContent.setAttribute(\n \"aria-hidden\",\n expanded ? \"false\" : \"true\",\n );\n }\n\n expandButton.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n expandButton.setAttribute(\n \"aria-label\",\n expanded ? \"Collapse content\" : \"Expand content\",\n );\n\n if (expanded) {\n component.element.classList.add(`${PREFIX}-card--expanded`);\n } else {\n component.element.classList.remove(`${PREFIX}-card--expanded`);\n }\n\n component.emit?.(\"expandedChanged\", { expanded });\n }\n\n // Toggle expanded state\n function toggleExpanded(): void {\n setExpanded(!isExpanded);\n }\n\n // Add click handler to toggle button\n expandButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n toggleExpanded();\n });\n\n // Add keyboard handler for accessibility\n expandButton.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleExpanded();\n }\n });\n\n return {\n ...component,\n expandable: {\n isExpanded: () => isExpanded,\n setExpanded,\n toggleExpanded,\n },\n };\n };\n\n/**\n * Higher-order function to add swipeable behavior to a card.\n * Implements touch-based swipe gestures with customizable threshold and callbacks.\n * Includes keyboard accessibility support and visual feedback during swipe.\n *\n * @param {SwipeableConfig} config - Swipeable configuration\n * @returns {Function} Card component enhancer\n * @category Components\n * @example\n * ```typescript\n * // Create a swipeable card with custom actions\n * const card = pipe(\n * createCard,\n * withSwipeable({\n * threshold: 100, // Swipe sensitivity in pixels\n * onSwipeLeft: (card) => {\n * console.log('Swiped left');\n * // For example: Delete or archive action\n * },\n * onSwipeRight: (card) => {\n * console.log('Swiped right');\n * // For example: Save or favorite action\n * }\n * })\n * )({ variant: 'elevated' });\n *\n * // Reset card position programmatically\n * card.swipeable.reset();\n * ```\n */\nexport const withSwipeable =\n (config: SwipeableConfig = {}) =>\n (\n component: BaseComponent,\n ): BaseComponent & { swipeable: SwipeableFeature } => {\n const threshold = config.threshold || 100;\n let startX = 0;\n let currentX = 0;\n\n // Add accessibility information for swipeable cards\n component.element.setAttribute(\n \"aria-description\",\n \"Swipeable card. Swipe left or right to perform actions.\",\n );\n\n // Create hidden buttons for keyboard accessibility\n const leftActionButton = createElement({\n tag: \"button\",\n className: `${PREFIX}-card-swipe-left-action`,\n text: \"Swipe Left Action\",\n container: component.element,\n attributes: {\n \"aria-label\": \"Perform swipe left action\",\n style:\n \"position: absolute; left: -9999px; top: -9999px; visibility: hidden;\", // Visually hidden but accessible\n },\n }) as HTMLButtonElement;\n\n const rightActionButton = createElement({\n tag: \"button\",\n className: `${PREFIX}-card-swipe-right-action`,\n text: \"Swipe Right Action\",\n container: component.element,\n attributes: {\n \"aria-label\": \"Perform swipe right action\",\n style:\n \"position: absolute; left: -9999px; top: -9999px; visibility: hidden;\", // Visually hidden but accessible\n },\n }) as HTMLButtonElement;\n\n // Add keyboard handlers to the hidden buttons\n leftActionButton.addEventListener(\"click\", () => {\n if (config.onSwipeLeft) {\n component.element.style.transform = \"translateX(-100%)\";\n component.element.style.transition = \"transform 0.3s ease\";\n config.onSwipeLeft(component as CardComponent);\n }\n });\n\n rightActionButton.addEventListener(\"click\", () => {\n if (config.onSwipeRight) {\n component.element.style.transform = \"translateX(100%)\";\n component.element.style.transition = \"transform 0.3s ease\";\n config.onSwipeRight(component as CardComponent);\n }\n });\n\n function handleTouchStart(e: TouchEvent): void {\n startX = e.touches[0].clientX;\n component.element.style.transition = \"none\";\n }\n\n function handleTouchMove(e: TouchEvent): void {\n if (!startX) return;\n\n currentX = e.touches[0].clientX;\n const diffX = currentX - startX;\n\n // Apply transform to move card\n component.element.style.transform = `translateX(${diffX}px)`;\n }\n\n function handleTouchEnd(): void {\n if (!startX) return;\n\n component.element.style.transition = \"transform 0.3s ease\";\n const diffX = currentX - startX;\n\n if (Math.abs(diffX) >= threshold) {\n // Swipe threshold reached\n if (diffX > 0 && config.onSwipeRight) {\n // Swipe right\n component.element.style.transform = \"translateX(100%)\";\n config.onSwipeRight(component as CardComponent);\n } else if (diffX < 0 && config.onSwipeLeft) {\n // Swipe left\n component.element.style.transform = \"translateX(-100%)\";\n config.onSwipeLeft(component as CardComponent);\n } else {\n // Reset if no handler\n component.element.style.transform = \"translateX(0)\";\n }\n } else {\n // Reset if below threshold\n component.element.style.transform = \"translateX(0)\";\n }\n\n startX = 0;\n currentX = 0;\n }\n\n // Add event listeners\n component.element.addEventListener(\n \"touchstart\",\n handleTouchStart as EventListener,\n { passive: true },\n );\n component.element.addEventListener(\n \"touchmove\",\n handleTouchMove as EventListener,\n { passive: true },\n );\n component.element.addEventListener(\"touchend\", handleTouchEnd);\n\n // Add swipeable class\n component.element.classList.add(`${PREFIX}-card--swipeable`);\n\n // Return enhanced component\n return {\n ...component,\n swipeable: {\n reset: () => {\n component.element.style.transition = \"transform 0.3s ease\";\n component.element.style.transform = \"translateX(0)\";\n },\n },\n };\n };\n",
|
|
90
|
-
"// src/components/carousel/carousel.ts\
|
|
91
|
-
"// src/components/carousel/
|
|
92
|
-
"// src/components/carousel/features/slides.ts\nimport {\n CAROUSEL_EVENTS,\n CAROUSEL_LAYOUTS,\n CAROUSEL_DEFAULTS,\n} from \"../constants\";\nimport { CarouselConfig, CarouselSlide, CarouselLayout } from \"../types\";\n\n/**\n * Adds slide functionality to the carousel component with Material Design 3 layout types support\n *\n * @param {CarouselConfig} config - Carousel configuration\n * @returns {Function} Higher-order function that adds slides feature\n */\nexport const withSlides = (config: CarouselConfig) => (component) => {\n // Create the enhanced component to avoid circular references\n const enhancedComponent = { ...component };\n\n // Layout type from config (with default)\n const layout: CarouselLayout = config.layout || CAROUSEL_DEFAULTS.LAYOUT;\n\n // Create a wrapper for slides and \"Show all\" link\n const createSlidesWrapper = () => {\n const wrapper = document.createElement(\"div\");\n wrapper.className = `${component.getClass(\"carousel\")}-wrapper`;\n\n // Add a data attribute for the layout type\n wrapper.dataset.layout = layout;\n component.element.appendChild(wrapper);\n return wrapper;\n };\n\n // Container for all slides\n const slidesContainer = document.createElement(\"div\");\n slidesContainer.className = `${component.getClass(\"carousel\")}-slides`;\n slidesContainer.setAttribute(\"role\", \"list\");\n slidesContainer.setAttribute(\"aria-label\", \"Carousel Slides\");\n\n // Set scroll behavior\n if (config.scrollBehavior === \"snap\") {\n slidesContainer.dataset.snapScroll = \"true\";\n }\n\n // Set gap from config\n slidesContainer.dataset.gap = `${config.gap || CAROUSEL_DEFAULTS.GAP}`;\n\n // Create wrapper and add slides container first\n const wrapper = createSlidesWrapper();\n wrapper.appendChild(slidesContainer);\n\n // Current slide index\n let currentSlide = config.initialSlide || 0;\n let slideCount = 0;\n const slides: HTMLElement[] = [];\n const slideData: CarouselSlide[] = [];\n\n /**\n * Determine the size class for a slide based on layout and position\n *\n * @param {number} index - Slide index\n * @returns {'large' | 'medium' | 'small'} Size class\n */\n function determineSlideSize(index: number): \"large\" | \"medium\" | \"small\" {\n // If the slide has a predefined size, use it\n if (slideData[index]?.size) {\n return slideData[index].size as \"large\" | \"medium\" | \"small\";\n }\n\n // Default sizing logic based on layout type\n switch (layout) {\n case \"multi-browse\":\n // First 2 slides are large, next is medium, rest are small\n if (index === 0 || index === 1) return \"large\";\n if (index === 2) return \"medium\";\n return \"small\";\n\n case \"uncontained\":\n // All slides are the same size in uncontained layout\n return \"large\";\n\n case \"hero\":\n // First slide is large, rest are small\n return index === 0 ? \"large\" : \"small\";\n\n case \"full-screen\":\n // All slides take full width in full-screen layout\n return \"large\";\n\n default:\n return \"large\";\n }\n }\n\n /**\n * Update slide sizes based on layout, window size, and position\n * This implements the responsive behavior where sizes adjust as window changes\n */\n function updateSlideSizes() {\n // Get the container width to calculate relative sizes\n const containerWidth = slidesContainer.clientWidth;\n\n // Default to the standard sizes from constants\n let largeWidth =\n typeof CAROUSEL_DEFAULTS.ITEM_WIDTHS[layout].LARGE === \"number\"\n ? (CAROUSEL_DEFAULTS.ITEM_WIDTHS[layout].LARGE as number)\n : containerWidth;\n\n let mediumWidth =\n typeof CAROUSEL_DEFAULTS.ITEM_WIDTHS[layout].MEDIUM === \"number\"\n ? (CAROUSEL_DEFAULTS.ITEM_WIDTHS[layout].MEDIUM as number)\n : containerWidth * 0.75;\n\n let smallWidth =\n typeof CAROUSEL_DEFAULTS.ITEM_WIDTHS[layout].SMALL === \"number\"\n ? (CAROUSEL_DEFAULTS.ITEM_WIDTHS[layout].SMALL as number)\n : CAROUSEL_DEFAULTS.SMALL_ITEM_WIDTH;\n\n // Apply custom large item max width if specified\n if (\n config.largeItemMaxWidth &&\n typeof config.largeItemMaxWidth === \"number\"\n ) {\n largeWidth = Math.min(largeWidth, config.largeItemMaxWidth);\n }\n\n // Apply custom small item width if specified\n if (config.smallItemWidth && typeof config.smallItemWidth === \"number\") {\n smallWidth = config.smallItemWidth;\n }\n\n // Adjust for full-screen layout\n if (layout === \"full-screen\") {\n largeWidth = containerWidth;\n mediumWidth = containerWidth;\n smallWidth = containerWidth;\n }\n\n // Apply sizes to all slides\n slides.forEach((slideEl, index) => {\n const size = determineSlideSize(index);\n\n // Set width based on size class\n switch (size) {\n case \"large\":\n slideEl.style.width = `${largeWidth}px`;\n break;\n case \"medium\":\n slideEl.style.width = `${mediumWidth}px`;\n break;\n case \"small\":\n slideEl.style.width = `${smallWidth}px`;\n break;\n }\n\n // Add size class for styling\n slideEl.className = `${component.getClass(\n \"carousel\"\n )}-slide ${component.getClass(\"carousel\")}-slide--${size}`;\n\n // Handle text visibility based on size\n const titleEl = slideEl.querySelector(\n `.${component.getClass(\"carousel\")}-slide-title`\n );\n const descEl = slideEl.querySelector(\n `.${component.getClass(\"carousel\")}-slide-description`\n );\n\n if (titleEl) {\n if (size === \"small\" && layout !== \"uncontained\") {\n titleEl.classList.add(\"visually-hidden\");\n } else {\n titleEl.classList.remove(\"visually-hidden\");\n }\n }\n\n if (descEl) {\n if (\n size === \"small\" ||\n (size === \"medium\" && layout === \"multi-browse\")\n ) {\n descEl.classList.add(\"visually-hidden\");\n } else {\n descEl.classList.remove(\"visually-hidden\");\n }\n }\n });\n }\n\n /**\n * Create a new slide element from CarouselSlide data\n *\n * @param {CarouselSlide} slide - Slide data\n * @param {number} index - Optional position to insert at\n * @returns {HTMLElement} Created slide element\n */\n function addSlideElement(slide: CarouselSlide, index?: number): HTMLElement {\n const slideElement = document.createElement(\"div\");\n slideElement.className = `${component.getClass(\"carousel\")}-slide`;\n slideElement.setAttribute(\"role\", \"listitem\");\n slideElement.setAttribute(\"aria-roledescription\", \"slide\");\n\n // Set border radius from config\n slideElement.dataset.borderRadius = `${\n config.borderRadius || CAROUSEL_DEFAULTS.BORDER_RADIUS\n }`;\n\n // Create image container\n const imageContainer = document.createElement(\"div\");\n imageContainer.className = `${component.getClass(\"carousel\")}-slide-image`;\n\n // Create image element\n const image = document.createElement(\"img\");\n image.src = slide.image;\n image.alt = slide.title || \"Carousel slide\";\n imageContainer.appendChild(image);\n\n // Add overlay with accent color if provided\n if (slide.accent) {\n const overlay = document.createElement(\"div\");\n overlay.className = `${component.getClass(\"carousel\")}-slide-overlay`;\n if (slide.accent) {\n overlay.style.backgroundColor = slide.accent;\n }\n imageContainer.appendChild(overlay);\n }\n\n // Create content container\n const contentContainer = document.createElement(\"div\");\n contentContainer.className = `${component.getClass(\n \"carousel\"\n )}-slide-content`;\n\n // Add title if provided\n if (slide.title) {\n const title = document.createElement(\"div\");\n title.className = `${component.getClass(\"carousel\")}-slide-title`;\n title.textContent = slide.title;\n\n // For full-screen layout, add title to content container\n // For others, add directly to image container for overlay effect\n if (layout === \"full-screen\") {\n contentContainer.appendChild(title);\n } else {\n imageContainer.appendChild(title);\n }\n }\n\n // Add description if provided\n if (slide.description) {\n const description = document.createElement(\"div\");\n description.className = `${component.getClass(\n \"carousel\"\n )}-slide-description`;\n description.textContent = slide.description;\n contentContainer.appendChild(description);\n }\n\n // Add button if provided\n if (slide.buttonText) {\n const button = document.createElement(\"a\");\n button.className = `${component.getClass(\"carousel\")}-slide-button`;\n button.textContent = slide.buttonText;\n\n if (slide.buttonUrl) {\n button.href = slide.buttonUrl;\n }\n\n if (slide.accent) {\n button.style.backgroundColor = slide.accent;\n }\n\n contentContainer.appendChild(button);\n }\n\n slideElement.appendChild(imageContainer);\n slideElement.appendChild(contentContainer);\n\n // Store the slide data\n if (index !== undefined && index >= 0 && index <= slideData.length) {\n slideData.splice(index, 0, slide);\n } else {\n slideData.push(slide);\n }\n\n // Insert at specific position or append\n if (index !== undefined && index >= 0 && index <= slides.length) {\n if (index < slides.length) {\n slidesContainer.insertBefore(slideElement, slides[index]);\n slides.splice(index, 0, slideElement);\n } else {\n slidesContainer.appendChild(slideElement);\n slides.push(slideElement);\n }\n } else {\n slidesContainer.appendChild(slideElement);\n slides.push(slideElement);\n }\n\n slideCount++;\n\n // Update sizes after adding a new slide\n updateSlideSizes();\n\n return slideElement;\n }\n\n /**\n * Add \"Show all\" link after the slides\n * Material Design 3 recommends this for accessibility on vertical scrolling pages\n */\n const addShowAllLink = () => {\n if (config.showAllLink === false) return;\n\n const showAllCard = document.createElement(\"div\");\n showAllCard.className = `${component.getClass(\"carousel\")}-show-all`;\n showAllCard.setAttribute(\"role\", \"button\");\n showAllCard.setAttribute(\"tabindex\", \"0\");\n showAllCard.setAttribute(\"aria-label\", \"Show all items\");\n\n const showAllText = document.createElement(\"span\");\n showAllText.textContent = \"Show all\";\n\n showAllCard.appendChild(showAllText);\n wrapper.appendChild(showAllCard); // Add to wrapper after slides\n\n showAllCard.addEventListener(\"click\", () => {\n if (config.onShowAll && typeof config.onShowAll === \"function\") {\n config.onShowAll();\n }\n });\n\n // Add keyboard support\n showAllCard.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n if (config.onShowAll && typeof config.onShowAll === \"function\") {\n config.onShowAll();\n }\n event.preventDefault();\n }\n });\n };\n\n // Add initial slides if provided\n if (config.slides && config.slides.length > 0) {\n config.slides.forEach((slide) => {\n addSlideElement(slide);\n });\n }\n\n // Add \"Show all\" link after all slides are added\n // This is recommended by MD3 for accessibility on vertical scrolling pages\n if (config.showAllLink !== false && layout !== \"full-screen\") {\n addShowAllLink();\n }\n\n // Handle window resize events for responsive design\n const handleResize = () => {\n updateSlideSizes();\n\n // Dispatch resize event\n const resizeEvent = new CustomEvent(CAROUSEL_EVENTS.RESIZE, {\n detail: { width: slidesContainer.clientWidth },\n });\n component.element.dispatchEvent(resizeEvent);\n };\n\n // Add resize listener\n window.addEventListener(\"resize\", handleResize);\n\n // Run initial size update\n setTimeout(updateSlideSizes, 0);\n\n /**\n * Navigate to a specific slide\n *\n * @param {number} index - Target slide index\n * @returns {Object} Enhanced component for chaining\n */\n const goTo = (index: number) => {\n // Validate index\n if (index < 0 || index >= slideCount) {\n if (config.loop) {\n // Handle looping\n if (index < 0) {\n index = slideCount - 1;\n } else {\n index = 0;\n }\n } else {\n // Don't change if out of bounds and not looping\n return enhancedComponent;\n }\n }\n\n // Only trigger events if the slide actually changes\n if (currentSlide !== index) {\n // Dispatch event before changing\n const beforeEvent = new CustomEvent(CAROUSEL_EVENTS.SLIDE_CHANGE, {\n detail: { previousSlide: currentSlide, nextSlide: index },\n });\n component.element.dispatchEvent(beforeEvent);\n\n // Update current slide\n currentSlide = index;\n\n // Apply active state to current slide\n slides.forEach((slideEl, i) => {\n if (i === currentSlide) {\n slideEl.classList.add(\n `${component.getClass(\"carousel\")}-slide--active`\n );\n slideEl.setAttribute(\"aria-current\", \"true\");\n } else {\n slideEl.classList.remove(\n `${component.getClass(\"carousel\")}-slide--active`\n );\n slideEl.removeAttribute(\"aria-current\");\n }\n });\n\n // Scroll behavior based on config\n const behavior = config.scrollBehavior === \"snap\" ? \"smooth\" : \"auto\";\n\n // Scroll to the slide\n if (slides[index]) {\n // For center-aligned hero layout, adjust scroll position\n if (layout === \"hero\" && config.centered) {\n const slideWidth = slides[index].offsetWidth;\n const containerWidth = slidesContainer.clientWidth;\n const offsetLeft = slides[index].offsetLeft;\n\n slidesContainer.scrollTo({\n left: offsetLeft - containerWidth / 2 + slideWidth / 2,\n behavior,\n });\n } else {\n // Standard scrolling\n slides[index].scrollIntoView({\n behavior,\n block: \"nearest\",\n inline: \"start\",\n });\n }\n }\n\n // Dispatch event after changing\n const afterEvent = new CustomEvent(CAROUSEL_EVENTS.SLIDE_CHANGED, {\n detail: { currentSlide },\n });\n component.element.dispatchEvent(afterEvent);\n }\n\n return enhancedComponent;\n };\n\n // Define next and prev functions that use goTo\n const next = () => goTo(currentSlide + 1);\n const prev = () => goTo(currentSlide - 1);\n\n // Assign properties to the enhanced component\n Object.assign(enhancedComponent, {\n slides: {\n addSlide: (slide: CarouselSlide, index?: number) => {\n addSlideElement(slide, index);\n return enhancedComponent.slides;\n },\n\n removeSlide: (index: number) => {\n if (index >= 0 && index < slides.length) {\n slidesContainer.removeChild(slides[index]);\n slides.splice(index, 1);\n slideData.splice(index, 1);\n slideCount--;\n\n // Adjust current slide index if needed\n if (currentSlide >= slideCount) {\n currentSlide = slideCount - 1;\n }\n\n if (currentSlide < 0) {\n currentSlide = 0;\n }\n\n // Update sizes after removing a slide\n updateSlideSizes();\n }\n\n return enhancedComponent.slides;\n },\n\n updateSlide: (index: number, slide: CarouselSlide) => {\n if (index >= 0 && index < slides.length) {\n // Update slide data\n slideData[index] = slide;\n\n // Update visual elements\n const slideElement = slides[index];\n\n // Update image\n const imageElement = slideElement.querySelector(\"img\");\n if (imageElement) {\n imageElement.src = slide.image;\n imageElement.alt = slide.title || \"Carousel slide\";\n }\n\n // Update title\n const titleElement = slideElement.querySelector(\n `.${component.getClass(\"carousel\")}-slide-title`\n );\n if (titleElement && slide.title) {\n titleElement.textContent = slide.title;\n }\n\n // Update description\n const descriptionElement = slideElement.querySelector(\n `.${component.getClass(\"carousel\")}-slide-description`\n );\n if (descriptionElement && slide.description) {\n descriptionElement.textContent = slide.description;\n }\n\n // Update accent color\n const overlayElement = slideElement.querySelector(\n `.${component.getClass(\"carousel\")}-slide-overlay`\n );\n if (overlayElement && slide.accent) {\n (overlayElement as HTMLElement).style.backgroundColor =\n slide.accent;\n }\n\n // Update button\n const buttonElement = slideElement.querySelector(\n `.${component.getClass(\"carousel\")}-slide-button`\n );\n if (buttonElement) {\n if (slide.buttonText) {\n buttonElement.textContent = slide.buttonText;\n\n if (slide.buttonUrl) {\n (buttonElement as HTMLAnchorElement).href = slide.buttonUrl;\n }\n\n if (slide.accent) {\n (buttonElement as HTMLElement).style.backgroundColor =\n slide.accent;\n }\n } else {\n // Remove button if no text provided\n buttonElement.parentElement?.removeChild(buttonElement);\n }\n } else if (slide.buttonText) {\n // Add button if not present but now needed\n const contentContainer = slideElement.querySelector(\n `.${component.getClass(\"carousel\")}-slide-content`\n );\n if (contentContainer) {\n const button = document.createElement(\"a\");\n button.className = `${component.getClass(\n \"carousel\"\n )}-slide-button`;\n button.textContent = slide.buttonText;\n\n if (slide.buttonUrl) {\n button.href = slide.buttonUrl;\n }\n\n if (slide.accent) {\n button.style.backgroundColor = slide.accent;\n }\n\n contentContainer.appendChild(button);\n }\n }\n\n // Update sizes if size property changed\n if (slide.size) {\n updateSlideSizes();\n }\n }\n\n return enhancedComponent.slides;\n },\n\n getSlide: (index: number) => {\n if (index >= 0 && index < slideData.length) {\n return slideData[index];\n }\n return null;\n },\n\n getCount: () => slideCount,\n\n getElements: () => [...slides],\n },\n\n slidesContainer,\n slideData,\n wrapper,\n\n getCurrentSlide: () => currentSlide,\n\n goTo,\n next,\n prev,\n\n enableLoop: () => {\n config.loop = true;\n return enhancedComponent;\n },\n\n disableLoop: () => {\n config.loop = false;\n return enhancedComponent;\n },\n\n setBorderRadius: (radius: number) => {\n config.borderRadius = radius;\n slides.forEach((slide) => {\n slide.dataset.borderRadius = `${radius}`;\n });\n return enhancedComponent;\n },\n\n setGap: (gap: number) => {\n config.gap = gap;\n slidesContainer.dataset.gap = `${gap}`;\n return enhancedComponent;\n },\n\n updateLayout: (newLayout: CarouselLayout) => {\n // Update layout setting\n config.layout = newLayout;\n\n // Update data attributes\n wrapper.dataset.layout = newLayout;\n component.element.dataset.layout = newLayout;\n\n // Remove previous layout classes\n Object.values(CAROUSEL_LAYOUTS).forEach((layoutValue) => {\n component.element.classList.remove(\n `${component.getClass(\"carousel\")}-layout--${layoutValue}`\n );\n });\n\n // Add new layout class\n component.element.classList.add(\n `${component.getClass(\"carousel\")}-layout--${newLayout}`\n );\n\n // Update sizes based on new layout\n updateSlideSizes();\n\n return enhancedComponent;\n },\n\n // Add lifecycle cleanup for resize handler\n lifecycle: {\n ...(component.lifecycle || {}),\n destroy: () => {\n // Remove resize event listener\n window.removeEventListener(\"resize\", handleResize);\n\n // Call original destroy if it exists\n if (component.lifecycle && component.lifecycle.destroy) {\n component.lifecycle.destroy();\n }\n },\n },\n });\n\n // Add necessary class for styling based on transition type\n if (config.transition) {\n component.element.classList.add(\n `${component.getClass(\"carousel\")}-transition--${config.transition}`\n );\n }\n\n // Add scroll event listeners for detecting current slide when using snap-scroll\n if (config.scrollBehavior === \"snap\") {\n slidesContainer.addEventListener(\"scroll\", () => {\n // Debounce the scroll event\n clearTimeout(enhancedComponent[\"scrollTimeout\"]);\n\n enhancedComponent[\"scrollTimeout\"] = setTimeout(() => {\n // Find the slide most in view\n let closestSlide = 0;\n let closestDistance = Infinity;\n\n const containerLeft = slidesContainer.scrollLeft;\n const containerWidth = slidesContainer.clientWidth;\n\n slides.forEach((slide, index) => {\n const slideLeft = slide.offsetLeft;\n const slideCenter = slideLeft + slide.offsetWidth / 2;\n const containerCenter = containerLeft + containerWidth / 2;\n\n const distance = Math.abs(slideCenter - containerCenter);\n\n if (distance < closestDistance) {\n closestDistance = distance;\n closestSlide = index;\n }\n });\n\n // Only update if the slide has changed\n if (closestSlide !== currentSlide) {\n currentSlide = closestSlide;\n\n // Update active class\n slides.forEach((slideEl, i) => {\n if (i === currentSlide) {\n slideEl.classList.add(\n `${component.getClass(\"carousel\")}-slide--active`\n );\n slideEl.setAttribute(\"aria-current\", \"true\");\n } else {\n slideEl.classList.remove(\n `${component.getClass(\"carousel\")}-slide--active`\n );\n slideEl.removeAttribute(\"aria-current\");\n }\n });\n\n // Dispatch event\n const event = new CustomEvent(CAROUSEL_EVENTS.SLIDE_CHANGED, {\n detail: { currentSlide },\n });\n component.element.dispatchEvent(event);\n }\n }, 150); // Debounce time\n });\n }\n\n return enhancedComponent;\n};\n",
|
|
93
|
-
"// src/components/carousel/features/drag.ts\nimport { CarouselConfig } from \"../types\";\n\n/**\n * Adds drag functionality to the carousel component with Material Design 3 scroll behavior support\n *\n * @param {CarouselConfig} config - Carousel configuration\n * @returns {Function} Higher-order function that adds drag navigation feature\n */\nexport const withDrag = (config: CarouselConfig) => (component) => {\n let startX: number;\n let startScrollLeft: number;\n let currentX: number;\n let isDragging = false;\n let velocity = 0;\n let lastTimestamp = 0;\n let animationFrame: number;\n\n // Scroll behavior from config\n const scrollBehavior = config.scrollBehavior || \"default\";\n\n // Handle pointer events\n const handlePointerDown = (event: PointerEvent) => {\n // Only handle primary button (usually left click)\n if (event.button !== 0) return;\n\n // Cancel any ongoing scroll animations\n cancelAnimationFrame(animationFrame);\n\n startX = event.clientX;\n startScrollLeft = component.slidesContainer.scrollLeft;\n currentX = startX;\n isDragging = true;\n lastTimestamp = Date.now();\n velocity = 0;\n\n // Set dragging state via data attribute\n component.slidesContainer.dataset.touchAction = \"none\";\n component.element.dataset.dragging = \"true\";\n\n // Prevent default behaviors that might cause resistance\n component.slidesContainer.style.scrollBehavior = \"auto\";\n\n // Capture pointer to receive events outside element\n component.element.setPointerCapture(event.pointerId);\n\n // Stop click events during drag\n event.preventDefault();\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!isDragging) return;\n\n // Calculate how far the pointer has moved\n const dx = event.clientX - startX;\n\n // Directly set scroll position without any easing or calculations\n component.slidesContainer.scrollLeft = startScrollLeft - dx;\n\n // Calculate velocity for momentum scrolling\n const now = Date.now();\n const dt = now - lastTimestamp;\n\n if (dt > 0) {\n const dx = event.clientX - currentX;\n velocity = dx / dt; // Pixels per millisecond\n }\n\n currentX = event.clientX;\n lastTimestamp = now;\n\n event.preventDefault();\n };\n\n /**\n * Finds the nearest snap position based on current scroll position\n * Used for snap scrolling behavior\n */\n const findSnapPosition = () => {\n const slideElements = component.slides.getElements();\n const containerWidth = component.slidesContainer.clientWidth;\n const scrollLeft = component.slidesContainer.scrollLeft;\n\n // For center-aligned hero layout\n const isCentered = config.layout === \"hero\" && config.centered;\n\n let closestPosition = 0;\n let closestDistance = Infinity;\n\n // Find the closest slide position for snapping\n slideElements.forEach((slide) => {\n let targetPosition;\n\n if (isCentered) {\n // For centered layouts, snap to center-aligned position\n const slideCenter = slide.offsetLeft + slide.offsetWidth / 2;\n targetPosition = slideCenter - containerWidth / 2;\n } else {\n // For standard layouts, snap to start-aligned position\n targetPosition = slide.offsetLeft;\n }\n\n const distance = Math.abs(targetPosition - scrollLeft);\n\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPosition = targetPosition;\n }\n });\n\n return closestPosition;\n };\n\n /**\n * Animates scroll with momentum and snapping\n * @param {number} startPosition - Starting scroll position\n * @param {number} endPosition - Target scroll position\n * @param {number} startVelocity - Initial velocity in pixels/ms\n */\n const animateScroll = (\n startPosition: number,\n endPosition: number,\n startVelocity: number\n ) => {\n const startTime = Date.now();\n const distance = endPosition - startPosition;\n\n // Base animation duration on distance and velocity\n // Faster flicks = shorter duration\n let duration = 500; // Base duration in ms\n\n if (Math.abs(startVelocity) > 0.5) {\n // For faster flicks, reduce duration\n duration = Math.min(duration, 300);\n }\n\n const animateStep = () => {\n const elapsed = Date.now() - startTime;\n let progress = Math.min(elapsed / duration, 1);\n\n // Ease out cubic function for smooth deceleration\n progress = 1 - Math.pow(1 - progress, 3);\n\n const currentPosition = startPosition + distance * progress;\n component.slidesContainer.scrollLeft = currentPosition;\n\n if (progress < 1) {\n animationFrame = requestAnimationFrame(animateStep);\n }\n };\n\n animationFrame = requestAnimationFrame(animateStep);\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (!isDragging) return;\n\n isDragging = false;\n delete component.element.dataset.dragging;\n\n // Release pointer capture\n component.element.releasePointerCapture(event.pointerId);\n\n // Handle scroll behavior based on config\n if (scrollBehavior === \"snap\") {\n // Find nearest snap position\n const snapPosition = findSnapPosition();\n\n // Use velocity for a more natural feel\n animateScroll(\n component.slidesContainer.scrollLeft,\n snapPosition,\n velocity\n );\n } else if (Math.abs(velocity) > 0.5) {\n // For standard scrolling, add momentum effect for fast flicks\n const momentumDistance = velocity * 100; // Arbitrary multiplier for momentum\n const targetPosition =\n component.slidesContainer.scrollLeft - momentumDistance;\n\n animateScroll(\n component.slidesContainer.scrollLeft,\n targetPosition,\n velocity\n );\n }\n\n // Reset velocity\n velocity = 0;\n\n // Restore scrolling behavior\n setTimeout(() => {\n component.slidesContainer.style.scrollBehavior = \"\";\n }, 0);\n };\n\n const handlePointerCancel = (event: PointerEvent) => {\n if (isDragging) {\n isDragging = false;\n delete component.element.dataset.dragging;\n component.element.releasePointerCapture(event.pointerId);\n\n // Restore scrolling behavior\n component.slidesContainer.style.scrollBehavior = \"\";\n }\n };\n\n /**\n * Handle wheel events for horizontal scrolling\n * @param {WheelEvent} event - Wheel event\n */\n const handleWheel = (event: WheelEvent) => {\n // For full-screen layout, allow vertical scrolling\n if (config.layout === \"full-screen\") {\n // Let the default scroll behavior happen\n return;\n }\n\n // For other layouts, transform vertical scrolling to horizontal\n event.preventDefault();\n\n // Determine the scroll delta\n const delta = event.deltaY || event.deltaX;\n\n // Calculate scroll increment based on wheel delta\n const scrollIncrement = delta * 0.5;\n\n // For snap scrolling, we want to snap after wheel events\n if (scrollBehavior === \"snap\") {\n // First scroll normally\n component.slidesContainer.scrollLeft += scrollIncrement;\n\n // Clear previous snap timeout\n clearTimeout(component[\"wheelSnapTimeout\"]);\n\n // Set timeout to snap after wheel motion stops\n component[\"wheelSnapTimeout\"] = setTimeout(() => {\n const snapPosition = findSnapPosition();\n\n // Animate to snap position\n animateScroll(component.slidesContainer.scrollLeft, snapPosition, 0);\n }, 150); // Short delay to detect end of wheel motion\n } else {\n // Standard scrolling - just scroll directly\n component.slidesContainer.scrollLeft += scrollIncrement;\n }\n };\n\n /**\n * Apply parallax effect to slides during scroll\n * Used for multi-browse layout with different sized items\n */\n const applyParallaxEffect = () => {\n // Only apply for multi-browse layout\n if (\n config.layout !== \"multi-browse\" ||\n !component.element.dataset.enableParallax\n ) {\n return;\n }\n\n const slides = component.slides.getElements();\n const containerWidth = component.slidesContainer.clientWidth;\n const scrollLeft = component.slidesContainer.scrollLeft;\n\n slides.forEach((slide) => {\n const slideLeft = slide.offsetLeft;\n const slideWidth = slide.offsetWidth;\n\n // Calculate how centered the slide is in the container\n const slideCenterX = slideLeft + slideWidth / 2;\n const containerCenterX = scrollLeft + containerWidth / 2;\n const distanceFromCenter = slideCenterX - containerCenterX;\n\n // Normalize to a -1 to 1 range\n const normalizedDistance = Math.max(\n -1,\n Math.min(1, distanceFromCenter / (containerWidth / 2))\n );\n\n // Apply a subtle parallax effect\n // Move images in the opposite direction of the scroll by a small amount\n const slideImage = slide.querySelector(\n `.${component.getClass(\"carousel\")}-slide-image img`\n );\n if (slideImage) {\n (slideImage as HTMLElement).style.transform = `translateX(${\n normalizedDistance * -5\n }%)`;\n }\n });\n };\n\n // Handle scroll events for parallax and active slide detection\n const handleScroll = () => {\n // Apply parallax effect if enabled\n applyParallaxEffect();\n };\n\n // Add parallax data attribute if it's multi-browse\n if (config.layout === \"multi-browse\") {\n component.element.dataset.enableParallax = \"true\";\n }\n\n // Add data attribute for draggable UI\n component.element.dataset.swipe = \"true\";\n\n // Add pointer event listeners\n component.slidesContainer.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n\n // Add wheel event listener with appropriate passive setting\n component.slidesContainer.addEventListener(\"wheel\", handleWheel, {\n passive: false,\n });\n\n // Add scroll event listener for parallax effect\n component.slidesContainer.addEventListener(\"scroll\", handleScroll, {\n passive: true,\n });\n\n // Add keyboard navigation\n const handleKeyDown = (event: KeyboardEvent) => {\n // Only handle keyboard navigation when the carousel has focus\n if (component.element !== document.activeElement) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowLeft\":\n if (component.prev) {\n component.prev();\n } else {\n // Fallback if prev method not available\n component.slidesContainer.scrollBy({\n left: -200,\n behavior: scrollBehavior === \"snap\" ? \"smooth\" : \"auto\",\n });\n }\n event.preventDefault();\n break;\n\n case \"ArrowRight\":\n if (component.next) {\n component.next();\n } else {\n // Fallback if next method not available\n component.slidesContainer.scrollBy({\n left: 200,\n behavior: scrollBehavior === \"snap\" ? \"smooth\" : \"auto\",\n });\n }\n event.preventDefault();\n break;\n\n case \"Home\":\n // Go to first slide\n if (component.goTo) {\n component.goTo(0);\n }\n event.preventDefault();\n break;\n\n case \"End\":\n // Go to last slide\n if (component.goTo && component.slides.getCount) {\n component.goTo(component.slides.getCount() - 1);\n }\n event.preventDefault();\n break;\n }\n };\n\n // Make the carousel focusable for keyboard navigation\n component.element.setAttribute(\"tabindex\", \"0\");\n component.element.addEventListener(\"keydown\", handleKeyDown);\n\n // Add aria attributes for accessibility\n component.element.setAttribute(\"aria-label\", \"Carousel\");\n\n // Return the component with additional cleanup\n return {\n ...component,\n\n // Add drag cleanup to lifecycle\n lifecycle: {\n ...component.lifecycle,\n destroy: () => {\n // Cancel any animations\n cancelAnimationFrame(animationFrame);\n\n // Remove pointer event listeners\n component.slidesContainer.removeEventListener(\n \"pointerdown\",\n handlePointerDown\n );\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n\n // Remove wheel and scroll event listeners\n component.slidesContainer.removeEventListener(\"wheel\", handleWheel);\n component.slidesContainer.removeEventListener(\"scroll\", handleScroll);\n\n // Remove keyboard event listener\n component.element.removeEventListener(\"keydown\", handleKeyDown);\n\n // Call original destroy if it exists\n if (component.lifecycle && component.lifecycle.destroy) {\n component.lifecycle.destroy();\n }\n },\n },\n };\n};\n",
|
|
94
|
-
"// src/components/carousel/
|
|
95
|
-
"// src/components/carousel/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { CarouselConfig } from \"./types\";\nimport { CAROUSEL_DEFAULTS, CAROUSEL_TRANSITIONS } from \"./constants\";\n\n/**\n * Default configuration for the Carousel component\n */\nexport const defaultConfig: CarouselConfig = {\n initialSlide: CAROUSEL_DEFAULTS.INITIAL_SLIDE,\n loop: CAROUSEL_DEFAULTS.LOOP,\n transition: CAROUSEL_TRANSITIONS.SLIDE as \"slide\" | \"fade\" | \"none\",\n transitionDuration: CAROUSEL_DEFAULTS.TRANSITION_DURATION,\n borderRadius: CAROUSEL_DEFAULTS.BORDER_RADIUS,\n gap: CAROUSEL_DEFAULTS.GAP,\n prefix: \"carousel\",\n showAllLink: true, // Show \"Show all\" button by default\n};\n\n/**\n * Creates the base configuration for Carousel component\n * @param {CarouselConfig} config - User provided configuration\n * @returns {CarouselConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (config: CarouselConfig = {}): CarouselConfig =>\n createComponentConfig(defaultConfig, config, \"carousel\") as CarouselConfig;\n\n/**\n * Generates element configuration for the Carousel component\n * @param {CarouselConfig} config - Carousel configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: CarouselConfig) => {\n // Create the attributes object\n const attributes: Record<string, any> = {\n role: \"region\",\n \"aria-roledescription\": \"carousel\",\n \"aria-live\": \"polite\",\n };\n\n // Create data attributes for configuration\n const dataAttributes = {\n \"data-transition\": config.transition,\n \"data-loop\": config.loop ? \"true\" : \"false\",\n };\n\n return createElementConfig(config, {\n tag: \"div\",\n attributes: { ...attributes, ...dataAttributes },\n className: config.class,\n forwardEvents: {\n keydown: true,\n focus: true,\n blur: true,\n },\n });\n};\n\n/**\n * Creates API configuration for the Carousel component\n * @param {Object} comp - Component with slides and lifecycle features\n * @returns {Object} API configuration object\n */\nexport const getApiConfig = (comp) => ({\n // Empty navigation API for compatibility\n slides: {\n addSlide: comp.slides.addSlide,\n removeSlide: comp.slides.removeSlide,\n updateSlide: comp.slides.updateSlide,\n getCount: comp.slides.getCount,\n getElements: comp.slides.getElements,\n },\n lifecycle: {\n destroy: comp.lifecycle.destroy,\n },\n});\n\nexport default defaultConfig;\n",
|
|
95
|
+
"// src/components/carousel/carousel.ts\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport { withEvents, withLifecycle } from \"../../core/compose/features\";\nimport { withSlides, withScroll } from \"./features\";\nimport { withAPI } from \"./api\";\nimport { CarouselConfig, CarouselComponent } from \"./types\";\nimport { createBaseConfig, getElementConfig } from \"./config\";\n\n/**\n * Creates a Material 3 carousel.\n *\n * Items are laid out by a keyline strategy per layout (multi-browse,\n * uncontained, hero, centred hero, full-screen) and scrolled natively;\n * they change size as they move through the layout and snap into place.\n *\n * @example\n * ```ts\n * const carousel = createCarousel({\n * variant: 'hero',\n * itemWidth: 360,\n * slides: [\n * { image: 'a.jpg', title: 'Alpha' },\n * { image: 'b.jpg', title: 'Beta' },\n * ],\n * });\n * carousel.on('change', ({ index }) => console.log(index));\n * ```\n *\n * @category Components\n */\nexport const createCarousel = (config: CarouselConfig = {}): CarouselComponent => {\n const baseConfig = createBaseConfig(config);\n return pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withSlides(baseConfig),\n withLifecycle(),\n withScroll(baseConfig),\n withAPI(),\n )(baseConfig);\n};\n\nexport default createCarousel;\n",
|
|
96
|
+
"// src/components/carousel/features/slides.ts\n//\n// Builds and maintains the carousel items. Each item is a focusable group\n// labelled \"n of total\" (m3.material.io carousel accessibility); sizes and\n// positions are set by the scroll feature.\n\nimport { CarouselConfig, CarouselSlide, SlidesAPI } from \"../types\";\n\nexport interface SlidesComponent {\n element: HTMLElement;\n getClass: (name: string) => string;\n /** Scroll container holding the track */\n scroller: HTMLElement;\n /** Positioned parent of the items */\n track: HTMLElement;\n slides: SlidesAPI;\n slideElements: HTMLElement[];\n /** Registers the callback run when items are added or removed (the scroll feature rebuilds) */\n onSlidesChanged: (handler: () => void) => void;\n [key: string]: unknown;\n}\n\nexport const withSlides = (config: CarouselConfig) => <C extends { element: HTMLElement; getClass: (name: string) => string }>(component: C): C & SlidesComponent => {\n const prefix = component.getClass(\"carousel\");\n\n const scroller = document.createElement(\"div\");\n scroller.className = `${prefix}__scroller`;\n const track = document.createElement(\"div\");\n track.className = `${prefix}__track`;\n scroller.appendChild(track);\n component.element.appendChild(scroller);\n\n const slideData: CarouselSlide[] = [];\n const slideElements: HTMLElement[] = [];\n const enhanced = component as C & SlidesComponent;\n let slidesChanged: (() => void) | undefined;\n\n const relabel = (): void => {\n const total = slideElements.length;\n slideElements.forEach((el, i) => {\n el.dataset.index = String(i);\n el.setAttribute(\"aria-label\", `${i + 1} of ${total}`);\n });\n };\n\n const fill = (el: HTMLElement, slide: CarouselSlide): void => {\n el.replaceChildren();\n if (slide.content !== undefined) {\n if (typeof slide.content === \"string\") el.innerHTML = slide.content;\n else el.appendChild(slide.content);\n return;\n }\n if (slide.image) {\n const img = document.createElement(\"img\");\n img.className = `${prefix}__image`;\n img.src = slide.image;\n img.alt = slide.alt ?? slide.title ?? \"\";\n img.draggable = false;\n el.appendChild(img);\n }\n if (slide.title || slide.description || slide.buttonText) {\n const content = document.createElement(\"div\");\n content.className = `${prefix}__content`;\n if (slide.title) {\n const title = document.createElement(\"div\");\n title.className = `${prefix}__title`;\n title.textContent = slide.title;\n content.appendChild(title);\n }\n if (slide.description) {\n const description = document.createElement(\"div\");\n description.className = `${prefix}__description`;\n description.textContent = slide.description;\n content.appendChild(description);\n }\n if (slide.buttonText) {\n const button = document.createElement(\"a\");\n button.className = `${prefix}__button`;\n button.textContent = slide.buttonText;\n if (slide.buttonUrl) button.href = slide.buttonUrl;\n content.appendChild(button);\n }\n el.appendChild(content);\n }\n };\n\n const createSlideElement = (slide: CarouselSlide): HTMLElement => {\n const el = document.createElement(\"div\");\n el.className = `${prefix}__item`;\n el.setAttribute(\"role\", \"group\");\n el.setAttribute(\"aria-roledescription\", \"slide\");\n el.tabIndex = 0;\n fill(el, slide);\n return el;\n };\n\n const changed = (): void => {\n relabel();\n slidesChanged?.();\n };\n\n const slides: SlidesAPI = {\n addSlide(slide, index) {\n const at = index !== undefined && index >= 0 && index <= slideData.length ? index : slideData.length;\n const el = createSlideElement(slide);\n slideData.splice(at, 0, slide);\n if (at < slideElements.length) {\n track.insertBefore(el, slideElements[at]!);\n slideElements.splice(at, 0, el);\n } else {\n track.appendChild(el);\n slideElements.push(el);\n }\n changed();\n return slides;\n },\n removeSlide(index) {\n if (index < 0 || index >= slideElements.length) return slides;\n track.removeChild(slideElements[index]!);\n slideElements.splice(index, 1);\n slideData.splice(index, 1);\n changed();\n return slides;\n },\n updateSlide(index, slide) {\n if (index < 0 || index >= slideElements.length) return slides;\n slideData[index] = slide;\n fill(slideElements[index]!, slide);\n return slides;\n },\n getSlide: (index) => slideData[index] ?? null,\n getCount: () => slideData.length,\n getElements: () => slideElements.slice(),\n };\n\n enhanced.scroller = scroller;\n enhanced.track = track;\n enhanced.slides = slides;\n enhanced.slideElements = slideElements;\n enhanced.onSlidesChanged = (handler) => {\n slidesChanged = handler;\n };\n\n (config.slides ?? []).forEach((slide) => {\n const el = createSlideElement(slide);\n slideData.push(slide);\n slideElements.push(el);\n track.appendChild(el);\n });\n relabel();\n\n return enhanced;\n};\n",
|
|
97
|
+
"// src/components/carousel/constants.ts\n\n/**\n * Material 3 carousel layouts (m3.material.io carousel specs)\n */\nexport const CAROUSEL_VARIANTS = {\n /** At least one large, one medium and one small item; the default */\n MULTI_BROWSE: \"multi-browse\",\n /** Items keep one size and run off the trailing edge */\n UNCONTAINED: \"uncontained\",\n /** One large item and a small preview of the next */\n HERO: \"hero\",\n /** One large item centred between two small ones */\n HERO_CENTER: \"hero-center\",\n /** One edge-to-edge item at a time, scrolling vertically */\n FULL_SCREEN: \"full-screen\",\n} as const;\n\nexport const CAROUSEL_EVENTS = {\n /** The snapped item changed; detail carries the index */\n CHANGE: \"change\",\n} as const;\n\n/**\n * Defaults from the Compose Material 3 carousel (CarouselDefaults) and the\n * carousel specs: 8dp between items, 16dp container padding, 28dp corners,\n * small items between 40 and 56dp, 10dp anchors just outside the container.\n */\nexport const CAROUSEL_DEFAULTS = {\n VARIANT: CAROUSEL_VARIANTS.MULTI_BROWSE,\n /** Preferred width of a large item; hero layouts use it as a maximum */\n ITEM_WIDTH: 280,\n GAP: 8,\n /** Full-screen layouts space items 16dp apart */\n GAP_FULL_SCREEN: 16,\n PADDING: 16,\n CORNER_RADIUS: 28,\n MIN_SMALL_ITEM_WIDTH: 40,\n MAX_SMALL_ITEM_WIDTH: 56,\n ANCHOR_SIZE: 10,\n MEDIUM_LARGE_THRESHOLD: 0.85,\n INITIAL_SLIDE: 0,\n} as const;\n",
|
|
98
|
+
"// src/components/carousel/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { CarouselConfig, CarouselVariant } from \"./types\";\nimport { CAROUSEL_DEFAULTS, CAROUSEL_VARIANTS } from \"./constants\";\n\nexport const defaultConfig: CarouselConfig = {\n variant: CAROUSEL_DEFAULTS.VARIANT,\n cornerRadius: CAROUSEL_DEFAULTS.CORNER_RADIUS,\n initialSlide: CAROUSEL_DEFAULTS.INITIAL_SLIDE,\n minSmallItemWidth: CAROUSEL_DEFAULTS.MIN_SMALL_ITEM_WIDTH,\n maxSmallItemWidth: CAROUSEL_DEFAULTS.MAX_SMALL_ITEM_WIDTH,\n};\n\n/** Layout-dependent defaults: full-screen has no padding and 16dp between items; uncontained scrolls freely */\nexport const resolveLayoutDefaults = (config: CarouselConfig): Required<Pick<CarouselConfig, \"variant\" | \"gap\" | \"padding\" | \"snap\">> => {\n const variant = (config.variant || CAROUSEL_DEFAULTS.VARIANT) as CarouselVariant;\n const fullScreen = variant === CAROUSEL_VARIANTS.FULL_SCREEN;\n return {\n variant,\n gap: config.gap ?? (fullScreen ? CAROUSEL_DEFAULTS.GAP_FULL_SCREEN : CAROUSEL_DEFAULTS.GAP),\n padding: config.padding ?? (fullScreen ? 0 : CAROUSEL_DEFAULTS.PADDING),\n snap: config.snap ?? variant !== CAROUSEL_VARIANTS.UNCONTAINED,\n };\n};\n\nexport const createBaseConfig = (config: CarouselConfig = {}): CarouselConfig =>\n createComponentConfig(defaultConfig, config, \"carousel\") as CarouselConfig;\n\nexport const getElementConfig = (config: CarouselConfig) => {\n const { variant } = resolveLayoutDefaults(config);\n return createElementConfig(config, {\n tag: \"div\",\n attributes: {\n role: \"region\",\n \"aria-roledescription\": \"carousel\",\n \"aria-label\": config.ariaLabel || \"Carousel\",\n },\n className: [\n config.class,\n `${config.prefix}-carousel--${variant}`,\n variant === CAROUSEL_VARIANTS.FULL_SCREEN ? `${config.prefix}-carousel--vertical` : null,\n ],\n forwardEvents: {\n focus: true,\n blur: true,\n },\n });\n};\n",
|
|
99
|
+
"// src/components/carousel/arrangement.ts\n//\n// How many large, medium and small items fit in a carousel and how wide\n// each is. Ported from the Compose Material 3 carousel (Arrangement.kt):\n// every combination of counts is fitted to the available space and the one\n// whose large size lands closest to the target wins; ties go to the\n// combination tried first.\n\nexport interface Arrangement {\n priority: number;\n smallSize: number;\n smallCount: number;\n mediumSize: number;\n mediumCount: number;\n largeSize: number;\n largeCount: number;\n}\n\n/** A medium item may grow or shrink by this share of its size to help the large items reach their target */\nconst MEDIUM_ITEM_FLEX = 0.1;\n\nexport const itemCount = (a: Arrangement): number =>\n a.largeCount + a.mediumCount + a.smallCount;\n\nconst isValid = (a: Arrangement): boolean => {\n if (a.largeCount > 0 && a.smallCount > 0 && a.mediumCount > 0) {\n return a.largeSize > a.mediumSize && a.mediumSize > a.smallSize;\n }\n if (a.largeCount > 0 && a.smallCount > 0) {\n return a.largeSize > a.smallSize;\n }\n return true;\n};\n\nconst cost = (a: Arrangement, targetLargeSize: number): number =>\n isValid(a) ? Math.abs(targetLargeSize - a.largeSize) * a.priority : Number.MAX_VALUE;\n\nconst largeSizeFor = (\n space: number,\n smallCount: number,\n smallSize: number,\n mediumCount: number,\n largeCount: number,\n): number =>\n (space - (smallCount + mediumCount / 2) * smallSize) / (largeCount + mediumCount / 2);\n\nconst fit = (\n priority: number,\n availableSpace: number,\n gap: number,\n smallCount: number,\n smallSize: number,\n minSmallSize: number,\n maxSmallSize: number,\n mediumCount: number,\n mediumSize: number,\n largeCount: number,\n largeSize: number,\n): Arrangement => {\n const total = largeCount + mediumCount + smallCount;\n const space = availableSpace - (total - 1) * gap;\n\n let small = Math.min(Math.max(smallSize, minSmallSize), maxSmallSize);\n const taken = largeSize * largeCount + mediumSize * mediumCount + small * smallCount;\n const delta = space - taken;\n if (smallCount > 0 && delta > 0) {\n small += Math.min(delta / smallCount, maxSmallSize - small);\n } else if (smallCount > 0 && delta < 0) {\n small += Math.max(delta / smallCount, minSmallSize - small);\n }\n small = smallCount > 0 ? small : 0;\n\n let large = largeSizeFor(space, smallCount, small, mediumCount, largeCount);\n let medium = (large + small) / 2;\n\n // Give the medium items' flex to the large items so they get closer to their target\n if (mediumCount > 0 && large !== largeSize) {\n const targetAdjustment = (largeSize - large) * largeCount;\n const flex = medium * MEDIUM_ITEM_FLEX * mediumCount;\n const distribute = Math.min(Math.abs(targetAdjustment), flex);\n if (targetAdjustment > 0) {\n medium -= distribute / mediumCount;\n large += distribute / largeCount;\n } else {\n medium += distribute / mediumCount;\n large -= distribute / largeCount;\n }\n }\n\n return { priority, smallSize: small, smallCount, mediumSize: medium, mediumCount, largeSize: large, largeCount };\n};\n\nexport interface ArrangementOptions {\n availableSpace: number;\n gap: number;\n targetSmallSize: number;\n minSmallSize: number;\n maxSmallSize: number;\n smallCounts: number[];\n targetMediumSize: number;\n mediumCounts: number[];\n targetLargeSize: number;\n largeCounts: number[];\n}\n\nexport const findLowestCostArrangement = (o: ArrangementOptions): Arrangement | null => {\n let lowest: Arrangement | null = null;\n let priority = 1;\n for (const largeCount of o.largeCounts) {\n for (const mediumCount of o.mediumCounts) {\n for (const smallCount of o.smallCounts) {\n const candidate = fit(\n priority,\n o.availableSpace,\n o.gap,\n smallCount,\n o.targetSmallSize,\n o.minSmallSize,\n o.maxSmallSize,\n mediumCount,\n o.targetMediumSize,\n largeCount,\n o.targetLargeSize,\n );\n if (lowest === null || cost(candidate, o.targetLargeSize) < cost(lowest, o.targetLargeSize)) {\n lowest = candidate;\n if (cost(lowest, o.targetLargeSize) === 0) return lowest;\n }\n priority++;\n }\n }\n }\n return lowest;\n};\n",
|
|
100
|
+
"// src/components/carousel/keylines.ts\n//\n// Keylines describe where items sit along the carousel and how large they\n// are at rest: anchors just outside both edges, then the large, medium and\n// small slots. Items interpolate between neighbouring keylines as they\n// scroll. Ported from the Compose Material 3 carousel (KeylineList.kt and\n// Keylines.kt); the size rules come from CarouselDefaults.\n\nimport { findLowestCostArrangement, itemCount, Arrangement } from './arrangement';\n\nexport interface Keyline {\n size: number;\n /** Centre of the item along the axis, in container coordinates */\n offset: number;\n /** Centre the item would have if every item were large */\n unadjustedOffset: number;\n isFocal: boolean;\n isAnchor: boolean;\n isPivot: boolean;\n /** How much of the item hangs outside the container */\n cutoff: number;\n}\n\nexport type KeylineList = Keyline[];\n\ninterface TmpKeyline {\n size: number;\n isAnchor: boolean;\n}\n\nexport interface KeylineRules {\n minSmallSize: number;\n maxSmallSize: number;\n anchorSize: number;\n /** A medium item wider than this share of a large one is cut differently in uncontained layouts */\n mediumLargeThreshold: number;\n}\n\n// ── List queries ────────────────────────────────────────────────\n\nexport const firstFocalIndex = (list: KeylineList): number => list.findIndex((k) => k.isFocal);\nexport const lastFocalIndex = (list: KeylineList): number => {\n for (let i = list.length - 1; i >= 0; i--) if (list[i]!.isFocal) return i;\n return -1;\n};\nexport const firstNonAnchorIndex = (list: KeylineList): number => list.findIndex((k) => !k.isAnchor);\nexport const lastNonAnchorIndex = (list: KeylineList): number => {\n for (let i = list.length - 1; i >= 0; i--) if (!list[i]!.isAnchor) return i;\n return -1;\n};\nexport const pivotIndex = (list: KeylineList): number => list.findIndex((k) => k.isPivot);\nexport const focalCount = (list: KeylineList): number => lastFocalIndex(list) - firstFocalIndex(list) + 1;\nexport const minSize = (list: KeylineList): number => list.reduce((m, k) => Math.min(m, k.size), Number.MAX_VALUE);\nexport const maxSize = (list: KeylineList): number => list.reduce((m, k) => Math.max(m, k.size), 0);\n\nexport const isFirstFocalItemAtStartOfContainer = (list: KeylineList): boolean => {\n const first = list[firstFocalIndex(list)]!;\n return first.offset - first.size / 2 >= 0 && firstFocalIndex(list) === firstNonAnchorIndex(list);\n};\n\nexport const isLastFocalItemAtEndOfContainer = (list: KeylineList, containerSize: number): boolean => {\n const last = list[lastFocalIndex(list)]!;\n return last.offset + last.size / 2 <= containerSize && lastFocalIndex(list) === lastNonAnchorIndex(list);\n};\n\nexport const firstIndexAfterFocalRangeWithSize = (list: KeylineList, size: number): number => {\n for (let i = lastFocalIndex(list); i < list.length; i++) if (list[i]!.size === size) return i;\n return list.length - 1;\n};\n\nexport const lastIndexBeforeFocalRangeWithSize = (list: KeylineList, size: number): number => {\n for (let i = firstFocalIndex(list) - 1; i >= 0; i--) if (list[i]!.size === size) return i;\n return 0;\n};\n\nexport const keylineBefore = (list: KeylineList, unadjustedOffset: number): Keyline => {\n for (let i = list.length - 1; i >= 0; i--) {\n if (list[i]!.unadjustedOffset < unadjustedOffset) return list[i]!;\n }\n return list[0]!;\n};\n\nexport const keylineAfter = (list: KeylineList, unadjustedOffset: number): Keyline =>\n list.find((k) => k.unadjustedOffset >= unadjustedOffset) ?? list[list.length - 1]!;\n\nconst mix = (a: number, b: number, t: number): number => a + (b - a) * t;\n\nexport const lerpKeyline = (a: Keyline, b: Keyline, t: number): Keyline => ({\n size: mix(a.size, b.size, t),\n offset: mix(a.offset, b.offset, t),\n unadjustedOffset: mix(a.unadjustedOffset, b.unadjustedOffset, t),\n isFocal: t < 0.5 ? a.isFocal : b.isFocal,\n isAnchor: t < 0.5 ? a.isAnchor : b.isAnchor,\n isPivot: t < 0.5 ? a.isPivot : b.isPivot,\n cutoff: mix(a.cutoff, b.cutoff, t),\n});\n\nexport const lerpKeylineList = (from: KeylineList, to: KeylineList, t: number): KeylineList =>\n from.map((k, i) => lerpKeyline(k, to[i]!, t));\n\n// ── List construction ───────────────────────────────────────────\n\nconst isCutoffLeft = (size: number, offset: number): boolean =>\n offset - size / 2 < 0 && offset + size / 2 > 0;\n\nconst isCutoffRight = (size: number, offset: number, containerSize: number): boolean =>\n offset - size / 2 < containerSize && offset + size / 2 > containerSize;\n\n/** The focal keylines are the run of largest non-anchor sizes */\nconst focalRange = (tmp: TmpKeyline[]): [number, number, number] => {\n let first = -1;\n let size = 0;\n tmp.forEach((k, i) => {\n if (!k.isAnchor && k.size > size) {\n first = i;\n size = k.size;\n }\n });\n if (first < 0) return [-1, -1, 0];\n let last = first;\n while (last < tmp.length - 1 && tmp[last + 1]!.size === size) last++;\n return [first, last, size];\n};\n\nconst buildAroundPivot = (\n tmp: TmpKeyline[],\n pivotIdx: number,\n pivotOffset: number,\n firstFocal: number,\n lastFocal: number,\n itemSize: number,\n containerSize: number,\n gap: number,\n): KeylineList => {\n if (tmp.length === 0 || pivotIdx < 0 || pivotIdx >= tmp.length) return [];\n const pivot = tmp[pivotIdx]!;\n const list: KeylineList = [];\n const pivotCutoff = isCutoffLeft(pivot.size, pivotOffset)\n ? pivotOffset - pivot.size / 2\n : isCutoffRight(pivot.size, pivotOffset, containerSize)\n ? pivotOffset + pivot.size / 2 - containerSize\n : 0;\n list.push({\n size: pivot.size,\n offset: pivotOffset,\n unadjustedOffset: pivotOffset,\n isFocal: pivotIdx >= firstFocal && pivotIdx <= lastFocal,\n isAnchor: pivot.isAnchor,\n isPivot: true,\n cutoff: pivotCutoff,\n });\n\n let offset = pivotOffset - itemSize / 2 - gap;\n let unadjusted = pivotOffset - itemSize / 2 - gap;\n for (let i = pivotIdx - 1; i >= 0; i--) {\n const k = tmp[i]!;\n const kOffset = offset - k.size / 2;\n const kUnadjusted = unadjusted - itemSize / 2;\n list.unshift({\n size: k.size,\n offset: kOffset,\n unadjustedOffset: kUnadjusted,\n isFocal: i >= firstFocal && i <= lastFocal,\n isAnchor: k.isAnchor,\n isPivot: false,\n cutoff: isCutoffLeft(k.size, kOffset) ? Math.abs(kOffset - k.size / 2) : 0,\n });\n offset -= k.size + gap;\n unadjusted -= itemSize + gap;\n }\n\n offset = pivotOffset + itemSize / 2 + gap;\n unadjusted = pivotOffset + itemSize / 2 + gap;\n for (let i = pivotIdx + 1; i < tmp.length; i++) {\n const k = tmp[i]!;\n const kOffset = offset + k.size / 2;\n const kUnadjusted = unadjusted + itemSize / 2;\n list.push({\n size: k.size,\n offset: kOffset,\n unadjustedOffset: kUnadjusted,\n isFocal: i >= firstFocal && i <= lastFocal,\n isAnchor: k.isAnchor,\n isPivot: false,\n cutoff: isCutoffRight(k.size, kOffset, containerSize) ? kOffset + k.size / 2 - containerSize : 0,\n });\n offset += k.size + gap;\n unadjusted += itemSize + gap;\n }\n return list;\n};\n\n/** Builds a keyline list with an explicit pivot (used for the shifted start and end steps) */\nexport const keylineListWithPivot = (\n containerSize: number,\n gap: number,\n pivotIdx: number,\n pivotOffset: number,\n tmp: TmpKeyline[],\n): KeylineList => {\n const [firstFocal, lastFocal, itemSize] = focalRange(tmp);\n return buildAroundPivot(tmp, pivotIdx, pivotOffset, firstFocal, lastFocal, itemSize, containerSize, gap);\n};\n\n/** Builds a keyline list aligned to the start or centre of the container */\nexport const keylineListAligned = (\n containerSize: number,\n gap: number,\n alignment: 'start' | 'center',\n tmp: TmpKeyline[],\n): KeylineList => {\n const [firstFocal, lastFocal, itemSize] = focalRange(tmp);\n if (firstFocal < 0) return [];\n const focalItems = lastFocal - firstFocal;\n let pivotOffset = itemSize / 2;\n if (alignment === 'center') {\n const split = gap === 0 || focalItems % 2 === 0 ? 0 : gap / 2;\n const spaces = Math.floor(focalItems / 2) * gap;\n pivotOffset = containerSize / 2 - (itemSize / 2) * focalItems - split - spaces;\n }\n return buildAroundPivot(tmp, firstFocal, pivotOffset, firstFocal, lastFocal, itemSize, containerSize, gap);\n};\n\nconst fromArrangement = (\n a: Arrangement,\n containerSize: number,\n gap: number,\n leftAnchor: number,\n rightAnchor: number,\n alignment: 'start' | 'center',\n): KeylineList => {\n const tmp: TmpKeyline[] = [{ size: leftAnchor, isAnchor: true }];\n const push = (size: number, count: number) => {\n for (let i = 0; i < count; i++) tmp.push({ size, isAnchor: false });\n };\n if (alignment === 'center') {\n push(a.smallSize, Math.floor(a.smallCount / 2));\n push(a.mediumSize, Math.floor(a.mediumCount / 2));\n push(a.largeSize, a.largeCount);\n push(a.mediumSize, Math.ceil(a.mediumCount / 2));\n push(a.smallSize, Math.ceil(a.smallCount / 2));\n } else {\n push(a.largeSize, a.largeCount);\n push(a.mediumSize, a.mediumCount);\n push(a.smallSize, a.smallCount);\n }\n tmp.push({ size: rightAnchor, isAnchor: true });\n return keylineListAligned(containerSize, gap, alignment, tmp);\n};\n\nconst range = (from: number, to: number): number[] => {\n const out: number[] = [];\n for (let n = from; n >= to; n--) out.push(n);\n return out;\n};\n\n// ── Layouts ─────────────────────────────────────────────────────\n\n/**\n * Multi-browse: at least one large, one medium and one small item; a small\n * item aims for a third of a large one within the 40–56dp range and the\n * medium item sits halfway. More large items appear as the container grows.\n */\nexport const multiBrowseKeylines = (\n containerSize: number,\n preferredItemSize: number,\n gap: number,\n count: number,\n rules: KeylineRules,\n): KeylineList => {\n if (containerSize <= 0 || preferredItemSize <= 0) return [];\n let smallCounts = [1];\n const mediumCounts = [1, 0];\n const targetLarge = Math.min(preferredItemSize, containerSize);\n const targetSmall = Math.min(Math.max(targetLarge / 3, rules.minSmallSize), rules.maxSmallSize);\n const targetMedium = (targetLarge + targetSmall) / 2;\n if (containerSize < rules.minSmallSize * 2) smallCounts = [0];\n\n const minLargeSpace = containerSize - targetMedium * Math.max(...mediumCounts) - rules.maxSmallSize * Math.max(...smallCounts);\n const minLargeCount = Math.max(1, Math.floor(minLargeSpace / targetLarge));\n const maxLargeCount = Math.ceil(containerSize / targetLarge);\n const largeCounts = range(maxLargeCount, minLargeCount);\n\n const options = {\n availableSpace: containerSize,\n gap,\n targetSmallSize: targetSmall,\n minSmallSize: rules.minSmallSize,\n maxSmallSize: rules.maxSmallSize,\n smallCounts,\n targetMediumSize: targetMedium,\n mediumCounts,\n targetLargeSize: targetLarge,\n largeCounts,\n };\n let arrangement = findLowestCostArrangement(options);\n\n // Fewer items than slots: drop small then medium slots, keeping one medium\n if (arrangement && itemCount(arrangement) > count) {\n let surplus = itemCount(arrangement) - count;\n let smallCount = arrangement.smallCount;\n let mediumCount = arrangement.mediumCount;\n while (surplus > 0) {\n if (smallCount > 0) smallCount -= 1;\n else if (mediumCount > 1) mediumCount -= 1;\n surplus -= 1;\n }\n arrangement = findLowestCostArrangement({ ...options, smallCounts: [smallCount], mediumCounts: [mediumCount] });\n }\n if (!arrangement) return [];\n return fromArrangement(arrangement, containerSize, gap, rules.anchorSize, rules.anchorSize, 'start');\n};\n\n/**\n * Hero: one large item (or more on wide containers) and one small item; the\n * centred variant places the large item between two small ones.\n */\nexport const heroKeylines = (\n containerSize: number,\n maxItemSize: number | null,\n gap: number,\n count: number,\n centered: boolean,\n rules: KeylineRules,\n): KeylineList => {\n if (containerSize <= 0) return [];\n const shouldCenter = centered && count >= 3;\n let smallCounts = count <= 1 ? [0] : shouldCenter ? [2] : [1];\n const targetLarge = Math.min(maxItemSize ?? containerSize, containerSize);\n const targetSmall = Math.min(Math.max(targetLarge / 3, rules.minSmallSize), rules.maxSmallSize);\n\n // Not enough room for the small items plus a large one at least 25% bigger: go full width\n const fullscreenThreshold = rules.minSmallSize * Math.max(...smallCounts) + rules.minSmallSize * 1.25;\n if (containerSize < fullscreenThreshold) smallCounts = [0];\n\n const minLargeSpace = containerSize - rules.minSmallSize * Math.max(...smallCounts);\n const minLargeCount = Math.max(1, Math.floor(minLargeSpace / targetLarge));\n const maxLargeCount = Math.ceil(containerSize / targetLarge);\n const arrangement = findLowestCostArrangement({\n availableSpace: containerSize,\n gap,\n targetSmallSize: targetSmall,\n minSmallSize: rules.minSmallSize,\n maxSmallSize: rules.maxSmallSize,\n smallCounts,\n targetMediumSize: 0,\n mediumCounts: [0],\n targetLargeSize: targetLarge,\n largeCounts: range(maxLargeCount, minLargeCount),\n });\n if (!arrangement) return [];\n const alignment = shouldCenter && count >= itemCount(arrangement) ? 'center' : 'start';\n return fromArrangement(arrangement, containerSize, gap, rules.anchorSize, rules.anchorSize, alignment);\n};\n\nconst mediumChildSize = (minimum: number, largeSize: number, remaining: number, threshold: number): number => {\n let medium = Math.max(remaining * 1.5, minimum);\n if (medium > largeSize * threshold) medium = Math.max(remaining * 1.2, minimum);\n return medium;\n};\n\n/**\n * Uncontained: every item keeps its width and the last visible one is cut\n * off at the trailing edge, about a third of it hidden. Compose folds the\n * spacing into the item size; here the gaps stay between the items so the\n * spec's 8dp holds and the cut-off item keeps two thirds visible.\n */\nexport const uncontainedKeylines = (\n containerSize: number,\n itemSize: number,\n gap: number,\n rules: KeylineRules,\n): KeylineList => {\n if (containerSize <= 0 || itemSize <= 0) return [];\n const large = Math.min(itemSize, containerSize);\n const largeCount = Math.max(1, Math.floor((containerSize + gap) / (large + gap)));\n const remaining = Math.max(0, containerSize - largeCount * (large + gap));\n const mediumCount = remaining > 0 ? 1 : 0;\n const medium = mediumChildSize(rules.anchorSize, large, remaining, rules.mediumLargeThreshold);\n const arrangement: Arrangement = {\n priority: 0,\n smallSize: 0,\n smallCount: 0,\n mediumSize: medium,\n mediumCount,\n largeSize: large,\n largeCount,\n };\n const xSmall = Math.min(rules.anchorSize, itemSize);\n const leftAnchor = Math.max(xSmall, medium * 0.5);\n return fromArrangement(arrangement, containerSize, gap, leftAnchor, rules.anchorSize, 'start');\n};\n\n/** Full-screen: one item fills the container edge to edge */\nexport const fullScreenKeylines = (containerSize: number, gap: number, rules: KeylineRules): KeylineList => {\n if (containerSize <= 0) return [];\n const arrangement: Arrangement = {\n priority: 0,\n smallSize: 0,\n smallCount: 0,\n mediumSize: 0,\n mediumCount: 0,\n largeSize: containerSize,\n largeCount: 1,\n };\n return fromArrangement(arrangement, containerSize, gap, rules.anchorSize, rules.anchorSize, 'start');\n};\n",
|
|
101
|
+
"// src/components/carousel/strategy.ts\n//\n// A strategy is the default keyline list plus the shifted lists used near\n// the start and the end of the scroll range, so the first item is large at\n// the leading edge and the last item large at the trailing edge. It also\n// answers where an item snaps and how a given item is placed for a scroll\n// offset. Ported from the Compose Material 3 carousel (Strategy.kt,\n// KeylineSnapPosition.kt and the item placement in Carousel.kt).\n\nimport {\n Keyline,\n KeylineList,\n firstFocalIndex,\n lastFocalIndex,\n firstNonAnchorIndex,\n lastNonAnchorIndex,\n pivotIndex,\n focalCount,\n minSize,\n maxSize,\n isFirstFocalItemAtStartOfContainer,\n isLastFocalItemAtEndOfContainer,\n firstIndexAfterFocalRangeWithSize,\n lastIndexBeforeFocalRangeWithSize,\n keylineBefore,\n keylineAfter,\n lerpKeyline,\n lerpKeylineList,\n keylineListWithPivot,\n} from './keylines';\n\nexport interface Strategy {\n defaultKeylines: KeylineList;\n startSteps: KeylineList[];\n endSteps: KeylineList[];\n availableSpace: number;\n gap: number;\n beforePadding: number;\n afterPadding: number;\n /** Size of a large item: the unit every item is measured in before adjustment */\n itemSize: number;\n minItemSize: number;\n maxItemSize: number;\n valid: boolean;\n startShiftDistance: number;\n endShiftDistance: number;\n startShiftPoints: number[];\n endShiftPoints: number[];\n}\n\nexport interface ItemPlacement {\n /** Visible size of the item along the axis */\n size: number;\n /** Centre of the visible part, in container coordinates */\n center: number;\n /** Interpolated keyline the item sits on */\n keyline: Keyline;\n}\n\nconst clampLerp = (outMin: number, outMax: number, inMin: number, inMax: number, value: number): number => {\n if (value <= inMin) return outMin;\n if (value >= inMax) return outMax;\n return outMin + (outMax - outMin) * ((value - inMin) / (inMax - inMin));\n};\n\nconst shiftedForContentPadding = (\n from: KeylineList,\n containerSize: number,\n gap: number,\n contentPadding: number,\n pivot: Keyline,\n pivotIdx: number,\n): KeylineList => {\n const nonAnchors = from.filter((k) => !k.isAnchor).length;\n const reduction = contentPadding / nonAnchors;\n const shifted = keylineListWithPivot(\n containerSize,\n gap,\n pivotIdx,\n pivot.offset - reduction / 2 + contentPadding,\n from.map((k) => ({ size: k.size - Math.abs(reduction), isAnchor: k.isAnchor })),\n );\n return shifted.map((k, i) => ({ ...k, unadjustedOffset: from[i]!.unadjustedOffset }));\n};\n\nconst moveKeyline = (from: KeylineList, srcIndex: number, dstIndex: number, containerSize: number, gap: number): KeylineList => {\n const dir = srcIndex > dstIndex ? 1 : -1;\n const src = from[srcIndex]!;\n const delta = (src.size - src.cutoff + gap) * dir;\n const pivot = from[pivotIndex(from)]!;\n const moved = from.slice();\n moved.splice(srcIndex, 1);\n moved.splice(dstIndex, 0, src);\n return keylineListWithPivot(\n containerSize,\n gap,\n pivotIndex(from) + dir,\n pivot.offset + delta,\n moved.map((k) => ({ size: k.size, isAnchor: k.isAnchor })),\n );\n};\n\nconst startSteps = (defaults: KeylineList, containerSize: number, gap: number, beforePadding: number): KeylineList[] => {\n if (defaults.length === 0) return [];\n const steps: KeylineList[] = [defaults];\n if (isFirstFocalItemAtStartOfContainer(defaults)) {\n if (beforePadding !== 0) {\n steps.push(shiftedForContentPadding(defaults, containerSize, gap, beforePadding, defaults[firstFocalIndex(defaults)]!, firstFocalIndex(defaults)));\n }\n return steps;\n }\n const startIndex = firstNonAnchorIndex(defaults);\n const endIndex = firstFocalIndex(defaults);\n const numberOfSteps = endIndex - startIndex;\n if (numberOfSteps <= 0 && defaults[firstFocalIndex(defaults)]!.cutoff > 0) {\n steps.push(moveKeyline(defaults, 0, 0, containerSize, gap));\n return steps;\n }\n for (let i = 0; i < numberOfSteps; i++) {\n const prev = steps[steps.length - 1]!;\n const originalIndex = startIndex + i;\n let dstIndex = defaults.length - 1;\n if (originalIndex > 0) {\n const neighbourSize = defaults[originalIndex - 1]!.size;\n dstIndex = firstIndexAfterFocalRangeWithSize(prev, neighbourSize) - 1;\n }\n steps.push(moveKeyline(prev, firstNonAnchorIndex(defaults), dstIndex, containerSize, gap));\n }\n if (beforePadding !== 0) {\n const last = steps[steps.length - 1]!;\n steps[steps.length - 1] = shiftedForContentPadding(last, containerSize, gap, beforePadding, last[firstFocalIndex(last)]!, firstFocalIndex(last));\n }\n return steps;\n};\n\nconst endSteps = (defaults: KeylineList, containerSize: number, gap: number, afterPadding: number): KeylineList[] => {\n if (defaults.length === 0) return [];\n const steps: KeylineList[] = [defaults];\n if (isLastFocalItemAtEndOfContainer(defaults, containerSize)) {\n if (afterPadding !== 0) {\n steps.push(shiftedForContentPadding(defaults, containerSize, gap, -afterPadding, defaults[lastFocalIndex(defaults)]!, lastFocalIndex(defaults)));\n }\n return steps;\n }\n const startIndex = lastFocalIndex(defaults);\n const endIndex = lastNonAnchorIndex(defaults);\n const numberOfSteps = endIndex - startIndex;\n if (numberOfSteps <= 0 && defaults[lastFocalIndex(defaults)]!.cutoff > 0) {\n steps.push(moveKeyline(defaults, 0, 0, containerSize, gap));\n return steps;\n }\n for (let i = 0; i < numberOfSteps; i++) {\n const prev = steps[steps.length - 1]!;\n const originalIndex = endIndex - i;\n let dstIndex = 0;\n if (originalIndex < defaults.length - 1) {\n const neighbourSize = defaults[originalIndex + 1]!.size;\n dstIndex = lastIndexBeforeFocalRangeWithSize(prev, neighbourSize) + 1;\n }\n steps.push(moveKeyline(prev, lastNonAnchorIndex(defaults), dstIndex, containerSize, gap));\n }\n if (afterPadding !== 0) {\n const last = steps[steps.length - 1]!;\n steps[steps.length - 1] = shiftedForContentPadding(last, containerSize, gap, -afterPadding, last[lastFocalIndex(last)]!, lastFocalIndex(last));\n }\n return steps;\n};\n\nconst stepInterpolationPoints = (totalShift: number, steps: KeylineList[], shiftingLeft: boolean): number[] => {\n const points = [0];\n if (totalShift === 0 || steps.length === 0) return points;\n for (let i = 1; i < steps.length; i++) {\n const prev = steps[i - 1]!;\n const curr = steps[i]!;\n const shifted = shiftingLeft\n ? curr[0]!.unadjustedOffset - prev[0]!.unadjustedOffset\n : prev[prev.length - 1]!.unadjustedOffset - curr[curr.length - 1]!.unadjustedOffset;\n const point = i === steps.length - 1 ? 1 : points[i - 1]! + shifted / totalShift;\n points.push(point);\n }\n return points;\n};\n\nexport const createStrategy = (\n defaultKeylines: KeylineList,\n availableSpace: number,\n gap: number,\n beforePadding: number,\n afterPadding: number,\n): Strategy => {\n const starts = startSteps(defaultKeylines, availableSpace, gap, beforePadding);\n const ends = endSteps(defaultKeylines, availableSpace, gap, afterPadding);\n const itemSize = defaultKeylines.length ? defaultKeylines[firstFocalIndex(defaultKeylines)]!.size : 0;\n const startShiftDistance = starts.length\n ? Math.max(starts[starts.length - 1]![0]!.unadjustedOffset - starts[0]![0]!.unadjustedOffset, beforePadding)\n : 0;\n const endShiftDistance = ends.length\n ? Math.max(ends[0]![ends[0]!.length - 1]!.unadjustedOffset - ends[ends.length - 1]![ends[ends.length - 1]!.length - 1]!.unadjustedOffset, afterPadding)\n : 0;\n let min = defaultKeylines.length ? minSize(defaultKeylines) : 0;\n let max = defaultKeylines.length ? maxSize(defaultKeylines) : 0;\n for (const step of [...starts, ...ends]) {\n min = Math.min(min, minSize(step));\n max = Math.max(max, maxSize(step));\n }\n return {\n defaultKeylines,\n startSteps: starts,\n endSteps: ends,\n availableSpace,\n gap,\n beforePadding,\n afterPadding,\n itemSize,\n minItemSize: min,\n maxItemSize: max,\n valid: defaultKeylines.length > 0 && availableSpace !== 0 && itemSize !== 0,\n startShiftDistance,\n endShiftDistance,\n startShiftPoints: stepInterpolationPoints(startShiftDistance, starts, true),\n endShiftPoints: stepInterpolationPoints(endShiftDistance, ends, false),\n };\n};\n\n/** Keylines in effect for a scroll offset: default, or interpolated within the start or end shift range */\nexport const keylinesForScrollOffset = (s: Strategy, scrollOffset: number, maxScrollOffset: number, roundToNearestStep = false): KeylineList => {\n const positive = Math.max(0, scrollOffset);\n const startShiftOffset = s.startShiftDistance;\n const endShiftOffset = Math.max(0, maxScrollOffset - s.endShiftDistance);\n if (positive >= startShiftOffset && positive <= endShiftOffset) return s.defaultKeylines;\n\n let interpolation = clampLerp(1, 0, 0, startShiftOffset, positive);\n let points = s.startShiftPoints;\n let steps = s.startSteps;\n if (positive > endShiftOffset) {\n interpolation = clampLerp(0, 1, endShiftOffset, maxScrollOffset, positive);\n points = s.endShiftPoints;\n steps = s.endSteps;\n if (endShiftOffset < 0.01 && s.startSteps.length === 2 && s.endSteps.length === 2) {\n steps = [s.startSteps[1]!, s.endSteps[1]!];\n }\n }\n\n let fromStep = 0;\n let toStep = 0;\n let stepped = 0;\n let lower = points[0]!;\n for (let i = 1; i < steps.length; i++) {\n const upper = points[i]!;\n if (interpolation <= upper) {\n fromStep = i - 1;\n toStep = i;\n stepped = clampLerp(0, 1, lower, upper, interpolation);\n break;\n }\n lower = upper;\n }\n if (roundToNearestStep) return steps[Math.round(stepped) === 0 ? fromStep : toStep]!;\n return lerpKeylineList(steps[fromStep]!, steps[toStep]!, stepped);\n};\n\n/** Distance from the container start to an item's start when that item is snapped */\nexport const snapPositionOffset = (s: Strategy, index: number, count: number): number => {\n if (!s.valid) return 0;\n const focalStart = (list: KeylineList) => list[firstFocalIndex(list)]!.unadjustedOffset - s.itemSize / 2;\n const focalEnd = (list: KeylineList) => list[lastFocalIndex(list)]!.unadjustedOffset - s.itemSize / 2;\n let offset = Math.round(focalStart(s.defaultKeylines));\n const lastStart = s.startSteps.length - 1;\n if (index <= lastStart) {\n const step = Math.min(Math.max(lastStart - index, 0), lastStart);\n offset = Math.round(focalStart(s.startSteps[step]!));\n }\n const lastEnd = s.endSteps.length - 1;\n const lastItem = count - 1;\n if (index >= lastItem - lastEnd && count > focalCount(s.defaultKeylines)) {\n const step = Math.min(Math.max(lastEnd - (lastItem - index), 0), lastEnd);\n offset = Math.round(focalEnd(s.endSteps[step]!));\n }\n return offset;\n};\n\n/** Largest scroll offset: the content laid out at large size minus the container */\nexport const maxScrollOffset = (s: Strategy, count: number): number =>\n Math.max(0, s.itemSize * count + s.gap * (count - 1) - s.availableSpace);\n\n/** Where an item sits and how much of it shows for the keylines in effect */\nexport const placeItem = (s: Strategy, keylines: KeylineList, index: number, scrollOffset: number): ItemPlacement => {\n const unit = s.itemSize + s.gap;\n const unadjustedCenter = index * unit + s.itemSize / 2 - scrollOffset;\n const before = keylineBefore(keylines, unadjustedCenter);\n const after = keylineAfter(keylines, unadjustedCenter);\n const progress = before === after ? 1 : (unadjustedCenter - before.unadjustedOffset) / (after.unadjustedOffset - before.unadjustedOffset);\n const keyline = lerpKeyline(before, after, progress);\n let center = keyline.offset;\n if (before === after) {\n // Past the outermost keylines: keep drifting with the scroll\n center += (unadjustedCenter - keyline.unadjustedOffset) / keyline.size;\n }\n return { size: keyline.size, center, keyline };\n};\n",
|
|
102
|
+
"// src/components/carousel/features/scroll.ts\n//\n// Native scrolling for the carousel. The scroller is a real overflow\n// container (touch, trackpad, wheel and assistive technologies work as\n// they do anywhere), a track sized to the scroll range holds one snap\n// point per item, and on every scroll event the items are placed from the\n// keyline strategy: translated to their centre and clipped to their\n// visible size, as the Compose carousel masks its items.\n\nimport { CarouselConfig, CarouselVariant } from \"../types\";\nimport { CAROUSEL_DEFAULTS, CAROUSEL_EVENTS, CAROUSEL_VARIANTS } from \"../constants\";\nimport { resolveLayoutDefaults } from \"../config\";\nimport {\n KeylineRules,\n multiBrowseKeylines,\n heroKeylines,\n uncontainedKeylines,\n fullScreenKeylines,\n} from \"../keylines\";\nimport {\n Strategy,\n createStrategy,\n keylinesForScrollOffset,\n snapPositionOffset,\n maxScrollOffset,\n placeItem,\n} from \"../strategy\";\nimport type { SlidesComponent } from \"./slides\";\n\n/** A mouse drag faster than this (px per ms) advances one item in its direction */\nconst FLING_VELOCITY = 0.4;\n/** Pointer travel below this is a click, not a drag */\nconst DRAG_THRESHOLD = 4;\n\ninterface ScrollComponent {\n getCurrentSlide: () => number;\n getVariant: () => CarouselVariant;\n next: () => void;\n prev: () => void;\n goTo: (index: number) => void;\n lifecycle: { destroy: () => void };\n}\n\nexport const withScroll = (config: CarouselConfig) =>\n <C extends SlidesComponent & { emit?: (event: string, data?: unknown) => unknown; lifecycle?: { destroy: () => void } }>(\n component: C,\n ): C & ScrollComponent => {\n const { variant, gap, padding, snap } = resolveLayoutDefaults(config);\n const vertical = variant === CAROUSEL_VARIANTS.FULL_SCREEN;\n const rules: KeylineRules = {\n minSmallSize: config.minSmallItemWidth ?? CAROUSEL_DEFAULTS.MIN_SMALL_ITEM_WIDTH,\n maxSmallSize: config.maxSmallItemWidth ?? CAROUSEL_DEFAULTS.MAX_SMALL_ITEM_WIDTH,\n anchorSize: CAROUSEL_DEFAULTS.ANCHOR_SIZE,\n mediumLargeThreshold: CAROUSEL_DEFAULTS.MEDIUM_LARGE_THRESHOLD,\n };\n const cornerRadius = config.cornerRadius ?? CAROUSEL_DEFAULTS.CORNER_RADIUS;\n const reduceMotion =\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n\n const { element, scroller, track, slideElements } = component;\n const prefix = component.getClass(\"carousel\");\n const snapClass = `${prefix}__snap`;\n element.classList.toggle(`${prefix}--snap`, snap);\n\n let strategy: Strategy | null = null;\n let count = 0;\n let containerSize = 0;\n let scrollOffsetAtStart = 0;\n let snapPositions: number[] = [];\n let currentIndex = Math.max(0, config.initialSlide ?? CAROUSEL_DEFAULTS.INITIAL_SLIDE);\n const lastStyles = new WeakMap<HTMLElement, string>();\n\n // A programmatic scroll reports its target, not every item it passes\n let pending: number | null = null;\n let pendingTimer = 0;\n const clearPending = (): void => {\n pending = null;\n window.clearTimeout(pendingTimer);\n };\n const expect = (index: number): void => {\n pending = index;\n window.clearTimeout(pendingTimer);\n pendingTimer = window.setTimeout(clearPending, 1000);\n };\n\n const scrollPosition = (): number => (vertical ? scroller.scrollTop : scroller.scrollLeft);\n const setScrollPosition = (value: number, smooth: boolean): void => {\n const behavior = smooth && !reduceMotion?.matches ? \"smooth\" : \"auto\";\n if (typeof scroller.scrollTo === \"function\") {\n scroller.scrollTo(vertical ? { top: value, behavior } : { left: value, behavior });\n } else if (vertical) {\n scroller.scrollTop = value;\n } else {\n scroller.scrollLeft = value;\n }\n };\n\n const emitChange = (): void => {\n component.emit?.(CAROUSEL_EVENTS.CHANGE, { index: currentIndex });\n };\n\n const nearestIndex = (position: number): number => {\n let best = 0;\n let bestDistance = Number.MAX_VALUE;\n snapPositions.forEach((snapPosition, i) => {\n const distance = Math.abs(position - snapPosition);\n if (distance < bestDistance) {\n bestDistance = distance;\n best = i;\n }\n });\n return best;\n };\n\n // ── Strategy ────────────────────────────────────────────────\n\n const buildKeylines = (size: number) => {\n // Reduced motion: items keep one size and run past the edges\n // (m3.material.io carousel accessibility)\n const uniform = reduceMotion?.matches === true;\n const preferred = config.itemWidth ?? CAROUSEL_DEFAULTS.ITEM_WIDTH;\n switch (variant) {\n case CAROUSEL_VARIANTS.HERO:\n case CAROUSEL_VARIANTS.HERO_CENTER: {\n const max = config.itemWidth ?? null;\n return uniform\n ? uncontainedKeylines(size, Math.min(max ?? size, size), gap, rules)\n : heroKeylines(size, max, gap, count, variant === CAROUSEL_VARIANTS.HERO_CENTER, rules);\n }\n case CAROUSEL_VARIANTS.UNCONTAINED:\n return uncontainedKeylines(size, preferred, gap, rules);\n case CAROUSEL_VARIANTS.FULL_SCREEN:\n return fullScreenKeylines(size, gap, rules);\n default:\n return uniform\n ? uncontainedKeylines(size, preferred, gap, rules)\n : multiBrowseKeylines(size, preferred, gap, count, rules);\n }\n };\n\n const build = (): void => {\n count = slideElements.length;\n containerSize = vertical ? scroller.clientHeight : scroller.clientWidth;\n currentIndex = count ? Math.min(currentIndex, count - 1) : 0;\n if (containerSize <= 0 || count === 0) {\n strategy = null;\n return;\n }\n const afterPadding = variant === CAROUSEL_VARIANTS.UNCONTAINED ? 0 : padding;\n strategy = createStrategy(buildKeylines(containerSize), containerSize, gap, padding, afterPadding);\n if (!strategy.valid) {\n strategy = null;\n return;\n }\n\n const unit = strategy.itemSize + strategy.gap;\n scrollOffsetAtStart = -snapPositionOffset(strategy, 0, count);\n snapPositions = slideElements.map((_, i) => i * unit - snapPositionOffset(strategy!, i, count) - scrollOffsetAtStart);\n const scrollRange = Math.max(0, snapPositions[count - 1] ?? 0);\n\n // Track length and one snap point per item\n track.style[vertical ? \"height\" : \"width\"] = `${containerSize + scrollRange}px`;\n track.style[vertical ? \"width\" : \"height\"] = \"\";\n track.querySelectorAll(`.${snapClass}`).forEach((el) => el.remove());\n const fragment = document.createDocumentFragment();\n snapPositions.forEach((snapPosition) => {\n const point = document.createElement(\"div\");\n point.className = snapClass;\n point.style[vertical ? \"top\" : \"left\"] = `${snapPosition}px`;\n fragment.appendChild(point);\n });\n track.appendChild(fragment);\n\n slideElements.forEach((el) => {\n el.style[vertical ? \"height\" : \"width\"] = `${strategy!.itemSize}px`;\n el.style[vertical ? \"width\" : \"height\"] = \"\";\n });\n element.style.setProperty(\"--mtrl-carousel-corner\", `${cornerRadius}px`);\n };\n\n // ── Placement ───────────────────────────────────────────────\n\n const layout = (): void => {\n if (!strategy) return;\n const position = scrollPosition();\n const scrollOffset = position + scrollOffsetAtStart;\n const keylines = keylinesForScrollOffset(strategy, scrollOffset, maxScrollOffset(strategy, count));\n const itemSize = strategy.itemSize;\n const fadeRange = strategy.maxItemSize - strategy.minItemSize;\n\n for (let i = 0; i < count; i++) {\n const el = slideElements[i]!;\n const placement = placeItem(strategy, keylines, i, scrollOffset);\n const visible = Math.max(0, Math.min(itemSize, placement.size));\n // Keylines are container coordinates; the items live inside the\n // scrolled track, so the scroll position is added back\n const start = placement.center - itemSize / 2 + position;\n const offscreen = placement.center + visible / 2 < -itemSize || placement.center - visible / 2 > containerSize + itemSize;\n const inset = Math.max(0, (itemSize - visible) / 2);\n const fade = fadeRange > 0 ? Math.min(1, Math.max(0, (visible - strategy.minItemSize) / fadeRange)) : 1;\n const style = offscreen\n ? \"hidden\"\n : `${Math.round(start * 100) / 100}|${Math.round(inset * 100) / 100}|${fade.toFixed(3)}`;\n if (lastStyles.get(el) === style) continue;\n lastStyles.set(el, style);\n if (offscreen) {\n el.style.visibility = \"hidden\";\n continue;\n }\n el.style.visibility = \"\";\n el.style.transform = vertical ? `translate3d(0, ${start}px, 0)` : `translate3d(${start}px, 0, 0)`;\n el.style.clipPath = vertical\n ? `inset(${inset}px 0 round ${cornerRadius}px)`\n : `inset(0 ${inset}px round ${cornerRadius}px)`;\n el.style.setProperty(\"--mtrl-carousel-fade\", fade.toFixed(3));\n }\n\n if (pending !== null) {\n if (Math.abs(scrollPosition() - (snapPositions[pending] ?? 0)) < 1) clearPending();\n return;\n }\n const index = nearestIndex(scrollPosition());\n if (index !== currentIndex) {\n currentIndex = index;\n emitChange();\n }\n };\n\n const rebuild = (): void => {\n build();\n if (strategy) {\n expect(currentIndex);\n setScrollPosition(snapPositions[currentIndex] ?? 0, false);\n }\n layout();\n };\n\n // ── Navigation ──────────────────────────────────────────────\n\n const goTo = (index: number): void => {\n if (!count) return;\n const target = Math.min(Math.max(index, 0), count - 1);\n if (strategy) {\n expect(target);\n setScrollPosition(snapPositions[target] ?? 0, true);\n }\n if (target !== currentIndex) {\n currentIndex = target;\n emitChange();\n }\n };\n const next = (): void => goTo(currentIndex + 1);\n const prev = (): void => goTo(currentIndex - 1);\n\n // ── Keyboard and focus (m3.material.io carousel accessibility) ──\n\n const indexOf = (target: EventTarget | null): number => {\n const item = (target as HTMLElement | null)?.closest?.(`.${prefix}__item`) as HTMLElement | null;\n return item ? slideElements.indexOf(item) : -1;\n };\n\n const handleKeyDown = (e: KeyboardEvent): void => {\n const from = indexOf(e.target);\n if (from < 0) return;\n const forward = vertical ? \"ArrowDown\" : \"ArrowRight\";\n const backward = vertical ? \"ArrowUp\" : \"ArrowLeft\";\n let target = -1;\n if (e.key === forward) target = from + 1;\n else if (e.key === backward) target = from - 1;\n else if (e.key === \"Home\") target = 0;\n else if (e.key === \"End\") target = count - 1;\n if (target < 0 || target >= count) return;\n e.preventDefault();\n slideElements[target]!.focus({ preventScroll: true });\n goTo(target);\n };\n\n const handleFocusIn = (e: FocusEvent): void => {\n const index = indexOf(e.target);\n if (index >= 0 && index !== currentIndex) goTo(index);\n };\n\n // ── Mouse drag (touch and trackpad scroll natively) ─────────\n\n let dragging = false;\n let dragged = false;\n let dragStart = 0;\n let dragScrollStart = 0;\n let dragLast = 0;\n let dragLastTime = 0;\n let dragVelocity = 0;\n let settleTimer = 0;\n\n // While the mouse drags and until the release scroll settles, the\n // snap points are off so they do not fight the pointer\n const restoreSnap = (): void => {\n window.clearTimeout(settleTimer);\n scroller.removeEventListener(\"scrollend\", restoreSnap);\n delete element.dataset.settling;\n };\n\n const handlePointerDown = (e: PointerEvent): void => {\n clearPending();\n if (e.pointerType !== \"mouse\" || e.button !== 0 || !strategy) return;\n dragging = true;\n dragged = false;\n dragStart = vertical ? e.clientY : e.clientX;\n dragLast = dragStart;\n dragLastTime = e.timeStamp;\n dragVelocity = 0;\n dragScrollStart = scrollPosition();\n restoreSnap();\n element.dataset.settling = \"true\";\n scroller.setPointerCapture(e.pointerId);\n };\n\n const handlePointerMove = (e: PointerEvent): void => {\n if (!dragging) return;\n const position = vertical ? e.clientY : e.clientX;\n const delta = position - dragStart;\n if (!dragged && Math.abs(delta) < DRAG_THRESHOLD) return;\n dragged = true;\n element.dataset.dragging = \"true\";\n const dt = e.timeStamp - dragLastTime;\n if (dt > 0) dragVelocity = (position - dragLast) / dt;\n dragLast = position;\n dragLastTime = e.timeStamp;\n if (vertical) scroller.scrollTop = dragScrollStart - delta;\n else scroller.scrollLeft = dragScrollStart - delta;\n e.preventDefault();\n };\n\n const handlePointerUp = (e: PointerEvent): void => {\n if (!dragging) return;\n dragging = false;\n if (scroller.hasPointerCapture(e.pointerId)) scroller.releasePointerCapture(e.pointerId);\n delete element.dataset.dragging;\n if (!dragged) {\n restoreSnap();\n return;\n }\n if (snap) {\n let target = nearestIndex(scrollPosition());\n if (dragVelocity < -FLING_VELOCITY) target = Math.min(count - 1, target + 1);\n else if (dragVelocity > FLING_VELOCITY) target = Math.max(0, target - 1);\n goTo(target);\n scroller.addEventListener(\"scrollend\", restoreSnap, { once: true });\n settleTimer = window.setTimeout(restoreSnap, 600);\n } else {\n restoreSnap();\n }\n };\n\n // A drag must not activate a link or button inside the item\n const handleClick = (e: MouseEvent): void => {\n if (dragged) {\n dragged = false;\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // ── Wiring ──────────────────────────────────────────────────\n\n scroller.addEventListener(\"scroll\", layout, { passive: true });\n scroller.addEventListener(\"wheel\", clearPending, { passive: true });\n scroller.addEventListener(\"touchstart\", clearPending, { passive: true });\n scroller.addEventListener(\"keydown\", handleKeyDown);\n scroller.addEventListener(\"focusin\", handleFocusIn);\n scroller.addEventListener(\"pointerdown\", handlePointerDown);\n scroller.addEventListener(\"pointermove\", handlePointerMove);\n scroller.addEventListener(\"pointerup\", handlePointerUp);\n scroller.addEventListener(\"pointercancel\", handlePointerUp);\n scroller.addEventListener(\"click\", handleClick, true);\n reduceMotion?.addEventListener?.(\"change\", rebuild);\n\n const resizeObserver = typeof ResizeObserver === \"function\" ? new ResizeObserver(rebuild) : null;\n resizeObserver?.observe(scroller);\n\n component.onSlidesChanged(rebuild);\n rebuild();\n\n const destroy = component.lifecycle?.destroy;\n const enhanced = component as C & ScrollComponent;\n enhanced.getCurrentSlide = () => currentIndex;\n enhanced.getVariant = () => variant;\n enhanced.next = next;\n enhanced.prev = prev;\n enhanced.goTo = goTo;\n enhanced.lifecycle = {\n destroy: () => {\n restoreSnap();\n resizeObserver?.disconnect();\n reduceMotion?.removeEventListener?.(\"change\", rebuild);\n clearPending();\n scroller.removeEventListener(\"scroll\", layout);\n scroller.removeEventListener(\"wheel\", clearPending);\n scroller.removeEventListener(\"touchstart\", clearPending);\n scroller.removeEventListener(\"keydown\", handleKeyDown);\n scroller.removeEventListener(\"focusin\", handleFocusIn);\n scroller.removeEventListener(\"pointerdown\", handlePointerDown);\n scroller.removeEventListener(\"pointermove\", handlePointerMove);\n scroller.removeEventListener(\"pointerup\", handlePointerUp);\n scroller.removeEventListener(\"pointercancel\", handlePointerUp);\n scroller.removeEventListener(\"click\", handleClick, true);\n destroy?.();\n },\n };\n return enhanced;\n };\n",
|
|
103
|
+
"// src/components/carousel/api.ts\nimport { CarouselComponent, CarouselSlide, CarouselVariant, SlidesAPI } from \"./types\";\n\ninterface ApiComponent {\n element: HTMLElement;\n slides: SlidesAPI;\n getClass: (name: string) => string;\n getCurrentSlide: () => number;\n getVariant: () => CarouselVariant;\n next: () => void;\n prev: () => void;\n goTo: (index: number) => void;\n lifecycle?: { destroy: () => void };\n on?: (event: string, handler: Function) => unknown;\n off?: (event: string, handler: Function) => unknown;\n}\n\nexport const withAPI = () => (component: ApiComponent): CarouselComponent => {\n const api: CarouselComponent = {\n element: component.element,\n slides: component.slides,\n lifecycle: { destroy: () => component.lifecycle?.destroy() },\n getClass: component.getClass,\n\n next() {\n component.next();\n return api;\n },\n prev() {\n component.prev();\n return api;\n },\n goTo(index: number) {\n component.goTo(index);\n return api;\n },\n getCurrentSlide: () => component.getCurrentSlide(),\n getVariant: () => component.getVariant(),\n\n addSlide(slide: CarouselSlide, index?: number) {\n component.slides.addSlide(slide, index);\n return api;\n },\n removeSlide(index: number) {\n component.slides.removeSlide(index);\n return api;\n },\n\n destroy() {\n component.lifecycle?.destroy();\n },\n on(event: string, handler: Function) {\n component.on?.(event, handler);\n return api;\n },\n off(event: string, handler: Function) {\n component.off?.(event, handler);\n return api;\n },\n addClass(...classes: string[]) {\n component.element.classList.add(...classes);\n return api;\n },\n };\n return api;\n};\n",
|
|
96
104
|
"// src/components/checkbox/checkbox.ts\n/**\n * Checkbox Component Implementation\n * \n * This module implements a Material Design 3 checkbox component\n * with support for different visual variants, indeterminate state,\n * and configurable label positioning.\n * \n * @module components/checkbox\n * @category Components\n */\n\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport {\n withEvents,\n withTextLabel,\n withDisabled,\n withLifecycle,\n withInput,\n withCheckable,\n InputComponent\n} from '../../core/compose/features';\nimport { TextLabelConfig } from '../../core/compose/features/textlabel';\nimport { withAPI } from './api';\nimport { CheckboxConfig, CheckboxComponent, BaseComponent } from './types';\nimport { \n createBaseConfig, \n getElementConfig, \n withCheckIcon,\n withLabelPosition,\n getApiConfig\n} from './config';\n\n/**\n * Enhances a component with checkable features and indeterminate state support\n * \n * The indeterminate state is a third visual state for checkboxes that represents\n * a mixed or partial selection (neither fully checked nor unchecked).\n * \n * @param {BaseComponent & InputComponent} component - The component to enhance\n * @param {CheckboxConfig} config - Configuration options\n * @returns {BaseComponent} The enhanced component\n * @category Components\n * @internal\n */\nconst enhanceWithCheckable = (component: BaseComponent & InputComponent, config: CheckboxConfig): BaseComponent => {\n const enhanced = withCheckable(config)(component);\n\n // Set initial indeterminate state if specified in config\n if (config.indeterminate) {\n enhanced.input.indeterminate = true;\n }\n\n // Add method to control indeterminate state\n enhanced.setIndeterminate = (state: boolean) => {\n enhanced.input.indeterminate = state;\n enhanced.element.classList.toggle(`${config.prefix}-checkbox--indeterminate`, state);\n return enhanced;\n };\n\n return enhanced as unknown as BaseComponent;\n};\n\n/**\n * Creates a new Checkbox component with the specified configuration.\n * \n * Checkboxes allow users to select one or more items from a set,\n * or to toggle a single option on or off. This implementation follows\n * Material Design 3 guidelines for accessible, customizable checkboxes.\n * \n * @param {CheckboxConfig} config - Configuration options for the checkbox\n * @returns {CheckboxComponent} A fully configured checkbox component instance\n * @throws {Error} Throws an error if checkbox creation fails\n * \n * @category Components\n * \n * @example\n * // Create a basic checkbox\n * const checkbox = createCheckbox({\n * label: 'Accept terms and conditions',\n * name: 'accept-terms'\n * });\n * \n * document.querySelector('.form').appendChild(checkbox.element);\n * \n * @example\n * // Create a pre-checked checkbox with custom styling\n * const checkbox = createCheckbox({\n * label: 'Remember me',\n * checked: true,\n * variant: 'outlined',\n * labelPosition: 'start'\n * });\n * \n * // Add event listener\n * checkbox.on('change', (e) => {\n * console.log('Checkbox changed:', e.target.checked);\n * });\n * \n * @example\n * // Create an indeterminate checkbox for \"select all\" functionality\n * const selectAll = createCheckbox({\n * label: 'Select All',\n * indeterminate: true\n * });\n * \n * // Later, based on selections:\n * if (allSelected) {\n * selectAll.check();\n * } else if (noneSelected) {\n * selectAll.uncheck();\n * } else {\n * selectAll.setIndeterminate(true);\n * }\n */\nconst createCheckbox = (config: CheckboxConfig = {}): CheckboxComponent => {\n const baseConfig = createBaseConfig(config);\n\n try {\n // Create the checkbox through functional composition\n // Each function in the pipe adds specific features to the component\n const checkbox = pipe(\n createBase, // Base component\n withEvents(), // Event handling\n withElement(getElementConfig(baseConfig)), // DOM element\n withInput(baseConfig), // Input element\n withCheckIcon(baseConfig), // Checkbox icon\n withTextLabel(baseConfig as TextLabelConfig), // Text label\n withLabelPosition(baseConfig), // Label positioning\n component => enhanceWithCheckable(component as BaseComponent & InputComponent, baseConfig), // Checkable state\n withDisabled(baseConfig), // Disabled state\n withLifecycle(), // Lifecycle management\n comp => withAPI(getApiConfig(comp))(comp) // Public API\n )(baseConfig);\n\n return checkbox as CheckboxComponent;\n } catch (error) {\n console.error('Checkbox creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create checkbox: ${error instanceof Error ? error.message : String(error)}`);\n }\n};\n\nexport default createCheckbox;",
|
|
97
105
|
"// src/components/checkbox/api.ts\nimport { BaseComponent, CheckboxComponent, ApiOptions } from \"./types\";\n\n/**\n * Enhances checkbox component with API methods\n * @param {ApiOptions} options - API configuration\n * @returns {Function} Higher-order function that adds API methods to component\n */\nexport const withAPI =\n ({ disabled, lifecycle, checkable }: ApiOptions) =>\n (component: BaseComponent): CheckboxComponent => ({\n ...(component as any),\n element: component.element,\n input: component.input as HTMLInputElement,\n\n // Value management - returns boolean checked state for form compatibility\n getValue(): boolean {\n return checkable.isChecked();\n },\n\n setValue(value: boolean | string): CheckboxComponent {\n // Handle boolean values\n if (typeof value === \"boolean\") {\n if (value) {\n checkable.check();\n } else {\n checkable.uncheck();\n }\n }\n // Handle string values (\"true\", \"false\", \"1\", \"0\")\n else if (typeof value === \"string\") {\n const shouldCheck = value === \"true\" || value === \"1\";\n if (shouldCheck) {\n checkable.check();\n } else {\n checkable.uncheck();\n }\n }\n return this;\n },\n\n // HTML value attribute access (for rare cases where you need the input's value attribute)\n getValueAttribute(): string {\n return component.input?.value || \"\";\n },\n\n setValueAttribute(value: string): CheckboxComponent {\n if (component.input) {\n component.input.value = value;\n }\n return this;\n },\n\n // State management\n check(): CheckboxComponent {\n checkable.check();\n return this;\n },\n\n uncheck(): CheckboxComponent {\n checkable.uncheck();\n return this;\n },\n\n toggle(): CheckboxComponent {\n checkable.toggle();\n return this;\n },\n\n isChecked(): boolean {\n return checkable.isChecked();\n },\n\n setIndeterminate(state: boolean): CheckboxComponent {\n component.setIndeterminate?.(state);\n return this;\n },\n\n // Label management\n setLabel(text: string): CheckboxComponent {\n component.text?.setText(text);\n return this;\n },\n\n getLabel(): string {\n return component.text?.getText() || \"\";\n },\n\n // Event handling\n on(event: string, handler: Function): CheckboxComponent {\n component.on?.(event, handler);\n return this;\n },\n\n off(event: string, handler: Function): CheckboxComponent {\n component.off?.(event, handler);\n return this;\n },\n\n // State management\n enable(): CheckboxComponent {\n disabled.enable();\n return this;\n },\n\n disable(): CheckboxComponent {\n disabled.disable();\n return this;\n },\n\n destroy(): void {\n lifecycle.destroy();\n },\n });\n",
|
|
98
106
|
"// src/components/checkbox/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { CheckboxConfig, BaseComponent, ApiOptions } from \"./types\";\n\n/**\n * Default configuration for the Checkbox component\n */\nexport const defaultConfig: CheckboxConfig = {\n variant: \"filled\",\n labelPosition: \"end\",\n};\n\n/**\n * Creates the base configuration for Checkbox component\n * @param {CheckboxConfig} config - User provided configuration\n * @returns {CheckboxConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (config: CheckboxConfig = {}): CheckboxConfig =>\n createComponentConfig(defaultConfig, config, \"checkbox\") as CheckboxConfig;\n\n/**\n * Generates element configuration for the Checkbox component\n * @param {CheckboxConfig} config - Checkbox configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: CheckboxConfig) =>\n createElementConfig(config, {\n tag: \"div\",\n className: config.class,\n interactive: true,\n });\n\n/**\n * Adds check icon to checkbox\n * @param {CheckboxConfig} config - Component configuration\n */\nexport const withCheckIcon =\n (config: CheckboxConfig) =>\n (component: BaseComponent): BaseComponent => {\n const icon = document.createElement(\"span\");\n icon.className = `${config.prefix}-checkbox-icon`;\n icon.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M9.55 14.6L6.35 11.4l-1.9 1.9L9.55 18.4l10.9-10.9-1.9-1.9z\"/>\n </svg>\n `;\n\n component.element.appendChild(icon);\n return component;\n };\n\n/**\n * Applies label position class to the component\n * @param {CheckboxConfig} config - Component configuration\n */\nexport const withLabelPosition =\n (config: CheckboxConfig) =>\n (component: BaseComponent): BaseComponent => {\n const position = config.labelPosition || \"end\";\n const positionClass = `${config.prefix}-checkbox--label-${position}`;\n\n component.element.classList.add(positionClass);\n\n return component;\n };\n\n/**\n * Creates API configuration for the Checkbox component\n * @param {BaseComponent} comp - Component with disabled, lifecycle, and checkable features\n * @returns {ApiOptions} API configuration object\n */\nexport const getApiConfig = (comp: BaseComponent): ApiOptions => ({\n disabled: {\n enable: comp.disabled?.enable,\n disable: comp.disabled?.disable,\n },\n lifecycle: {\n destroy: comp.lifecycle?.destroy,\n },\n checkable: {\n check: comp.checkable?.check,\n uncheck: comp.checkable?.uncheck,\n toggle: comp.checkable?.toggle,\n isChecked: comp.checkable?.isChecked,\n },\n});\n\nexport default defaultConfig;\n",
|
|
@@ -119,7 +127,7 @@
|
|
|
119
127
|
"// src/components/divider/divider.ts\nimport { createBase, withElement, pipe, withVariant } from \"../../core/compose\";\nimport { DividerConfig, createBaseConfig } from \"./config\";\nimport { withOrientation, withInset, withStyle } from \"./features\";\nimport { DividerComponent } from \"./types\";\n\n/**\n * Creates a new Divider component with the specified configuration.\n *\n * Dividers are thin lines that separate content into distinct sections following\n * Material Design 3 guidelines. They can be horizontal or vertical, and offer\n * various customization options for inset, thickness, and color.\n *\n * @param config - Divider configuration options\n * @returns Divider component instance with methods for managing appearance and behavior\n *\n * @throws {Error} If divider creation fails due to invalid configuration\n *\n * @category Components\n *\n * @example\n * ```typescript\n * // Create a basic horizontal divider\n * const divider = createDivider();\n * container.appendChild(divider.element);\n *\n * // Create a vertical divider with custom styling\n * const separator = createDivider({\n * orientation: 'vertical',\n * thickness: 2,\n * color: '#2196F3',\n * variant: 'middle-inset',\n * insetStart: 8,\n * insetEnd: 8\n * });\n *\n * // Later, change the divider's appearance\n * divider.setColor('var(--md-sys-color-outline)');\n * divider.setThickness(1);\n * divider.setVariant('inset');\n * ```\n */\nexport const createDivider = (config: DividerConfig = {}): DividerComponent => {\n // Process configuration\n const processedConfig = createBaseConfig(config);\n\n // Create component through composition\n return pipe(\n createBase,\n withElement({\n tag: \"hr\",\n componentName: \"divider\",\n className: config.class,\n }),\n withOrientation(processedConfig),\n withVariant(processedConfig),\n withInset(processedConfig),\n withStyle(processedConfig)\n )(processedConfig) as DividerComponent;\n};\n",
|
|
120
128
|
"// src/components/divider/config.ts\nimport { createComponentConfig } from '../../core/config/component';\n\n/**\n * Configuration options for divider components\n * \n * Controls the appearance, orientation, and behavior of Material Design 3 dividers.\n * \n * @category Components\n */\nexport interface DividerConfig {\n /**\n * CSS class prefix (defaults to 'mtrl')\n * \n * Used for generating BEM-style class names for the component\n */\n prefix?: string;\n \n /**\n * CSS class to add to the divider\n * \n * Additional classes for custom styling needs.\n * Can be a single class string or an array of class strings.\n * \n * @example 'my-custom-divider' or ['my-custom-divider', 'special-spacing']\n */\n class?: string | string[];\n \n /**\n * Orientation of the divider\n * \n * - 'horizontal': Creates a horizontal line (default)\n * - 'vertical': Creates a vertical line\n * \n * @default 'horizontal'\n * \n * @example\n * ```typescript\n * // Create a vertical divider\n * createDivider({ orientation: 'vertical' })\n * ```\n */\n orientation?: 'horizontal' | 'vertical';\n \n /**\n * Variant of the divider\n * \n * Controls how the divider is inset within its container:\n * - 'full-width': Spans the entire width/height (default)\n * - 'inset': Adds space at the start (left for horizontal, top for vertical)\n * - 'middle-inset': Adds space at both start and end\n * \n * Most commonly used in lists to align dividers with text content.\n * \n * @default 'full-width'\n * \n * @example\n * ```typescript\n * // Create a list divider with left inset\n * createDivider({ variant: 'inset' })\n * ```\n */\n variant?: 'full-width' | 'inset' | 'middle-inset';\n \n /**\n * Custom inset value (left margin for horizontal, top margin for vertical)\n * \n * Overrides the default inset spacing at the start of the divider.\n * Only applies when variant is 'inset' or 'middle-inset'.\n * \n * @default 16 for 'inset' and 'middle-inset' variants\n * \n * @example\n * ```typescript\n * // Create a divider with 24px left inset\n * createDivider({ variant: 'inset', insetStart: 24 })\n * ```\n */\n insetStart?: number;\n \n /**\n * Custom inset end value (right margin for horizontal, bottom margin for vertical)\n * \n * Overrides the default inset spacing at the end of the divider.\n * Only applies when variant is 'middle-inset'.\n * \n * @default 0 for 'inset', 16 for 'middle-inset'\n * \n * @example\n * ```typescript\n * // Create a divider with custom insets on both sides\n * createDivider({ variant: 'middle-inset', insetStart: 16, insetEnd: 24 })\n * ```\n */\n insetEnd?: number;\n \n /**\n * Color of the divider\n * \n * Sets a custom color for the divider. Accepts any valid CSS color value.\n * By default, dividers use the 'outline-variant' color from the Material theme.\n * \n * @example\n * ```typescript\n * // Create a blue divider\n * createDivider({ color: '#2196F3' })\n * \n * // Create a divider with a semi-transparent color\n * createDivider({ color: 'rgba(0, 0, 0, 0.12)' })\n * ```\n */\n color?: string;\n \n /**\n * Thickness of the divider in pixels\n * \n * Controls the thickness (height for horizontal, width for vertical) of the divider.\n * Material Design 3 typically uses 1px thickness for dividers.\n * \n * @default 1\n * \n * @example\n * ```typescript\n * // Create a bold divider\n * createDivider({ thickness: 2 })\n * ```\n */\n thickness?: number;\n \n /**\n * Used internally for component composition\n * \n * @internal\n */\n componentName?: string;\n}\n\n/**\n * Default configuration for dividers\n * \n * @internal\n */\nexport const defaultConfig: Partial<DividerConfig> = {\n orientation: 'horizontal',\n variant: 'full-width',\n thickness: 1\n};\n\n/**\n * Creates a base configuration object for divider\n * \n * Merges user-provided configuration with default values and ensures\n * all required properties have values.\n * \n * @param config - User provided configuration\n * @returns Complete configuration with defaults applied\n * \n * @internal\n */\nexport const createBaseConfig = (config: DividerConfig = {}): DividerConfig => {\n return createComponentConfig(\n defaultConfig as DividerConfig,\n config,\n 'divider'\n );\n};",
|
|
121
129
|
"// src/components/divider/features.ts\nimport { BaseComponent, ElementComponent } from '../../core/compose';\nimport { DividerConfig } from './config';\nimport { DividerComponent } from './types';\n\n/**\n * Adds orientation functionality to divider\n * \n * Higher-order function that enhances a component with the ability to be\n * oriented horizontally (default) or vertically. Controls the appropriate\n * CSS classes and dimensional styling based on orientation.\n * \n * @param config - Divider configuration\n * @returns Function that enhances a component with orientation capabilities\n * \n * @internal\n */\nexport const withOrientation = (config: DividerConfig) => \n <C extends ElementComponent & BaseComponent>(component: C): C & Partial<DividerComponent> => {\n const orientation = config.orientation || 'horizontal';\n \n // Apply the orientation class\n component.element.classList.add(`${component.getClass('divider')}--${orientation}`);\n \n // Set styles based on orientation and thickness\n const thickness = config.thickness || 1;\n \n if (orientation === 'horizontal') {\n component.element.style.height = `${thickness}px`;\n component.element.style.width = '100%';\n } else {\n component.element.style.width = `${thickness}px`;\n component.element.style.height = '100%';\n }\n \n return {\n ...component,\n \n getOrientation() {\n return orientation;\n },\n \n setOrientation(newOrientation: 'horizontal' | 'vertical') {\n // Remove existing orientation class\n component.element.classList.remove(`${component.getClass('divider')}--${orientation}`);\n \n // Add new orientation class\n component.element.classList.add(`${component.getClass('divider')}--${newOrientation}`);\n \n // Update styles\n if (newOrientation === 'horizontal') {\n component.element.style.height = `${thickness}px`;\n component.element.style.width = '100%';\n \n // Reset vertical styles\n component.element.style.marginTop = '';\n component.element.style.marginBottom = '';\n } else {\n component.element.style.width = `${thickness}px`;\n component.element.style.height = '100%';\n \n // Reset horizontal styles\n component.element.style.marginLeft = '';\n component.element.style.marginRight = '';\n }\n \n return this as unknown as DividerComponent;\n }\n };\n };\n\n/**\n * Adds inset functionality to divider\n * \n * Higher-order function that enhances a component with the ability to have\n * customized inset spacing. Supports three variants (full-width, inset, middle-inset)\n * and allows fine-grained control over start and end insets.\n * \n * Insets are applied as margins in the appropriate direction based on orientation:\n * - For horizontal dividers: left/right margins\n * - For vertical dividers: top/bottom margins\n * \n * @param config - Divider configuration\n * @returns Function that enhances a component with inset capabilities\n * \n * @internal\n */\nexport const withInset = (config: DividerConfig) => \n <C extends ElementComponent & Partial<DividerComponent>>(component: C): C & Partial<DividerComponent> => {\n const variant = config.variant || 'full-width';\n const orientation = config.orientation || 'horizontal';\n \n // Apply inset styles based on variant\n if (variant === 'inset' || variant === 'middle-inset') {\n if (orientation === 'horizontal') {\n const insetStart = config.insetStart !== undefined ? config.insetStart : 16;\n const insetEnd = config.insetEnd !== undefined ? config.insetEnd : (variant === 'middle-inset' ? 16 : 0);\n \n component.element.style.marginLeft = `${insetStart}px`;\n component.element.style.marginRight = `${insetEnd}px`;\n } else {\n const insetStart = config.insetStart !== undefined ? config.insetStart : 16;\n const insetEnd = config.insetEnd !== undefined ? config.insetEnd : (variant === 'middle-inset' ? 16 : 0);\n \n component.element.style.marginTop = `${insetStart}px`;\n component.element.style.marginBottom = `${insetEnd}px`;\n }\n }\n \n return {\n ...component,\n \n getVariant() {\n return variant as 'full-width' | 'inset' | 'middle-inset';\n },\n \n setVariant(newVariant: 'full-width' | 'inset' | 'middle-inset') {\n // Remove existing variant class\n component.element.classList.remove(`${component.getClass('divider')}--${variant}`);\n \n // Add new variant class\n component.element.classList.add(`${component.getClass('divider')}--${newVariant}`);\n \n // Update styles\n const currentOrientation = component.getOrientation ? component.getOrientation() : orientation;\n \n if (newVariant === 'full-width') {\n if (currentOrientation === 'horizontal') {\n component.element.style.marginLeft = '';\n component.element.style.marginRight = '';\n } else {\n component.element.style.marginTop = '';\n component.element.style.marginBottom = '';\n }\n } else {\n const insetStart = config.insetStart !== undefined ? config.insetStart : 16;\n const insetEnd = config.insetEnd !== undefined ? config.insetEnd : (newVariant === 'middle-inset' ? 16 : 0);\n \n if (currentOrientation === 'horizontal') {\n component.element.style.marginLeft = `${insetStart}px`;\n component.element.style.marginRight = `${insetEnd}px`;\n } else {\n component.element.style.marginTop = `${insetStart}px`;\n component.element.style.marginBottom = `${insetEnd}px`;\n }\n }\n \n return this as unknown as DividerComponent;\n },\n \n setInset(insetStart?: number, insetEnd?: number) {\n const currentOrientation = component.getOrientation ? component.getOrientation() : orientation;\n const currentVariant = component.getVariant ? component.getVariant() : variant;\n \n if (currentVariant !== 'full-width') {\n if (currentOrientation === 'horizontal') {\n if (insetStart !== undefined) {\n component.element.style.marginLeft = `${insetStart}px`;\n }\n \n if (insetEnd !== undefined) {\n component.element.style.marginRight = `${insetEnd}px`;\n }\n } else {\n if (insetStart !== undefined) {\n component.element.style.marginTop = `${insetStart}px`;\n }\n \n if (insetEnd !== undefined) {\n component.element.style.marginBottom = `${insetEnd}px`;\n }\n }\n }\n \n return this as unknown as DividerComponent;\n }\n };\n };\n\n/**\n * Adds style customization to divider\n * \n * Higher-order function that enhances a component with visual customization\n * capabilities, including:\n * - Custom thickness (height for horizontal, width for vertical dividers)\n * - Custom colors (background-color CSS property)\n * \n * These styling options allow dividers to be visually adapted to different\n * design requirements while maintaining Material Design principles.\n * \n * @param config - Divider configuration\n * @returns Function that enhances a component with style capabilities\n * \n * @internal\n */\nexport const withStyle = (config: DividerConfig) => \n <C extends ElementComponent & Partial<DividerComponent>>(component: C): C & Partial<DividerComponent> => {\n // Apply custom color if provided\n if (config.color) {\n component.element.style.backgroundColor = config.color;\n }\n \n // Apply thickness\n const thickness = config.thickness || 1;\n const orientation = config.orientation || 'horizontal';\n \n if (orientation === 'horizontal') {\n component.element.style.height = `${thickness}px`;\n } else {\n component.element.style.width = `${thickness}px`;\n }\n \n return {\n ...component,\n \n setThickness(newThickness: number) {\n const currentOrientation = component.getOrientation ? component.getOrientation() : orientation;\n \n if (currentOrientation === 'horizontal') {\n component.element.style.height = `${newThickness}px`;\n } else {\n component.element.style.width = `${newThickness}px`;\n }\n \n return this as unknown as DividerComponent;\n },\n \n setColor(color: string) {\n component.element.style.backgroundColor = color;\n return this as unknown as DividerComponent;\n }\n };\n };",
|
|
122
|
-
"// src/components/dialog/api.ts (partial update)\nimport {
|
|
130
|
+
"// src/components/dialog/api.ts (partial update)\nimport {\n DialogComponent,\n DialogEvent,\n DialogButton,\n DialogConfirmOptions,\n DialogFooterAlignment,\n DialogSize,\n DialogEventType,\n} from \"./types\";\nimport { removeClass } from \"../../core/dom/classes\";\n\ninterface ApiOptions {\n visibility: {\n open: () => void;\n close: () => void;\n toggle: (open?: boolean) => void;\n isOpen: () => boolean;\n };\n content: {\n setTitle: (title: string) => void;\n getTitle: () => string;\n setSubtitle: (subtitle: string) => void;\n getSubtitle: () => string;\n setContent: (content: string) => void;\n getContent: () => string;\n getHeaderElement: () => HTMLElement | null;\n getContentElement: () => HTMLElement | null;\n getFooterElement: () => HTMLElement | null;\n };\n buttons: {\n addButton: (button: DialogButton) => void;\n removeButton: (indexOrText: number | string) => void;\n getButtons: () => DialogButton[];\n setFooterAlignment: (alignment: DialogFooterAlignment | string) => void;\n };\n focus: {\n trapFocus: () => void;\n releaseFocus: () => void;\n };\n size: {\n setSize: (size: DialogSize | string) => void;\n };\n divider: {\n toggleDivider: (show: boolean) => void;\n hasDivider: () => boolean;\n };\n events: {\n on: (event: string, handler: Function) => void;\n off: (event: string, handler: Function) => void;\n trigger: (event: string, data: any) => void;\n };\n lifecycle: {\n destroy: () => void;\n };\n}\n\ninterface ComponentWithElements {\n element: HTMLElement;\n overlay: HTMLElement;\n getClass: (name: string) => string;\n confirm?: (options: DialogConfirmOptions) => Promise<boolean>;\n}\n\n/**\n * Enhances a dialog component with API methods\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @internal This is an internal utility for the Dialog component\n */\nexport const withAPI =\n (options: ApiOptions) =>\n (component: ComponentWithElements): DialogComponent => ({\n ...(component as any),\n\n /**\n * Opens the dialog\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n open() {\n options.visibility.open();\n return this;\n },\n\n /**\n * Closes the dialog\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n close() {\n options.visibility.close();\n return this;\n },\n\n /**\n * Toggles dialog open/closed state\n * @param {boolean} [open] - Optional flag to force open state\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n toggle(open?: boolean) {\n options.visibility.toggle(open);\n return this;\n },\n\n /**\n * Checks if dialog is open\n * @returns {boolean} True if dialog is open\n */\n isOpen() {\n return options.visibility.isOpen();\n },\n\n /**\n * Sets dialog title\n * @param {string} title - Title text\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n setTitle(title: string) {\n options.content.setTitle(title);\n return this;\n },\n\n /**\n * Gets dialog title\n * @returns {string} Title text\n */\n getTitle() {\n return options.content.getTitle();\n },\n\n /**\n * Sets dialog subtitle\n * @param {string} subtitle - Subtitle text\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n setSubtitle(subtitle: string) {\n options.content.setSubtitle(subtitle);\n return this;\n },\n\n /**\n * Gets dialog subtitle\n * @returns {string} Subtitle text\n */\n getSubtitle() {\n return options.content.getSubtitle();\n },\n\n /**\n * Sets dialog content\n * @param {string} content - Content HTML\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n setContent(content: string) {\n options.content.setContent(content);\n return this;\n },\n\n /**\n * Gets dialog content\n * @returns {string} Content HTML\n */\n getContent() {\n return options.content.getContent();\n },\n\n /**\n * Adds a button to the dialog footer\n * @param {DialogButton} button - Button configuration\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n addButton(button: DialogButton) {\n options.buttons.addButton(button);\n return this;\n },\n\n /**\n * Removes a button by index or text\n * @param {number|string} indexOrText - Button index or text\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n removeButton(indexOrText: number | string) {\n options.buttons.removeButton(indexOrText);\n return this;\n },\n\n /**\n * Gets all footer buttons\n * @returns {DialogButton[]} Array of button configurations\n */\n getButtons() {\n return options.buttons.getButtons();\n },\n\n /**\n * Sets footer alignment\n * @param {string} alignment - Footer alignment\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n setFooterAlignment(alignment: DialogFooterAlignment | string) {\n options.buttons.setFooterAlignment(alignment);\n return this;\n },\n\n /**\n * Shows or hides the divider\n * @param {boolean} show - Whether to show the divider\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n toggleDivider(show: boolean) {\n options.divider.toggleDivider(show);\n return this;\n },\n\n /**\n * Checks if the dialog has a divider\n * @returns {boolean} True if the dialog has a divider\n */\n hasDivider() {\n return options.divider.hasDivider();\n },\n\n /**\n * Sets dialog size\n * @param {string} size - Size variant\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n setSize(size: DialogSize | string) {\n options.size.setSize(size);\n return this;\n },\n\n /**\n * Adds event listener\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n on(event: DialogEventType | string, handler: (event: DialogEvent) => void) {\n options.events.on(event, handler);\n return this;\n },\n\n /**\n * Removes event listener\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n * @returns {DialogComponent} Dialog component instance for chaining\n */\n off(\n event: DialogEventType | string,\n handler: (event: DialogEvent) => void,\n ) {\n options.events.off(event, handler);\n return this;\n },\n\n /**\n * Gets dialog header element\n * @returns {HTMLElement|null} Header element\n */\n getHeaderElement() {\n return options.content.getHeaderElement();\n },\n\n /**\n * Gets dialog content element\n * @returns {HTMLElement|null} Content element\n */\n getContentElement() {\n return options.content.getContentElement();\n },\n\n /**\n * Gets dialog footer element\n * @returns {HTMLElement|null} Footer element\n */\n getFooterElement() {\n return options.content.getFooterElement();\n },\n\n /**\n * Creates a confirmation dialog with Yes/No buttons\n * @param {DialogConfirmOptions} options - Confirmation dialog options\n * @returns {Promise<boolean>} Promise resolving to user choice (true for confirm, false for cancel)\n */\n confirm(options?: DialogConfirmOptions) {\n if (component.confirm) {\n return component.confirm(options || { message: \"Are you sure?\" });\n }\n\n // Fallback if confirm feature is not available\n return Promise.resolve(false);\n },\n\n /**\n * Destroys the dialog and removes it from DOM\n */\n destroy() {\n // Close the dialog first if it's open\n if (this.isOpen()) {\n // We'll handle removal directly rather than calling this.close()\n // to avoid animation delay in critical cleanup\n const dialogVisibleClass = `${component.getClass(\"dialog\")}--visible`;\n const overlayVisibleClass = `${component.getClass(\"dialog-overlay\")}--visible`;\n\n // Remove visibility classes using core utilities\n removeClass(component.element, dialogVisibleClass);\n removeClass(component.overlay, overlayVisibleClass);\n\n // Call any cleanup needed\n if (options.focus && options.focus.releaseFocus) {\n options.focus.releaseFocus();\n }\n }\n\n // Call lifecycle destroy\n options.lifecycle.destroy();\n\n // Immediately remove from DOM\n if (component.overlay && component.overlay.parentNode) {\n component.overlay.parentNode.removeChild(component.overlay);\n }\n },\n\n // Pass through element references\n element: component.element,\n overlay: component.overlay,\n });\n",
|
|
123
131
|
"// src/components/drawer/drawer.ts\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withVariant,\n withLifecycle,\n} from \"../../core/compose/features\";\nimport { withItems, withState, withHeadline } from \"./features\";\nimport { withAPI } from \"./api\";\nimport { DrawerConfig } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\nimport { DRAWER_DEFAULTS } from \"./constants\";\n\n/**\n * Creates a new Drawer component with the specified configuration.\n *\n * The Drawer component implements Material Design 3 navigation drawer with\n * support for standard (inline) and modal (overlay) variants. It provides\n * navigation destinations with icons, labels, badges, dividers, and section\n * labels following the MD3 specification.\n *\n * The Drawer component is created using a functional composition pattern,\n * applying various features through the pipe function.\n *\n * @param {DrawerConfig} config - Configuration options for the drawer\n * This can include variant, items, headline, position, open state,\n * and other drawer properties. See {@link DrawerConfig} for available options.\n *\n * @returns {DrawerComponent} A fully configured drawer component instance with\n * all requested features applied. The returned component has methods for\n * state management, item selection, and lifecycle management.\n *\n * @throws {Error} Throws an error if drawer creation fails for any reason\n *\n * @example\n * ```ts\n * // Create a standard navigation drawer\n * const drawer = createDrawer({\n * variant: 'standard',\n * headline: 'Mail',\n * open: true,\n * items: [\n * { id: 'inbox', label: 'Inbox', icon: '<svg>...</svg>', badge: '24', active: true },\n * { id: 'outbox', label: 'Outbox', icon: '<svg>...</svg>' },\n * { type: 'divider' },\n * { type: 'section', label: 'Labels' },\n * { id: 'family', label: 'Family', icon: '<svg>...</svg>' },\n * ],\n * onSelect: (event) => console.log('Selected:', event.id),\n * });\n *\n * document.body.appendChild(drawer.element);\n *\n * // Create a modal drawer\n * const modalDrawer = createDrawer({\n * variant: 'modal',\n * headline: 'Navigation',\n * items: [\n * { id: 'home', label: 'Home', icon: '<svg>...</svg>', active: true },\n * { id: 'settings', label: 'Settings', icon: '<svg>...</svg>' },\n * ],\n * });\n *\n * document.body.appendChild(modalDrawer.element);\n * modalDrawer.open();\n * ```\n *\n * @category Components\n */\nconst createDrawer = (config: DrawerConfig = {}) => {\n const baseConfig = createBaseConfig(config);\n\n try {\n const drawer = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withHeadline(baseConfig),\n withItems(baseConfig),\n withState(baseConfig),\n withLifecycle(),\n // Assemble the DOM structure\n (component) => {\n const sheetEl = document.createElement(\"div\");\n sheetEl.className = component.getClass(\"drawer__sheet\");\n\n // Set drawer width as a CSS custom property on the root.\n // The sheet reads it via var(--drawer-width) in CSS.\n // The standard variant also uses it to animate the root width.\n const width = baseConfig.width;\n const widthValue = width\n ? typeof width === \"number\"\n ? `${width}px`\n : width\n : `${DRAWER_DEFAULTS.WIDTH}px`;\n component.element.style.setProperty(\"--drawer-width\", widthValue);\n\n // Append headline if present\n if (component.headlineElement) {\n sheetEl.appendChild(component.headlineElement);\n }\n\n // Append items container\n if (component.itemsContainer) {\n sheetEl.appendChild(component.itemsContainer);\n }\n\n // For modal variant, insert scrim before the sheet in the root element\n if (component.scrimElement) {\n component.element.appendChild(component.scrimElement);\n }\n\n // Append sheet to root element\n component.element.appendChild(sheetEl);\n\n // Apply position class\n const position = baseConfig.position || \"start\";\n component.element.classList.add(\n `${component.getClass(\"drawer\")}--${position}`,\n );\n\n return component;\n },\n (comp) => withAPI(getApiConfig(comp))(comp),\n )(baseConfig);\n\n return drawer;\n } catch (error) {\n console.error(\"Drawer creation error:\", error);\n throw new Error(`Failed to create drawer: ${(error as Error).message}`);\n }\n};\n\nexport default createDrawer;\n",
|
|
124
132
|
"// src/components/drawer/constants.ts\n\n/**\n * Drawer variants matching MD3 navigation drawer specification\n */\nexport const DRAWER_VARIANTS = {\n /** Standard drawer — inline, can be permanently visible or toggled */\n STANDARD: \"standard\",\n /** Modal drawer — overlays content with scrim, for compact/medium screens */\n MODAL: \"modal\",\n} as const;\n\n/**\n * Drawer positions (anchor edge)\n */\nexport const DRAWER_POSITIONS = {\n /** Start edge (left in LTR, right in RTL) — default per MD3 */\n START: \"start\",\n /** End edge (right in LTR, left in RTL) */\n END: \"end\",\n} as const;\n\n/**\n * Drawer item types for the items configuration array\n */\nexport const DRAWER_ITEM_TYPES = {\n /** Navigation destination item */\n ITEM: \"item\",\n /** Visual separator between groups */\n DIVIDER: \"divider\",\n /** Section label / subhead for grouping */\n SECTION: \"section\",\n} as const;\n\n/**\n * Drawer events\n */\nexport const DRAWER_EVENTS = {\n /** Fired when the drawer opens */\n OPEN: \"open\",\n /** Fired when the drawer closes */\n CLOSE: \"close\",\n /** Fired when a navigation item is selected */\n SELECT: \"select\",\n} as const;\n\n/**\n * CSS classes used by the drawer component\n */\nexport const DRAWER_CLASSES = {\n /** Root container */\n ROOT: \"drawer\",\n /** Scrim overlay (modal variant only) */\n SCRIM: \"drawer__scrim\",\n /** Inner sheet / panel */\n SHEET: \"drawer__sheet\",\n /** Headline text */\n HEADLINE: \"drawer__headline\",\n /** Scrollable items container */\n ITEMS: \"drawer__items\",\n /** Single navigation item */\n ITEM: \"drawer__item\",\n /** Item icon */\n ITEM_ICON: \"drawer__item-icon\",\n /** Item label text */\n ITEM_LABEL: \"drawer__item-label\",\n /** Item badge */\n ITEM_BADGE: \"drawer__item-badge\",\n /** Active indicator shape */\n ACTIVE_INDICATOR: \"drawer__active-indicator\",\n /** Dense/compact variant */\n DENSE: \"drawer--dense\",\n /** Divider separator */\n DIVIDER: \"drawer__divider\",\n /** Section label */\n SECTION_LABEL: \"drawer__section-label\",\n} as const;\n\n/**\n * Default animation configuration\n */\nexport const DRAWER_ANIMATION = {\n /** Animation duration in milliseconds */\n DURATION: 300,\n /** Easing for opening */\n EASING_OPEN: \"cubic-bezier(0.0, 0.0, 0.2, 1.0)\",\n /** Easing for closing */\n EASING_CLOSE: \"cubic-bezier(0.3, 0.0, 1.0, 1.0)\",\n} as const;\n\n/**\n * Drawer default values\n */\nexport const DRAWER_DEFAULTS = {\n /** Default variant */\n VARIANT: DRAWER_VARIANTS.STANDARD,\n /** Default position */\n POSITION: DRAWER_POSITIONS.START,\n /** Whether drawer is open by default */\n OPEN: false,\n /** Whether modal can be dismissed via scrim */\n DISMISSIBLE: true,\n /** Default drawer width in pixels */\n WIDTH: 360,\n} as const;\n",
|
|
125
133
|
"// src/components/drawer/features/items.ts\n\nimport { DrawerConfig, DrawerItemConfig, DrawerSelectEvent } from \"../types\";\nimport { DRAWER_EVENTS } from \"../constants\";\n\n/**\n * Component shape expected by withItems\n */\ninterface ItemsBaseComponent {\n element: HTMLElement;\n getClass: (name: string) => string;\n emit: (event: string, data?: unknown) => void;\n [key: string]: unknown;\n}\n\n/**\n * Creates a single navigation item element\n */\nconst createItemElement = (\n item: DrawerItemConfig,\n getClass: (name: string) => string,\n): HTMLElement => {\n const el = document.createElement(\"button\");\n el.className = getClass(\"drawer__item\");\n el.setAttribute(\"role\", \"tab\");\n el.setAttribute(\"tabindex\", \"-1\");\n\n if (item.id) {\n el.dataset.id = item.id;\n }\n\n if (item.disabled) {\n el.disabled = true;\n el.setAttribute(\"aria-disabled\", \"true\");\n }\n\n // Active indicator (background shape)\n const indicator = document.createElement(\"span\");\n indicator.className = getClass(\"drawer__active-indicator\");\n el.appendChild(indicator);\n\n // Icon (optional, placed before label)\n if (item.icon) {\n const iconEl = document.createElement(\"span\");\n iconEl.className = getClass(\"drawer__item-icon\");\n iconEl.innerHTML = item.icon;\n el.appendChild(iconEl);\n }\n\n // Label text\n if (item.label) {\n const labelEl = document.createElement(\"span\");\n labelEl.className = getClass(\"drawer__item-label\");\n labelEl.textContent = item.label;\n el.appendChild(labelEl);\n }\n\n // Badge (optional, placed after label)\n if (item.badge) {\n const badgeEl = document.createElement(\"span\");\n badgeEl.className = getClass(\"drawer__item-badge\");\n badgeEl.textContent = item.badge;\n el.appendChild(badgeEl);\n }\n\n // Active state\n if (item.active) {\n el.classList.add(`${getClass(\"drawer__item\")}--active`);\n el.setAttribute(\"aria-selected\", \"true\");\n el.setAttribute(\"tabindex\", \"0\");\n } else {\n el.setAttribute(\"aria-selected\", \"false\");\n }\n\n return el;\n};\n\n/**\n * Creates a divider element\n */\nconst createDividerElement = (\n getClass: (name: string) => string,\n): HTMLElement => {\n const el = document.createElement(\"hr\");\n el.className = getClass(\"drawer__divider\");\n el.setAttribute(\"role\", \"separator\");\n return el;\n};\n\n/**\n * Creates a section label element\n */\nconst createSectionElement = (\n item: DrawerItemConfig,\n getClass: (name: string) => string,\n): HTMLElement => {\n const el = document.createElement(\"div\");\n el.className = getClass(\"drawer__section-label\");\n el.textContent = item.label || item.sectionLabel || \"\";\n return el;\n};\n\n/**\n * Adds item management functionality to the drawer component\n *\n * @param config - Drawer configuration\n * @returns Component enhancer function\n */\nexport const withItems =\n (config: DrawerConfig) =>\n (component: ItemsBaseComponent): ItemsBaseComponent => {\n let currentItems: DrawerItemConfig[] = config.items || [];\n let activeId: string | null = null;\n let itemsContainer: HTMLElement | null = null;\n\n // Find initial active item\n const initialActive = currentItems.find(\n (item) =>\n item.type !== \"divider\" && item.type !== \"section\" && item.active,\n );\n if (initialActive?.id) {\n activeId = initialActive.id;\n }\n\n /**\n * Renders all items into the items container\n */\n const renderItems = (): void => {\n if (!itemsContainer) return;\n\n // Clear existing items\n itemsContainer.innerHTML = \"\";\n\n let navIndex = 0;\n\n currentItems.forEach((item) => {\n const type = item.type || \"item\";\n\n if (type === \"divider\") {\n itemsContainer!.appendChild(createDividerElement(component.getClass));\n return;\n }\n\n if (type === \"section\") {\n itemsContainer!.appendChild(\n createSectionElement(item, component.getClass),\n );\n return;\n }\n\n // Navigation item\n const itemEl = createItemElement(item, component.getClass);\n itemEl.dataset.navIndex = String(navIndex);\n navIndex++;\n\n // Click handler\n itemEl.addEventListener(\"click\", (e: Event) => {\n if (item.id && !item.disabled) {\n setActive(item.id);\n\n const selectEvent: DrawerSelectEvent = {\n id: item.id,\n label: item.label || \"\",\n index: parseInt(itemEl.dataset.navIndex || \"0\", 10),\n originalEvent: e,\n };\n\n component.emit(DRAWER_EVENTS.SELECT, selectEvent);\n\n if (config.onSelect) {\n config.onSelect(selectEvent);\n }\n }\n });\n\n itemsContainer!.appendChild(itemEl);\n });\n\n // Set first item as tabbable if no active item\n if (!activeId) {\n const firstItem = itemsContainer.querySelector(\n `.${component.getClass(\"drawer__item\")}`,\n ) as HTMLElement;\n if (firstItem) {\n firstItem.setAttribute(\"tabindex\", \"0\");\n }\n }\n };\n\n /**\n * Sets the active item by id\n */\n const setActive = (id: string): void => {\n if (!itemsContainer) return;\n\n const activeClass = `${component.getClass(\"drawer__item\")}--active`;\n\n // Deactivate all items\n const allItems = itemsContainer.querySelectorAll(\n `.${component.getClass(\"drawer__item\")}`,\n );\n allItems.forEach((el) => {\n el.classList.remove(activeClass);\n el.setAttribute(\"aria-selected\", \"false\");\n el.setAttribute(\"tabindex\", \"-1\");\n });\n\n // Clear or activate\n if (!id) {\n activeId = null;\n\n // Ensure first item is tabbable when nothing is active\n const firstItem = itemsContainer.querySelector(\n `.${component.getClass(\"drawer__item\")}`,\n ) as HTMLElement;\n if (firstItem) {\n firstItem.setAttribute(\"tabindex\", \"0\");\n }\n } else {\n // Activate the target item\n const targetItem = itemsContainer.querySelector(\n `[data-id=\"${id}\"]`,\n ) as HTMLElement;\n if (targetItem) {\n targetItem.classList.add(activeClass);\n targetItem.setAttribute(\"aria-selected\", \"true\");\n targetItem.setAttribute(\"tabindex\", \"0\");\n activeId = id;\n }\n }\n\n // Update the items config to reflect new active state\n currentItems = currentItems.map((item) => ({\n ...item,\n active: item.id === id,\n }));\n };\n\n /**\n * Gets the active item id\n */\n const getActive = (): string | null => activeId;\n\n /**\n * Sets the items and re-renders\n */\n const setItems = (items: DrawerItemConfig[]): void => {\n currentItems = items;\n\n // Recalculate active id\n const active = items.find(\n (item) =>\n item.type !== \"divider\" && item.type !== \"section\" && item.active,\n );\n activeId = active?.id || null;\n\n renderItems();\n };\n\n /**\n * Gets the current items configuration\n */\n const getItems = (): DrawerItemConfig[] => currentItems;\n\n /**\n * Sets badge text on a specific item\n */\n const setBadge = (id: string, badge: string): void => {\n if (!itemsContainer) return;\n\n const itemEl = itemsContainer.querySelector(\n `[data-id=\"${id}\"]`,\n ) as HTMLElement;\n if (!itemEl) return;\n\n let badgeEl = itemEl.querySelector(\n `.${component.getClass(\"drawer__item-badge\")}`,\n ) as HTMLElement;\n\n if (badge) {\n if (!badgeEl) {\n badgeEl = document.createElement(\"span\");\n badgeEl.className = component.getClass(\"drawer__item-badge\");\n itemEl.appendChild(badgeEl);\n }\n badgeEl.textContent = badge;\n } else if (badgeEl) {\n badgeEl.remove();\n }\n\n // Update items config\n currentItems = currentItems.map((item) =>\n item.id === id ? { ...item, badge } : item,\n );\n };\n\n // Setup keyboard navigation within items\n const handleKeydown = (e: KeyboardEvent): void => {\n if (!itemsContainer) return;\n\n const items = Array.from(\n itemsContainer.querySelectorAll(\n `.${component.getClass(\"drawer__item\")}:not([disabled])`,\n ),\n ) as HTMLElement[];\n\n if (!items.length) return;\n\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n let nextIndex = -1;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n break;\n case \"ArrowUp\":\n e.preventDefault();\n nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n break;\n case \"Home\":\n e.preventDefault();\n nextIndex = 0;\n break;\n case \"End\":\n e.preventDefault();\n nextIndex = items.length - 1;\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (currentIndex >= 0) {\n items[currentIndex].click();\n }\n return;\n default:\n return;\n }\n\n if (nextIndex >= 0 && nextIndex < items.length) {\n items.forEach((item) => item.setAttribute(\"tabindex\", \"-1\"));\n items[nextIndex].setAttribute(\"tabindex\", \"0\");\n items[nextIndex].focus();\n }\n };\n\n // Create the items container and render\n itemsContainer = document.createElement(\"div\");\n itemsContainer.className = component.getClass(\"drawer__items\");\n itemsContainer.setAttribute(\"role\", \"tablist\");\n itemsContainer.setAttribute(\"aria-orientation\", \"vertical\");\n itemsContainer.addEventListener(\"keydown\", handleKeydown);\n\n renderItems();\n\n return {\n ...component,\n itemsContainer,\n drawerItems: {\n setActive,\n getActive,\n setItems,\n getItems,\n setBadge,\n renderItems,\n },\n };\n };\n",
|
|
@@ -133,11 +141,6 @@
|
|
|
133
141
|
"// src/components/extended-fab/extended-fab.ts\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport {\n withEvents,\n withIcon,\n withVariant,\n withRipple,\n withDisabled,\n withLifecycle,\n withText\n} from '../../core/compose/features';\nimport { withAPI } from './api';\nimport { ExtendedFabConfig, ExtendedFabComponent } from './types';\nimport { createBaseConfig, getElementConfig, getApiConfig } from './config';\n\n/**\n * Creates a new Extended Floating Action Button (Extended FAB) component\n * \n * Extended FABs are a variant of the standard Floating Action Button that include\n * both an icon and text label. They're designed for primary actions that need\n * more description than just an icon, and can be positioned in various corners\n * of the interface.\n * \n * Extended FABs follow Material Design 3 guidelines with support for:\n * - Multiple color variants (primary, secondary, tertiary, surface)\n * - Icon and text label configuration\n * - Fixed or fluid width\n * - Automatic collapse on scroll\n * - Various positioning options\n * \n * @param {ExtendedFabConfig} config - Extended FAB configuration object\n * @returns {ExtendedFabComponent} Extended FAB component instance\n * \n * @throws {Error} If the Extended FAB cannot be created due to invalid configuration\n * \n * @category Components\n * \n * @example\n * ```typescript\n * // Create a basic Extended FAB with icon and text\n * const extendedFab = createExtendedFab({\n * icon: '<svg>...</svg>',\n * text: 'Create',\n * ariaLabel: 'Create new item'\n * });\n * \n * // Create a tertiary Extended FAB with a custom position\n * const customExtendedFab = createExtendedFab({\n * text: 'Add to cart',\n * icon: '<svg>...</svg>',\n * variant: 'tertiary',\n * position: 'bottom-right',\n * collapseOnScroll: true\n * });\n * \n * // Add click handler\n * extendedFab.on('click', () => {\n * console.log('Extended FAB clicked');\n * });\n * \n * // Attach to DOM\n * document.body.appendChild(extendedFab.element);\n * \n * // Programmatically collapse and expand\n * document.querySelector('#collapseBtn').addEventListener('click', () => {\n * extendedFab.collapse();\n * });\n * \n * document.querySelector('#expandBtn').addEventListener('click', () => {\n * extendedFab.expand();\n * });\n * ```\n */\nconst createExtendedFab = (config: ExtendedFabConfig = {}): ExtendedFabComponent => {\n const fabConfig = createBaseConfig(config);\n\n // Set up scroll collapse handler if needed\n const setupScrollCollapse = (component: ExtendedFabComponent): void => {\n if (fabConfig.collapseOnScroll) {\n let lastScrollY = window.scrollY;\n let ticking = false;\n const scrollThreshold = 10; // Minimum scroll amount to trigger collapse/expand\n \n const handleScroll = () => {\n if (!ticking) {\n window.requestAnimationFrame(() => {\n const currentScrollY = window.scrollY;\n const scrollDelta = currentScrollY - lastScrollY;\n \n // If scrolling down beyond threshold, collapse\n if (scrollDelta > scrollThreshold) {\n component.collapse();\n } \n // If scrolling up beyond threshold, expand\n else if (scrollDelta < -scrollThreshold) {\n component.expand();\n }\n // If at the top of the page, ensure expanded\n if (currentScrollY <= 0) {\n component.expand();\n }\n \n lastScrollY = currentScrollY;\n ticking = false;\n });\n \n ticking = true;\n }\n };\n \n // Add scroll listener\n window.addEventListener('scroll', handleScroll, { passive: true });\n \n // Ensure it's expanded by default\n requestAnimationFrame(() => {\n component.expand();\n });\n \n // Clean up on destroy\n const originalDestroy = component.destroy;\n component.destroy = () => {\n window.removeEventListener('scroll', handleScroll);\n originalDestroy.call(component);\n };\n }\n };\n\n try {\n const extendedFab = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(fabConfig)),\n withVariant(fabConfig),\n withIcon(fabConfig),\n withText(fabConfig),\n withDisabled(fabConfig),\n withRipple(fabConfig),\n withLifecycle(),\n comp => withAPI(getApiConfig(comp))(comp)\n )(fabConfig);\n \n // Set up scroll collapse after component is created\n setupScrollCollapse(extendedFab);\n \n return extendedFab;\n } catch (error) {\n console.error('Extended FAB creation error:', error);\n throw new Error(`Failed to create Extended FAB: ${(error as Error).message}`);\n }\n};\n\nexport default createExtendedFab;",
|
|
134
142
|
"// src/components/extended-fab/api.ts\nimport { ExtendedFabComponent } from './types';\n\n/**\n * API configuration options for the Extended FAB component\n * \n * @category Components\n * @internal\n */\ninterface ApiOptions {\n /**\n * Disabled state management API\n */\n disabled: {\n /** Enables the component */\n enable: () => void;\n /** Disables the component */\n disable: () => void;\n };\n \n /**\n * Lifecycle management API\n */\n lifecycle: {\n /** Destroys the component */\n destroy: () => void;\n };\n \n /**\n * Text content management API\n */\n text: {\n /** Sets text content */\n setText: (text: string) => any;\n /** Gets text content */\n getText: () => string;\n };\n \n /**\n * Base class name for the Extended FAB\n */\n className: string;\n}\n\n/**\n * Base component with element properties\n * \n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n /** The DOM element */\n element: HTMLElement;\n \n /** Icon management */\n icon: {\n /** Sets icon HTML content */\n setIcon: (html: string) => any;\n /** Gets icon HTML content */\n getIcon: () => string;\n /** Gets icon DOM element */\n getElement: () => HTMLElement | null;\n };\n \n /** Text management */\n text: {\n /** Sets text content */\n setText: (text: string) => any;\n /** Gets text content */\n getText: () => string;\n /** Gets text DOM element */\n getElement: () => HTMLElement | null;\n };\n \n /** Gets a class name with component's prefix */\n getClass: (name: string) => string;\n}\n\n/**\n * Enhances an Extended FAB component with public API methods\n * \n * Higher-order function that adds the full public API to the Extended FAB component,\n * exposing methods for changing appearance, handling state, managing position,\n * and controlling the collapse/expand behavior.\n * \n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * \n * @category Components\n * @internal This is an internal utility for the Extended FAB component\n */\nexport const withAPI = ({ disabled, lifecycle, text, className }: ApiOptions) => \n (component: ComponentWithElements): ExtendedFabComponent => ({\n ...component as any,\n element: component.element as HTMLButtonElement,\n \n getValue: () => (component.element as HTMLButtonElement).value,\n \n setValue(value: string) {\n (component.element as HTMLButtonElement).value = value;\n return this;\n },\n \n enable() {\n disabled.enable();\n return this;\n },\n \n disable() {\n disabled.disable();\n return this;\n },\n \n setIcon(icon: string) {\n component.icon.setIcon(icon);\n return this;\n },\n \n getIcon() {\n return component.icon.getIcon();\n },\n \n setText(newText: string) {\n text.setText(newText);\n return this;\n },\n \n getText() {\n return text.getText();\n },\n \n setPosition(position: string) {\n // First remove any existing position classes\n const positions = ['top-right', 'top-left', 'bottom-right', 'bottom-left'];\n positions.forEach(pos => {\n component.element.classList.remove(`${className}--${pos}`);\n });\n \n // Add new position class\n component.element.classList.add(`${className}--${position}`);\n return this;\n },\n \n getPosition() {\n const positions = ['top-right', 'top-left', 'bottom-right', 'bottom-left'];\n for (const pos of positions) {\n if (component.element.classList.contains(`${className}--${pos}`)) {\n return pos;\n }\n }\n return null;\n },\n \n lower() {\n component.element.classList.add(`${className}--lowered`);\n return this;\n },\n \n raise() {\n component.element.classList.remove(`${className}--lowered`);\n return this;\n },\n \n collapse() {\n component.element.classList.add(`${className}--collapsed`);\n \n // Emit a custom event that can be listened to\n const event = new CustomEvent('collapse', { \n bubbles: true, \n cancelable: true \n });\n component.element.dispatchEvent(event);\n \n return this;\n },\n \n expand() {\n component.element.classList.remove(`${className}--collapsed`);\n \n // Emit a custom event that can be listened to\n const event = new CustomEvent('expand', { \n bubbles: true, \n cancelable: true \n });\n component.element.dispatchEvent(event);\n \n return this;\n },\n \n destroy() {\n lifecycle.destroy();\n }\n });",
|
|
135
143
|
"// src/components/extended-fab/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { ExtendedFabConfig } from \"./types\";\n\n/**\n * Default configuration for the Extended FAB component\n *\n * Provides reasonable defaults for creating Extended FABs\n * according to Material Design 3 guidelines.\n *\n * @category Components\n * @internal\n */\nexport const defaultConfig: ExtendedFabConfig = {\n variant: \"primary\",\n type: \"button\",\n ripple: true,\n iconPosition: \"start\",\n width: \"fixed\",\n};\n\n/**\n * Creates the base configuration for Extended FAB component\n *\n * Merges user-provided configuration with default values and validates\n * the configuration to ensure all required properties have values.\n *\n * @param {ExtendedFabConfig} config - User provided configuration\n * @returns {ExtendedFabConfig} Complete configuration with defaults applied\n *\n * @category Components\n * @internal\n */\nexport const createBaseConfig = (\n config: ExtendedFabConfig = {}\n): ExtendedFabConfig =>\n createComponentConfig(\n defaultConfig,\n config,\n \"extended-fab\"\n ) as ExtendedFabConfig;\n\n/**\n * Generates element configuration for the Extended FAB component\n *\n * Transforms the user-friendly ExtendedFabConfig into the internal format required\n * by the withElement function. Creates all the appropriate CSS classes and attributes\n * needed to properly render the Extended FAB in the DOM.\n *\n * @param {ExtendedFabConfig} config - Extended FAB configuration\n * @returns {Object} Element configuration object for withElement\n *\n * @category Components\n * @internal\n */\nexport const getElementConfig = (config: ExtendedFabConfig) => {\n // Create the attributes object\n const attributes: Record<string, any> = {\n type: config.type || \"button\",\n \"aria-label\":\n config.ariaLabel || config.text || (config.icon ? \"action\" : undefined),\n };\n\n // Build class list\n const classNames = [`${config.prefix}-extended-fab`];\n\n // Add variant class\n if (config.variant) {\n classNames.push(`${config.prefix}-extended-fab--${config.variant}`);\n }\n\n // Add width class\n if (config.width) {\n classNames.push(`${config.prefix}-extended-fab--${config.width}`);\n }\n\n // Add animation class if specified\n if (config.animate) {\n classNames.push(`${config.prefix}-extended-fab--animate-enter`);\n }\n\n // Add position class if specified\n if (config.position) {\n classNames.push(`${config.prefix}-extended-fab--${config.position}`);\n }\n\n // Add collapse-on-scroll class if specified\n if (config.collapseOnScroll) {\n classNames.push(`${config.prefix}-extended-fab--collapsible`);\n }\n\n // Add user classes\n if (config.class) {\n classNames.push(config.class);\n }\n\n // Only add disabled attribute if it's explicitly true\n if (config.disabled === true) {\n attributes.disabled = true;\n classNames.push(`${config.prefix}-extended-fab--disabled`);\n }\n\n return createElementConfig(config, {\n tag: \"button\",\n attributes,\n className: classNames,\n forwardEvents: {\n click: (component) => !component.element.disabled,\n focus: true,\n blur: true,\n },\n interactive: true,\n });\n};\n\n/**\n * Creates API configuration for the Extended FAB component\n *\n * Provides access to various component sub-features like disabled state,\n * lifecycle management, and text content.\n *\n * @param {Object} comp - Component with disabled and lifecycle features\n * @returns {Object} API configuration object for withAPI\n *\n * @category Components\n * @internal\n */\nexport const getApiConfig = (comp: any) => ({\n disabled: {\n enable: () => comp.disabled.enable(),\n disable: () => comp.disabled.disable(),\n },\n lifecycle: {\n destroy: () => comp.lifecycle.destroy(),\n },\n className: comp.getClass(\"extended-fab\"),\n text: {\n setText: (text: string) => comp.text.setText(text),\n getText: () => comp.text.getText(),\n },\n});\n\nexport default defaultConfig;\n",
|
|
136
|
-
"// src/components/icon-button/icon-button.ts\n\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport {\n withEvents,\n withIcon,\n withVariant,\n withSize,\n withRipple,\n withDisabled,\n withLifecycle\n} from '../../core/compose/features';\nimport { withToggle } from './features/toggle';\nimport { withAPI } from './api';\nimport { IconButtonConfig, IconButtonComponent } from './types';\nimport { createBaseConfig, getElementConfig, getApiConfig } from './config';\n\n/**\n * Creates a new IconButton component with the specified configuration.\n *\n * IconButtons display actions in a compact form using icons. They must use\n * a system icon with a clear meaning. IconButtons support both default\n * (single action) and toggle (binary state) modes.\n *\n * The IconButton component is created using a functional composition pattern,\n * applying various features through the pipe function. This approach allows\n * for flexible and modular component construction.\n *\n * @param config - Configuration options for the icon button\n * This can include icon content, variant styling, size, shape, width,\n * toggle behavior, and other properties. See {@link IconButtonConfig}\n * for available options.\n *\n * @returns A fully configured IconButton component instance with\n * all requested features applied. The returned component has methods for\n * manipulation, event handling, and lifecycle management.\n *\n * @throws Error if IconButton creation fails for any reason\n *\n * @example\n * ```ts\n * // Create a standard icon button\n * const menuButton = createIconButton({\n * icon: '<svg>...</svg>',\n * ariaLabel: 'Open menu'\n * });\n *\n * // Create a filled icon button\n * const addButton = createIconButton({\n * icon: '<svg>...</svg>',\n * variant: 'filled',\n * ariaLabel: 'Add item'\n * });\n *\n * // Create a toggle icon button (favorite)\n * const favoriteButton = createIconButton({\n * icon: '<svg>...</svg>', // outlined heart\n * selectedIcon: '<svg>...</svg>', // filled heart\n * toggle: true,\n * variant: 'standard',\n * ariaLabel: 'Add to favorites'\n * });\n *\n * // Listen for toggle events\n * favoriteButton.on('toggle', (e) => {\n * console.log('Selected:', e.detail.selected);\n * });\n *\n * // Create different sizes\n * const smallButton = createIconButton({\n * icon: '<svg>...</svg>',\n * size: 'xs',\n * ariaLabel: 'Small action'\n * });\n *\n * const largeButton = createIconButton({\n * icon: '<svg>...</svg>',\n * size: 'xl',\n * variant: 'tonal',\n * ariaLabel: 'Large action'\n * });\n *\n * // Create square shaped button\n * const squareButton = createIconButton({\n * icon: '<svg>...</svg>',\n * shape: 'square',\n * variant: 'outlined',\n * ariaLabel: 'Square action'\n * });\n *\n * // Create with different widths\n * const wideButton = createIconButton({\n * icon: '<svg>...</svg>',\n * width: 'wide',\n * ariaLabel: 'Wide action'\n * });\n * ```\n *\n * @category Components\n */\nconst createIconButton = (config: IconButtonConfig = {}): IconButtonComponent => {\n const baseConfig = createBaseConfig(config);\n\n try {\n const iconButton = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withSize(baseConfig),\n withIcon(baseConfig),\n withDisabled(baseConfig),\n withToggle(baseConfig),\n withRipple(baseConfig),\n withLifecycle(),\n // Add shape class if specified and not default\n (component) => {\n if (baseConfig.shape && baseConfig.shape !== 'round' && component.element) {\n const className = `${baseConfig.prefix}-${baseConfig.componentName}--${baseConfig.shape}`;\n component.element.classList.add(className);\n }\n return component;\n },\n // Add width class if specified and not default\n (component) => {\n if (baseConfig.width && baseConfig.width !== 'default' && component.element) {\n const className = `${baseConfig.prefix}-${baseConfig.componentName}--${baseConfig.width}`;\n component.element.classList.add(className);\n }\n return component;\n },\n (comp) => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n\n return iconButton;\n } catch (error) {\n console.error('IconButton creation error:', error);\n throw new Error(`Failed to create icon button: ${(error as Error).message}`);\n }\n};\n\nexport default createIconButton;\n",
|
|
137
|
-
"// src/components/icon-button/features/toggle.ts\n\nimport { ElementComponent } from \"../../../core/compose/component\";\n\n/**\n * Configuration for toggle feature\n */\nexport interface ToggleConfig {\n /**\n * Whether toggle mode is enabled\n */\n toggle?: boolean;\n\n /**\n * Whether clicking toggles the state automatically\n * Set to false to control selection programmatically only\n * @default true\n */\n toggleOnClick?: boolean;\n\n /**\n * Initial selected state\n */\n selected?: boolean;\n\n /**\n * Icon HTML for unselected state\n */\n icon?: string;\n\n /**\n * Icon HTML for selected state\n */\n selectedIcon?: string;\n\n /**\n * Component prefix for class names\n */\n prefix?: string;\n\n /**\n * Component name for class generation\n */\n componentName?: string;\n\n /**\n * Additional configuration options\n */\n [key: string]: unknown;\n}\n\n/**\n * Toggle state manager interface\n */\nexport interface ToggleManager {\n /**\n * Selects the component (toggle on)\n * @returns ToggleManager instance for chaining\n */\n select: () => ToggleManager;\n\n /**\n * Deselects the component (toggle off)\n * @returns ToggleManager instance for chaining\n */\n deselect: () => ToggleManager;\n\n /**\n * Toggles the selection state\n * @returns ToggleManager instance for chaining\n */\n toggle: () => ToggleManager;\n\n /**\n * Checks if the component is currently selected\n * @returns true if selected\n */\n isSelected: () => boolean;\n\n /**\n * Checks if toggle mode is enabled\n * @returns true if toggle mode is enabled\n */\n isToggle: () => boolean;\n\n /**\n * Sets the icon for unselected state\n * @param html - Icon HTML content\n * @returns ToggleManager instance for chaining\n */\n setIcon: (html: string) => ToggleManager;\n\n /**\n * Sets the icon for selected state\n * @param html - Icon HTML content\n * @returns ToggleManager instance for chaining\n */\n setSelectedIcon: (html: string) => ToggleManager;\n\n /**\n * Gets the selected state icon\n * @returns Selected icon HTML or empty string\n */\n getSelectedIcon: () => string;\n}\n\n/**\n * Component with toggle capabilities\n */\nexport interface ToggleComponent {\n toggleState: ToggleManager;\n}\n\n/**\n * Component with icon capabilities (for updating icon on toggle)\n */\ninterface ComponentWithIcon extends ElementComponent {\n icon?: {\n setIcon: (html: string) => unknown;\n getIcon: () => string;\n getElement: () => HTMLElement | null;\n };\n lifecycle?: {\n mount: () => void;\n destroy: () => void;\n };\n}\n\n/**\n * Adds toggle (selection) state management to a component\n *\n * This feature enables icon buttons to function as toggle buttons,\n * switching between selected and unselected states. Following MD3 guidelines:\n * - Unselected state uses outlined icon style\n * - Selected state uses filled icon style\n * - Shape can morph on selection (handled by CSS)\n *\n * @param config - Configuration object\n * @returns Function that enhances a component with toggle capabilities\n *\n * @example\n * ```typescript\n * const iconButton = pipe(\n * createBase,\n * withElement(config),\n * withIcon(config),\n * withToggle({\n * toggle: true,\n * selected: false,\n * icon: '<svg>...</svg>', // outlined heart\n * selectedIcon: '<svg>...</svg>' // filled heart\n * })\n * )(config);\n * ```\n */\nexport const withToggle =\n <T extends ToggleConfig>(config: T) =>\n <C extends ComponentWithIcon>(component: C): C & ToggleComponent => {\n // If toggle is not enabled, return component with minimal toggle interface\n if (!config.toggle) {\n return {\n ...component,\n toggleState: {\n select: function () {\n return this;\n },\n deselect: function () {\n return this;\n },\n toggle: function () {\n return this;\n },\n isSelected: () => false,\n isToggle: () => false,\n setIcon: function () {\n return this;\n },\n setSelectedIcon: function () {\n return this;\n },\n getSelectedIcon: () => \"\",\n },\n };\n }\n\n const prefix = config.prefix || \"mtrl\";\n const componentName = config.componentName || \"icon-button\";\n const selectedClass = `${prefix}-${componentName}--selected`;\n\n // Internal state\n let isSelected = config.selected || false;\n let unselectedIcon = config.icon || \"\";\n let selectedIcon = config.selectedIcon || \"\";\n\n /**\n * Updates the icon based on current selection state\n */\n const updateIcon = (): void => {\n if (!component.icon) return;\n\n const iconToShow =\n isSelected && selectedIcon ? selectedIcon : unselectedIcon;\n if (iconToShow) {\n component.icon.setIcon(iconToShow);\n }\n };\n\n /**\n * Updates aria-pressed attribute for accessibility\n */\n const updateAriaPressed = (): void => {\n component.element.setAttribute(\"aria-pressed\", String(isSelected));\n };\n\n // Create toggle manager\n const toggleState: ToggleManager = {\n select() {\n if (!isSelected) {\n isSelected = true;\n component.element.classList.add(selectedClass);\n updateIcon();\n updateAriaPressed();\n }\n return this;\n },\n\n deselect() {\n if (isSelected) {\n isSelected = false;\n component.element.classList.remove(selectedClass);\n updateIcon();\n updateAriaPressed();\n }\n return this;\n },\n\n toggle() {\n if (isSelected) {\n this.deselect();\n } else {\n this.select();\n }\n return this;\n },\n\n isSelected() {\n return isSelected;\n },\n\n isToggle() {\n return true;\n },\n\n setIcon(html: string) {\n unselectedIcon = html;\n if (!isSelected) {\n updateIcon();\n }\n return this;\n },\n\n setSelectedIcon(html: string) {\n selectedIcon = html;\n if (isSelected) {\n updateIcon();\n }\n return this;\n },\n\n getSelectedIcon() {\n return selectedIcon;\n },\n };\n\n // Initialize state\n if (isSelected) {\n component.element.classList.add(selectedClass);\n updateAriaPressed();\n updateIcon();\n } else {\n updateAriaPressed();\n }\n\n // Add click handler for toggle behavior (unless toggleOnClick is false)\n const toggleOnClick = config.toggleOnClick !== false;\n\n const handleClick = (): void => {\n toggleState.toggle();\n\n // Emit custom toggle event\n const event = new CustomEvent(\"toggle\", {\n bubbles: true,\n detail: { selected: isSelected },\n });\n component.element.dispatchEvent(event);\n };\n\n if (toggleOnClick) {\n component.element.addEventListener(\"click\", handleClick);\n }\n\n // Store cleanup handler if lifecycle exists\n const originalDestroy = component.lifecycle?.destroy;\n if (component.lifecycle) {\n component.lifecycle.destroy = () => {\n if (toggleOnClick) {\n component.element.removeEventListener(\"click\", handleClick);\n }\n if (originalDestroy) {\n originalDestroy();\n }\n };\n }\n\n return {\n ...component,\n toggleState,\n };\n };\n",
|
|
138
|
-
"// src/components/icon-button/api.ts\n\nimport { IconButtonComponent } from \"./types\";\nimport {\n IconButtonVariant,\n IconButtonSize,\n IconButtonShape,\n IconButtonWidth,\n} from \"./constants\";\n\n/**\n * API configuration options for the IconButton component\n *\n * @category Components\n * @internal\n */\ninterface ApiOptions {\n /**\n * Disabled state management API\n */\n disabled: {\n /** Enables the component */\n enable: () => void;\n /** Disables the component */\n disable: () => void;\n /** Checks if component is disabled */\n isDisabled: () => boolean;\n };\n\n /**\n * Lifecycle management API\n */\n lifecycle: {\n /** Destroys the component */\n destroy: () => void;\n };\n\n /**\n * Toggle state management API (optional)\n */\n toggleState?: {\n select: () => unknown;\n deselect: () => unknown;\n toggle: () => unknown;\n isSelected: () => boolean;\n isToggle: () => boolean;\n setIcon: (html: string) => unknown;\n setSelectedIcon: (html: string) => unknown;\n getSelectedIcon: () => string;\n };\n}\n\n/**\n * Base component with element properties\n *\n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n /** The DOM element */\n element: HTMLElement;\n\n /** Icon management */\n icon: {\n /** Sets icon HTML content */\n setIcon: (html: string) => unknown;\n /** Gets icon HTML content */\n getIcon: () => string;\n /** Gets icon DOM element */\n getElement: () => HTMLElement | null;\n };\n\n /** Gets a class name with component's prefix */\n getClass: (name: string) => string;\n\n /** Component name */\n componentName?: string;\n\n /** Event listener methods */\n on?: (event: string, handler: Function) => unknown;\n off?: (event: string, handler: Function) => unknown;\n\n /** Class manipulation */\n addClass?: (...classes: string[]) => unknown;\n removeClass?: (...classes: string[]) => unknown;\n}\n\n/**\n * Enhances an IconButton component with public API methods\n *\n * Higher-order function that adds the full public API to the IconButton component,\n * exposing methods for changing appearance, handling state, and managing toggle behavior.\n *\n * @param options - API configuration options\n * @returns Higher-order function that adds API methods to component\n *\n * @category Components\n * @internal\n */\nexport const withAPI =\n ({ disabled, lifecycle, toggleState }: ApiOptions) =>\n (component: ComponentWithElements): IconButtonComponent => {\n const compName = component.componentName || \"icon-button\";\n const baseClass = component.getClass(compName);\n\n // Create the icon API wrapper\n const iconAPI = {\n setIcon: (html: string) => {\n component.icon.setIcon(html);\n return iconAPI;\n },\n getIcon: () => component.icon.getIcon(),\n getElement: () => component.icon.getElement(),\n };\n\n // Create the IconButton component with all API methods\n const iconButtonComponent: IconButtonComponent = {\n element: component.element as HTMLButtonElement,\n icon: iconAPI,\n\n disabled: {\n enable: () => disabled.enable(),\n disable: () => disabled.disable(),\n isDisabled: () => disabled.isDisabled(),\n },\n\n lifecycle: {\n destroy: () => lifecycle.destroy(),\n },\n\n getClass: component.getClass,\n\n getValue: () => (component.element as HTMLButtonElement).value,\n\n setValue(value: string) {\n (component.element as HTMLButtonElement).value = value;\n return iconButtonComponent;\n },\n\n getVariant() {\n const variants: IconButtonVariant[] = [\n \"filled\",\n \"tonal\",\n \"outlined\",\n \"standard\",\n ];\n for (const variant of variants) {\n if (\n component.element.classList.contains(`${baseClass}--${variant}`)\n ) {\n return variant;\n }\n }\n return \"standard\";\n },\n\n setVariant(variant: IconButtonVariant | string) {\n const variants = [\"filled\", \"tonal\", \"outlined\", \"standard\"];\n variants.forEach((v) => {\n component.element.classList.remove(`${baseClass}--${v}`);\n });\n component.element.classList.add(`${baseClass}--${variant}`);\n return iconButtonComponent;\n },\n\n getSize() {\n const sizes: IconButtonSize[] = [\"xs\", \"s\", \"m\", \"l\", \"xl\"];\n for (const size of sizes) {\n if (component.element.classList.contains(`${baseClass}--${size}`)) {\n return size;\n }\n }\n return \"s\";\n },\n\n setSize(size: IconButtonSize | string) {\n const sizes = [\"xs\", \"s\", \"m\", \"l\", \"xl\"];\n sizes.forEach((s) => {\n component.element.classList.remove(`${baseClass}--${s}`);\n });\n if (size !== \"s\") {\n component.element.classList.add(`${baseClass}--${size}`);\n }\n return iconButtonComponent;\n },\n\n getShape() {\n const shapes: IconButtonShape[] = [\"round\", \"square\"];\n for (const shape of shapes) {\n if (component.element.classList.contains(`${baseClass}--${shape}`)) {\n return shape;\n }\n }\n return \"round\";\n },\n\n setShape(shape: IconButtonShape | string) {\n const shapes = [\"round\", \"square\"];\n shapes.forEach((s) => {\n component.element.classList.remove(`${baseClass}--${s}`);\n });\n if (shape !== \"round\") {\n component.element.classList.add(`${baseClass}--${shape}`);\n }\n return iconButtonComponent;\n },\n\n getWidth() {\n const widths: IconButtonWidth[] = [\"narrow\", \"default\", \"wide\"];\n for (const width of widths) {\n if (component.element.classList.contains(`${baseClass}--${width}`)) {\n return width;\n }\n }\n return \"default\";\n },\n\n setWidth(width: IconButtonWidth | string) {\n const widths = [\"narrow\", \"default\", \"wide\"];\n widths.forEach((w) => {\n component.element.classList.remove(`${baseClass}--${w}`);\n });\n if (width !== \"default\") {\n component.element.classList.add(`${baseClass}--${width}`);\n }\n return iconButtonComponent;\n },\n\n enable() {\n disabled.enable();\n return iconButtonComponent;\n },\n\n disable() {\n disabled.disable();\n return iconButtonComponent;\n },\n\n setIcon(icon: string) {\n // If in toggle mode and not selected, update the unselected icon\n if (toggleState?.isToggle() && !toggleState.isSelected()) {\n toggleState.setIcon(icon);\n }\n component.icon.setIcon(icon);\n return iconButtonComponent;\n },\n\n getIcon() {\n return component.icon.getIcon();\n },\n\n setSelectedIcon(icon: string) {\n if (toggleState) {\n toggleState.setSelectedIcon(icon);\n }\n return iconButtonComponent;\n },\n\n getSelectedIcon() {\n return toggleState?.getSelectedIcon() || \"\";\n },\n\n isToggle() {\n return toggleState?.isToggle() || false;\n },\n\n select() {\n if (toggleState) {\n toggleState.select();\n }\n return iconButtonComponent;\n },\n\n deselect() {\n if (toggleState) {\n toggleState.deselect();\n }\n return iconButtonComponent;\n },\n\n toggleSelected() {\n if (toggleState) {\n toggleState.toggle();\n }\n return iconButtonComponent;\n },\n\n isSelected() {\n return toggleState?.isSelected() || false;\n },\n\n setAriaLabel(label: string) {\n component.element.setAttribute(\"aria-label\", label);\n return iconButtonComponent;\n },\n\n destroy() {\n lifecycle.destroy();\n },\n\n on(event: string, handler: Function) {\n if (component.on) {\n component.on(event, handler);\n } else {\n component.element.addEventListener(event, handler as EventListener);\n }\n return iconButtonComponent;\n },\n\n off(event: string, handler: Function) {\n if (component.off) {\n component.off(event, handler);\n } else {\n component.element.removeEventListener(\n event,\n handler as EventListener,\n );\n }\n return iconButtonComponent;\n },\n\n addClass(...classes: string[]) {\n if (component.addClass) {\n component.addClass(...classes);\n } else {\n classes.forEach((cls) => component.element.classList.add(cls));\n }\n return iconButtonComponent;\n },\n\n removeClass(...classes: string[]) {\n if (component.removeClass) {\n component.removeClass(...classes);\n } else {\n classes.forEach((cls) => component.element.classList.remove(cls));\n }\n return iconButtonComponent;\n },\n };\n\n return iconButtonComponent;\n };\n",
|
|
139
|
-
"// src/components/icon-button/config.ts\n\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { IconButtonConfig } from \"./types\";\nimport {\n ICON_BUTTON_VARIANTS,\n ICON_BUTTON_SIZES,\n ICON_BUTTON_SHAPES,\n ICON_BUTTON_WIDTHS,\n ICON_BUTTON_TYPES,\n DEFAULT_RIPPLE_CONFIG,\n} from \"./constants\";\n\n/**\n * Default configuration for the IconButton component\n *\n * Provides reasonable defaults for creating icon buttons\n * according to Material Design 3 guidelines.\n *\n * @category Components\n * @internal\n */\nexport const defaultConfig: IconButtonConfig = {\n variant: ICON_BUTTON_VARIANTS.STANDARD,\n size: ICON_BUTTON_SIZES.S,\n shape: ICON_BUTTON_SHAPES.ROUND,\n width: ICON_BUTTON_WIDTHS.DEFAULT,\n disabled: false,\n type: ICON_BUTTON_TYPES.BUTTON,\n toggle: false,\n selected: false,\n ripple: true,\n tooltip: true,\n rippleConfig: {\n duration: DEFAULT_RIPPLE_CONFIG.DURATION,\n timing: DEFAULT_RIPPLE_CONFIG.TIMING,\n opacity: DEFAULT_RIPPLE_CONFIG.OPACITY,\n },\n};\n\n/**\n * Creates the base configuration for IconButton component\n *\n * Merges user-provided configuration with default values and validates\n * the configuration to ensure all required properties have values.\n *\n * @param config - User provided configuration\n * @returns Complete configuration with defaults applied\n *\n * @category Components\n * @internal\n */\nexport const createBaseConfig = (\n config: IconButtonConfig = {},\n): IconButtonConfig =>\n createComponentConfig(\n defaultConfig,\n config,\n \"icon-button\",\n ) as IconButtonConfig;\n\n/**\n * Generates element configuration for the IconButton component\n *\n * Transforms the user-friendly IconButtonConfig into the internal format required\n * by the withElement function. Creates all the appropriate CSS classes and attributes\n * needed to properly render the IconButton in the DOM.\n *\n * @param config - IconButton configuration\n * @returns Element configuration object for withElement\n *\n * @category Components\n * @internal\n */\nexport const getElementConfig = (config: IconButtonConfig) => {\n // Create the attributes object\n const attributes: Record<string, string | boolean | undefined> = {\n type: config.type || \"button\",\n };\n\n // Add aria-label for accessibility (required for icon buttons)\n if (config.ariaLabel) {\n attributes[\"aria-label\"] = config.ariaLabel;\n }\n\n // Add aria-pressed for toggle buttons\n if (config.toggle) {\n attributes[\"aria-pressed\"] = config.selected ? \"true\" : \"false\";\n }\n\n // Only add disabled attribute if it's explicitly true\n if (config.disabled === true) {\n attributes.disabled = true;\n }\n\n // Add value attribute if provided\n if (config.value !== undefined) {\n attributes.value = config.value;\n }\n\n // Create component-specific classes\n const componentClasses: string[] = [];\n\n // Add size class (default is 's')\n if (config.size && config.size !== \"s\") {\n componentClasses.push(`icon-button--${config.size}`);\n }\n\n // Add shape class (default is 'round')\n if (config.shape && config.shape !== \"round\") {\n componentClasses.push(`icon-button--${config.shape}`);\n }\n\n // Add width class (default is 'default')\n if (config.width && config.width !== \"default\") {\n componentClasses.push(`icon-button--${config.width}`);\n }\n\n // Add toggle class if in toggle mode\n if (config.toggle) {\n componentClasses.push(\"icon-button--toggle\");\n }\n\n // Add selected class if initially selected\n if (config.toggle && config.selected) {\n componentClasses.push(\"icon-button--selected\");\n }\n\n // Add disabled class if disabled\n if (config.disabled === true) {\n componentClasses.push(\"icon-button--disabled\");\n }\n\n // Merge user-provided class/className with component classes\n const userClasses = config.className || config.class;\n const mergedClasses = [\n ...componentClasses,\n ...(Array.isArray(userClasses)\n ? userClasses\n : userClasses\n ? [userClasses]\n : []),\n ];\n\n // Create enhanced config with merged classes\n const enhancedConfig = {\n ...config,\n className: mergedClasses,\n };\n\n return createElementConfig(enhancedConfig, {\n tag: \"button\",\n attributes,\n forwardEvents: {\n click: (component: { element: HTMLButtonElement }) =>\n !component.element.disabled,\n focus: true,\n blur: true,\n },\n interactive: true,\n });\n};\n\n/**\n * Creates API configuration for the IconButton component\n *\n * Provides access to various component sub-features like disabled state\n * and lifecycle management.\n *\n * @param comp - Component with disabled and lifecycle features\n * @returns API configuration object for withAPI\n *\n * @category Components\n * @internal\n */\nexport const getApiConfig = (comp: {\n disabled: {\n enable: () => void;\n disable: () => void;\n isDisabled: () => boolean;\n };\n lifecycle: { destroy: () => void };\n toggleState?: {\n select: () => unknown;\n deselect: () => unknown;\n toggle: () => unknown;\n isSelected: () => boolean;\n isToggle: () => boolean;\n setIcon: (html: string) => unknown;\n setSelectedIcon: (html: string) => unknown;\n getSelectedIcon: () => string;\n };\n}) => ({\n disabled: {\n enable: () => comp.disabled.enable(),\n disable: () => comp.disabled.disable(),\n isDisabled: () => comp.disabled.isDisabled(),\n },\n lifecycle: {\n destroy: () => comp.lifecycle.destroy(),\n },\n toggleState: comp.toggleState,\n});\n\nexport default defaultConfig;\n",
|
|
140
|
-
"// src/components/icon-button/constants.ts\n\n/**\n * IconButton variants following Material Design 3 guidelines\n *\n * Four built-in color styles, in order of emphasis:\n * - filled: Highest emphasis, key actions\n * - tonal: High emphasis, secondary actions\n * - outlined: Medium emphasis, not main focus\n * - standard: Lowest emphasis, on colorful surfaces\n */\nexport const ICON_BUTTON_VARIANTS = {\n /** Primary action button with solid background (highest emphasis) */\n FILLED: 'filled',\n /** Secondary action button with tonal background (high emphasis) */\n TONAL: 'tonal',\n /** Button with outline border and transparent background (medium emphasis) */\n OUTLINED: 'outlined',\n /** Button with no background, just icon (lowest emphasis) */\n STANDARD: 'standard'\n} as const;\n\n/**\n * IconButton variant type\n */\nexport type IconButtonVariant = typeof ICON_BUTTON_VARIANTS[keyof typeof ICON_BUTTON_VARIANTS];\n\n/**\n * IconButton sizes following Material Design 3 specifications\n *\n * | Size | Container | Icon Size |\n * |------|-----------|-----------|\n * | XS | 32dp | 18dp |\n * | S | 40dp | 24dp |\n * | M | 56dp | 24dp |\n * | L | 96dp | 36dp |\n * | XL | 136dp | 48dp |\n */\nexport const ICON_BUTTON_SIZES = {\n /** Extra small - 32px container, 18px icon */\n XS: 'xs',\n /** Small - 40px container, 24px icon (default) */\n S: 's',\n /** Medium - 56px container, 24px icon */\n M: 'm',\n /** Large - 96px container, 36px icon */\n L: 'l',\n /** Extra large - 136px container, 48px icon */\n XL: 'xl'\n} as const;\n\n/**\n * IconButton size type\n */\nexport type IconButtonSize = typeof ICON_BUTTON_SIZES[keyof typeof ICON_BUTTON_SIZES];\n\n/**\n * IconButton shapes following Material Design 3 specifications\n *\n * - round: Full corner radius (default)\n * - square: Fixed corner radius per size\n */\nexport const ICON_BUTTON_SHAPES = {\n /** Round shape - full corner radius (default) */\n ROUND: 'round',\n /** Square shape - fixed corner radius based on size */\n SQUARE: 'square'\n} as const;\n\n/**\n * IconButton shape type\n */\nexport type IconButtonShape = typeof ICON_BUTTON_SHAPES[keyof typeof ICON_BUTTON_SHAPES];\n\n/**\n * IconButton width variants following Material Design 3 specifications\n *\n * | Size | Narrow | Default | Wide |\n * |------|--------|---------|--------|\n * | XS | 28dp | 32dp | 36dp |\n * | S | 32dp | 40dp | 48dp |\n * | M | 48dp | 56dp | 64dp |\n * | L | 80dp | 96dp | 112dp |\n * | XL | 112dp | 136dp | 160dp |\n */\nexport const ICON_BUTTON_WIDTHS = {\n /** Narrow width */\n NARROW: 'narrow',\n /** Default width */\n DEFAULT: 'default',\n /** Wide width */\n WIDE: 'wide'\n} as const;\n\n/**\n * IconButton width type\n */\nexport type IconButtonWidth = typeof ICON_BUTTON_WIDTHS[keyof typeof ICON_BUTTON_WIDTHS];\n\n/**\n * Button types for IconButton\n */\nexport const ICON_BUTTON_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset'\n} as const;\n\n/**\n * CSS classes used by the IconButton component\n */\nexport const ICON_BUTTON_CLASSES = {\n /** Root element class */\n ROOT: 'icon-button',\n /** Class for the icon container */\n ICON: 'icon-button__icon',\n /** Applied when button is selected (toggle state) */\n SELECTED: 'icon-button--selected',\n /** Applied when button is disabled */\n DISABLED: 'icon-button--disabled',\n /** Applied when button is pressed (for shape morph) */\n PRESSED: 'icon-button--pressed'\n} as const;\n\n/**\n * Default ripple effect configuration for IconButton\n */\nexport const DEFAULT_RIPPLE_CONFIG = {\n DURATION: 450,\n TIMING: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\n OPACITY: ['0.7', '0'] as [string, string]\n} as const;\n\n/**\n * Corner radius values for square shape per size (in dp)\n * Round shape uses full corner radius (50%)\n */\nexport const ICON_BUTTON_CORNER_RADIUS = {\n XS: { square: 12, pressed: 8 },\n S: { square: 12, pressed: 8 },\n M: { square: 16, pressed: 12 },\n L: { square: 28, pressed: 16 },\n XL: { square: 28, pressed: 16 }\n} as const;\n\n/**\n * Icon sizes per button size (in dp)\n */\nexport const ICON_BUTTON_ICON_SIZES = {\n XS: 18,\n S: 24,\n M: 24,\n L: 36,\n XL: 48\n} as const;\n\n/**\n * Container sizes per button size (in dp)\n */\nexport const ICON_BUTTON_CONTAINER_SIZES = {\n XS: 32,\n S: 40,\n M: 56,\n L: 96,\n XL: 136\n} as const;\n\n/**\n * Width values per size and width variant (in dp)\n */\nexport const ICON_BUTTON_WIDTH_VALUES = {\n XS: { narrow: 28, default: 32, wide: 36 },\n S: { narrow: 32, default: 40, wide: 48 },\n M: { narrow: 48, default: 56, wide: 64 },\n L: { narrow: 80, default: 96, wide: 112 },\n XL: { narrow: 112, default: 136, wide: 160 }\n} as const;\n",
|
|
141
144
|
"// src/components/list/list.ts\n\nimport { pipe } from \"../../core/compose/pipe\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport { withEvents, withLifecycle } from \"../../core/compose/features\";\nimport { withRenderer, withSelection } from \"./features\";\nimport { withAPI } from \"./api\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new List component\n *\n * The List component provides a simple way to render static arrays of data\n * with built-in selection capabilities. For virtual scrolling and complex\n * data management, use the VirtualList component from mtrl-addons.\n *\n * @param {Object} config - Configuration options for the list\n * @returns {Object} List component instance\n */\nconst createList = (config = {}) => {\n try {\n // Process the configuration with defaults\n const baseConfig = createBaseConfig(config);\n\n console.log(`📋 Creating list with ${baseConfig.items?.length || 0} items`);\n\n // Create the component through functional composition\n const component = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withRenderer(baseConfig), // Item rendering\n withSelection(baseConfig), // Selection capabilities\n withLifecycle(),\n (comp) => withAPI(getApiConfig(comp, baseConfig))(comp) // Apply public API\n )(baseConfig);\n\n return component;\n } catch (error) {\n console.error(\"List creation error:\", error);\n throw new Error(`Failed to create list: ${error.message}`);\n }\n};\n\nexport default createList;",
|
|
142
145
|
"// src/components/list/constants.ts\n\n/**\n * Default list item configuration\n */\nexport const LIST_DEFAULTS = {\n /** Default collection name for API-connected lists */\n COLLECTION: 'items',\n /** Default API base URL */\n BASE_URL: 'http://localhost:4000/api',\n /** Default number of items per page */\n PAGE_SIZE: 20,\n /** Default number of extra items to render above/below viewport */\n RENDER_BUFFER_SIZE: 5,\n /** Default item height in pixels */\n ITEM_HEIGHT: 48\n} as const;\n\n/**\n * List types for rendering and behavior\n */\nexport const LIST_TYPES = {\n /** Standard list with no selection */\n DEFAULT: 'default',\n /** List with single-select behavior */\n SINGLE_SELECT: 'single-select',\n /** List with multi-select behavior */\n MULTI_SELECT: 'multi-select'\n} as const;\n\n/**\n * List selection modes\n */\nexport const LIST_SELECTION_MODES = {\n /** No selection allowed */\n NONE: 'none',\n /** Only one item can be selected at a time */\n SINGLE: 'single',\n /** Multiple items can be selected */\n MULTIPLE: 'multiple'\n} as const;\n\n/**\n * List events\n */\nexport const LIST_EVENTS = {\n /** Fired when an item is selected */\n SELECT: 'select',\n /** Fired when items are loaded */\n LOAD: 'load',\n /** Fired when the list is scrolled */\n SCROLL: 'scroll'\n} as const;\n\n/**\n * Scroll position options for scrollToItem method\n */\nexport const LIST_SCROLL_POSITIONS = {\n /** Align item at the top of viewport */\n START: 'start',\n /** Center item in the viewport */\n CENTER: 'center',\n /** Align item at the bottom of viewport */\n END: 'end'\n} as const;\n\n/**\n * CSS classes used in the list component\n */\nexport const LIST_CLASSES = {\n /** Container element */\n CONTAINER: 'list-container',\n /** List element */\n LIST: 'list',\n /** List item */\n ITEM: 'list-item',\n /** Selected list item */\n SELECTED: 'list-item--selected',\n /** Loading indicator */\n LOADING: 'list--loading',\n /** Empty state */\n EMPTY: 'list--empty'\n} as const;",
|
|
143
146
|
"// src/components/list/features/renderer.ts\n\nimport { LIST_CLASSES, LIST_EVENTS } from '../constants';\n\n/**\n * Adds item rendering capabilities to a component\n * Renders static data directly without virtual scrolling or complex management\n * \n * @param config - Configuration options\n * @returns Function that enhances a component with item rendering capabilities\n */\nexport const withRenderer = (config) => component => {\n if (!component.element) {\n console.warn('Cannot initialize list renderer: missing element');\n return component;\n }\n\n const items = config.items || [];\n const userRenderItem = config.renderItem;\n \n // Create container for list items\n const listContainer = document.createElement('div');\n listContainer.className = 'mtrl-list-content';\n listContainer.setAttribute('role', 'list');\n \n component.element.appendChild(listContainer);\n\n /**\n * Default item renderer when none is provided\n */\n function renderDefaultItem(item, index) {\n const element = document.createElement('div');\n element.className = LIST_CLASSES.ITEM;\n element.setAttribute('role', 'listitem');\n \n // Create content wrapper\n const content = document.createElement('div');\n content.className = 'mtrl-list-item-content';\n \n const text = document.createElement('div');\n text.className = 'mtrl-list-item-text';\n text.textContent = item.text || item.title || item.headline || item.name || item.id || String(item);\n \n content.appendChild(text);\n element.appendChild(content);\n \n return element;\n }\n\n /**\n * Renders all items directly\n */\n const renderAllItems = () => {\n // Clear existing content\n listContainer.innerHTML = '';\n \n if (!items || items.length === 0) {\n listContainer.innerHTML = '<div class=\"mtrl-list-empty\">No items</div>';\n return;\n }\n \n // Create document fragment for efficient DOM manipulation\n const fragment = document.createDocumentFragment();\n \n items.forEach((item, index) => {\n if (item == null) return;\n \n // Create the item element\n const element = userRenderItem \n ? userRenderItem(item, index)\n : renderDefaultItem(item, index);\n \n if (!element) return;\n \n // Ensure element has proper classes and attributes\n if (!element.classList.contains(LIST_CLASSES.ITEM)) {\n element.classList.add(LIST_CLASSES.ITEM);\n }\n \n if (!element.hasAttribute('role')) {\n element.setAttribute('role', 'listitem');\n }\n \n // Add data-id for selection targeting (use index as fallback)\n const itemId = item?.id || String(index);\n if (!element.hasAttribute('data-id')) {\n element.setAttribute('data-id', itemId);\n }\n \n fragment.appendChild(element);\n });\n \n listContainer.appendChild(fragment);\n \n // Emit load event for consistency\n component.emit?.(LIST_EVENTS.LOAD, {\n items,\n loading: false,\n hasNext: false,\n hasPrev: false,\n component\n });\n \n console.log(`📋 Rendered ${items.length} items directly`);\n };\n\n /**\n * Scroll to a specific item by ID\n */\n const scrollToItem = (itemId, position = 'start', animate = false) => {\n const element = listContainer.querySelector(`[data-id=\"${itemId}\"]`);\n if (element) {\n element.scrollIntoView({ \n behavior: animate ? 'smooth' : 'auto', \n block: position === 'center' ? 'center' : position === 'end' ? 'end' : 'start'\n });\n }\n };\n\n /**\n * Scroll to a specific index\n */\n const scrollToIndex = (index, position = 'start', animate = false) => {\n if (index < 0 || index >= items.length) return;\n \n const element = listContainer.children[index];\n if (element) {\n element.scrollIntoView({ \n behavior: animate ? 'smooth' : 'auto', \n block: position === 'center' ? 'center' : position === 'end' ? 'end' : 'start'\n });\n }\n };\n\n // Initial render\n renderAllItems();\n\n // Clean up on destruction\n if (component.lifecycle?.destroy) {\n const originalDestroy = component.lifecycle.destroy;\n component.lifecycle.destroy = () => {\n listContainer.innerHTML = '';\n originalDestroy();\n };\n }\n\n // Return component with list renderer API\n return {\n ...component,\n list: {\n // Core methods\n getItems: () => items,\n getAllItems: () => items,\n getVisibleItems: () => items, // All items are \"visible\" in rendered lists\n refresh: renderAllItems,\n \n // Scrolling methods\n scrollToItem,\n scrollToIndex,\n \n // Compatibility methods (no-ops for rendered lists)\n loadNext: () => Promise.resolve({ hasNext: false, items: [] }),\n loadPage: () => Promise.resolve({ hasNext: false, items: [] }),\n loadPrevious: () => Promise.resolve({ hasPrev: false, items: [] }),\n scrollNext: () => Promise.resolve({ hasNext: false, items: [] }),\n scrollPrevious: () => Promise.resolve({ hasPrev: false, items: [] }),\n scrollToItemById: (itemId, position, animate) => {\n scrollToItem(itemId, position, animate);\n return Promise.resolve();\n },\n onCollectionChange: () => () => {}, // No-op unsubscribe\n onPageChange: () => () => {}, // No-op unsubscribe\n getCurrentPage: () => 1,\n getPageSize: () => items.length,\n getCollection: () => null,\n isApiMode: () => false,\n isLoading: () => false,\n hasNextPage: () => false,\n }\n };\n};\n\nexport default withRenderer;",
|
|
@@ -146,13 +149,26 @@
|
|
|
146
149
|
"// src/components/list/config.ts\n\nimport {\n createComponentConfig,\n createElementConfig as coreCreateElementConfig,\n} from \"../../core/config/component\";\nimport { LIST_CLASSES } from \"./constants\";\nimport { ListConfig } from \"./types\";\n\n/**\n * Default configuration for the List component\n */\nexport const defaultConfig: Partial<ListConfig> = {\n // Static data\n items: [],\n\n // Behavior settings\n trackSelection: true,\n multiSelect: false,\n animate: false,\n};\n\n/**\n * Creates the base configuration for List component\n * @param {ListConfig} config - User provided configuration\n * @returns {Object} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (config: Partial<ListConfig> = {}) => {\n // Validate required props\n if (!Array.isArray(config.items) && !config.renderItem) {\n throw new Error(\"List requires either items array or renderItem function\");\n }\n\n // If items are provided but no renderItem, create a default renderer\n if (\n Array.isArray(config.items) &&\n config.items.length > 0 &&\n !config.renderItem\n ) {\n config.renderItem = (item) => {\n const element = document.createElement(\"div\");\n element.className = \"mtrl-list-item\";\n element.textContent =\n item.text ||\n item.title ||\n item.headline ||\n item.name ||\n item.id ||\n String(item);\n return element;\n };\n }\n\n // Create component config with defaults\n return createComponentConfig(defaultConfig, config, \"list\");\n};\n\n/**\n * Generates element configuration for the List component\n * @param {Object} config - List configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config) => {\n const attributes = {\n role: \"list\",\n tabindex: \"0\",\n };\n\n // Add ARIA attributes for accessibility\n if (config.ariaLabel) {\n attributes[\"aria-label\"] = config.ariaLabel;\n }\n\n // Create element config\n return coreCreateElementConfig(config, {\n tag: \"div\",\n attributes: attributes,\n className: [LIST_CLASSES.CONTAINER, config.class],\n forwardEvents: {\n scroll: true,\n keydown: true,\n },\n });\n};\n\n/**\n * Creates API configuration for the List component\n * @param {Object} component - Component with list features\n * @param {Object} config - Base configuration\n * @returns {Object} API configuration object\n */\nexport const getApiConfig = (component, config) => ({\n list: {\n refresh: component.list?.refresh,\n getItems: component.list?.getItems,\n getAllItems: component.list?.getAllItems,\n getVisibleItems: component.list?.getVisibleItems,\n scrollToItem: component.list?.scrollToItem,\n scrollToIndex: component.list?.scrollToIndex,\n isLoading: () => false, // Simple lists are never loading\n hasNextPage: () => false, // Simple lists don't paginate\n },\n selection: {\n getSelectedItems: component.getSelectedItems,\n getSelectedItemIds: component.getSelectedItemIds,\n isItemSelected: component.isItemSelected,\n selectItem: component.selectItem,\n deselectItem: component.deselectItem,\n clearSelection: component.clearSelection,\n setSelection: component.setSelection,\n },\n events: {\n on: component.on,\n off: component.off,\n },\n lifecycle: {\n destroy: component.lifecycle?.destroy,\n },\n config: {\n animate: config?.animate,\n },\n});\n\nexport default defaultConfig;\n",
|
|
147
150
|
"// src/components/menu/menu.ts\n\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport { withEvents, withLifecycle } from \"../../core/compose/features\";\nimport {\n withController,\n withOpener,\n withPosition,\n withKeyboard,\n withSubmenu,\n} from \"./features\";\nimport { withAPI } from \"./api\";\nimport { MenuConfig, MenuComponent } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new Menu component with the specified configuration.\n *\n * The Menu component implements the Material Design 3 menu specifications,\n * providing a flexible dropdown menu system with support for nested menus,\n * keyboard navigation, and ARIA accessibility.\n *\n * Menus are built using a functional composition pattern, applying various\n * features through the pipe function for a modular architecture.\n *\n * The menu element is not added to the DOM until it's opened, and it's removed\n * from the DOM when closed, following best practices for dropdown menus.\n *\n * @param {MenuConfig} config - Configuration options for the menu\n * This must include an opener element or selector, and an array of menu items.\n * See {@link MenuConfig} for all available options.\n *\n * @returns {MenuComponent} A fully configured menu component instance with\n * all requested features applied. The returned component has methods for\n * menu manipulation, event handling, and lifecycle management.\n *\n * @throws {Error} Throws an error if menu creation fails or if required\n * configuration (like opener) is missing.\n *\n * @category Components\n */\nconst createMenu = (config: MenuConfig): MenuComponent => {\n try {\n // Validate and create the base configuration\n const baseConfig = createBaseConfig(config);\n\n // Create the component through functional composition\n const menu = pipe(\n createBase, // Base component\n withEvents(), // Event handling\n withElement(getElementConfig(baseConfig)), // DOM element\n withPosition(baseConfig), // Position management\n withKeyboard(), // Keyboard navigation\n withSubmenu(baseConfig), // Submenu management\n withController(baseConfig), // Menu controller\n withOpener(baseConfig), // Opener management\n withLifecycle(), // Lifecycle management\n (comp) => withAPI(getApiConfig(comp))(comp), // Public API\n )(baseConfig);\n\n // Register event handlers from config\n if (baseConfig.on && typeof menu.on === \"function\") {\n Object.entries(baseConfig.on).forEach(([event, handler]) => {\n if (typeof handler === \"function\") {\n menu.on(event, handler);\n }\n });\n }\n\n // The menu will be added to the DOM when opened and removed when closed\n\n return menu;\n } catch (error) {\n console.error(\"Menu creation error:\", error);\n throw new Error(`Failed to create menu: ${(error as Error).message}`);\n }\n};\n\nexport default createMenu;\n",
|
|
148
151
|
"// src/components/menu/features/controller.ts\n\nimport { MenuConfig, MenuItem, MenuDivider, MenuSelectEvent } from \"../types\";\n\nlet ignoreNextDocumentClick = false;\n\n/**\n * Adds controller functionality to the menu component\n * Manages state, rendering, positioning, and event handling\n *\n * @param config - Menu configuration\n * @returns Component enhancer with menu controller functionality\n */\nconst withController = (config: MenuConfig) => (component) => {\n if (!component.element) {\n console.warn(\"Cannot initialize menu controller: missing element\");\n return component;\n }\n\n // Initialize state\n const state = {\n visible: config.visible || false,\n items: config.items || [],\n position: config.position,\n selectedItemId: null as string | null,\n activeItemIndex: -1,\n component,\n };\n\n // Create event helpers\n const eventHelpers = {\n triggerEvent(eventName: string, data: any = {}, originalEvent?: Event) {\n const eventData = {\n menu: state.component,\n ...data,\n originalEvent,\n preventDefault: () => {\n eventData.defaultPrevented = true;\n },\n defaultPrevented: false,\n };\n\n component.emit(eventName, eventData);\n return eventData;\n },\n };\n\n /**\n * Gets the opener element from config\n */\n const getOpenerElement = (): HTMLElement => {\n // First try to get the resolved opener from the opener feature\n if (component.opener && typeof component.opener.getOpener === \"function\") {\n return component.opener.getOpener();\n }\n\n // Fall back to config opener for initial positioning\n const { opener } = config;\n\n if (typeof opener === \"string\") {\n const element = document.querySelector(opener);\n if (!element) {\n console.warn(`Menu opener not found: ${opener}`);\n return null;\n }\n return element as HTMLElement;\n }\n\n // Handle component with element property\n if (typeof opener === \"object\" && opener !== null && \"element\" in opener) {\n return opener.element;\n }\n\n // Handle direct HTML element\n return opener as HTMLElement;\n };\n\n /**\n * Creates a DOM element for a menu item\n */\n const createMenuItem = (item: MenuItem, index: number): HTMLElement => {\n const itemElement = document.createElement(\"li\");\n const itemClass = `${component.getClass(\"menu-item\")}`;\n\n itemElement.className = itemClass;\n itemElement.setAttribute(\"role\", \"menuitem\");\n itemElement.setAttribute(\"tabindex\", \"-1\"); // Set to -1 by default, will update when needed\n itemElement.setAttribute(\"data-id\", item.id);\n itemElement.setAttribute(\"data-index\", index.toString());\n\n if (item.disabled) {\n itemElement.classList.add(`${itemClass}--disabled`);\n itemElement.setAttribute(\"aria-disabled\", \"true\");\n } else {\n itemElement.setAttribute(\"aria-disabled\", \"false\");\n }\n\n if (state.selectedItemId && item.id === state.selectedItemId) {\n itemElement.classList.add(`${itemClass}--selected`);\n itemElement.setAttribute(\"aria-selected\", \"true\");\n } else {\n itemElement.setAttribute(\"aria-selected\", \"false\");\n }\n\n if (item.hasSubmenu) {\n itemElement.classList.add(`${itemClass}--submenu`);\n itemElement.setAttribute(\"aria-haspopup\", \"true\");\n itemElement.setAttribute(\"aria-expanded\", \"false\");\n }\n\n // Create content container for flexible layout\n const contentContainer = document.createElement(\"span\");\n contentContainer.className = `${component.getClass(\"menu-item-content\")}`;\n\n // Add icon if provided\n if (item.icon) {\n const iconElement = document.createElement(\"span\");\n iconElement.className = `${component.getClass(\"menu-item-icon\")}`;\n iconElement.innerHTML = item.icon;\n contentContainer.appendChild(iconElement);\n }\n\n // Add text\n const textElement = document.createElement(\"span\");\n textElement.className = `${component.getClass(\"menu-item-text\")}`;\n textElement.textContent = item.text;\n contentContainer.appendChild(textElement);\n\n // Add shortcut if provided\n if (item.shortcut) {\n const shortcutElement = document.createElement(\"span\");\n shortcutElement.className = `${component.getClass(\"menu-item-shortcut\")}`;\n shortcutElement.textContent = item.shortcut;\n contentContainer.appendChild(shortcutElement);\n }\n\n itemElement.appendChild(contentContainer);\n\n // Add event listeners\n if (!item.disabled) {\n // Mouse events\n itemElement.addEventListener(\"click\", (e) =>\n handleItemClick(e, item, index),\n );\n\n // Additional keyboard event handler for accessibility\n itemElement.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleItemClick(e, item, index);\n }\n });\n\n // Focus handling\n itemElement.addEventListener(\"focus\", () => {\n state.activeItemIndex = index;\n });\n\n if (item.hasSubmenu && config.openSubmenuOnHover) {\n // Use submenu feature for hover handling\n itemElement.addEventListener(\"mouseenter\", () => {\n if (component.submenu) {\n component.submenu.handleSubmenuHover(item, index, itemElement);\n }\n });\n\n itemElement.addEventListener(\"mouseleave\", (e) => {\n if (component.submenu) {\n component.submenu.handleSubmenuLeave(e);\n }\n });\n }\n }\n\n return itemElement;\n };\n\n /**\n * Creates a DOM element for a menu divider\n */\n const createDivider = (divider: MenuDivider, index: number): HTMLElement => {\n const dividerElement = document.createElement(\"li\");\n dividerElement.className = `${component.getClass(\"menu-divider\")}`;\n dividerElement.setAttribute(\"role\", \"separator\");\n dividerElement.setAttribute(\"data-index\", index.toString());\n\n if (divider.id) {\n dividerElement.setAttribute(\"id\", divider.id);\n }\n\n return dividerElement;\n };\n\n /**\n * Renders the menu items\n */\n const renderMenuItems = (): void => {\n const menuList = document.createElement(\"ul\");\n menuList.className = `${component.getClass(\"menu-list\")}`;\n menuList.setAttribute(\"role\", \"menu\");\n\n // Create items\n state.items.forEach((item, index) => {\n if (\"type\" in item && item.type === \"divider\") {\n menuList.appendChild(createDivider(item, index));\n } else {\n menuList.appendChild(createMenuItem(item as MenuItem, index));\n }\n });\n\n // Clear and append\n component.element.innerHTML = \"\";\n component.element.appendChild(menuList);\n };\n\n /**\n * Find a menu item by its ID in the items array\n */\n const findItemById = (id: string): MenuItem | null => {\n // Search in top-level items\n for (const item of state.items) {\n if (\"id\" in item && item.id === id) {\n return item as MenuItem;\n }\n\n // Search in submenu items\n if (\"submenu\" in item && Array.isArray((item as MenuItem).submenu)) {\n for (const subItem of (item as MenuItem).submenu) {\n if (\"id\" in subItem && subItem.id === id) {\n return subItem as MenuItem;\n }\n }\n }\n }\n\n return null;\n };\n\n /**\n * Handles click on a menu item\n */\n const handleItemClick = (\n e: MouseEvent | KeyboardEvent,\n item: MenuItem,\n index: number,\n ): void => {\n e.preventDefault();\n e.stopPropagation();\n\n // Don't process if disabled\n if (item.disabled) return;\n\n if (item.hasSubmenu && component.submenu) {\n // Delegate to submenu feature\n component.submenu.handleSubmenuClick(\n item,\n index,\n e.currentTarget as HTMLElement,\n );\n return;\n }\n\n // Trigger select event\n const selectEvent = eventHelpers.triggerEvent(\n \"select\",\n {\n item,\n itemId: item.id,\n itemData: item.data,\n },\n e,\n ) as MenuSelectEvent;\n\n // Close menu if needed\n if (config.closeOnSelect && !selectEvent.defaultPrevented) {\n closeMenu(e, true);\n }\n };\n\n /**\n * Updates the selected state of menu items\n * @param itemId - The ID of the item to mark as selected, or null to clear selection\n */\n const updateSelectedState = (itemId: string | null): void => {\n if (!component.element) return;\n\n // Get all menu items\n const menuItems = component.element.querySelectorAll(\n `.${component.getClass(\"menu-item\")}`,\n ) as NodeListOf<HTMLElement>;\n\n // Update selected state for each item\n menuItems.forEach((item) => {\n const currentItemId = item.getAttribute(\"data-id\");\n\n if (currentItemId === itemId) {\n item.classList.add(`${component.getClass(\"menu-item--selected\")}`);\n item.setAttribute(\"aria-selected\", \"true\");\n } else {\n item.classList.remove(`${component.getClass(\"menu-item--selected\")}`);\n item.setAttribute(\"aria-selected\", \"false\");\n }\n });\n\n // Also update state\n state.selectedItemId = itemId;\n };\n\n /**\n * Opens the menu\n * @param {Event} [event] - Optional event that triggered the open\n * @param {'mouse'|'keyboard'} [interactionType='mouse'] - Type of interaction that triggered the open\n */\n const openMenu = (\n event?: Event,\n interactionType: \"mouse\" | \"keyboard\" = \"mouse\",\n ): void => {\n if (state.visible) return;\n\n // Update state\n state.visible = true;\n\n // First, remove any existing document click listener\n document.removeEventListener(\"click\", handleDocumentClick);\n\n // Step 1: Add the menu to the DOM if it's not already there with initial hidden state\n if (!component.element.parentNode) {\n // Apply explicit initial styling to ensure it doesn't flash\n component.element.classList.remove(\n `${component.getClass(\"menu--visible\")}`,\n );\n component.element.setAttribute(\"aria-hidden\", \"true\");\n component.element.style.transform = \"scaleY(0)\";\n component.element.style.opacity = \"0\";\n\n // Add to DOM - use container if provided, otherwise use document.body\n const container = config.container || document.body;\n container.appendChild(component.element);\n }\n\n // Step 2: Use a small delay to ensure DOM operations are complete\n setTimeout(() => {\n // Position the menu now that it's in the DOM\n const openerElement = getOpenerElement();\n if (openerElement && component.position) {\n component.position.positionMenu(openerElement);\n }\n\n // Set attributes for accessibility\n component.element.setAttribute(\"aria-hidden\", \"false\");\n\n // Remove the inline styles we added\n component.element.style.transform = \"\";\n component.element.style.opacity = \"\";\n\n // Force a reflow before adding the visible class\n void component.element.getBoundingClientRect();\n\n // Add visible class to start the CSS transition\n component.element.classList.add(`${component.getClass(\"menu--visible\")}`);\n\n // Step 4: Set up initial focus based on interaction type\n setTimeout(() => {\n if (component.keyboard && component.keyboard.handleInitialFocus) {\n component.keyboard.handleInitialFocus(\n component.element,\n interactionType,\n );\n } else {\n // Fallback if keyboard module isn't available\n if (interactionType === \"keyboard\") {\n // Find all focusable items\n const items = Array.from(\n component.element.querySelectorAll(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\n \"menu-item--disabled\",\n )})`,\n ),\n ) as HTMLElement[];\n\n if (items.length > 0) {\n // Make sure ALL items are focusable with tabindex -1\n items.forEach((item) => {\n item.tabIndex = -1;\n });\n\n // Only set first item as regularly focusable\n items[0].tabIndex = 0;\n\n // Focus the first item\n items[0].focus();\n } else {\n // If no items, focus the menu itself\n component.element.tabIndex = 0;\n component.element.focus();\n }\n } else {\n // For mouse interaction, make the menu focusable but don't auto-focus\n component.element.tabIndex = -1;\n\n // Still make the first item focusable for keyboard navigation after mouse open\n const items = Array.from(\n component.element.querySelectorAll(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\n \"menu-item--disabled\",\n )})`,\n ),\n ) as HTMLElement[];\n\n if (items.length > 0) {\n items.forEach((item) => {\n item.tabIndex = -1;\n });\n items[0].tabIndex = 0;\n }\n }\n }\n }, 100);\n\n // Add the document click handler on the next event loop\n // after the current click is fully processed\n setTimeout(() => {\n if (config.closeOnClickOutside && state.visible) {\n document.addEventListener(\"click\", handleDocumentClick);\n }\n\n // Add other document events normally\n if (config.closeOnEscape) {\n document.addEventListener(\"keydown\", handleDocumentKeydown);\n }\n window.addEventListener(\"resize\", handleWindowResize, {\n passive: true,\n });\n window.addEventListener(\"scroll\", handleWindowScroll, {\n passive: true,\n });\n }, 0);\n }, 20); // Short delay for browser to process\n\n // Trigger event\n eventHelpers.triggerEvent(\"open\", {}, event);\n };\n\n /**\n * Closes the menu\n * @param {Event} [event] - Optional event that triggered the close\n * @param {boolean} [restoreFocus=true] - Whether to restore focus to the opener element\n */\n const closeMenu = (event?: Event, restoreFocus: boolean = true): void => {\n if (!state.visible) return;\n\n // Emit pre-close event for other features to react\n component.emit(\"menu-closing\", { event, restoreFocus });\n\n // Close any open submenu first using the submenu feature\n if (component.submenu) {\n component.submenu.closeAllSubmenus();\n }\n\n setTimeout(() => {\n // Update state\n state.visible = false;\n\n // Set attributes\n component.element.setAttribute(\"aria-hidden\", \"true\");\n component.element.classList.remove(\n `${component.getClass(\"menu--visible\")}`,\n );\n\n // Remove document events\n document.removeEventListener(\"click\", handleDocumentClick);\n document.removeEventListener(\"keydown\", handleDocumentKeydown);\n window.removeEventListener(\"resize\", handleWindowResize);\n window.removeEventListener(\"scroll\", handleWindowScroll);\n\n // Trigger event\n eventHelpers.triggerEvent(\n \"close\",\n {\n restoreFocus: restoreFocus,\n },\n event,\n );\n\n // Remove from DOM after animation completes\n setTimeout(() => {\n if (component.element.parentNode && !state.visible) {\n component.element.parentNode.removeChild(component.element);\n }\n }, 300); // Match the animation duration in CSS\n }, 50);\n };\n\n /**\n * Toggles the menu\n */\n const toggleMenu = (\n event?: Event,\n interactionType: \"mouse\" | \"keyboard\" = \"mouse\",\n ): void => {\n if (state.visible) {\n closeMenu(event);\n } else {\n // Determine interaction type from event\n if (event) {\n if (event instanceof KeyboardEvent) {\n interactionType = \"keyboard\";\n } else if (event instanceof MouseEvent) {\n interactionType = \"mouse\";\n }\n }\n openMenu(event, interactionType);\n }\n };\n\n /**\n * Handles document click\n */\n const handleDocumentClick = (e: MouseEvent): void => {\n // If we should ignore this click (happens right after opening), reset the flag and return\n if (ignoreNextDocumentClick) {\n ignoreNextDocumentClick = false;\n return;\n }\n\n // Don't close if clicked inside menu\n if (component.element.contains(e.target as Node)) {\n return;\n }\n\n // Check if clicked on opener element\n const opener = getOpenerElement();\n if (opener && opener.contains(e.target as Node)) {\n return;\n }\n\n // Don't close if clicked inside a submenu\n if (component.submenu && component.submenu.hasOpenSubmenu()) {\n const activeSubmenus = component.submenu.getActiveSubmenus();\n for (const submenu of activeSubmenus) {\n if (submenu.element.contains(e.target as Node)) {\n return;\n }\n }\n }\n\n // Close menu\n closeMenu(e, false);\n };\n\n /**\n * Handles document keydown\n */\n const handleDocumentKeydown = (e: KeyboardEvent): void => {\n // Check if the event target is already inside the menu or submenu\n const isTargetInsideMenu = component.element.contains(e.target as Node);\n const isTargetInsideSubmenu =\n component.submenu &&\n component.submenu.hasOpenSubmenu() &&\n component.submenu\n .getActiveSubmenus()\n .some((s) => s.element.contains(e.target as Node));\n\n // If the event target is inside the menu/submenu, the dedicated menu keydown handler\n // will already process it, so we only need to handle Escape here\n if (state.visible) {\n if (isTargetInsideMenu || isTargetInsideSubmenu) {\n // Only handle Escape at the document level for menu items\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeMenu(e, true);\n }\n } else {\n // If target is outside menu, but menu is open, handle all keyboard navigation\n if (component.keyboard && component.keyboard.handleMenuKeydown) {\n component.keyboard.handleMenuKeydown(e, state, {\n closeMenu,\n closeSubmenu: component.submenu\n ? component.submenu.closeSubmenu\n : null,\n findItemById,\n handleSubmenuClick: component.submenu\n ? component.submenu.handleSubmenuClick\n : null,\n handleNestedSubmenuClick: component.submenu\n ? component.submenu.handleNestedSubmenuClick\n : null,\n });\n }\n }\n }\n };\n\n /**\n * Handles window resize\n */\n const handleWindowResize = (): void => {\n if (state.visible) {\n if (config.closeOnResize) {\n // Close menu on resize (better UX for select components)\n closeMenu(undefined, true);\n } else {\n // Reposition menu on resize (default behavior)\n const openerElement = getOpenerElement();\n if (openerElement && component.position) {\n component.position.positionMenu(openerElement);\n }\n }\n }\n };\n\n /**\n * Handles window scroll\n */\n const handleWindowScroll = (): void => {\n if (state.visible) {\n // Use requestAnimationFrame to optimize scroll performance\n window.requestAnimationFrame(() => {\n // Reposition the main menu to stay attached to opener when scrolling\n const openerElement = getOpenerElement();\n if (openerElement && component.position) {\n component.position.positionMenu(openerElement);\n }\n });\n }\n };\n\n /**\n * Sets up the menu\n */\n const initMenu = () => {\n // Set up menu structure\n renderMenuItems();\n\n // Set up keyboard navigation if available\n if (component.keyboard && component.keyboard.setupKeyboardHandlers) {\n component.keyboard.setupKeyboardHandlers(component.element, state, {\n closeMenu,\n closeSubmenu: component.submenu ? component.submenu.closeSubmenu : null,\n findItemById,\n handleSubmenuClick: component.submenu\n ? component.submenu.handleSubmenuClick\n : null,\n handleNestedSubmenuClick: component.submenu\n ? component.submenu.handleNestedSubmenuClick\n : null,\n });\n }\n\n // Position if visible\n if (state.visible) {\n const openerElement = getOpenerElement();\n if (openerElement && component.position) {\n component.position.positionMenu(openerElement);\n }\n\n // Show immediately\n component.element.classList.add(`${component.getClass(\"menu--visible\")}`);\n\n // Set up document events\n if (config.closeOnClickOutside) {\n document.addEventListener(\"click\", handleDocumentClick);\n }\n if (config.closeOnEscape) {\n document.addEventListener(\"keydown\", handleDocumentKeydown);\n }\n window.addEventListener(\"resize\", handleWindowResize);\n window.addEventListener(\"scroll\", handleWindowScroll);\n }\n };\n\n // Handle create-menu-items events for submenu feature\n component.on(\"create-menu-items\", (event) => {\n const { items, container, onItemCreated } = event;\n\n items.forEach((item, index) => {\n let element;\n if (\"type\" in item && item.type === \"divider\") {\n element = createDivider(item, index);\n } else {\n element = createMenuItem(item as MenuItem, index);\n }\n container.appendChild(element);\n if (onItemCreated) {\n onItemCreated(element);\n }\n });\n });\n\n // Initialize after DOM is ready\n setTimeout(initMenu, 0);\n\n // Register with lifecycle if available\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy || (() => {});\n component.lifecycle.destroy = () => {\n // Clean up document events\n document.removeEventListener(\"click\", handleDocumentClick);\n document.removeEventListener(\"keydown\", handleDocumentKeydown);\n window.removeEventListener(\"resize\", handleWindowResize);\n window.removeEventListener(\"scroll\", handleWindowScroll);\n\n originalDestroy();\n };\n }\n\n // Return enhanced component\n return {\n ...component,\n menu: {\n open: (\n event?: Event,\n interactionType: \"mouse\" | \"keyboard\" = \"mouse\",\n ) => {\n openMenu(event, interactionType);\n return component;\n },\n\n close: (event?: Event, restoreFocus = true) => {\n closeMenu(event, restoreFocus);\n return component;\n },\n\n toggle: (\n event?: Event,\n interactionType: \"mouse\" | \"keyboard\" = \"mouse\",\n ) => {\n toggleMenu(event, interactionType);\n return component;\n },\n\n isOpen: () => state.visible,\n\n setItems: (items) => {\n state.items = items;\n renderMenuItems();\n return component;\n },\n\n getItems: () => state.items,\n\n setPosition: (position) => {\n state.position = position;\n if (state.visible) {\n const openerElement = getOpenerElement();\n if (openerElement && component.position) {\n component.position.positionMenu(openerElement);\n }\n }\n return component;\n },\n\n getPosition: () => state.position,\n\n setSelected: (itemId: string | null) => {\n updateSelectedState(itemId);\n return component;\n },\n\n getSelected: () => state.selectedItemId,\n },\n };\n};\n\nexport default withController;\n",
|
|
149
|
-
"// src/components/menu/features/opener.ts\n\nimport { MenuConfig } from \"../types\";\n\n/**\n * Adds opener functionality to menu component\n * Manages the relationship between menu and its opener element\n *\n * @param config - Menu configuration\n * @returns Component enhancer with opener management functionality\n */\nconst withOpener = (config: MenuConfig) => (component) => {\n if (!component.element) {\n console.warn(\"Cannot initialize menu opener: missing element\");\n return component;\n }\n\n // Track keyboard navigation state\n let isTabNavigation = false;\n\n // Add an event listener to detect Tab key navigation\n document.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n // Set flag when Tab key is pressed\n isTabNavigation = e.key === \"Tab\";\n\n // Reset flag after a short delay\n setTimeout(() => {\n isTabNavigation = false;\n }, 100);\n });\n\n // Track opener state\n const state = {\n openerElement: null as HTMLElement,\n openerComponent: null as any,\n activeClass: \"\", // Store the appropriate active class based on element type\n };\n\n /**\n * Resolves the opener element from string, direct reference, or component\n * Handles components with element property, components with getElement() method,\n * or DOM elements directly\n */\n const resolveOpener = (\n opener: any,\n ): { element: HTMLElement; component: any } => {\n if (!opener) return { element: null, component: null };\n\n // Handle string selector\n if (typeof opener === \"string\") {\n const element = document.querySelector(opener);\n if (!element) {\n console.warn(`Menu opener not found: ${opener}`);\n return { element: null, component: null };\n }\n return { element: element as HTMLElement, component: null };\n }\n\n // Handle component with element property (most common case)\n if (typeof opener === \"object\" && opener !== null) {\n // Case 1: Component with element property\n if (\"element\" in opener && opener.element instanceof HTMLElement) {\n return { element: opener.element, component: opener };\n }\n\n // Case 2: Component with getElement method\n if (\"getElement\" in opener && typeof opener.getElement === \"function\") {\n const element = opener.getElement();\n if (element instanceof HTMLElement) {\n return { element, component: opener };\n }\n }\n\n // Case 3: Component with input property (like textfield)\n if (\"input\" in opener && opener.input instanceof HTMLElement) {\n return { element: opener.input, component: opener };\n }\n\n // Case 4: Direct HTML element\n if (opener instanceof HTMLElement) {\n return { element: opener, component: null };\n }\n }\n\n console.warn(\"Invalid opener type:\", opener);\n return { element: null, component: null };\n };\n\n /**\n * Determine the appropriate active class based on element type\n */\n const determineActiveClass = (element: HTMLElement): string => {\n // Check if this is one of our component types\n const classPrefix = component.getClass(\"\").split(\"-\")[0];\n\n // Check element tag and classes to determine appropriate active class\n if (element.tagName === \"BUTTON\") {\n return `${classPrefix}-button--active`;\n } else if (element.classList.contains(`${classPrefix}-chip`)) {\n return `${classPrefix}-chip--selected`;\n } else if (\n element.classList.contains(`${classPrefix}-textfield`) ||\n element.classList.contains(`${classPrefix}-select`)\n ) {\n return `${classPrefix}-textfield--focused`;\n } else {\n // Default active class for other elements\n return `${classPrefix}-menu-opener--active`;\n }\n };\n\n /**\n * Sets up opener click handler for toggling menu\n */\n const setupOpenerEvents = (openerData: {\n element: HTMLElement;\n component: any;\n }): void => {\n const { element: openerElement, component: openerComponent } = openerData;\n\n if (!openerElement) return;\n\n // Remove previously attached event if any\n if (state.openerElement && state.openerElement !== openerElement) {\n cleanup();\n }\n\n // Store references\n state.openerElement = openerElement;\n state.openerComponent = openerComponent;\n\n // Determine the appropriate active class for this opener\n state.activeClass = determineActiveClass(openerElement);\n\n // When manualOpen is true, the opener is only used for positioning —\n // the consumer calls open()/close() themselves.\n if (!config.manualOpen) {\n // Add click handler\n openerElement.addEventListener(\"click\", handleOpenerClick);\n\n // Add keyboard handlers\n openerElement.addEventListener(\"keydown\", handleOpenerKeydown);\n\n // Add blur/focusout handler to close menu when opener loses focus\n openerElement.addEventListener(\"blur\", handleOpenerBlur);\n }\n\n // Add ARIA attributes\n openerElement.setAttribute(\"aria-haspopup\", \"true\");\n openerElement.setAttribute(\"aria-expanded\", \"false\");\n\n // Get menu ID or generate one\n let menuId = component.element.id;\n if (!menuId) {\n menuId = `menu-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n component.element.id = menuId;\n }\n\n // Connect menu and opener with ARIA\n openerElement.setAttribute(\"aria-controls\", menuId);\n };\n\n /**\n * Applies active visual state to opener\n */\n const setOpenerActive = (active: boolean): void => {\n if (!state.openerElement) return;\n\n // Case 1: Component with setActive method (like our button component)\n if (\n state.openerComponent &&\n typeof state.openerComponent.setActive === \"function\"\n ) {\n state.openerComponent.setActive(active);\n return;\n }\n\n // Case 2: Component with selected property (like our chip component)\n if (state.openerComponent && \"selected\" in state.openerComponent) {\n state.openerComponent.selected = active;\n return;\n }\n\n // Case 3: Textfield component with focus/blur methods\n if (\n state.openerComponent &&\n typeof state.openerComponent.focus === \"function\" &&\n typeof state.openerComponent.blur === \"function\"\n ) {\n if (active) {\n state.openerComponent.focus();\n } else {\n state.openerComponent.blur();\n }\n return;\n }\n\n // Case 4: Standard DOM element fallback with classes\n if (state.openerElement.classList) {\n if (active) {\n state.openerElement.classList.add(state.activeClass);\n } else {\n state.openerElement.classList.remove(state.activeClass);\n }\n }\n };\n\n /**\n * Restores focus to the opener properly\n * Handles both component and element cases\n */\n const restoreFocusToOpener = (): void => {\n // Skip if we don't have a valid opener\n if (!state.openerElement) return;\n\n // Case 1: Component with focus method\n if (\n state.openerComponent &&\n typeof state.openerComponent.focus === \"function\"\n ) {\n requestAnimationFrame(() => {\n state.openerComponent.focus();\n });\n return;\n }\n\n // Case\n\n // Case 2: Component with input that can be focused (like textfield)\n if (\n state.openerComponent &&\n \"input\" in state.openerComponent &&\n state.openerComponent.input instanceof HTMLElement\n ) {\n requestAnimationFrame(() => {\n state.openerComponent.input.focus();\n });\n return;\n }\n\n // Case 3: Default - focus the element directly\n requestAnimationFrame(() => {\n state.openerElement.focus();\n });\n };\n\n /**\n * Handles opener element click\n */\n const handleOpenerClick = (e: MouseEvent): void => {\n e.preventDefault();\n\n // Toggle menu visibility with mouse interaction type\n if (component.menu) {\n const isOpen = component.menu.isOpen();\n\n if (isOpen) {\n component.menu.close(e);\n } else {\n component.menu.open(e, \"mouse\");\n }\n }\n };\n\n /**\n * Handles keyboard events on the opener element\n */\n const handleOpenerKeydown = (e: KeyboardEvent): void => {\n // Only handle events if we have a menu controller\n if (!component.menu) return;\n\n // Determine if menu is currently open\n const isOpen = component.menu.isOpen();\n\n switch (e.key) {\n case \"Enter\":\n case \" \": // Space\n case \"ArrowDown\":\n case \"Down\":\n // Prevent default browser behavior\n e.preventDefault();\n\n // Open menu if closed, with keyboard interaction type\n if (!isOpen) {\n component.menu.open(e, \"keyboard\");\n }\n break;\n\n case \"Escape\":\n // Close the menu if it's open\n if (isOpen) {\n e.preventDefault();\n component.menu.close(e);\n }\n break;\n\n case \"ArrowUp\":\n case \"Up\":\n e.preventDefault();\n\n // Special case: open menu with focus on last item\n if (!isOpen) {\n component.menu.open(e, \"keyboard\");\n\n // Wait for menu to open and grab the last item\n setTimeout(() => {\n const items = component.element.querySelectorAll(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\"menu-item--disabled\")})`,\n ) as NodeListOf<HTMLElement>;\n\n if (items.length > 0) {\n // Reset tabindex for all items\n items.forEach((item) => item.setAttribute(\"tabindex\", \"-1\"));\n\n // Set the last item as active\n const lastItem = items[items.length - 1];\n lastItem.setAttribute(\"tabindex\", \"0\");\n lastItem.focus();\n }\n }, 100);\n }\n break;\n }\n };\n\n /**\n * Handles opener blur/focusout events\n */\n const handleOpenerBlur = (e: FocusEvent): void => {\n // Only handle events if we have a menu controller and menu is open\n if (!component.menu || !component.menu.isOpen()) return;\n\n // Get the related target (element receiving focus)\n const relatedTarget = e.relatedTarget as HTMLElement;\n\n // If this is tab navigation, always close the menu regardless of next focus target\n if (isTabNavigation) {\n setTimeout(() => {\n // Verify menu is still open (may have been closed in the meantime)\n if (component.menu && component.menu.isOpen()) {\n // Close the menu but don't restore focus\n component.menu.close(e, false);\n }\n }, 10);\n return;\n }\n\n // For non-tab navigation (like mouse clicks):\n // Don't close if focus is moving to any of these:\n // 1. To the menu itself\n // 2. To a child of the menu\n // 3. To another menu button/opener\n if (relatedTarget) {\n // Check if focus moved to menu or its children\n if (component.element.contains(relatedTarget)) {\n return;\n }\n\n // Check if focus moved to another menu button/opener (has aria-haspopup)\n if (\n relatedTarget.getAttribute(\"aria-haspopup\") === \"true\" ||\n relatedTarget.closest('[aria-haspopup=\"true\"]')\n ) {\n return;\n }\n }\n\n // Wait a brief moment to ensure we're not in the middle of another operation\n // This helps prevent conflicts with click handlers\n setTimeout(() => {\n // Verify menu is still open (may have been closed in the meantime)\n if (component.menu && component.menu.isOpen()) {\n // Close the menu but don't restore focus since focus has moved elsewhere\n component.menu.close(e, false);\n }\n }, 50);\n };\n\n /**\n * Removes event listeners from opener\n */\n const cleanup = (): void => {\n if (state.openerElement) {\n if (!config.manualOpen) {\n state.openerElement.removeEventListener(\"click\", handleOpenerClick);\n state.openerElement.removeEventListener(\"keydown\", handleOpenerKeydown);\n state.openerElement.removeEventListener(\"blur\", handleOpenerBlur);\n }\n state.openerElement.removeAttribute(\"aria-haspopup\");\n state.openerElement.removeAttribute(\"aria-expanded\");\n state.openerElement.removeAttribute(\"aria-controls\");\n\n // Clean up active state if present\n setOpenerActive(false);\n }\n\n // Reset state\n state.openerComponent = null;\n state.openerElement = null;\n state.activeClass = \"\";\n };\n\n // Initialize with provided opener\n const { element, component: openerComponent } = resolveOpener(config.opener);\n setupOpenerEvents({ element, component: openerComponent });\n\n // Register with lifecycle if available\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy || (() => {});\n component.lifecycle.destroy = () => {\n cleanup();\n originalDestroy();\n };\n }\n\n // Listen for menu state changes to update opener\n component.on(\"open\", () => {\n if (state.openerElement) {\n state.openerElement.setAttribute(\"aria-expanded\", \"true\");\n setOpenerActive(true);\n }\n });\n\n component.on(\"close\", (event) => {\n if (state.openerElement) {\n // Always update ARIA attributes\n state.openerElement.setAttribute(\"aria-expanded\", \"false\");\n setOpenerActive(false);\n\n // Handle focus restoration when requested\n if (event.restoreFocus && !isTabNavigation) {\n restoreFocusToOpener();\n }\n }\n });\n\n // Return enhanced component\n return {\n ...component,\n opener: {\n /**\n * Sets a new opener element\n * @param opener - New opener element, selector, or component\n * @returns Component for chaining\n */\n setOpener(opener: any) {\n const resolved = resolveOpener(opener);\n if (resolved.element) {\n setupOpenerEvents(resolved);\n }\n return component;\n },\n\n /**\n * Gets the current opener element\n * @returns Current opener element\n */\n getOpener() {\n return state.openerElement;\n },\n\n /**\n * Gets the current opener component if available\n * @returns Current opener component or null\n */\n getOpenerComponent() {\n return state.openerComponent;\n },\n\n /**\n * Sets the active state of the opener\n * @param active - Whether opener should appear active\n * @returns Component for chaining\n */\n setActive(active: boolean) {\n setOpenerActive(active);\n return component;\n },\n\n /**\n * Restores focus to the opener\n * @returns Component for chaining\n */\n focus() {\n restoreFocusToOpener();\n return component;\n },\n },\n };\n};\n\nexport default withOpener;\n",
|
|
152
|
+
"// src/components/menu/features/opener.ts\n\nimport { MenuConfig } from \"../types\";\n\n/**\n * Adds opener functionality to menu component\n * Manages the relationship between menu and its opener element\n *\n * @param config - Menu configuration\n * @returns Component enhancer with opener management functionality\n */\nconst withOpener = (config: MenuConfig) => (component) => {\n if (!component.element) {\n console.warn(\"Cannot initialize menu opener: missing element\");\n return component;\n }\n\n // Track keyboard navigation state\n let isTabNavigation = false;\n\n // Add an event listener to detect Tab key navigation\n document.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n // Set flag when Tab key is pressed\n isTabNavigation = e.key === \"Tab\";\n\n // Reset flag after a short delay\n setTimeout(() => {\n isTabNavigation = false;\n }, 100);\n });\n\n // Track opener state\n const state = {\n openerElement: null as HTMLElement,\n openerComponent: null as any,\n activeClass: \"\", // Store the appropriate active class based on element type\n };\n\n /**\n * Resolves the opener element from string, direct reference, or component\n * Handles components with element property, components with getElement() method,\n * or DOM elements directly\n */\n const resolveOpener = (\n opener: any,\n ): { element: HTMLElement; component: any } => {\n if (!opener) return { element: null, component: null };\n\n // Handle string selector\n if (typeof opener === \"string\") {\n const element = document.querySelector(opener);\n if (!element) {\n console.warn(`Menu opener not found: ${opener}`);\n return { element: null, component: null };\n }\n return { element: element as HTMLElement, component: null };\n }\n\n // Handle component with element property (most common case)\n if (typeof opener === \"object\" && opener !== null) {\n // Case 1: Component with element property\n if (\"element\" in opener && opener.element instanceof HTMLElement) {\n return { element: opener.element, component: opener };\n }\n\n // Case 2: Component with getElement method\n if (\"getElement\" in opener && typeof opener.getElement === \"function\") {\n const element = opener.getElement();\n if (element instanceof HTMLElement) {\n return { element, component: opener };\n }\n }\n\n // Case 3: Component with input property (like textfield)\n if (\"input\" in opener && opener.input instanceof HTMLElement) {\n return { element: opener.input, component: opener };\n }\n\n // Case 4: Direct HTML element\n if (opener instanceof HTMLElement) {\n return { element: opener, component: null };\n }\n }\n\n console.warn(\"Invalid opener type:\", opener);\n return { element: null, component: null };\n };\n\n /**\n * Determine the appropriate active class based on element type\n */\n const determineActiveClass = (element: HTMLElement): string => {\n // Check if this is one of our component types\n const classPrefix = component.getClass(\"\").split(\"-\")[0];\n\n // Check element tag and classes to determine appropriate active class\n if (element.tagName === \"BUTTON\") {\n return `${classPrefix}-button--active`;\n } else if (element.classList.contains(`${classPrefix}-chip`)) {\n return `${classPrefix}-chip--selected`;\n } else if (\n element.classList.contains(`${classPrefix}-textfield`) ||\n element.classList.contains(`${classPrefix}-select`)\n ) {\n return `${classPrefix}-textfield--focused`;\n } else {\n // Default active class for other elements\n return `${classPrefix}-menu-opener--active`;\n }\n };\n\n /**\n * Sets up opener click handler for toggling menu\n */\n const setupOpenerEvents = (openerData: {\n element: HTMLElement;\n component: any;\n }): void => {\n const { element: openerElement, component: openerComponent } = openerData;\n\n if (!openerElement) return;\n\n // Remove previously attached event if any\n if (state.openerElement && state.openerElement !== openerElement) {\n cleanup();\n }\n\n // Store references\n state.openerElement = openerElement;\n state.openerComponent = openerComponent;\n\n // Determine the appropriate active class for this opener\n state.activeClass = determineActiveClass(openerElement);\n\n // When manualOpen is true, the opener is only used for positioning —\n // the consumer calls open()/close() themselves.\n if (!config.manualOpen) {\n // Add click handler\n openerElement.addEventListener(\"click\", handleOpenerClick);\n\n // Add keyboard handlers\n openerElement.addEventListener(\"keydown\", handleOpenerKeydown);\n\n // Add blur/focusout handler to close menu when opener loses focus\n openerElement.addEventListener(\"blur\", handleOpenerBlur);\n }\n\n // Add ARIA attributes\n openerElement.setAttribute(\"aria-haspopup\", \"true\");\n openerElement.setAttribute(\"aria-expanded\", \"false\");\n\n // Get menu ID or generate one\n let menuId = component.element.id;\n if (!menuId) {\n menuId = `menu-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n component.element.id = menuId;\n }\n\n // Connect menu and opener with ARIA\n openerElement.setAttribute(\"aria-controls\", menuId);\n };\n\n /**\n * Applies active visual state to opener\n */\n const setOpenerActive = (active: boolean): void => {\n if (!state.openerElement) return;\n\n // Case 1: Component with setActive method (like our button component)\n if (\n state.openerComponent &&\n typeof state.openerComponent.setActive === \"function\"\n ) {\n state.openerComponent.setActive(active);\n return;\n }\n\n // Case 2: Component with selected property (like our chip component)\n if (state.openerComponent && \"selected\" in state.openerComponent) {\n state.openerComponent.selected = active;\n return;\n }\n\n // Case 3: Textfield component with focus/blur methods\n if (\n state.openerComponent &&\n typeof state.openerComponent.focus === \"function\" &&\n typeof state.openerComponent.blur === \"function\"\n ) {\n if (active) {\n state.openerComponent.focus();\n } else {\n state.openerComponent.blur();\n }\n return;\n }\n\n // Case 4: Standard DOM element fallback with classes\n if (state.openerElement.classList) {\n if (active) {\n state.openerElement.classList.add(state.activeClass);\n } else {\n state.openerElement.classList.remove(state.activeClass);\n }\n }\n };\n\n /**\n * Restores focus to the opener properly\n * Handles both component and element cases\n */\n const restoreFocusToOpener = (): void => {\n // Skip if we don't have a valid opener\n if (!state.openerElement) return;\n\n // Case 1: Component with focus method\n if (\n state.openerComponent &&\n typeof state.openerComponent.focus === \"function\"\n ) {\n requestAnimationFrame(() => {\n state.openerComponent.focus();\n });\n return;\n }\n\n // Case\n\n // Case 2: Component with input that can be focused (like textfield)\n if (\n state.openerComponent &&\n \"input\" in state.openerComponent &&\n state.openerComponent.input instanceof HTMLElement\n ) {\n requestAnimationFrame(() => {\n state.openerComponent.input.focus();\n });\n return;\n }\n\n // Case 3: Default - focus the element directly\n requestAnimationFrame(() => {\n state.openerElement.focus();\n });\n };\n\n /**\n * Handles opener element click\n */\n const handleOpenerClick = (e: MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n\n // Toggle menu visibility with mouse interaction type\n if (component.menu) {\n const isOpen = component.menu.isOpen();\n\n if (isOpen) {\n component.menu.close(e);\n } else {\n component.menu.open(e, \"mouse\");\n }\n }\n };\n\n /**\n * Handles keyboard events on the opener element\n */\n const handleOpenerKeydown = (e: KeyboardEvent): void => {\n // Only handle events if we have a menu controller\n if (!component.menu) return;\n\n // Determine if menu is currently open\n const isOpen = component.menu.isOpen();\n\n switch (e.key) {\n case \"Enter\":\n case \" \": // Space\n case \"ArrowDown\":\n case \"Down\":\n // Prevent default browser behavior\n e.preventDefault();\n\n // Open menu if closed, with keyboard interaction type\n if (!isOpen) {\n component.menu.open(e, \"keyboard\");\n }\n break;\n\n case \"Escape\":\n // Close the menu if it's open\n if (isOpen) {\n e.preventDefault();\n component.menu.close(e);\n }\n break;\n\n case \"ArrowUp\":\n case \"Up\":\n e.preventDefault();\n\n // Special case: open menu with focus on last item\n if (!isOpen) {\n component.menu.open(e, \"keyboard\");\n\n // Wait for menu to open and grab the last item\n setTimeout(() => {\n const items = component.element.querySelectorAll(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\"menu-item--disabled\")})`,\n ) as NodeListOf<HTMLElement>;\n\n if (items.length > 0) {\n // Reset tabindex for all items\n items.forEach((item) => item.setAttribute(\"tabindex\", \"-1\"));\n\n // Set the last item as active\n const lastItem = items[items.length - 1];\n lastItem.setAttribute(\"tabindex\", \"0\");\n lastItem.focus();\n }\n }, 100);\n }\n break;\n }\n };\n\n /**\n * Handles opener blur/focusout events\n */\n const handleOpenerBlur = (e: FocusEvent): void => {\n // Only handle events if we have a menu controller and menu is open\n if (!component.menu || !component.menu.isOpen()) return;\n\n // Get the related target (element receiving focus)\n const relatedTarget = e.relatedTarget as HTMLElement;\n\n // If this is tab navigation, always close the menu regardless of next focus target\n if (isTabNavigation) {\n setTimeout(() => {\n // Verify menu is still open (may have been closed in the meantime)\n if (component.menu && component.menu.isOpen()) {\n // Close the menu but don't restore focus\n component.menu.close(e, false);\n }\n }, 10);\n return;\n }\n\n // For non-tab navigation (like mouse clicks):\n // Don't close if focus is moving to any of these:\n // 1. To the menu itself\n // 2. To a child of the menu\n // 3. To another menu button/opener\n if (relatedTarget) {\n // Check if focus moved to menu or its children\n if (component.element.contains(relatedTarget)) {\n return;\n }\n\n // Check if focus moved to another menu button/opener (has aria-haspopup)\n if (\n relatedTarget.getAttribute(\"aria-haspopup\") === \"true\" ||\n relatedTarget.closest('[aria-haspopup=\"true\"]')\n ) {\n return;\n }\n }\n\n // Wait a brief moment to ensure we're not in the middle of another operation\n // This helps prevent conflicts with click handlers\n setTimeout(() => {\n // Verify menu is still open (may have been closed in the meantime)\n if (component.menu && component.menu.isOpen()) {\n // Close the menu but don't restore focus since focus has moved elsewhere\n component.menu.close(e, false);\n }\n }, 50);\n };\n\n /**\n * Removes event listeners from opener\n */\n const cleanup = (): void => {\n if (state.openerElement) {\n if (!config.manualOpen) {\n state.openerElement.removeEventListener(\"click\", handleOpenerClick);\n state.openerElement.removeEventListener(\"keydown\", handleOpenerKeydown);\n state.openerElement.removeEventListener(\"blur\", handleOpenerBlur);\n }\n state.openerElement.removeAttribute(\"aria-haspopup\");\n state.openerElement.removeAttribute(\"aria-expanded\");\n state.openerElement.removeAttribute(\"aria-controls\");\n\n // Clean up active state if present\n setOpenerActive(false);\n }\n\n // Reset state\n state.openerComponent = null;\n state.openerElement = null;\n state.activeClass = \"\";\n };\n\n // Initialize with provided opener\n const { element, component: openerComponent } = resolveOpener(config.opener);\n setupOpenerEvents({ element, component: openerComponent });\n\n // Register with lifecycle if available\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy || (() => {});\n component.lifecycle.destroy = () => {\n cleanup();\n originalDestroy();\n };\n }\n\n // Listen for menu state changes to update opener\n component.on(\"open\", () => {\n if (state.openerElement) {\n state.openerElement.setAttribute(\"aria-expanded\", \"true\");\n setOpenerActive(true);\n }\n });\n\n component.on(\"close\", (event) => {\n if (state.openerElement) {\n // Always update ARIA attributes\n state.openerElement.setAttribute(\"aria-expanded\", \"false\");\n setOpenerActive(false);\n\n // Handle focus restoration when requested\n if (event.restoreFocus && !isTabNavigation) {\n restoreFocusToOpener();\n }\n }\n });\n\n // Return enhanced component\n return {\n ...component,\n opener: {\n /**\n * Sets a new opener element\n * @param opener - New opener element, selector, or component\n * @returns Component for chaining\n */\n setOpener(opener: any) {\n const resolved = resolveOpener(opener);\n if (resolved.element) {\n setupOpenerEvents(resolved);\n }\n return component;\n },\n\n /**\n * Gets the current opener element\n * @returns Current opener element\n */\n getOpener() {\n return state.openerElement;\n },\n\n /**\n * Gets the current opener component if available\n * @returns Current opener component or null\n */\n getOpenerComponent() {\n return state.openerComponent;\n },\n\n /**\n * Sets the active state of the opener\n * @param active - Whether opener should appear active\n * @returns Component for chaining\n */\n setActive(active: boolean) {\n setOpenerActive(active);\n return component;\n },\n\n /**\n * Restores focus to the opener\n * @returns Component for chaining\n */\n focus() {\n restoreFocusToOpener();\n return component;\n },\n },\n };\n};\n\nexport default withOpener;\n",
|
|
150
153
|
"// src/components/menu/features/position.ts\n\nimport { MenuConfig } from \"../types\";\n\n/**\n * Menu position helper\n * Provides functions for positioning menus and submenus\n */\nexport const createPositioner = (component, config: MenuConfig) => {\n /**\n * Positions the menu relative to its opener\n * Ensures the menu maintains proper spacing from viewport edges\n * Makes sure the menu stays attached to opener during scrolling\n *\n * @param menuElement - The menu element to position\n * @param openerElement - The element to opener against\n * @param preferredPosition - The preferred position\n * @param isSubmenu - Whether this is a submenu (affects positioning logic)\n */\n const positionElement = (\n menuElement: HTMLElement,\n openerElement: HTMLElement,\n preferredPosition: string,\n isSubmenu = false,\n ): void => {\n if (!menuElement || !openerElement) return;\n\n // Check if menu is inside a container (not document.body)\n const hasContainer = config.container && config.container !== document.body;\n\n // Ensure menu is positioned absolutely for proper scroll behavior\n menuElement.style.position = \"absolute\";\n\n // Get current scroll position - critical for absolute positioning that tracks opener\n // When inside a container, we position relative to the container, not the viewport\n const scrollX = hasContainer\n ? 0\n : window.pageXOffset || document.documentElement.scrollLeft;\n const scrollY = hasContainer\n ? 0\n : window.pageYOffset || document.documentElement.scrollTop;\n\n // Get opener measurements first (needed for width calculation)\n const openerRect = openerElement.getBoundingClientRect();\n\n // Make a copy of the menu for measurement without affecting the real menu\n const tempMenu = menuElement.cloneNode(true) as HTMLElement;\n\n // Make the temp menu visible but not displayed for measurement\n tempMenu.style.visibility = \"hidden\";\n tempMenu.style.display = \"block\";\n tempMenu.style.position = \"absolute\";\n tempMenu.style.top = \"0\";\n tempMenu.style.left = \"0\";\n tempMenu.style.transform = \"none\";\n tempMenu.style.opacity = \"0\";\n tempMenu.style.pointerEvents = \"none\";\n tempMenu.classList.add(`${component.getClass(\"menu--visible\")}`); // Add visible class for proper dimensions\n\n // Apply width to temp menu BEFORE measuring if config specifies 100% width\n // This ensures we measure with the correct width on first open\n if (config.width === \"100%\" && !isSubmenu) {\n tempMenu.style.width = `${openerRect.width}px`;\n }\n\n // Add it to the DOM temporarily (use container if available for accurate measurement)\n const measureContainer = config.container || document.body;\n measureContainer.appendChild(tempMenu);\n\n // Get measurements\n const menuRect = tempMenu.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Remove the temp element after measurements\n measureContainer.removeChild(tempMenu);\n\n // Get values needed for calculations\n const offset = config.offset !== undefined ? config.offset : 8;\n\n // Calculate position based on position\n let top = 0;\n let left = 0;\n let calculatedPosition = preferredPosition;\n\n // Different positioning logic for main menu vs submenu\n if (isSubmenu) {\n // Default position is to the right of parent\n calculatedPosition = preferredPosition || \"right-start\";\n\n // Check if this would push the submenu out of the viewport\n if (\n calculatedPosition.startsWith(\"right\") &&\n openerRect.right + menuRect.width + offset > viewportWidth - 16\n ) {\n // Flip to the left side if it doesn't fit on the right\n calculatedPosition = calculatedPosition.replace(\"right\", \"left\");\n } else if (\n calculatedPosition.startsWith(\"left\") &&\n openerRect.left - menuRect.width - offset < 16\n ) {\n // Flip to the right side if it doesn't fit on the left\n calculatedPosition = calculatedPosition.replace(\"left\", \"right\");\n }\n\n // Check vertical positioning as well for submenus\n // If submenu would extend beyond the bottom of the viewport, adjust positioning\n if (openerRect.top + menuRect.height > viewportHeight - 48) {\n if (calculatedPosition === \"right-start\") {\n calculatedPosition = \"right-end\";\n } else if (calculatedPosition === \"left-start\") {\n calculatedPosition = \"left-end\";\n }\n }\n } else {\n // For main menu, follow the standard position calculation\n // First determine correct position based on original position\n switch (preferredPosition) {\n case \"top-start\":\n case \"top\":\n case \"top-end\":\n // Check if enough space above\n if (openerRect.top < menuRect.height + offset + 48) {\n // Not enough space above, flip to bottom\n calculatedPosition = preferredPosition.replace(\"top\", \"bottom\");\n }\n break;\n\n case \"bottom-start\":\n case \"bottom\":\n case \"bottom-end\":\n // Check if enough space below\n if (\n openerRect.bottom + menuRect.height + offset + 48 >\n viewportHeight\n ) {\n // Not enough space below, check if more space above\n if (openerRect.top > viewportHeight - openerRect.bottom) {\n // More space above, flip to top\n calculatedPosition = preferredPosition.replace(\"bottom\", \"top\");\n }\n }\n break;\n\n // Specifically handle right-start, right, left-start, and left positions\n case \"right-start\":\n case \"right\":\n case \"left-start\":\n case \"left\":\n // Check if enough space below for these side positions\n if (openerRect.bottom + menuRect.height > viewportHeight - 48) {\n // Not enough space below, shift the menu upward\n if (preferredPosition === \"right-start\") {\n calculatedPosition = \"right-end\";\n } else if (preferredPosition === \"left-start\") {\n calculatedPosition = \"left-end\";\n } else if (preferredPosition === \"right\") {\n // For center aligned, shift up by half menu height plus some spacing\n top =\n openerRect.top - (menuRect.height - openerRect.height) - offset;\n } else if (preferredPosition === \"left\") {\n // For center aligned, shift up by half menu height plus some spacing\n top =\n openerRect.top - (menuRect.height - openerRect.height) - offset;\n }\n }\n break;\n }\n }\n\n // Reset any existing position classes\n const positionClasses = [\n \"position-top\",\n \"position-bottom\",\n \"position-right\",\n \"position-left\",\n ];\n\n positionClasses.forEach((posClass) => {\n menuElement.classList.remove(\n `${component.getClass(\"menu\")}--${posClass}`,\n );\n });\n\n // Determine transform origin based on vertical position\n // Start by checking the calculated position to determine transform origin\n const menuAppearsAboveOpener =\n calculatedPosition.startsWith(\"top\") ||\n calculatedPosition === \"right-end\" ||\n calculatedPosition === \"left-end\" ||\n (calculatedPosition === \"right\" && top < openerRect.top) ||\n (calculatedPosition === \"left\" && top < openerRect.top);\n\n if (menuAppearsAboveOpener) {\n menuElement.classList.add(`${component.getClass(\"menu\")}--position-top`);\n } else if (calculatedPosition.startsWith(\"left\")) {\n menuElement.classList.add(`${component.getClass(\"menu\")}--position-left`);\n } else if (calculatedPosition.startsWith(\"right\")) {\n menuElement.classList.add(\n `${component.getClass(\"menu\")}--position-right`,\n );\n } else {\n menuElement.classList.add(\n `${component.getClass(\"menu\")}--position-bottom`,\n );\n }\n\n // Position calculation - important: getBoundingClientRect() returns values relative to viewport\n // We need to add scroll position to get absolute position (unless we have a container)\n // When inside a container, position relative to the container\n const containerRect =\n hasContainer && config.container\n ? config.container.getBoundingClientRect()\n : { top: 0, left: 0, right: 0, bottom: 0 };\n\n // Calculate offsets - when in a container, subtract container position\n const offsetX = hasContainer ? -containerRect.left : scrollX;\n const offsetY = hasContainer ? -containerRect.top : scrollY;\n\n switch (calculatedPosition) {\n case \"top-start\":\n top = openerRect.top + offsetY - menuRect.height - offset;\n left = openerRect.left + offsetX;\n break;\n case \"top\":\n top = openerRect.top + offsetY - menuRect.height - offset;\n left =\n openerRect.left + offsetX + openerRect.width / 2 - menuRect.width / 2;\n break;\n case \"top-end\":\n top = openerRect.top + offsetY - menuRect.height - offset;\n left = openerRect.right + offsetX - menuRect.width;\n break;\n case \"right-start\":\n top = openerRect.top + offsetY;\n left = openerRect.right + offsetX + offset;\n break;\n case \"right\":\n // Custom top position might be set above; only set if not already defined\n if (top === 0) {\n top =\n openerRect.top +\n offsetY +\n openerRect.height / 2 -\n menuRect.height / 2;\n } else {\n top += offsetY;\n }\n left = openerRect.right + offsetX + offset;\n break;\n case \"right-end\":\n top = openerRect.bottom + offsetY - menuRect.height;\n left = openerRect.right + offsetX + offset;\n break;\n case \"bottom-start\":\n top = openerRect.bottom + offsetY + offset;\n left = openerRect.left + offsetX;\n break;\n case \"bottom\":\n top = openerRect.bottom + offsetY + offset;\n left =\n openerRect.left + offsetX + openerRect.width / 2 - menuRect.width / 2;\n break;\n case \"bottom-end\":\n top = openerRect.bottom + offsetY + offset;\n left = openerRect.right + offsetX - menuRect.width;\n break;\n case \"left-start\":\n top = openerRect.top + offsetY;\n left = openerRect.left + offsetX - menuRect.width - offset;\n break;\n case \"left\":\n // Custom top position might be set above; only set if not already defined\n if (top === 0) {\n top =\n openerRect.top +\n offsetY +\n openerRect.height / 2 -\n menuRect.height / 2;\n } else {\n top += offsetY;\n }\n left = openerRect.left + offsetX - menuRect.width - offset;\n break;\n case \"left-end\":\n top = openerRect.bottom + offsetY - menuRect.height;\n left = openerRect.left + offsetX - menuRect.width - offset;\n break;\n }\n\n // Ensure the menu has proper spacing from viewport edges\n // Skip viewport edge checks when inside a container\n if (hasContainer) {\n // For container-based positioning, just apply the calculated positions\n menuElement.style.top = `${top}px`;\n menuElement.style.left = `${left}px`;\n\n // For 'width: 100%' configuration, match the opener width\n if (config.width === \"100%\" && !isSubmenu) {\n menuElement.style.width = `${openerRect.width}px`;\n }\n\n // Apply maxHeight if configured\n if (config.maxHeight) {\n menuElement.style.maxHeight = config.maxHeight;\n }\n\n return; // Exit early for container-based menus\n }\n\n // Top edge spacing - ensure the menu doesn't go above the viewport + padding\n const minTopSpacing = 48; // Minimum distance from top of viewport\n if (top - scrollY < minTopSpacing) {\n top = minTopSpacing + scrollY;\n }\n\n // Bottom edge spacing - ensure the menu doesn't go below the viewport - padding\n const viewportBottomMargin = 48; // Minimum space from bottom of viewport\n const bottomEdge = top - scrollY + menuRect.height;\n\n if (bottomEdge > viewportHeight - viewportBottomMargin) {\n // Option 1: We could adjust the top position\n // top = scrollY + viewportHeight - viewportBottomMargin - menuRect.height;\n\n // Option 2: Instead of moving the menu, adjust its height to fit (better UX)\n const availableHeight =\n viewportHeight - (top - scrollY) - viewportBottomMargin;\n\n // Set a minimum height to prevent tiny menus\n const minMenuHeight = Math.min(menuRect.height, 100);\n const newMaxHeight = Math.max(availableHeight, minMenuHeight);\n\n // Update maxHeight to fit within viewport\n menuElement.style.maxHeight = `${newMaxHeight}px`;\n\n // If user has explicitly set a maxHeight, respect it if smaller\n if (config.maxHeight) {\n const configMaxHeight = parseInt(config.maxHeight, 10);\n if (\n !isNaN(configMaxHeight) &&\n configMaxHeight < parseInt(menuElement.style.maxHeight || \"0\", 10)\n ) {\n menuElement.style.maxHeight = config.maxHeight;\n }\n }\n } else {\n // If there's plenty of space, use the config's maxHeight (if provided)\n if (config.maxHeight) {\n menuElement.style.maxHeight = config.maxHeight;\n }\n }\n\n // For 'width: 100%' configuration, match the opener width\n if (config.width === \"100%\" && !isSubmenu) {\n menuElement.style.width = `${openerRect.width}px`;\n }\n\n // Apply final positions, ensuring menu stays within viewport\n // The position is absolute, not fixed, so it must account for scroll\n const finalTop = Math.max(minTopSpacing + scrollY, top);\n const finalLeft = Math.max(16 + scrollX, left);\n\n menuElement.style.top = `${finalTop}px`;\n menuElement.style.left = `${finalLeft}px`;\n\n // Make sure menu doesn't extend past right edge\n if (finalLeft - scrollX + menuRect.width > viewportWidth - 16) {\n // If we're going past the right edge, set right with fixed distance from edge\n menuElement.style.left = \"auto\";\n menuElement.style.right = \"16px\";\n }\n };\n\n /**\n * Positions the main menu relative to its opener\n */\n const positionMenu = (openerElement: HTMLElement): void => {\n if (!openerElement || !component.element) return;\n positionElement(component.element, openerElement, config.position, false);\n };\n\n /**\n * Positions a submenu relative to its parent menu item\n * For deeply nested submenus, alternates side placement (right/left)\n * @param submenuElement - The submenu element to position\n * @param parentItemElement - The parent menu item element\n * @param level - Nesting level for calculating position\n */\n const positionSubmenu = (\n submenuElement: HTMLElement,\n parentItemElement: HTMLElement,\n level: number = 1,\n ): void => {\n if (!submenuElement || !parentItemElement) return;\n\n // Alternate between right and left positioning for deeper nesting levels\n // This helps prevent menus from cascading off the screen\n const prefPosition = level % 2 === 1 ? \"right-start\" : \"left-start\";\n\n // Use higher z-index for deeper nested menus to ensure proper layering\n submenuElement.style.zIndex = `${1000 + level * 10}`;\n\n positionElement(submenuElement, parentItemElement, prefPosition, true);\n };\n\n return {\n positionMenu,\n positionSubmenu,\n positionElement,\n };\n};\n\n/**\n * Adds positioning functionality to the menu component\n *\n * @param config - Menu configuration options\n * @returns Component enhancer with positioning functionality\n */\nconst withPosition = (config: MenuConfig) => (component) => {\n // Do nothing if no element\n if (!component.element) {\n return component;\n }\n\n // Create the positioner\n const positioner = createPositioner(component, config);\n\n // Return enhanced component\n return {\n ...component,\n position: positioner,\n };\n};\n\nexport default withPosition;\n",
|
|
151
154
|
"// src/components/menu/features/keyboard.ts\n\nimport { MenuItem } from \"../types\";\n\n/**\n * Keyboard navigation handler for menus\n * Manages focus management and keyboard interactions for accessibility\n */\nexport const createKeyboardNavigation = (component) => {\n // Track tab navigation state\n let isTabNavigation = false;\n\n // Typeahead search state\n let typeaheadBuffer = \"\";\n let typeaheadTimeout: ReturnType<typeof setTimeout> | null = null;\n const TYPEAHEAD_DELAY = 500; // Reset buffer after 500ms of no typing\n\n // Add event listener to detect Tab key navigation\n const setupTabKeyDetection = () => {\n document.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n // Set flag when Tab key is pressed\n isTabNavigation = e.key === \"Tab\";\n\n // Reset flag after a short delay\n setTimeout(() => {\n isTabNavigation = false;\n }, 100);\n });\n };\n\n // Call setup once\n setupTabKeyDetection();\n\n /**\n * Gets all focusable elements in the document\n * Useful for Tab navigation management\n */\n const getFocusableElements = (): HTMLElement[] => {\n // Query all potentially focusable elements\n const focusableElementsString =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n const elements = document.querySelectorAll(\n focusableElementsString,\n ) as NodeListOf<HTMLElement>;\n\n // Convert to array and filter out hidden elements\n return Array.from(elements).filter((element) => {\n return (\n element.offsetParent !== null && !element.classList.contains(\"hidden\")\n );\n });\n };\n\n /**\n * Resets the typeahead search buffer\n */\n const resetTypeahead = (): void => {\n typeaheadBuffer = \"\";\n if (typeaheadTimeout) {\n clearTimeout(typeaheadTimeout);\n typeaheadTimeout = null;\n }\n };\n\n /**\n * Sets up initial focus within the menu\n * @param menuElement - The menu element to set focus within\n * @param interactionType - Type of interaction that opened the menu\n */\n const handleInitialFocus = (\n menuElement: HTMLElement,\n interactionType: \"keyboard\" | \"mouse\",\n ): void => {\n // Reset typeahead when menu opens\n resetTypeahead();\n\n if (interactionType === \"keyboard\") {\n // Find all focusable items\n const items = Array.from(\n menuElement.querySelectorAll(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\n \"menu-item--disabled\",\n )})`,\n ),\n ) as HTMLElement[];\n\n if (items.length > 0) {\n // Set tabindex on first item and focus it\n items[0].setAttribute(\"tabindex\", \"0\");\n items[0].focus();\n } else {\n // If no items, focus the menu itself\n menuElement.setAttribute(\"tabindex\", \"0\");\n menuElement.focus();\n }\n } else {\n // For mouse interaction, make the menu focusable but don't auto-focus\n menuElement.setAttribute(\"tabindex\", \"-1\");\n\n // Still set up the first item as focusable\n const firstItem = menuElement.querySelector(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\n \"menu-item--disabled\",\n )})`,\n ) as HTMLElement;\n if (firstItem) {\n firstItem.setAttribute(\"tabindex\", \"0\");\n }\n }\n };\n\n /**\n * Handles keydown events on the menu or submenu\n */\n const handleMenuKeydown = (\n e: KeyboardEvent,\n state: any,\n actions: {\n closeMenu: (event: Event, restoreFocus?: boolean) => void;\n closeSubmenu: (level: number) => void;\n findItemById: (id: string) => MenuItem | null;\n handleSubmenuClick: (\n item: MenuItem,\n index: number,\n itemElement: HTMLElement,\n ) => void;\n handleNestedSubmenuClick: (\n item: MenuItem,\n index: number,\n itemElement: HTMLElement,\n ) => void;\n },\n ): void => {\n // Determine if this event is from the main menu or a submenu\n const isSubmenu =\n state.activeSubmenu && state.activeSubmenu.contains(e.target as Node);\n\n // Get the appropriate menu element\n const menuElement = isSubmenu ? state.activeSubmenu : component.element;\n\n // Get all non-disabled menu items from the current menu\n const items = Array.from(\n menuElement.querySelectorAll(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\n \"menu-item--disabled\",\n )})`,\n ),\n ) as HTMLElement[];\n\n if (items.length === 0) return;\n\n // Find the currently focused item\n const focusedElement = document.activeElement as HTMLElement;\n let focusedItemIndex = -1;\n\n if (focusedElement && items.includes(focusedElement)) {\n focusedItemIndex = items.indexOf(focusedElement);\n }\n\n // Simplified focus function\n const focusItem = (index: number) => {\n if (items[index]) {\n items[index].focus();\n }\n };\n\n // Handle typeahead search for printable characters\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n e.preventDefault();\n e.stopPropagation();\n\n // Add character to buffer\n typeaheadBuffer += e.key.toLowerCase();\n\n // Clear existing timeout\n if (typeaheadTimeout) {\n clearTimeout(typeaheadTimeout);\n }\n\n // Set timeout to reset buffer\n typeaheadTimeout = setTimeout(() => {\n typeaheadBuffer = \"\";\n typeaheadTimeout = null;\n }, TYPEAHEAD_DELAY);\n\n // Find matching item\n const matchIndex = items.findIndex((item) => {\n const textElement = item.querySelector(\n `.${component.getClass(\"menu-item-text\")}`,\n );\n const text = textElement?.textContent?.toLowerCase() || \"\";\n return text.startsWith(typeaheadBuffer);\n });\n\n if (matchIndex !== -1) {\n focusItem(matchIndex);\n } else if (typeaheadBuffer.length > 1) {\n // If no match with multiple chars, try just the last character\n const lastChar = typeaheadBuffer.slice(-1);\n const singleCharMatch = items.findIndex((item) => {\n const textElement = item.querySelector(\n `.${component.getClass(\"menu-item-text\")}`,\n );\n const text = textElement?.textContent?.toLowerCase() || \"\";\n return text.startsWith(lastChar);\n });\n\n if (singleCharMatch !== -1) {\n typeaheadBuffer = lastChar; // Reset buffer to just this char\n focusItem(singleCharMatch);\n }\n }\n\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n case \"Down\":\n e.preventDefault();\n e.stopPropagation();\n if (focusedItemIndex < 0) {\n focusItem(0);\n } else if (focusedItemIndex < items.length - 1) {\n focusItem(focusedItemIndex + 1);\n } else {\n focusItem(0); // Wrap to first\n }\n break;\n\n case \"ArrowUp\":\n case \"Up\":\n e.preventDefault();\n e.stopPropagation();\n if (focusedItemIndex < 0) {\n focusItem(items.length - 1);\n } else if (focusedItemIndex > 0) {\n focusItem(focusedItemIndex - 1);\n } else {\n focusItem(items.length - 1); // Wrap to last\n }\n break;\n\n case \"Home\":\n e.preventDefault();\n e.stopPropagation();\n focusItem(0);\n break;\n\n case \"End\":\n e.preventDefault();\n e.stopPropagation();\n focusItem(items.length - 1);\n break;\n\n case \"Enter\":\n case \" \":\n e.preventDefault();\n e.stopPropagation();\n if (focusedItemIndex >= 0) {\n items[focusedItemIndex].click();\n }\n break;\n\n case \"ArrowRight\":\n case \"Right\":\n e.preventDefault();\n e.stopPropagation();\n if (isSubmenu) {\n // In a submenu, right arrow opens nested submenus\n if (\n focusedItemIndex >= 0 &&\n items[focusedItemIndex].classList.contains(\n `${component.getClass(\"menu-item--submenu\")}`,\n )\n ) {\n const itemElement = items[focusedItemIndex];\n const itemIndex = parseInt(\n itemElement.getAttribute(\"data-index\"),\n 10,\n );\n const parentMenu = itemElement.closest(\n `.${component.getClass(\"menu--submenu\")}`,\n );\n const parentItemId = parentMenu?.getAttribute(\"data-parent-item\");\n\n // Find the parent item in the items array to get its submenu\n const parentItem = actions.findItemById(parentItemId);\n if (parentItem && parentItem.submenu) {\n const itemData = parentItem.submenu[itemIndex] as MenuItem;\n actions.handleNestedSubmenuClick(\n itemData,\n itemIndex,\n itemElement,\n );\n }\n }\n } else {\n // In main menu, right arrow opens a submenu\n if (\n focusedItemIndex >= 0 &&\n items[focusedItemIndex].classList.contains(\n `${component.getClass(\"menu-item--submenu\")}`,\n )\n ) {\n // Get the correct menu item data\n const itemElement = items[focusedItemIndex];\n const itemIndex = parseInt(\n itemElement.getAttribute(\"data-index\"),\n 10,\n );\n const itemData = state.items[itemIndex] as MenuItem;\n\n // Open submenu\n actions.handleSubmenuClick(itemData, itemIndex, itemElement);\n }\n }\n break;\n\n case \"ArrowLeft\":\n case \"Left\":\n e.preventDefault();\n e.stopPropagation();\n if (isSubmenu) {\n // In a submenu, left arrow returns to the parent menu\n if (state.activeSubmenuItem) {\n // Store the reference to the parent item before closing the submenu\n const parentItem = state.activeSubmenuItem;\n\n // Get the current level\n const currentLevel = parseInt(\n menuElement.getAttribute(\"data-level\") || \"1\",\n 10,\n );\n\n // Close this level of submenu\n actions.closeSubmenu(currentLevel);\n\n // Focus the parent item after closing\n if (parentItem) {\n parentItem.focus();\n }\n } else {\n actions.closeSubmenu(1);\n }\n }\n break;\n\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n if (isSubmenu) {\n // In a submenu, Escape closes just the submenu\n if (state.activeSubmenuItem) {\n // Store the reference to the parent item before closing the submenu\n const parentItem = state.activeSubmenuItem;\n\n // Get the current level\n const currentLevel = parseInt(\n menuElement.getAttribute(\"data-level\") || \"1\",\n 10,\n );\n\n // Close this level of submenu\n actions.closeSubmenu(currentLevel);\n\n // Focus the parent item after closing\n if (parentItem) {\n parentItem.focus();\n }\n } else {\n actions.closeSubmenu(1);\n }\n } else {\n // In main menu, Escape closes the entire menu and restores focus to opener\n actions.closeMenu(e, true);\n }\n break;\n\n case \"Tab\":\n // Clear typeahead buffer when closing\n typeaheadBuffer = \"\";\n if (typeaheadTimeout) {\n clearTimeout(typeaheadTimeout);\n typeaheadTimeout = null;\n }\n\n // Close the menu when tabbing out and move focus to next focusable element\n e.preventDefault();\n\n // Find the opener element\n const openerElement = component.opener?.getOpener?.();\n\n // Always close the menu\n actions.closeMenu(e, true); // Pass true to restore focus to opener\n\n // If we want to move to the next/previous focusable element after the opener:\n if (openerElement) {\n // Let the browser focus the opener first (happens because we passed true above)\n // Then we can optionally set a timeout to move to next element\n setTimeout(() => {\n // Optional: If you want to move focus to next/prev element after restoring to opener\n if (e.shiftKey) {\n // For shift+tab, we could let natural tabbing continue from the opener\n } else {\n // For tab, we could programmatically focus the next element\n const focusableElements = getFocusableElements();\n const openerIndex = focusableElements.indexOf(openerElement);\n if (\n openerIndex >= 0 &&\n openerIndex < focusableElements.length - 1\n ) {\n focusableElements[openerIndex + 1].focus();\n }\n }\n }, 0);\n }\n break;\n }\n };\n\n /**\n * Set up keydown handler for a menu element\n */\n const setupKeyboardHandlers = (\n menuElement: HTMLElement,\n state: any,\n actions: any,\n ) => {\n // Make all menu items focusable via keyboard navigation\n const items = menuElement.querySelectorAll(\n `.${component.getClass(\"menu-item\")}:not(.${component.getClass(\n \"menu-item--disabled\",\n )})`,\n ) as NodeListOf<HTMLElement>;\n items.forEach((item) => {\n item.tabIndex = -1;\n });\n\n // Set first item as focusable\n if (items.length > 0) {\n items[0].tabIndex = 0;\n }\n\n menuElement.addEventListener(\"keydown\", (e) =>\n handleMenuKeydown(e, state, actions),\n );\n };\n\n /**\n * Checks if current interaction is tab navigation\n */\n const isTabNavigationActive = () => isTabNavigation;\n\n // Return the public API\n return {\n handleInitialFocus,\n handleMenuKeydown,\n setupKeyboardHandlers,\n isTabNavigationActive,\n getFocusableElements,\n resetTypeahead,\n };\n};\n\n/**\n * Adds keyboard navigation functionality to the menu component\n *\n * @param config - Menu configuration\n * @returns Component enhancer with keyboard navigation functionality\n */\nconst withKeyboard = () => (component) => {\n if (!component.element) {\n return component;\n }\n\n // Create keyboard navigation controller\n const keyboard = createKeyboardNavigation(component);\n\n // Return enhanced component\n return {\n ...component,\n keyboard,\n };\n};\n\nexport default withKeyboard;\n",
|
|
152
155
|
"// src/components/menu/features/submenu.ts\n\nimport { MenuConfig, MenuItem } from \"../types\";\n\n/**\n * Adds submenu functionality to the menu component\n * Manages creation, positioning, and interaction with nested submenus\n *\n * @param config - Menu configuration\n * @returns Component enhancer with submenu functionality\n */\nconst withSubmenu = (config: MenuConfig) => (component) => {\n if (!component.element) {\n console.warn(\"Cannot initialize menu submenu: missing element\");\n return component;\n }\n\n // Initialize submenu state\n const state = {\n activeSubmenu: null as HTMLElement,\n activeSubmenuItem: null as HTMLElement,\n submenuLevel: 0, // Track nesting level of submenus\n activeSubmenus: [] as Array<{\n element: HTMLElement;\n menuItem: HTMLElement;\n level: number;\n isOpening: boolean; // Track if submenu is in opening transition\n }>,\n submenuTimer: null,\n hoverIntent: {\n timer: null,\n activeItem: null,\n },\n component,\n };\n\n /**\n * Clean up hover intent timer\n */\n const clearHoverIntent = () => {\n if (state.hoverIntent.timer) {\n clearTimeout(state.hoverIntent.timer);\n state.hoverIntent.timer = null;\n state.hoverIntent.activeItem = null;\n }\n };\n\n /**\n * Clear submenu close timer\n */\n const clearSubmenuTimer = () => {\n if (state.submenuTimer) {\n clearTimeout(state.submenuTimer);\n state.submenuTimer = null;\n }\n };\n\n /**\n * Handles hover on a submenu item\n */\n const handleSubmenuHover = (\n item: MenuItem,\n index: number,\n itemElement: HTMLElement\n ): void => {\n if (!config.openSubmenuOnHover || !item.hasSubmenu) return;\n\n // Clear any existing timers\n clearHoverIntent();\n clearSubmenuTimer();\n\n // Set hover intent\n state.hoverIntent.activeItem = itemElement;\n state.hoverIntent.timer = setTimeout(() => {\n const isCurrentlyHovered = itemElement.matches(\":hover\");\n if (isCurrentlyHovered) {\n // Only close and reopen if this is a different submenu item\n if (state.activeSubmenuItem !== itemElement) {\n openSubmenu(item, index, itemElement);\n }\n }\n state.hoverIntent.timer = null;\n }, 100);\n };\n\n /**\n * Handles mouse leave from submenu\n */\n const handleSubmenuLeave = (): void => {\n // Clear hover intent\n clearHoverIntent();\n\n // Don't close immediately to allow moving to submenu\n clearSubmenuTimer();\n\n // Set a timer to close the submenu if not re-entered\n state.submenuTimer = setTimeout(() => {\n // Check if mouse is over the submenu or the parent menu item\n const submenuElement = state.activeSubmenu;\n const menuItemElement = state.activeSubmenuItem;\n\n if (submenuElement && menuItemElement) {\n const overSubmenu = submenuElement.matches(\":hover\");\n const overMenuItem = menuItemElement.matches(\":hover\");\n\n if (!overSubmenu && !overMenuItem) {\n closeSubmenu(state.submenuLevel);\n }\n }\n\n state.submenuTimer = null;\n }, 300);\n };\n\n /**\n * Handles click on a submenu item\n */\n const handleSubmenuClick = (\n item: MenuItem,\n index: number,\n itemElement: HTMLElement\n ): void => {\n if (!item.submenu || !item.hasSubmenu) return;\n\n // Check if the submenu is already open\n const isOpen = itemElement.getAttribute(\"aria-expanded\") === \"true\";\n\n // Find if any submenu is currently in opening transition\n const anySubmenuTransitioning = state.activeSubmenus.some(\n (s) => s.isOpening\n );\n\n // Completely ignore clicks during any submenu transition\n if (anySubmenuTransitioning) {\n return;\n }\n\n if (isOpen) {\n // Close submenu - only if fully open\n // Find the closest submenu level\n const currentLevel = parseInt(\n itemElement\n .closest(`.${component.getClass(\"menu--submenu\")}`)\n ?.getAttribute(\"data-level\") || \"0\",\n 10\n );\n\n // Close this level + 1 and deeper\n closeSubmenu(currentLevel + 1);\n\n // Reset expanded state\n itemElement.setAttribute(\"aria-expanded\", \"false\");\n } else {\n // Open new submenu\n openSubmenu(item, index, itemElement);\n }\n };\n\n /**\n * Handles keyboard-triggered nested submenu click\n */\n const handleNestedSubmenuClick = (\n item: MenuItem,\n index: number,\n itemElement: HTMLElement\n ): void => {\n if (!item.submenu || !item.hasSubmenu) return;\n\n // Check if the submenu is already open\n const isOpen = itemElement.getAttribute(\"aria-expanded\") === \"true\";\n\n // Find if any submenu is currently in opening transition\n const anySubmenuTransitioning = state.activeSubmenus.some(\n (s) => s.isOpening\n );\n\n // Completely ignore clicks during any submenu transition\n if (anySubmenuTransitioning) {\n return;\n }\n\n if (isOpen) {\n // Find the closest submenu level\n const currentLevel = parseInt(\n itemElement\n .closest(`.${component.getClass(\"menu--submenu\")}`)\n ?.getAttribute(\"data-level\") || \"1\",\n 10\n );\n\n // Close submenus at and deeper than the next level\n closeSubmenu(currentLevel + 1);\n } else {\n // Open the nested submenu\n openSubmenu(item, index, itemElement);\n }\n };\n\n /**\n * Opens a submenu with proper animation and positioning\n */\n const openSubmenu = (\n item: MenuItem,\n index: number,\n itemElement: HTMLElement\n ): void => {\n if (!item.submenu || !item.hasSubmenu) return;\n\n // Get current level of the submenu we're opening\n const currentLevel = itemElement.closest(\n `.${component.getClass(\"menu--submenu\")}`\n )\n ? parseInt(\n itemElement\n .closest(`.${component.getClass(\"menu--submenu\")}`)\n .getAttribute(\"data-level\") || \"0\",\n 10\n ) + 1\n : 1;\n\n // Close any deeper level submenus first, preserving the current level\n closeSubmenu(currentLevel);\n\n // Check if this submenu is already in opening state - if so, do nothing\n const existingSubmenuIndex = state.activeSubmenus.findIndex(\n (s) => s.menuItem === itemElement && s.isOpening\n );\n if (existingSubmenuIndex >= 0) {\n return; // Already opening this submenu, don't restart the process\n }\n\n // Set expanded state\n itemElement.setAttribute(\"aria-expanded\", \"true\");\n\n // Create submenu element with proper classes and attributes\n const submenuElement = document.createElement(\"div\");\n submenuElement.className = `${component.getClass(\n \"menu\"\n )} ${component.getClass(\"menu--submenu\")}`;\n submenuElement.setAttribute(\"role\", \"menu\");\n submenuElement.setAttribute(\"tabindex\", \"-1\");\n submenuElement.setAttribute(\"data-level\", currentLevel.toString());\n submenuElement.setAttribute(\"data-parent-item\", item.id);\n\n // Increase z-index for each level of submenu\n submenuElement.style.zIndex = `${1000 + currentLevel * 10}`;\n\n // Create submenu list\n const submenuList = document.createElement(\"ul\");\n submenuList.className = `${component.getClass(\"menu-list\")}`;\n\n // Create submenu items\n const submenuItems = [];\n\n // Use event to get menu items created properly\n component.emit(\"create-menu-items\", {\n items: item.submenu,\n container: submenuList,\n level: currentLevel,\n onItemCreated: (itemElement) => {\n if (\n !itemElement.classList.contains(\n `${component.getClass(\"menu-item--disabled\")}`\n )\n ) {\n submenuItems.push(itemElement);\n }\n },\n });\n\n submenuElement.appendChild(submenuList);\n\n // Add to DOM to enable measurement and transitions\n document.body.appendChild(submenuElement);\n\n // Position the submenu using position component\n if (component.position && component.position.positionSubmenu) {\n component.position.positionSubmenu(\n submenuElement,\n itemElement,\n currentLevel\n );\n }\n\n // Setup keyboard navigation if available\n if (component.keyboard && component.keyboard.setupKeyboardHandlers) {\n component.keyboard.setupKeyboardHandlers(\n submenuElement,\n { activeSubmenus: state.activeSubmenus },\n {\n closeSubmenu,\n handleNestedSubmenuClick,\n }\n );\n }\n\n // Add mouseenter event to prevent closing\n submenuElement.addEventListener(\"mouseenter\", () => {\n clearSubmenuTimer();\n });\n\n // Add mouseleave event to handle closing\n submenuElement.addEventListener(\"mouseleave\", () => {\n handleSubmenuLeave();\n });\n\n // Update state with active submenu\n state.activeSubmenu = submenuElement;\n state.activeSubmenuItem = itemElement;\n\n // Add to active submenus array to maintain hierarchy\n state.activeSubmenus.push({\n element: submenuElement,\n menuItem: itemElement,\n level: currentLevel,\n isOpening: true, // Mark as in opening transition\n });\n\n // Update submenu level\n state.submenuLevel = currentLevel;\n\n // Add document events for this submenu\n document.addEventListener(\"click\", handleDocumentClickForSubmenu);\n window.addEventListener(\"resize\", handleWindowResizeForSubmenu, {\n passive: true,\n });\n window.addEventListener(\"scroll\", handleWindowScrollForSubmenu, {\n passive: true,\n });\n\n // Make visible with animation\n requestAnimationFrame(() => {\n submenuElement.classList.add(`${component.getClass(\"menu--visible\")}`);\n\n // Wait for transition to complete before marking as fully opened\n setTimeout(() => {\n // Find this submenu in the active submenus array and update its state\n const index = state.activeSubmenus.findIndex(\n (s) => s.element === submenuElement\n );\n if (index !== -1) {\n state.activeSubmenus[index].isOpening = false;\n }\n\n // Focus the first item in the submenu if keyboard navigation is being used\n if (submenuItems.length > 0) {\n // If we're at level 2 or above, we should always focus the first item\n if (currentLevel >= 2 || document.activeElement === itemElement) {\n submenuItems[0].setAttribute(\"tabindex\", \"0\");\n submenuItems[0].focus();\n }\n }\n }, 300); // Adjust to match your transition duration\n });\n\n // Emit event for other features to react\n component.emit(\"submenu-opened\", {\n submenuElement,\n parentItem: itemElement,\n level: currentLevel,\n item,\n });\n };\n\n /**\n * Closes submenus at or deeper than the specified level\n * @param level - The level to start closing from\n */\n const closeSubmenu = (level: number): void => {\n // Clear any hover intent or submenu timers\n clearHoverIntent();\n clearSubmenuTimer();\n\n // Find submenus at or deeper than the specified level\n const submenuIndicesToRemove = [];\n\n // Identify which submenus to remove, working from deepest level first\n for (let i = state.activeSubmenus.length - 1; i >= 0; i--) {\n if (state.activeSubmenus[i].level >= level) {\n const submenuToClose = state.activeSubmenus[i];\n\n // Set aria-expanded attribute to false on the parent menu item\n if (submenuToClose.menuItem) {\n submenuToClose.menuItem.setAttribute(\"aria-expanded\", \"false\");\n }\n\n // Hide with animation\n submenuToClose.element.classList.remove(\n `${component.getClass(\"menu--visible\")}`\n );\n\n // Schedule for removal\n setTimeout(() => {\n if (submenuToClose.element.parentNode) {\n submenuToClose.element.parentNode.removeChild(\n submenuToClose.element\n );\n }\n }, 200);\n\n // Mark for removal from state\n submenuIndicesToRemove.push(i);\n }\n }\n\n // Remove the closed submenus from state\n submenuIndicesToRemove.forEach((index) => {\n state.activeSubmenus.splice(index, 1);\n });\n\n // Update active submenu references based on what's left\n if (state.activeSubmenus.length > 0) {\n const deepestRemaining =\n state.activeSubmenus[state.activeSubmenus.length - 1];\n state.activeSubmenu = deepestRemaining.element;\n state.activeSubmenuItem = deepestRemaining.menuItem;\n state.submenuLevel = deepestRemaining.level;\n\n // If the parent menu item still has focus, keep it focused\n if (deepestRemaining.menuItem) {\n deepestRemaining.menuItem.focus();\n }\n } else {\n state.activeSubmenu = null;\n state.activeSubmenuItem = null;\n state.submenuLevel = 0;\n }\n\n // Emit event for other features to react\n component.emit(\"submenu-closed\", { level });\n };\n\n /**\n * Closes all submenus\n */\n const closeAllSubmenus = (): void => {\n // Clear timers\n clearHoverIntent();\n clearSubmenuTimer();\n\n if (state.activeSubmenus.length === 0) return;\n\n // Close all active submenus\n [...state.activeSubmenus].forEach((submenu) => {\n // Remove expanded state from parent item\n if (submenu.menuItem) {\n submenu.menuItem.setAttribute(\"aria-expanded\", \"false\");\n }\n\n // Remove submenu element with animation\n submenu.element.classList.remove(\n `${component.getClass(\"menu--visible\")}`\n );\n\n // Remove after animation\n setTimeout(() => {\n if (submenu.element.parentNode) {\n submenu.element.parentNode.removeChild(submenu.element);\n }\n }, 200);\n });\n\n // Clear state\n state.activeSubmenu = null;\n state.activeSubmenuItem = null;\n state.activeSubmenus = [];\n state.submenuLevel = 0;\n\n // Remove document events\n document.removeEventListener(\"click\", handleDocumentClickForSubmenu);\n window.removeEventListener(\"resize\", handleWindowResizeForSubmenu);\n window.removeEventListener(\"scroll\", handleWindowScrollForSubmenu);\n\n // Emit event for other features to react\n component.emit(\"all-submenus-closed\", {});\n };\n\n /**\n * Handles document click for submenu\n */\n const handleDocumentClickForSubmenu = (e: MouseEvent): void => {\n if (!state.activeSubmenu) return;\n\n const submenuElement = state.activeSubmenu;\n const menuItemElement = state.activeSubmenuItem;\n\n // Check if click was inside submenu or parent menu item\n if (\n submenuElement.contains(e.target as Node) ||\n (menuItemElement && menuItemElement.contains(e.target as Node))\n ) {\n return;\n }\n\n // Close submenu if clicked outside\n closeAllSubmenus();\n };\n\n /**\n * Handles window resize for submenu\n */\n const handleWindowResizeForSubmenu = (): void => {\n // Reposition open submenu on resize\n if (state.activeSubmenu && state.activeSubmenuItem && component.position) {\n component.position.positionSubmenu(\n state.activeSubmenu,\n state.activeSubmenuItem,\n state.submenuLevel\n );\n }\n };\n\n /**\n * Handles window scroll for submenu\n */\n const handleWindowScrollForSubmenu = (): void => {\n // Use requestAnimationFrame to optimize scroll performance\n window.requestAnimationFrame(() => {\n // Only reposition if we have an active submenu\n if (\n state.activeSubmenu &&\n state.activeSubmenuItem &&\n component.position\n ) {\n component.position.positionSubmenu(\n state.activeSubmenu,\n state.activeSubmenuItem,\n state.submenuLevel\n );\n }\n });\n };\n\n /**\n * Checks if any submenu is currently open\n */\n const hasOpenSubmenu = (): boolean => {\n return state.activeSubmenus.length > 0;\n };\n\n /**\n * Gets current submenu nesting level\n */\n const getSubmenuLevel = (): number => {\n return state.submenuLevel;\n };\n\n /**\n * Gets currently active submenu elements\n */\n const getActiveSubmenus = (): Array<{\n element: HTMLElement;\n menuItem: HTMLElement;\n level: number;\n isOpening: boolean;\n }> => {\n return [...state.activeSubmenus];\n };\n\n // Register with lifecycle if available\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy || (() => {});\n component.lifecycle.destroy = () => {\n // Clean up timers\n clearHoverIntent();\n clearSubmenuTimer();\n\n // Clean up submenu event listeners\n document.removeEventListener(\"click\", handleDocumentClickForSubmenu);\n window.removeEventListener(\"resize\", handleWindowResizeForSubmenu);\n window.removeEventListener(\"scroll\", handleWindowScrollForSubmenu);\n\n // Clean up submenu elements\n if (state.activeSubmenus.length > 0) {\n state.activeSubmenus.forEach((submenu) => {\n if (submenu.element.parentNode) {\n submenu.element.parentNode.removeChild(submenu.element);\n }\n });\n }\n\n originalDestroy();\n };\n }\n\n // Listen for menu close event to also close submenus\n component.on(\"menu-closing\", () => {\n closeAllSubmenus();\n });\n\n // Return enhanced component\n return {\n ...component,\n submenu: {\n openSubmenu,\n closeSubmenu,\n closeAllSubmenus,\n handleSubmenuClick,\n handleNestedSubmenuClick,\n handleSubmenuHover,\n handleSubmenuLeave,\n hasOpenSubmenu,\n getSubmenuLevel,\n getActiveSubmenus,\n },\n };\n};\n\nexport default withSubmenu;\n",
|
|
153
156
|
"// src/components/menu/api.ts\n\nimport { MenuComponent, MenuContent, MenuPosition, MenuEvents } from \"./types\";\n\n/**\n * API configuration options for menu component\n * @category Components\n * @internal\n */\ninterface ApiOptions {\n menu: {\n open: (event?: Event, interactionType?: \"mouse\" | \"keyboard\") => void;\n close: (\n event?: Event,\n restoreFocus?: boolean,\n skipAnimation?: boolean\n ) => void;\n toggle: (event?: Event, interactionType?: \"mouse\" | \"keyboard\") => void;\n isOpen: () => boolean;\n setItems: (items: MenuContent[]) => void;\n getItems: () => MenuContent[];\n setPosition: (position: MenuPosition) => void;\n getPosition: () => MenuPosition;\n setSelected: (itemId: string) => void;\n getSelected: () => string | null;\n };\n opener: {\n setOpener: (opener: HTMLElement | string) => void;\n getOpener: () => HTMLElement;\n };\n submenu?: {\n hasOpenSubmenu: () => boolean;\n closeAllSubmenus: () => void;\n };\n events?: {\n on: <T extends keyof MenuEvents>(event: T, handler: MenuEvents[T]) => void;\n off: <T extends keyof MenuEvents>(event: T, handler: MenuEvents[T]) => void;\n };\n lifecycle: {\n destroy: () => void;\n };\n}\n\n/**\n * Component with required elements and methods for API enhancement\n * @category Components\n * @internal\n */\ninterface ComponentWithElements {\n element: HTMLElement;\n on?: <T extends keyof MenuEvents>(event: T, handler: MenuEvents[T]) => void;\n off?: <T extends keyof MenuEvents>(event: T, handler: MenuEvents[T]) => void;\n emit?: (event: string, data: unknown) => void;\n}\n\n/**\n * Enhances a menu component with API methods.\n * This follows the higher-order function pattern to add public API methods\n * to the component, making them available to the end user.\n *\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @category Components\n * @internal This is an internal utility for the Menu component\n */\nconst withAPI =\n ({ menu, opener, events, lifecycle }: ApiOptions) =>\n (component: ComponentWithElements): MenuComponent => {\n // Create the enhanced component\n const menuComponent: MenuComponent = {\n element: component.element,\n\n /**\n * Opens the menu\n * @param event - Optional event that triggered the open\n * @param interactionType - The type of interaction that triggered the open ('mouse' or 'keyboard')\n * @returns Menu component for chaining\n */\n open(event?: Event, interactionType: \"mouse\" | \"keyboard\" = \"mouse\") {\n // Determine interaction type from event if not explicitly provided\n if (event && !interactionType) {\n if (event instanceof KeyboardEvent) {\n interactionType = \"keyboard\";\n }\n }\n\n menu.open(event, interactionType);\n return this;\n },\n\n /**\n * Closes the menu\n * @param event - Optional event that triggered the close\n * @returns Menu component for chaining\n */\n close(\n event?: Event,\n restoreFocus: boolean = true,\n skipAnimation: boolean = false\n ) {\n menu.close(event, restoreFocus, skipAnimation);\n return this;\n },\n\n /**\n * Toggles the menu's open state\n * @param event - Optional event that triggered the toggle\n * @param interactionType - The type of interaction that triggered the toggle\n * @returns Menu component for chaining\n */\n toggle(event?: Event, interactionType?: \"mouse\" | \"keyboard\") {\n // Determine interaction type from event if not explicitly provided\n if (event && !interactionType) {\n if (event instanceof KeyboardEvent) {\n interactionType = \"keyboard\";\n } else if (event instanceof MouseEvent) {\n interactionType = \"mouse\";\n }\n }\n\n menu.toggle(event, interactionType);\n return this;\n },\n\n /**\n * Checks if the menu is currently open\n * @returns True if the menu is open\n */\n isOpen() {\n return menu.isOpen();\n },\n\n /**\n * Updates the menu items\n * @param items - New array of menu items and dividers\n * @returns Menu component for chaining\n */\n setItems(items: MenuContent[]) {\n menu.setItems(items);\n return this;\n },\n\n /**\n * Gets the current menu items\n * @returns Array of current menu items and dividers\n */\n getItems() {\n return menu.getItems();\n },\n\n /**\n * Updates the menu's opener element\n * @param openerElement - New opener element or selector\n * @returns Menu component for chaining\n */\n setOpener(openerElement: HTMLElement | string) {\n opener.setOpener(openerElement);\n return this;\n },\n\n /**\n * Gets the current opener element\n * @returns Current opener element\n */\n getOpener() {\n return opener.getOpener();\n },\n\n /**\n * Updates the menu's position\n * @param position - New position value\n * @returns Menu component for chaining\n */\n setPosition(position: MenuPosition) {\n menu.setPosition(position);\n return this;\n },\n\n /**\n * Gets the current menu position\n * @returns Current position\n */\n getPosition() {\n return menu.getPosition();\n },\n\n /**\n * Sets the selected menu item\n * @param itemId - ID of the menu item to mark as selected\n * @returns Menu component for chaining\n */\n setSelected(itemId: string) {\n menu.setSelected(itemId);\n return this;\n },\n\n /**\n * Gets the currently selected menu item's ID\n * @returns ID of the selected menu item or null if none is selected\n */\n getSelected() {\n return menu.getSelected();\n },\n\n /**\n * Adds an event listener to the menu\n * @param event - Event name ('open', 'close', 'select')\n * @param handler - Event handler function\n * @returns Menu component for chaining\n */\n on<T extends keyof MenuEvents>(event: T, handler: MenuEvents[T]) {\n if (events?.on) {\n events.on(event, handler);\n } else if (component.on) {\n component.on(event, handler);\n }\n return this;\n },\n\n /**\n * Removes an event listener from the menu\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Menu component for chaining\n */\n off<T extends keyof MenuEvents>(event: T, handler: MenuEvents[T]) {\n if (events?.off) {\n events.off(event, handler);\n } else if (component.off) {\n component.off(event, handler);\n }\n return this;\n },\n\n /**\n * Destroys the menu component and cleans up resources\n */\n destroy() {\n lifecycle.destroy();\n },\n };\n\n return menuComponent;\n };\n\nexport { withAPI };\n",
|
|
154
157
|
"// src/components/menu/config.ts\n\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { MenuConfig } from \"./types\";\nimport { MENU_DEFAULTS, MENU_CLASSES } from \"./constants\";\n\n/**\n * Default configuration for the Menu component\n * These values will be used when not explicitly specified by the user.\n *\n * @category Components\n */\n\nexport const defaultConfig: Partial<MenuConfig> = {\n items: [],\n position: MENU_DEFAULTS.POSITION,\n closeOnSelect: MENU_DEFAULTS.CLOSE_ON_SELECT,\n closeOnClickOutside: MENU_DEFAULTS.CLOSE_ON_CLICK_OUTSIDE,\n closeOnEscape: MENU_DEFAULTS.CLOSE_ON_ESCAPE,\n openSubmenuOnHover: MENU_DEFAULTS.OPEN_SUBMENU_ON_HOVER,\n offset: MENU_DEFAULTS.OFFSET,\n autoFlip: MENU_DEFAULTS.AUTO_FLIP,\n visible: false,\n};\n\n/**\n * Creates the base configuration for Menu component by merging user-provided\n * config with default values.\n *\n * @param {MenuConfig} config - User provided configuration\n * @returns {MenuConfig} Complete configuration with defaults applied\n * @category Components\n * @internal\n */\nexport const createBaseConfig = (config: MenuConfig): MenuConfig => {\n // First, ensure we have an opener element\n if (!config.opener) {\n throw new Error(\"Menu component requires an opener element or selector\");\n }\n\n // Apply default configuration\n return createComponentConfig(defaultConfig, config, \"menu\") as MenuConfig;\n};\n\n/**\n * Generates element configuration for the Menu component.\n * This function creates the necessary attributes and configuration\n * for the DOM element creation process.\n *\n * @param {MenuConfig} config - Menu configuration\n * @returns {Object} Element configuration object for withElement\n * @category Components\n * @internal\n */\nexport const getElementConfig = (config: MenuConfig) => {\n // Custom styles based on configuration\n const styles: Record<string, string> = {};\n\n if (config.width) {\n styles.width = config.width;\n }\n\n if (config.maxHeight) {\n styles.maxHeight = config.maxHeight;\n }\n\n // Element attributes\n const attributes: Record<string, any> = {\n role: \"menu\",\n tabindex: \"-1\",\n \"aria-hidden\": (!config.visible).toString(),\n style: Object.entries(styles)\n .map(([key, value]) => `${key}: ${value}`)\n .join(\";\"),\n };\n\n return createElementConfig(config, {\n tag: \"div\",\n attributes,\n className: [\n config.visible ? MENU_CLASSES.VISIBLE : null,\n config.dense ? `${config.prefix}-menu--dense` : null,\n config.class,\n ].filter(Boolean),\n forwardEvents: {\n keydown: true,\n },\n });\n};\n\n/**\n * Creates API configuration for the Menu component.\n * This connects the core component features to the public API.\n *\n * @param {Object} component - Component with menu features\n * @returns {Object} API configuration object\n * @category Components\n * @internal\n */\nexport const getApiConfig = (component) => ({\n menu: {\n open: (event, interactionType) =>\n component.menu?.open(event, interactionType),\n close: (event, restoreFocus, skipAnimation) =>\n component.menu?.close(event, restoreFocus, skipAnimation),\n toggle: (event, interactionType) =>\n component.menu?.toggle(event, interactionType),\n isOpen: () => component.menu?.isOpen() || false,\n setItems: (items) => component.menu?.setItems(items),\n getItems: () => component.menu?.getItems() || [],\n setPosition: (position) => component.menu?.setPosition(position),\n getPosition: () => component.menu?.getPosition(),\n setSelected: (itemId) => component.menu?.setSelected(itemId),\n getSelected: () => component.menu?.getSelected(),\n },\n opener: {\n setOpener: (opener) => component.opener?.setOpener(opener),\n getOpener: () => component.opener?.getOpener(),\n },\n submenu: {\n hasOpenSubmenu: () => component.submenu?.hasOpenSubmenu() || false,\n closeAllSubmenus: () => component.submenu?.closeAllSubmenus(),\n },\n events: {\n on: (event, handler) => component.on?.(event, handler),\n off: (event, handler) => component.off?.(event, handler),\n },\n lifecycle: {\n destroy: () => component.lifecycle?.destroy(),\n },\n});\n\nexport default defaultConfig;\n",
|
|
155
158
|
"// src/components/menu/constants.ts\n\n/**\n * Menu position options for alignment relative to opener element\n */\nexport const MENU_POSITION = {\n /** Places menu below the opener, aligned to left edge */\n BOTTOM_START: \"bottom-start\",\n /** Places menu below the opener, centered */\n BOTTOM: \"bottom\",\n /** Places menu below the opener, aligned to right edge */\n BOTTOM_END: \"bottom-end\",\n /** Places menu above the opener, aligned to left edge */\n TOP_START: \"top-start\",\n /** Places menu above the opener, centered */\n TOP: \"top\",\n /** Places menu above the opener, aligned to right edge */\n TOP_END: \"top-end\",\n /** Places menu to the right of the opener, aligned to top edge */\n RIGHT_START: \"right-start\",\n /** Places menu to the right of the opener, centered */\n RIGHT: \"right\",\n /** Places menu to the right of the opener, aligned to bottom edge */\n RIGHT_END: \"right-end\",\n /** Places menu to the left of the opener, aligned to top edge */\n LEFT_START: \"left-start\",\n /** Places menu to the left of the opener, centered */\n LEFT: \"left\",\n /** Places menu to the left of the opener, aligned to bottom edge */\n LEFT_END: \"left-end\",\n} as const;\n\n/**\n * Default configuration values for menus\n */\nexport const MENU_DEFAULTS = {\n /** Default menu position */\n POSITION: MENU_POSITION.BOTTOM_START,\n /** Default offset from the opener (in pixels) */\n OFFSET: 0,\n /** Close menu when an item is selected */\n CLOSE_ON_SELECT: true,\n /** Close menu when clicking outside */\n CLOSE_ON_CLICK_OUTSIDE: true,\n /** Close menu when escape key is pressed */\n CLOSE_ON_ESCAPE: true,\n /** Open submenus on hover */\n OPEN_SUBMENU_ON_HOVER: true,\n /** Automatically flip menu position to stay in viewport */\n AUTO_FLIP: true,\n} as const;\n\n/**\n * Interaction types for menu opening/closing\n */\nexport const MENU_INTERACTION_TYPES = {\n /** Interaction via mouse or touch */\n MOUSE: \"mouse\",\n /** Interaction via keyboard */\n KEYBOARD: \"keyboard\",\n} as const;\n\n/**\n * Menu item types\n */\nexport const MENU_ITEM_TYPES = {\n /** Standard interactive menu item */\n ITEM: \"item\",\n /** Non-interactive dividing line */\n DIVIDER: \"divider\",\n} as const;\n\n/**\n * Menu event names\n */\nexport const MENU_EVENTS = {\n /** Fired when the menu is opened */\n OPEN: \"open\",\n /** Fired when the menu is closed */\n CLOSE: \"close\",\n /** Fired when a menu item is selected */\n SELECT: \"select\",\n} as const;\n\n/**\n * CSS classes for menu elements\n */\nexport const MENU_CLASSES = {\n /** Menu container */\n CONTAINER: \"menu\",\n /** Visible menu */\n VISIBLE: \"menu--visible\",\n /** Menu inner container */\n INNER: \"menu__inner\",\n /** Individual menu item */\n ITEM: \"menu__item\",\n /** Disabled menu item */\n ITEM_DISABLED: \"menu__item--disabled\",\n /** Selected menu item */\n ITEM_SELECTED: \"menu__item--selected\",\n /** Menu item with submenu */\n ITEM_HAS_SUBMENU: \"menu__item--has-submenu\",\n /** Divider */\n DIVIDER: \"menu__divider\",\n /** Item icon */\n ITEM_ICON: \"menu__item-icon\",\n /** Item text */\n ITEM_TEXT: \"menu__item-text\",\n /** Item keyboard shortcut */\n ITEM_SHORTCUT: \"menu__item-shortcut\",\n /** Submenu indicator */\n SUBMENU_INDICATOR: \"menu__submenu-indicator\",\n /** Dense/compact variant */\n DENSE: \"menu--dense\",\n} as const;\n",
|
|
159
|
+
"// src/components/navigation/navigation.ts\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withDisabled,\n withLifecycle,\n withVariant,\n withPosition,\n} from \"../../core/compose/features\";\nimport { withAPI } from \"./api\";\nimport { withNavItems } from \"./features/items\";\nimport { withController } from \"./features/controller\";\nimport { NavigationConfig, NavigationComponent } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Sets up proper ARIA roles based on navigation variant\n * @param {NavigationComponent} nav - Navigation component\n * @param {NavigationConfig} config - Navigation configuration\n */\nconst setupAccessibility = (\n nav: NavigationComponent,\n config: NavigationConfig\n): void => {\n const { element } = nav;\n const variant = config.variant || \"rail\";\n const prefix = config.prefix || \"mtrl\";\n\n // Set appropriate aria-label\n element.setAttribute(\"aria-label\", config.ariaLabel || \"Main Navigation\");\n\n // For bar navigation (bottom or top nav)\n if (variant === \"bar\") {\n // If bar navigation is acting as tabs\n const hasNestedItems =\n config.items?.some((item) => item.items?.length) || false;\n\n if (!hasNestedItems) {\n element.setAttribute(\"role\", \"tablist\");\n element.setAttribute(\"aria-orientation\", \"horizontal\");\n } else {\n element.setAttribute(\"role\", \"menubar\");\n element.setAttribute(\"aria-orientation\", \"horizontal\");\n }\n }\n // For rail and drawer navigation\n else {\n // Use standard navigation landmark\n element.setAttribute(\"role\", \"navigation\");\n }\n\n // Set hidden state for modal drawers if needed\n if (\n (variant === \"modal\" ||\n (variant === \"drawer\" && config.behavior === \"dismissible\")) &&\n !config.expanded\n ) {\n element.classList.add(`${prefix}-nav--hidden`);\n }\n};\n\n/**\n * Creates a new Navigation component\n * @param {NavigationConfig} config - Navigation configuration\n * @returns {NavigationComponent} Navigation component instance\n */\nconst createNavigation = (\n config: NavigationConfig = {}\n): NavigationComponent => {\n const baseConfig = createBaseConfig(config);\n\n try {\n const navigation = pipe(\n createBase,\n // First add events system - MUST be before other features that use events\n withEvents(),\n // Then add the element and other features\n withElement(getElementConfig(baseConfig)),\n // Add core features\n withVariant(baseConfig),\n withPosition(baseConfig),\n // Add navigation-specific features\n withNavItems(baseConfig),\n // Add controller for event delegation AFTER items are set up\n withController(baseConfig),\n // Add standard component features\n withDisabled(baseConfig),\n withLifecycle(),\n // Finally add the API - this must be last to include all features\n (comp) => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n\n const nav = navigation as NavigationComponent;\n\n // Set up proper ARIA roles and relationships\n setupAccessibility(nav, baseConfig);\n\n // Implement any initialization logic\n if (baseConfig.disabled) {\n nav.disable();\n }\n\n // Add explicit component identifier for debugging\n nav.element.dataset.componentType = \"navigation\";\n if (baseConfig.variant) {\n nav.element.dataset.variant = baseConfig.variant;\n }\n\n return nav;\n } catch (error) {\n throw new Error(\n `Failed to create navigation: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n};\n\nexport default createNavigation;\n",
|
|
160
|
+
"// src/components/navigation/api.ts\nimport { NavigationComponent, NavItemConfig, NavItemData, BaseComponent, ApiOptions } from './types';\n\n/**\n * Enhances a component with navigation-specific API methods\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n */\nexport const withAPI = (options: ApiOptions) => \n (component: BaseComponent): NavigationComponent => {\n \n const navComponent = {\n ...component,\n element: component.element,\n items: component.items || new Map(),\n \n // Basic item operations\n addItem(config: NavItemConfig): NavigationComponent {\n if (typeof component.addItem === 'function') {\n component.addItem(config);\n }\n return this;\n },\n \n removeItem(id: string): NavigationComponent {\n if (typeof component.removeItem === 'function') {\n component.removeItem(id);\n }\n return this;\n },\n \n getItem(id: string): NavItemData | undefined {\n if (typeof component.getItem === 'function') {\n return component.getItem(id);\n }\n return this.items.get(id);\n },\n \n getAllItems(): NavItemData[] {\n if (typeof component.getAllItems === 'function') {\n return component.getAllItems();\n }\n return Array.from(this.items.values());\n },\n \n // Path and active item management\n getActive(): NavItemData | null {\n if (typeof component.getActive === 'function') {\n return component.getActive();\n }\n return null;\n },\n \n getItemPath(id: string): string[] {\n if (typeof component.getItemPath === 'function') {\n return component.getItemPath(id);\n }\n return [];\n },\n \n setActive(id: string): NavigationComponent {\n // Use the controller if available for consistent handling\n if (typeof component.handleItemClick === 'function') {\n component.handleItemClick(id);\n } else if (typeof component.setActive === 'function') {\n component.setActive(id);\n } else {\n // Fallback if setActive is not available\n const item = this.items.get(id);\n if (item && item.element) {\n // Emit a change event to propagate the state change\n if (component.emit) {\n component.emit('change', {\n id,\n item,\n source: 'api'\n });\n }\n }\n }\n return this;\n },\n \n // Navigation state management\n enable(): NavigationComponent {\n if (options.disabled.enable) {\n options.disabled.enable();\n }\n return this;\n },\n \n disable(): NavigationComponent {\n if (options.disabled.disable) {\n options.disabled.disable();\n }\n return this;\n },\n \n expand(): NavigationComponent {\n this.element.classList.remove(`${this.element.className.split(' ')[0]}--hidden`);\n this.element.setAttribute('aria-hidden', 'false');\n \n if (component.emit) {\n component.emit('expanded', { source: 'api' });\n }\n return this;\n },\n \n collapse(): NavigationComponent {\n this.element.classList.add(`${this.element.className.split(' ')[0]}--hidden`);\n this.element.setAttribute('aria-hidden', 'true');\n \n if (component.emit) {\n component.emit('collapsed', { source: 'api' });\n }\n return this;\n },\n \n isExpanded(): boolean {\n return !this.element.classList.contains(`${this.element.className.split(' ')[0]}--hidden`);\n },\n \n toggle(): NavigationComponent {\n return this.isExpanded() ? this.collapse() : this.expand();\n },\n \n // Event handling\n on(event: string, handler: Function): NavigationComponent {\n if (component.on) {\n component.on(event, handler);\n }\n return this;\n },\n \n off(event: string, handler: Function): NavigationComponent {\n if (component.off) {\n component.off(event, handler);\n }\n return this;\n },\n \n // Destruction\n destroy(): void {\n if (options.lifecycle.destroy) {\n options.lifecycle.destroy();\n }\n }\n };\n \n // Return the enhanced component\n \n return navComponent;\n };\n\nexport default withAPI;",
|
|
161
|
+
"// src/components/navigation/constants.ts\n\n/**\n * Navigation variants following Material Design 3\n */\nexport const NAV_VARIANTS = {\n /** Navigation rail - thin vertical bar with icons and optional labels */\n RAIL: 'rail',\n /** Drawer navigation - wider drawer that can expand/collapse */\n DRAWER: 'drawer',\n /** Bar navigation - horizontal navigation bar */\n BAR: 'bar',\n /** Modal navigation - floating navigation that appears on demand */\n MODAL: 'modal',\n /** Standard navigation - basic navigation layout */\n STANDARD: 'standard'\n} as const;\n\n/**\n * Navigation positions\n */\nexport const NAV_POSITIONS = {\n /** Left side of the screen */\n LEFT: 'left',\n /** Right side of the screen */\n RIGHT: 'right',\n /** Top of the screen */\n TOP: 'top',\n /** Bottom of the screen */\n BOTTOM: 'bottom'\n} as const;\n\n/**\n * Navigation behaviors\n */\nexport const NAV_BEHAVIORS = {\n /** Fixed in place, always visible */\n FIXED: 'fixed',\n /** Can be dismissed/hidden */\n DISMISSIBLE: 'dismissible',\n /** Modal overlay that can be opened/closed */\n MODAL: 'modal'\n} as const;\n\n/**\n * Navigation item states\n */\nexport const NAV_ITEM_STATES = {\n /** Currently selected item */\n ACTIVE: 'active',\n /** Item cannot be interacted with */\n DISABLED: 'disabled',\n /** Item with children is expanded */\n EXPANDED: 'expanded',\n /** Item with children is collapsed */\n COLLAPSED: 'collapsed',\n /** Mouse is hovering over the item */\n HOVERED: 'hovered',\n /** Item has keyboard focus */\n FOCUSED: 'focused',\n /** Item is being pressed */\n PRESSED: 'pressed'\n} as const;\n\n/**\n * Navigation event names\n */\nexport const NAV_EVENTS = {\n /** Fired when an item is selected */\n CHANGE: 'change',\n /** Fired when navigation is expanded */\n EXPAND: 'expand',\n /** Fired when navigation is collapsed */\n COLLAPSE: 'collapse',\n /** Fired when a nested item group is expanded */\n GROUP_EXPAND: 'group:expand',\n /** Fired when a nested item group is collapsed */\n GROUP_COLLAPSE: 'group:collapse'\n} as const;\n\n/**\n * Default configuration values\n */\nexport const NAV_DEFAULTS = {\n /** Default navigation variant */\n VARIANT: NAV_VARIANTS.STANDARD,\n /** Default navigation position */\n POSITION: NAV_POSITIONS.LEFT,\n /** Default navigation behavior */\n BEHAVIOR: NAV_BEHAVIORS.FIXED,\n /** Whether navigation is expanded by default */\n EXPANDED: false,\n /** Whether to show item labels by default */\n SHOW_LABELS: true,\n /** Whether scrim is enabled for modal navigation */\n SCRIM_ENABLED: true\n} as const;\n\n/**\n * CSS classes for navigation elements\n */\nexport const NAV_CLASSES = {\n /** Container element */\n CONTAINER: 'nav',\n /** Navigation variant class prefix */\n VARIANT_PREFIX: 'nav--',\n /** Navigation position class prefix */\n POSITION_PREFIX: 'nav--pos-',\n /** Navigation behavior class prefix */\n BEHAVIOR_PREFIX: 'nav--',\n /** Expanded state class */\n EXPANDED: 'nav--expanded',\n /** Disabled state class */\n DISABLED: 'nav--disabled',\n /** Navigation item */\n ITEM: 'nav-item',\n /** Item container (wrapper) */\n ITEM_CONTAINER: 'nav-item-container',\n /** Navigation item icon */\n ICON: 'nav-item-icon',\n /** Navigation item text label */\n LABEL: 'nav-item-label',\n /** Navigation item badge */\n BADGE: 'nav-item-badge',\n /** Navigation divider */\n DIVIDER: 'nav-divider',\n /** Modal background scrim */\n SCRIM: 'nav-scrim',\n /** Navigation item group */\n GROUP: 'nav-group',\n /** Group title */\n GROUP_TITLE: 'nav-group-title',\n /** Item subtitle */\n SUBTITLE: 'nav-subtitle',\n /** Container for nested items */\n NESTED_CONTAINER: 'nav-nested-container',\n /** Nested navigation item */\n NESTED_ITEM: 'nav-nested-item',\n /** Icon for expanding/collapsing nested items */\n EXPAND_ICON: 'nav-expand-icon',\n /** Active state class */\n ACTIVE: 'nav-item--active',\n /** Disabled state class */\n ITEM_DISABLED: 'nav-item--disabled'\n} as const;",
|
|
162
|
+
"// src/components/navigation/nav-item.ts\nimport { NavItemConfig } from './types';\nimport { NAV_CLASSES } from './constants';\n\n/**\n * Creates an expand/collapse icon element\n * @param {string} prefix - CSS class prefix\n * @returns {HTMLElement} Expand icon element\n */\nexport const createExpandIcon = (prefix: string): HTMLElement => {\n const icon = document.createElement('span');\n icon.className = `${prefix}-${NAV_CLASSES.EXPAND_ICON}`;\n icon.innerHTML = `\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n `;\n return icon;\n};\n\n/**\n * Creates a nested items container\n * @param {NavItemConfig[]} items - Nested items configuration\n * @param {string} prefix - CSS class prefix\n * @param {Function} createItem - Item creation function\n * @returns {HTMLElement} Nested items container\n */\nexport const createNestedContainer = (\n items: NavItemConfig[], \n prefix: string, \n createItem: (config: NavItemConfig, container: HTMLElement, prefix: string) => HTMLElement\n): HTMLElement => {\n const container = document.createElement('div');\n container.className = `${prefix}-${NAV_CLASSES.NESTED_CONTAINER}`;\n \n // Use appropriate role for nested menu\n container.setAttribute('role', 'menu');\n container.hidden = true;\n\n items.forEach(itemConfig => {\n createItem(itemConfig, container, prefix);\n });\n\n return container;\n};\n\n/**\n * Creates a navigation item element\n * @param {NavItemConfig} config - Item configuration\n * @param {HTMLElement} container - Container element\n * @param {string} prefix - CSS class prefix\n * @returns {HTMLElement} Created navigation item\n */\nexport const createNavItem = (\n config: NavItemConfig, \n container: HTMLElement, \n prefix: string\n): HTMLElement => {\n const itemContainer = document.createElement('div');\n itemContainer.className = `${prefix}-${NAV_CLASSES.ITEM_CONTAINER}`;\n\n // Determine if parent container uses tabs or menu role pattern\n const isMenuContext = container.getAttribute('role') === 'menu';\n const isTabContext = container.getAttribute('role') === 'tablist';\n const isDrawerVariant = container.closest(`.${prefix}-nav--drawer, .${prefix}-nav--drawer-modal, .${prefix}-nav--drawer-standard`) !== null;\n \n // Create the item element\n const itemElement = document.createElement('button');\n itemElement.className = `${prefix}-${NAV_CLASSES.ITEM}`;\n itemElement.type = 'button'; // Ensure it's a button type for proper behavior\n \n // Set appropriate role based on context and items\n if (config.items?.length) {\n if (isDrawerVariant) {\n // For expandable drawer items with nested items\n itemElement.setAttribute('role', 'button');\n itemElement.setAttribute('aria-expanded', config.expanded ? 'true' : 'false');\n itemElement.setAttribute('aria-haspopup', 'menu');\n } else {\n // For non-drawer variants with nested items\n itemElement.setAttribute('role', 'button');\n }\n } else if (isMenuContext) {\n // For menu items\n itemElement.setAttribute('role', 'menuitem');\n } else if (isTabContext) {\n // For tab items\n itemElement.setAttribute('role', 'tab');\n itemElement.setAttribute('aria-selected', config.active ? 'true' : 'false');\n itemElement.setAttribute('tabindex', config.active ? '0' : '-1');\n } \n // For plain navigation buttons, we don't need to set the role since buttons have inherent semantics\n\n if (config.id) {\n itemElement.dataset.id = config.id;\n }\n\n if (config.disabled) {\n itemElement.disabled = true;\n itemElement.setAttribute('aria-disabled', 'true');\n }\n\n // Add icon if provided\n if (config.icon) {\n const icon = document.createElement('span');\n icon.className = `${prefix}-${NAV_CLASSES.ICON}`;\n icon.innerHTML = config.icon;\n itemElement.appendChild(icon);\n }\n\n // Add label if provided - CONVERTED TO ANCHOR FOR SEO\n if (config.label) {\n // Create anchor instead of span for the label\n const label = document.createElement('a');\n label.className = `${prefix}-${NAV_CLASSES.LABEL}`;\n label.textContent = config.label;\n label.href = `/${config.id}`; // Create path based on ID\n \n // Ensure the anchor looks the same as a span would\n label.style.textDecoration = 'none';\n label.style.color = 'inherit';\n label.style.pointerEvents = 'none'; // Let the button handle click events\n \n // Add SEO attributes\n label.setAttribute('title', config.label);\n \n itemElement.appendChild(label);\n itemElement.setAttribute('aria-label', config.label);\n }\n\n // Add badge if provided\n if (config.badge) {\n const badge = document.createElement('span');\n badge.className = `${prefix}-${NAV_CLASSES.BADGE}`;\n badge.textContent = config.badge;\n // Use appropriate aria labeling\n badge.setAttribute('aria-label', `${config.badge} notifications`);\n itemElement.appendChild(badge);\n }\n\n // Mark active state with appropriate semantics\n if (config.active && !config.items?.length) {\n itemElement.classList.add(`${prefix}-${NAV_CLASSES.ACTIVE}`);\n \n // Use aria-current for standard navigation\n if (!isTabContext) {\n itemElement.setAttribute('aria-current', 'page');\n }\n }\n\n itemContainer.appendChild(itemElement);\n\n // Handle nested items - only for drawer variant\n if (config.items?.length && isDrawerVariant) {\n const expandIcon = createExpandIcon(prefix);\n itemElement.appendChild(expandIcon);\n\n const nestedContainer = createNestedContainer(config.items, prefix, createNavItem);\n nestedContainer.hidden = !config.expanded;\n itemContainer.appendChild(nestedContainer);\n\n // Handle expand/collapse\n itemElement.addEventListener('click', (event) => {\n event.stopPropagation();\n const isExpanded = itemElement.getAttribute('aria-expanded') === 'true';\n itemElement.setAttribute('aria-expanded', (!isExpanded).toString());\n nestedContainer.hidden = isExpanded;\n\n // Toggle expand icon rotation\n if (expandIcon.style) {\n expandIcon.style.transform = isExpanded ? '' : 'rotate(90deg)';\n }\n });\n }\n\n container.appendChild(itemContainer);\n return itemElement;\n};\n\n/**\n * Recursively gets all nested items from a navigation item\n * @param {HTMLElement} item - Navigation item element\n * @param {string} prefix - CSS class prefix\n * @returns {Array<HTMLElement>} Array of all nested items\n */\nexport const getAllNestedItems = (item: HTMLElement, prefix: string): HTMLElement[] => {\n const container = item.closest(`.${prefix}-${NAV_CLASSES.ITEM_CONTAINER}`);\n if (!container) return [];\n\n const nestedContainer = container.querySelector(`.${prefix}-${NAV_CLASSES.NESTED_CONTAINER}`);\n if (!nestedContainer) return [];\n\n const items = Array.from(nestedContainer.querySelectorAll(`.${prefix}-${NAV_CLASSES.ITEM}`)) as HTMLElement[];\n return items.reduce((acc: HTMLElement[], nestedItem: HTMLElement) => {\n return [...acc, nestedItem, ...getAllNestedItems(nestedItem, prefix)];\n }, []);\n};",
|
|
163
|
+
"// src/components/navigation/features/items.ts\nimport { createNavItem, getAllNestedItems } from \"../nav-item\";\nimport { NavItemConfig, BaseComponent } from \"../types\";\nimport type { NavItemData } from \"../types\";\nimport { NAV_CLASSES, NAV_EVENTS } from \"../constants\";\n\n/**\n * Interface for a component with items management capabilities\n * @internal\n */\ninterface ItemsComponent extends BaseComponent {\n items: Map<string, NavItemData>;\n addItem: (config: NavItemConfig) => ItemsComponent;\n removeItem: (id: string) => ItemsComponent;\n getItem: (id: string) => NavItemData | undefined;\n getAllItems: () => NavItemData[];\n getActive: () => NavItemData | null;\n getItemPath: (id: string) => string[];\n setActive: (id: string) => ItemsComponent;\n}\n\n/**\n * Interface for navigation configuration\n * @internal\n */\ninterface NavigationConfig {\n prefix?: string;\n items?: NavItemConfig[];\n debug?: boolean;\n [key: string]: any;\n}\n\n/**\n * Helper to get element ID or component type\n * @internal\n */\nfunction getElementId(\n element: HTMLElement | null,\n prefix: string\n): string | null {\n if (!element) return null;\n\n // Try to get data-id\n const id = element.getAttribute(\"data-id\");\n if (id) return id;\n\n // Try to identify by component class\n if (element.classList.contains(`${prefix}-nav--rail`)) return \"rail\";\n if (element.classList.contains(`${prefix}-nav--drawer`)) return \"drawer\";\n\n return null;\n}\n\n/**\n * Adds navigation items management to a component\n * @param {NavigationConfig} config - Navigation configuration\n * @returns {Function} Component enhancer function\n */\nexport const withNavItems =\n (config: NavigationConfig) =>\n (component: BaseComponent): ItemsComponent => {\n const items = new Map<string, NavItemData>();\n let activeItem: NavItemData | null = null;\n const prefix = config.prefix || \"mtrl\";\n\n /**\n * Recursively stores items in the items Map\n * @param {NavItemConfig} itemConfig - Item configuration\n * @param {HTMLElement} item - Created item element\n */\n const storeItem = (itemConfig: NavItemConfig, item: HTMLElement): void => {\n items.set(itemConfig.id, { element: item, config: itemConfig });\n\n if (itemConfig.items?.length) {\n itemConfig.items.forEach((nestedConfig) => {\n const container = item.closest(\n `.${prefix}-${NAV_CLASSES.ITEM_CONTAINER}`\n );\n if (container) {\n const nestedContainer = container.querySelector(\n `.${prefix}-${NAV_CLASSES.NESTED_CONTAINER}`\n );\n if (nestedContainer) {\n const nestedItem = nestedContainer.querySelector(\n `[data-id=\"${nestedConfig.id}\"]`\n ) as HTMLElement;\n if (nestedItem) {\n storeItem(nestedConfig, nestedItem);\n }\n }\n }\n });\n }\n };\n\n /**\n * Updates the active state for an item\n * @param {HTMLElement} item - Item element to activate\n * @param {NavItemData} itemData - Item data\n * @param {boolean} active - Whether to make active or inactive\n */\n const updateActiveState = (\n item: HTMLElement,\n itemData: NavItemData,\n active: boolean\n ): void => {\n // Determine the correct active attribute based on role\n const role = item.getAttribute(\"role\");\n\n if (active) {\n item.classList.add(`${prefix}-${NAV_CLASSES.ACTIVE}`);\n\n // Set appropriate attribute based on role\n if (role === \"tab\") {\n item.setAttribute(\"aria-selected\", \"true\");\n item.setAttribute(\"tabindex\", \"0\");\n } else if (!item.getAttribute(\"aria-haspopup\")) {\n // Use aria-current for navigation items that aren't expandable\n item.setAttribute(\"aria-current\", \"page\");\n }\n } else {\n item.classList.remove(`${prefix}-${NAV_CLASSES.ACTIVE}`);\n\n // Remove appropriate attribute based on role\n if (role === \"tab\") {\n item.setAttribute(\"aria-selected\", \"false\");\n item.setAttribute(\"tabindex\", \"-1\");\n } else if (item.hasAttribute(\"aria-current\")) {\n item.removeAttribute(\"aria-current\");\n }\n }\n };\n\n // Create initial items\n if (config.items) {\n config.items.forEach((itemConfig) => {\n const item = createNavItem(itemConfig, component.element, prefix);\n storeItem(itemConfig, item);\n\n if (itemConfig.active) {\n activeItem = { element: item, config: itemConfig };\n updateActiveState(item, activeItem, true);\n }\n });\n }\n\n // Set up enhanced event handling for mouse events\n if (component.emit) {\n // Mouse over event handler\n component.element.addEventListener(\n \"mouseover\",\n (event: MouseEvent) => {\n // Find the closest item with data-id\n const target = event.target as HTMLElement;\n const item = target.closest(`[data-id]`) as HTMLElement;\n if (item) {\n const id = item.dataset.id;\n if (id) {\n component.emit(\"mouseover\", {\n id,\n clientX: event.clientX,\n clientY: event.clientY,\n target: item,\n item: items.get(id),\n });\n }\n }\n },\n { passive: true }\n );\n\n // Mouse enter event\n component.element.addEventListener(\n \"mouseenter\",\n (event: MouseEvent) => {\n const componentId =\n component.element.dataset.id || component.componentName || \"nav\";\n\n component.emit(\"mouseenter\", {\n clientX: event.clientX,\n clientY: event.clientY,\n id: componentId,\n });\n },\n { passive: true }\n );\n\n // Mouse leave event\n component.element.addEventListener(\"mouseleave\", (event: MouseEvent) => {\n const relatedTarget = event.relatedTarget as HTMLElement;\n const relatedTargetId = getElementId(relatedTarget, prefix);\n const componentId =\n component.element.dataset.id || component.componentName || \"nav\";\n\n component.emit(\"mouseleave\", {\n clientX: event.clientX,\n clientY: event.clientY,\n relatedTargetId,\n id: componentId,\n });\n });\n }\n\n // Clean up when component is destroyed\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy;\n component.lifecycle.destroy = () => {\n items.clear();\n if (originalDestroy) {\n originalDestroy();\n }\n };\n }\n\n /**\n * Gets the path to an item (parent IDs and the item's own ID)\n * @param {string} id - Item ID to get path for\n * @returns {Array<string>} Array of parent item IDs including the item's own ID\n */\n const getItemPath = (id: string): string[] => {\n // Always include the item's own ID in the path\n const path: string[] = [id];\n const currentItem = items.get(id);\n\n if (!currentItem) {\n return path; // Still return [id] even if item not found in map\n }\n\n // First, find the item container that contains this element\n const itemContainer = currentItem.element.closest(\n `.${prefix}-${NAV_CLASSES.ITEM_CONTAINER}`\n );\n if (!itemContainer) {\n return path;\n }\n\n // Then find the parent element of the item container\n const parentElement = itemContainer.parentElement;\n\n // If parent element is not a nested container, this is a root-level item\n // Just return the item's own ID\n if (\n !parentElement ||\n !parentElement.classList.contains(\n `${prefix}-${NAV_CLASSES.NESTED_CONTAINER}`\n )\n ) {\n return path;\n }\n\n // We're dealing with a nested item - find its ancestors\n let currentNestedContainer = parentElement;\n\n while (currentNestedContainer) {\n // Find the parent item container\n const parentItemContainer = currentNestedContainer.parentElement;\n\n if (\n !parentItemContainer ||\n !parentItemContainer.classList.contains(\n `${prefix}-${NAV_CLASSES.ITEM_CONTAINER}`\n )\n ) {\n break;\n }\n\n // Find the parent item button/element\n const parentItem = parentItemContainer.querySelector(\n `.${prefix}-${NAV_CLASSES.ITEM}[data-id]`\n );\n\n if (!parentItem) {\n break;\n }\n\n const parentId = parentItem.getAttribute(\"data-id\");\n\n if (!parentId) {\n break;\n }\n\n // Add to the beginning of path (since we're going up the tree)\n // This puts ancestors before the item's own ID\n path.unshift(parentId);\n\n // Move up to the next level - find the container of this parent's container\n const grandparentElement = parentItemContainer.parentElement;\n\n if (\n !grandparentElement ||\n !grandparentElement.classList.contains(\n `${prefix}-${NAV_CLASSES.NESTED_CONTAINER}`\n )\n ) {\n break;\n }\n\n currentNestedContainer = grandparentElement;\n }\n\n return path;\n };\n\n return {\n ...component,\n items,\n\n addItem(itemConfig: NavItemConfig) {\n if (items.has(itemConfig.id)) return this;\n\n const item = createNavItem(itemConfig, component.element, prefix);\n storeItem(itemConfig, item);\n\n if (itemConfig.active) {\n this.setActive(itemConfig.id);\n }\n\n if (component.emit) {\n component.emit(\"itemAdded\", {\n id: itemConfig.id,\n item: { element: item, config: itemConfig },\n });\n }\n return this;\n },\n\n removeItem(id: string) {\n const item = items.get(id);\n if (!item) return this;\n\n // Remove all nested items first\n const nestedItems = getAllNestedItems(item.element, prefix);\n nestedItems.forEach((nestedItem) => {\n const nestedId = nestedItem.dataset.id;\n if (nestedId) items.delete(nestedId);\n });\n\n if (activeItem?.config.id === id) {\n activeItem = null;\n }\n\n // Remove the entire item container\n const container = item.element.closest(\n `.${prefix}-${NAV_CLASSES.ITEM_CONTAINER}`\n );\n if (container) {\n container.remove();\n }\n items.delete(id);\n\n if (component.emit) {\n component.emit(\"itemRemoved\", { id, item });\n }\n return this;\n },\n\n getItem: (id: string) => items.get(id),\n getAllItems: () => Array.from(items.values()),\n getActive: () => activeItem,\n getItemPath: (id: string) => getItemPath(id),\n\n setActive(id: string) {\n const item = items.get(id);\n if (!item || item.config.disabled) return this;\n\n if (activeItem) {\n updateActiveState(activeItem.element, activeItem, false);\n }\n\n updateActiveState(item.element, item, true);\n activeItem = item;\n\n // Ensure all parent items are expanded\n const path = getItemPath(id);\n path.forEach((parentId) => {\n const parentItem = items.get(parentId);\n if (parentItem) {\n const parentButton = parentItem.element;\n const container = parentButton.closest(\n `.${prefix}-${NAV_CLASSES.ITEM_CONTAINER}`\n );\n if (container) {\n const nestedContainer = container.querySelector(\n `.${prefix}-${NAV_CLASSES.NESTED_CONTAINER}`\n ) as HTMLElement;\n if (nestedContainer) {\n parentButton.setAttribute(\"aria-expanded\", \"true\");\n nestedContainer.hidden = false;\n }\n }\n }\n });\n\n if (component.emit) {\n component.emit(NAV_EVENTS.CHANGE, {\n id,\n item,\n previousItem: activeItem,\n path: getItemPath(id),\n });\n }\n return this;\n },\n };\n };\n",
|
|
164
|
+
"// src/components/navigation/types.ts\n\n/**\n * Navigation variants following Material Design 3\n * @category Components\n */\nexport type NavVariant = 'rail' | 'drawer' | 'bar' | 'modal' | 'standard';\n\n/**\n * Navigation variants enum\n * @category Components\n */\nexport const NAV_VARIANTS: Record<string, NavVariant> = {\n RAIL: 'rail',\n DRAWER: 'drawer',\n BAR: 'bar',\n MODAL: 'modal',\n STANDARD: 'standard'\n} as const;\n\n/**\n * Navigation positions\n * @category Components\n */\nexport type NavPosition = 'left' | 'right' | 'top' | 'bottom';\n\n/**\n * Navigation positions enum\n * @category Components\n */\nexport const NAV_POSITIONS: Record<string, NavPosition> = {\n LEFT: 'left',\n RIGHT: 'right',\n TOP: 'top',\n BOTTOM: 'bottom'\n} as const;\n\n/**\n * Navigation behaviors\n * @category Components\n */\nexport type NavBehavior = 'fixed' | 'dismissible' | 'modal';\n\n/**\n * Navigation behaviors enum\n * @category Components\n */\nexport const NAV_BEHAVIORS: Record<string, NavBehavior> = {\n FIXED: 'fixed',\n DISMISSIBLE: 'dismissible',\n MODAL: 'modal'\n} as const;\n\n/**\n * Navigation item state\n * @category Components\n */\nexport type NavItemState = 'active' | 'disabled' | 'expanded' | 'collapsed' | 'hovered' | 'focused' | 'pressed';\n\n/**\n * Navigation element class names\n * Used internally to maintain consistent class names\n * @internal\n */\nexport const NavClass = {\n ITEM: 'nav-item',\n ITEM_CONTAINER: 'nav-item-container',\n ICON: 'nav-item-icon',\n LABEL: 'nav-item-label',\n BADGE: 'nav-item-badge',\n DIVIDER: 'nav-divider',\n SCRIM: 'nav-scrim',\n GROUP: 'nav-group',\n GROUP_TITLE: 'nav-group-title',\n SUBTITLE: 'nav-subtitle',\n NESTED_CONTAINER: 'nav-nested-container',\n NESTED_ITEM: 'nav-nested-item',\n EXPAND_ICON: 'nav-expand-icon'\n} as const;\n\n/**\n * Navigation item configuration\n */\nexport interface NavItemConfig {\n /** Unique identifier for the item */\n id: string;\n \n /** Icon HTML content */\n icon?: string;\n \n /** Text label */\n label?: string;\n \n /** Badge text */\n badge?: string;\n \n /** Whether the item is disabled */\n disabled?: boolean;\n \n /** Whether the item is active */\n active?: boolean;\n \n /** Whether nested items are expanded */\n expanded?: boolean;\n \n /** Subtitle text (for drawer items) */\n subtitle?: string;\n \n /** Group ID this item belongs to */\n groupId?: string;\n \n /** Nested navigation items */\n items?: NavItemConfig[];\n}\n\n/**\n * Navigation group configuration\n */\nexport interface NavGroupConfig {\n /** Unique identifier for the group */\n id: string;\n \n /** Group title text */\n title: string;\n \n /** Whether the group is expanded */\n expanded?: boolean;\n}\n\n/**\n * Navigation item data\n */\nexport interface NavItemData {\n /** The item's DOM element */\n element: HTMLElement;\n \n /** Item configuration */\n config: NavItemConfig;\n}\n\n/**\n * Navigation change event data\n */\nexport interface NavChangeEvent {\n /** ID of the selected item */\n id: string;\n \n /** Selected item data */\n item: NavItemData;\n \n /** Previously selected item data */\n previousItem?: NavItemData | null;\n \n /** Path of parent item IDs */\n path: string[];\n}\n\n/**\n * Configuration interface for the Navigation component\n */\nexport interface NavigationConfig {\n /** Navigation variant */\n variant?: NavVariant | string;\n \n /** Navigation position */\n position?: NavPosition | string;\n \n /** Navigation behavior */\n behavior?: NavBehavior | string;\n \n /** Navigation items */\n items?: NavItemConfig[];\n \n /** Navigation groups */\n groups?: NavGroupConfig[];\n \n /** Whether the navigation is disabled */\n disabled?: boolean;\n \n /** Whether the navigation is expanded (for drawer) */\n expanded?: boolean;\n \n /** Whether to show item labels */\n showLabels?: boolean;\n \n /** Whether to enable background scrim (for modal drawer) */\n scrimEnabled?: boolean;\n \n /** Additional CSS classes */\n class?: string;\n \n /** Accessibility label */\n ariaLabel?: string;\n \n /** Component prefix for class names */\n prefix?: string;\n \n /** Component name */\n componentName?: string;\n}\n\n/**\n * Navigation component interface\n */\nexport interface NavigationComponent {\n /** The navigation's DOM element */\n element: HTMLElement;\n \n /** Map of navigation items */\n items: Map<string, NavItemData>;\n \n /** Adds a navigation item */\n addItem: (config: NavItemConfig) => NavigationComponent;\n \n /** Removes a navigation item */\n removeItem: (id: string) => NavigationComponent;\n \n /** Gets a navigation item by ID */\n getItem: (id: string) => NavItemData | undefined;\n \n /** Gets all navigation items */\n getAllItems: () => NavItemData[];\n \n /** Gets the active navigation item */\n getActive: () => NavItemData | null;\n \n /** Gets the path to an item (parent IDs) */\n getItemPath: (id: string) => string[];\n \n /** Sets the active navigation item */\n setActive: (id: string) => NavigationComponent;\n \n /** Enables the navigation */\n enable: () => NavigationComponent;\n \n /** Disables the navigation */\n disable: () => NavigationComponent;\n \n /** Expands the navigation (for drawer) */\n expand: () => NavigationComponent;\n \n /** Collapses the navigation (for drawer) */\n collapse: () => NavigationComponent;\n \n /** Checks if the navigation is expanded */\n isExpanded: () => boolean;\n \n /** Toggles the navigation expansion state */\n toggle: () => NavigationComponent;\n \n /** Adds an event listener */\n on: (event: string, handler: Function) => NavigationComponent;\n \n /** Removes an event listener */\n off: (event: string, handler: Function) => NavigationComponent;\n \n /** Destroys the navigation component */\n destroy: () => void;\n}\n\n/**\n * Base component interface\n */\nexport interface BaseComponent {\n element: HTMLElement;\n prefix?: string;\n items?: Map<string, NavItemData>;\n emit?: (event: string, data: any) => void;\n on?: (event: string, handler: Function) => any;\n off?: (event: string, handler: Function) => any;\n lifecycle?: {\n destroy: () => void;\n };\n disabled?: {\n enable: () => any;\n disable: () => any;\n };\n [key: string]: any;\n}\n\n/**\n * API options interface\n */\nexport interface ApiOptions {\n disabled: {\n enable: () => void;\n disable: () => void;\n };\n lifecycle: {\n destroy: () => void;\n };\n}",
|
|
165
|
+
"// src/components/navigation/features/controller.ts\nimport { BaseComponent, NavClass } from \"../types\";\n\n/**\n * Configuration interface for controller feature\n */\ninterface ControllerConfig {\n /** Component prefix for class names */\n prefix?: string;\n\n /** Debug mode flag */\n debug?: boolean;\n\n /** Component name */\n componentName?: string;\n\n /** Additional configuration options */\n [key: string]: any;\n}\n\n/**\n * Enhanced component with controller capabilities\n */\ninterface ControllerComponent extends BaseComponent {\n /** Handler method for item click events */\n handleItemClick: (id: string) => void;\n}\n\n/**\n * Adds event delegation controller to a navigation component\n * This centralizes event handling for all navigation items\n *\n * @param {ControllerConfig} config - Controller configuration\n * @returns {Function} Component enhancer function\n */\nexport const withController =\n (config: ControllerConfig) =>\n (component: BaseComponent): ControllerComponent => {\n const prefix = config.prefix || \"mtrl\";\n\n /**\n * Updates the active state for an item\n * @param {HTMLElement} item - Item element to activate\n * @param {boolean} active - Whether to make active or inactive\n */\n const updateItemState = (item: HTMLElement, active: boolean): void => {\n // Safety check - ensure item exists\n if (!item) return;\n\n // Determine the correct active attribute based on role\n const role = item.getAttribute(\"role\");\n\n if (active) {\n item.classList.add(`${prefix}-${NavClass.ITEM}--active`);\n\n // Set appropriate attribute based on role\n if (role === \"tab\") {\n item.setAttribute(\"aria-selected\", \"true\");\n item.setAttribute(\"tabindex\", \"0\");\n } else if (!item.getAttribute(\"aria-haspopup\")) {\n // Use aria-current for navigation items that aren't expandable\n item.setAttribute(\"aria-current\", \"page\");\n }\n } else {\n item.classList.remove(`${prefix}-${NavClass.ITEM}--active`);\n\n // Remove appropriate attribute based on role\n if (role === \"tab\") {\n item.setAttribute(\"aria-selected\", \"false\");\n item.setAttribute(\"tabindex\", \"-1\");\n } else if (item.hasAttribute(\"aria-current\")) {\n item.removeAttribute(\"aria-current\");\n }\n }\n };\n\n /**\n * Handle expandable item toggle\n * @param {HTMLElement} item - Expandable item element\n * @returns {boolean} Whether the item was expandable and handled\n */\n const handleExpandableItem = (item: HTMLElement): boolean => {\n const isExpandable = item.getAttribute(\"aria-expanded\") !== null;\n if (!isExpandable) return false;\n\n // Toggle expanded state\n const isExpanded = item.getAttribute(\"aria-expanded\") === \"true\";\n item.setAttribute(\"aria-expanded\", (!isExpanded).toString());\n\n // Find and toggle nested container - use flexible selectors\n const container = item.closest(\n `.${prefix}-${NavClass.ITEM_CONTAINER}, .mtrl-nav-item-container`\n );\n if (container) {\n const nestedContainer = container.querySelector(\n `.${prefix}-${NavClass.NESTED_CONTAINER}, .mtrl-nav-nested-container`\n );\n if (nestedContainer) {\n (nestedContainer as HTMLElement).hidden = isExpanded;\n\n // Also toggle expand icon rotation if present\n const expandIcon = item.querySelector(\n `.${prefix}-${NavClass.EXPAND_ICON}, .mtrl-nav-expand-icon`\n );\n if (expandIcon && (expandIcon as HTMLElement).style) {\n (expandIcon as HTMLElement).style.transform = isExpanded\n ? \"\"\n : \"rotate(90deg)\";\n }\n }\n }\n\n // For expandable items, we still emit a change event\n const id = (item as HTMLElement).dataset.id;\n if (id && component.emit) {\n component.emit(\"expandToggle\", {\n id,\n expanded: !isExpanded,\n });\n }\n\n return true;\n };\n\n // Create the enhanced component with handleItemClick method\n const enhancedComponent: ControllerComponent = {\n ...component,\n\n /**\n * Handler method for item click events\n * @param {string} id - ID of the clicked item\n */\n handleItemClick(id: string) {\n if (!component.items) {\n return;\n }\n\n const itemData = component.items.get(id);\n if (!itemData) {\n return;\n }\n\n // Find the currently active item by DOM query instead of relying on getActive\n const activeElement = component.element.querySelector(\n `.${prefix}-${NavClass.ITEM}--active, .mtrl-nav-item--active`\n );\n\n // Check if this item is already active - prevent infinite loops\n // if (activeElement && activeElement === itemData.element) {\n // return;\n // }\n\n // Deactivate previous active item if found\n if (activeElement) {\n updateItemState(activeElement as HTMLElement, false);\n }\n\n // Make sure itemData.element exists before updating\n if (itemData.element) {\n updateItemState(itemData.element, true);\n }\n\n // Emit change event\n if (component.emit) {\n // Get the path to the item (for nested items)\n const path = component.getItemPath ? component.getItemPath(id) : [];\n\n component.emit(\"change\", {\n id,\n item: itemData,\n previousItem: activeElement\n ? {\n element: activeElement as HTMLElement,\n config: { id: (activeElement as HTMLElement).dataset.id },\n }\n : null,\n path,\n source: \"userAction\",\n });\n }\n },\n };\n\n // Set up click event delegation for all navigation items\n component.element.addEventListener(\"click\", (event: Event) => {\n const target = event.target as HTMLElement;\n\n // Use more flexible selectors that match actual DOM structure\n const item = target.closest(\n `.${prefix}-${NavClass.ITEM}, .mtrl-nav-item`\n ) as HTMLElement;\n\n if (!item) {\n // Fallback to elements with data-id attribute\n const itemByDataId = target.closest(\"[data-id]\") as HTMLElement;\n if (!itemByDataId) {\n return;\n }\n }\n\n // Use the found item or fallback\n const navItem = item || (target.closest(\"[data-id]\") as HTMLElement);\n\n if (\n navItem.hasAttribute(\"disabled\") ||\n navItem.getAttribute(\"aria-disabled\") === \"true\"\n ) {\n return;\n }\n\n // Get the ID from the data attribute\n const id = navItem.dataset.id;\n if (!id) {\n return;\n }\n\n // Handle expandable items first\n if (handleExpandableItem(navItem)) {\n return;\n }\n\n // Let the enhanced component handle normal item activation\n enhancedComponent.handleItemClick(id);\n });\n\n // Add keyboard support for navigation\n component.element.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n // Only handle specific keys\n if (\n ![\n \"Enter\",\n \" \",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Home\",\n \"End\",\n ].includes(event.key)\n ) {\n return;\n }\n\n const isVertical = [\"rail\", \"drawer\"].includes(component.variant || \"\");\n const isHorizontal = [\"bar\"].includes(component.variant || \"\");\n\n // Handle Enter/Space for activation\n if (event.key === \"Enter\" || event.key === \" \") {\n const item = document.activeElement as HTMLElement;\n if (item && item.classList.contains(`${prefix}-${NavClass.ITEM}`)) {\n event.preventDefault();\n\n const id = item.dataset.id;\n if (id) {\n item.click(); // Trigger a click event for the item\n }\n }\n return;\n }\n\n // Get all focusable navigation items - use flexible selector\n const items = Array.from(\n component.element.querySelectorAll(\n `.${prefix}-${NavClass.ITEM}:not([disabled]):not([aria-disabled=\"true\"]), \n .mtrl-nav-item:not([disabled]):not([aria-disabled=\"true\"])`\n )\n ) as HTMLElement[];\n\n if (items.length === 0) return;\n\n // Find the currently focused item\n const focusedItem = document.activeElement as HTMLElement;\n const focusedIndex = items.indexOf(focusedItem);\n\n // Handle navigation keys\n let newIndex = -1;\n\n if (\n (isVertical &&\n (event.key === \"ArrowDown\" || event.key === \"ArrowRight\")) ||\n (isHorizontal && event.key === \"ArrowRight\")\n ) {\n newIndex = focusedIndex < 0 ? 0 : (focusedIndex + 1) % items.length;\n } else if (\n (isVertical &&\n (event.key === \"ArrowUp\" || event.key === \"ArrowLeft\")) ||\n (isHorizontal && event.key === \"ArrowLeft\")\n ) {\n newIndex =\n focusedIndex < 0\n ? items.length - 1\n : (focusedIndex - 1 + items.length) % items.length;\n } else if (event.key === \"Home\") {\n newIndex = 0;\n } else if (event.key === \"End\") {\n newIndex = items.length - 1;\n }\n\n if (newIndex >= 0) {\n event.preventDefault();\n items[newIndex].focus();\n }\n });\n\n return enhancedComponent;\n };\n\nexport default withController;\n",
|
|
166
|
+
"// src/components/navigation/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { NavigationConfig, BaseComponent, ApiOptions } from \"./types\";\nimport { NAV_DEFAULTS, NAV_CLASSES } from \"./constants\";\n\n/**\n * Default configuration for the Navigation component\n */\nexport const defaultConfig: NavigationConfig = {\n variant: NAV_DEFAULTS.VARIANT,\n position: NAV_DEFAULTS.POSITION,\n behavior: NAV_DEFAULTS.BEHAVIOR,\n items: [],\n showLabels: NAV_DEFAULTS.SHOW_LABELS,\n scrimEnabled: NAV_DEFAULTS.SCRIM_ENABLED,\n};\n\n/**\n * Creates the base configuration for Navigation component\n * @param {NavigationConfig} config - User provided configuration\n * @returns {NavigationConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (\n config: NavigationConfig = {}\n): NavigationConfig =>\n createComponentConfig(defaultConfig, config, \"nav\") as NavigationConfig;\n\n/**\n * Generates element configuration for the Navigation component\n * @param {NavigationConfig} config - Navigation configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: NavigationConfig) => {\n // Build class list - start with the variant class\n const variantClass = config.variant\n ? `${config.prefix}-${NAV_CLASSES.VARIANT_PREFIX}${config.variant}`\n : \"\";\n\n // Add position class if specified\n const positionClass = config.position\n ? `${config.prefix}-${NAV_CLASSES.POSITION_PREFIX}${config.position}`\n : \"\";\n\n // Add user-provided classes\n const userClass = config.class || \"\";\n\n // Combine all classes\n const classNames = [variantClass, positionClass, userClass].filter(Boolean);\n\n return createElementConfig(config, {\n tag: \"nav\",\n attributes: {\n role: \"navigation\",\n \"aria-label\": config.ariaLabel || \"Main Navigation\",\n },\n className: classNames,\n });\n};\n\n/**\n * Creates API configuration for the Navigation component\n * @param {BaseComponent} comp - Component with disabled and lifecycle features\n * @returns {ApiOptions} API configuration object\n */\nexport const getApiConfig = (comp: BaseComponent): ApiOptions => ({\n disabled: {\n enable: comp.disabled?.enable || (() => {}),\n disable: comp.disabled?.disable || (() => {}),\n },\n lifecycle: {\n destroy: comp.lifecycle?.destroy || (() => {}),\n },\n});\n\nexport default defaultConfig;\n",
|
|
167
|
+
"// src/components/navigation/system/state.ts\n\nimport { NavigationSystemConfig, NavigationSystemState } from './types';\n\n/**\n * Create the initial state for the navigation system\n * \n * @param options - Configuration options\n * @returns Initial system state\n */\nexport const createInitialState = (options: NavigationSystemConfig = {}): NavigationSystemState => {\n return {\n rail: null,\n drawer: null,\n activeSection: options.activeSection || null,\n activeSubsection: options.activeSubsection || null,\n items: options.items || {},\n mouseInDrawer: false,\n mouseInRail: false,\n hoverTimer: null,\n closeTimer: null,\n processingChange: false,\n isMobile: false,\n overlayElement: null,\n closeButtonElement: null,\n resizeObserver: null,\n outsideClickHandler: null,\n outsideClickHandlerSet: false\n };\n};\n\n/**\n * Create default configuration with sensible defaults\n * \n * @param options - User-provided configuration\n * @returns Complete configuration with defaults\n */\nexport const createConfig = (options: NavigationSystemConfig = {}): Required<Pick<NavigationSystemConfig, \n 'animateDrawer' | 'showLabelsOnRail' | 'hideDrawerOnClick' | 'expanded' | \n 'hoverDelay' | 'closeDelay' | 'railOptions' | 'drawerOptions'>> => {\n return {\n // Display options\n animateDrawer: options.animateDrawer !== false,\n showLabelsOnRail: options.showLabelsOnRail !== false,\n hideDrawerOnClick: options.hideDrawerOnClick || false,\n expanded: options.expanded === true,\n \n // Timing options (ms)\n hoverDelay: options.hoverDelay || 200,\n closeDelay: options.closeDelay || 100,\n \n // Component options\n railOptions: options.railOptions || {},\n drawerOptions: options.drawerOptions || {}\n };\n};\n\n/**\n * Create mobile configuration with defaults\n * \n * @param options - User-provided configuration\n * @returns Mobile-specific configuration\n */\nexport const createMobileConfig = (options: NavigationSystemConfig = {}): Required<Pick<NavigationSystemConfig, \n 'breakpoint' | 'lockBodyScroll' | 'hideOnClickOutside' | 'enableSwipeGestures' | \n 'optimizeForTouch' | 'overlayClass' | 'closeButtonClass' | 'bodyLockClass'>> => {\n return {\n breakpoint: options.breakpoint || 960,\n lockBodyScroll: options.lockBodyScroll !== false,\n hideOnClickOutside: options.hideOnClickOutside !== false,\n enableSwipeGestures: options.enableSwipeGestures !== false,\n optimizeForTouch: options.optimizeForTouch !== false,\n overlayClass: options.overlayClass || 'mtrl-nav-overlay',\n closeButtonClass: options.closeButtonClass || 'mtrl-nav-close-btn',\n bodyLockClass: options.bodyLockClass || 'mtrl-body-drawer-open'\n };\n};",
|
|
168
|
+
"// src/components/navigation/system/core.ts\n\nimport { NavigationSystemState, NavigationItem } from \"./types\";\nimport { isMobileDevice } from \"../../../core/utils/mobile\";\nimport createNavigation from \"../navigation\";\n\n/**\n * Update drawer content for a specific section WITHOUT changing visibility\n *\n * @param state - System state\n * @param sectionId - Section ID to display\n * @param showDrawer - Function to show the drawer\n * @param hideDrawer - Function to hide the drawer\n */\nexport const updateDrawerContent = (\n state: NavigationSystemState,\n sectionId: string,\n showDrawer: () => void,\n hideDrawer: () => void\n): void => {\n if (!state.drawer || !sectionId || !state.items[sectionId]) {\n return;\n }\n\n // Get section items\n const sectionData = state.items[sectionId];\n const items = sectionData.items || [];\n\n // If no items, hide drawer and exit\n if (items.length === 0) {\n hideDrawer();\n return;\n }\n\n // Clear existing drawer items first using the API\n const currentItems = state.drawer.getAllItems();\n if (currentItems?.length > 0) {\n currentItems.forEach((item: any) => {\n state.drawer.removeItem(item.config.id);\n });\n }\n\n // Add new items to drawer through the API\n items.forEach((item: NavigationItem) => {\n state.drawer.addItem(item);\n });\n\n // Show the drawer\n showDrawer();\n};\n\n/**\n * Creates the rail navigation component\n *\n * @param state - System state\n * @param config - System configuration\n * @returns Rail navigation component\n */\nexport const createRailNavigation = (\n state: NavigationSystemState,\n config: any\n): any => {\n // Build rail items from sections\n const railItems = Object.keys(state.items || {}).map((sectionId) => ({\n id: sectionId,\n label: state.items[sectionId]?.label || sectionId,\n icon: state.items[sectionId]?.icon || \"\",\n active: sectionId === state.activeSection,\n }));\n\n // Create the rail component\n const rail = createNavigation({\n variant: \"rail\",\n position: \"left\",\n showLabels: config.showLabelsOnRail,\n items: railItems,\n ...config.railOptions,\n });\n\n document.body.appendChild(rail.element);\n return rail;\n};\n\n/**\n * Creates the drawer navigation component\n *\n * @param state - System state\n * @param config - System configuration\n * @returns Drawer navigation component\n */\nexport const createDrawerNavigation = (\n state: NavigationSystemState,\n config: any\n): any => {\n // Create the drawer component (initially empty)\n const drawer = createNavigation({\n variant: \"drawer\",\n position: \"left\",\n items: [], // Start empty\n ...config.drawerOptions,\n });\n\n document.body.appendChild(drawer.element);\n\n // Mark drawer with identifier\n drawer.element.dataset.id = \"drawer\";\n\n // IMPORTANT: Make drawer initially hidden unless explicitly expanded\n if (!config.expanded) {\n drawer.element.classList.add(\"mtrl-nav--hidden\");\n drawer.element.setAttribute(\"aria-hidden\", \"true\");\n }\n\n return drawer;\n};\n\n/**\n * Shows the drawer with mobile-specific behaviors\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n */\nexport const showDrawer = (\n state: NavigationSystemState,\n mobileConfig: any\n): void => {\n if (!state.drawer) return;\n\n state.drawer.element.classList.remove(\"mtrl-nav--hidden\");\n state.drawer.element.setAttribute(\"aria-hidden\", \"false\");\n\n // Apply mobile-specific behaviors\n if (state.isMobile) {\n if (state.overlayElement) {\n state.overlayElement.classList.add(\"active\");\n state.overlayElement.setAttribute(\"aria-hidden\", \"false\");\n }\n\n // Lock body scroll if enabled\n if (mobileConfig.lockBodyScroll) {\n document.body.classList.add(mobileConfig.bodyLockClass);\n }\n\n // Ensure close button is visible\n if (state.closeButtonElement) {\n state.closeButtonElement.style.display = \"flex\";\n }\n }\n};\n\n/**\n * Hides the drawer with mobile-specific behaviors\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n */\nexport const hideDrawer = (\n state: NavigationSystemState,\n mobileConfig: any\n): void => {\n if (!state.drawer) return;\n\n state.drawer.element.classList.add(\"mtrl-nav--hidden\");\n state.drawer.element.setAttribute(\"aria-hidden\", \"true\");\n\n // Remove mobile-specific effects\n if (state.overlayElement) {\n state.overlayElement.classList.remove(\"active\");\n state.overlayElement.setAttribute(\"aria-hidden\", \"true\");\n }\n\n // Unlock body scroll\n if (mobileConfig.lockBodyScroll) {\n document.body.classList.remove(mobileConfig.bodyLockClass);\n }\n};\n\n/**\n * Checks if drawer is visible\n *\n * @param state - System state\n * @returns true if drawer is visible\n */\nexport const isDrawerVisible = (state: NavigationSystemState): boolean => {\n if (!state.drawer) return false;\n return !state.drawer.element.classList.contains(\"mtrl-nav--hidden\");\n};\n\n/**\n * Checks and updates the mobile state\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n * @param setupMobileMode - Function to set up mobile mode\n * @param teardownMobileMode - Function to tear down mobile mode\n * @param systemApi - Reference to the public system API\n */\nexport const checkMobileState = (\n state: NavigationSystemState,\n mobileConfig: any,\n setupMobileMode: () => void,\n teardownMobileMode: () => void,\n systemApi: any\n): void => {\n const prevState = state.isMobile;\n state.isMobile =\n window.innerWidth <= mobileConfig.breakpoint || isMobileDevice();\n\n // If state changed, adjust UI\n if (prevState !== state.isMobile) {\n if (state.isMobile) {\n // Switched to mobile mode\n setupMobileMode();\n } else {\n // Switched to desktop mode\n teardownMobileMode();\n }\n\n // Emit a view change event\n if (systemApi.onViewChange) {\n systemApi.onViewChange({\n mobile: state.isMobile,\n previousMobile: prevState,\n width: window.innerWidth,\n });\n }\n }\n};\n\n/**\n * Clean up resources when the system is destroyed\n *\n * @param state - System state\n */\nexport const cleanupResources = (state: NavigationSystemState): void => {\n // Clean up overlay\n if (state.overlayElement && state.overlayElement.parentNode) {\n state.overlayElement.parentNode.removeChild(state.overlayElement);\n state.overlayElement = null;\n }\n\n // Destroy components\n if (state.rail) {\n state.rail.destroy();\n state.rail = null;\n }\n\n if (state.drawer) {\n state.drawer.destroy();\n state.drawer = null;\n }\n\n // Reset state\n state.activeSection = null;\n state.activeSubsection = null;\n state.mouseInDrawer = false;\n state.mouseInRail = false;\n state.processingChange = false;\n state.isMobile = false;\n};\n\n/**\n * Navigate to a specific section and subsection\n *\n * @param state - System state\n * @param section - Section ID\n * @param subsection - Subsection ID (optional)\n * @param silent - Whether to suppress change events\n */\nexport const navigateTo = (\n state: NavigationSystemState,\n section: string,\n subsection?: string,\n silent?: boolean\n): void => {\n // Skip if section doesn't exist\n if (!section || !state.items[section]) {\n return;\n }\n\n // Check if we're already on this section and subsection\n if (\n state.activeSection === section &&\n state.activeSubsection === subsection\n ) {\n return;\n }\n\n // Update active section\n state.activeSection = section;\n\n // Update rail if it exists\n if (state.rail) {\n state.rail.setActive(section, silent);\n }\n\n // Update active subsection if specified\n if (subsection && state.drawer) {\n state.activeSubsection = subsection;\n state.drawer.setActive(subsection, silent);\n }\n};\n",
|
|
169
|
+
"// src/components/navigation/system/events.ts\n\nimport { NavigationSystemState } from \"./types\";\n\n/**\n * Registers rail navigation event handlers\n *\n * @param state - System state\n * @param config - System configuration\n * @param updateDrawerContent - Function to update drawer content\n * @param showDrawer - Function to show the drawer\n * @param hideDrawer - Function to hide the drawer\n * @param systemApi - Reference to the public system API\n */\nexport const registerRailEvents = (\n state: NavigationSystemState,\n config: any,\n updateDrawerContent: (sectionId: string) => void,\n showDrawer: () => void,\n hideDrawer: () => void,\n systemApi: any\n): void => {\n const rail = state.rail;\n if (!rail) return;\n\n // Register for change events - will listen for when rail items are clicked\n rail.on(\"change\", (event: any) => {\n // Extract ID from event data\n const id = event?.id;\n\n if (!id || state.processingChange) {\n return;\n }\n\n // Check if this is a user action\n const isUserAction = event?.source === \"userAction\";\n\n // Set processing flag to prevent loops\n state.processingChange = true;\n\n // Update active section\n state.activeSection = id;\n\n // Handle internally first - update drawer content\n updateDrawerContent(id);\n\n // Then notify external handlers\n if (systemApi.onSectionChange && isUserAction) {\n systemApi.onSectionChange(id, {\n source: isUserAction ? \"userClick\" : \"programmatic\",\n });\n }\n\n // Clear the processing flag after a delay\n setTimeout(() => {\n state.processingChange = false;\n }, 50);\n });\n\n rail.on(\"mouseover\", (event: any) => {\n const id = event?.id;\n\n // Set rail mouse state\n state.mouseInRail = true;\n\n // Clear any existing hover timer\n clearTimeout(state.hoverTimer as number);\n state.hoverTimer = null;\n\n // Only schedule drawer operations if there's an ID\n if (id) {\n // Check if this section has items\n if (state.items[id]?.items?.length > 0) {\n // Has items - schedule drawer opening\n state.hoverTimer = window.setTimeout(() => {\n updateDrawerContent(id);\n }, config.hoverDelay) as unknown as number;\n } else {\n // No items - hide drawer after a delay to prevent flickering\n state.closeTimer = window.setTimeout(() => {\n // Only hide if we're still in the rail but not in the drawer\n if (state.mouseInRail && !state.mouseInDrawer) {\n hideDrawer();\n }\n }, config.hoverDelay) as unknown as number;\n }\n }\n });\n\n rail.on(\"mouseenter\", () => {\n state.mouseInRail = true;\n\n // Clear any pending drawer close timer when entering rail\n clearTimeout(state.closeTimer as number);\n state.closeTimer = null;\n });\n\n rail.on(\"mouseleave\", () => {\n state.mouseInRail = false;\n\n // Clear any existing hover timer\n clearTimeout(state.hoverTimer as number);\n state.hoverTimer = null;\n\n // Only set timer to hide drawer if we're not in drawer either\n if (!state.mouseInDrawer) {\n state.closeTimer = window.setTimeout(() => {\n // Double-check we're still not in rail or drawer before hiding\n if (!state.mouseInRail && !state.mouseInDrawer) {\n hideDrawer();\n }\n }, config.closeDelay) as unknown as number;\n }\n });\n};\n\n/**\n * Registers drawer navigation event handlers\n *\n * @param state - System state\n * @param config - System configuration\n * @param hideDrawer - Function to hide the drawer\n * @param systemApi - Reference to the public system API\n */\nexport const registerDrawerEvents = (\n state: NavigationSystemState,\n config: any,\n hideDrawer: () => void,\n systemApi: any\n): void => {\n const drawer = state.drawer;\n if (!drawer) return;\n\n // Use the component's native event system\n if (typeof drawer.on === \"function\") {\n // Handle item selection\n drawer.on(\"change\", (event: any) => {\n const id = event.id;\n\n state.activeSubsection = id;\n\n // If configuration specifies to hide drawer on click, do so\n if (config.hideDrawerOnClick) {\n hideDrawer();\n }\n\n // Emit item selection event\n if (systemApi.onItemSelect) {\n systemApi.onItemSelect(event);\n }\n });\n\n // Handle mouseenter/mouseleave for drawer\n drawer.on(\"mouseenter\", () => {\n state.mouseInDrawer = true;\n\n // Clear any hover and close timers\n clearTimeout(state.hoverTimer as number);\n clearTimeout(state.closeTimer as number);\n state.hoverTimer = null;\n state.closeTimer = null;\n });\n\n drawer.on(\"mouseleave\", () => {\n state.mouseInDrawer = false;\n\n // Only set timer to hide drawer if we're not in rail\n if (!state.mouseInRail) {\n state.closeTimer = window.setTimeout(() => {\n // Double-check we're still not in drawer or rail before hiding\n if (!state.mouseInDrawer && !state.mouseInRail) {\n hideDrawer();\n }\n }, config.closeDelay) as unknown as number;\n }\n });\n }\n};\n\n/**\n * Sets up window resize and orientation change handling\n *\n * @param state - System state\n * @param checkMobileState - Function to check and update mobile state\n */\nexport const setupResponsiveHandling = (\n state: NavigationSystemState,\n checkMobileState: () => void\n): void => {\n // Setup responsive behavior\n if (window.ResizeObserver) {\n // Use ResizeObserver for better performance\n state.resizeObserver = new ResizeObserver(() => {\n checkMobileState();\n });\n state.resizeObserver.observe(document.body);\n } else {\n // Fallback to window resize event\n window.addEventListener(\"resize\", checkMobileState);\n }\n\n // Listen for orientation changes on mobile\n window.addEventListener(\"orientationchange\", () => {\n // Small delay to ensure dimensions have updated\n setTimeout(checkMobileState, 100);\n });\n};\n\n/**\n * Cleans up all event handlers and resources\n *\n * @param state - System state\n * @param checkMobileState - Function reference to remove event handlers\n */\nexport const cleanupEvents = (\n state: NavigationSystemState,\n checkMobileState: () => void\n): void => {\n // Clean up resize observer\n if (state.resizeObserver) {\n state.resizeObserver.disconnect();\n state.resizeObserver = null;\n } else {\n window.removeEventListener(\"resize\", checkMobileState);\n }\n\n // Remove orientation change listener\n window.removeEventListener(\"orientationchange\", checkMobileState);\n\n // Remove outside click handler\n if (state.outsideClickHandler) {\n const eventType = \"ontouchend\" in window ? \"touchend\" : \"click\";\n document.removeEventListener(eventType, state.outsideClickHandler);\n }\n\n // Clear timers\n clearTimeout(state.hoverTimer as number);\n clearTimeout(state.closeTimer as number);\n state.hoverTimer = null;\n state.closeTimer = null;\n};\n",
|
|
170
|
+
"// src/components/navigation/system/mobile.ts\n\nimport { NavigationSystemState } from './types';\nimport { \n hasTouchSupport, \n normalizeEvent,\n TOUCH_CONFIG,\n TOUCH_TARGETS \n} from '../../../core/utils/mobile';\n\n/**\n * Creates and appends overlay element for mobile\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n * @param hideDrawer - Function to hide the drawer\n * @returns Overlay element\n */\nexport const createOverlay = (\n state: NavigationSystemState, \n mobileConfig: any, \n hideDrawer: () => void\n): HTMLElement => {\n if (state.overlayElement) return state.overlayElement;\n \n state.overlayElement = document.createElement('div');\n state.overlayElement.className = mobileConfig.overlayClass;\n state.overlayElement.setAttribute('aria-hidden', 'true');\n document.body.appendChild(state.overlayElement);\n \n state.overlayElement.addEventListener('click', (event) => {\n if (event.target === state.overlayElement) {\n hideDrawer();\n }\n });\n \n return state.overlayElement;\n};\n\n/**\n * Creates and adds close button to the drawer\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n * @param hideDrawer - Function to hide the drawer\n * @returns Close button element\n */\nexport const createCloseButton = (\n state: NavigationSystemState, \n mobileConfig: any, \n hideDrawer: () => void\n): HTMLElement | null => {\n if (!state.drawer || state.closeButtonElement) return null;\n \n state.closeButtonElement = document.createElement('button');\n state.closeButtonElement.className = mobileConfig.closeButtonClass;\n state.closeButtonElement.setAttribute('aria-label', 'Close navigation');\n state.closeButtonElement.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n `;\n \n // Handle click event\n state.closeButtonElement.addEventListener('click', () => {\n hideDrawer();\n });\n \n // Apply touch-friendly styles if needed\n if (hasTouchSupport() && mobileConfig.optimizeForTouch) {\n state.closeButtonElement.style.minWidth = `${TOUCH_TARGETS.COMFORTABLE}px`;\n state.closeButtonElement.style.minHeight = `${TOUCH_TARGETS.COMFORTABLE}px`;\n \n // Add touch feedback\n state.closeButtonElement.addEventListener('touchstart', () => {\n state.closeButtonElement.classList.add('active');\n }, { passive: true });\n \n state.closeButtonElement.addEventListener('touchend', () => {\n setTimeout(() => {\n state.closeButtonElement.classList.remove('active');\n }, TOUCH_CONFIG.FEEDBACK_DURATION);\n }, { passive: true });\n }\n \n state.drawer.element.appendChild(state.closeButtonElement);\n return state.closeButtonElement;\n};\n\n/**\n * Sets up mobile mode features\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n * @param hideDrawer - Function to hide the drawer\n * @param isDrawerVisible - Function to check if drawer is visible\n */\nexport const setupMobileMode = (\n state: NavigationSystemState, \n mobileConfig: any, \n hideDrawer: () => void,\n isDrawerVisible: () => boolean\n): void => {\n const drawer = state.drawer;\n const rail = state.rail;\n \n if (!drawer || !rail) return;\n \n // Create mobile UI elements\n createOverlay(state, mobileConfig, hideDrawer);\n createCloseButton(state, mobileConfig, hideDrawer);\n \n // Setup outside click handling\n setupOutsideClickHandling(state, mobileConfig, hideDrawer, isDrawerVisible);\n \n // Setup touch gestures if enabled\n if (mobileConfig.enableSwipeGestures && hasTouchSupport()) {\n setupTouchGestures(state, hideDrawer, isDrawerVisible);\n }\n \n // Hide drawer initially in mobile mode\n hideDrawer();\n};\n\n/**\n * Sets up outside click handling for mobile\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n * @param hideDrawer - Function to hide the drawer\n * @param isDrawerVisible - Function to check if drawer is visible\n */\nexport const setupOutsideClickHandling = (\n state: NavigationSystemState, \n mobileConfig: any, \n hideDrawer: () => void,\n isDrawerVisible: () => boolean\n): void => {\n if (!mobileConfig.hideOnClickOutside) return;\n \n // Only set up once\n if (state.outsideClickHandlerSet) return;\n state.outsideClickHandlerSet = true;\n \n // Use either click or touchend event depending on device capability\n const eventType = hasTouchSupport() ? 'touchend' : 'click';\n \n // The handler function\n const handleOutsideClick = (event: Event) => {\n if (!state.isMobile || !isDrawerVisible()) return;\n \n const normalizedEvent = normalizeEvent(event as MouseEvent | TouchEvent);\n const target = normalizedEvent.target as HTMLElement;\n \n // Don't close if clicking on drawer, rail, or excluded elements\n if (state.drawer.element.contains(target) || \n state.rail.element.contains(target)) {\n return;\n }\n \n // Close drawer - it's an outside click/touch\n hideDrawer();\n };\n \n // Store handler for cleanup\n state.outsideClickHandler = handleOutsideClick;\n \n // Add listener\n document.addEventListener(eventType, handleOutsideClick,\n hasTouchSupport() ? { passive: true } : false);\n};\n\n/**\n * Sets up touch gestures for mobile\n *\n * @param state - System state\n * @param hideDrawer - Function to hide the drawer\n * @param isDrawerVisible - Function to check if drawer is visible\n */\nexport const setupTouchGestures = (\n state: NavigationSystemState, \n hideDrawer: () => void,\n isDrawerVisible: () => boolean,\n showDrawer?: () => void\n): void => {\n const drawer = state.drawer;\n const rail = state.rail;\n \n if (!drawer || !rail) return;\n \n let touchStartX = 0;\n let touchStartY = 0;\n \n // Rail swipe right to open drawer\n rail.element.addEventListener('touchstart', (event: TouchEvent) => {\n const touch = event.touches[0];\n touchStartX = touch.clientX;\n touchStartY = touch.clientY;\n }, { passive: true });\n \n rail.element.addEventListener('touchmove', (event: TouchEvent) => {\n if (!state.isMobile || isDrawerVisible() || !showDrawer) return;\n \n const touch = event.touches[0];\n const deltaX = touch.clientX - touchStartX;\n const deltaY = touch.clientY - touchStartY;\n \n // Only consider horizontal swipes\n if (Math.abs(deltaX) > Math.abs(deltaY) && \n deltaX > TOUCH_CONFIG.SWIPE_THRESHOLD) {\n showDrawer();\n }\n }, { passive: true });\n \n // Drawer swipe left to close\n drawer.element.addEventListener('touchstart', (event: TouchEvent) => {\n const touch = event.touches[0];\n touchStartX = touch.clientX;\n touchStartY = touch.clientY;\n }, { passive: true });\n \n // Use touchmove with transform for visual feedback\n drawer.element.addEventListener('touchmove', (event: TouchEvent) => {\n if (!state.isMobile || !isDrawerVisible()) return;\n \n const touch = event.touches[0];\n const deltaX = touch.clientX - touchStartX;\n \n // Only apply transform for leftward swipes\n if (deltaX < 0) {\n // Apply transform with resistance\n drawer.element.style.transform = `translateX(${deltaX / 2}px)`;\n \n // Close if threshold reached\n if (deltaX < -TOUCH_CONFIG.SWIPE_THRESHOLD) {\n hideDrawer();\n }\n }\n }, { passive: true });\n \n // Reset transforms when touch ends\n drawer.element.addEventListener('touchend', () => {\n if (drawer.element.style.transform) {\n drawer.element.style.transition = 'transform 0.2s ease';\n drawer.element.style.transform = '';\n \n setTimeout(() => {\n drawer.element.style.transition = '';\n }, 200);\n }\n }, { passive: true });\n};\n\n/**\n * Tears down mobile-specific features\n *\n * @param state - System state\n * @param mobileConfig - Mobile configuration\n */\nexport const teardownMobileMode = (\n state: NavigationSystemState, \n mobileConfig: any\n): void => {\n // Hide overlay\n if (state.overlayElement) {\n state.overlayElement.classList.remove('active');\n state.overlayElement.setAttribute('aria-hidden', 'true');\n }\n \n // Hide close button\n if (state.closeButtonElement) {\n state.closeButtonElement.style.display = 'none';\n }\n \n // Remove body scroll lock if applied\n document.body.classList.remove(mobileConfig.bodyLockClass);\n};",
|
|
171
|
+
"// src/components/navigation/system/index.ts\n\nimport { NavigationSystemConfig, NavigationSystem } from \"./types\";\n\nimport { createInitialState, createConfig, createMobileConfig } from \"./state\";\n\nimport {\n createRailNavigation,\n createDrawerNavigation,\n updateDrawerContent,\n showDrawer as showDrawerCore,\n hideDrawer as hideDrawerCore,\n isDrawerVisible as isDrawerVisibleCore,\n checkMobileState as checkMobileStateCore,\n cleanupResources,\n navigateTo as navigateToCore,\n} from \"./core\";\n\nimport {\n registerRailEvents,\n registerDrawerEvents,\n setupResponsiveHandling,\n cleanupEvents,\n} from \"./events\";\n\nimport {\n setupMobileMode as setupMobileModeCore,\n teardownMobileMode,\n} from \"./mobile\";\n\n/**\n * Creates a complete navigation system with synchronized rail and drawer components\n *\n * @param options - System configuration options\n * @returns Navigation system API\n */\nexport const createNavigationSystem = (\n options: NavigationSystemConfig = {}\n): NavigationSystem => {\n // Initialize state and configuration\n const state = createInitialState(options);\n const config = createConfig(options);\n const mobileConfig = createMobileConfig(options);\n\n // Create system API object with placeholders\n const system: NavigationSystem = {\n initialize: () => system,\n cleanup: () => {},\n navigateTo: () => {},\n getRail: () => state.rail,\n getDrawer: () => state.drawer,\n getActiveSection: () => state.activeSection,\n getActiveSubsection: () => state.activeSubsection,\n showDrawer: () => {},\n hideDrawer: () => {},\n isDrawerVisible: () => false,\n configure: () => system,\n setProcessingChange: () => {},\n isProcessingChange: () => false,\n isMobile: () => state.isMobile,\n checkMobileState: () => {},\n onSectionChange: undefined,\n onItemSelect: undefined,\n onViewChange: undefined,\n };\n\n // Implementation functions that use the state\n const showDrawer = () => showDrawerCore(state, mobileConfig);\n const hideDrawer = () => hideDrawerCore(state, mobileConfig);\n const isDrawerVisible = () => isDrawerVisibleCore(state);\n\n const updateDrawerContentWrapper = (sectionId: string) => {\n updateDrawerContent(state, sectionId, showDrawer, hideDrawer);\n };\n\n const setupMobileMode = () => {\n setupMobileModeCore(state, mobileConfig, hideDrawer, isDrawerVisible);\n };\n\n const checkMobileState = () => {\n checkMobileStateCore(\n state,\n mobileConfig,\n setupMobileMode,\n () => teardownMobileMode(state, mobileConfig),\n system\n );\n };\n\n const navigateTo = (\n section: string,\n subsection?: string,\n silent?: boolean\n ) => {\n navigateToCore(state, section, subsection, silent);\n };\n\n // Implementation of the initialize method\n const initialize = (): NavigationSystem => {\n // Create rail component\n state.rail = createRailNavigation(state, config);\n\n // Create drawer component\n state.drawer = createDrawerNavigation(state, config);\n\n // Register event handlers\n registerRailEvents(\n state,\n config,\n updateDrawerContentWrapper,\n showDrawer,\n hideDrawer,\n system\n );\n registerDrawerEvents(state, config, hideDrawer, system);\n\n // Set up responsive behavior\n setupResponsiveHandling(state, checkMobileState);\n\n // Set active section if specified\n if (options.activeSection && state.items[options.activeSection]) {\n state.activeSection = options.activeSection;\n\n if (state.rail) {\n state.rail.setActive(options.activeSection);\n }\n\n // Update drawer content without showing it\n updateDrawerContentWrapper(options.activeSection);\n\n // Only show drawer if expanded is explicitly true\n if (options.expanded === true) {\n showDrawer();\n } else {\n // Explicitly ensure drawer is hidden\n hideDrawer();\n }\n }\n\n // Check initial mobile state\n checkMobileState();\n\n return system;\n };\n\n // Implementation of the cleanup method\n const cleanup = (): void => {\n cleanupEvents(state, checkMobileState);\n cleanupResources(state);\n };\n\n // Configure method implementation\n const configure = (\n newConfig: Partial<NavigationSystemConfig>\n ): NavigationSystem => {\n Object.assign(options, newConfig);\n Object.assign(config, createConfig({ ...options, ...newConfig }));\n Object.assign(\n mobileConfig,\n createMobileConfig({ ...options, ...newConfig })\n );\n return system;\n };\n\n // Assign implementations to system object\n system.initialize = initialize;\n system.cleanup = cleanup;\n system.navigateTo = navigateTo;\n system.showDrawer = showDrawer;\n system.hideDrawer = hideDrawer;\n system.isDrawerVisible = isDrawerVisible;\n system.configure = configure;\n system.setProcessingChange = (isProcessing: boolean) => {\n state.processingChange = isProcessing;\n };\n system.isProcessingChange = () => state.processingChange;\n system.isMobile = () => state.isMobile;\n system.checkMobileState = checkMobileState;\n\n // Return the uninitialized system\n return system;\n};\n\nexport default createNavigationSystem;\n\n// Re-export types for external use\nexport * from \"./types\";\n",
|
|
156
172
|
"// src/components/progress/index.ts\n\nexport { default } from \"./progress\";\nexport { ProgressConfig, ProgressComponent, ProgressShape } from \"./types\";\n",
|
|
157
173
|
"// src/components/radios/radios.ts\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withDisabled,\n withLifecycle,\n} from \"../../core/compose/features\";\nimport { withRadio } from \"./radio\";\nimport { withAPI } from \"./api\";\nimport { RadiosConfig, RadiosComponent } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new Radios component\n * @param {RadiosConfig} config - Radios configuration object\n * @returns {RadiosComponent} Radios component instance\n */\nconst createRadios = (config: RadiosConfig): RadiosComponent => {\n // Ensure name is provided\n if (!config.name) {\n config.name = `radios-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n const baseConfig = createBaseConfig(config);\n\n try {\n // First add events support before radio functionality\n const radios = pipe(\n createBase,\n withEvents(), // Make sure this runs first to provide events\n withElement(getElementConfig(baseConfig)),\n withRadio(baseConfig),\n withDisabled(baseConfig),\n withLifecycle(),\n (comp) => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n\n return radios as RadiosComponent;\n } catch (error) {\n console.error(\"Radios creation error:\", error);\n throw new Error(\n `Failed to create radios component: ${(error as Error).message}`\n );\n }\n};\n\nexport default createRadios;\n",
|
|
158
174
|
"// src/components/radios/radio.ts\nimport { RadiosConfig, RadioOptionConfig, RadioItem } from './types';\n\n/**\n * Creates a feature that adds radio functionality to a component\n * @param {RadiosConfig} config - Configuration with radio options\n * @returns {Function} Higher-order function that adds radio to component\n */\nexport const withRadio = (config: RadiosConfig) => (component) => {\n const radios: RadioItem[] = [];\n const radiosClass = component.getClass('radios');\n let selectedValue = config.value || '';\n \n // Add direction class\n component.element.classList.add(\n `${radiosClass}--${config.direction || 'vertical'}`\n );\n \n // Setup disabled state if needed\n if (config.disabled) {\n component.element.classList.add(`${radiosClass}--disabled`);\n }\n \n /**\n * Creates a radio item DOM structure\n * @param {RadioOptionConfig} option - Radio option configuration\n * @returns {RadioItem} Radio item object\n */\n const createRadioItem = (option: RadioOptionConfig): RadioItem => {\n // Create container\n const radioContainer = document.createElement('div');\n radioContainer.classList.add(`${radiosClass}-item`);\n \n // Create input\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = config.name;\n input.value = option.value;\n input.classList.add(`${radiosClass}-input`);\n \n // Set checked state if value matches\n if (selectedValue === option.value) {\n input.checked = true;\n }\n \n // Set disabled state if needed\n if (config.disabled || option.disabled) {\n input.disabled = true;\n radioContainer.classList.add(`${radiosClass}-item--disabled`);\n }\n \n // Create label\n const label = document.createElement('label');\n label.classList.add(`${radiosClass}-label`);\n \n // Create a container for the radio visual\n const radioControl = document.createElement('span');\n radioControl.classList.add(`${radiosClass}-control`);\n \n // Create the radio circle\n const radioCircle = document.createElement('span');\n radioCircle.classList.add(`${radiosClass}-circle`);\n \n // Add ripple container if ripple is enabled\n if (config.ripple !== false) {\n const rippleContainer = document.createElement('span');\n rippleContainer.classList.add(`${radiosClass}-ripple`);\n radioControl.appendChild(rippleContainer);\n }\n \n // Add circle to control\n radioControl.appendChild(radioCircle);\n \n // Create text span\n const textSpan = document.createElement('span');\n textSpan.classList.add(`${radiosClass}-text`);\n textSpan.textContent = option.label;\n \n // Set label position\n if (option.labelBefore) {\n label.classList.add(`${radiosClass}-label--before`);\n label.appendChild(textSpan);\n label.appendChild(radioControl);\n } else {\n label.appendChild(radioControl);\n label.appendChild(textSpan);\n }\n \n // Setup ID for label-input connection\n const inputId = `${radiosClass}-${option.value}-${Math.random().toString(36).substring(2, 9)}`;\n input.id = inputId;\n label.htmlFor = inputId;\n \n // Add elements to container\n radioContainer.appendChild(input);\n radioContainer.appendChild(label);\n \n // Add change event listener\n const handleChange = (e) => {\n if (input.checked) {\n selectedValue = option.value;\n \n // Update other radio inputs\n radios.forEach(radio => {\n if (radio.input !== input) {\n radio.input.checked = false;\n }\n });\n \n // Safely emit change event if events exist\n if (component.events && typeof component.events.emit === 'function') {\n component.events.emit('change', {\n value: option.value,\n originalEvent: e,\n option\n });\n } else if (typeof component.on === 'function') {\n // Fallback to trigger handlers directly if they were registered with on()\n const changeEvent = new CustomEvent('change', {\n detail: {\n value: option.value,\n originalEvent: e,\n option\n }\n });\n component.element.dispatchEvent(changeEvent);\n }\n }\n };\n \n input.addEventListener('change', handleChange);\n \n // Return radio item\n return {\n element: radioContainer,\n input,\n label,\n config: option,\n destroy: () => {\n input.removeEventListener('change', handleChange);\n if (radioContainer.parentNode) {\n radioContainer.parentNode.removeChild(radioContainer);\n }\n }\n };\n };\n \n /**\n * Adds a radio option to the radios component\n * @param {RadioOptionConfig} option - Radio option configuration\n * @returns {Component} The component for chaining\n */\n const addOption = (option: RadioOptionConfig) => {\n // Create radio item\n const radioItem = createRadioItem(option);\n \n // Add to DOM\n component.element.appendChild(radioItem.element);\n \n // Add to radios array\n radios.push(radioItem);\n \n return component;\n };\n \n /**\n * Removes a radio option from the radios component\n * @param {string} value - Value of the radio to remove\n * @returns {Component} The component for chaining\n */\n const removeOption = (value: string) => {\n const index = radios.findIndex(radio => radio.config.value === value);\n \n if (index !== -1) {\n // Get radio item\n const radioItem = radios[index];\n \n // Remove from DOM and cleanup\n radioItem.destroy();\n \n // Remove from array\n radios.splice(index, 1);\n \n // If we removed the selected value, reset the selection\n if (selectedValue === value) {\n selectedValue = '';\n }\n }\n \n return component;\n };\n \n // Initialize radios from config\n if (config.options && Array.isArray(config.options)) {\n config.options.forEach(option => addOption(option));\n }\n \n // Create events object if it doesn't exist\n if (!component.events) {\n component.events = {\n on: (event, handler) => {\n component.element.addEventListener(event, (e) => handler(e.detail));\n },\n off: (event, handler) => {\n component.element.removeEventListener(event, handler);\n },\n emit: (event, data) => {\n const customEvent = new CustomEvent(event, { detail: data });\n component.element.dispatchEvent(customEvent);\n }\n };\n }\n \n // Return enhanced component\n return {\n ...component,\n radios,\n \n getValue: () => selectedValue,\n \n setValue: (value: string) => {\n selectedValue = value;\n \n radios.forEach(radio => {\n radio.input.checked = radio.config.value === value;\n });\n \n return component;\n },\n \n getSelected: () => {\n const selected = radios.find(radio => radio.config.value === selectedValue);\n return selected ? selected.config : null;\n },\n \n addOption,\n removeOption,\n \n enable: () => {\n component.element.classList.remove(`${radiosClass}--disabled`);\n \n radios.forEach(radio => {\n radio.input.disabled = radio.config.disabled || false;\n if (!radio.config.disabled) {\n radio.element.classList.remove(`${radiosClass}-item--disabled`);\n }\n });\n \n return component;\n },\n \n disable: () => {\n component.element.classList.add(`${radiosClass}--disabled`);\n \n radios.forEach(radio => {\n radio.input.disabled = true;\n radio.element.classList.add(`${radiosClass}-item--disabled`);\n });\n \n return component;\n },\n \n enableOption: (value: string) => {\n const radio = radios.find(r => r.config.value === value);\n \n if (radio) {\n radio.config.disabled = false;\n radio.input.disabled = component.element.classList.contains(`${radiosClass}--disabled`);\n \n if (!radio.input.disabled) {\n radio.element.classList.remove(`${radiosClass}-item--disabled`);\n }\n }\n \n return component;\n },\n \n disableOption: (value: string) => {\n const radio = radios.find(r => r.config.value === value);\n \n if (radio) {\n radio.config.disabled = true;\n radio.input.disabled = true;\n radio.element.classList.add(`${radiosClass}-item--disabled`);\n }\n \n return component;\n }\n };\n};\n\nexport default withRadio;",
|
|
@@ -179,7 +195,7 @@
|
|
|
179
195
|
"import {\n BaseComponent,\n ElementComponent,\n} from \"../../../core/compose/component\";\n\n/**\n * Configuration for error feature\n */\nexport interface ErrorConfig {\n /**\n * Initial error state\n */\n error?: boolean;\n\n /**\n * CSS class prefix\n */\n prefix?: string;\n\n /**\n * Component name\n */\n componentName?: string;\n\n [key: string]: any;\n}\n\n/**\n * Component with supporting text capabilities (if available)\n */\ninterface ComponentWithSupportingText extends ElementComponent {\n setSupportingText?: (text: string, isError?: boolean) => void;\n supportingTextElement?: HTMLElement | null;\n}\n\n/**\n * Component with error state capabilities\n */\nexport interface ErrorComponent extends BaseComponent {\n /**\n * Current error state\n */\n errorState: boolean;\n\n /**\n * Sets error state\n * @param error - Whether to show error state\n * @param message - Optional error message to display\n * @returns Component instance for chaining\n */\n setError: (error: boolean, message?: string) => ErrorComponent;\n\n /**\n * Gets current error state\n * @returns Whether component is in error state\n */\n isError: () => boolean;\n}\n\n/**\n * Adds error state management to a component\n * @param config - Configuration with error settings\n * @returns Function that enhances a component with error state\n */\nexport const withError =\n <T extends ErrorConfig>(config: T) =>\n <C extends ComponentWithSupportingText>(component: C): C & ErrorComponent => {\n const PREFIX = config.prefix || \"mtrl\";\n const COMPONENT = config.componentName || \"textfield\";\n\n // Track error state\n let errorState = config.error || false;\n\n // Apply initial error state if configured\n if (errorState) {\n component.element.classList.add(`${PREFIX}-${COMPONENT}--error`);\n }\n\n return {\n ...component,\n errorState,\n\n setError(error: boolean, message?: string) {\n errorState = error;\n\n // Toggle error class on the component\n component.element.classList.toggle(\n `${PREFIX}-${COMPONENT}--error`,\n error\n );\n\n // If message is provided and component has supporting text capability\n if (message !== undefined && component.setSupportingText) {\n if (message) {\n component.setSupportingText(message, error);\n } else if (!error) {\n // Clear supporting text if removing error with empty message\n component.setSupportingText(\"\", false);\n }\n } else if (\n component.supportingTextElement &&\n component.setSupportingText\n ) {\n // If no message but component has existing supporting text, update its error state\n const currentText = component.supportingTextElement.textContent || \"\";\n if (currentText) {\n component.setSupportingText(currentText, error);\n }\n }\n\n return this;\n },\n\n isError() {\n return errorState;\n },\n };\n };\n",
|
|
180
196
|
"// src/components/textfield/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { TextfieldConfig, BaseComponent, ApiOptions } from \"./types\";\nimport { TEXTFIELD_DEFAULTS } from \"./constants\";\n\n/**\n * Default configuration for the Textfield component\n */\nexport const defaultConfig: TextfieldConfig = {\n type: TEXTFIELD_DEFAULTS.TYPE,\n variant: TEXTFIELD_DEFAULTS.VARIANT,\n};\n\n/**\n * Creates the base configuration for Textfield component\n * @param {TextfieldConfig} config - User provided configuration\n * @returns {TextfieldConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (\n config: TextfieldConfig = {}\n): TextfieldConfig =>\n createComponentConfig(defaultConfig, config, \"textfield\") as TextfieldConfig;\n\n/**\n * Generates element configuration for the Textfield component\n * @param {TextfieldConfig} config - Textfield configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: TextfieldConfig) =>\n createElementConfig(config, {\n tag: \"div\",\n className: config.class,\n });\n\n/**\n * Creates API configuration for the Textfield component\n * @param {BaseComponent} comp - Component with disabled and lifecycle features\n * @returns {ApiOptions} API configuration object\n */\nexport const getApiConfig = (comp: BaseComponent): ApiOptions => ({\n disabled: {\n enable: comp.disabled?.enable,\n disable: comp.disabled?.disable,\n },\n lifecycle: {\n destroy: comp.lifecycle?.destroy,\n },\n});\n\nexport default defaultConfig;\n",
|
|
181
197
|
"// src/components/textfield/constants.ts\n\n/**\n * Textfield variant constants\n * @category Components\n */\nexport const TEXTFIELD_VARIANTS = {\n /** Filled variant with background and animated label */\n FILLED: \"filled\",\n /** Outlined variant with border and animated label */\n OUTLINED: \"outlined\",\n} as const;\n\n/**\n * Textfield state constants\n * @category Components\n */\nexport const TEXTFIELD_STATES = {\n /** Textfield is active (focused) */\n ACTIVE: \"active\",\n /** Textfield is inactive (not focused) */\n INACTIVE: \"inactive\",\n /** Textfield is disabled */\n DISABLED: \"disabled\",\n} as const;\n\n/**\n * Textfield type constants\n * @category Components\n */\nexport const TEXTFIELD_TYPES = {\n /** Standard text input */\n TEXT: \"text\",\n /** Password input with obscured characters */\n PASSWORD: \"password\",\n /** Email input with email validation */\n EMAIL: \"email\",\n /** Numeric input */\n NUMBER: \"number\",\n /** Telephone number input */\n TEL: \"tel\",\n /** URL input with URL validation */\n URL: \"url\",\n /** Search input */\n SEARCH: \"search\",\n /** Multiline text input (textarea) */\n MULTILINE: \"multiline\",\n} as const;\n\n/**\n * Textfield event constants\n * @category Components\n */\nexport const TEXTFIELD_EVENTS = {\n /** Fired when textfield value changes */\n CHANGE: \"change\",\n /** Fired during input */\n INPUT: \"input\",\n /** Fired when textfield receives focus */\n FOCUS: \"focus\",\n /** Fired when textfield loses focus */\n BLUR: \"blur\",\n /** Fired when enter key is pressed */\n ENTER: \"enter\",\n /** Fired when a key is pressed down */\n KEYDOWN: \"keydown\",\n /** Fired when a key is released */\n KEYUP: \"keyup\",\n} as const;\n\n/**\n * Textfield density constants\n * @category Components\n */\nexport const TEXTFIELD_DENSITY = {\n /** Default density (56px height) */\n DEFAULT: \"default\",\n /** Compact density (40px height) */\n COMPACT: \"compact\",\n} as const;\n\n/**\n * Default textfield configuration values\n * @category Components\n */\nexport const TEXTFIELD_DEFAULTS = {\n /** Default input type */\n TYPE: TEXTFIELD_TYPES.TEXT,\n /** Default visual variant */\n VARIANT: TEXTFIELD_VARIANTS.FILLED,\n /** Default density level */\n DENSITY: TEXTFIELD_DENSITY.DEFAULT,\n /** Default disabled state */\n DISABLED: false,\n /** Default required state */\n REQUIRED: false,\n /** Default error state */\n ERROR: false,\n /** Default label floating behavior (always floats on focus) */\n FLOAT_LABEL: true,\n /** Default animation duration in milliseconds */\n ANIMATION_DURATION: 150,\n} as const;\n\n/**\n * CSS class names used by the textfield component\n * @category Components\n */\nexport const TEXTFIELD_CLASSES = {\n /** Root element class */\n ROOT: \"textfield\",\n /** Input element class */\n INPUT: \"textfield-input\",\n /** Label element class */\n LABEL: \"textfield-label\",\n /** Container element class */\n CONTAINER: \"textfield-container\",\n /** Filled variant class */\n FILLED: \"textfield--filled\",\n /** Outlined variant class */\n OUTLINED: \"textfield--outlined\",\n /** Focused state class */\n FOCUSED: \"textfield--focused\",\n /** Disabled state class */\n DISABLED: \"textfield--disabled\",\n /** Error state class */\n ERROR: \"textfield--error\",\n /** Required indicator class */\n REQUIRED: \"textfield--required\",\n /** Floating label class */\n LABEL_FLOATING: \"textfield-label--floating\",\n /** Supporting text class */\n SUPPORTING_TEXT: \"textfield-supporting-text\",\n /** Supporting text error class */\n SUPPORTING_TEXT_ERROR: \"textfield-supporting-text--error\",\n /** Leading icon class */\n LEADING_ICON: \"textfield-leading-icon\",\n /** Trailing icon class */\n TRAILING_ICON: \"textfield-trailing-icon\",\n /** Prefix text class */\n PREFIX_TEXT: \"textfield-prefix-text\",\n /** Suffix text class */\n SUFFIX_TEXT: \"textfield-suffix-text\",\n /** Outline element class (for outlined variant) */\n OUTLINE: \"textfield-outline\",\n /** Multiline class */\n MULTILINE: \"textfield--multiline\",\n} as const;\n",
|
|
182
|
-
"// src/components/select/features.ts\nimport createTextfield from \"../textfield\";\nimport createMenu from \"../menu\";\nimport { MenuItem, MenuContent, MenuPosition } from \"../menu/types\";\nimport { SelectOption, SelectConfig, BaseComponent } from \"./types\";\n\n/**\n * Creates a textfield for the select component\n * @param config - Select configuration\n * @returns Function that enhances a component with textfield functionality\n */\nexport const withTextfield =\n (config: SelectConfig) =>\n (component: BaseComponent): BaseComponent => {\n // Get option text from value if provided\n let initialText = \"\";\n if (config.value) {\n const option = (config.options || []).find(\n (opt) => opt.id === config.value,\n );\n if (option) {\n initialText = option.text;\n }\n }\n\n // Create dropdown icon for the textfield\n const dropdownIcon =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><path d=\"M7 10l5 5 5-5H7z\"/></svg>';\n\n // Create textfield component\n const textfield = createTextfield({\n label: config.label,\n variant: config.variant || \"filled\",\n density: config.density || \"default\",\n value: initialText,\n name: config.name,\n disabled: config.disabled,\n required: config.required,\n supportingText: config.supportingText,\n error: config.error,\n trailingIcon: dropdownIcon,\n readonly: true, // Make readonly since selection happens via menu\n });\n\n // Add select-specific class\n textfield.element.classList.add(`${config.prefix || \"mtrl\"}-select`);\n\n // Prevent typing in the input while keeping normal focus/visual behavior\n if (textfield.input) {\n textfield.input.addEventListener(\"keydown\", (e) => {\n // Allow navigation keys to propagate (they're handled by the menu)\n const allowedKeys = [\n \"Tab\",\n \"Escape\",\n \"ArrowDown\",\n \"ArrowUp\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Enter\",\n \" \",\n \"Home\",\n \"End\",\n ];\n if (!allowedKeys.includes(e.key)) {\n e.preventDefault();\n }\n });\n\n // Prevent paste\n textfield.input.addEventListener(\"paste\", (e) => {\n e.preventDefault();\n });\n\n // Prevent cut\n textfield.input.addEventListener(\"cut\", (e) => {\n e.preventDefault();\n });\n }\n\n return {\n ...component,\n element: textfield.element,\n textfield,\n };\n };\n\n/**\n * Recursively processes select options to create menu items\n * Ensures all items have proper data structure\n * @param options The options to process\n * @returns Properly structured menu items\n */\nconst processMenuItems = (options): MenuContent[] => {\n return options.map((option) => {\n if (\"type\" in option && option.type === \"divider\") {\n return option; // Just pass dividers through\n }\n\n // Create a basic menu item\n const menuItem: MenuItem = {\n id: option.id.toString(), // Convert to string to match MenuItem type\n text: option.text,\n icon: option.icon,\n disabled: option.disabled,\n hasSubmenu: false,\n data: option,\n };\n\n // If this option has a submenu, process those items recursively\n if (option.hasSubmenu && Array.isArray(option.submenu)) {\n menuItem.hasSubmenu = true;\n menuItem.submenu = processMenuItems(option.submenu) as MenuItem[];\n }\n\n return menuItem;\n });\n};\n\n/**\n * Creates a menu for the select component\n * @param config - Select configuration\n * @returns Function that enhances a component with menu functionality\n */\nexport const withMenu =\n (config: SelectConfig) =>\n (component: BaseComponent): BaseComponent => {\n if (!component.textfield) {\n console.warn(\"Cannot add menu: textfield not found\");\n return component;\n }\n\n // Initialize state\n const state = {\n options: config.options || [],\n selectedOption: null as SelectOption,\n };\n\n // Find initial selected option\n if (config.value) {\n state.selectedOption = state.options.find(\n (opt) => opt.id === config.value,\n );\n }\n\n // Convert options to menu items with proper recursive processing\n const menuItems = processMenuItems(state.options);\n\n // Create menu component - pass the entire textfield component as opener\n // This is crucial - passing the whole component instead of just its element\n // The menu is appended to the select's element (not document.body) to ensure\n // proper z-index stacking when the select is inside a dialog or other overlay\n const menu = createMenu({\n opener: component.textfield, // Pass the entire textfield component\n items: menuItems,\n position: (config.placement || \"bottom-start\") as MenuPosition,\n width: \"100%\", // Match width of textfield\n class: \"select-menu\",\n closeOnSelect: true,\n closeOnClickOutside: true,\n closeOnEscape: true,\n closeOnResize: true, // Close menu on window resize for better UX\n offset: 0, // Set offset to 0 to eliminate gap between textfield and menu\n container: component.element, // Keep menu within select element for proper stacking context\n });\n\n // Handle menu selection\n menu.on(\"select\", (event) => {\n // Safely access data properties with proper type checking\n if (!event.item || event.item.hasSubmenu) {\n return; // Skip processing for submenu items\n }\n\n // Safely extract the option data and validate it\n const option = event.item.data;\n if (!option || !(\"id\" in option) || !(\"text\" in option)) {\n console.warn(\n \"Invalid menu selection: missing required data properties\",\n );\n return;\n }\n\n state.selectedOption = option;\n\n // Update textfield\n component.textfield.setValue(option.text);\n\n // Update the selected state in the menu\n menu.setSelected(option.id);\n\n // Emit change event\n if (component.emit) {\n component.emit(\"change\", {\n select: component,\n value: option.id,\n text: option.text,\n option,\n originalEvent: event.originalEvent,\n preventDefault: () => {\n event.defaultPrevented = true;\n },\n defaultPrevented: false,\n });\n }\n });\n\n // Add keyboard event listener for textfield\n component.textfield.element.addEventListener(\"keydown\", (e) => {\n if (component.textfield.input.disabled) return;\n\n // Handle keyboard-based open\n if (\n (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") &&\n !menu.isOpen()\n ) {\n e.preventDefault();\n\n // Open menu with keyboard interaction\n menu.open(e, \"keyboard\");\n\n // Emit open event\n if (component.emit) {\n component.emit(\"open\", {\n select: component,\n originalEvent: e,\n preventDefault: () => {},\n defaultPrevented: false,\n });\n }\n } else if (e.key === \"Escape\" && menu.isOpen()) {\n e.preventDefault();\n menu.close(e);\n }\n });\n\n // Update textfield styling when menu opens/closes\n menu.on(\"open\", () => {\n // Add open class to the select component\n component.textfield.element.classList.add(\n `${config.prefix || \"mtrl\"}-select--open`,\n );\n\n // Add focused class to the textfield\n const PREFIX = config.prefix || \"mtrl\";\n component.textfield.element.classList.add(`${PREFIX}-textfield--focused`);\n\n // If using the filled variant, we need to add focus styles\n if (\n component.textfield.element.classList.contains(\n `${PREFIX}-textfield--filled`,\n )\n ) {\n component.textfield.element.classList.add(\n `${PREFIX}-textfield--filled-focused`,\n );\n }\n });\n\n menu.on(\"close\", (event) => {\n // Remove open class from the select component\n component.textfield.element.classList.remove(\n `${config.prefix || \"mtrl\"}-select--open`,\n );\n\n // Let focus restoration happen naturally via the anchor component\n // Just update styling based on actual focus state with a small delay\n setTimeout(() => {\n const PREFIX = config.prefix || \"mtrl\";\n const isFocused =\n document.activeElement === component.textfield.input ||\n component.textfield.element.contains(document.activeElement);\n\n // Update styling based on actual focus state\n if (isFocused) {\n component.textfield.element.classList.add(\n `${PREFIX}-textfield--focused`,\n );\n if (\n component.textfield.element.classList.contains(\n `${PREFIX}-textfield--filled`,\n )\n ) {\n component.textfield.element.classList.add(\n `${PREFIX}-textfield--filled-focused`,\n );\n }\n } else {\n component.textfield.element.classList.remove(\n `${PREFIX}-textfield--focused`,\n );\n if (\n component.textfield.element.classList.contains(\n `${PREFIX}-textfield--filled`,\n )\n ) {\n component.textfield.element.classList.remove(\n `${PREFIX}-textfield--filled-focused`,\n );\n }\n }\n }, 10);\n\n // Emit close event\n if (component.emit) {\n component.emit(\"close\", {\n select: component,\n originalEvent: event.originalEvent,\n preventDefault: () => {},\n defaultPrevented: false,\n });\n }\n });\n\n // Handle special case for showing selected item in menu\n const markSelectedMenuItem = () => {\n if (!state.selectedOption) return;\n menu.setSelected(state.selectedOption.id);\n };\n\n // Mark selected item when menu opens\n menu.on(\"open\", () => {\n setTimeout(markSelectedMenuItem, 50);\n });\n\n // Expose select API\n return {\n ...component,\n menu,\n\n // Select controller\n select: {\n getValue: () => state.selectedOption?.id || null,\n\n setValue: (value) => {\n // Handle null/undefined/empty string as clear\n if (value === null || value === undefined || value === \"\") {\n state.selectedOption = null;\n component.textfield.setValue(\"\");\n menu.setSelected(null);\n return component;\n }\n\n const option = state.options.find(\n (opt) => \"id\" in opt && opt.id === value,\n );\n if (option && \"text\" in option) {\n state.selectedOption = option;\n component.textfield.setValue(option.text);\n menu.setSelected(option.id);\n }\n return component;\n },\n\n clear: () => {\n state.selectedOption = null;\n component.textfield.setValue(\"\");\n menu.setSelected(null);\n return component;\n },\n\n getText: () => state.selectedOption?.text || \"\",\n\n getSelectedOption: () => state.selectedOption,\n\n getOptions: () => [...state.options],\n\n setOptions: (options) => {\n state.options = options;\n\n const menuItems = processMenuItems(options);\n menu.setItems(menuItems);\n\n // If previously selected option is no longer available, clear selection\n if (\n state.selectedOption &&\n !options.find(\n (opt) => \"id\" in opt && opt.id === state.selectedOption.id,\n )\n ) {\n state.selectedOption = null;\n component.textfield.setValue(\"\");\n }\n\n return component;\n },\n\n open: (\n event?: Event,\n interactionType: \"mouse\" | \"keyboard\" = \"mouse\",\n ) => {\n menu.open(event, interactionType);\n return component;\n },\n\n close: (event?: Event) => {\n menu.close(event);\n return component;\n },\n\n isOpen: () => menu.isOpen(),\n },\n };\n };\n",
|
|
198
|
+
"// src/components/select/features.ts\nimport createTextfield from \"../textfield\";\nimport createMenu from \"../menu\";\nimport { MenuItem, MenuContent, MenuPosition } from \"../menu/types\";\nimport { SelectOption, SelectConfig, BaseComponent } from \"./types\";\n\n/**\n * Creates a textfield for the select component\n * @param config - Select configuration\n * @returns Function that enhances a component with textfield functionality\n */\nexport const withTextfield =\n (config: SelectConfig) =>\n (component: BaseComponent): BaseComponent => {\n // Get option text from value if provided\n let initialText = \"\";\n if (config.value) {\n const option = (config.options || []).find(\n (opt) => opt.id === config.value,\n );\n if (option) {\n initialText = option.text;\n }\n }\n\n // Create dropdown icon for the textfield\n const dropdownIcon =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><path d=\"M7 10l5 5 5-5H7z\"/></svg>';\n\n // Create textfield component\n const textfield = createTextfield({\n label: config.label,\n variant: config.variant || \"filled\",\n density: config.density || \"default\",\n value: initialText,\n name: config.name,\n disabled: config.disabled,\n required: config.required,\n supportingText: config.supportingText,\n error: config.error,\n trailingIcon: dropdownIcon,\n readonly: true, // Make readonly since selection happens via menu\n });\n\n // Add select-specific class\n textfield.element.classList.add(`${config.prefix || \"mtrl\"}-select`);\n\n // Prevent typing in the input while keeping normal focus/visual behavior\n if (textfield.input) {\n textfield.input.addEventListener(\"keydown\", (e) => {\n // Allow navigation keys to propagate (they're handled by the menu)\n const allowedKeys = [\n \"Tab\",\n \"Escape\",\n \"ArrowDown\",\n \"ArrowUp\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Enter\",\n \" \",\n \"Home\",\n \"End\",\n ];\n if (!allowedKeys.includes(e.key)) {\n e.preventDefault();\n }\n });\n\n // Prevent paste\n textfield.input.addEventListener(\"paste\", (e) => {\n e.preventDefault();\n });\n\n // Prevent cut\n textfield.input.addEventListener(\"cut\", (e) => {\n e.preventDefault();\n });\n }\n\n return {\n ...component,\n element: textfield.element,\n textfield,\n };\n };\n\n/**\n * Recursively processes select options to create menu items\n * Ensures all items have proper data structure\n * @param options The options to process\n * @returns Properly structured menu items\n */\nconst processMenuItems = (options): MenuContent[] => {\n return options.map((option) => {\n if (\"type\" in option && option.type === \"divider\") {\n return option; // Just pass dividers through\n }\n\n // Create a basic menu item\n const menuItem: MenuItem = {\n id: option.id.toString(), // Convert to string to match MenuItem type\n text: option.text,\n icon: option.icon,\n disabled: option.disabled,\n hasSubmenu: false,\n data: option,\n };\n\n // If this option has a submenu, process those items recursively\n if (option.hasSubmenu && Array.isArray(option.submenu)) {\n menuItem.hasSubmenu = true;\n menuItem.submenu = processMenuItems(option.submenu) as MenuItem[];\n }\n\n return menuItem;\n });\n};\n\n/**\n * Creates a menu for the select component\n * @param config - Select configuration\n * @returns Function that enhances a component with menu functionality\n */\nexport const withMenu =\n (config: SelectConfig) =>\n (component: BaseComponent): BaseComponent => {\n if (!component.textfield) {\n console.warn(\"Cannot add menu: textfield not found\");\n return component;\n }\n\n // Initialize state\n const state = {\n options: config.options || [],\n selectedOption: null as SelectOption,\n };\n\n // Find initial selected option\n if (config.value) {\n state.selectedOption = state.options.find(\n (opt) => opt.id === config.value,\n );\n }\n\n // Convert options to menu items with proper recursive processing\n const menuItems = processMenuItems(state.options);\n\n const menu = createMenu({\n opener: component.textfield,\n items: menuItems,\n position: (config.placement || \"bottom-start\") as MenuPosition,\n width: \"100%\",\n class: \"select-menu\",\n closeOnSelect: true,\n closeOnClickOutside: true,\n closeOnEscape: true,\n closeOnResize: true,\n offset: 0,\n container: component.element,\n });\n\n // Handle menu selection\n menu.on(\"select\", (event) => {\n // Safely access data properties with proper type checking\n if (!event.item || event.item.hasSubmenu) {\n return; // Skip processing for submenu items\n }\n\n // Safely extract the option data and validate it\n const option = event.item.data;\n if (!option || !(\"id\" in option) || !(\"text\" in option)) {\n console.warn(\n \"Invalid menu selection: missing required data properties\",\n );\n return;\n }\n\n state.selectedOption = option;\n\n // Update textfield\n component.textfield.setValue(option.text);\n\n // Update the selected state in the menu\n menu.setSelected(option.id);\n\n // Emit change event\n if (component.emit) {\n component.emit(\"change\", {\n select: component,\n value: option.id,\n text: option.text,\n option,\n originalEvent: event.originalEvent,\n preventDefault: () => {\n event.defaultPrevented = true;\n },\n defaultPrevented: false,\n });\n }\n });\n\n // Add keyboard event listener for textfield\n component.textfield.element.addEventListener(\"keydown\", (e) => {\n if (component.textfield.input.disabled) return;\n\n // Handle keyboard-based open\n if (\n (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") &&\n !menu.isOpen()\n ) {\n e.preventDefault();\n\n // Open menu with keyboard interaction\n menu.open(e, \"keyboard\");\n\n // Emit open event\n if (component.emit) {\n component.emit(\"open\", {\n select: component,\n originalEvent: e,\n preventDefault: () => {},\n defaultPrevented: false,\n });\n }\n } else if (e.key === \"Escape\" && menu.isOpen()) {\n e.preventDefault();\n menu.close(e);\n }\n });\n\n // Update textfield styling when menu opens/closes\n menu.on(\"open\", () => {\n // Add open class to the select component\n component.textfield.element.classList.add(\n `${config.prefix || \"mtrl\"}-select--open`,\n );\n\n // Add focused class to the textfield\n const PREFIX = config.prefix || \"mtrl\";\n component.textfield.element.classList.add(`${PREFIX}-textfield--focused`);\n\n // If using the filled variant, we need to add focus styles\n if (\n component.textfield.element.classList.contains(\n `${PREFIX}-textfield--filled`,\n )\n ) {\n component.textfield.element.classList.add(\n `${PREFIX}-textfield--filled-focused`,\n );\n }\n });\n\n menu.on(\"close\", (event) => {\n // Remove open class from the select component\n component.textfield.element.classList.remove(\n `${config.prefix || \"mtrl\"}-select--open`,\n );\n\n // Let focus restoration happen naturally via the anchor component\n // Just update styling based on actual focus state with a small delay\n setTimeout(() => {\n const PREFIX = config.prefix || \"mtrl\";\n const isFocused =\n document.activeElement === component.textfield.input ||\n component.textfield.element.contains(document.activeElement);\n\n // Update styling based on actual focus state\n if (isFocused) {\n component.textfield.element.classList.add(\n `${PREFIX}-textfield--focused`,\n );\n if (\n component.textfield.element.classList.contains(\n `${PREFIX}-textfield--filled`,\n )\n ) {\n component.textfield.element.classList.add(\n `${PREFIX}-textfield--filled-focused`,\n );\n }\n } else {\n component.textfield.element.classList.remove(\n `${PREFIX}-textfield--focused`,\n );\n if (\n component.textfield.element.classList.contains(\n `${PREFIX}-textfield--filled`,\n )\n ) {\n component.textfield.element.classList.remove(\n `${PREFIX}-textfield--filled-focused`,\n );\n }\n }\n }, 10);\n\n // Emit close event\n if (component.emit) {\n component.emit(\"close\", {\n select: component,\n originalEvent: event.originalEvent,\n preventDefault: () => {},\n defaultPrevented: false,\n });\n }\n });\n\n // Handle special case for showing selected item in menu\n const markSelectedMenuItem = () => {\n if (!state.selectedOption) return;\n menu.setSelected(state.selectedOption.id);\n };\n\n // Mark selected item when menu opens\n menu.on(\"open\", () => {\n setTimeout(markSelectedMenuItem, 50);\n });\n\n // Expose select API\n return {\n ...component,\n menu,\n\n // Select controller\n select: {\n getValue: () => state.selectedOption?.id || null,\n\n setValue: (value) => {\n // Handle null/undefined/empty string as clear\n if (value === null || value === undefined || value === \"\") {\n state.selectedOption = null;\n component.textfield.setValue(\"\");\n menu.setSelected(null);\n return component;\n }\n\n const option = state.options.find(\n (opt) => \"id\" in opt && opt.id === value,\n );\n if (option && \"text\" in option) {\n state.selectedOption = option;\n component.textfield.setValue(option.text);\n menu.setSelected(option.id);\n }\n return component;\n },\n\n clear: () => {\n state.selectedOption = null;\n component.textfield.setValue(\"\");\n menu.setSelected(null);\n return component;\n },\n\n getText: () => state.selectedOption?.text || \"\",\n\n getSelectedOption: () => state.selectedOption,\n\n getOptions: () => [...state.options],\n\n setOptions: (options) => {\n state.options = options;\n\n const menuItems = processMenuItems(options);\n menu.setItems(menuItems);\n\n // If previously selected option is no longer available, clear selection\n if (\n state.selectedOption &&\n !options.find(\n (opt) => \"id\" in opt && opt.id === state.selectedOption.id,\n )\n ) {\n state.selectedOption = null;\n component.textfield.setValue(\"\");\n }\n\n return component;\n },\n\n open: (\n event?: Event,\n interactionType: \"mouse\" | \"keyboard\" = \"mouse\",\n ) => {\n menu.open(event, interactionType);\n return component;\n },\n\n close: (event?: Event) => {\n menu.close(event);\n return component;\n },\n\n isOpen: () => menu.isOpen(),\n },\n };\n };\n",
|
|
183
199
|
"// src/components/select/api.ts\nimport { SelectComponent, ApiOptions, SelectOption } from \"./types\";\n\n/**\n * Enhances a select component with API methods\n * @param options - API configuration options\n * @returns Higher-order function that adds API methods to component\n * @internal\n */\nexport const withAPI =\n (options: ApiOptions) =>\n (component: any): SelectComponent => ({\n ...component,\n element: component.element,\n textfield: component.textfield,\n menu: component.menu,\n\n getValue: options.select.getValue,\n\n setValue(value: string | null | undefined): SelectComponent {\n options.select.setValue(value);\n return this;\n },\n\n clear(): SelectComponent {\n options.select.clear();\n return this;\n },\n\n getText: options.select.getText,\n\n getSelectedOption: options.select.getSelectedOption,\n\n getOptions: options.select.getOptions,\n\n setOptions(newOptions: SelectOption[]): SelectComponent {\n options.select.setOptions(newOptions);\n return this;\n },\n\n open(interactionType: \"mouse\" | \"keyboard\" = \"mouse\"): SelectComponent {\n if (component.menu && typeof component.menu.open === \"function\") {\n component.menu.open(undefined, interactionType);\n } else {\n options.select.open();\n }\n return this;\n },\n\n close(): SelectComponent {\n options.select.close();\n return this;\n },\n\n isOpen: options.select.isOpen,\n\n setDensity(density: string): SelectComponent {\n // Delegate to the textfield's setDensity method\n if (component.textfield?.setDensity) {\n component.textfield.setDensity(density);\n }\n return this;\n },\n\n getDensity(): string {\n // Delegate to the textfield's getDensity method\n if (component.textfield?.getDensity) {\n return component.textfield.getDensity();\n }\n return \"default\";\n },\n\n on(event, handler) {\n if (options.events?.on) {\n options.events.on(event, handler);\n } else if (component.on) {\n component.on(event, handler);\n }\n return this;\n },\n\n off(event, handler) {\n if (options.events?.off) {\n options.events.off(event, handler);\n } else if (component.off) {\n component.off(event, handler);\n }\n return this;\n },\n\n enable(): SelectComponent {\n options.disabled.enable();\n return this;\n },\n\n disable(): SelectComponent {\n options.disabled.disable();\n return this;\n },\n\n setError(error: boolean, message?: string): SelectComponent {\n // Delegate to the textfield's setError method\n if (component.textfield?.setError) {\n component.textfield.setError(error, message);\n }\n return this;\n },\n\n clearError(): SelectComponent {\n // Clear error state on textfield\n if (component.textfield?.setError) {\n component.textfield.setError(false);\n }\n return this;\n },\n\n destroy() {\n options.lifecycle.destroy();\n },\n });\n",
|
|
184
200
|
"// src/components/select/config.ts\n\nimport { createComponentConfig } from \"../../core/config/component\";\nimport { SelectConfig, BaseComponent, ApiOptions } from \"./types\";\nimport { SELECT_DEFAULTS } from \"./constants\";\n\n/**\n * Default configuration for the Select component\n */\nexport const defaultConfig: SelectConfig = {\n options: [],\n variant: SELECT_DEFAULTS.VARIANT,\n placement: SELECT_DEFAULTS.PLACEMENT,\n};\n\n/**\n * Creates the base configuration for Select component\n * @param {SelectConfig} config - User provided configuration\n * @returns {SelectConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (\n config: SelectConfig = { options: [] },\n): SelectConfig =>\n createComponentConfig(defaultConfig, config, \"select\") as SelectConfig;\n\n/**\n * Creates API configuration for the Select component\n * @param {BaseComponent} comp - Component with select features\n * @returns {ApiOptions} API configuration object\n */\nexport const getApiConfig = (comp: BaseComponent): ApiOptions => ({\n select: {\n getValue: comp.select?.getValue || (() => null),\n setValue: comp.select?.setValue || (() => comp),\n clear: comp.select?.clear || (() => comp),\n getText: comp.select?.getText || (() => \"\"),\n getSelectedOption: comp.select?.getSelectedOption || (() => null),\n getOptions: comp.select?.getOptions || (() => []),\n setOptions: comp.select?.setOptions || (() => comp),\n open: comp.select?.open || (() => comp),\n close: comp.select?.close || (() => comp),\n isOpen: comp.select?.isOpen || (() => false),\n },\n events: {\n on: comp.on || (() => comp),\n off: comp.off || (() => comp),\n },\n disabled: {\n enable: () => {\n if (comp.textfield?.enable) {\n comp.textfield.enable();\n }\n return comp;\n },\n disable: () => {\n if (comp.textfield?.disable) {\n comp.textfield.disable();\n }\n return comp;\n },\n },\n lifecycle: {\n destroy: () => {\n if (comp.textfield?.destroy) {\n comp.textfield.destroy();\n }\n if (comp.menu?.destroy) {\n comp.menu.destroy();\n }\n if (comp.lifecycle?.destroy) {\n comp.lifecycle.destroy();\n }\n },\n },\n});\n\nexport default defaultConfig;\n",
|
|
185
201
|
"// src/components/select/constants.ts\n\n/**\n * Select variants\n */\nexport const SELECT_VARIANTS = {\n /** Filled select field with solid background */\n FILLED: 'filled',\n /** Outlined select field with border */\n OUTLINED: 'outlined'\n} as const;\n\n/**\n * Select menu placement options\n */\nexport const SELECT_PLACEMENT = {\n /** Menu appears below the select field, aligned to the left edge */\n BOTTOM_START: 'bottom-start',\n /** Menu appears below the select field, centered */\n BOTTOM: 'bottom',\n /** Menu appears below the select field, aligned to the right edge */\n BOTTOM_END: 'bottom-end',\n /** Menu appears above the select field, aligned to the left edge */\n TOP_START: 'top-start',\n /** Menu appears above the select field, centered */\n TOP: 'top',\n /** Menu appears above the select field, aligned to the right edge */\n TOP_END: 'top-end'\n} as const;\n\n/**\n * Select interaction types\n */\nexport const SELECT_INTERACTION = {\n /** Interaction via mouse or touch */\n MOUSE: 'mouse',\n /** Interaction via keyboard */\n KEYBOARD: 'keyboard'\n} as const;\n\n/**\n * Select event names\n */\nexport const SELECT_EVENTS = {\n /** Fired when selected option changes */\n CHANGE: 'change',\n /** Fired when options menu opens */\n OPEN: 'open',\n /** Fired when options menu closes */\n CLOSE: 'close'\n} as const;\n\n/**\n * Default icons for select\n */\nexport const SELECT_ICONS = {\n /** Dropdown arrow icon */\n DROPDOWN: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 10l5 5 5-5z\"/></svg>',\n /** Checkmark icon for selected item */\n CHECKMARK: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>'\n} as const;\n\n/**\n * Default configuration values\n */\nexport const SELECT_DEFAULTS = {\n /** Default variant */\n VARIANT: SELECT_VARIANTS.FILLED,\n /** Default menu placement */\n PLACEMENT: SELECT_PLACEMENT.BOTTOM_START,\n /** Default label */\n LABEL: 'Select',\n /** Default value */\n VALUE: '',\n /** Whether the select is required by default */\n REQUIRED: false,\n /** Whether the select is disabled by default */\n DISABLED: false,\n /** Default supporting text */\n SUPPORTING_TEXT: '',\n /** Whether in error state by default */\n ERROR: false\n} as const;\n\n/**\n * CSS classes for select elements\n */\nexport const SELECT_CLASSES = {\n /** Container element */\n CONTAINER: 'select',\n /** Textfield element */\n TEXTFIELD: 'select__textfield',\n /** Dropdown icon */\n DROPDOWN_ICON: 'select__dropdown-icon',\n /** Menu container */\n MENU: 'select__menu',\n /** Menu item */\n MENU_ITEM: 'select__menu-item',\n /** Selected menu item */\n MENU_ITEM_SELECTED: 'select__menu-item--selected',\n /** Disabled menu item */\n MENU_ITEM_DISABLED: 'select__menu-item--disabled',\n /** Menu item checkmark */\n MENU_ITEM_CHECKMARK: 'select__menu-item-checkmark',\n /** Menu item icon */\n MENU_ITEM_ICON: 'select__menu-item-icon',\n /** Menu item text */\n MENU_ITEM_TEXT: 'select__menu-item-text',\n /** Filled variant */\n FILLED: 'select--filled',\n /** Outlined variant */\n OUTLINED: 'select--outlined',\n /** Open state */\n OPEN: 'select--open',\n /** Disabled state */\n DISABLED: 'select--disabled',\n /** Required state */\n REQUIRED: 'select--required',\n /** Error state */\n ERROR: 'select--error'\n} as const;",
|
|
@@ -199,22 +215,22 @@
|
|
|
199
215
|
"// src/components/sheet/constants.ts\n\n/**\n * Sheet variants\n */\nexport const SHEET_VARIANTS = {\n /** Standard sheet with light elevation */\n STANDARD: 'standard',\n /** Modal sheet with overlay scrim */\n MODAL: 'modal',\n /** Expanded sheet that takes full screen */\n EXPANDED: 'expanded'\n} as const;\n\n/**\n * Sheet positions\n */\nexport const SHEET_POSITIONS = {\n /** Sheet appears from the bottom of the screen */\n BOTTOM: 'bottom',\n /** Sheet appears from the top of the screen */\n TOP: 'top',\n /** Sheet appears from the left of the screen */\n LEFT: 'left',\n /** Sheet appears from the right of the screen */\n RIGHT: 'right'\n} as const;\n\n/**\n * Sheet events\n */\nexport const SHEET_EVENTS = {\n /** Fired when sheet is opened */\n OPEN: 'open',\n /** Fired when sheet is closed */\n CLOSE: 'close',\n /** Fired when user starts dragging sheet */\n DRAG_START: 'dragstart',\n /** Fired when user finishes dragging sheet */\n DRAG_END: 'dragend'\n} as const;\n\n/**\n * Sheet elevation levels\n */\nexport const SHEET_ELEVATION = {\n /** Subtle elevation with minimal shadow */\n LEVEL_1: 1,\n /** Light elevation with small shadow */\n LEVEL_2: 2,\n /** Medium elevation with noticeable shadow */\n LEVEL_3: 3,\n /** High elevation with prominent shadow */\n LEVEL_4: 4,\n /** Maximum elevation with strong shadow */\n LEVEL_5: 5\n} as const;\n\n/**\n * Sheet default values\n */\nexport const SHEET_DEFAULTS = {\n /** Default sheet variant */\n VARIANT: SHEET_VARIANTS.STANDARD,\n /** Default position */\n POSITION: SHEET_POSITIONS.BOTTOM,\n /** Whether sheet is open by default */\n OPEN: false,\n /** Whether sheet can be dismissed by clicking outside */\n DISMISSIBLE: true,\n /** Whether to show drag handle by default */\n DRAG_HANDLE: true,\n /** Default elevation level */\n ELEVATION: SHEET_ELEVATION.LEVEL_3,\n /** Default title */\n TITLE: '',\n /** Default content */\n CONTENT: '',\n /** Default max height */\n MAX_HEIGHT: '80%',\n /** Whether gestures are enabled by default */\n ENABLE_GESTURES: true\n} as const;\n\n/**\n * Sheet animation timing values\n */\nexport const SHEET_ANIMATION = {\n /** Animation duration in milliseconds */\n DURATION: 300,\n /** Animation timing function */\n TIMING: 'cubic-bezier(0.4, 0, 0.2, 1)',\n /** Animation delay in milliseconds */\n DELAY: 0\n} as const;\n\n/**\n * Sheet gesture thresholds\n */\nexport const SHEET_GESTURE = {\n /** Minimum velocity to trigger a swipe */\n MIN_VELOCITY: 0.3,\n /** Minimum distance to trigger a swipe */\n MIN_DISTANCE: 30,\n /** Percentage of height/width to dismiss sheet */\n DISMISS_THRESHOLD: 0.3\n} as const;\n\n/**\n * CSS classes for sheet elements\n */\nexport const SHEET_CLASSES = {\n /** Container element */\n CONTAINER: 'sheet',\n /** Overlay scrim */\n SCRIM: 'sheet__scrim',\n /** Main sheet panel */\n PANEL: 'sheet__panel',\n /** Drag handle */\n DRAG_HANDLE: 'sheet__drag-handle',\n /** Title container */\n TITLE: 'sheet__title',\n /** Content container */\n CONTENT: 'sheet__content',\n /** Standard variant */\n STANDARD: 'sheet--standard',\n /** Modal variant */\n MODAL: 'sheet--modal',\n /** Expanded variant */\n EXPANDED: 'sheet--expanded',\n /** Bottom position */\n BOTTOM: 'sheet--bottom',\n /** Top position */\n TOP: 'sheet--top',\n /** Left position */\n LEFT: 'sheet--left',\n /** Right position */\n RIGHT: 'sheet--right',\n /** Open state */\n OPEN: 'sheet--open',\n /** Dragging state */\n DRAGGING: 'sheet--dragging',\n /** Elevation modifier (sheet--elevation-1) */\n ELEVATION_PREFIX: 'sheet--elevation-'\n} as const;",
|
|
200
216
|
"// src/components/slider/slider.ts\nimport { pipe } from \"../../core/compose/pipe\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withLifecycle,\n withIcon,\n withTextLabel,\n} from \"../../core/compose/features\";\nimport {\n withRange,\n withStates,\n withController,\n withCanvas,\n withDom,\n} from \"./features\";\nimport { withAPI } from \"./api\";\nimport { SliderConfig, SliderComponent, SliderEventType } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new Slider component\n *\n * Slider follows a clear architectural pattern:\n * 1. Base component - Creates the foundation with event system\n * 2. Feature enhancement - Adds specific capabilities (range, icons)\n * 3. DOM creation - Creates DOM elements directly using optimized createElement\n * 4. Canvas rendering - Uses canvas for visual elements, keeping handles as DOM\n * 5. State management - Handles visual states and appearance\n * 6. Controller - Manages behavior, events, and UI rendering\n * 7. Lifecycle - Handles component lifecycle events\n * 8. Public API - Exposes a clean, consistent API\n *\n * @param {SliderConfig} config - Slider configuration object\n * @returns {SliderComponent} Slider component instance\n */\nconst createSlider = (config: SliderConfig = {}): SliderComponent => {\n // Process configuration with defaults\n const baseConfig = createBaseConfig(config);\n\n try {\n // Create the component by composing features in a specific order\n const component = pipe(\n // Base component with event system\n createBase,\n withEvents(),\n\n // Create the main slider element using standard withElement\n withElement(getElementConfig(baseConfig)),\n\n // Add range configuration\n withRange(baseConfig),\n\n // Create inner DOM elements (container, handle, valueBubble)\n withDom(baseConfig),\n\n // Add text/label and icon features that need DOM elements\n withTextLabel(baseConfig),\n withIcon(baseConfig),\n\n // Add canvas rendering for tracks and ticks\n withCanvas(baseConfig),\n\n // Add state management and behavior\n withStates(baseConfig),\n withController(baseConfig),\n withLifecycle()\n )(baseConfig);\n\n // Generate the API configuration based on the enhanced component\n const apiOptions = getApiConfig(component);\n\n // Apply the public API layer\n const slider = withAPI(apiOptions)(component);\n\n // Register event handlers from config for convenience\n if (baseConfig.on && typeof slider.on === \"function\") {\n Object.entries(baseConfig.on).forEach(([event, handler]) => {\n if (typeof handler === \"function\") {\n slider.on(event as SliderEventType, handler);\n }\n });\n }\n\n return slider;\n } catch (error) {\n console.error(\"Slider creation error:\", error);\n throw new Error(`Failed to create slider: ${(error as Error).message}`);\n }\n};\n\nexport default createSlider;\n",
|
|
201
217
|
"// src/components/slider/features/range.ts\nimport { SliderConfig } from '../types';\nimport { createElement } from '../../../core/dom/create';\n\n/**\n * Enhances structure definition with range slider elements\n * \n * @param config Slider configuration\n * @returns Component enhancer that adds range slider to structure\n */\nexport const withRange = (config: SliderConfig) => component => {\n // If not a range slider or missing structure definition, return unmodified\n if (!config.range || !config.secondValue || !component.schema) {\n return component;\n }\n \n try {\n // Calculate values for second handle\n const min = config.min || 0;\n const max = config.max || 100;\n const secondValue = config.secondValue;\n const secondValuePercent = ((secondValue - min) / (max - min)) * 100;\n const formatter = config.valueFormatter || (val => val.toString());\n const isDisabled = config.disabled === true;\n const getClass = component.getClass;\n \n // Clone the structure definition (deep copy)\n const schema = JSON.parse(JSON.stringify(component.schema));\n \n // Add range class to root element\n const rootClasses = schema.element.options.className || [];\n if (Array.isArray(rootClasses)) {\n rootClasses.push(getClass('slider--range'));\n } else {\n schema.element.options.className = `${rootClasses} ${getClass('slider--range')}`.trim();\n }\n \n // Canvas will handle all track rendering, so we don't add any DOM track elements\n \n // Add second handle to container children\n const containerChildren = schema.element.children.container.children;\n containerChildren.secondHandle = {\n name: 'secondHandle',\n creator: createElement,\n options: {\n tag: 'div',\n className: getClass('slider-handle'),\n attributes: {\n role: 'slider',\n 'aria-valuemin': String(min),\n 'aria-valuemax': String(max),\n 'aria-valuenow': String(secondValue),\n 'aria-orientation': 'horizontal',\n tabindex: isDisabled ? '-1' : '0',\n 'aria-disabled': isDisabled ? 'true' : 'false',\n 'data-value': String(secondValue),\n 'data-handle-index': '1'\n },\n style: {\n left: `${secondValuePercent}%`\n }\n }\n };\n \n // Add second value bubble to container children\n containerChildren.secondValueBubble = {\n name: 'secondValueBubble',\n creator: createElement,\n options: {\n tag: 'div',\n className: getClass('slider-value'),\n attributes: {\n 'aria-hidden': 'true',\n 'data-handle-index': '1'\n },\n text: formatter(secondValue),\n style: {\n left: `${secondValuePercent}%`\n }\n }\n };\n \n // Return component with updated structure definition\n return {\n ...component,\n schema\n };\n } catch (error) {\n console.warn('Error enhancing structure with range functionality:', error);\n return component;\n }\n};",
|
|
202
|
-
"// src/components/slider/constants.ts\n\n/**\n * Available slider color variants\n * @category Components\n */\nexport const SLIDER_COLORS = {\n /** Primary color variant */\n PRIMARY: 'primary',\n /** Secondary color variant */\n SECONDARY: 'secondary',\n /** Tertiary color variant */\n TERTIARY: 'tertiary',\n /** Error color variant */\n ERROR: 'error'\n} as const;\n\n/**\n * Available slider size variants\n * @category Components\n */\nexport const SLIDER_SIZES = {\n /** Extra small size (default) - 16px track height */\n XS: 16,\n /** Small size - 24px track height */\n S: 24,\n /** Medium size - 40px track height */\n M: 40,\n /** Large size - 56px track height */\n L: 56,\n /** Extra large size - 96px track height */\n XL:
|
|
218
|
+
"// src/components/slider/constants.ts\n\n/**\n * Available slider color variants\n * @category Components\n */\nexport const SLIDER_COLORS = {\n /** Primary color variant */\n PRIMARY: 'primary',\n /** Secondary color variant */\n SECONDARY: 'secondary',\n /** Tertiary color variant */\n TERTIARY: 'tertiary',\n /** Error color variant */\n ERROR: 'error'\n} as const;\n\n/**\n * Available slider size variants\n * @category Components\n */\nexport const SLIDER_SIZES = {\n /** Extra small size (default) - 16px track height */\n XS: 16,\n /** Small size - 24px track height */\n S: 24,\n /** Medium size - 40px track height */\n M: 40,\n /** Large size - 56px track height */\n L: 56,\n /** Extra large size - 96px track height */\n XL: 96\n} as const;\n\n/**\n * Slider component size type\n * @category Components\n */\nexport type SliderSize = keyof typeof SLIDER_SIZES | number;\n\n/**\n * Slider component measurements\n * @category Components\n */\nexport const SLIDER_MEASUREMENTS = {\n /** Handle size in pixels */\n HANDLE_SIZE: 16,\n /** Handle height for XS and S sizes in pixels (M3: 44dp) */\n SMALL_HANDLE_HEIGHT: 44,\n /** Handle height offset for M, L, XL sizes (added to track height: 52, 68, 108dp) */\n HANDLE_HEIGHT_OFFSET: 12,\n /** Minimum container height in pixels (M3 minimum touch target) */\n MIN_HEIGHT: 48,\n /** Track border radius in pixels */\n TRACK_RADIUS: 3,\n /** External track radius for XS and S sizes in pixels */\n SMALL_TRACK_EXTERNAL_RADIUS: 10,\n /** External track radius ratio for M, L, XL sizes (multiplied by track height) */\n LARGE_TRACK_RADIUS_RATIO: 0.35,\n /** Tick size in pixels */\n TICK_SIZE: 4,\n /** Dot size in pixels */\n DOT_SIZE: 4,\n /** Handle gap pixels */\n HANDLE_GAP: 6, // M3: 6dp between track and handle\n /** Handle gap reduction when pressed in pixels */\n HANDLE_GAP_PRESSED_REDUCTION: 2,\n /** Center gap pixels for centered sliders */\n CENTER_GAP: 4,\n /** Edge padding in pixels */\n EDGE_PADDING: 7\n} as const;\n\n/**\n * Available slider events\n * @category Components\n */\nexport const SLIDER_EVENTS = {\n /** Fired when slider value changes and interaction completes */\n CHANGE: 'change',\n /** Fired during dragging as value changes */\n INPUT: 'input',\n /** Fired when slider receives focus */\n FOCUS: 'focus',\n /** Fired when slider loses focus */\n BLUR: 'blur',\n /** Fired when interaction starts */\n START: 'start',\n /** Fired when interaction ends */\n END: 'end'\n} as const;\n\n/**\n * Position options for slider label and icon\n * @category Components\n */\nexport const SLIDER_POSITIONS = {\n /** Position at the start */\n START: 'start',\n /** Position at the end */\n END: 'end'\n} as const;\n\n/**\n * Default slider configuration values\n * @category Components\n */\nexport const SLIDER_DEFAULTS = {\n /** Minimum value */\n MIN: 0,\n /** Maximum value */\n MAX: 100,\n /** Starting value */\n VALUE: 0,\n /** Step increment size */\n STEP: 1,\n /** Whether slider is disabled */\n DISABLED: false,\n /** Default color variant */\n COLOR: SLIDER_COLORS.PRIMARY,\n /** Default size variant */\n SIZE: 'XS',\n /** Whether to show tick marks */\n TICKS: false,\n /** Whether to show value while dragging */\n SHOW_VALUE: true,\n /** Whether to snap to steps during dragging */\n SNAP_TO_STEPS: true,\n /** Whether slider is a range slider (two handles) */\n RANGE: false,\n /** Whether slider is a centered slider (active track from center) */\n CENTERED: false,\n /** Default icon position */\n ICON_POSITION: SLIDER_POSITIONS.START,\n /** Default label position */\n LABEL_POSITION: SLIDER_POSITIONS.START\n} as const;\n\n/**\n * CSS class names used by the slider component\n * @category Components\n */\nexport const SLIDER_CLASSES = {\n /** Root element class */\n ROOT: 'slider',\n /** Container for slider track and handles */\n CONTAINER: 'slider__container',\n /** Filled track portion class */\n FILL: 'slider__fill',\n /** Handle element class */\n HANDLE: 'slider__handle',\n /** Second handle element class (for range slider) */\n HANDLE_SECOND: 'slider__handle--second',\n /** Tick marks container class */\n LABEL: 'slider__label',\n /** Value display class */\n VALUE: 'slider__value',\n /** Icon container class */\n ICON: 'slider__icon',\n /** Disabled state class */\n DISABLED: 'slider--disabled',\n /** Focused state class */\n FOCUSED: 'slider--focused',\n /** Dragging state class */\n DRAGGING: 'slider--dragging',\n /** Range slider variant class */\n RANGE: 'slider--range',\n /** Primary color variant class */\n PRIMARY: 'slider--primary',\n /** Secondary color variant class */\n SECONDARY: 'slider--secondary',\n /** Tertiary color variant class */\n TERTIARY: 'slider--tertiary',\n /** Error color variant class */\n ERROR: 'slider--error'\n} as const;",
|
|
203
219
|
"// src/components/slider/features/states.ts\nimport { SLIDER_COLORS, SliderColor } from \"../types\";\nimport { SLIDER_SIZES, SliderSize } from \"../constants\";\nimport { SliderConfig } from \"../types\";\n\n/**\n * Add state management features to slider component\n * Combines appearance and disabled functionality into a single feature\n *\n * @param config Slider configuration\n * @returns Component enhancer with state management features\n */\nexport const withStates = (config: SliderConfig) => (component) => {\n // Track initial disabled state\n const isDisabled = config.disabled === true;\n\n // Apply initial disabled state if needed\n if (isDisabled) {\n setTimeout(() => {\n disableComponent();\n }, 0);\n }\n\n /**\n * Disables the component\n */\n function disableComponent() {\n component.element.classList.add(\n `${component.getClass(\"slider\")}--disabled`\n );\n component.element.setAttribute(\"aria-disabled\", \"true\");\n\n // Ensure handles cannot receive focus when disabled\n if (component.structure?.handle) {\n component.structure.handle.tabIndex = -1;\n component.structure.handle.setAttribute(\"aria-disabled\", \"true\");\n }\n\n if (config.range && component.structure?.secondHandle) {\n component.structure.secondHandle.tabIndex = -1;\n component.structure.secondHandle.setAttribute(\"aria-disabled\", \"true\");\n }\n\n // Redraw canvas with disabled colors\n if (component.drawCanvas) {\n component.drawCanvas();\n }\n }\n\n /**\n * Enables the component\n */\n function enableComponent() {\n component.element.classList.remove(\n `${component.getClass(\"slider\")}--disabled`\n );\n component.element.setAttribute(\"aria-disabled\", \"false\");\n\n // Re-enable focus on handles\n if (component.structure?.handle) {\n component.structure.handle.tabIndex = 0;\n component.structure.handle.setAttribute(\"aria-disabled\", \"false\");\n }\n\n if (config.range && component.structure?.secondHandle) {\n component.structure.secondHandle.tabIndex = 0;\n component.structure.secondHandle.setAttribute(\"aria-disabled\", \"false\");\n }\n\n // Redraw canvas with enabled colors\n if (component.drawCanvas) {\n component.drawCanvas();\n }\n }\n\n /**\n * Gets the active color class\n */\n function getActiveColor() {\n return (\n Object.values(SLIDER_COLORS).find((colorName) =>\n component.element.classList.contains(\n `${component.getClass(\"slider\")}--${colorName}`\n )\n ) || SLIDER_COLORS.PRIMARY\n );\n }\n\n /**\n * Gets the active size class\n */\n function getActiveSize() {\n // Check for size class names on the element\n const sizeKeys = Object.keys(SLIDER_SIZES) as Array<\n keyof typeof SLIDER_SIZES\n >;\n const foundKey = sizeKeys.find((sizeKey) =>\n component.element.classList.contains(\n `${component.getClass(\"slider\")}--${sizeKey.toLowerCase()}`\n )\n );\n return foundKey || \"XS\"; // Default to 'XS' (extra small)\n }\n\n // Return enhanced component\n return {\n ...component,\n\n // Disabled state management\n disabled: {\n /**\n * Enables the component\n * @returns Disabled manager for chaining\n */\n enable() {\n enableComponent();\n return this;\n },\n\n /**\n * Disables the component\n * @returns Disabled manager for chaining\n */\n disable() {\n disableComponent();\n return this;\n },\n\n /**\n * Checks if component is disabled\n * @returns True if disabled\n */\n isDisabled() {\n return component.element.classList.contains(\n `${component.getClass(\"slider\")}--disabled`\n );\n },\n },\n\n // Appearance management\n appearance: {\n /**\n * Sets slider color\n * @param color Color variant\n * @returns Appearance manager for chaining\n */\n setColor(color: SliderColor) {\n // Remove existing color classes\n Object.values(SLIDER_COLORS).forEach((colorName) => {\n component.element.classList.remove(\n `${component.getClass(\"slider\")}--${colorName}`\n );\n });\n\n // Add new color class if not primary (default)\n if (color !== SLIDER_COLORS.PRIMARY) {\n component.element.classList.add(\n `${component.getClass(\"slider\")}--${color}`\n );\n }\n\n return this;\n },\n\n /**\n * Gets slider color\n * @returns Current color name\n */\n getColor() {\n return getActiveColor();\n },\n\n /**\n * Sets slider size\n * @param size Size variant\n * @returns Appearance manager for chaining\n */\n setSize(size: SliderSize) {\n // Remove existing size classes\n const sizeKeys = Object.keys(SLIDER_SIZES) as Array<\n keyof typeof SLIDER_SIZES\n >;\n sizeKeys.forEach((sizeKey) => {\n component.element.classList.remove(\n `${component.getClass(\"slider\")}--${sizeKey.toLowerCase()}`\n );\n });\n\n // Determine the size key to use\n let sizeKey: string;\n if (typeof size === \"string\" && size in SLIDER_SIZES) {\n sizeKey = size;\n } else if (typeof size === \"number\") {\n // Find the key that matches this value\n const entry = Object.entries(SLIDER_SIZES).find(\n ([, value]) => value === size\n );\n sizeKey = entry ? entry[0] : \"XS\";\n } else {\n sizeKey = \"XS\"; // Default\n }\n\n // Add new size class\n component.element.classList.add(\n `${component.getClass(\"slider\")}--${sizeKey.toLowerCase()}`\n );\n\n return this;\n },\n\n /**\n * Gets slider size\n * @returns Current size name\n */\n getSize() {\n return getActiveSize();\n },\n\n /**\n * Shows or hides tick marks\n * @param show Whether to show ticks\n * @returns Appearance manager for chaining\n */\n showTicks(show: boolean) {\n config.ticks = show;\n\n // Regenerate ticks if slider is initialized\n if (component.slider) {\n component.slider.regenerateTicks();\n }\n\n return this;\n },\n\n /**\n * Shows or hides current value bubble during interaction\n * @param show Whether to show value bubble\n * @returns Appearance manager for chaining\n */\n showCurrentValue(show: boolean) {\n config.showValue = show;\n return this;\n },\n },\n };\n};\n",
|
|
204
220
|
"// src/components/slider/features/handlers.ts\nimport { SLIDER_EVENTS } from \"../types\";\nimport { SliderConfig } from \"../types\";\n\n/**\n * Create consolidated event handlers for slider component (mouse, touch, keyboard)\n *\n * @param config Slider configuration\n * @param state Slider state object\n * @param uiRenderer UI renderer interface from controller\n * @param eventHelpers Event helper methods\n * @returns Event handlers for all slider interactions\n */\nexport const createHandlers = (\n config: SliderConfig,\n state,\n uiRenderer,\n eventHelpers,\n) => {\n // Get required elements from structure (with fallbacks)\n // Check both direct component properties (from withDom) and components object (legacy)\n const components = state.component?.components || {};\n const component = state.component || {};\n\n // Extract needed components from both locations for backward compatibility\n const container = component.container || components.container || null;\n const handle = component.handle || components.handle || null;\n const valueBubble = component.valueBubble || components.valueBubble || null;\n const secondHandle =\n component.secondHandle || components.secondHandle || null;\n const secondValueBubble =\n component.secondValueBubble || components.secondValueBubble || null;\n\n // Get required helper methods (with fallbacks)\n const {\n getValueFromPosition = () => 0,\n roundToStep = (value) => value,\n clamp = (value) => value,\n showValueBubble = () => {},\n render = () => {},\n } = uiRenderer;\n\n const { triggerEvent = () => ({ defaultPrevented: false }) } = eventHelpers;\n\n // Track whether a real drag has started\n let hasActualDragStarted = false;\n let initialX = 0;\n const DRAG_THRESHOLD = 3;\n\n // Last focused handle tracker for keyboard navigation\n let lastFocusedHandle = null;\n\n // Bubble management\n const clearBubbleHideTimer = () => {\n if (state.valueHideTimer) {\n clearTimeout(state.valueHideTimer);\n state.valueHideTimer = null;\n }\n };\n\n const hideAllBubbles = () => {\n clearBubbleHideTimer();\n if (valueBubble) showValueBubble(valueBubble, false);\n if (secondValueBubble) showValueBubble(secondValueBubble, false);\n };\n\n const showActiveBubble = (bubble) => {\n hideAllBubbles();\n if (bubble && config.showValue) showValueBubble(bubble, true);\n };\n\n const hideActiveBubble = (bubble, delay = 0) => {\n clearBubbleHideTimer();\n if (!bubble || !config.showValue) return;\n\n if (delay > 0) {\n state.valueHideTimer = setTimeout(() => {\n showValueBubble(bubble, false);\n }, delay);\n } else {\n showValueBubble(bubble, false);\n }\n };\n\n // Focus management\n const clearKeyboardFocus = () => {\n // Clear local focus indicators\n if (handle)\n handle.classList.remove(\n `${state.component.getClass(\"slider-handle\")}--focused`,\n );\n if (secondHandle)\n secondHandle.classList.remove(\n `${state.component.getClass(\"slider-handle\")}--focused`,\n );\n\n // Clear global focus indicators\n try {\n const focusClass = state.component.getClass(\"slider-handle--focused\");\n document.querySelectorAll(`.${focusClass}`).forEach((el) => {\n el.classList.remove(focusClass);\n });\n\n if (\n document.activeElement?.classList.contains(\n state.component.getClass(\"slider-handle\"),\n )\n ) {\n (document.activeElement as HTMLElement).blur();\n }\n } catch (error) {\n console.warn(\"Error clearing keyboard focus:\", error);\n }\n };\n\n /**\n * Handle mouse/touch down on a handle\n */\n const handleHandleMouseDown = (e, isSecondHandle = false) => {\n // Check if disabled\n if (\n !state.component ||\n (state.component.disabled && state.component.disabled.isDisabled())\n ) {\n return;\n }\n\n // Only preventDefault for mouse events to allow passive touchstart\n if (e.type === \"mousedown\") {\n e.preventDefault();\n }\n e.stopPropagation();\n\n hideAllBubbles();\n clearKeyboardFocus();\n\n // Capture initial position\n initialX = e.type.includes(\"touch\") ? e.touches[0].clientX : e.clientX;\n\n // Setup drag state\n state.dragging = false;\n state.pressed = true; // Set pressed state immediately\n hasActualDragStarted = false;\n state.activeHandle = isSecondHandle ? \"second\" : \"first\"; // Track which handle\n state.activeBubble = isSecondHandle ? secondValueBubble : valueBubble;\n\n // Show bubble immediately\n showActiveBubble(state.activeBubble);\n\n // Add global event listeners\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"touchmove\", handleMouseMove, { passive: false });\n document.addEventListener(\"touchend\", handleMouseUp);\n\n render();\n triggerEvent(SLIDER_EVENTS.START, e);\n };\n\n /**\n * Handle mouse/touch down on the track\n */\n const handleTrackMouseDown = (e) => {\n // Check if disabled\n if (\n !state.component ||\n (state.component.disabled && state.component.disabled.isDisabled()) ||\n !container\n ) {\n return;\n }\n\n // Only preventDefault for mouse events to allow passive touchstart\n if (e.type === \"mousedown\") {\n e.preventDefault();\n }\n hideAllBubbles();\n clearKeyboardFocus();\n\n // Determine which handle to move\n let isSecondHandle = false;\n\n try {\n const position = e.type.includes(\"touch\")\n ? e.touches[0].clientX\n : e.clientX;\n\n // Calculate value at click position and apply constraints\n let newValue = getValueFromPosition(position);\n if (config.snapToSteps && state.step > 0)\n newValue = roundToStep(newValue);\n newValue = clamp(newValue, state.min, state.max);\n\n if (config.range && state.secondValue !== null) {\n // For range slider, move the closest handle\n const distToFirst = Math.abs(newValue - state.value);\n const distToSecond = Math.abs(newValue - state.secondValue);\n\n isSecondHandle = distToSecond < distToFirst;\n isSecondHandle\n ? (state.secondValue = newValue)\n : (state.value = newValue);\n } else {\n // Single handle slider - use setValue API for centered sliders to ensure animation\n if (\n config.centered &&\n state.component.slider &&\n state.component.slider.setValue\n ) {\n // Use the API method which handles previousValue tracking and animation\n state.component.slider.setValue(newValue, false); // false to not trigger event yet\n } else {\n // Regular slider - direct update\n state.value = newValue;\n }\n }\n\n // Update UI and trigger events\n render();\n triggerEvent(SLIDER_EVENTS.INPUT, e);\n } catch (error) {\n console.warn(\"Error handling track click:\", error);\n }\n\n // Set active elements\n state.activeHandle = isSecondHandle ? \"second\" : \"first\";\n state.activeBubble = isSecondHandle ? secondValueBubble : valueBubble;\n\n // Store the initial position\n initialX = e.type.includes(\"touch\") ? e.touches[0].clientX : e.clientX;\n\n // For centered sliders, delay starting drag to allow animation\n if (config.centered && !config.range) {\n // Show bubble\n showActiveBubble(state.activeBubble);\n\n // Add event listeners but don't start dragging yet\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"touchmove\", handleMouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchend\", handleMouseUp);\n\n // Don't set pressed state for track clicks\n state.pressed = false;\n\n triggerEvent(SLIDER_EVENTS.START, e);\n } else {\n // For non-centered sliders, start drag but don't set pressed since it's a track click\n state.dragging = false;\n state.pressed = false; // Don't set pressed for track clicks\n hasActualDragStarted = false;\n\n // Show bubble\n showActiveBubble(state.activeBubble);\n\n // Add event listeners\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"touchmove\", handleMouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchend\", handleMouseUp);\n\n render();\n triggerEvent(SLIDER_EVENTS.START, e);\n }\n };\n\n /**\n * Handle mouse/touch move during drag\n */\n const handleMouseMove = (e) => {\n if (!state.activeHandle || !container) return;\n e.preventDefault();\n\n try {\n // Get current position\n const currentX = e.type.includes(\"touch\")\n ? e.touches[0].clientX\n : e.clientX;\n\n // Determine if we've started a real drag\n if (\n !hasActualDragStarted &&\n Math.abs(currentX - initialX) >= DRAG_THRESHOLD\n ) {\n hasActualDragStarted = true;\n state.dragging = true;\n state.component.element.classList.add(\n `${state.component.getClass(\"slider\")}--dragging`,\n );\n }\n\n // Calculate new value and apply constraints\n let newValue = getValueFromPosition(currentX);\n if (config.snapToSteps && state.step > 0)\n newValue = roundToStep(newValue);\n newValue = clamp(newValue, state.min, state.max);\n\n // Handle crossing points and handle swapping for range sliders\n const isSecondHandle = state.activeHandle === \"second\";\n\n if (config.range && state.secondValue !== null) {\n if (isSecondHandle) {\n // Second handle is active\n if (newValue >= state.value) {\n state.secondValue = newValue;\n } else {\n // Handles are crossed, swap them\n hideActiveBubble(state.activeBubble, 0);\n state.secondValue = state.value;\n state.value = newValue;\n state.activeHandle = \"first\";\n state.activeBubble = valueBubble;\n showActiveBubble(state.activeBubble);\n }\n } else {\n // First handle is active\n if (newValue <= state.secondValue) {\n state.value = newValue;\n } else {\n // Handles are crossed, swap them\n hideActiveBubble(state.activeBubble, 0);\n state.value = state.secondValue;\n state.secondValue = newValue;\n state.activeHandle = \"second\";\n state.activeBubble = secondValueBubble;\n showActiveBubble(state.activeBubble);\n }\n }\n } else {\n // Regular slider - update previousValue for centered sliders\n if (config.centered) {\n state.previousValue = state.value;\n }\n state.value = newValue;\n }\n\n render();\n triggerEvent(SLIDER_EVENTS.INPUT, e);\n } catch (error) {\n console.warn(\"Error during slider drag:\", error);\n }\n };\n\n /**\n * Handle mouse/touch up after drag\n */\n const handleMouseUp = (e) => {\n if (!state.activeHandle) return;\n e.preventDefault();\n\n // Reset drag states\n state.dragging = false;\n state.pressed = false; // Clear pressed state\n hasActualDragStarted = false;\n state.component.element.classList.remove(\n `${state.component.getClass(\"slider\")}--dragging`,\n );\n\n // Hide bubble with delay\n hideActiveBubble(state.activeBubble, 1000);\n\n // Remove global event listeners\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"touchmove\", handleMouseMove);\n document.removeEventListener(\"touchend\", handleMouseUp);\n\n // Reset active handle and update UI\n state.activeHandle = null;\n render();\n\n // Trigger events\n triggerEvent(SLIDER_EVENTS.CHANGE, e);\n triggerEvent(SLIDER_EVENTS.END, e);\n };\n\n /**\n * Handle keyboard input\n */\n const handleKeyDown = (e, isSecondHandle = false) => {\n if (state.component.disabled && state.component.disabled.isDisabled())\n return;\n\n const step = state.step || 1;\n let newValue = isSecondHandle ? state.secondValue : state.value;\n const stepSize = e.shiftKey ? step * 10 : step;\n\n // Handle tab key separately\n if (e.key === \"Tab\") return;\n\n let valueChanged = false;\n\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n e.preventDefault();\n newValue = Math.min(newValue + stepSize, state.max);\n valueChanged = true;\n break;\n\n case \"ArrowLeft\":\n case \"ArrowDown\":\n e.preventDefault();\n newValue = Math.max(newValue - stepSize, state.min);\n valueChanged = true;\n break;\n\n case \"Home\":\n e.preventDefault();\n newValue = state.min;\n valueChanged = true;\n break;\n\n case \"End\":\n e.preventDefault();\n newValue = state.max;\n valueChanged = true;\n break;\n\n case \"PageUp\":\n e.preventDefault();\n newValue = Math.min(newValue + step * 10, state.max);\n valueChanged = true;\n break;\n\n case \"PageDown\":\n e.preventDefault();\n newValue = Math.max(newValue - step * 10, state.min);\n valueChanged = true;\n break;\n\n default:\n return; // Exit if not a handled key\n }\n\n if (!valueChanged) return;\n\n // Update active bubble reference\n state.activeBubble = isSecondHandle ? secondValueBubble : valueBubble;\n\n // Show value bubble during keyboard interaction\n showActiveBubble(state.activeBubble);\n\n // Update the value\n if (isSecondHandle) {\n state.secondValue = newValue;\n } else {\n // Track previousValue for centered sliders\n if (config.centered) {\n state.previousValue = state.value;\n }\n state.value = newValue;\n }\n\n // Update UI and trigger events\n render();\n triggerEvent(SLIDER_EVENTS.INPUT, e);\n triggerEvent(SLIDER_EVENTS.CHANGE, e);\n };\n\n /**\n * Handle focus events\n */\n const handleFocus = (e, isSecondHandle = false) => {\n if (state.component.disabled && state.component.disabled.isDisabled())\n return;\n\n // Track the currently focused handle\n const currentHandle = isSecondHandle ? secondHandle : handle;\n\n // Hide previous bubble if switching between handles\n if (lastFocusedHandle && lastFocusedHandle !== currentHandle) {\n hideAllBubbles();\n }\n\n lastFocusedHandle = currentHandle;\n\n // Add focus class and show bubble\n currentHandle.classList.add(\n `${state.component.getClass(\"slider-handle\")}--focused`,\n );\n showActiveBubble(isSecondHandle ? secondValueBubble : valueBubble);\n state.activeBubble = isSecondHandle ? secondValueBubble : valueBubble;\n\n triggerEvent(SLIDER_EVENTS.FOCUS, e);\n };\n\n /**\n * Handle blur events\n */\n const handleBlur = (e, isSecondHandle = false) => {\n const handleElement = isSecondHandle ? secondHandle : handle;\n handleElement.classList.remove(\n `${state.component.getClass(\"slider-handle\")}--focused`,\n );\n\n // Only hide bubble if not tabbing to another handle\n const relatedTarget = e.relatedTarget;\n const otherHandle = isSecondHandle ? handle : secondHandle;\n\n if (!relatedTarget || relatedTarget !== otherHandle) {\n hideActiveBubble(isSecondHandle ? secondValueBubble : valueBubble, 200);\n }\n\n triggerEvent(SLIDER_EVENTS.BLUR, e);\n };\n\n /**\n * Set up all event listeners\n */\n const setupEventListeners = () => {\n if (!state.component || !handle) {\n console.warn(\n \"Cannot set up event listeners: missing component or handle\",\n );\n return;\n }\n\n // Use container for track events instead of track for better UX\n container.addEventListener(\"mousedown\", handleTrackMouseDown);\n container.addEventListener(\"touchstart\", handleTrackMouseDown, {\n passive: true,\n });\n\n // Handle events\n handle.addEventListener(\"mousedown\", (e) =>\n handleHandleMouseDown(e, false),\n );\n handle.addEventListener(\n \"touchstart\",\n (e) => handleHandleMouseDown(e, false),\n { passive: true },\n );\n handle.addEventListener(\"keydown\", (e) => handleKeyDown(e, false));\n handle.addEventListener(\"focus\", (e) => handleFocus(e, false));\n handle.addEventListener(\"blur\", (e) => handleBlur(e, false));\n\n // Second handle events for range slider\n if (config.range && secondHandle) {\n secondHandle.addEventListener(\"mousedown\", (e) =>\n handleHandleMouseDown(e, true),\n );\n secondHandle.addEventListener(\n \"touchstart\",\n (e) => handleHandleMouseDown(e, true),\n { passive: true },\n );\n secondHandle.addEventListener(\"keydown\", (e) => handleKeyDown(e, true));\n secondHandle.addEventListener(\"focus\", (e) => handleFocus(e, true));\n secondHandle.addEventListener(\"blur\", (e) => handleBlur(e, true));\n }\n };\n\n /**\n * Clean up all event listeners\n */\n const cleanupEventListeners = () => {\n if (!state.component) return;\n\n // Clean up container listeners\n if (container) {\n container.removeEventListener(\"mousedown\", handleTrackMouseDown);\n container.removeEventListener(\"touchstart\", handleTrackMouseDown);\n }\n\n // Clean up handle listeners\n if (handle) {\n handle.removeEventListener(\"mousedown\", (e) =>\n handleHandleMouseDown(e, false),\n );\n handle.removeEventListener(\"touchstart\", (e) =>\n handleHandleMouseDown(e, false),\n );\n handle.removeEventListener(\"keydown\", (e) => handleKeyDown(e, false));\n handle.removeEventListener(\"focus\", (e) => handleFocus(e, false));\n handle.removeEventListener(\"blur\", (e) => handleBlur(e, false));\n }\n\n // Clean up second handle listeners\n if (config.range && secondHandle) {\n secondHandle.removeEventListener(\"mousedown\", (e) =>\n handleHandleMouseDown(e, true),\n );\n secondHandle.removeEventListener(\"touchstart\", (e) =>\n handleHandleMouseDown(e, true),\n );\n secondHandle.removeEventListener(\"keydown\", (e) =>\n handleKeyDown(e, true),\n );\n secondHandle.removeEventListener(\"focus\", (e) => handleFocus(e, true));\n secondHandle.removeEventListener(\"blur\", (e) => handleBlur(e, true));\n }\n\n // Clean up document listeners\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"touchmove\", handleMouseMove);\n document.removeEventListener(\"touchend\", handleMouseUp);\n };\n\n // Return consolidated handlers\n return {\n // Mouse/Touch handlers\n handleHandleMouseDown,\n handleTrackMouseDown,\n handleMouseMove,\n handleMouseUp,\n\n // Keyboard handlers\n handleKeyDown,\n handleFocus,\n handleBlur,\n\n // Event management\n setupEventListeners,\n cleanupEventListeners,\n\n // Bubble management\n showActiveBubble,\n hideActiveBubble,\n hideAllBubbles,\n clearKeyboardFocus,\n };\n};\n",
|
|
205
221
|
"// src/components/slider/features/controller.ts\nimport { SLIDER_EVENTS } from \"../types\";\nimport { SliderConfig } from \"../types\";\nimport { SLIDER_MEASUREMENTS } from \"../constants\";\nimport { createHandlers } from \"./handlers\";\n\n/**\n * Add controller functionality to slider component\n * Manages state, events, user interactions, and UI rendering\n *\n * @param config Slider configuration\n * @returns Component enhancer with slider controller functionality\n */\nexport const withController = (config: SliderConfig) => (component) => {\n // Ensure component has required properties\n if (!component.element) {\n console.warn(\"Cannot initialize slider controller: missing element\");\n return component;\n }\n\n // Initialize state with current config\n const state = {\n component,\n value: config.value !== undefined ? config.value : 0,\n secondValue: config.secondValue !== undefined ? config.secondValue : null,\n min: config.min !== undefined ? config.min : 0,\n max: config.max !== undefined ? config.max : 100,\n step: config.step !== undefined ? config.step : 1,\n dragging: false,\n pressed: false, // Track if handle is pressed (mouse down)\n activeHandle: null, // Track which handle is active (null, 'first', 'second')\n activeBubble: null,\n valueHideTimer: null,\n };\n\n // Create event helpers\n const eventHelpers = {\n triggerEvent(eventName, originalEvent = null) {\n const eventData = {\n slider: state.component,\n value: state.value,\n secondValue: state.secondValue,\n originalEvent,\n preventDefault: () => {\n eventData.defaultPrevented = true;\n },\n defaultPrevented: false,\n };\n\n state.component.emit(eventName, eventData);\n return eventData;\n },\n };\n\n //=============================================================================\n // UI RENDERING FUNCTIONS\n //=============================================================================\n\n /**\n * Gets required components from state, safely handling missing components\n */\n const getComponents = () => {\n // Return empty object if component is missing\n if (!state.component) {\n return {};\n }\n\n // Get components from both direct properties (withDom) and components object (legacy)\n const components = state.component.components || {};\n const component = state.component;\n\n return {\n container: component.container || components.container,\n handle: component.handle || components.handle,\n valueBubble: component.valueBubble || components.valueBubble,\n secondHandle: component.secondHandle || components.secondHandle,\n secondValueBubble:\n component.secondValueBubble || components.secondValueBubble,\n // Include any other components that might exist\n ...components,\n };\n };\n\n /**\n * Calculates percentage position for a value\n * Maps from value space (min-max) to percentage space (0-100)\n */\n const getPercentage = (value) => {\n const range = state.max - state.min;\n return range === 0 ? 0 : ((value - state.min) / range) * 100;\n };\n\n /**\n * Gets track dimensions and constraints for positioning calculations\n * Handles edge constraints and padding for proper handle positioning\n */\n const getTrackDimensions = () => {\n const components = getComponents();\n const { handle, container } = components;\n\n if (!handle || !container) return null;\n\n try {\n const handleRect = handle.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const handleSize = handleRect.width || SLIDER_MEASUREMENTS.HANDLE_SIZE;\n const trackSize = containerRect.width;\n\n // Use EDGE_PADDING for consistent edge constraints\n const edgeConstraint =\n (SLIDER_MEASUREMENTS.EDGE_PADDING / trackSize) * 100;\n const paddingPixels = state.activeHandle ? 6 : 8;\n const paddingPercent = (paddingPixels / trackSize) * 100;\n\n return { handleSize, trackSize, edgeConstraint, paddingPercent };\n } catch (error) {\n console.warn(\"Error calculating track dimensions:\", error);\n return {\n handleSize: SLIDER_MEASUREMENTS.HANDLE_SIZE,\n trackSize: 200,\n edgeConstraint: 3, // 6px / 200px * 100\n paddingPercent: 4,\n };\n }\n };\n\n /**\n * Maps value percentage to visual position with edge constraints\n * Ensures handles stay within the visible track area\n */\n const mapValueToVisualPercent = (valuePercent, trackSize = 200) => {\n // Calculate edge constraint using EDGE_PADDING\n const edgeConstraint = (SLIDER_MEASUREMENTS.EDGE_PADDING / trackSize) * 100;\n const minEdge = edgeConstraint;\n const maxEdge = 100 - edgeConstraint;\n const visualRange = maxEdge - minEdge;\n\n if (valuePercent <= 0) return minEdge;\n if (valuePercent >= 100) return maxEdge;\n return minEdge + (valuePercent / 100) * visualRange;\n };\n\n /**\n * Gets slider value from a position on the track\n * Maps from pixel position to slider value\n */\n const getValueFromPosition = (position) => {\n const components = getComponents();\n const { handle, container } = components;\n\n if (!handle || !container) return state.min;\n\n try {\n const containerRect = container.getBoundingClientRect();\n const range = state.max - state.min;\n\n // Use EDGE_PADDING for consistent edge constraints\n const leftEdge = containerRect.left + SLIDER_MEASUREMENTS.EDGE_PADDING;\n const rightEdge = containerRect.right - SLIDER_MEASUREMENTS.EDGE_PADDING;\n const effectiveWidth = rightEdge - leftEdge;\n\n const adjustedPosition = Math.max(\n leftEdge,\n Math.min(rightEdge, position),\n );\n const percentageFromLeft = (adjustedPosition - leftEdge) / effectiveWidth;\n\n return state.min + percentageFromLeft * range;\n } catch (error) {\n console.warn(\"Error calculating value from position:\", error);\n return state.min;\n }\n };\n\n /**\n * Rounds a value to the nearest step\n * Used for discrete sliders\n */\n const roundToStep = (value) => {\n const step = state.step;\n if (!step || step <= 0) return value;\n\n const steps = Math.round((value - state.min) / step);\n return state.min + steps * step;\n };\n\n /**\n * Clamps a value between min and max\n * Ensures values stay within valid range\n */\n const clamp = (value, min, max) => Math.min(Math.max(value, min), max);\n\n /**\n * Updates handle and bubble positions\n * Positions elements according to current state values\n */\n const updateHandlePositions = () => {\n const components = getComponents();\n const { handle, container, valueBubble, secondHandle, secondValueBubble } =\n components;\n\n if (!handle || !container) return;\n\n const dims = getTrackDimensions();\n if (!dims) return;\n\n const { trackSize } = dims;\n\n // Update main handle position\n const percent = getPercentage(state.value);\n const adjustedPercent = mapValueToVisualPercent(percent, trackSize);\n\n handle.style.left = `${adjustedPercent}%`;\n handle.style.transform = \"translate(-50%, -50%)\";\n\n if (valueBubble) {\n valueBubble.style.left = `${adjustedPercent}%`;\n valueBubble.style.transform = \"translateX(-50%)\";\n }\n\n // Update second handle if range slider\n if (config.range && secondHandle && state.secondValue !== null) {\n const secondPercent = getPercentage(state.secondValue);\n const adjustedSecondPercent = mapValueToVisualPercent(\n secondPercent,\n trackSize,\n );\n\n secondHandle.style.left = `${adjustedSecondPercent}%`;\n secondHandle.style.transform = \"translate(-50%, -50%)\";\n\n if (secondValueBubble) {\n secondValueBubble.style.left = `${adjustedSecondPercent}%`;\n secondValueBubble.style.transform = \"translateX(-50%)\";\n }\n }\n\n // Update ARIA attributes\n if (handle) {\n handle.setAttribute(\"aria-valuenow\", String(state.value));\n }\n };\n\n /**\n * Updates value bubble content\n * Applies formatting to displayed values\n */\n const updateValueBubbles = () => {\n const components = getComponents();\n const { valueBubble, secondValueBubble } = components;\n\n if (!valueBubble) return;\n\n const formatter = config.valueFormatter || ((value) => value.toString());\n valueBubble.textContent = formatter(state.value);\n\n if (config.range && secondValueBubble && state.secondValue !== null) {\n secondValueBubble.textContent = formatter(state.secondValue);\n }\n };\n\n /**\n * Shows or hides value bubble\n * Controls visibility for value indicators\n */\n const showValueBubble = (bubbleElement, show) => {\n if (!bubbleElement || !config.showValue) return;\n\n const bubbleClass = state.component.getClass(\"slider-value\");\n bubbleElement.classList[show ? \"add\" : \"remove\"](`${bubbleClass}--visible`);\n };\n\n /**\n * Generates tick marks\n * NOTE: Ticks are now rendered via canvas, this just clears any DOM ticks\n */\n const generateTicks = () => {\n // Canvas handles tick rendering - no DOM manipulation needed\n };\n\n /**\n * Updates active state of tick marks\n * NOTE: Ticks are now rendered via canvas, so this is no longer needed\n */\n const updateTicks = () => {\n // Canvas handles tick rendering - no DOM manipulation needed\n };\n\n /**\n * Renders all UI elements to match current state\n * Central method for keeping UI in sync with state\n */\n const render = () => {\n try {\n updateHandlePositions();\n updateValueBubbles();\n\n // Trigger canvas redraw if available\n if (component.drawCanvas) {\n // Pass the current state directly to canvas\n component.drawCanvas(state);\n }\n } catch (error) {\n console.warn(\"Error rendering UI:\", error);\n }\n };\n\n // Create UI renderer interface for event handlers\n const uiRenderer = {\n getPercentage,\n getValueFromPosition,\n roundToStep,\n clamp,\n showValueBubble,\n updateUi: render, // For backward compatibility\n render,\n };\n\n // Create event handlers with our renderer\n const handlers = createHandlers(config, state, uiRenderer, eventHelpers);\n\n // Initialize slider controller\n const initController = () => {\n try {\n // Verify we have the necessary components\n const components = getComponents();\n\n if (!components.handle) {\n console.warn(\n \"Cannot initialize slider controller: missing required handle component\",\n );\n return;\n }\n\n const { handle, secondHandle } = components;\n\n // Set handle attributes\n if (handle) {\n handle.setAttribute(\"aria-valuemin\", String(state.min));\n handle.setAttribute(\"aria-valuemax\", String(state.max));\n handle.setAttribute(\"aria-valuenow\", String(state.value));\n\n if (config.range && secondHandle && state.secondValue !== null) {\n secondHandle.setAttribute(\"aria-valuemin\", String(state.min));\n secondHandle.setAttribute(\"aria-valuemax\", String(state.max));\n secondHandle.setAttribute(\"aria-valuenow\", String(state.secondValue));\n }\n }\n\n // Setup event listeners\n handlers.setupEventListeners();\n\n // Initial UI update\n render();\n } catch (error) {\n console.error(\"Error initializing slider controller:\", error);\n }\n };\n\n // Register with lifecycle if available\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy || (() => {});\n component.lifecycle.destroy = () => {\n handlers.cleanupEventListeners();\n originalDestroy();\n };\n }\n\n // Schedule initialization after current execution completes\n setTimeout(() => {\n initController();\n }, 0);\n\n // Return enhanced component\n return {\n ...component,\n // Provide controller API under 'slider' property for backward compatibility\n slider: {\n /**\n * Sets slider value\n * @param value New value\n * @param triggerEvent Whether to trigger change event\n * @returns Slider controller for chaining\n */\n setValue(value, triggerEvent = true) {\n const newValue = clamp(value, state.min, state.max);\n\n state.value = newValue;\n render();\n\n if (triggerEvent) {\n eventHelpers.triggerEvent(SLIDER_EVENTS.CHANGE);\n }\n\n return this;\n },\n\n /**\n * Gets slider value\n * @returns Current value\n */\n getValue() {\n return state.value;\n },\n\n /**\n * Sets secondary slider value (for range slider)\n * @param value New secondary value\n * @param triggerEvent Whether to trigger change event\n * @returns Slider controller for chaining\n */\n setSecondValue(value, triggerEvent = true) {\n if (!config.range) return this;\n\n const newValue = clamp(value, state.min, state.max);\n state.secondValue = newValue;\n render();\n\n if (triggerEvent) {\n eventHelpers.triggerEvent(SLIDER_EVENTS.CHANGE);\n }\n\n return this;\n },\n\n /**\n * Gets secondary slider value\n * @returns Current secondary value or null\n */\n getSecondValue() {\n return config.range ? state.secondValue : null;\n },\n\n /**\n * Sets slider minimum value\n * @param min New minimum value\n * @returns Slider controller for chaining\n */\n setMin(min) {\n state.min = min;\n\n // Update ARIA attributes on handles\n const components = getComponents();\n if (components.handle) {\n components.handle.setAttribute(\"aria-valuemin\", String(min));\n }\n\n if (config.range && components.secondHandle) {\n components.secondHandle.setAttribute(\"aria-valuemin\", String(min));\n }\n\n // Clamp values to new min\n if (state.value < min) state.value = min;\n if (\n config.range &&\n state.secondValue !== null &&\n state.secondValue < min\n ) {\n state.secondValue = min;\n }\n\n // Regenerate ticks if needed\n if (config.ticks || config.tickLabels) {\n generateTicks();\n }\n\n render();\n return this;\n },\n\n /**\n * Gets slider minimum value\n * @returns Current minimum value\n */\n getMin() {\n return state.min;\n },\n\n /**\n * Sets slider maximum value\n * @param max New maximum value\n * @returns Slider controller for chaining\n */\n setMax(max) {\n state.max = max;\n\n // Update ARIA attributes on handles\n const components = getComponents();\n if (components.handle) {\n components.handle.setAttribute(\"aria-valuemax\", String(max));\n }\n\n if (config.range && components.secondHandle) {\n components.secondHandle.setAttribute(\"aria-valuemax\", String(max));\n }\n\n // Clamp values to new max\n if (state.value > max) state.value = max;\n if (\n config.range &&\n state.secondValue !== null &&\n state.secondValue > max\n ) {\n state.secondValue = max;\n }\n\n // Regenerate ticks if needed\n if (config.ticks || config.tickLabels) {\n generateTicks();\n }\n\n render();\n return this;\n },\n\n /**\n * Gets slider maximum value\n * @returns Current maximum value\n */\n getMax() {\n return state.max;\n },\n\n /**\n * Sets slider step size\n * @param step New step size\n * @returns Slider controller for chaining\n */\n setStep(step) {\n state.step = step;\n\n // Add or remove discrete class\n component.element.classList[step > 0 ? \"add\" : \"remove\"](\n `${component.getClass(\"slider\")}--discrete`,\n );\n\n // Regenerate ticks if needed\n if (config.ticks || config.tickLabels) {\n generateTicks();\n updateTicks();\n }\n\n return this;\n },\n\n /**\n * Gets slider step size\n * @returns Current step size\n */\n getStep() {\n return state.step;\n },\n\n /**\n * Regenerate tick marks and labels\n * NOTE: Canvas handles tick rendering, this just triggers a redraw\n * @returns Slider controller for chaining\n */\n regenerateTicks() {\n render(); // Canvas will redraw ticks based on current state\n return this;\n },\n\n /**\n * Update all UI elements\n * @returns Slider controller for chaining\n */\n updateUi() {\n render();\n return this;\n },\n },\n };\n};\n",
|
|
206
|
-
"import { SliderConfig, SliderColor } from \"../types\";\nimport { getThemeColor, colorToRGBA } from \"../../../core/utils\";\nimport {\n observeCanvasResize,\n clipRoundedRect,\n fillRoundedRectLR,\n clearCanvas,\n easeOutCubic,\n ANIMATION_DURATIONS,\n CanvasContext,\n createCanvasContext,\n updateCanvasDimensions as updateCanvasDims,\n initializeCanvasWithRetry,\n createStyledCanvas,\n createCanvasThemeObserver,\n} from \"../../../core/canvas\";\nimport { SLIDER_SIZES, SLIDER_MEASUREMENTS, SliderSize } from \"../constants\";\n\n/**\n * Animation state for smooth transitions\n */\ninterface AnimationState {\n // Current animated values\n animatedValue: number;\n animatedSecondValue: number | null;\n\n // Target values\n targetValue: number;\n targetSecondValue: number | null;\n\n // Start values for current animation\n startValue: number;\n startSecondValue: number | null;\n\n // Animation timing\n startTime: number;\n duration: number;\n animationFrame: number | null;\n}\n\n/**\n * Component with canvas capabilities\n */\ninterface CanvasSliderComponent {\n element: HTMLElement;\n canvas: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n getClass: (name: string) => string;\n drawCanvas: (state?: any) => void;\n resize: () => void;\n animationState?: AnimationState;\n [key: string]: any;\n}\n\n/**\n * Checks if component is disabled\n */\nconst isDisabled = (component?: any): boolean =>\n component?.disabled?.isDisabled?.() ||\n component?.element?.classList?.contains?.(\n `${component?.getClass?.(\"slider\")}--disabled`\n ) ||\n false;\n\n/**\n * Gets colors based on state and element type\n */\nconst getColors = (\n config: SliderConfig,\n component?: any,\n elementType: \"track\" | \"tick\" | \"dot\" = \"track\"\n) => {\n const disabled = isDisabled(component);\n const variant = config.color || \"primary\";\n\n if (disabled) {\n const onSurfaceColor = getThemeColor(\"sys-color-on-surface\", {\n fallback: \"#000000\",\n });\n return {\n primary: colorToRGBA(onSurfaceColor, 0.38),\n secondary: colorToRGBA(onSurfaceColor, 0.12),\n };\n }\n\n if (elementType === \"tick\") {\n return {\n primary: getThemeColor(`sys-color-on-${variant}`, {\n fallback: \"#ffffff\",\n }),\n secondary: getThemeColor(`sys-color-${variant}`, { fallback: \"#1976d2\" }),\n };\n }\n\n const primaryColor = getThemeColor(`sys-color-${variant}`, {\n fallback: \"#1976d2\",\n });\n return {\n primary: primaryColor,\n secondary: colorToRGBA(primaryColor, 0.24),\n };\n};\n\n/**\n * Calculates value percentage\n */\nconst getValuePercent = (value: number, min: number, max: number): number =>\n ((value - min) / (max - min)) * 100;\n\n/**\n * Draws a track segment if width > 0\n */\nconst drawTrackSegment = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n color: string\n) => {\n if (width > 0) {\n fillRoundedRectLR(ctx, x, y, width, height, radius, radius, color);\n }\n};\n\n/**\n * Gets the track height value from the size config\n */\nexport const getTrackHeight = (size?: SliderSize): number => {\n if (typeof size === \"number\") {\n return Math.max(size, SLIDER_SIZES.XS);\n }\n\n if (typeof size === \"string\" && size in SLIDER_SIZES) {\n return SLIDER_SIZES[size as keyof typeof SLIDER_SIZES];\n }\n\n return SLIDER_SIZES.XS; // Default to XS\n};\n\n/**\n * Gets the handle height based on the slider size\n */\nexport const getHandleHeight = (size?: SliderSize): number => {\n const trackHeight = getTrackHeight(size);\n\n // For XS and S sizes, use SMALL_HANDLE_HEIGHT constant\n if (trackHeight <= SLIDER_SIZES.S) {\n return SLIDER_MEASUREMENTS.SMALL_HANDLE_HEIGHT;\n }\n\n // For M, L, XL sizes, handle height is larger than track by HANDLE_HEIGHT_OFFSET\n return trackHeight + SLIDER_MEASUREMENTS.HANDLE_HEIGHT_OFFSET;\n};\n\n/**\n * Gets the external track radius based on the slider size\n */\nexport const getExternalTrackRadius = (size?: SliderSize): number => {\n const trackHeight = getTrackHeight(size);\n\n // For XS and S sizes, use SMALL_TRACK_EXTERNAL_RADIUS constant\n if (trackHeight <= SLIDER_SIZES.S) {\n return SLIDER_MEASUREMENTS.SMALL_TRACK_EXTERNAL_RADIUS;\n }\n\n // For M, L, XL sizes, use track height multiplied by ratio\n return trackHeight * SLIDER_MEASUREMENTS.LARGE_TRACK_RADIUS_RATIO;\n};\n\n/**\n * Updates canvas dimensions based on current size\n */\nconst updateCanvasDimensions = (\n canvas: HTMLCanvasElement,\n context: CanvasContext,\n config?: SliderConfig\n): void => {\n const trackHeight = getTrackHeight(config?.size);\n const handleHeight = getHandleHeight(config?.size);\n\n const sliderElement = canvas.parentElement;\n if (!sliderElement) return;\n\n const width = Math.max(\n sliderElement.getBoundingClientRect().width || sliderElement.offsetWidth,\n 200\n );\n const height = Math.max(\n handleHeight + 20,\n trackHeight + 32,\n SLIDER_MEASUREMENTS.MIN_HEIGHT\n );\n\n // Update container height\n sliderElement.style.height = `${height}px`;\n\n // Use shared utility to update canvas dimensions\n updateCanvasDims(context, width, height);\n};\n\n/**\n * Sets up canvas with proper pixel ratio and dimensions\n */\nconst setupCanvas = (\n canvas: HTMLCanvasElement,\n config?: SliderConfig\n): CanvasContext => {\n const sliderElement = canvas.parentElement;\n if (!sliderElement) {\n throw new Error(\"Canvas must have a parent element\");\n }\n\n const trackHeight = getTrackHeight(config?.size);\n const handleHeight = getHandleHeight(config?.size);\n const width = Math.max(\n sliderElement.getBoundingClientRect().width || sliderElement.offsetWidth,\n 200\n );\n const height = Math.max(\n handleHeight + 20,\n trackHeight + 32,\n SLIDER_MEASUREMENTS.MIN_HEIGHT\n );\n\n // Update container height\n sliderElement.style.height = `${height}px`;\n\n // Use shared utility to create canvas context\n return createCanvasContext(canvas, width, height);\n};\n\n/**\n * Maps value percentage to visual position with edge constraints\n */\nconst mapValueToVisualPercent = (\n valuePercent: number,\n trackWidth: number\n): number => {\n const edgeConstraint = (SLIDER_MEASUREMENTS.EDGE_PADDING / trackWidth) * 100;\n const minEdge = edgeConstraint;\n const maxEdge = 100 - edgeConstraint;\n const visualRange = maxEdge - minEdge;\n\n if (valuePercent <= 0) return minEdge;\n if (valuePercent >= 100) return maxEdge;\n return minEdge + (valuePercent / 100) * visualRange;\n};\n\n/**\n * Draws track segments on canvas\n */\nconst drawTracks = (\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n config: SliderConfig,\n state: any,\n component?: any\n) => {\n const trackY = height / 2;\n const trackHeight = getTrackHeight(config.size);\n const containerRadius = getExternalTrackRadius(config.size); // Container radius for clipping\n const trackRadius = SLIDER_MEASUREMENTS.TRACK_RADIUS; // Uniform 2px radius for all tracks\n\n // Create clipping region with container radius (mimics CSS overflow: hidden with border-radius)\n const restoreClip = clipRoundedRect(\n ctx,\n 0,\n trackY - trackHeight / 2,\n width,\n trackHeight,\n containerRadius\n );\n\n // Get colors based on state\n const { primary: primaryColor, secondary: inactiveColor } = getColors(\n config,\n component\n );\n\n // Get value percentages\n const valuePercent = getValuePercent(state.value, state.min, state.max);\n const adjustedPercent = mapValueToVisualPercent(valuePercent, width);\n\n // Fixed pixel gaps - instantly reduce by HANDLE_GAP_PRESSED_REDUCTION when pressed\n const gapReduction = state.pressed\n ? SLIDER_MEASUREMENTS.HANDLE_GAP_PRESSED_REDUCTION\n : 0;\n const handleGapPixels = SLIDER_MEASUREMENTS.HANDLE_GAP - gapReduction;\n const centerGapPixels = SLIDER_MEASUREMENTS.CENTER_GAP;\n const halfCenterGapPercent = (centerGapPixels / 2 / width) * 100;\n const paddingPercent = (handleGapPixels / width) * 100;\n\n if (config.centered) {\n // Calculate center position\n const zeroPercent = getValuePercent(0, state.min, state.max);\n const adjustedZeroPercent = mapValueToVisualPercent(zeroPercent, width);\n\n // Check if handle is near center\n const handleNearCenter =\n Math.abs(adjustedPercent - adjustedZeroPercent) < paddingPercent;\n const isPositive = state.value >= 0;\n\n if (handleNearCenter) {\n // Handle at center - draw start and remaining tracks only\n\n // Start track (left side)\n const startWidth = ((adjustedPercent - paddingPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Remaining track (right side)\n const remainingX = ((adjustedPercent + paddingPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n } else if (isPositive) {\n // Positive value - active track from center to handle\n\n // Start track (from minimum to center)\n const startWidth =\n ((adjustedZeroPercent - halfCenterGapPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Active track (from center to handle)\n const activeX =\n ((adjustedZeroPercent + halfCenterGapPercent) / 100) * width;\n const activeWidth =\n ((adjustedPercent - paddingPercent) / 100) * width - activeX;\n if (activeWidth > 0) {\n drawTrackSegment(\n ctx,\n activeX,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Remaining track (from handle to maximum)\n const remainingX = ((adjustedPercent + paddingPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n } else {\n // Negative value - active track from handle to center\n\n // Start track (from minimum to handle)\n const startWidth = ((adjustedPercent - paddingPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Active track (from handle to center)\n const activeX = ((adjustedPercent + paddingPercent) / 100) * width;\n const activeWidth =\n ((adjustedZeroPercent - halfCenterGapPercent) / 100) * width - activeX;\n if (activeWidth > 0) {\n drawTrackSegment(\n ctx,\n activeX,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Remaining track (from center to maximum)\n const remainingX =\n ((adjustedZeroPercent + halfCenterGapPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n }\n } else if (config.range && state.secondValue !== null) {\n // Range slider\n const secondPercent = getValuePercent(\n state.secondValue,\n state.min,\n state.max\n );\n const adjustedSecondPercent = mapValueToVisualPercent(secondPercent, width);\n\n const lowerPercent = Math.min(adjustedPercent, adjustedSecondPercent);\n const higherPercent = Math.max(adjustedPercent, adjustedSecondPercent);\n\n // Determine which handle is at lower/higher position\n const firstHandleIsLower = adjustedPercent <= adjustedSecondPercent;\n\n // Apply gap reduction only to the active handle\n const firstHandleGapReduction =\n state.pressed && state.activeHandle === \"first\"\n ? SLIDER_MEASUREMENTS.HANDLE_GAP_PRESSED_REDUCTION\n : 0;\n const secondHandleGapReduction =\n state.pressed && state.activeHandle === \"second\"\n ? SLIDER_MEASUREMENTS.HANDLE_GAP_PRESSED_REDUCTION\n : 0;\n\n const firstHandleGapPixels =\n SLIDER_MEASUREMENTS.HANDLE_GAP - firstHandleGapReduction;\n const secondHandleGapPixels =\n SLIDER_MEASUREMENTS.HANDLE_GAP - secondHandleGapReduction;\n\n const lowerHandleGapPercent = firstHandleIsLower\n ? (firstHandleGapPixels / width) * 100\n : (secondHandleGapPixels / width) * 100;\n\n const higherHandleGapPercent = firstHandleIsLower\n ? (secondHandleGapPixels / width) * 100\n : (firstHandleGapPixels / width) * 100;\n\n // Inactive track before first handle\n const startWidth = ((lowerPercent - lowerHandleGapPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Active track between handles\n const activeX = ((lowerPercent + lowerHandleGapPercent) / 100) * width;\n const activeWidth =\n ((higherPercent - higherHandleGapPercent) / 100) * width - activeX;\n\n if (activeWidth > trackHeight) {\n // Only show if handles aren't too close\n drawTrackSegment(\n ctx,\n activeX,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Inactive track after second handle\n const remainingX = ((higherPercent + higherHandleGapPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n } else {\n // Single handle slider\n\n // Active track (from start to handle)\n const activeWidth = ((adjustedPercent - paddingPercent) / 100) * width;\n if (activeWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Remaining track (from handle to end)\n const remainingX = ((adjustedPercent + paddingPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n }\n\n // Restore canvas state (removes clipping)\n restoreClip();\n};\n\n/**\n * Draws tick marks on canvas\n */\nconst drawTicks = (\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n config: SliderConfig,\n state: any,\n component?: any\n) => {\n if (!config.ticks) return;\n\n const tickSize = SLIDER_MEASUREMENTS.TICK_SIZE;\n const y = height / 2;\n\n // Get colors based on state\n const { primary: tickActiveColor, secondary: tickInactiveColor } = getColors(\n config,\n component,\n \"tick\"\n );\n\n // Calculate tick values\n const numSteps = Math.floor((state.max - state.min) / state.step);\n\n for (let i = 0; i <= numSteps; i++) {\n const value = state.min + i * state.step;\n if (value > state.max) continue;\n\n // Get position with edge constraints\n const percent = getValuePercent(value, state.min, state.max);\n const adjustedPercent = mapValueToVisualPercent(percent, width);\n const x = (adjustedPercent / 100) * width;\n\n // Skip tick if it's at handle position\n const isAtHandle = Math.abs(value - state.value) < state.step * 0.1;\n const isAtSecondHandle =\n config.range &&\n state.secondValue !== null &&\n Math.abs(value - state.secondValue) < state.step * 0.1;\n\n if (isAtHandle || isAtSecondHandle) continue;\n\n // Determine if tick is active\n let isActive = false;\n\n if (config.centered) {\n isActive =\n state.value >= 0\n ? value >= 0 && value <= state.value\n : value >= state.value && value <= 0;\n } else if (config.range && state.secondValue !== null) {\n const lowerValue = Math.min(state.value, state.secondValue);\n const higherValue = Math.max(state.value, state.secondValue);\n isActive = value >= lowerValue && value <= higherValue;\n } else {\n isActive = value <= state.value;\n }\n\n // Draw tick\n ctx.fillStyle = isActive ? tickActiveColor : tickInactiveColor;\n ctx.globalAlpha = isActive ? 1 : 0.5;\n ctx.beginPath();\n ctx.arc(x, y, tickSize / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.globalAlpha = 1;\n};\n\n/**\n * Draws dots at track ends\n */\nconst drawDots = (\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n config: SliderConfig,\n component?: any\n) => {\n // Don't draw dots for discrete sliders (sliders with ticks)\n if (config.ticks) return;\n\n const dotSize = SLIDER_MEASUREMENTS.DOT_SIZE;\n const y = height / 2;\n const padding = SLIDER_MEASUREMENTS.EDGE_PADDING;\n\n // Get colors based on state\n const { primary: dotColor } = getColors(config, component, \"dot\");\n\n // For continuous sliders, only draw end dot\n ctx.fillStyle = dotColor;\n ctx.beginPath();\n ctx.arc(width - padding, y, dotSize / 2, 0, Math.PI * 2);\n ctx.fill();\n};\n\n/**\n * Main drawing function\n */\nconst draw = (\n context: CanvasContext,\n config: SliderConfig,\n state: any,\n component?: any\n): void => {\n const { ctx, width, height } = context;\n\n // Skip drawing if canvas has no dimensions\n if (width === 0 || height === 0) return;\n\n // Clear canvas\n clearCanvas(ctx, width, height);\n\n // Draw in order: dots, tracks, ticks\n drawDots(ctx, width, height, config, component);\n drawTracks(ctx, width, height, config, state, component);\n drawTicks(ctx, width, height, config, state, component);\n};\n\n/**\n * Updates handle sizes based on slider size\n */\nconst updateHandleSizes = (component: any, size: SliderSize): void => {\n const handleHeight = getHandleHeight(size);\n\n // Check both component.handle (from withDom) and component.components.handle (legacy)\n const handle = component.handle || component.components?.handle;\n const secondHandle =\n component.secondHandle || component.components?.secondHandle;\n\n if (handle) {\n handle.style.height = `${handleHeight}px`;\n handle.style.transform = \"translate(-50%, -50%)\";\n }\n if (secondHandle) {\n secondHandle.style.height = `${handleHeight}px`;\n secondHandle.style.transform = \"translate(-50%, -50%)\";\n }\n};\n\n/**\n * Creates state object from various sources\n */\nconst createState = (\n controllerState?: any,\n component?: any,\n lastKnownState?: any\n): any => {\n if (controllerState) {\n return {\n value: controllerState.value,\n secondValue: controllerState.secondValue,\n min: controllerState.min,\n max: controllerState.max,\n step: controllerState.step,\n pressed: controllerState.pressed || false,\n activeHandle: controllerState.activeHandle || null,\n };\n }\n\n if (component?.slider) {\n return {\n value: component.slider.getValue(),\n secondValue: component.slider.getSecondValue(),\n min: component.slider.getMin(),\n max: component.slider.getMax(),\n step: component.slider.getStep(),\n pressed: false,\n activeHandle: null,\n };\n }\n\n return (\n lastKnownState || {\n value: 0,\n secondValue: null,\n min: 0,\n max: 100,\n step: 1,\n pressed: false,\n activeHandle: null,\n }\n );\n};\n\n/**\n * Adds canvas functionality for slider visuals\n * Keeps handle and value bubble as DOM elements for accessibility\n */\nexport const withCanvas =\n (config: SliderConfig) =>\n (component: any): CanvasSliderComponent => {\n // Create canvas element using shared utility\n const canvas = createStyledCanvas(\n `${component.getClass(\"slider-canvas\")}`,\n { zIndex: \"1\" } // Ensure canvas is above track but below handle\n );\n\n // Insert canvas as first child (behind interactive elements)\n const container = component.container || component.components?.container;\n if (container) {\n container.insertBefore(canvas, container.firstChild);\n } else {\n component.element.appendChild(canvas);\n }\n\n // Setup canvas context\n let canvasContext: CanvasContext | null = null;\n let resizeCleanup: (() => void) | null = null;\n let themeCleanup: (() => void) | null = null;\n\n // Current size - managed by API\n let currentSize = config.size || \"XS\";\n\n // Store last known state for theme changes\n let lastKnownState = createState(null, component, {\n value: config.value || 0,\n secondValue: config.secondValue || null,\n min: config.min || 0,\n max: config.max || 100,\n step: config.step || 1,\n pressed: false,\n activeHandle: null,\n });\n\n // Initialize animation state\n const animationState: AnimationState = {\n animatedValue: lastKnownState.value,\n animatedSecondValue: lastKnownState.secondValue,\n targetValue: lastKnownState.value,\n targetSecondValue: lastKnownState.secondValue,\n startValue: lastKnownState.value,\n startSecondValue: lastKnownState.secondValue,\n startTime: 0,\n duration: ANIMATION_DURATIONS.MEDIUM,\n animationFrame: null,\n };\n\n component.animationState = animationState;\n\n // Initialize canvas with retry mechanism\n initializeCanvasWithRetry(\n () => {\n try {\n canvasContext = setupCanvas(canvas, {\n ...config,\n size: currentSize,\n });\n component.ctx = canvasContext.ctx;\n return true;\n } catch (error) {\n console.warn(\"Slider canvas initialization failed:\", error);\n return false;\n }\n },\n () => {\n // Set initial handle sizes after successful initialization\n updateHandleSizes(component, currentSize);\n }\n );\n\n // Add color class to component element if not primary\n if (config.color && config.color !== \"primary\") {\n component.element.classList.add(\n `${component.getClass(\"slider\")}--${config.color}`\n );\n }\n\n // Store canvas reference\n component.canvas = canvas;\n\n // Helper to draw with current animated state\n const drawAnimatedState = () => {\n if (!canvasContext) return;\n draw(\n canvasContext,\n {\n ...config,\n size: currentSize,\n },\n {\n ...lastKnownState,\n value: animationState.animatedValue,\n secondValue: animationState.animatedSecondValue,\n },\n component\n );\n };\n\n // Animation loop function\n const animate = (currentTime?: number): void => {\n if (!canvasContext) return;\n\n // If no currentTime provided, use performance.now()\n const now = currentTime || performance.now();\n const elapsed = now - animationState.startTime;\n const progress = Math.min(elapsed / animationState.duration, 1);\n const easedProgress = easeOutCubic(progress);\n\n // Update animated values\n const startValue = animationState.startValue;\n const targetValue = animationState.targetValue;\n animationState.animatedValue =\n startValue + (targetValue - startValue) * easedProgress;\n\n if (\n animationState.targetSecondValue !== null &&\n animationState.animatedSecondValue !== null\n ) {\n const startSecondValue = animationState.startSecondValue;\n const targetSecondValue = animationState.targetSecondValue;\n animationState.animatedSecondValue =\n startSecondValue +\n (targetSecondValue - startSecondValue) * easedProgress;\n }\n\n // Draw with animated values\n drawAnimatedState();\n\n // Continue animation if not complete\n if (progress < 1) {\n animationState.animationFrame = requestAnimationFrame((time) =>\n animate(time)\n );\n } else {\n animationState.animationFrame = null;\n }\n };\n\n // Drawing function\n const drawCanvas = (controllerState?: any): void => {\n if (!canvasContext) {\n console.warn(\"Canvas context not ready\");\n return;\n }\n\n // Update dimensions in case size changed\n updateCanvasDimensions(canvas, canvasContext, {\n ...config,\n size: currentSize,\n });\n\n // Get current state - prefer passed state, then slider API, then last known state\n let state;\n let isDragging = false;\n\n if (controllerState) {\n // Use state passed from controller and update last known state\n state = {\n value: controllerState.value,\n secondValue: controllerState.secondValue,\n min: controllerState.min,\n max: controllerState.max,\n step: controllerState.step,\n pressed: controllerState.pressed || false,\n activeHandle: controllerState.activeHandle || null,\n };\n isDragging = controllerState.dragging || false;\n lastKnownState = { ...state };\n } else if (component.slider) {\n // Fallback to slider API and update last known state\n state = {\n value: component.slider.getValue(),\n secondValue: component.slider.getSecondValue(),\n min: component.slider.getMin(),\n max: component.slider.getMax(),\n step: component.slider.getStep(),\n };\n lastKnownState = { ...state };\n } else {\n // Use last known state as fallback\n state = { ...lastKnownState };\n }\n\n // Check if we need to animate (skip animation when dragging)\n const valueChanged = state.value !== animationState.targetValue;\n const secondValueChanged =\n state.secondValue !== animationState.targetSecondValue;\n\n if ((valueChanged || secondValueChanged) && !isDragging) {\n // Capture start values before updating targets\n animationState.startValue = animationState.animatedValue;\n animationState.startSecondValue = animationState.animatedSecondValue;\n\n // Update target values\n animationState.targetValue = state.value;\n animationState.targetSecondValue = state.secondValue;\n\n // Cancel any existing animation\n if (animationState.animationFrame) {\n cancelAnimationFrame(animationState.animationFrame);\n }\n\n // Start new animation\n animationState.startTime = performance.now();\n\n // Draw first frame immediately to sync with handle movement\n animate();\n } else if (isDragging) {\n // When dragging, update values immediately without animation\n animationState.animatedValue = state.value;\n animationState.animatedSecondValue = state.secondValue;\n animationState.targetValue = state.value;\n animationState.targetSecondValue = state.secondValue;\n animationState.startValue = state.value;\n animationState.startSecondValue = state.secondValue;\n\n // Cancel any ongoing animation\n if (animationState.animationFrame) {\n cancelAnimationFrame(animationState.animationFrame);\n animationState.animationFrame = null;\n }\n\n // Draw immediately\n draw(\n canvasContext,\n {\n ...config,\n size: currentSize,\n },\n controllerState || state,\n component\n );\n } else {\n // No animation needed, draw current state\n draw(\n canvasContext,\n {\n ...config,\n size: currentSize,\n },\n controllerState || state,\n component\n );\n }\n };\n\n // Resize function\n const resize = (): void => {\n if (!canvasContext) return;\n\n try {\n const newContext = setupCanvas(canvas, {\n ...config,\n size: currentSize,\n });\n component.ctx = newContext.ctx;\n Object.assign(canvasContext, newContext);\n\n // Redraw with current animated values\n drawAnimatedState();\n } catch (error) {\n console.warn(\"Slider canvas resize failed:\", error);\n }\n };\n\n // Setup observers\n resizeCleanup = observeCanvasResize(component.element, canvas, resize);\n\n // Observe theme changes\n const onThemeChange = () => drawAnimatedState();\n\n themeCleanup = createCanvasThemeObserver(\n config.color || \"primary\",\n onThemeChange\n );\n\n // Initial draw\n requestAnimationFrame(() => {\n drawCanvas();\n });\n\n // Extend component with canvas methods\n component.drawCanvas = drawCanvas;\n component.resize = resize;\n\n // Add setSize method\n component.setSize = (size: SliderSize) => {\n currentSize = size;\n if (canvasContext) {\n updateCanvasDimensions(canvas, canvasContext, {\n ...config,\n size: currentSize,\n });\n // Redraw with current animated values\n drawAnimatedState();\n }\n\n // Update handle sizes\n updateHandleSizes(component, currentSize);\n };\n\n // Add getSize method\n component.getSize = () => currentSize;\n\n // Update color method\n const originalSetColor = component.appearance?.setColor;\n if (originalSetColor) {\n component.appearance.setColor = (color: SliderColor) => {\n originalSetColor(color);\n\n // Remove old color class if not primary\n if (config.color && config.color !== \"primary\") {\n component.element.classList.remove(\n `${component.getClass(\"slider\")}--${config.color}`\n );\n }\n\n // Add new color class if not primary\n if (color && color !== \"primary\") {\n component.element.classList.add(\n `${component.getClass(\"slider\")}--${color}`\n );\n }\n\n config.color = color;\n\n // Clean up old theme observer\n if (themeCleanup) {\n themeCleanup();\n themeCleanup = null;\n }\n\n // Set up new theme observer for the new color\n themeCleanup = createCanvasThemeObserver(color, onThemeChange);\n\n // Redraw with new color\n drawCanvas();\n };\n }\n\n // Clean up on destroy\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy || (() => {});\n component.lifecycle.destroy = () => {\n if (resizeCleanup) resizeCleanup();\n if (themeCleanup) themeCleanup();\n if (animationState.animationFrame) {\n cancelAnimationFrame(animationState.animationFrame);\n }\n originalDestroy();\n };\n }\n\n return component as CanvasSliderComponent;\n };\n",
|
|
222
|
+
"import { SliderConfig, SliderColor } from \"../types\";\nimport { getThemeColor, colorToRGBA } from \"../../../core/utils\";\nimport {\n observeCanvasResize,\n clipRoundedRect,\n fillRoundedRectLR,\n clearCanvas,\n easeOutCubic,\n ANIMATION_DURATIONS,\n CanvasContext,\n createCanvasContext,\n updateCanvasDimensions as updateCanvasDims,\n initializeCanvasWithRetry,\n createStyledCanvas,\n createCanvasThemeObserver,\n} from \"../../../core/canvas\";\nimport { SLIDER_SIZES, SLIDER_MEASUREMENTS, SliderSize } from \"../constants\";\n\n/**\n * Animation state for smooth transitions\n */\ninterface AnimationState {\n // Current animated values\n animatedValue: number;\n animatedSecondValue: number | null;\n\n // Target values\n targetValue: number;\n targetSecondValue: number | null;\n\n // Start values for current animation\n startValue: number;\n startSecondValue: number | null;\n\n // Animation timing\n startTime: number;\n duration: number;\n animationFrame: number | null;\n}\n\n/**\n * Component with canvas capabilities\n */\ninterface CanvasSliderComponent {\n element: HTMLElement;\n canvas: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n getClass: (name: string) => string;\n drawCanvas: (state?: any) => void;\n resize: () => void;\n animationState?: AnimationState;\n [key: string]: any;\n}\n\n/**\n * Checks if component is disabled\n */\nconst isDisabled = (component?: any): boolean =>\n component?.disabled?.isDisabled?.() ||\n component?.element?.classList?.contains?.(\n `${component?.getClass?.(\"slider\")}--disabled`\n ) ||\n false;\n\n/**\n * Gets colors based on state and element type\n */\nconst getColors = (\n config: SliderConfig,\n component?: any,\n elementType: \"track\" | \"tick\" | \"dot\" = \"track\"\n) => {\n const disabled = isDisabled(component);\n const variant = config.color || \"primary\";\n\n if (disabled) {\n const onSurfaceColor = getThemeColor(\"sys-color-on-surface\", {\n fallback: \"#000000\",\n });\n return {\n primary: colorToRGBA(onSurfaceColor, 0.38),\n secondary: colorToRGBA(onSurfaceColor, 0.12),\n };\n }\n\n // A stylesheet may override the colour per slider with the custom\n // properties --mtrl-slider-color (active track, handle) and\n // --mtrl-slider-on-color (ticks on the active track), e.g. a slider that\n // sits on a coloured bar. Their computed values resolve any var() chain.\n const styles =\n component?.element && typeof getComputedStyle === \"function\"\n ? getComputedStyle(component.element)\n : undefined;\n const override = styles?.getPropertyValue(\"--mtrl-slider-color\").trim();\n const onOverride = styles?.getPropertyValue(\"--mtrl-slider-on-color\").trim();\n\n if (elementType === \"tick\") {\n return {\n primary:\n onOverride ||\n getThemeColor(`sys-color-on-${variant}`, { fallback: \"#ffffff\" }),\n secondary:\n override ||\n getThemeColor(`sys-color-${variant}`, { fallback: \"#1976d2\" }),\n };\n }\n\n const primaryColor =\n override ||\n getThemeColor(`sys-color-${variant}`, { fallback: \"#1976d2\" });\n return {\n primary: primaryColor,\n secondary: colorToRGBA(primaryColor, 0.24),\n };\n};\n\n/**\n * Calculates value percentage\n */\nconst getValuePercent = (value: number, min: number, max: number): number =>\n ((value - min) / (max - min)) * 100;\n\n/**\n * Draws a track segment if width > 0\n */\nconst drawTrackSegment = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n color: string\n) => {\n if (width > 0) {\n fillRoundedRectLR(ctx, x, y, width, height, radius, radius, color);\n }\n};\n\n/**\n * Gets the track height value from the size config\n */\nexport const getTrackHeight = (size?: SliderSize): number => {\n if (typeof size === \"number\") {\n return Math.max(size, SLIDER_SIZES.XS);\n }\n\n if (typeof size === \"string\" && size in SLIDER_SIZES) {\n return SLIDER_SIZES[size as keyof typeof SLIDER_SIZES];\n }\n\n return SLIDER_SIZES.XS; // Default to XS\n};\n\n/**\n * Gets the handle height based on the slider size\n */\nexport const getHandleHeight = (size?: SliderSize): number => {\n const trackHeight = getTrackHeight(size);\n\n // For XS and S sizes, use SMALL_HANDLE_HEIGHT constant\n if (trackHeight <= SLIDER_SIZES.S) {\n return SLIDER_MEASUREMENTS.SMALL_HANDLE_HEIGHT;\n }\n\n // For M, L, XL sizes, handle height is larger than track by HANDLE_HEIGHT_OFFSET\n return trackHeight + SLIDER_MEASUREMENTS.HANDLE_HEIGHT_OFFSET;\n};\n\n/**\n * Gets the external track radius based on the slider size\n */\nexport const getExternalTrackRadius = (size?: SliderSize): number => {\n const trackHeight = getTrackHeight(size);\n\n // For XS and S sizes, use SMALL_TRACK_EXTERNAL_RADIUS constant\n if (trackHeight <= SLIDER_SIZES.S) {\n return SLIDER_MEASUREMENTS.SMALL_TRACK_EXTERNAL_RADIUS;\n }\n\n // For M, L, XL sizes, use track height multiplied by ratio\n return trackHeight * SLIDER_MEASUREMENTS.LARGE_TRACK_RADIUS_RATIO;\n};\n\n/**\n * Updates canvas dimensions based on current size\n */\nconst updateCanvasDimensions = (\n canvas: HTMLCanvasElement,\n context: CanvasContext,\n config?: SliderConfig\n): void => {\n const trackHeight = getTrackHeight(config?.size);\n const handleHeight = getHandleHeight(config?.size);\n\n const sliderElement = canvas.parentElement;\n if (!sliderElement) return;\n\n // the canvas takes the element's real width (fluid width comes from the\n // stylesheet); 200 is only a fallback before layout, never a minimum,\n // otherwise a narrower slider is drawn at 200 and stretched by the CSS\n const width =\n sliderElement.getBoundingClientRect().width || sliderElement.offsetWidth || 200;\n // the container is as tall as its handle, never under the 48dp touch\n // target (M3): XS/S 48, M 52, L 68, XL 108\n const height = Math.max(handleHeight, trackHeight, SLIDER_MEASUREMENTS.MIN_HEIGHT);\n\n // Update container height\n sliderElement.style.height = `${height}px`;\n\n // Use shared utility to update canvas dimensions\n updateCanvasDims(context, width, height);\n};\n\n/**\n * Sets up canvas with proper pixel ratio and dimensions\n */\nconst setupCanvas = (\n canvas: HTMLCanvasElement,\n config?: SliderConfig\n): CanvasContext => {\n const sliderElement = canvas.parentElement;\n if (!sliderElement) {\n throw new Error(\"Canvas must have a parent element\");\n }\n\n const trackHeight = getTrackHeight(config?.size);\n const handleHeight = getHandleHeight(config?.size);\n // the canvas takes the element's real width (fluid width comes from the\n // stylesheet); 200 is only a fallback before layout, never a minimum,\n // otherwise a narrower slider is drawn at 200 and stretched by the CSS\n const width =\n sliderElement.getBoundingClientRect().width || sliderElement.offsetWidth || 200;\n // the container is as tall as its handle, never under the 48dp touch\n // target (M3): XS/S 48, M 52, L 68, XL 108\n const height = Math.max(handleHeight, trackHeight, SLIDER_MEASUREMENTS.MIN_HEIGHT);\n\n // Update container height\n sliderElement.style.height = `${height}px`;\n\n // Use shared utility to create canvas context\n return createCanvasContext(canvas, width, height);\n};\n\n/**\n * Maps value percentage to visual position with edge constraints\n */\nconst mapValueToVisualPercent = (\n valuePercent: number,\n trackWidth: number\n): number => {\n const edgeConstraint = (SLIDER_MEASUREMENTS.EDGE_PADDING / trackWidth) * 100;\n const minEdge = edgeConstraint;\n const maxEdge = 100 - edgeConstraint;\n const visualRange = maxEdge - minEdge;\n\n if (valuePercent <= 0) return minEdge;\n if (valuePercent >= 100) return maxEdge;\n return minEdge + (valuePercent / 100) * visualRange;\n};\n\n/**\n * Draws track segments on canvas\n */\nconst drawTracks = (\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n config: SliderConfig,\n state: any,\n component?: any\n) => {\n const trackY = height / 2;\n const trackHeight = getTrackHeight(config.size);\n const containerRadius = getExternalTrackRadius(config.size); // Container radius for clipping\n const trackRadius = SLIDER_MEASUREMENTS.TRACK_RADIUS; // Uniform 2px radius for all tracks\n\n // Create clipping region with container radius (mimics CSS overflow: hidden with border-radius)\n const restoreClip = clipRoundedRect(\n ctx,\n 0,\n trackY - trackHeight / 2,\n width,\n trackHeight,\n containerRadius\n );\n\n // Get colors based on state\n const { primary: primaryColor, secondary: inactiveColor } = getColors(\n config,\n component\n );\n\n // Get value percentages\n const valuePercent = getValuePercent(state.value, state.min, state.max);\n const adjustedPercent = mapValueToVisualPercent(valuePercent, width);\n\n // Fixed pixel gaps - instantly reduce by HANDLE_GAP_PRESSED_REDUCTION when pressed\n const gapReduction = state.pressed\n ? SLIDER_MEASUREMENTS.HANDLE_GAP_PRESSED_REDUCTION\n : 0;\n const handleGapPixels = SLIDER_MEASUREMENTS.HANDLE_GAP - gapReduction;\n const centerGapPixels = SLIDER_MEASUREMENTS.CENTER_GAP;\n const halfCenterGapPercent = (centerGapPixels / 2 / width) * 100;\n const paddingPercent = (handleGapPixels / width) * 100;\n\n if (config.centered) {\n // Calculate center position\n const zeroPercent = getValuePercent(0, state.min, state.max);\n const adjustedZeroPercent = mapValueToVisualPercent(zeroPercent, width);\n\n // Check if handle is near center\n const handleNearCenter =\n Math.abs(adjustedPercent - adjustedZeroPercent) < paddingPercent;\n const isPositive = state.value >= 0;\n\n if (handleNearCenter) {\n // Handle at center - draw start and remaining tracks only\n\n // Start track (left side)\n const startWidth = ((adjustedPercent - paddingPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Remaining track (right side)\n const remainingX = ((adjustedPercent + paddingPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n } else if (isPositive) {\n // Positive value - active track from center to handle\n\n // Start track (from minimum to center)\n const startWidth =\n ((adjustedZeroPercent - halfCenterGapPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Active track (from center to handle)\n const activeX =\n ((adjustedZeroPercent + halfCenterGapPercent) / 100) * width;\n const activeWidth =\n ((adjustedPercent - paddingPercent) / 100) * width - activeX;\n if (activeWidth > 0) {\n drawTrackSegment(\n ctx,\n activeX,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Remaining track (from handle to maximum)\n const remainingX = ((adjustedPercent + paddingPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n } else {\n // Negative value - active track from handle to center\n\n // Start track (from minimum to handle)\n const startWidth = ((adjustedPercent - paddingPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Active track (from handle to center)\n const activeX = ((adjustedPercent + paddingPercent) / 100) * width;\n const activeWidth =\n ((adjustedZeroPercent - halfCenterGapPercent) / 100) * width - activeX;\n if (activeWidth > 0) {\n drawTrackSegment(\n ctx,\n activeX,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Remaining track (from center to maximum)\n const remainingX =\n ((adjustedZeroPercent + halfCenterGapPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n }\n } else if (config.range && state.secondValue !== null) {\n // Range slider\n const secondPercent = getValuePercent(\n state.secondValue,\n state.min,\n state.max\n );\n const adjustedSecondPercent = mapValueToVisualPercent(secondPercent, width);\n\n const lowerPercent = Math.min(adjustedPercent, adjustedSecondPercent);\n const higherPercent = Math.max(adjustedPercent, adjustedSecondPercent);\n\n // Determine which handle is at lower/higher position\n const firstHandleIsLower = adjustedPercent <= adjustedSecondPercent;\n\n // Apply gap reduction only to the active handle\n const firstHandleGapReduction =\n state.pressed && state.activeHandle === \"first\"\n ? SLIDER_MEASUREMENTS.HANDLE_GAP_PRESSED_REDUCTION\n : 0;\n const secondHandleGapReduction =\n state.pressed && state.activeHandle === \"second\"\n ? SLIDER_MEASUREMENTS.HANDLE_GAP_PRESSED_REDUCTION\n : 0;\n\n const firstHandleGapPixels =\n SLIDER_MEASUREMENTS.HANDLE_GAP - firstHandleGapReduction;\n const secondHandleGapPixels =\n SLIDER_MEASUREMENTS.HANDLE_GAP - secondHandleGapReduction;\n\n const lowerHandleGapPercent = firstHandleIsLower\n ? (firstHandleGapPixels / width) * 100\n : (secondHandleGapPixels / width) * 100;\n\n const higherHandleGapPercent = firstHandleIsLower\n ? (secondHandleGapPixels / width) * 100\n : (firstHandleGapPixels / width) * 100;\n\n // Inactive track before first handle\n const startWidth = ((lowerPercent - lowerHandleGapPercent) / 100) * width;\n if (startWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n startWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n\n // Active track between handles\n const activeX = ((lowerPercent + lowerHandleGapPercent) / 100) * width;\n const activeWidth =\n ((higherPercent - higherHandleGapPercent) / 100) * width - activeX;\n\n if (activeWidth > trackHeight) {\n // Only show if handles aren't too close\n drawTrackSegment(\n ctx,\n activeX,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Inactive track after second handle\n const remainingX = ((higherPercent + higherHandleGapPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n } else {\n // Single handle slider\n\n // Active track (from start to handle)\n const activeWidth = ((adjustedPercent - paddingPercent) / 100) * width;\n if (activeWidth > 0) {\n drawTrackSegment(\n ctx,\n 0,\n trackY - trackHeight / 2,\n activeWidth,\n trackHeight,\n trackRadius,\n primaryColor\n );\n }\n\n // Remaining track (from handle to end)\n const remainingX = ((adjustedPercent + paddingPercent) / 100) * width;\n const remainingWidth = width - remainingX;\n if (remainingWidth > 0) {\n drawTrackSegment(\n ctx,\n remainingX,\n trackY - trackHeight / 2,\n remainingWidth,\n trackHeight,\n trackRadius,\n inactiveColor\n );\n }\n }\n\n // Restore canvas state (removes clipping)\n restoreClip();\n};\n\n/**\n * Draws tick marks on canvas\n */\nconst drawTicks = (\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n config: SliderConfig,\n state: any,\n component?: any\n) => {\n if (!config.ticks) return;\n\n const tickSize = SLIDER_MEASUREMENTS.TICK_SIZE;\n const y = height / 2;\n\n // Get colors based on state\n const { primary: tickActiveColor, secondary: tickInactiveColor } = getColors(\n config,\n component,\n \"tick\"\n );\n\n // Calculate tick values\n const numSteps = Math.floor((state.max - state.min) / state.step);\n\n for (let i = 0; i <= numSteps; i++) {\n const value = state.min + i * state.step;\n if (value > state.max) continue;\n\n // Get position with edge constraints\n const percent = getValuePercent(value, state.min, state.max);\n const adjustedPercent = mapValueToVisualPercent(percent, width);\n const x = (adjustedPercent / 100) * width;\n\n // Skip tick if it's at handle position\n const isAtHandle = Math.abs(value - state.value) < state.step * 0.1;\n const isAtSecondHandle =\n config.range &&\n state.secondValue !== null &&\n Math.abs(value - state.secondValue) < state.step * 0.1;\n\n if (isAtHandle || isAtSecondHandle) continue;\n\n // Determine if tick is active\n let isActive = false;\n\n if (config.centered) {\n isActive =\n state.value >= 0\n ? value >= 0 && value <= state.value\n : value >= state.value && value <= 0;\n } else if (config.range && state.secondValue !== null) {\n const lowerValue = Math.min(state.value, state.secondValue);\n const higherValue = Math.max(state.value, state.secondValue);\n isActive = value >= lowerValue && value <= higherValue;\n } else {\n isActive = value <= state.value;\n }\n\n // Draw tick\n ctx.fillStyle = isActive ? tickActiveColor : tickInactiveColor;\n ctx.globalAlpha = isActive ? 1 : 0.5;\n ctx.beginPath();\n ctx.arc(x, y, tickSize / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.globalAlpha = 1;\n};\n\n/**\n * Draws dots at track ends\n */\nconst drawDots = (\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n config: SliderConfig,\n component?: any\n) => {\n // Don't draw dots for discrete sliders (sliders with ticks)\n if (config.ticks) return;\n\n const dotSize = SLIDER_MEASUREMENTS.DOT_SIZE;\n const y = height / 2;\n const padding = SLIDER_MEASUREMENTS.EDGE_PADDING;\n\n // Get colors based on state\n const { primary: dotColor } = getColors(config, component, \"dot\");\n\n // For continuous sliders, only draw end dot\n ctx.fillStyle = dotColor;\n ctx.beginPath();\n ctx.arc(width - padding, y, dotSize / 2, 0, Math.PI * 2);\n ctx.fill();\n};\n\n/**\n * Main drawing function\n */\nconst draw = (\n context: CanvasContext,\n config: SliderConfig,\n state: any,\n component?: any\n): void => {\n const { ctx, width, height } = context;\n\n // Skip drawing if canvas has no dimensions\n if (width === 0 || height === 0) return;\n\n // Clear canvas\n clearCanvas(ctx, width, height);\n\n // Draw in order: dots, tracks, ticks\n drawDots(ctx, width, height, config, component);\n drawTracks(ctx, width, height, config, state, component);\n drawTicks(ctx, width, height, config, state, component);\n};\n\n/**\n * Updates handle sizes based on slider size\n */\nconst updateHandleSizes = (component: any, size: SliderSize): void => {\n const handleHeight = getHandleHeight(size);\n\n // Check both component.handle (from withDom) and component.components.handle (legacy)\n const handle = component.handle || component.components?.handle;\n const secondHandle =\n component.secondHandle || component.components?.secondHandle;\n\n if (handle) {\n handle.style.height = `${handleHeight}px`;\n handle.style.transform = \"translate(-50%, -50%)\";\n }\n if (secondHandle) {\n secondHandle.style.height = `${handleHeight}px`;\n secondHandle.style.transform = \"translate(-50%, -50%)\";\n }\n};\n\n/**\n * Creates state object from various sources\n */\nconst createState = (\n controllerState?: any,\n component?: any,\n lastKnownState?: any\n): any => {\n if (controllerState) {\n return {\n value: controllerState.value,\n secondValue: controllerState.secondValue,\n min: controllerState.min,\n max: controllerState.max,\n step: controllerState.step,\n pressed: controllerState.pressed || false,\n activeHandle: controllerState.activeHandle || null,\n };\n }\n\n if (component?.slider) {\n return {\n value: component.slider.getValue(),\n secondValue: component.slider.getSecondValue(),\n min: component.slider.getMin(),\n max: component.slider.getMax(),\n step: component.slider.getStep(),\n pressed: false,\n activeHandle: null,\n };\n }\n\n return (\n lastKnownState || {\n value: 0,\n secondValue: null,\n min: 0,\n max: 100,\n step: 1,\n pressed: false,\n activeHandle: null,\n }\n );\n};\n\n/**\n * Adds canvas functionality for slider visuals\n * Keeps handle and value bubble as DOM elements for accessibility\n */\nexport const withCanvas =\n (config: SliderConfig) =>\n (component: any): CanvasSliderComponent => {\n // Create canvas element using shared utility\n const canvas = createStyledCanvas(\n `${component.getClass(\"slider-canvas\")}`,\n { zIndex: \"1\" } // Ensure canvas is above track but below handle\n );\n\n // Insert canvas as first child (behind interactive elements)\n const container = component.container || component.components?.container;\n if (container) {\n container.insertBefore(canvas, container.firstChild);\n } else {\n component.element.appendChild(canvas);\n }\n\n // Setup canvas context\n let canvasContext: CanvasContext | null = null;\n let resizeCleanup: (() => void) | null = null;\n let themeCleanup: (() => void) | null = null;\n\n // Current size - managed by API\n let currentSize = config.size || \"XS\";\n\n // Store last known state for theme changes\n let lastKnownState = createState(null, component, {\n value: config.value || 0,\n secondValue: config.secondValue || null,\n min: config.min || 0,\n max: config.max || 100,\n step: config.step || 1,\n pressed: false,\n activeHandle: null,\n });\n\n // Initialize animation state\n const animationState: AnimationState = {\n animatedValue: lastKnownState.value,\n animatedSecondValue: lastKnownState.secondValue,\n targetValue: lastKnownState.value,\n targetSecondValue: lastKnownState.secondValue,\n startValue: lastKnownState.value,\n startSecondValue: lastKnownState.secondValue,\n startTime: 0,\n duration: ANIMATION_DURATIONS.MEDIUM,\n animationFrame: null,\n };\n\n component.animationState = animationState;\n\n // Initialize canvas with retry mechanism\n initializeCanvasWithRetry(\n () => {\n try {\n canvasContext = setupCanvas(canvas, {\n ...config,\n size: currentSize,\n });\n component.ctx = canvasContext.ctx;\n return true;\n } catch (error) {\n console.warn(\"Slider canvas initialization failed:\", error);\n return false;\n }\n },\n () => {\n // Set initial handle sizes after successful initialization\n updateHandleSizes(component, currentSize);\n }\n );\n\n // Add color class to component element if not primary\n if (config.color && config.color !== \"primary\") {\n component.element.classList.add(\n `${component.getClass(\"slider\")}--${config.color}`\n );\n }\n\n // Store canvas reference\n component.canvas = canvas;\n\n // Helper to draw with current animated state\n const drawAnimatedState = () => {\n if (!canvasContext) return;\n draw(\n canvasContext,\n {\n ...config,\n size: currentSize,\n },\n {\n ...lastKnownState,\n value: animationState.animatedValue,\n secondValue: animationState.animatedSecondValue,\n },\n component\n );\n };\n\n // Animation loop function\n const animate = (currentTime?: number): void => {\n if (!canvasContext) return;\n\n // If no currentTime provided, use performance.now()\n const now = currentTime || performance.now();\n const elapsed = now - animationState.startTime;\n const progress = Math.min(elapsed / animationState.duration, 1);\n const easedProgress = easeOutCubic(progress);\n\n // Update animated values\n const startValue = animationState.startValue;\n const targetValue = animationState.targetValue;\n animationState.animatedValue =\n startValue + (targetValue - startValue) * easedProgress;\n\n if (\n animationState.targetSecondValue !== null &&\n animationState.animatedSecondValue !== null\n ) {\n const startSecondValue = animationState.startSecondValue;\n const targetSecondValue = animationState.targetSecondValue;\n animationState.animatedSecondValue =\n startSecondValue +\n (targetSecondValue - startSecondValue) * easedProgress;\n }\n\n // Draw with animated values\n drawAnimatedState();\n\n // Continue animation if not complete\n if (progress < 1) {\n animationState.animationFrame = requestAnimationFrame((time) =>\n animate(time)\n );\n } else {\n animationState.animationFrame = null;\n }\n };\n\n // Drawing function\n const drawCanvas = (controllerState?: any): void => {\n if (!canvasContext) {\n console.warn(\"Canvas context not ready\");\n return;\n }\n\n // Update dimensions in case size changed\n updateCanvasDimensions(canvas, canvasContext, {\n ...config,\n size: currentSize,\n });\n\n // Get current state - prefer passed state, then slider API, then last known state\n let state;\n let isDragging = false;\n\n if (controllerState) {\n // Use state passed from controller and update last known state\n state = {\n value: controllerState.value,\n secondValue: controllerState.secondValue,\n min: controllerState.min,\n max: controllerState.max,\n step: controllerState.step,\n pressed: controllerState.pressed || false,\n activeHandle: controllerState.activeHandle || null,\n };\n isDragging = controllerState.dragging || false;\n lastKnownState = { ...state };\n } else if (component.slider) {\n // Fallback to slider API and update last known state\n state = {\n value: component.slider.getValue(),\n secondValue: component.slider.getSecondValue(),\n min: component.slider.getMin(),\n max: component.slider.getMax(),\n step: component.slider.getStep(),\n };\n lastKnownState = { ...state };\n } else {\n // Use last known state as fallback\n state = { ...lastKnownState };\n }\n\n // Check if we need to animate (skip animation when dragging)\n const valueChanged = state.value !== animationState.targetValue;\n const secondValueChanged =\n state.secondValue !== animationState.targetSecondValue;\n\n if ((valueChanged || secondValueChanged) && !isDragging) {\n // Capture start values before updating targets\n animationState.startValue = animationState.animatedValue;\n animationState.startSecondValue = animationState.animatedSecondValue;\n\n // Update target values\n animationState.targetValue = state.value;\n animationState.targetSecondValue = state.secondValue;\n\n // Cancel any existing animation\n if (animationState.animationFrame) {\n cancelAnimationFrame(animationState.animationFrame);\n }\n\n // Start new animation\n animationState.startTime = performance.now();\n\n // Draw first frame immediately to sync with handle movement\n animate();\n } else if (isDragging) {\n // When dragging, update values immediately without animation\n animationState.animatedValue = state.value;\n animationState.animatedSecondValue = state.secondValue;\n animationState.targetValue = state.value;\n animationState.targetSecondValue = state.secondValue;\n animationState.startValue = state.value;\n animationState.startSecondValue = state.secondValue;\n\n // Cancel any ongoing animation\n if (animationState.animationFrame) {\n cancelAnimationFrame(animationState.animationFrame);\n animationState.animationFrame = null;\n }\n\n // Draw immediately\n draw(\n canvasContext,\n {\n ...config,\n size: currentSize,\n },\n controllerState || state,\n component\n );\n } else {\n // No animation needed, draw current state\n draw(\n canvasContext,\n {\n ...config,\n size: currentSize,\n },\n controllerState || state,\n component\n );\n }\n };\n\n // Resize function\n const resize = (): void => {\n if (!canvasContext) return;\n\n try {\n const newContext = setupCanvas(canvas, {\n ...config,\n size: currentSize,\n });\n component.ctx = newContext.ctx;\n Object.assign(canvasContext, newContext);\n\n // Redraw with current animated values\n drawAnimatedState();\n } catch (error) {\n console.warn(\"Slider canvas resize failed:\", error);\n }\n };\n\n // Setup observers\n resizeCleanup = observeCanvasResize(component.element, canvas, resize);\n\n // Observe theme changes\n const onThemeChange = () => drawAnimatedState();\n\n themeCleanup = createCanvasThemeObserver(\n config.color || \"primary\",\n onThemeChange\n );\n\n // Initial draw\n requestAnimationFrame(() => {\n drawCanvas();\n });\n\n // Extend component with canvas methods\n component.drawCanvas = drawCanvas;\n component.resize = resize;\n\n // Add setSize method\n component.setSize = (size: SliderSize) => {\n currentSize = size;\n if (canvasContext) {\n updateCanvasDimensions(canvas, canvasContext, {\n ...config,\n size: currentSize,\n });\n // Redraw with current animated values\n drawAnimatedState();\n }\n\n // Update handle sizes\n updateHandleSizes(component, currentSize);\n };\n\n // Add getSize method\n component.getSize = () => currentSize;\n\n // Update color method\n const originalSetColor = component.appearance?.setColor;\n if (originalSetColor) {\n component.appearance.setColor = (color: SliderColor) => {\n originalSetColor(color);\n\n // Remove old color class if not primary\n if (config.color && config.color !== \"primary\") {\n component.element.classList.remove(\n `${component.getClass(\"slider\")}--${config.color}`\n );\n }\n\n // Add new color class if not primary\n if (color && color !== \"primary\") {\n component.element.classList.add(\n `${component.getClass(\"slider\")}--${color}`\n );\n }\n\n config.color = color;\n\n // Clean up old theme observer\n if (themeCleanup) {\n themeCleanup();\n themeCleanup = null;\n }\n\n // Set up new theme observer for the new color\n themeCleanup = createCanvasThemeObserver(color, onThemeChange);\n\n // Redraw with new color\n drawCanvas();\n };\n }\n\n // Clean up on destroy\n if (component.lifecycle) {\n const originalDestroy = component.lifecycle.destroy || (() => {});\n component.lifecycle.destroy = () => {\n if (resizeCleanup) resizeCleanup();\n if (themeCleanup) themeCleanup();\n if (animationState.animationFrame) {\n cancelAnimationFrame(animationState.animationFrame);\n }\n originalDestroy();\n };\n }\n\n return component as CanvasSliderComponent;\n };\n",
|
|
207
223
|
"import { createElement } from \"../../../core/dom/create\";\nimport { setStyles } from \"../../../core/dom/utils\";\nimport { SliderConfig } from \"../types\";\nimport { ElementComponent } from \"../../../core/compose/component\";\n\n/**\n * Creates the inner slider DOM structure using optimized createElement\n * This works alongside withElement to create slider-specific inner elements\n *\n * @param config Slider configuration\n * @returns Component enhancement function\n */\nexport const withDom =\n (config: SliderConfig) =>\n <T extends ElementComponent>(\n component: T,\n ): T & {\n container: HTMLElement;\n handle: HTMLElement;\n valueBubble: HTMLElement;\n secondHandle?: HTMLElement;\n secondValueBubble?: HTMLElement;\n getContainer: () => HTMLElement;\n getHandle: () => HTMLElement;\n getValueBubble: () => HTMLElement;\n getSecondHandle?: () => HTMLElement | null;\n getSecondValueBubble?: () => HTMLElement | null;\n } => {\n // Get prefixed class names\n const getClass = (className: string) => component.getClass(className);\n\n // Set default values\n const min = config.min || 0;\n const max = config.max || 100;\n const value = config.value !== undefined ? config.value : min;\n const isDisabled = config.disabled === true;\n const formatter = config.valueFormatter || ((val) => val.toString());\n\n // Calculate initial position\n const valuePercent = ((value - min) / (max - min)) * 100;\n\n // Create the slider container inside the main element\n const container = createElement({\n tag: \"div\",\n className: getClass(\"slider-container\"),\n container: component.element,\n });\n\n // Apply styles using setStyles\n setStyles(container, {\n position: \"relative\", // For canvas absolute positioning\n });\n\n // Build accessible label for handles\n const label = config.label || \"\";\n const handleLabel = config.range && label ? `${label} minimum` : label;\n const secondHandleLabel = label ? `${label} maximum` : \"\";\n\n // Create the main handle (kept as DOM for accessibility)\n const handleAttributes: Record<string, string> = {\n role: \"slider\",\n \"aria-valuemin\": String(min),\n \"aria-valuemax\": String(max),\n \"aria-valuenow\": String(value),\n \"aria-orientation\": \"horizontal\",\n tabindex: isDisabled ? \"-1\" : \"0\",\n \"aria-disabled\": isDisabled ? \"true\" : \"false\",\n \"data-value\": String(value),\n \"data-handle-index\": \"0\",\n };\n\n if (handleLabel) {\n handleAttributes[\"aria-label\"] = handleLabel;\n }\n\n const handle = createElement({\n tag: \"div\",\n className: getClass(\"slider-handle\"),\n attributes: handleAttributes,\n container: container,\n });\n\n // Apply handle positioning\n setStyles(handle, {\n left: `${valuePercent}%`,\n });\n\n // Create the value bubble (kept as DOM for text rendering)\n const valueBubble = createElement({\n tag: \"div\",\n className: getClass(\"slider-value\"),\n attributes: {\n \"aria-hidden\": \"true\",\n \"data-handle-index\": \"0\",\n },\n text: formatter(value),\n container: container,\n });\n\n // Apply value bubble positioning\n setStyles(valueBubble, {\n left: `${valuePercent}%`,\n });\n\n // Create second handle and value bubble for range sliders\n let secondHandle: HTMLElement | undefined;\n let secondValueBubble: HTMLElement | undefined;\n\n if (config.range) {\n const secondValue =\n config.secondValue !== undefined ? config.secondValue : max;\n const secondValuePercent = ((secondValue - min) / (max - min)) * 100;\n\n // Create the second handle\n const secondHandleAttributes: Record<string, string> = {\n role: \"slider\",\n \"aria-valuemin\": String(min),\n \"aria-valuemax\": String(max),\n \"aria-valuenow\": String(secondValue),\n \"aria-orientation\": \"horizontal\",\n tabindex: isDisabled ? \"-1\" : \"0\",\n \"aria-disabled\": isDisabled ? \"true\" : \"false\",\n \"data-value\": String(secondValue),\n \"data-handle-index\": \"1\",\n };\n\n if (secondHandleLabel) {\n secondHandleAttributes[\"aria-label\"] = secondHandleLabel;\n }\n\n secondHandle = createElement({\n tag: \"div\",\n className: getClass(\"slider-handle\"),\n attributes: secondHandleAttributes,\n container: container,\n });\n\n // Apply second handle positioning\n setStyles(secondHandle, {\n left: `${secondValuePercent}%`,\n });\n\n // Create the second value bubble\n secondValueBubble = createElement({\n tag: \"div\",\n className: getClass(\"slider-value\"),\n attributes: {\n \"aria-hidden\": \"true\",\n \"data-handle-index\": \"1\",\n },\n text: formatter(secondValue),\n container: container,\n });\n\n // Apply second value bubble positioning\n setStyles(secondValueBubble, {\n left: `${secondValuePercent}%`,\n });\n }\n\n // Return enhanced component with inner elements\n return {\n ...component,\n container,\n handle,\n valueBubble,\n secondHandle,\n secondValueBubble,\n\n // Add DOM query methods for compatibility\n getContainer: () => container,\n getHandle: () => handle,\n getValueBubble: () => valueBubble,\n getSecondHandle: () => secondHandle || null,\n getSecondValueBubble: () => secondValueBubble || null,\n };\n };\n",
|
|
208
224
|
"// src/core/dom/utils.ts\n\n// Import optimized normalizeClasses from classes module\nexport { normalizeClasses } from \"./classes\";\n\n/**\n * Creates a DOM element with attributes\n *\n * @param tag - Element tag name\n * @param attributes - Element attributes\n * @returns Created element\n */\nexport const createElement = <T extends HTMLElement>(\n tag: string,\n attributes: Record<string, any> = {}\n): T => {\n const element = document.createElement(tag) as T;\n\n Object.entries(attributes).forEach(([key, value]) => {\n if (key === \"className\") {\n element.className = value;\n } else if (key === \"style\" && typeof value === \"object\") {\n Object.assign(element.style, value);\n } else if (key === \"data\" && typeof value === \"object\") {\n Object.entries(value).forEach(([dataKey, dataValue]) => {\n element.dataset[dataKey] = String(dataValue);\n });\n } else if (key === \"children\" && Array.isArray(value)) {\n value.forEach((child) => {\n if (child instanceof Node) {\n element.appendChild(child);\n } else if (child != null) {\n element.appendChild(document.createTextNode(String(child)));\n }\n });\n } else if (key.startsWith(\"on\") && typeof value === \"function\") {\n const eventName = key.slice(2).toLowerCase();\n element.addEventListener(eventName, value);\n } else if (value !== null && value !== undefined) {\n element.setAttribute(key, String(value));\n }\n });\n\n return element;\n};\n\n/**\n * Sets inline styles on an element\n *\n * @param element - Target element\n * @param styles - Styles to set\n * @returns Modified element\n */\nexport const setStyles = <T extends HTMLElement>(\n element: T,\n styles: Partial<CSSStyleDeclaration>\n): T => {\n Object.assign(element.style, styles);\n return element;\n};\n\n/**\n * Checks if an element matches a selector\n *\n * @param element - Element to check\n * @param selector - CSS selector\n * @returns Whether element matches selector\n */\nexport const matches = (element: Element, selector: string): boolean => {\n return element.matches(selector);\n};\n\n/**\n * Finds the closest ancestor matching a selector\n *\n * @param element - Starting element\n * @param selector - CSS selector\n * @returns Matching ancestor or null\n */\nexport const closest = <T extends HTMLElement>(\n element: Element,\n selector: string\n): T | null => {\n return element.closest(selector) as T | null;\n};\n",
|
|
209
225
|
"// src/components/slider/api.ts\nimport { SliderComponent, SliderEvent } from \"./types\";\nimport { SLIDER_COLORS, SLIDER_EVENTS } from \"./types\";\nimport { SliderSize } from \"./constants\";\n\n/**\n * API options interface - structured by feature area\n */\ninterface ApiOptions {\n slider: {\n setValue: (value: number, triggerEvent?: boolean) => any;\n getValue: () => number;\n setSecondValue: (value: number, triggerEvent?: boolean) => any;\n getSecondValue: () => number | null;\n setMin: (min: number) => any;\n getMin: () => number;\n setMax: (max: number) => any;\n getMax: () => number;\n setStep: (step: number) => any;\n getStep: () => number;\n regenerateTicks: () => any;\n };\n disabled: {\n enable: () => void;\n disable: () => void;\n isDisabled: () => boolean;\n };\n appearance: {\n setColor: (color: string) => void;\n getColor: () => string;\n setSize: (size: SliderSize) => void;\n getSize: () => string;\n showTicks: (show: boolean) => void;\n showCurrentValue: (show: boolean) => void;\n };\n text: {\n setText: (text: string) => void;\n getText: () => string;\n };\n icon: {\n setIcon: (html: string) => void;\n getIcon: () => string;\n };\n events: {\n on: (event: string, handler: Function) => void;\n off: (event: string, handler: Function) => void;\n };\n lifecycle: {\n destroy: () => void;\n };\n}\n\n/**\n * Enhances a slider component with a streamlined API\n * @param {ApiOptions} options - API configuration options\n * @returns {Function} Higher-order function that adds API methods to component\n * @internal This is an internal utility for the Slider component\n */\nexport const withAPI =\n (options: ApiOptions) =>\n (component: { element: HTMLElement }): SliderComponent => {\n return {\n ...(component as any),\n\n // Element access\n element: component.element,\n\n // Value management\n setValue(value: number, triggerEvent: boolean = true) {\n options.slider.setValue(value, triggerEvent);\n return this;\n },\n\n getValue() {\n return options.slider.getValue();\n },\n\n setSecondValue(value: number, triggerEvent: boolean = true) {\n options.slider.setSecondValue(value, triggerEvent);\n return this;\n },\n\n getSecondValue() {\n return options.slider.getSecondValue();\n },\n\n // Range management\n setMin(min: number) {\n options.slider.setMin(min);\n return this;\n },\n\n getMin() {\n return options.slider.getMin();\n },\n\n setMax(max: number) {\n options.slider.setMax(max);\n return this;\n },\n\n getMax() {\n return options.slider.getMax();\n },\n\n setStep(step: number) {\n options.slider.setStep(step);\n return this;\n },\n\n getStep() {\n return options.slider.getStep();\n },\n\n // State management\n enable() {\n options.disabled.enable();\n return this;\n },\n\n disable() {\n options.disabled.disable();\n return this;\n },\n\n isDisabled() {\n return options.disabled.isDisabled();\n },\n\n // Appearance management\n setColor(\n color:\n | keyof typeof SLIDER_COLORS\n | (typeof SLIDER_COLORS)[keyof typeof SLIDER_COLORS]\n ) {\n options.appearance.setColor(color);\n return this;\n },\n\n getColor() {\n return options.appearance.getColor();\n },\n\n setSize(size: SliderSize) {\n options.appearance.setSize(size);\n return this;\n },\n\n getSize() {\n return options.appearance.getSize();\n },\n\n showTicks(show: boolean) {\n options.appearance.showTicks(show);\n return this;\n },\n\n showCurrentValue(show: boolean) {\n options.appearance.showCurrentValue(show);\n return this;\n },\n\n // Label and icon management\n setLabel(text: string) {\n if (options.text?.setText) options.text.setText(text);\n return this;\n },\n\n getLabel() {\n return options.text?.getText ? options.text.getText() : \"\";\n },\n\n setIcon(iconHtml: string) {\n if (options.icon?.setIcon) options.icon.setIcon(iconHtml);\n return this;\n },\n\n getIcon() {\n return options.icon?.getIcon ? options.icon.getIcon() : \"\";\n },\n\n // Event management\n on(\n event:\n | keyof typeof SLIDER_EVENTS\n | (typeof SLIDER_EVENTS)[keyof typeof SLIDER_EVENTS],\n handler: (event: SliderEvent) => void\n ) {\n if (options.events?.on) options.events.on(event, handler);\n return this;\n },\n\n off(\n event:\n | keyof typeof SLIDER_EVENTS\n | (typeof SLIDER_EVENTS)[keyof typeof SLIDER_EVENTS],\n handler: (event: SliderEvent) => void\n ) {\n if (options.events?.off) options.events.off(event, handler);\n return this;\n },\n\n // Lifecycle management\n destroy() {\n if (options.lifecycle?.destroy) options.lifecycle.destroy();\n },\n };\n };\n",
|
|
210
226
|
"// src/components/slider/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n} from \"../../core/config/component\";\nimport { SliderConfig } from \"./types\";\nimport { SLIDER_DEFAULTS } from \"./constants\";\n\n/**\n * Default configuration for the Slider component\n */\nexport const defaultConfig: SliderConfig = {\n min: SLIDER_DEFAULTS.MIN,\n max: SLIDER_DEFAULTS.MAX,\n value: SLIDER_DEFAULTS.VALUE,\n step: SLIDER_DEFAULTS.STEP,\n disabled: SLIDER_DEFAULTS.DISABLED,\n color: SLIDER_DEFAULTS.COLOR,\n size: SLIDER_DEFAULTS.SIZE,\n ticks: SLIDER_DEFAULTS.TICKS,\n showValue: SLIDER_DEFAULTS.SHOW_VALUE,\n snapToSteps: SLIDER_DEFAULTS.SNAP_TO_STEPS,\n range: SLIDER_DEFAULTS.RANGE,\n centered: SLIDER_DEFAULTS.CENTERED,\n iconPosition: SLIDER_DEFAULTS.ICON_POSITION,\n labelPosition: SLIDER_DEFAULTS.LABEL_POSITION,\n valueFormatter: (value) => value.toString(),\n};\n\n/**\n * Creates the base configuration for Slider component\n * @param {SliderConfig} config - User provided configuration\n * @returns {SliderConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (config: SliderConfig = {}): SliderConfig => {\n // Create the base config with defaults applied\n const baseConfig = createComponentConfig(\n defaultConfig,\n config,\n \"slider\",\n ) as SliderConfig;\n\n // Schema is no longer needed as we use direct DOM creation\n\n return baseConfig;\n};\n\n/**\n * Generates element configuration for the Slider component\n * @param {SliderConfig} config - Slider configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: SliderConfig) => {\n const classes = [\n \"slider\",\n config.class,\n config.disabled ? \"slider--disabled\" : \"\",\n config.size && config.size !== \"XS\"\n ? `slider--${\n typeof config.size === \"string\"\n ? config.size.toLowerCase()\n : config.size\n }`\n : \"\",\n config.color && config.color !== \"primary\" ? `slider--${config.color}` : \"\",\n config.range ? \"slider--range\" : \"\",\n config.centered ? \"slider--centered\" : \"\",\n config.icon ? \"slider--icon\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n // Root element is a presentational wrapper — ARIA slider attributes\n // belong on the handle elements (set in dom.ts), not here.\n const attributes: Record<string, string> = {\n tabindex: \"-1\",\n };\n\n if (config.disabled) {\n attributes[\"aria-disabled\"] = \"true\";\n }\n\n return createElementConfig(config, {\n tag: \"div\",\n attributes,\n className: classes,\n forwardEvents: {\n click: true,\n keydown: true,\n touchstart: true,\n touchmove: true,\n touchend: true,\n mousedown: true,\n mousemove: true,\n mouseup: true,\n },\n interactive: true,\n });\n};\n\n/**\n * Creates API configuration for the Slider component\n * @param {Object} comp - Component with slider features\n * @returns {Object} API configuration object\n */\nexport const getApiConfig = (comp) => ({\n slider: {\n setValue: (v, t) => comp.slider?.setValue(v, t),\n getValue: () => comp.slider?.getValue() ?? 0,\n setSecondValue: (v, t) => comp.slider?.setSecondValue(v, t),\n getSecondValue: () => comp.slider?.getSecondValue() ?? null,\n setMin: (m) => comp.slider?.setMin(m),\n getMin: () => comp.slider?.getMin() ?? 0,\n setMax: (m) => comp.slider?.setMax(m),\n getMax: () => comp.slider?.getMax() ?? 100,\n setStep: (s) => comp.slider?.setStep(s),\n getStep: () => comp.slider?.getStep() ?? 1,\n regenerateTicks: () => comp.slider?.regenerateTicks?.(),\n },\n disabled: {\n enable: () => comp.disabled?.enable?.(),\n disable: () => comp.disabled?.disable?.(),\n isDisabled: () => comp.disabled?.isDisabled?.() ?? false,\n },\n appearance: {\n setColor: (c) => comp.appearance?.setColor?.(c),\n getColor: () => comp.appearance?.getColor?.() ?? \"primary\",\n setSize: (s) => comp.setSize?.(s),\n getSize: () => comp.getSize?.() ?? \"XS\",\n showTicks: (s) => comp.appearance?.showTicks?.(s),\n showCurrentValue: (s) => comp.appearance?.showCurrentValue?.(s),\n },\n text: {\n setText: (t) => comp.label?.setText?.(t),\n getText: () => comp.label?.getText?.() ?? \"\",\n },\n icon: {\n setIcon: (h) => comp.icon?.setIcon?.(h),\n getIcon: () => comp.icon?.getIcon?.() ?? \"\",\n },\n events: {\n on: (e, h) => comp.on?.(e, h),\n off: (e, h) => comp.off?.(e, h),\n },\n lifecycle: {\n destroy: () => comp.lifecycle?.destroy?.(),\n },\n});\n",
|
|
211
|
-
"// src/components/snackbar/snackbar.ts\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport { withActionButton, withDismissTimer } from './features';\nimport { withPosition } from './position';\nimport {\n withEvents,\n withText,\n withVariant,\n withLifecycle\n} from '../../core/compose/features';\nimport { withAPI } from './api';\nimport { createSnackbarQueue } from './queue';\nimport { SnackbarConfig, SnackbarComponent, SnackbarQueue } from './types';\nimport {\n createBaseConfig,\n getElementConfig,\n getTextConfig,\n getApiConfig\n} from './config';\n\n// Create a single queue instance to be shared across all snackbars\nconst queue: SnackbarQueue = createSnackbarQueue();\n\n/**\n * Creates a new Snackbar component\n * @param {SnackbarConfig} config - Snackbar configuration\n * @returns {SnackbarComponent} Snackbar component instance\n */\nconst createSnackbar = (config: SnackbarConfig): SnackbarComponent => {\n if (!config.message) {\n throw new Error('Snackbar message is required');\n }\n\n const baseConfig = createBaseConfig(config);\n\n try {\n const snackbar = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withPosition(baseConfig),\n withText(getTextConfig(baseConfig)),\n withActionButton(baseConfig),\n withLifecycle(),\n // First apply timer\n withDismissTimer(baseConfig),\n // Then apply API which needs timer\n comp => withAPI(getApiConfig(comp, queue))(comp)\n )(baseConfig);\n\n return snackbar as SnackbarComponent;\n } catch (error) {\n console.error('Snackbar creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create snackbar: ${error instanceof Error ? error.message : String(error)}`);\n }\n};\n\nexport default createSnackbar;",
|
|
212
|
-
"// src/components/snackbar/features.ts\nimport { BaseComponent, SnackbarConfig, SnackbarTimer } from './types';\n\n/**\n * Adds action button to snackbar\n * @param {SnackbarConfig} config - Component configuration\n * @returns {Function} Higher-order function that adds action button\n */\nexport const withActionButton = (config: SnackbarConfig) => \n (component: BaseComponent): BaseComponent => {\n if (!config.action) return component;\n\n const button = document.createElement('button');\n button.className = `${config.prefix}-snackbar-action`;\n button.textContent = config.action;\n\n component.element.appendChild(button);\n\n return {\n ...component,\n actionButton: button\n };\n };\n\n/**\n * Adds auto-dismiss timer functionality\n * @param {SnackbarConfig} config - Component configuration\n * @returns {Function} Higher-order function that adds timer features\n */\nexport const withDismissTimer = (config: SnackbarConfig)
|
|
213
|
-
"// src/components/snackbar/constants.ts\n\n/**\n * Snackbar visual variants\n * @category Components\n */\nexport const SNACKBAR_VARIANTS = {\n /** Basic snackbar with just text */\n BASIC: 'basic',\n /** Snackbar with an action button */\n ACTION: 'action'\n} as const;\n\n/**\n * Snackbar display positions\n * @category Components\n */\nexport const SNACKBAR_POSITIONS = {\n /** Centered position (default) */\n CENTER: 'center',\n /** Start-aligned position */\n START: 'start',\n /** End-aligned position */\n END: 'end'\n} as const;\n\n/**\n * Snackbar visibility states\n * @category Components\n */\nexport const SNACKBAR_STATES = {\n /** Snackbar is visible */\n VISIBLE: 'visible',\n /** Snackbar is hidden */\n HIDDEN: 'hidden'\n} as const;\n\n/**\n * Snackbar event types\n * @category Components\n */\nexport const SNACKBAR_EVENTS = {\n /** Fired when snackbar opens */\n OPEN: 'open',\n /** Fired when snackbar closes */\n CLOSE: 'close',\n /** Fired when action button is clicked */\n ACTION: 'action',\n /** Fired when auto-dismiss timer completes */\n DISMISS: 'dismiss'\n} as const;\n\n/**\n * Default configuration values for snackbar\n * @category Components\n */\nexport const SNACKBAR_DEFAULTS = {\n /** Default visual variant */\n VARIANT: SNACKBAR_VARIANTS.BASIC,\n /** Default display position */\n POSITION: SNACKBAR_POSITIONS.CENTER,\n /** Default display duration in milliseconds (4 seconds) */\n DURATION: 4000,\n /** Default z-index for snackbars */\n Z_INDEX: 1000,\n /** Default animation duration in milliseconds */\n ANIMATION_DURATION: 300\n} as const;\n\n/**\n * CSS class names used by the snackbar component\n * @category Components\n */\nexport const SNACKBAR_CLASSES = {\n /** Root element class */\n ROOT: 'snackbar',\n /** Basic variant class */\n BASIC: 'snackbar--basic',\n /** Action variant class */\n ACTION: 'snackbar--action',\n /** Center position class */\n CENTER: 'snackbar--center',\n /** Start position class */\n START: 'snackbar--start',\n /** End position class */\n END: 'snackbar--end',\n /** Visible state class */\n VISIBLE: 'snackbar--visible',\n /** Hidden state class */\n HIDDEN: 'snackbar--hidden',\n /** Message text class */\n MESSAGE: 'snackbar__message',\n /** Action button class */\n ACTION_BUTTON: 'snackbar__action'\n} as const;",
|
|
227
|
+
"// src/components/snackbar/snackbar.ts\nimport { pipe } from '../../core/compose';\nimport { createBase, withElement } from '../../core/compose/component';\nimport { withActionButton, withDismissTimer } from './features';\nimport { withPosition } from './position';\nimport {\n withEvents,\n withText,\n withVariant,\n withLifecycle\n} from '../../core/compose/features';\nimport { withAPI } from './api';\nimport { createSnackbarQueue } from './queue';\nimport { SnackbarConfig, SnackbarComponent, SnackbarQueue } from './types';\nimport {\n createBaseConfig,\n getElementConfig,\n getTextConfig,\n getApiConfig\n} from './config';\n\n// Create a single queue instance to be shared across all snackbars\nconst queue: SnackbarQueue = createSnackbarQueue();\n\n/**\n * Creates a new Snackbar component\n * @param {SnackbarConfig} config - Snackbar configuration\n * @returns {SnackbarComponent} Snackbar component instance\n */\nconst createSnackbar = (config: SnackbarConfig): SnackbarComponent => {\n if (!config.message) {\n throw new Error('Snackbar message is required');\n }\n\n const baseConfig = createBaseConfig(config);\n\n try {\n const snackbar = pipe(\n createBase,\n withEvents(),\n withElement(getElementConfig(baseConfig)),\n withVariant(baseConfig),\n withPosition(baseConfig),\n withText(getTextConfig(baseConfig)),\n withActionButton(baseConfig),\n withLifecycle(),\n // First apply timer\n withDismissTimer(baseConfig),\n // Then apply API which needs timer\n comp => withAPI(getApiConfig(comp, queue, baseConfig))(comp)\n )(baseConfig);\n\n return snackbar as SnackbarComponent;\n } catch (error) {\n console.error('Snackbar creation error:', error instanceof Error ? error.message : String(error));\n throw new Error(`Failed to create snackbar: ${error instanceof Error ? error.message : String(error)}`);\n }\n};\n\nexport default createSnackbar;",
|
|
228
|
+
"// src/components/snackbar/features.ts\nimport { BaseComponent, SnackbarConfig, SnackbarTimer } from './types';\n\n/**\n * Adds action button to snackbar\n * @param {SnackbarConfig} config - Component configuration\n * @returns {Function} Higher-order function that adds action button\n */\nexport const withActionButton = (config: SnackbarConfig) => \n (component: BaseComponent): BaseComponent => {\n if (!config.action) return component;\n\n const button = document.createElement('button');\n button.className = `${config.prefix}-snackbar-action`;\n button.textContent = config.action;\n\n component.element.appendChild(button);\n\n return {\n ...component,\n actionButton: button\n };\n };\n\n/**\n * Adds auto-dismiss timer functionality\n * @param {SnackbarConfig} config - Component configuration\n * @returns {Function} Higher-order function that adds timer features\n */\nexport const withDismissTimer = (config: SnackbarConfig) =>\n (component: BaseComponent): BaseComponent => {\n let timeoutId: number | null = null;\n let duration = typeof config.duration === 'number' ? config.duration : 0;\n\n const startTimer = (): void => {\n // Clear any existing timer\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n // Only start timer if duration is positive and numeric\n if (duration > 0) {\n timeoutId = window.setTimeout(() => {\n if (component.element && component.emit) {\n component.emit('dismiss');\n }\n }, duration);\n }\n };\n\n const stopTimer = (): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const setDuration = (value: number): void => {\n duration = typeof value === 'number' && value > 0 ? value : 0;\n };\n\n const getDuration = (): number => duration;\n\n // Clean up on destroy\n const originalDestroy = component.lifecycle?.destroy;\n if (component.lifecycle) {\n component.lifecycle.destroy = () => {\n stopTimer();\n if (originalDestroy) {\n originalDestroy.call(component.lifecycle);\n }\n };\n }\n\n return {\n ...component,\n timer: {\n start: startTimer,\n stop: stopTimer,\n setDuration,\n getDuration\n } as SnackbarTimer\n };\n };",
|
|
229
|
+
"// src/components/snackbar/constants.ts\n\n/**\n * Snackbar visual variants\n * @category Components\n */\nexport const SNACKBAR_VARIANTS = {\n /** Basic snackbar with just text */\n BASIC: 'basic',\n /** Snackbar with an action button */\n ACTION: 'action'\n} as const;\n\n/**\n * Snackbar display positions\n * @category Components\n */\nexport const SNACKBAR_POSITIONS = {\n /** Centered position (default) */\n CENTER: 'center',\n /** Start-aligned position */\n START: 'start',\n /** End-aligned position */\n END: 'end'\n} as const;\n\n/**\n * Snackbar visibility states\n * @category Components\n */\nexport const SNACKBAR_STATES = {\n /** Snackbar is visible */\n VISIBLE: 'visible',\n /** Snackbar is hidden */\n HIDDEN: 'hidden'\n} as const;\n\n/**\n * Snackbar queue behaviors\n *\n * Controls how a newly shown snackbar interacts with the one currently on\n * screen and any still waiting in the queue.\n * @category Components\n */\nexport const SNACKBAR_QUEUE_BEHAVIORS = {\n /** Wait in line — shown one at a time, in order (default) */\n QUEUE: 'queue',\n /** Replace — immediately dismiss the current snackbar, drop any pending\n * ones, and show this snackbar right away (last-wins) */\n REPLACE: 'replace'\n} as const;\n\n/**\n * Snackbar event types\n * @category Components\n */\nexport const SNACKBAR_EVENTS = {\n /** Fired when snackbar opens */\n OPEN: 'open',\n /** Fired when snackbar closes */\n CLOSE: 'close',\n /** Fired when action button is clicked */\n ACTION: 'action',\n /** Fired when auto-dismiss timer completes */\n DISMISS: 'dismiss'\n} as const;\n\n/**\n * Default configuration values for snackbar\n * @category Components\n */\nexport const SNACKBAR_DEFAULTS = {\n /** Default visual variant */\n VARIANT: SNACKBAR_VARIANTS.BASIC,\n /** Default display position */\n POSITION: SNACKBAR_POSITIONS.CENTER,\n /** Default display duration in milliseconds (4 seconds) */\n DURATION: 4000,\n /** Default queue behavior */\n QUEUE_BEHAVIOR: SNACKBAR_QUEUE_BEHAVIORS.QUEUE,\n /** Delay in milliseconds between a dismissed snackbar and the next one */\n QUEUE_GAP: 200,\n /** Default z-index for snackbars */\n Z_INDEX: 1000,\n /** Default animation duration in milliseconds */\n ANIMATION_DURATION: 300\n} as const;\n\n/**\n * CSS class names used by the snackbar component\n * @category Components\n */\nexport const SNACKBAR_CLASSES = {\n /** Root element class */\n ROOT: 'snackbar',\n /** Basic variant class */\n BASIC: 'snackbar--basic',\n /** Action variant class */\n ACTION: 'snackbar--action',\n /** Center position class */\n CENTER: 'snackbar--center',\n /** Start position class */\n START: 'snackbar--start',\n /** End position class */\n END: 'snackbar--end',\n /** Visible state class */\n VISIBLE: 'snackbar--visible',\n /** Hidden state class */\n HIDDEN: 'snackbar--hidden',\n /** Message text class */\n MESSAGE: 'snackbar__message',\n /** Action button class */\n ACTION_BUTTON: 'snackbar__action'\n} as const;",
|
|
214
230
|
"// src/components/snackbar/position.ts\nimport { BaseComponent, SnackbarPosition } from './types';\nimport { SNACKBAR_POSITIONS } from './constants';\n\n/**\n * Position configuration for the withPosition function\n */\ninterface PositionConfig {\n prefix?: string;\n position?: SnackbarPosition;\n}\n\n/**\n * Adds position handling to snackbar\n * @param {PositionConfig} config - Position configuration\n * @returns {Function} Higher-order function that adds position features\n */\nexport const withPosition = (config: PositionConfig) => \n (component: BaseComponent): BaseComponent => {\n const position = config.position || SNACKBAR_POSITIONS.CENTER;\n const prefix = config.prefix || 'mtrl';\n const positionClass = `${prefix}-snackbar--${position}`;\n\n // Add position class\n component.element.classList.add(positionClass);\n\n // Method to update position\n const setPosition = (newPosition: SnackbarPosition): void => {\n // Remove current position class\n component.element.classList.remove(positionClass);\n\n // Add new position class\n const newPositionClass = `${prefix}-snackbar--${newPosition}`;\n component.element.classList.add(newPositionClass);\n\n // Update visible state transform for center position\n if (component.element.classList.contains(`${prefix}-snackbar--visible`)) {\n if (newPosition === SNACKBAR_POSITIONS.CENTER) {\n component.element.style.transform = 'translateX(-50%) scale(1)';\n } else {\n component.element.style.transform = 'scale(1)';\n }\n }\n };\n\n return {\n ...component,\n position: {\n /**\n * Get current position\n * @returns {string} Current position\n */\n getPosition: (): SnackbarPosition => position as SnackbarPosition,\n\n /**\n * Set new position\n * @param {string} newPosition - New position to set\n * @returns {BaseComponent} Component instance\n */\n setPosition: (newPosition: SnackbarPosition): BaseComponent => {\n if (Object.values(SNACKBAR_POSITIONS).includes(newPosition)) {\n setPosition(newPosition);\n return component;\n } else {\n console.warn(`Invalid position: ${newPosition}. Using default: ${SNACKBAR_POSITIONS.CENTER}`);\n setPosition(SNACKBAR_POSITIONS.CENTER);\n return component;\n }\n }\n }\n };\n };",
|
|
215
|
-
"// src/components/snackbar/api.ts\nimport {\n BaseComponent,\n SnackbarComponent,\n ApiOptions,\n QueuedSnackbar,\n SnackbarPosition,\n SnackbarState,\n} from \"./types\";\n\n/**\n * Enhances snackbar component with API methods\n * @param {ApiOptions} options - API configuration\n * @returns {Function} Higher-order function that adds API methods to component\n */\nexport const withAPI =\n ({ lifecycle, queue }: ApiOptions) =>\n (component: BaseComponent): SnackbarComponent => {\n if (!queue) {\n throw new Error(\"Snackbar queue is required\");\n }\n\n let isVisible = false;\n\n const enhancedComponent: SnackbarComponent = {\n element: component.element,\n actionButton: component.actionButton,\n timer: component.timer,\n position: component.position,\n state: isVisible\n ? (\"visible\" as SnackbarState)\n : (\"hidden\" as SnackbarState),\n\n /**\n * Shows the snackbar with animation\n * @returns {SnackbarComponent} Component instance for chaining\n */\n show(): SnackbarComponent {\n if (isVisible) return this;\n isVisible = true;\n this.state = \"visible\";\n\n queue.add({\n
|
|
216
|
-
"// src/components/snackbar/queue.ts\nimport {
|
|
217
|
-
"// src/components/snackbar/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n BaseComponentConfig,\n} from \"../../core/config/component\";\nimport { SnackbarConfig, BaseComponent, ApiOptions } from \"./types\";\nimport { SNACKBAR_DEFAULTS } from \"./constants\";\n\n/**\n * Default configuration for the Snackbar component\n */\nexport const defaultConfig: Partial<SnackbarConfig> = {\n variant: SNACKBAR_DEFAULTS.VARIANT,\n position: SNACKBAR_DEFAULTS.POSITION,\n duration: SNACKBAR_DEFAULTS.DURATION,\n};\n\n/**\n * Creates the base configuration for Snackbar component\n * @param {SnackbarConfig} config - User provided configuration\n * @returns {SnackbarConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (config: SnackbarConfig): SnackbarConfig =>\n createComponentConfig(\n defaultConfig as BaseComponentConfig,\n config,\n \"snackbar\"\n ) as SnackbarConfig;\n\n/**\n * Generates element configuration for the Snackbar component\n * @param {SnackbarConfig} config - Snackbar configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: SnackbarConfig) =>\n createElementConfig(config, {\n tag: \"div\",\n className: config.class,\n });\n\n/**\n * Creates text configuration for the Snackbar component\n * @param {SnackbarConfig} config - Snackbar configuration\n * @returns {Object} Text configuration object\n */\nexport const getTextConfig = (config: SnackbarConfig) => ({\n ...config,\n text: config.message,\n});\n\n/**\n * Creates API configuration for the Snackbar component\n * @param {BaseComponent} comp - Component with lifecycle feature\n * @param {SnackbarQueue} queue - Snackbar queue manager\n * @returns {ApiOptions} API configuration object\n */\nexport const getApiConfig = (comp: BaseComponent
|
|
231
|
+
"// src/components/snackbar/api.ts\nimport {\n BaseComponent,\n SnackbarComponent,\n ApiOptions,\n QueuedSnackbar,\n SnackbarPosition,\n SnackbarState,\n} from \"./types\";\n\n/**\n * Enhances snackbar component with API methods\n * @param {ApiOptions} options - API configuration\n * @returns {Function} Higher-order function that adds API methods to component\n */\nexport const withAPI =\n ({ lifecycle, queue, queueBehavior }: ApiOptions) =>\n (component: BaseComponent): SnackbarComponent => {\n if (!queue) {\n throw new Error(\"Snackbar queue is required\");\n }\n\n let isVisible = false;\n\n const enhancedComponent: SnackbarComponent = {\n element: component.element,\n actionButton: component.actionButton,\n timer: component.timer,\n position: component.position,\n state: isVisible\n ? (\"visible\" as SnackbarState)\n : (\"hidden\" as SnackbarState),\n\n /**\n * Shows the snackbar with animation\n * @returns {SnackbarComponent} Component instance for chaining\n */\n show(): SnackbarComponent {\n if (isVisible) return this;\n isVisible = true;\n this.state = \"visible\";\n\n queue.add(\n {\n ...this,\n _show: (): SnackbarComponent => {\n document.body.appendChild(component.element);\n\n // Force reflow for animation\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = component.element.offsetHeight;\n\n component.element.classList.add(\n `${component.getClass?.(\"snackbar\")}--visible`\n );\n\n if (component.timer) {\n component.timer.start();\n }\n\n return this;\n },\n // Lets the queue evict this snackbar (e.g. on 'replace') without\n // routing through the dismiss event.\n _hide: (): SnackbarComponent => this.hide(),\n } as QueuedSnackbar,\n { behavior: queueBehavior }\n );\n\n return this;\n },\n\n /**\n * Hides the snackbar with animation and cleanup\n * @returns {SnackbarComponent} Component instance for chaining\n */\n hide(): SnackbarComponent {\n if (!isVisible) return this;\n isVisible = false;\n this.state = \"hidden\";\n\n if (component.timer) {\n component.timer.stop();\n }\n\n const handleTransitionEnd = (event: TransitionEvent): void => {\n if (event.propertyName !== \"opacity\") return;\n\n component.element.removeEventListener(\n \"transitionend\",\n handleTransitionEnd\n );\n if (component.element.parentNode) {\n component.element.remove();\n }\n };\n\n component.element.addEventListener(\n \"transitionend\",\n handleTransitionEnd\n );\n component.element.classList.remove(\n `${component.getClass?.(\"snackbar\")}--visible`\n );\n\n return this;\n },\n\n /**\n * Sets the snackbar message\n * @param {string} text - New message text\n * @returns {SnackbarComponent} Component instance for chaining\n */\n setMessage(text: string): SnackbarComponent {\n component.text?.setText(text);\n return this;\n },\n\n /**\n * Gets the snackbar message\n * @returns {string} Current message text\n */\n getMessage(): string {\n return component.text?.getText() || \"\";\n },\n\n /**\n * Sets the action button text\n * @param {string} text - New action text\n * @returns {SnackbarComponent} Component instance for chaining\n */\n setAction(text: string): SnackbarComponent {\n if (component.actionButton) {\n component.actionButton.textContent = text;\n }\n return this;\n },\n\n /**\n * Gets the action button text\n * @returns {string} Current action text\n */\n getAction(): string {\n return component.actionButton\n ? component.actionButton.textContent || \"\"\n : \"\";\n },\n\n /**\n * Sets the display duration\n * @param {number} duration - New duration in milliseconds (0 for indefinite)\n * @returns {SnackbarComponent} Component instance for chaining\n */\n setDuration(duration: number): SnackbarComponent {\n component.timer?.setDuration?.(duration);\n // Restart the countdown with the new duration if already on screen.\n if (isVisible && component.timer) {\n component.timer.start();\n }\n return this;\n },\n\n /**\n * Gets the display duration\n * @returns {number} Current duration in milliseconds\n */\n getDuration(): number {\n return component.timer?.getDuration?.() ?? 0;\n },\n\n /**\n * Sets the snackbar position\n * @param {SnackbarPosition} position - New position\n * @returns {SnackbarComponent} Component instance for chaining\n */\n setPosition(position: SnackbarPosition): SnackbarComponent {\n if (component.position?.setPosition) {\n component.position.setPosition(position);\n }\n return this;\n },\n\n /**\n * Gets the snackbar position\n * @returns {SnackbarPosition} Current position\n */\n getPosition(): SnackbarPosition {\n return component.position?.getPosition?.() || \"center\";\n },\n\n /**\n * Adds event listener\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n * @returns {SnackbarComponent} Component instance for chaining\n */\n on(event: string, handler: Function): SnackbarComponent {\n component.on?.(event, handler);\n return this;\n },\n\n /**\n * Removes event listener\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n * @returns {SnackbarComponent} Component instance for chaining\n */\n off(event: string, handler: Function): SnackbarComponent {\n component.off?.(event, handler);\n return this;\n },\n\n /**\n * Destroys the snackbar component and cleans up resources\n */\n destroy(): void {\n if (isVisible && component.element.parentNode) {\n component.element.remove();\n }\n if (component.timer) {\n component.timer.stop();\n }\n lifecycle.destroy();\n },\n };\n\n // Set up action button handler\n if (component.actionButton) {\n component.actionButton.addEventListener(\"click\", () => {\n component.emit?.(\"action\");\n component.emit?.(\"dismiss\"); // Emit dismiss to handle queue cleanup\n });\n }\n\n // Set up dismiss handler\n if (component.on) {\n // Store the handler reference so it can be properly removed\n const dismissHandler = (): void => {\n if (isVisible) {\n enhancedComponent.hide();\n }\n };\n\n component.on(\"dismiss\", dismissHandler);\n\n // Add cleanup to lifecycle\n const originalDestroy = lifecycle.destroy;\n lifecycle.destroy = () => {\n component.off?.(\"dismiss\", dismissHandler);\n originalDestroy?.call(lifecycle);\n };\n }\n\n return enhancedComponent;\n };\n",
|
|
232
|
+
"// src/components/snackbar/queue.ts\nimport {\n QueuedSnackbar,\n SnackbarQueue,\n SnackbarQueueAddOptions\n} from './types';\nimport { SNACKBAR_DEFAULTS, SNACKBAR_QUEUE_BEHAVIORS } from './constants';\n\n/**\n * Creates a queue manager for snackbars\n *\n * Ensures only one snackbar is visible at a time. Supports two behaviors when\n * a new snackbar is added (see {@link SnackbarQueueAddOptions}):\n * - `'queue'` (default): the snackbar waits its turn and is shown in order.\n * - `'replace'`: the snackbar evicts whatever is currently on screen, drops any\n * still-pending snackbars, and shows immediately. This keeps rapid, repeated\n * actions snappy instead of serializing a long backlog.\n *\n * @param {number} gap - Delay in ms between a dismissed snackbar and the next\n * @returns {SnackbarQueue} Queue manager with add/clear methods\n */\nexport const createSnackbarQueue = (\n gap: number = SNACKBAR_DEFAULTS.QUEUE_GAP\n): SnackbarQueue => {\n const pending: QueuedSnackbar[] = [];\n let current: QueuedSnackbar | null = null;\n let currentDismiss: (() => void) | null = null;\n let advanceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearAdvanceTimer = (): void => {\n if (advanceTimer !== null) {\n clearTimeout(advanceTimer);\n advanceTimer = null;\n }\n };\n\n /**\n * Detaches the active snackbar's dismiss listener without advancing the\n * queue. Used both on natural dismissal and on replace-eviction.\n */\n const releaseCurrent = (): void => {\n if (current && currentDismiss) {\n current.off?.('dismiss', currentDismiss);\n }\n current = null;\n currentDismiss = null;\n };\n\n const showNext = (): void => {\n clearAdvanceTimer();\n if (current || pending.length === 0) return;\n\n const snackbar = pending.shift() as QueuedSnackbar;\n current = snackbar;\n\n const handleDismiss = (): void => {\n releaseCurrent();\n // Process the next one after a small gap for visual separation.\n if (pending.length > 0) {\n advanceTimer = setTimeout(() => {\n advanceTimer = null;\n showNext();\n }, gap);\n }\n };\n\n currentDismiss = handleDismiss;\n snackbar.on?.('dismiss', handleDismiss);\n snackbar._show();\n };\n\n return {\n /**\n * Adds a snackbar to the queue\n * @param {QueuedSnackbar} snackbar - Snackbar instance with _show method\n * @param {SnackbarQueueAddOptions} [options] - Queue behavior options\n */\n add(snackbar: QueuedSnackbar, options: SnackbarQueueAddOptions = {}): void {\n if (!snackbar._show) {\n throw new Error('Snackbar must implement _show method');\n }\n\n const behavior = options.behavior ?? SNACKBAR_QUEUE_BEHAVIORS.QUEUE;\n\n if (behavior === SNACKBAR_QUEUE_BEHAVIORS.REPLACE) {\n // Drop everything still waiting and evict whatever is on screen, then\n // show this one immediately (no inter-snackbar gap).\n pending.length = 0;\n clearAdvanceTimer();\n if (current) {\n current._hide?.();\n releaseCurrent();\n }\n pending.push(snackbar);\n showNext();\n return;\n }\n\n pending.push(snackbar);\n if (!current) {\n showNext();\n }\n },\n\n /**\n * Clears all pending snackbars and dismisses the active one\n */\n clear(): void {\n pending.length = 0;\n clearAdvanceTimer();\n if (current) {\n current._hide?.();\n releaseCurrent();\n }\n },\n\n /**\n * Gets the current queue length, including the snackbar on screen\n * @returns {number} Number of snackbars queued or visible\n */\n getLength(): number {\n return pending.length + (current ? 1 : 0);\n }\n };\n};\n",
|
|
233
|
+
"// src/components/snackbar/config.ts\nimport {\n createComponentConfig,\n createElementConfig,\n BaseComponentConfig,\n} from \"../../core/config/component\";\nimport { SnackbarConfig, BaseComponent, ApiOptions } from \"./types\";\nimport { SNACKBAR_DEFAULTS } from \"./constants\";\n\n/**\n * Default configuration for the Snackbar component\n */\nexport const defaultConfig: Partial<SnackbarConfig> = {\n variant: SNACKBAR_DEFAULTS.VARIANT,\n position: SNACKBAR_DEFAULTS.POSITION,\n duration: SNACKBAR_DEFAULTS.DURATION,\n queueBehavior: SNACKBAR_DEFAULTS.QUEUE_BEHAVIOR,\n};\n\n/**\n * Creates the base configuration for Snackbar component\n * @param {SnackbarConfig} config - User provided configuration\n * @returns {SnackbarConfig} Complete configuration with defaults applied\n */\nexport const createBaseConfig = (config: SnackbarConfig): SnackbarConfig =>\n createComponentConfig(\n defaultConfig as BaseComponentConfig,\n config,\n \"snackbar\"\n ) as SnackbarConfig;\n\n/**\n * Generates element configuration for the Snackbar component\n * @param {SnackbarConfig} config - Snackbar configuration\n * @returns {Object} Element configuration object for withElement\n */\nexport const getElementConfig = (config: SnackbarConfig) =>\n createElementConfig(config, {\n tag: \"div\",\n className: config.class,\n });\n\n/**\n * Creates text configuration for the Snackbar component\n * @param {SnackbarConfig} config - Snackbar configuration\n * @returns {Object} Text configuration object\n */\nexport const getTextConfig = (config: SnackbarConfig) => ({\n ...config,\n text: config.message,\n});\n\n/**\n * Creates API configuration for the Snackbar component\n * @param {BaseComponent} comp - Component with lifecycle feature\n * @param {SnackbarQueue} queue - Snackbar queue manager\n * @returns {ApiOptions} API configuration object\n */\nexport const getApiConfig = (\n comp: BaseComponent,\n queue: any,\n config?: SnackbarConfig\n): ApiOptions => ({\n lifecycle: {\n destroy: comp.lifecycle?.destroy || (() => {}),\n },\n queue,\n queueBehavior: config?.queueBehavior,\n});\n\nexport default defaultConfig;\n",
|
|
218
234
|
"// src/components/switch/switch.ts\nimport { pipe } from \"../../core/compose\";\nimport { createBase, withElement } from \"../../core/compose/component\";\nimport {\n withEvents,\n withTextLabel,\n withDisabled,\n withLifecycle,\n withInput,\n withCheckable,\n} from \"../../core/compose/features\";\nimport { withAPI } from \"./api\";\nimport { withSupportingText, withTrack } from \"./features\";\nimport { SwitchConfig, SwitchComponent } from \"./types\";\nimport { createBaseConfig, getElementConfig, getApiConfig } from \"./config\";\n\n/**\n * Creates a new Switch component\n * @param {SwitchConfig} config - Switch configuration\n * @returns {SwitchComponent} Switch component instance\n */\nconst createSwitch = (config: SwitchConfig = {}): SwitchComponent => {\n const baseConfig = createBaseConfig(config);\n\n try {\n const switchComponent = pipe(\n createBase,\n withEvents(), // Move events first to ensure system is available\n withElement(getElementConfig(baseConfig)),\n withTextLabel(baseConfig),\n withInput(baseConfig),\n withTrack(baseConfig),\n withSupportingText(baseConfig),\n withCheckable(baseConfig),\n withDisabled(baseConfig),\n withLifecycle(),\n (comp) => withAPI(getApiConfig(comp))(comp)\n )(baseConfig);\n\n return switchComponent as SwitchComponent;\n } catch (error) {\n console.error(\n \"Switch creation error:\",\n error instanceof Error ? error.message : String(error)\n );\n throw new Error(\n `Failed to create switch: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n};\n\nexport default createSwitch;\n",
|
|
219
235
|
"// src/components/switch/api.ts\nimport { BaseComponent, SwitchComponent, ApiOptions } from \"./types\";\n\n/**\n * Enhances switch component with API methods\n * @param {ApiOptions} options - API configuration\n * @returns {Function} Higher-order function that adds API methods to component\n */\nexport const withAPI =\n ({ disabled, lifecycle, checkable }: ApiOptions) =>\n (component: BaseComponent): SwitchComponent => ({\n ...component,\n element: component.element,\n input: component.input as HTMLInputElement,\n\n // Value management - returns boolean checked state for form compatibility\n getValue(): boolean {\n return checkable.isChecked();\n },\n\n setValue(value: boolean | string): SwitchComponent {\n // Handle boolean values\n if (typeof value === \"boolean\") {\n if (value) {\n checkable.check();\n } else {\n checkable.uncheck();\n }\n }\n // Handle string values (\"true\", \"false\", \"1\", \"0\")\n else if (typeof value === \"string\") {\n const shouldCheck = value === \"true\" || value === \"1\";\n if (shouldCheck) {\n checkable.check();\n } else {\n checkable.uncheck();\n }\n }\n return this;\n },\n\n // HTML value attribute access (for rare cases where you need the input's value attribute)\n getValueAttribute(): string {\n return component.input?.value || \"\";\n },\n\n setValueAttribute(value: string): SwitchComponent {\n if (component.input) {\n component.input.value = value;\n }\n return this;\n },\n\n // State management\n check(): SwitchComponent {\n checkable.check();\n return this;\n },\n\n uncheck(): SwitchComponent {\n checkable.uncheck();\n return this;\n },\n\n toggle(): SwitchComponent {\n checkable.toggle();\n return this;\n },\n\n isChecked(): boolean {\n return checkable.isChecked();\n },\n\n // Label management\n setLabel(text: string): SwitchComponent {\n component.text?.setText(text);\n return this;\n },\n\n getLabel(): string {\n return component.text?.getText() || \"\";\n },\n\n // Supporting text management (if present)\n supportingTextElement: component.supportingTextElement || null,\n setSupportingText(text: string, isError?: boolean): SwitchComponent {\n if (component.setSupportingText) {\n component.setSupportingText(text, isError);\n }\n return this;\n },\n\n removeSupportingText(): SwitchComponent {\n if (component.removeSupportingText) {\n component.removeSupportingText();\n }\n return this;\n },\n\n // Event handling\n on(event: string, handler: Function): SwitchComponent {\n component.on?.(event, handler);\n return this;\n },\n\n off(event: string, handler: Function): SwitchComponent {\n component.off?.(event, handler);\n return this;\n },\n\n // State management\n enable(): SwitchComponent {\n disabled.enable();\n return this;\n },\n\n disable(): SwitchComponent {\n disabled.disable();\n return this;\n },\n\n destroy(): void {\n lifecycle.destroy();\n },\n });\n",
|
|
220
236
|
"// src/components/switch/features.ts\nimport { BaseComponent, ElementComponent } from \"../../core/compose/component\";\nimport {\n withTrack as withTrackCore,\n TrackComponent,\n} from \"../../core/compose/features\";\nimport { SwitchConfig } from \"./types\";\n\n/**\n * Configuration for supporting text feature\n */\nexport interface SupportingTextConfig {\n /**\n * Supporting text content\n */\n supportingText?: string;\n\n /**\n * Whether supporting text indicates an error\n */\n error?: boolean;\n\n /**\n * CSS class prefix\n */\n prefix?: string;\n\n /**\n * Component name\n */\n componentName?: string;\n\n [key: string]: unknown;\n}\n\n/**\n * Component with supporting text capabilities\n */\nexport interface SupportingTextComponent extends BaseComponent {\n /**\n * Supporting text element\n */\n supportingTextElement: HTMLElement | null;\n\n /**\n * Sets supporting text content\n * @param text - Text content\n * @param isError - Whether text represents an error\n * @returns Component instance for chaining\n */\n setSupportingText: (\n text: string,\n isError?: boolean\n ) => SupportingTextComponent;\n\n /**\n * Removes supporting text\n * @returns Component instance for chaining\n */\n removeSupportingText: () => SupportingTextComponent;\n}\n\n/**\n * Helper to ensure the switch has the proper container/content structure\n * @param component - The component to enhance\n * @param prefix - CSS class prefix\n * @param componentName - Component name\n * @returns The container and content elements\n */\nconst ensureSwitchStructure = (\n component: ElementComponent,\n prefix: string,\n componentName: string\n) => {\n const PREFIX = prefix || \"mtrl\";\n const COMPONENT = componentName || \"switch\";\n\n // Create or find container\n let container = component.element.querySelector(\n `.${PREFIX}-${COMPONENT}-container`\n );\n if (!container) {\n container = document.createElement(\"div\");\n container.className = `${PREFIX}-${COMPONENT}-container`;\n\n // Find input and track to move them to container\n const input = component.element.querySelector(\n `.${PREFIX}-${COMPONENT}-input`\n );\n const track = component.element.querySelector(\n `.${PREFIX}-${COMPONENT}-track`\n );\n\n // Gather all elements except container\n const elementsToMove = [];\n if (input) elementsToMove.push(input);\n if (track) elementsToMove.push(track);\n\n // Create content wrapper\n const contentWrapper = document.createElement(\"div\");\n contentWrapper.className = `${PREFIX}-${COMPONENT}-content`;\n\n // Find label and move to content\n const label = component.element.querySelector(\n `.${PREFIX}-${COMPONENT}-label`\n );\n if (label) {\n contentWrapper.appendChild(label);\n }\n\n // Add content wrapper to container first\n container.appendChild(contentWrapper);\n\n // Add other elements to container\n elementsToMove.forEach((el) => container.appendChild(el));\n\n // Add container to component\n component.element.appendChild(container);\n\n return { container, contentWrapper };\n }\n\n // Container exists, find or create content wrapper\n let contentWrapper = component.element.querySelector(\n `.${PREFIX}-${COMPONENT}-content`\n );\n if (!contentWrapper) {\n contentWrapper = document.createElement(\"div\");\n contentWrapper.className = `${PREFIX}-${COMPONENT}-content`;\n\n // Find label to move to content\n const label = component.element.querySelector(\n `.${PREFIX}-${COMPONENT}-label`\n );\n if (label) {\n contentWrapper.appendChild(label);\n }\n\n // Insert content wrapper at beginning of container\n container.insertBefore(contentWrapper, container.firstChild);\n }\n\n return { container, contentWrapper };\n};\n\n/**\n * Creates and manages supporting text for a component\n * @param config - Configuration object with supporting text settings\n * @returns Function that enhances a component with supporting text functionality\n */\nexport const withSupportingText =\n <T extends SupportingTextConfig>(config: T) =>\n <C extends ElementComponent>(component: C): C & SupportingTextComponent => {\n const PREFIX = config.prefix || \"mtrl\";\n const COMPONENT = config.componentName || \"switch\";\n\n // Ensure we have the proper container/content structure\n const { contentWrapper } = ensureSwitchStructure(\n component,\n PREFIX,\n COMPONENT\n );\n\n // Create supporting text element if needed\n let supportingElement = null;\n if (config.supportingText) {\n supportingElement = document.createElement(\"div\");\n supportingElement.className = `${PREFIX}-${COMPONENT}-helper`;\n supportingElement.textContent = config.supportingText;\n\n if (config.error) {\n supportingElement.classList.add(`${PREFIX}-${COMPONENT}-helper--error`);\n component.element.classList.add(`${PREFIX}-${COMPONENT}--error`);\n }\n\n // Add supporting text to the content wrapper\n contentWrapper.appendChild(supportingElement);\n }\n\n // Add lifecycle integration if available\n if (\n \"lifecycle\" in component &&\n component.lifecycle &&\n typeof component.lifecycle === \"object\" &&\n \"destroy\" in component.lifecycle &&\n supportingElement\n ) {\n const originalDestroy = component.lifecycle.destroy as Function;\n component.lifecycle.destroy = () => {\n if (supportingElement) supportingElement.remove();\n originalDestroy.call(component.lifecycle);\n };\n }\n\n return {\n ...component,\n supportingTextElement: supportingElement,\n\n setSupportingText(text: string, isError = false) {\n const { contentWrapper } = ensureSwitchStructure(\n component,\n PREFIX,\n COMPONENT\n );\n let supportingElement = this.supportingTextElement;\n\n if (!supportingElement) {\n // Create if it doesn't exist\n supportingElement = document.createElement(\"div\");\n supportingElement.className = `${PREFIX}-${COMPONENT}-helper`;\n contentWrapper.appendChild(supportingElement);\n this.supportingTextElement = supportingElement;\n }\n\n supportingElement.textContent = text;\n\n // Handle error state\n supportingElement.classList.toggle(\n `${PREFIX}-${COMPONENT}-helper--error`,\n isError\n );\n component.element.classList.toggle(\n `${PREFIX}-${COMPONENT}--error`,\n isError\n );\n\n return this;\n },\n\n removeSupportingText() {\n if (\n this.supportingTextElement &&\n this.supportingTextElement.parentNode\n ) {\n this.supportingTextElement.remove();\n this.supportingTextElement = null;\n component.element.classList.remove(`${PREFIX}-${COMPONENT}--error`);\n }\n return this;\n },\n };\n };\n\n/**\n * Wrapper for the core withTrack function that works with SwitchConfig\n *\n * @param config - Switch configuration\n * @returns Function that enhances a component with track and thumb elements\n */\nexport const withTrack =\n (config: SwitchConfig) =>\n <C extends ElementComponent>(component: C): C & TrackComponent => {\n // Ensure prefix and componentName are set\n const trackConfig = {\n ...config,\n prefix: config.prefix || \"mtrl\",\n componentName: config.componentName || \"switch\",\n };\n\n return withTrackCore(trackConfig)(component);\n };\n",
|
|
@@ -247,7 +263,7 @@
|
|
|
247
263
|
"// src/components/tooltip/constants.ts\n\n/**\n * Tooltip positions\n * @category Components\n */\nexport const TOOLTIP_POSITIONS = {\n /** Position above the target element */\n TOP: 'top',\n /** Position to the right of the target element */\n RIGHT: 'right',\n /** Position below the target element */\n BOTTOM: 'bottom',\n /** Position to the left of the target element */\n LEFT: 'left',\n /** Position above and aligned to the start of the target */\n TOP_START: 'top-start',\n /** Position above and aligned to the end of the target */\n TOP_END: 'top-end',\n /** Position to the right and aligned to the start of the target */\n RIGHT_START: 'right-start',\n /** Position to the right and aligned to the end of the target */\n RIGHT_END: 'right-end',\n /** Position below and aligned to the start of the target */\n BOTTOM_START: 'bottom-start',\n /** Position below and aligned to the end of the target */\n BOTTOM_END: 'bottom-end',\n /** Position to the left and aligned to the start of the target */\n LEFT_START: 'left-start',\n /** Position to the left and aligned to the end of the target */\n LEFT_END: 'left-end'\n} as const;\n\n/**\n * Tooltip visual variants\n * @category Components\n */\nexport const TOOLTIP_VARIANTS = {\n /** Standard tooltip with background and arrow */\n DEFAULT: 'default',\n /** Rich tooltip with support for HTML content */\n RICH: 'rich',\n /** Plain text tooltip with minimal styling */\n PLAIN: 'plain'\n} as const;\n\n/**\n * Tooltip events\n * @category Components\n */\nexport const TOOLTIP_EVENTS = {\n /** Fired when tooltip becomes visible */\n SHOW: 'show',\n /** Fired when tooltip becomes hidden */\n HIDE: 'hide',\n /** Fired when mouse enters target element */\n ENTER: 'enter',\n /** Fired when mouse leaves target element */\n LEAVE: 'leave'\n} as const;\n\n/**\n * Default configuration values for tooltip\n * @category Components\n */\nexport const TOOLTIP_DEFAULTS = {\n /** Default tooltip position */\n POSITION: TOOLTIP_POSITIONS.BOTTOM,\n /** Default visual variant */\n VARIANT: TOOLTIP_VARIANTS.DEFAULT,\n /** Default visibility state */\n VISIBLE: false,\n /** Default show delay in milliseconds */\n SHOW_DELAY: 300,\n /** Default hide delay in milliseconds */\n HIDE_DELAY: 100,\n /** Default offset from target in pixels */\n OFFSET: 8,\n /** Default arrow size in pixels */\n ARROW_SIZE: 8,\n /** Whether to show tooltip on focus by default */\n SHOW_ON_FOCUS: true,\n /** Whether to show tooltip on hover by default */\n SHOW_ON_HOVER: true,\n /** Whether to allow rich HTML content by default */\n RICH: false\n} as const;\n\n/**\n * CSS class names used by the tooltip component\n * @category Components\n */\nexport const TOOLTIP_CLASSES = {\n /** Root element class */\n ROOT: 'tooltip',\n /** Container for the tooltip content */\n CONTAINER: 'tooltip-container',\n /** Arrow element class */\n ARROW: 'tooltip-arrow',\n /** Content element class */\n CONTENT: 'tooltip-content',\n /** Visible state class */\n VISIBLE: 'tooltip--visible',\n /** Hidden state class */\n HIDDEN: 'tooltip--hidden',\n /** Default variant class */\n DEFAULT: 'tooltip--default',\n /** Rich variant class */\n RICH: 'tooltip--rich',\n /** Plain variant class */\n PLAIN: 'tooltip--plain',\n /** Position prefix - append position name (e.g. tooltip--top) */\n POSITION_PREFIX: 'tooltip--'\n} as const;",
|
|
248
264
|
"// src/index.ts\n/**\n * Main mtrl library exports\n *\n * @packageDocumentation\n */\n\nexport * from \"./components\";\nexport * from \"./core\";\n\n// Import from core\nimport {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n throttle,\n debounce,\n once,\n PREFIX,\n createComponentConfig,\n createElementConfig,\n setComponentDefaults,\n getComponentDefaults,\n setGlobalDefaults,\n clearGlobalDefaults,\n} from \"./core\";\n\n// Export all \"create*\" functions\nexport {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n throttle,\n debounce,\n once,\n PREFIX,\n createComponentConfig,\n createElementConfig,\n // Global configuration functions\n setComponentDefaults,\n getComponentDefaults,\n setGlobalDefaults,\n clearGlobalDefaults,\n};\n\n// NOTE: Constants are no longer exported from the main entry point\n// to enable proper tree-shaking. Import constants directly from\n// component paths:\n//\n// Before (no longer works):\n// import { BUTTON_VARIANTS } from 'mtrl'\n//\n// After:\n// import { BUTTON_VARIANTS } from 'mtrl/components/button/constants'\n//\n// Or use the component's index which re-exports its constants:\n// import { BUTTON_VARIANTS } from 'mtrl/components/button'\n"
|
|
249
265
|
],
|
|
250
|
-
"mappings": "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",
|
|
251
|
-
"debugId": "
|
|
266
|
+
"mappings": "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",
|
|
267
|
+
"debugId": "6719FA57266A84FD64756E2164756E21",
|
|
252
268
|
"names": []
|
|
253
269
|
}
|