@zeix/le-truc 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai-context.md +234 -0
- package/.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc +111 -0
- package/.editorconfig +12 -0
- package/.github/copilot-instructions.md +62 -0
- package/.github/workflows/codeql.yml +108 -0
- package/.github/workflows/static.yml +43 -0
- package/.prettierrc +17 -0
- package/CLAUDE.md +215 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +160 -0
- package/LICENSE +21 -0
- package/README.md +474 -0
- package/biome.json +295 -0
- package/bun.lock +239 -0
- package/docs/about.html +105 -0
- package/docs/assets/main.css +1 -0
- package/docs/assets/main.js +10 -0
- package/docs/assets/main.js.map +66 -0
- package/docs/components.html +293 -0
- package/docs/data-flow.html +308 -0
- package/docs/examples/basic-button.html +367 -0
- package/docs/examples/basic-counter.html +188 -0
- package/docs/examples/basic-hello.html +138 -0
- package/docs/examples/basic-number.html +271 -0
- package/docs/examples/basic-pluralize.html +214 -0
- package/docs/examples/card-callout.html +152 -0
- package/docs/examples/card-mediaqueries.html +138 -0
- package/docs/examples/context-media.html +198 -0
- package/docs/examples/empty.html +37 -0
- package/docs/examples/form-checkbox.html +233 -0
- package/docs/examples/form-combobox.html +420 -0
- package/docs/examples/form-listbox.html +434 -0
- package/docs/examples/form-radiogroup.html +296 -0
- package/docs/examples/form-spinbutton.html +402 -0
- package/docs/examples/form-textbox.html +361 -0
- package/docs/examples/layout.html +67 -0
- package/docs/examples/module-carousel.html +552 -0
- package/docs/examples/module-catalog.html +241 -0
- package/docs/examples/module-codeblock.html +270 -0
- package/docs/examples/module-dialog.html +343 -0
- package/docs/examples/module-lazyload.html +289 -0
- package/docs/examples/module-list.html +197 -0
- package/docs/examples/module-pagination.html +283 -0
- package/docs/examples/module-scrollarea.html +447 -0
- package/docs/examples/module-tabgroup.html +526 -0
- package/docs/examples/module-todo.html +367 -0
- package/docs/examples/module-with-type.html +63 -0
- package/docs/examples/nested-components.html +88 -0
- package/docs/examples/recursive.html +56 -0
- package/docs/examples/simple-text.html +39 -0
- package/docs/examples/snippet.html +93 -0
- package/docs/examples/with-styles.html +75 -0
- package/docs/getting-started.html +143 -0
- package/docs/index.html +112 -0
- package/docs/sitemap.xml +28 -0
- package/docs/styling.html +160 -0
- package/docs/sw.js +112 -0
- package/docs-src/api/README.md +478 -0
- package/docs-src/api/_media/LICENSE +21 -0
- package/docs-src/api/classes/CircularDependencyError.md +299 -0
- package/docs-src/api/classes/CircularMutationError.md +301 -0
- package/docs-src/api/classes/ContextRequestEvent.md +590 -0
- package/docs-src/api/classes/DependencyTimeoutError.md +301 -0
- package/docs-src/api/classes/InvalidCallbackError.md +303 -0
- package/docs-src/api/classes/InvalidComponentNameError.md +295 -0
- package/docs-src/api/classes/InvalidCustomElementError.md +301 -0
- package/docs-src/api/classes/InvalidEffectsError.md +301 -0
- package/docs-src/api/classes/InvalidPropertyNameError.md +307 -0
- package/docs-src/api/classes/InvalidReactivesError.md +307 -0
- package/docs-src/api/classes/InvalidSignalValueError.md +303 -0
- package/docs-src/api/classes/MissingElementError.md +307 -0
- package/docs-src/api/classes/NullishSignalValueError.md +299 -0
- package/docs-src/api/classes/StoreKeyExistsError.md +303 -0
- package/docs-src/api/classes/StoreKeyRangeError.md +299 -0
- package/docs-src/api/classes/StoreKeyReadonlyError.md +303 -0
- package/docs-src/api/functions/asBoolean.md +21 -0
- package/docs-src/api/functions/asEnum.md +31 -0
- package/docs-src/api/functions/asInteger.md +39 -0
- package/docs-src/api/functions/asJSON.md +49 -0
- package/docs-src/api/functions/asNumber.md +37 -0
- package/docs-src/api/functions/asString.md +37 -0
- package/docs-src/api/functions/createCollection.md +83 -0
- package/docs-src/api/functions/createSensor.md +71 -0
- package/docs-src/api/functions/dangerouslySetInnerHTML.md +48 -0
- package/docs-src/api/functions/defineComponent.md +65 -0
- package/docs-src/api/functions/isCollection.md +37 -0
- package/docs-src/api/functions/isParser.md +41 -0
- package/docs-src/api/functions/match.md +47 -0
- package/docs-src/api/functions/on.md +58 -0
- package/docs-src/api/functions/pass.md +53 -0
- package/docs-src/api/functions/provideContexts.md +47 -0
- package/docs-src/api/functions/read.md +47 -0
- package/docs-src/api/functions/requestContext.md +51 -0
- package/docs-src/api/functions/resolve.md +40 -0
- package/docs-src/api/functions/runEffects.md +51 -0
- package/docs-src/api/functions/runElementEffects.md +57 -0
- package/docs-src/api/functions/schedule.md +33 -0
- package/docs-src/api/functions/setAttribute.md +48 -0
- package/docs-src/api/functions/setProperty.md +52 -0
- package/docs-src/api/functions/setStyle.md +48 -0
- package/docs-src/api/functions/setText.md +42 -0
- package/docs-src/api/functions/show.md +42 -0
- package/docs-src/api/functions/toSignal.md +37 -0
- package/docs-src/api/functions/toggleAttribute.md +48 -0
- package/docs-src/api/functions/toggleClass.md +48 -0
- package/docs-src/api/functions/updateElement.md +53 -0
- package/docs-src/api/globals.md +131 -0
- package/docs-src/api/type-aliases/Cleanup.md +27 -0
- package/docs-src/api/type-aliases/Collection.md +91 -0
- package/docs-src/api/type-aliases/CollectionListener.md +27 -0
- package/docs-src/api/type-aliases/Component.md +17 -0
- package/docs-src/api/type-aliases/ComponentProp.md +11 -0
- package/docs-src/api/type-aliases/ComponentProps.md +11 -0
- package/docs-src/api/type-aliases/ComponentSetup.md +31 -0
- package/docs-src/api/type-aliases/ComponentUI.md +27 -0
- package/docs-src/api/type-aliases/Computed.md +49 -0
- package/docs-src/api/type-aliases/ComputedCallback.md +29 -0
- package/docs-src/api/type-aliases/Context.md +33 -0
- package/docs-src/api/type-aliases/ContextType.md +19 -0
- package/docs-src/api/type-aliases/DangerouslySetInnerHTMLOptions.md +27 -0
- package/docs-src/api/type-aliases/DiffResult.md +61 -0
- package/docs-src/api/type-aliases/Effect.md +35 -0
- package/docs-src/api/type-aliases/EffectCallback.md +23 -0
- package/docs-src/api/type-aliases/Effects.md +21 -0
- package/docs-src/api/type-aliases/ElementEffects.md +21 -0
- package/docs-src/api/type-aliases/ElementFromKey.md +21 -0
- package/docs-src/api/type-aliases/ElementQueries.md +27 -0
- package/docs-src/api/type-aliases/ElementUpdater.md +131 -0
- package/docs-src/api/type-aliases/EventHandler.md +31 -0
- package/docs-src/api/type-aliases/EventType.md +17 -0
- package/docs-src/api/type-aliases/Fallback.md +21 -0
- package/docs-src/api/type-aliases/Initializers.md +21 -0
- package/docs-src/api/type-aliases/LooseReader.md +31 -0
- package/docs-src/api/type-aliases/MatchHandlers.md +77 -0
- package/docs-src/api/type-aliases/MaybeCleanup.md +23 -0
- package/docs-src/api/type-aliases/MaybeSignal.md +17 -0
- package/docs-src/api/type-aliases/Parser.md +39 -0
- package/docs-src/api/type-aliases/ParserOrFallback.md +21 -0
- package/docs-src/api/type-aliases/PassedProp.md +25 -0
- package/docs-src/api/type-aliases/PassedProps.md +21 -0
- package/docs-src/api/type-aliases/Reactive.md +25 -0
- package/docs-src/api/type-aliases/Reader.md +31 -0
- package/docs-src/api/type-aliases/ReservedWords.md +11 -0
- package/docs-src/api/type-aliases/ResolveResult.md +29 -0
- package/docs-src/api/type-aliases/SensorEvents.md +25 -0
- package/docs-src/api/type-aliases/Signal.md +41 -0
- package/docs-src/api/type-aliases/State.md +85 -0
- package/docs-src/api/type-aliases/Store.md +29 -0
- package/docs-src/api/type-aliases/UI.md +11 -0
- package/docs-src/api/type-aliases/UnknownContext.md +13 -0
- package/docs-src/api/variables/CONTEXT_REQUEST.md +11 -0
- package/docs-src/api/variables/UNSET.md +23 -0
- package/docs-src/api/variables/batch.md +25 -0
- package/docs-src/api/variables/createComputed.md +41 -0
- package/docs-src/api/variables/createEffect.md +35 -0
- package/docs-src/api/variables/createState.md +37 -0
- package/docs-src/api/variables/createStore.md +42 -0
- package/docs-src/api/variables/diff.md +43 -0
- package/docs-src/api/variables/isAbortError.md +33 -0
- package/docs-src/api/variables/isAsyncFunction.md +39 -0
- package/docs-src/api/variables/isComputed.md +37 -0
- package/docs-src/api/variables/isEqual.md +49 -0
- package/docs-src/api/variables/isFunction.md +39 -0
- package/docs-src/api/variables/isMutableSignal.md +37 -0
- package/docs-src/api/variables/isNumber.md +33 -0
- package/docs-src/api/variables/isRecord.md +39 -0
- package/docs-src/api/variables/isRecordOrArray.md +39 -0
- package/docs-src/api/variables/isSignal.md +37 -0
- package/docs-src/api/variables/isState.md +37 -0
- package/docs-src/api/variables/isStore.md +37 -0
- package/docs-src/api/variables/isString.md +33 -0
- package/docs-src/api/variables/isSymbol.md +33 -0
- package/docs-src/api/variables/toError.md +33 -0
- package/docs-src/api/variables/valueString.md +33 -0
- package/docs-src/includes/menu.html +44 -0
- package/docs-src/pages/about.md +89 -0
- package/docs-src/pages/components.md +437 -0
- package/docs-src/pages/data-flow.md +449 -0
- package/docs-src/pages/getting-started.md +170 -0
- package/docs-src/pages/index.md +98 -0
- package/docs-src/pages/styling.md +165 -0
- package/eslint.config.js +64 -0
- package/examples/_common/clear.ts +49 -0
- package/examples/_common/fetch.ts +160 -0
- package/examples/_common/focus.ts +45 -0
- package/examples/_common/highlight.ts +5 -0
- package/examples/_global.css +463 -0
- package/examples/basic-button/basic-button.css +176 -0
- package/examples/basic-button/basic-button.html +46 -0
- package/examples/basic-button/basic-button.spec.ts +160 -0
- package/examples/basic-button/basic-button.ts +45 -0
- package/examples/basic-button/copyToClipboard.ts +37 -0
- package/examples/basic-counter/basic-counter.css +21 -0
- package/examples/basic-counter/basic-counter.html +24 -0
- package/examples/basic-counter/basic-counter.spec.ts +85 -0
- package/examples/basic-counter/basic-counter.ts +43 -0
- package/examples/basic-hello/basic-hello.html +34 -0
- package/examples/basic-hello/basic-hello.spec.ts +110 -0
- package/examples/basic-hello/basic-hello.ts +36 -0
- package/examples/basic-number/basic-number.html +79 -0
- package/examples/basic-number/basic-number.spec.ts +175 -0
- package/examples/basic-number/basic-number.ts +124 -0
- package/examples/basic-pluralize/basic-pluralize.html +64 -0
- package/examples/basic-pluralize/basic-pluralize.spec.ts +258 -0
- package/examples/basic-pluralize/basic-pluralize.ts +82 -0
- package/examples/card-callout/card-callout.css +79 -0
- package/examples/card-callout/card-callout.html +5 -0
- package/examples/card-mediaqueries/card-mediaqueries.html +29 -0
- package/examples/card-mediaqueries/card-mediaqueries.spec.ts +300 -0
- package/examples/card-mediaqueries/card-mediaqueries.ts +41 -0
- package/examples/context-media/context-media.html +3 -0
- package/examples/context-media/context-media.ts +127 -0
- package/examples/form-checkbox/form-checkbox.css +70 -0
- package/examples/form-checkbox/form-checkbox.html +13 -0
- package/examples/form-checkbox/form-checkbox.spec.ts +357 -0
- package/examples/form-checkbox/form-checkbox.ts +50 -0
- package/examples/form-checkbox/vanilla-checkbox.ts +101 -0
- package/examples/form-combobox/form-combobox.css +118 -0
- package/examples/form-combobox/form-combobox.html +74 -0
- package/examples/form-combobox/form-combobox.spec.ts +977 -0
- package/examples/form-combobox/form-combobox.ts +128 -0
- package/examples/form-listbox/form-listbox.css +71 -0
- package/examples/form-listbox/form-listbox.html +67 -0
- package/examples/form-listbox/form-listbox.spec.ts +1050 -0
- package/examples/form-listbox/form-listbox.ts +196 -0
- package/examples/form-listbox/mocks/timezones.json +495 -0
- package/examples/form-radiogroup/form-radiogroup.css +87 -0
- package/examples/form-radiogroup/form-radiogroup.html +51 -0
- package/examples/form-radiogroup/form-radiogroup.spec.ts +515 -0
- package/examples/form-radiogroup/form-radiogroup.ts +58 -0
- package/examples/form-spinbutton/form-spinbutton.css +95 -0
- package/examples/form-spinbutton/form-spinbutton.html +96 -0
- package/examples/form-spinbutton/form-spinbutton.spec.ts +688 -0
- package/examples/form-spinbutton/form-spinbutton.ts +111 -0
- package/examples/form-textbox/form-textbox.css +104 -0
- package/examples/form-textbox/form-textbox.html +53 -0
- package/examples/form-textbox/form-textbox.spec.ts +542 -0
- package/examples/form-textbox/form-textbox.ts +104 -0
- package/examples/main.css +22 -0
- package/examples/main.ts +23 -0
- package/examples/module-carousel/module-carousel.css +113 -0
- package/examples/module-carousel/module-carousel.html +208 -0
- package/examples/module-carousel/module-carousel.spec.ts +523 -0
- package/examples/module-carousel/module-carousel.ts +131 -0
- package/examples/module-catalog/module-catalog.css +22 -0
- package/examples/module-catalog/module-catalog.html +82 -0
- package/examples/module-catalog/module-catalog.spec.ts +396 -0
- package/examples/module-catalog/module-catalog.ts +37 -0
- package/examples/module-codeblock/module-codeblock.css +95 -0
- package/examples/module-codeblock/module-codeblock.html +28 -0
- package/examples/module-codeblock/module-codeblock.ts +47 -0
- package/examples/module-demo/module-demo.css +13 -0
- package/examples/module-dialog/module-dialog.css +96 -0
- package/examples/module-dialog/module-dialog.html +66 -0
- package/examples/module-dialog/module-dialog.spec.ts +557 -0
- package/examples/module-dialog/module-dialog.ts +81 -0
- package/examples/module-lazyload/mocks/empty.html +1 -0
- package/examples/module-lazyload/mocks/module-with-type.html +27 -0
- package/examples/module-lazyload/mocks/nested-components.html +52 -0
- package/examples/module-lazyload/mocks/recursive.html +20 -0
- package/examples/module-lazyload/mocks/simple-text.html +3 -0
- package/examples/module-lazyload/mocks/snippet.html +57 -0
- package/examples/module-lazyload/mocks/with-styles.html +39 -0
- package/examples/module-lazyload/module-lazyload.html +132 -0
- package/examples/module-lazyload/module-lazyload.spec.ts +734 -0
- package/examples/module-lazyload/module-lazyload.ts +89 -0
- package/examples/module-list/module-list.html +30 -0
- package/examples/module-list/module-list.spec.ts +592 -0
- package/examples/module-list/module-list.ts +99 -0
- package/examples/module-pagination/module-pagination.css +79 -0
- package/examples/module-pagination/module-pagination.html +16 -0
- package/examples/module-pagination/module-pagination.spec.ts +701 -0
- package/examples/module-pagination/module-pagination.ts +88 -0
- package/examples/module-scrollarea/module-scrollarea.css +77 -0
- package/examples/module-scrollarea/module-scrollarea.html +189 -0
- package/examples/module-scrollarea/module-scrollarea.spec.ts +445 -0
- package/examples/module-scrollarea/module-scrollarea.ts +81 -0
- package/examples/module-tabgroup/module-tabgroup.css +55 -0
- package/examples/module-tabgroup/module-tabgroup.html +269 -0
- package/examples/module-tabgroup/module-tabgroup.spec.ts +631 -0
- package/examples/module-tabgroup/module-tabgroup.ts +102 -0
- package/examples/module-toc/module-toc.css +34 -0
- package/examples/module-todo/module-todo.css +84 -0
- package/examples/module-todo/module-todo.html +92 -0
- package/examples/module-todo/module-todo.spec.ts +528 -0
- package/examples/module-todo/module-todo.ts +91 -0
- package/examples/section-hero/section-hero.css +37 -0
- package/examples/section-menu/section-menu.css +81 -0
- package/examples/server.ts +95 -0
- package/examples/test-setup.md +314 -0
- package/index.dev.js +1688 -0
- package/index.dev.ts +127 -0
- package/index.js +3 -0
- package/index.js.map +42 -0
- package/index.ts +127 -0
- package/package.json +64 -0
- package/playwright.config.ts +31 -0
- package/server/BUILD_SYSTEM.md +428 -0
- package/server/SERVER.md +286 -0
- package/server/build.ts +91 -0
- package/server/config.ts +130 -0
- package/server/effects/api.ts +28 -0
- package/server/effects/css.ts +31 -0
- package/server/effects/examples.ts +109 -0
- package/server/effects/js.ts +32 -0
- package/server/effects/menu.ts +34 -0
- package/server/effects/pages.ts +178 -0
- package/server/effects/service-worker.ts +57 -0
- package/server/effects/sitemap.ts +27 -0
- package/server/file-signals.ts +361 -0
- package/server/file-watcher.ts +77 -0
- package/server/io.ts +174 -0
- package/server/layout-engine.ts +470 -0
- package/server/layout-utils.ts +615 -0
- package/server/layouts/api.html +76 -0
- package/server/layouts/base.html +37 -0
- package/server/layouts/blog.html +115 -0
- package/server/layouts/example.html +104 -0
- package/server/layouts/overview.html +165 -0
- package/server/layouts/page.html +36 -0
- package/server/layouts/test.html +24 -0
- package/server/markdoc-helpers.ts +217 -0
- package/server/markdoc.config.ts +29 -0
- package/server/schema/callout.markdoc.ts +17 -0
- package/server/schema/carousel.markdoc.ts +118 -0
- package/server/schema/demo.markdoc.ts +74 -0
- package/server/schema/fence.markdoc.ts +84 -0
- package/server/schema/heading.markdoc.ts +23 -0
- package/server/schema/hero.markdoc.ts +59 -0
- package/server/schema/section.markdoc.ts +10 -0
- package/server/schema/slide.markdoc.ts +17 -0
- package/server/schema/source.markdoc.ts +53 -0
- package/server/schema/tabgroup.markdoc.ts +102 -0
- package/server/serve.ts +635 -0
- package/server/templates/README.md +352 -0
- package/server/templates/constants.ts +236 -0
- package/server/templates/fragments.ts +159 -0
- package/server/templates/hmr.ts +269 -0
- package/server/templates/menu.ts +33 -0
- package/server/templates/performance-hints.ts +94 -0
- package/server/templates/service-worker.ts +403 -0
- package/server/templates/sitemap.ts +57 -0
- package/server/templates/toc.ts +41 -0
- package/server/templates/utils.ts +378 -0
- package/src/component.ts +215 -0
- package/src/context.ts +156 -0
- package/src/effects/attribute.ts +82 -0
- package/src/effects/class.ts +28 -0
- package/src/effects/event.ts +67 -0
- package/src/effects/html.ts +60 -0
- package/src/effects/method.ts +57 -0
- package/src/effects/pass.ts +103 -0
- package/src/effects/property.ts +57 -0
- package/src/effects/style.ts +34 -0
- package/src/effects/text.ts +28 -0
- package/src/effects.ts +412 -0
- package/src/errors.ts +160 -0
- package/src/parsers/boolean.ts +14 -0
- package/src/parsers/json.ts +33 -0
- package/src/parsers/number.ts +55 -0
- package/src/parsers/string.ts +32 -0
- package/src/parsers.ts +90 -0
- package/src/scheduler.ts +47 -0
- package/src/signals/collection.ts +253 -0
- package/src/signals/sensor.ts +131 -0
- package/src/ui.ts +236 -0
- package/src/util.ts +187 -0
- package/tsconfig.json +34 -0
- package/types/examples/basic-button/basic-button.d.ts +16 -0
- package/types/examples/basic-hello/basic-hello.d.ts +18 -0
- package/types/index.d.ts +27 -0
- package/types/index.dev.d.ts +27 -0
- package/types/src/collection.d.ts +27 -0
- package/types/src/component.d.ts +32 -0
- package/types/src/context.d.ts +85 -0
- package/types/src/effects/attribute.d.ts +23 -0
- package/types/src/effects/callMethod.d.ts +23 -0
- package/types/src/effects/class.d.ts +13 -0
- package/types/src/effects/dangerouslySetInnerHTML.d.ts +18 -0
- package/types/src/effects/event.d.ts +18 -0
- package/types/src/effects/html.d.ts +17 -0
- package/types/src/effects/method.d.ts +22 -0
- package/types/src/effects/pass.d.ts +18 -0
- package/types/src/effects/property.d.ts +22 -0
- package/types/src/effects/setAttribute.d.ts +24 -0
- package/types/src/effects/setProperty.d.ts +23 -0
- package/types/src/effects/setStyle.d.ts +14 -0
- package/types/src/effects/setText.d.ts +13 -0
- package/types/src/effects/style.d.ts +13 -0
- package/types/src/effects/text.d.ts +12 -0
- package/types/src/effects/toggleClass.d.ts +14 -0
- package/types/src/effects.d.ts +153 -0
- package/types/src/errors.d.ts +99 -0
- package/types/src/events.d.ts +27 -0
- package/types/src/extractors.d.ts +23 -0
- package/types/src/parsers/boolean.d.ts +10 -0
- package/types/src/parsers/json.d.ts +13 -0
- package/types/src/parsers/number.d.ts +21 -0
- package/types/src/parsers/string.d.ts +19 -0
- package/types/src/parsers.d.ts +41 -0
- package/types/src/scheduler.d.ts +11 -0
- package/types/src/sensor.d.ts +27 -0
- package/types/src/signals/collection.d.ts +32 -0
- package/types/src/signals/sensor.d.ts +27 -0
- package/types/src/ui.d.ts +37 -0
- package/types/src/util.d.ts +65 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {
|
|
2
|
+
batch,
|
|
3
|
+
type Component,
|
|
4
|
+
createComputed,
|
|
5
|
+
createSensor,
|
|
6
|
+
createState,
|
|
7
|
+
defineComponent,
|
|
8
|
+
on,
|
|
9
|
+
pass,
|
|
10
|
+
read,
|
|
11
|
+
setAttribute,
|
|
12
|
+
setProperty,
|
|
13
|
+
setText,
|
|
14
|
+
show,
|
|
15
|
+
} from '../..'
|
|
16
|
+
import { clearEffects, clearMethod } from '../_common/clear'
|
|
17
|
+
import { FormListboxProps } from '../form-listbox/form-listbox'
|
|
18
|
+
|
|
19
|
+
export type FormComboboxProps = {
|
|
20
|
+
value: string
|
|
21
|
+
readonly length: number
|
|
22
|
+
error: string
|
|
23
|
+
description: string
|
|
24
|
+
readonly clear: () => void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type FormComboboxUI = {
|
|
28
|
+
textbox: HTMLInputElement
|
|
29
|
+
listbox: Component<FormListboxProps>
|
|
30
|
+
clear?: HTMLButtonElement
|
|
31
|
+
error?: HTMLElement
|
|
32
|
+
description?: HTMLElement
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
declare global {
|
|
36
|
+
interface HTMLElementTagNameMap {
|
|
37
|
+
'form-combobox': Component<FormComboboxProps>
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default defineComponent<FormComboboxProps, FormComboboxUI>(
|
|
42
|
+
'form-combobox',
|
|
43
|
+
{
|
|
44
|
+
value: read(ui => ui.textbox.value, ''),
|
|
45
|
+
length: createSensor(
|
|
46
|
+
read(ui => ui.textbox.value.length, 0),
|
|
47
|
+
'textbox',
|
|
48
|
+
{
|
|
49
|
+
input: ({ target }) => target.value.length,
|
|
50
|
+
},
|
|
51
|
+
),
|
|
52
|
+
error: '',
|
|
53
|
+
description: read(ui => ui.description?.textContent, ''),
|
|
54
|
+
clear: clearMethod,
|
|
55
|
+
},
|
|
56
|
+
({ first }) => ({
|
|
57
|
+
textbox: first('input', 'Needed to enter value.'),
|
|
58
|
+
listbox: first('form-listbox', 'Needed to display options.'),
|
|
59
|
+
clear: first('button.clear'),
|
|
60
|
+
error: first('form-combobox > .error'),
|
|
61
|
+
description: first('.description'),
|
|
62
|
+
}),
|
|
63
|
+
ui => {
|
|
64
|
+
const { host, error, description, listbox, textbox } = ui
|
|
65
|
+
const errorId = error?.id
|
|
66
|
+
const descriptionId = description?.id
|
|
67
|
+
|
|
68
|
+
const showPopup = createState(false)
|
|
69
|
+
const isExpanded = createComputed(
|
|
70
|
+
() => showPopup.get() && listbox.options.length > 0,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
host: [
|
|
75
|
+
setAttribute('value'),
|
|
76
|
+
on('keyup', ({ key }) => {
|
|
77
|
+
if (key === 'Escape') showPopup.set(false)
|
|
78
|
+
if (key === 'Delete') host.clear()
|
|
79
|
+
}),
|
|
80
|
+
],
|
|
81
|
+
textbox: [
|
|
82
|
+
setProperty('ariaInvalid', () => String(!!host.error)),
|
|
83
|
+
setAttribute('aria-errormessage', () =>
|
|
84
|
+
host.error && errorId ? errorId : null,
|
|
85
|
+
),
|
|
86
|
+
setAttribute('aria-describedby', () =>
|
|
87
|
+
host.description && descriptionId ? descriptionId : null,
|
|
88
|
+
),
|
|
89
|
+
setProperty('ariaExpanded', () => String(isExpanded.get())),
|
|
90
|
+
on('input', () => {
|
|
91
|
+
textbox.checkValidity()
|
|
92
|
+
batch(() => {
|
|
93
|
+
host.value = textbox.value
|
|
94
|
+
host.error = textbox.validationMessage ?? ''
|
|
95
|
+
showPopup.set(true)
|
|
96
|
+
})
|
|
97
|
+
}),
|
|
98
|
+
on('keydown', e => {
|
|
99
|
+
const { key, altKey } = e
|
|
100
|
+
if (key === 'ArrowDown') {
|
|
101
|
+
if (altKey) showPopup.set(true)
|
|
102
|
+
if (isExpanded.get()) listbox.options[0]?.focus()
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
],
|
|
106
|
+
listbox: [
|
|
107
|
+
show(isExpanded),
|
|
108
|
+
pass({
|
|
109
|
+
filter: () => host.value,
|
|
110
|
+
}),
|
|
111
|
+
on('change', ({ target }) => {
|
|
112
|
+
if (target instanceof HTMLInputElement) {
|
|
113
|
+
textbox.value = target.value
|
|
114
|
+
textbox.checkValidity()
|
|
115
|
+
batch(() => {
|
|
116
|
+
host.value = target.value
|
|
117
|
+
host.error = textbox.validationMessage ?? ''
|
|
118
|
+
showPopup.set(false)
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
}),
|
|
122
|
+
],
|
|
123
|
+
clear: [...clearEffects(ui)],
|
|
124
|
+
error: [setText('error')],
|
|
125
|
+
description: [setText('description')],
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
form-listbox {
|
|
2
|
+
display: block;
|
|
3
|
+
margin: 0;
|
|
4
|
+
|
|
5
|
+
module-scrollarea {
|
|
6
|
+
max-height: 40rem;
|
|
7
|
+
background-color: var(--color-background);
|
|
8
|
+
|
|
9
|
+
&:has([role="group"]) {
|
|
10
|
+
scroll-padding-block-start: var(--space-xl);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
[role="listbox"] {
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
gap: 0;
|
|
18
|
+
list-style: none;
|
|
19
|
+
padding: 0;
|
|
20
|
+
margin: 0;
|
|
21
|
+
background: var(--color-input);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
[role="group"] {
|
|
25
|
+
margin-block-end: var(--space-xs);
|
|
26
|
+
|
|
27
|
+
&:not(:has(button:not([hidden]))) {
|
|
28
|
+
display: none;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
[role="presentation"] {
|
|
33
|
+
position: sticky;
|
|
34
|
+
top: 0;
|
|
35
|
+
background-color: var(--color-background);
|
|
36
|
+
padding: var(--space-xs) var(--space-m);
|
|
37
|
+
font-size: var(--font-size-xs);
|
|
38
|
+
font-weight: var(--font-weight-bold);
|
|
39
|
+
text-transform: uppercase;
|
|
40
|
+
letter-spacing: 1px;
|
|
41
|
+
margin-block-end: var(--space-xxs);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
[role="option"] {
|
|
45
|
+
display: block;
|
|
46
|
+
width: 100%;
|
|
47
|
+
text-align: left;
|
|
48
|
+
margin: 0;
|
|
49
|
+
padding: var(--space-xs) var(--space-m);
|
|
50
|
+
border: 0;
|
|
51
|
+
font-size: var(--font-size-s);
|
|
52
|
+
line-height: var(--line-height-s);
|
|
53
|
+
background: transparent;
|
|
54
|
+
color: var(--color-text);
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
transition: background var(--transition-short) var(--easing-inout);
|
|
57
|
+
|
|
58
|
+
&[aria-selected="true"] {
|
|
59
|
+
background: var(--color-selection-selected);
|
|
60
|
+
color: var(--color-text-inverted);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
&:hover {
|
|
64
|
+
background: var(--color-selection-hover);
|
|
65
|
+
|
|
66
|
+
&[aria-selected="true"] {
|
|
67
|
+
background: var(--color-selection-active);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<form>
|
|
2
|
+
<form-listbox id="timezone" src="/form-listbox/mocks/timezones.json">
|
|
3
|
+
<input type="hidden" name="timezone" />
|
|
4
|
+
<card-callout>
|
|
5
|
+
<p class="loading" role="status">Loading...</p>
|
|
6
|
+
<p class="error" role="alert" aria-live="assertive" hidden></p>
|
|
7
|
+
</card-callout>
|
|
8
|
+
<module-scrollarea orientation="vertical">
|
|
9
|
+
<div role="listbox" aria-label="Timezones" hidden></div>
|
|
10
|
+
</module-scrollarea>
|
|
11
|
+
</form-listbox>
|
|
12
|
+
</form>
|
|
13
|
+
|
|
14
|
+
<!-- Declarative inline HTML example -->
|
|
15
|
+
<form>
|
|
16
|
+
<form-listbox id="colors">
|
|
17
|
+
<input type="hidden" name="color" />
|
|
18
|
+
<div role="listbox" aria-label="Colors">
|
|
19
|
+
<button type="button" role="option" tabindex="-1" value="red">Red</button>
|
|
20
|
+
<button type="button" role="option" tabindex="-1" value="green">
|
|
21
|
+
Green
|
|
22
|
+
</button>
|
|
23
|
+
<button type="button" role="option" tabindex="-1" value="blue">
|
|
24
|
+
Blue
|
|
25
|
+
</button>
|
|
26
|
+
<button type="button" role="option" tabindex="-1" value="yellow">
|
|
27
|
+
Yellow
|
|
28
|
+
</button>
|
|
29
|
+
<button type="button" role="option" tabindex="-1" value="purple">
|
|
30
|
+
Purple
|
|
31
|
+
</button>
|
|
32
|
+
</div>
|
|
33
|
+
</form-listbox>
|
|
34
|
+
</form>
|
|
35
|
+
|
|
36
|
+
<!-- Declarative inline HTML example with groups -->
|
|
37
|
+
<form>
|
|
38
|
+
<form-listbox id="fruits">
|
|
39
|
+
<input type="hidden" name="fruit" />
|
|
40
|
+
<div role="listbox" aria-label="Fruits">
|
|
41
|
+
<div role="group" aria-labelledby="fruits-citrus">
|
|
42
|
+
<div role="presentation" id="fruits-citrus">Citrus</div>
|
|
43
|
+
<button type="button" role="option" tabindex="-1" value="orange">
|
|
44
|
+
Orange
|
|
45
|
+
</button>
|
|
46
|
+
<button type="button" role="option" tabindex="-1" value="lemon">
|
|
47
|
+
Lemon
|
|
48
|
+
</button>
|
|
49
|
+
<button type="button" role="option" tabindex="-1" value="lime">
|
|
50
|
+
Lime
|
|
51
|
+
</button>
|
|
52
|
+
</div>
|
|
53
|
+
<div role="group" aria-labelledby="fruits-berries">
|
|
54
|
+
<div role="presentation" id="fruits-berries">Berries</div>
|
|
55
|
+
<button type="button" role="option" tabindex="-1" value="strawberry">
|
|
56
|
+
Strawberry
|
|
57
|
+
</button>
|
|
58
|
+
<button type="button" role="option" tabindex="-1" value="blueberry">
|
|
59
|
+
Blueberry
|
|
60
|
+
</button>
|
|
61
|
+
<button type="button" role="option" tabindex="-1" value="raspberry">
|
|
62
|
+
Raspberry
|
|
63
|
+
</button>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</form-listbox>
|
|
67
|
+
</form>
|