@supersoniks/concorde 5.1.0 → 5.1.2
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/.agents/skills/concorde-docs/SKILL.md +153 -0
- package/.agents/skills/{concorde-component-docs/template.md → concorde-docs/templates/component.md} +6 -2
- package/.agents/skills/concorde-docs/templates/decorator.md +43 -0
- package/.agents/skills/concorde-docs/templates/guide.md +25 -0
- package/.claude/launch.json +15 -0
- package/.claude/vite.http.config.mjs +7 -0
- package/.taste-skill/after/desktop-fold.jpg +0 -0
- package/.taste-skill/after/desktop-page-01.jpg +0 -0
- package/.taste-skill/after/desktop-page-02.jpg +0 -0
- package/.taste-skill/after/desktop-page-03.jpg +0 -0
- package/.taste-skill/after/mobile-fold.jpg +0 -0
- package/.taste-skill/after/mobile-page-01.jpg +0 -0
- package/.taste-skill/after/report.json +4103 -0
- package/.taste-skill/after/tablet-fold.jpg +0 -0
- package/.taste-skill/after/tablet-page-01.jpg +0 -0
- package/.taste-skill/after/tablet-page-02.jpg +0 -0
- package/.taste-skill/before/desktop-fold.jpg +0 -0
- package/.taste-skill/before/desktop-page-01.jpg +0 -0
- package/.taste-skill/before/desktop-page-02.jpg +0 -0
- package/.taste-skill/before/mobile-fold.jpg +0 -0
- package/.taste-skill/before/mobile-page-01.jpg +0 -0
- package/.taste-skill/before/report.json +2556 -0
- package/.taste-skill/before/tablet-fold.jpg +0 -0
- package/.taste-skill/before/tablet-page-01.jpg +0 -0
- package/.taste-skill/direction.json +510 -0
- package/.taste-skill/notes.md +84 -0
- package/.taste-skill/prod/desktop-fold.jpg +0 -0
- package/.taste-skill/prod/desktop-page-01.jpg +0 -0
- package/.taste-skill/prod/desktop-page-02.jpg +0 -0
- package/.taste-skill/prod/desktop-page-03.jpg +0 -0
- package/.taste-skill/prod/mobile-fold.jpg +0 -0
- package/.taste-skill/prod/mobile-page-01.jpg +0 -0
- package/.taste-skill/prod/mobile-page-02.jpg +0 -0
- package/.taste-skill/prod/report.json +1973 -0
- package/.taste-skill/prod/tablet-fold.jpg +0 -0
- package/.taste-skill/prod/tablet-page-01.jpg +0 -0
- package/.taste-skill/prod/tablet-page-02.jpg +0 -0
- package/.tmp-cem/custom-elements.json +2013 -2013
- package/AUDIT.md +228 -0
- package/PLAN-AMELIORATION.md +220 -0
- package/PLAN-DOCS-AGENTS.md +80 -0
- package/README.md +3 -3
- package/ai/skills/concorde/SKILL.md +1 -1
- package/ai/skills/concorde-get-set-dp/SKILL.md +3 -3
- package/ai/skills/concorde-theme/SKILL.md +1 -1
- package/build-infos.json +1 -1
- package/concorde-core.bundle.js +16 -16
- package/concorde-core.es.js +235 -233
- package/dist/concorde-core.bundle.js +16 -16
- package/dist/concorde-core.es.js +235 -233
- package/dist/img/archive/concorde-001-2cv.webp +0 -0
- package/dist/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
- package/dist/img/archive/concorde-red-arrows-2002.webm +0 -0
- package/dist/img/archive/credits.json +28 -0
- package/docs/.htaccess +75 -0
- package/docs/404.html +15 -0
- package/docs/404.md +5 -0
- package/docs/assets/index-BgG6FFPt.js +11765 -0
- package/docs/assets/index-x89XINSG.css +1 -0
- package/docs/core/components/functional/date/date.html +211 -0
- package/docs/core/components/functional/date/date.md +150 -0
- package/docs/core/components/functional/fetch/fetch.html +180 -0
- package/docs/core/components/functional/fetch/fetch.md +108 -0
- package/docs/core/components/functional/if/if.html +65 -0
- package/docs/core/components/functional/if/if.md +34 -0
- package/docs/core/components/functional/jsonata/jsonata.html +110 -0
- package/docs/core/components/functional/jsonata/jsonata.md +61 -0
- package/docs/core/components/functional/list/list.html +198 -0
- package/docs/core/components/functional/list/list.md +121 -0
- package/docs/core/components/functional/mix/mix.html +78 -0
- package/docs/core/components/functional/mix/mix.md +46 -0
- package/docs/core/components/functional/queue/queue.html +155 -0
- package/docs/core/components/functional/queue/queue.md +51 -0
- package/docs/core/components/functional/router/router.html +154 -0
- package/docs/core/components/functional/router/router.md +93 -0
- package/docs/core/components/functional/sdui/sdui-extension-points.html +127 -0
- package/docs/core/components/functional/sdui/sdui-extension-points.md +94 -0
- package/docs/core/components/functional/sdui/sdui.html +397 -0
- package/docs/core/components/functional/sdui/sdui.md +307 -0
- package/docs/core/components/functional/states/states.html +141 -0
- package/docs/core/components/functional/states/states.md +112 -0
- package/docs/core/components/functional/submit/submit.html +178 -0
- package/docs/core/components/functional/submit/submit.md +106 -0
- package/docs/{crawl/core → core}/components/functional/subscriber/subscriber.html +6 -5
- package/docs/core/components/functional/subscriber/subscriber.md +91 -0
- package/docs/core/components/functional/translation/translation.html +60 -0
- package/docs/core/components/functional/translation/translation.md +38 -0
- package/docs/core/components/functional/value/value.html +81 -0
- package/docs/core/components/functional/value/value.md +47 -0
- package/docs/core/components/ui/alert/alert.html +201 -0
- package/docs/core/components/ui/alert/alert.md +186 -0
- package/docs/core/components/ui/alert-messages/alert-messages.html +132 -0
- package/docs/core/components/ui/alert-messages/alert-messages.md +85 -0
- package/docs/core/components/ui/badge/badge.html +197 -0
- package/docs/core/components/ui/badge/badge.md +181 -0
- package/docs/core/components/ui/button/button.html +309 -0
- package/docs/core/components/ui/button/button.md +216 -0
- package/docs/core/components/ui/captcha/captcha.html +80 -0
- package/docs/core/components/ui/captcha/captcha.md +56 -0
- package/docs/core/components/ui/card/card.html +254 -0
- package/docs/core/components/ui/card/card.md +215 -0
- package/docs/core/components/ui/divider/divider.html +144 -0
- package/docs/core/components/ui/divider/divider.md +126 -0
- package/docs/core/components/ui/form/checkbox/checkbox.html +200 -0
- package/docs/core/components/ui/form/checkbox/checkbox.md +125 -0
- package/docs/core/components/ui/form/fieldset/fieldset.html +238 -0
- package/docs/core/components/ui/form/fieldset/fieldset.md +161 -0
- package/docs/core/components/ui/form/form-actions/form-actions.html +122 -0
- package/docs/core/components/ui/form/form-actions/form-actions.md +98 -0
- package/docs/core/components/ui/form/form-layout/form-layout.html +115 -0
- package/docs/core/components/ui/form/form-layout/form-layout.md +109 -0
- package/docs/core/components/ui/form/input/input.html +235 -0
- package/docs/core/components/ui/form/input/input.md +142 -0
- package/docs/core/components/ui/form/radio/radio.html +144 -0
- package/docs/core/components/ui/form/radio/radio.md +78 -0
- package/docs/core/components/ui/form/select/select.html +178 -0
- package/docs/core/components/ui/form/select/select.md +86 -0
- package/docs/core/components/ui/form/switch/switch.html +146 -0
- package/docs/core/components/ui/form/switch/switch.md +80 -0
- package/docs/core/components/ui/form/textarea/textarea.html +162 -0
- package/docs/core/components/ui/form/textarea/textarea.md +82 -0
- package/docs/core/components/ui/group/group.html +113 -0
- package/docs/core/components/ui/group/group.md +77 -0
- package/docs/core/components/ui/icon/icon.html +223 -0
- package/docs/core/components/ui/icon/icon.md +214 -0
- package/docs/core/components/ui/image/image.html +194 -0
- package/docs/core/components/ui/image/image.md +167 -0
- package/docs/core/components/ui/link/link.html +101 -0
- package/docs/core/components/ui/link/link.md +81 -0
- package/docs/core/components/ui/loader/loader.html +114 -0
- package/docs/core/components/ui/loader/loader.md +87 -0
- package/docs/{crawl/core → core}/components/ui/menu/menu.html +189 -116
- package/docs/core/components/ui/menu/menu.md +370 -0
- package/docs/core/components/ui/modal/modal.html +324 -0
- package/docs/core/components/ui/modal/modal.md +211 -0
- package/docs/core/components/ui/pop/pop.html +250 -0
- package/docs/core/components/ui/pop/pop.md +216 -0
- package/docs/core/components/ui/progress/progress.html +132 -0
- package/docs/core/components/ui/progress/progress.md +109 -0
- package/docs/core/components/ui/table/table.html +333 -0
- package/docs/core/components/ui/table/table.md +267 -0
- package/docs/core/components/ui/theme/theme.html +116 -0
- package/docs/core/components/ui/theme/theme.md +97 -0
- package/docs/core/components/ui/toast/toast.html +185 -0
- package/docs/core/components/ui/toast/toast.md +147 -0
- package/docs/core/components/ui/tooltip/tooltip.html +112 -0
- package/docs/core/components/ui/tooltip/tooltip.md +89 -0
- package/docs/docs/decorators/ancestor-attribute.html +71 -0
- package/docs/docs/decorators/ancestor-attribute.md +59 -0
- package/docs/docs/decorators/auto-subscribe.html +61 -0
- package/docs/docs/decorators/auto-subscribe.md +40 -0
- package/docs/docs/decorators/bind.html +86 -0
- package/docs/docs/decorators/bind.md +77 -0
- package/docs/docs/decorators/get.html +166 -0
- package/docs/docs/decorators/get.md +160 -0
- package/docs/docs/decorators/handle.html +139 -0
- package/docs/docs/decorators/handle.md +119 -0
- package/docs/docs/decorators/on-assign.html +72 -0
- package/docs/docs/decorators/on-assign.md +63 -0
- package/docs/docs/decorators/patch.html +76 -0
- package/docs/docs/decorators/patch.md +44 -0
- package/docs/docs/decorators/post.html +150 -0
- package/docs/docs/decorators/post.md +134 -0
- package/docs/docs/decorators/publish.html +74 -0
- package/docs/docs/decorators/publish.md +56 -0
- package/docs/docs/decorators/put.html +83 -0
- package/docs/docs/decorators/put.md +51 -0
- package/docs/docs/decorators/subscribe.html +91 -0
- package/docs/docs/decorators/subscribe.md +87 -0
- package/docs/docs/decorators/wait-for-ancestors.html +82 -0
- package/docs/docs/decorators/wait-for-ancestors.md +76 -0
- package/docs/docs/directives/sub.html +79 -0
- package/docs/docs/directives/sub.md +75 -0
- package/docs/docs/directives/t.html +91 -0
- package/docs/docs/directives/t.md +73 -0
- package/docs/{crawl/docs/_getting-started → docs/getting-started}/ai-agents.html +12 -11
- package/{src/docs/_getting-started → docs/docs/getting-started}/ai-agents.md +3 -3
- package/docs/docs/getting-started/components.html +27 -0
- package/docs/docs/getting-started/components.md +5 -0
- package/docs/{crawl/docs/_getting-started → docs/getting-started}/create-a-component.html +11 -14
- package/docs/{src/docs/_getting-started → docs/getting-started}/create-a-component.md +3 -6
- package/docs/{crawl/docs/_core-concept → docs/getting-started}/dataFlow.html +26 -29
- package/docs/{src/docs/_core-concept → docs/getting-started}/dataFlow.md +17 -18
- package/docs/docs/getting-started/installation.html +69 -0
- package/docs/docs/getting-started/installation.md +36 -0
- package/docs/{crawl/docs/_getting-started → docs/getting-started}/my-first-component.html +13 -22
- package/docs/{src/docs/_getting-started → docs/getting-started}/my-first-component.md +5 -14
- package/docs/docs/getting-started/start.html +47 -0
- package/{src/docs/_getting-started → docs/docs/getting-started}/start.md +1 -13
- package/docs/docs/getting-started/theming.html +334 -0
- package/{src/docs/_getting-started → docs/docs/getting-started}/theming.md +2 -2
- package/docs/docs/index.html +99 -0
- package/docs/{crawl/docs/_misc → docs/misc}/api-configuration.html +18 -18
- package/docs/{src/docs/_misc → docs/misc}/api-configuration.md +10 -12
- package/docs/{crawl/docs/_misc → docs/misc}/dataProviderKey.html +12 -11
- package/{src/docs/_misc → docs/docs/misc}/dataProviderKey.md +4 -4
- package/docs/{crawl/docs/_misc → docs/misc}/docs-mock-api.html +25 -28
- package/docs/{src/docs/_misc → docs/misc}/docs-mock-api.md +12 -13
- package/docs/{crawl/docs/_misc → docs/misc}/dynamic-path.html +16 -15
- package/{src/docs/_misc → docs/docs/misc}/dynamic-path.md +8 -8
- package/docs/{crawl/docs/_misc → docs/misc}/endpoint.html +16 -15
- package/{src/docs/_misc → docs/docs/misc}/endpoint.md +8 -8
- package/docs/{crawl/docs/_misc → docs/misc}/html-integration.html +12 -15
- package/docs/{src/docs/_misc → docs/misc}/html-integration.md +4 -5
- package/docs/docs-mock-api-sw.js +60 -223
- package/docs/docs-mock-api-sw.js.map +4 -4
- package/docs/hubs/decorators.html +443 -0
- package/docs/hubs/form-components.html +404 -0
- package/docs/hubs/remote-data.html +371 -0
- package/docs/img/archive/concorde-001-2cv.webp +0 -0
- package/docs/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
- package/docs/img/archive/concorde-red-arrows-2002.webm +0 -0
- package/docs/img/archive/credits.json +28 -0
- package/docs/img/concorde/plane_01.jpg +0 -0
- package/docs/img/concorde/plane_02.jpg +0 -0
- package/docs/img/concorde/plane_03.jpg +0 -0
- package/docs/img/concorde/plane_04.jpg +0 -0
- package/docs/img/concorde/plane_05.jpg +0 -0
- package/docs/img/concorde/plane_06.jpg +0 -0
- package/docs/img/concorde/plane_07.jpg +0 -0
- package/docs/img/concorde/plane_08.jpg +0 -0
- package/docs/img/concorde/plane_09.jpg +0 -0
- package/docs/img/concorde/plane_10.jpg +0 -0
- package/docs/img/concorde/plane_11.jpg +0 -0
- package/docs/img/concorde/plane_12.jpg +0 -0
- package/docs/img/concorde/plane_13.jpg +0 -0
- package/docs/index.html +96 -67
- package/docs/index.md +22 -0
- package/docs/llms-full.txt +3329 -3295
- package/docs/llms.txt +94 -92
- package/docs/robots.txt +11 -10
- package/docs/sitemap.xml +78 -78
- package/docs/src/core/components/functional/date/date.md +91 -231
- package/docs/src/core/components/functional/fetch/fetch.md +66 -83
- package/docs/src/core/components/functional/if/if.md +28 -3
- package/docs/src/core/components/functional/jsonata/jsonata.md +42 -37
- package/docs/src/core/components/functional/list/list.md +99 -43
- package/docs/src/core/components/functional/mix/mix.md +31 -26
- package/docs/src/core/components/functional/queue/queue.md +40 -61
- package/docs/src/core/components/functional/router/router.md +64 -65
- package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
- package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
- package/docs/src/core/components/functional/sdui/example.json +19 -86
- package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
- package/docs/src/core/components/functional/sdui/sdui.md +196 -245
- package/docs/src/core/components/functional/states/states.md +86 -61
- package/docs/src/core/components/functional/submit/submit.md +64 -72
- package/docs/src/core/components/functional/translation/translation.md +38 -0
- package/docs/src/core/components/functional/value/value.md +34 -22
- package/docs/src/core/components/ui/alert/alert.md +139 -74
- package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
- package/docs/src/core/components/ui/badge/badge.md +137 -83
- package/docs/src/core/components/ui/button/button.md +139 -105
- package/docs/src/core/components/ui/captcha/captcha.md +50 -6
- package/docs/src/core/components/ui/card/card.md +183 -65
- package/docs/src/core/components/ui/divider/divider.md +104 -13
- package/docs/src/core/components/ui/form/checkbox/checkbox.md +90 -42
- package/docs/src/core/components/ui/form/fieldset/fieldset.md +135 -103
- package/docs/src/core/components/ui/form/form-actions/form-actions.md +71 -50
- package/docs/src/core/components/ui/form/form-layout/form-layout.md +99 -34
- package/docs/src/core/components/ui/form/input/input.md +95 -95
- package/docs/src/core/components/ui/form/radio/radio.md +55 -34
- package/docs/src/core/components/ui/form/select/select.md +60 -45
- package/docs/src/core/components/ui/form/switch/switch.md +57 -34
- package/docs/src/core/components/ui/form/textarea/textarea.md +55 -38
- package/docs/src/core/components/ui/group/group.md +49 -47
- package/docs/src/core/components/ui/icon/icon.md +132 -43
- package/docs/src/core/components/ui/image/image.md +132 -72
- package/docs/src/core/components/ui/link/link.md +46 -8
- package/docs/src/core/components/ui/loader/loader.md +55 -23
- package/docs/src/core/components/ui/menu/menu.md +155 -114
- package/docs/src/core/components/ui/modal/modal.md +154 -62
- package/docs/src/core/components/ui/pop/pop.md +185 -65
- package/docs/src/core/components/ui/progress/progress.md +76 -30
- package/docs/src/core/components/ui/table/table.md +146 -334
- package/docs/src/core/components/ui/theme/theme.md +97 -0
- package/docs/src/core/components/ui/toast/toast.md +80 -99
- package/docs/src/core/components/ui/tooltip/tooltip.md +52 -45
- package/docs/src/docs/decorators/ancestor-attribute.md +59 -0
- package/docs/src/docs/decorators/auto-subscribe.md +40 -0
- package/docs/src/docs/decorators/bind.md +77 -0
- package/docs/src/docs/decorators/get.md +160 -0
- package/docs/src/docs/decorators/handle.md +119 -0
- package/docs/src/docs/decorators/on-assign.md +63 -0
- package/docs/src/docs/decorators/patch.md +44 -0
- package/docs/src/docs/decorators/post.md +134 -0
- package/docs/src/docs/decorators/publish.md +56 -0
- package/docs/src/docs/decorators/put.md +51 -0
- package/docs/src/docs/decorators/subscribe.md +87 -0
- package/docs/src/docs/decorators/wait-for-ancestors.md +76 -0
- package/docs/src/docs/directives/sub.md +75 -0
- package/docs/src/docs/directives/t.md +73 -0
- package/docs/src/docs/{_getting-started → getting-started}/ai-agents.md +3 -3
- package/docs/src/docs/getting-started/components.md +5 -0
- package/{src/docs/_getting-started → docs/src/docs/getting-started}/create-a-component.md +3 -6
- package/{src/docs/_core-concept → docs/src/docs/getting-started}/dataFlow.md +17 -18
- package/docs/src/docs/getting-started/installation.md +36 -0
- package/{src/docs/_getting-started → docs/src/docs/getting-started}/my-first-component.md +5 -14
- package/docs/src/docs/getting-started/start.md +35 -0
- package/docs/src/docs/getting-started/theming.md +253 -0
- package/{src/docs/_misc → docs/src/docs/misc}/api-configuration.md +10 -12
- package/docs/src/docs/{_misc → misc}/dataProviderKey.md +4 -4
- package/{src/docs/_misc → docs/src/docs/misc}/docs-mock-api.md +12 -13
- package/docs/src/docs/{_misc → misc}/dynamic-path.md +8 -8
- package/docs/src/docs/{_misc → misc}/endpoint.md +8 -8
- package/{src/docs/_misc → docs/src/docs/misc}/html-integration.md +4 -5
- package/docs/src/docs/search/docs-search.json +3729 -2949
- package/docs/src/tsconfig.json +176 -5
- package/index.html +94 -67
- package/package.json +11 -4
- package/public/docs-mock-api-sw.js +58 -223
- package/public/docs-mock-api-sw.js.map +4 -4
- package/public/img/archive/concorde-001-2cv.webp +0 -0
- package/public/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
- package/public/img/archive/concorde-red-arrows-2002.webm +0 -0
- package/public/img/archive/credits.json +28 -0
- package/public/img/concorde/plane_01.jpg +0 -0
- package/public/img/concorde/plane_02.jpg +0 -0
- package/public/img/concorde/plane_03.jpg +0 -0
- package/public/img/concorde/plane_04.jpg +0 -0
- package/public/img/concorde/plane_05.jpg +0 -0
- package/public/img/concorde/plane_06.jpg +0 -0
- package/public/img/concorde/plane_07.jpg +0 -0
- package/public/img/concorde/plane_08.jpg +0 -0
- package/public/img/concorde/plane_09.jpg +0 -0
- package/public/img/concorde/plane_10.jpg +0 -0
- package/public/img/concorde/plane_11.jpg +0 -0
- package/public/img/concorde/plane_12.jpg +0 -0
- package/public/img/concorde/plane_13.jpg +0 -0
- package/public/robots.txt +11 -10
- package/scripts/docs-markdown-vite-plugin.ts +37 -0
- package/scripts/docs-public-url.mjs +50 -0
- package/scripts/docs.htaccess +75 -0
- package/scripts/generate-crawl-docs.mjs +207 -116
- package/scripts/generate-crawl-docs.test.mjs +124 -0
- package/scripts/post-build-docs.js +34 -50
- package/scripts/post-build.mjs +0 -0
- package/src/core/components/functional/date/date.md +91 -231
- package/src/core/components/functional/fetch/fetch.md +66 -83
- package/src/core/components/functional/if/if.md +28 -3
- package/src/core/components/functional/if/if.ts +0 -0
- package/src/core/components/functional/jsonata/jsonata.md +42 -37
- package/src/core/components/functional/list/list.demo.ts +0 -0
- package/src/core/components/functional/list/list.md +99 -43
- package/src/core/components/functional/mix/mix.md +31 -26
- package/src/core/components/functional/queue/queue.demo.ts +10 -7
- package/src/core/components/functional/queue/queue.md +40 -61
- package/src/core/components/functional/router/router.demo.ts +16 -16
- package/src/core/components/functional/router/router.md +64 -65
- package/src/core/components/functional/router/router.ts +0 -0
- package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
- package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
- package/src/core/components/functional/sdui/component-catalog.json +1 -1
- package/src/core/components/functional/sdui/example.json +19 -86
- package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
- package/src/core/components/functional/sdui/sdui.md +187 -358
- package/src/core/components/functional/sdui/types.ts +0 -0
- package/src/core/components/functional/states/states.demo.ts +21 -22
- package/src/core/components/functional/states/states.md +86 -61
- package/src/core/components/functional/states/states.ts +1 -1
- package/src/core/components/functional/submit/submit.md +64 -72
- package/src/core/components/functional/subscriber/subscriber.ts +0 -0
- package/src/core/components/functional/translation/translation.md +38 -0
- package/src/core/components/functional/value/value.md +34 -22
- package/src/core/components/functional/value/value.ts +0 -0
- package/src/core/components/ui/_css/size.ts +0 -0
- package/src/core/components/ui/alert/alert.md +48 -58
- package/src/core/components/ui/badge/badge.md +27 -34
- package/src/core/components/ui/button/button.md +139 -106
- package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
- package/src/core/components/ui/captcha/captcha.md +17 -32
- package/src/core/components/ui/card/card.md +6 -6
- package/src/core/components/ui/divider/divider.md +8 -11
- package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
- package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
- package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
- package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
- package/src/core/components/ui/form/input/input.md +95 -95
- package/src/core/components/ui/form/radio/radio.md +55 -34
- package/src/core/components/ui/form/select/select.md +60 -45
- package/src/core/components/ui/form/switch/switch.md +57 -34
- package/src/core/components/ui/form/textarea/textarea.md +55 -38
- package/src/core/components/ui/group/group.md +35 -33
- package/src/core/components/ui/icon/icon.md +4 -4
- package/src/core/components/ui/image/image.md +41 -107
- package/src/core/components/ui/link/link.md +6 -6
- package/src/core/components/ui/loader/loader.md +30 -55
- package/src/core/components/ui/menu/menu.md +27 -27
- package/src/core/components/ui/modal/modal.md +72 -96
- package/src/core/components/ui/modal/modal.ts +14 -11
- package/src/core/components/ui/pop/pop.md +80 -158
- package/src/core/components/ui/progress/progress.md +2 -2
- package/src/core/components/ui/table/table.md +91 -255
- package/src/core/components/ui/theme/theme.md +11 -36
- package/src/core/components/ui/toast/toast.md +48 -117
- package/src/core/components/ui/tooltip/tooltip.md +27 -62
- package/src/core/mixins/Subscriber.ts +0 -0
- package/src/core/utils/DataBindObserver.ts +0 -0
- package/src/core/utils/LocationHandler.spec.ts +80 -0
- package/src/core/utils/LocationHandler.ts +5 -9
- package/src/core/utils/Objects.ts +0 -0
- package/src/core/utils/route.ts +0 -0
- package/src/docs/code.ts +88 -75
- package/src/docs/components/docs-demo-sources.ts +70 -147
- package/src/docs/components/docs-lit-demo.ts +20 -40
- package/src/docs/components/docs-source-link.ts +0 -82
- package/src/docs/decorators/ancestor-attribute.md +59 -0
- package/src/docs/decorators/auto-subscribe.md +40 -0
- package/src/docs/decorators/bind.md +77 -0
- package/src/docs/decorators/get.md +160 -0
- package/src/docs/decorators/handle.md +119 -0
- package/src/docs/decorators/on-assign.md +63 -0
- package/src/docs/decorators/patch.md +44 -0
- package/src/docs/decorators/post.md +134 -0
- package/src/docs/decorators/publish.md +56 -0
- package/src/docs/decorators/put.md +51 -0
- package/src/docs/decorators/subscribe.md +87 -0
- package/src/docs/decorators/wait-for-ancestors.md +76 -0
- package/src/docs/directives/sub.md +75 -0
- package/src/docs/directives/t.md +73 -0
- package/src/docs/docs-location.spec.ts +46 -0
- package/src/docs/docs-location.ts +123 -32
- package/src/docs/docs.ts +6 -2
- package/src/docs/example/decorators-demo-bind-demos.ts +81 -116
- package/src/docs/example/decorators-demo-geo.ts +30 -19
- package/src/docs/example/decorators-demo-post.ts +88 -186
- package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
- package/src/docs/example/decorators-demo.ts +85 -98
- package/src/docs/example/docs-api-config-demos.ts +19 -20
- package/src/docs/example/docs-boarding-pass-demo.ts +134 -0
- package/src/docs/example/docs-flight-demos.ts +147 -0
- package/src/docs/example/docs-jsonata-demos.ts +52 -52
- package/src/docs/example/docs-list-demos.ts +43 -123
- package/src/docs/example/docs-provider-keys.ts +33 -28
- package/src/docs/example/docs-queue-demos.ts +37 -77
- package/src/docs/example/docs-router-demos.ts +20 -25
- package/src/docs/example/docs-submit-demos.ts +48 -48
- package/src/docs/example/docs-toggle-demos.ts +4 -3
- package/src/docs/example/users.ts +0 -0
- package/src/docs/getting-started/ai-agents.md +76 -0
- package/src/docs/getting-started/components.md +5 -0
- package/src/docs/getting-started/create-a-component.md +136 -0
- package/src/docs/getting-started/dataFlow.md +87 -0
- package/src/docs/getting-started/installation.md +36 -0
- package/src/docs/getting-started/my-first-component.md +227 -0
- package/src/docs/getting-started/start.md +35 -0
- package/src/docs/getting-started/theming.md +253 -0
- package/src/docs/header/header.ts +240 -71
- package/src/docs/home/catalog.ts +44 -0
- package/src/docs/home/home.ts +520 -0
- package/src/docs/home/mach-stage.ts +389 -0
- package/src/docs/layout.ts +12 -11
- package/src/docs/misc/api-configuration.md +79 -0
- package/src/docs/misc/dataProviderKey.md +168 -0
- package/src/docs/misc/docs-mock-api.md +62 -0
- package/src/docs/misc/dynamic-path.md +71 -0
- package/src/docs/misc/endpoint.md +45 -0
- package/src/docs/misc/html-integration.md +14 -0
- package/src/docs/mock-api/api-config-mock.ts +5 -0
- package/src/docs/mock-api/fixtures.ts +0 -278
- package/src/docs/mock-api/flights.ts +89 -0
- package/src/docs/mock-api/router.ts +3 -4
- package/src/docs/mock-api/urls.ts +1 -2
- package/src/docs/navigation/components-index.ts +56 -0
- package/src/docs/navigation/navigation.ts +219 -232
- package/src/docs/navigation/pager.ts +67 -0
- package/src/docs/navigation/toc.ts +101 -0
- package/src/docs/search/docs-search.json +2419 -4374
- package/src/docs/search/markdown-renderer.ts +33 -7
- package/src/docs/search/page.ts +9 -6
- package/src/docs/search/search.ts +154 -122
- package/src/docs/shiki/index.ts +109 -0
- package/src/docs/tailwind/css/base/scrollbar.css +22 -0
- package/src/docs/tailwind/css/base/theme.css +96 -0
- package/src/docs/tailwind/css/base/typography.css +4 -0
- package/src/docs/tailwind/css/docs/boarding-pass.css +65 -0
- package/src/docs/tailwind/css/docs/content.css +32 -0
- package/src/docs/tailwind/css/docs/page.css +10 -0
- package/src/docs/tailwind/css/docs.css +9 -0
- package/src/docs/tailwind/css/home/hero.css +210 -0
- package/src/docs/tailwind/css/home/motion.css +84 -0
- package/src/docs/tailwind/css/home/sections.css +416 -0
- package/src/docs/tailwind/css/tailwind.css +7 -185
- package/src/tsconfig.json +23 -2
- package/src/tsconfig.tsbuildinfo +1 -1
- package/tailwind.config.js +8 -4
- package/vite.config.mts +11 -2
- package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
- package/.github/workflows/ci.yml +0 -21
- package/.github-export-ignore +0 -30
- package/CONTRIBUTING.md +0 -59
- package/DEV.md +0 -54
- package/LICENSE +0 -21
- package/OPEN_SOURCE_CHECKPOINT.md +0 -133
- package/concorde-3d.bundle.js +0 -3960
- package/concorde-3d.es.js +0 -33433
- package/concorde-hugging-face-infer.bundle.js +0 -32
- package/concorde-hugging-face-infer.es.js +0 -2952
- package/concorde-interactive.bundle.js +0 -1157
- package/concorde-interactive.es.js +0 -10734
- package/concorde-shader.bundle.js +0 -116
- package/concorde-shader.es.js +0 -8353
- package/concorde-webgpu.bundle.js +0 -307
- package/concorde-webgpu.es.js +0 -8627
- package/docs/assets/index-D8MVWqY6.js +0 -12251
- package/docs/assets/index-DiD0qYvE.css +0 -1
- package/docs/crawl/core/components/functional/date/date.html +0 -190
- package/docs/crawl/core/components/functional/fetch/fetch.html +0 -109
- package/docs/crawl/core/components/functional/if/if.html +0 -27
- package/docs/crawl/core/components/functional/jsonata/jsonata.html +0 -79
- package/docs/crawl/core/components/functional/list/list.html +0 -70
- package/docs/crawl/core/components/functional/mix/mix.html +0 -45
- package/docs/crawl/core/components/functional/queue/queue.html +0 -96
- package/docs/crawl/core/components/functional/router/router.html +0 -106
- package/docs/crawl/core/components/functional/sdui/sdui.html +0 -269
- package/docs/crawl/core/components/functional/states/states.html +0 -66
- package/docs/crawl/core/components/functional/submit/submit.html +0 -160
- package/docs/crawl/core/components/functional/value/value.html +0 -51
- package/docs/crawl/core/components/ui/alert/alert.html +0 -110
- package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +0 -23
- package/docs/crawl/core/components/ui/badge/badge.html +0 -119
- package/docs/crawl/core/components/ui/button/button.html +0 -149
- package/docs/crawl/core/components/ui/captcha/captcha.html +0 -30
- package/docs/crawl/core/components/ui/card/card.html +0 -99
- package/docs/crawl/core/components/ui/divider/divider.html +0 -58
- package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +0 -73
- package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +0 -135
- package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +0 -79
- package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +0 -62
- package/docs/crawl/core/components/ui/form/input/input.html +0 -109
- package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +0 -38
- package/docs/crawl/core/components/ui/form/radio/radio.html +0 -56
- package/docs/crawl/core/components/ui/form/select/select.html +0 -73
- package/docs/crawl/core/components/ui/form/switch/switch.html +0 -56
- package/docs/crawl/core/components/ui/form/textarea/textarea.html +0 -59
- package/docs/crawl/core/components/ui/group/group.html +0 -82
- package/docs/crawl/core/components/ui/icon/icon.html +0 -133
- package/docs/crawl/core/components/ui/image/image.html +0 -110
- package/docs/crawl/core/components/ui/link/link.html +0 -42
- package/docs/crawl/core/components/ui/loader/loader.html +0 -50
- package/docs/crawl/core/components/ui/modal/modal.html +0 -117
- package/docs/crawl/core/components/ui/pop/pop.html +0 -102
- package/docs/crawl/core/components/ui/progress/progress.html +0 -58
- package/docs/crawl/core/components/ui/table/table.html +0 -413
- package/docs/crawl/core/components/ui/toast/toast.html +0 -122
- package/docs/crawl/core/components/ui/tooltip/tooltip.html +0 -79
- package/docs/crawl/docs/_core-concept/overview.html +0 -66
- package/docs/crawl/docs/_core-concept/subscriber.html +0 -75
- package/docs/crawl/docs/_decorators/ancestor-attribute.html +0 -116
- package/docs/crawl/docs/_decorators/auto-subscribe.html +0 -202
- package/docs/crawl/docs/_decorators/bind.html +0 -141
- package/docs/crawl/docs/_decorators/get.html +0 -149
- package/docs/crawl/docs/_decorators/handle.html +0 -165
- package/docs/crawl/docs/_decorators/on-assign.html +0 -355
- package/docs/crawl/docs/_decorators/patch.html +0 -78
- package/docs/crawl/docs/_decorators/post.html +0 -139
- package/docs/crawl/docs/_decorators/publish.html +0 -61
- package/docs/crawl/docs/_decorators/put.html +0 -78
- package/docs/crawl/docs/_decorators/subscribe.html +0 -109
- package/docs/crawl/docs/_decorators/wait-for-ancestors.html +0 -137
- package/docs/crawl/docs/_directives/sub.html +0 -93
- package/docs/crawl/docs/_getting-started/concorde-manual-install.html +0 -100
- package/docs/crawl/docs/_getting-started/concorde-outside.html +0 -58
- package/docs/crawl/docs/_getting-started/my-first-subscriber.html +0 -110
- package/docs/crawl/docs/_getting-started/pubsub.html +0 -62
- package/docs/crawl/docs/_getting-started/start.html +0 -76
- package/docs/crawl/docs/_getting-started/theming.html +0 -85
- package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +0 -138
- package/docs/crawl/hubs/decorators.html +0 -547
- package/docs/crawl/hubs/form-components.html +0 -359
- package/docs/crawl/hubs/remote-data.html +0 -452
- package/docs/crawl/index.html +0 -101
- package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
- package/docs/src/docs/_core-concept/overview.md +0 -57
- package/docs/src/docs/_core-concept/subscriber.md +0 -75
- package/docs/src/docs/_decorators/ancestor-attribute.md +0 -127
- package/docs/src/docs/_decorators/auto-subscribe.md +0 -202
- package/docs/src/docs/_decorators/bind.md +0 -167
- package/docs/src/docs/_decorators/get.md +0 -162
- package/docs/src/docs/_decorators/handle.md +0 -175
- package/docs/src/docs/_decorators/on-assign.md +0 -390
- package/docs/src/docs/_decorators/patch.md +0 -70
- package/docs/src/docs/_decorators/post.md +0 -146
- package/docs/src/docs/_decorators/publish.md +0 -55
- package/docs/src/docs/_decorators/put.md +0 -70
- package/docs/src/docs/_decorators/subscribe.md +0 -100
- package/docs/src/docs/_decorators/wait-for-ancestors.md +0 -163
- package/docs/src/docs/_directives/sub.md +0 -91
- package/docs/src/docs/_getting-started/concorde-manual-install.md +0 -133
- package/docs/src/docs/_getting-started/concorde-outside.md +0 -33
- package/docs/src/docs/_getting-started/my-first-subscriber.md +0 -120
- package/docs/src/docs/_getting-started/pubsub.md +0 -37
- package/docs/src/docs/_getting-started/start.md +0 -47
- package/docs/src/docs/_getting-started/theming.md +0 -91
- package/docs/src/docs/_misc/formelement-subscriber-removal.md +0 -115
- package/docs/src/tsconfig.declarations.json +0 -22
- package/docs/src/tsconfig.emit.json +0 -23
- package/gitlab/job_github_mirror.sh +0 -39
- package/scripts/github-export.mjs +0 -150
- package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
- package/src/css.d.ts +0 -19
- package/src/docs/_core-concept/overview.md +0 -57
- package/src/docs/_core-concept/subscriber.md +0 -75
- package/src/docs/_decorators/ancestor-attribute.md +0 -128
- package/src/docs/_decorators/auto-subscribe.md +0 -202
- package/src/docs/_decorators/bind.md +0 -167
- package/src/docs/_decorators/get.md +0 -162
- package/src/docs/_decorators/handle.md +0 -175
- package/src/docs/_decorators/on-assign.md +0 -390
- package/src/docs/_decorators/patch.md +0 -70
- package/src/docs/_decorators/post.md +0 -146
- package/src/docs/_decorators/publish.md +0 -55
- package/src/docs/_decorators/put.md +0 -70
- package/src/docs/_decorators/subscribe.md +0 -100
- package/src/docs/_decorators/wait-for-ancestors.md +0 -163
- package/src/docs/_directives/sub.md +0 -91
- package/src/docs/_getting-started/concorde-manual-install.md +0 -133
- package/src/docs/_getting-started/concorde-outside.md +0 -33
- package/src/docs/_getting-started/my-first-subscriber.md +0 -120
- package/src/docs/_getting-started/pubsub.md +0 -37
- package/src/docs/_misc/formelement-subscriber-removal.md +0 -115
- package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
- package/src/docs/example/docs-joke-demos.ts +0 -297
- package/src/docs/prism/index.ts +0 -6
- package/src/docs/prism/prism.css +0 -158
- package/src/docs/prism/prism.js +0 -1022
- package/src/tsconfig.declarations.json +0 -22
- package/src/tsconfig.emit.json +0 -23
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Creating components
|
|
2
|
+
|
|
3
|
+
> **New app components:** start with [My first component](/docs/getting-started/my-first-component) and [Data flow](/docs/getting-started/dataFlow). The `Subscriber` mixin below is legacy.
|
|
4
|
+
|
|
5
|
+
## Where to put it?
|
|
6
|
+
|
|
7
|
+
In this document, we consider the src directory of the project as the root.<br>
|
|
8
|
+
We describe how we organize our components as an example, however it depends on your project.
|
|
9
|
+
|
|
10
|
+
In concorde each component is currently organized in the following directory structure (at least we try):
|
|
11
|
+
|
|
12
|
+
- **/core/components/functional/component-name/component-name.ts**
|
|
13
|
+
Generic/functional/generally unstyled component.
|
|
14
|
+
The component usually doesn't use any other concrete components.
|
|
15
|
+
- **/core/components/ui/component-name/component-name.ts**
|
|
16
|
+
Generic but UI-oriented component.
|
|
17
|
+
The component usually only uses generic components and other UI components.
|
|
18
|
+
- **la-billetterie/components/atoms/component-name/component-name.ts**
|
|
19
|
+
The component is intended to have a concrete usage within our ticketing system **"la-billetterie"**.
|
|
20
|
+
It usually only uses generic components from `core` and possibly other atoms.
|
|
21
|
+
- **la-billetterie/components/concrete-destination/component-name/component-name.ts**
|
|
22
|
+
The component has a specific destination: (event / cart / gift card): `/components/destination/`
|
|
23
|
+
The component uses various components, usually from the `/components/atoms` directory.
|
|
24
|
+
It does not use components at the same level in the file hierarchy.
|
|
25
|
+
|
|
26
|
+
## Starting from a Simple Model
|
|
27
|
+
|
|
28
|
+
You can copy `example.ts` from the source to the desired destination to start with.
|
|
29
|
+
This file contains a web component in the form of a class that extends the `Subscriber` mixin, with a reactive property and a render function.
|
|
30
|
+
|
|
31
|
+
<sonic-code language="javascript">
|
|
32
|
+
<template>
|
|
33
|
+
import { html, LitElement } from "lit";
|
|
34
|
+
import { customElement, property } from "lit/decorators.js";
|
|
35
|
+
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
36
|
+
|
|
37
|
+
@customElement("sonic-example")
|
|
38
|
+
export class SonicComponent extends Subscriber(LitElement) {
|
|
39
|
+
@property() text = "Example";
|
|
40
|
+
render() {
|
|
41
|
+
return html`${this.text}`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
</template>
|
|
45
|
+
</sonic-code>
|
|
46
|
+
|
|
47
|
+
**You can remove the dependency on `Subscriber`** if automatic population of the component with external data is not required.
|
|
48
|
+
For example, for a UI component:
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
<sonic-code language="javascript">
|
|
52
|
+
<template>
|
|
53
|
+
import { html, LitElement } from "lit";
|
|
54
|
+
import { customElement, property } from "lit/decorators.js";
|
|
55
|
+
|
|
56
|
+
@customElement("sonic-example")
|
|
57
|
+
export class SonicComponent extends LitElement {
|
|
58
|
+
@property() text = "Example";
|
|
59
|
+
render() {
|
|
60
|
+
return html`${this.text}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
</template>
|
|
64
|
+
</sonic-code>
|
|
65
|
+
|
|
66
|
+
Regarding data sharing, see [Data flow](/docs/getting-started/dataFlow).
|
|
67
|
+
|
|
68
|
+
### Naming the Component
|
|
69
|
+
|
|
70
|
+
The class name is not necessarily important. However, it is important to **give it a component name prefixed with "sonic"** (or a prefix of your own) using the dedicated metadata already present in the copied document. For example, a button component would be named as follows:
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
<sonic-code language="typescript">
|
|
74
|
+
<template>
|
|
75
|
+
@customElement("sonic-button")
|
|
76
|
+
</template>
|
|
77
|
+
</sonic-code>
|
|
78
|
+
|
|
79
|
+
For less generic components with a specific destination, we advise to include the destination in the name.
|
|
80
|
+
For example, for a "title" component in the "event" destination, the name would be simply:
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
<sonic-code language="typescript">
|
|
84
|
+
<template>
|
|
85
|
+
@customElement("sonic-event-title")
|
|
86
|
+
</template>
|
|
87
|
+
</sonic-code>
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
## Modifying It
|
|
91
|
+
|
|
92
|
+
#### Creating Reactive Properties and Modifying the Render Function
|
|
93
|
+
|
|
94
|
+
To do this, study the functioning of https://lit.dev and also refer to [Data flow](/docs/getting-started/dataFlow).
|
|
95
|
+
|
|
96
|
+
#### HTML Structure of a Component
|
|
97
|
+
|
|
98
|
+
The HTML structure of a component should remain as simple as possible.
|
|
99
|
+
|
|
100
|
+
Ideally, there should be only one additional level of elements in addition to slots.
|
|
101
|
+
|
|
102
|
+
- **The main component is already a wrapper**.
|
|
103
|
+
It receives classes to manage its layout, but it should not style internal elements.
|
|
104
|
+
- **Slots handle the visual organization** of elements.
|
|
105
|
+
- **The specificity of the component is expressed in this additional level** by adding a list, a functional native element (e.g., button), or another component.
|
|
106
|
+
|
|
107
|
+
This leads to the creation of more components and thus raises questions about the hierarchical organization of files. However, this tends to atomize their roles.
|
|
108
|
+
|
|
109
|
+
## Referencing It
|
|
110
|
+
|
|
111
|
+
To compile the component, it needs to be referenced somewhere through an import statement. In particular, it is important to reference it in any component that uses it.
|
|
112
|
+
|
|
113
|
+
In the case where it can be directly used in a page, it should also be globally referenced, especially considering the creation of **specific bundles** in the future.
|
|
114
|
+
|
|
115
|
+
Here's where we add imports based on the component's location inside concorde as an example
|
|
116
|
+
|
|
117
|
+
- **/core/components/functional/component-name/component-name.ts**
|
|
118
|
+
In `/core/components/functional/functional.ts`, which is referenced in core.ts and imported in `index.ts`.
|
|
119
|
+
- **/core/components/ui/component-name/component-name.ts**
|
|
120
|
+
In `/core/components/ui/ui.ts`, which is referenced in core.ts and imported in `index.ts`.
|
|
121
|
+
- **la-billetterie/components/atoms/component-name/component-name.ts**
|
|
122
|
+
Nowhere else but where it will be used, except for possible **temporary** tests, for example, in `index.ts`.
|
|
123
|
+
- **la-billetterie/components/concrete-destination/component-name/component-name.ts**
|
|
124
|
+
In `la-billetterie/components/concrete-destination/destination-concrete.ts`.
|
|
125
|
+
If it's a new destination, you'll need to create the corresponding import .ts file and import it in `la-billetterie.ts`.
|
|
126
|
+
|
|
127
|
+
## Using It
|
|
128
|
+
|
|
129
|
+
As a reminder, the component is simply integrated into the context by adding a tag with the component's name, for example:
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
<sonic-code language="html">
|
|
133
|
+
<template>
|
|
134
|
+
<sonic-event-title></sonic-event-title>
|
|
135
|
+
</template>
|
|
136
|
+
</sonic-code>
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Data flow
|
|
2
|
+
|
|
3
|
+
Recommended patterns for new Concorde apps (Lit + TypeScript). Under the hood, data lives in a **DataProvider** store.
|
|
4
|
+
|
|
5
|
+
## Quick map
|
|
6
|
+
|
|
7
|
+
| Need | Use |
|
|
8
|
+
|------|-----|
|
|
9
|
+
| Read/write in code | `get` / `set` / `dp` + `DataProviderKey` (static paths only) |
|
|
10
|
+
| Reactive Lit template | `sub(key)` or `@subscribe` |
|
|
11
|
+
| Read component state from store | `@subscribe` + `DataProviderKey<T, U>` + `@state` |
|
|
12
|
+
| Inherit ancestor attributes | `@ancestorAttribute` |
|
|
13
|
+
| Write from component state | `@publish` |
|
|
14
|
+
| React to assignments | `@handle` |
|
|
15
|
+
| HTTP GET | `@get` + `Endpoint`, or `sonic-list` / `sonic-queue` with `fetch` |
|
|
16
|
+
| HTTP POST (body from store) | `@post` + `Endpoint` + body `DataProviderKey` |
|
|
17
|
+
| HTTP PUT / PATCH (body from store) | `@put` / `@patch` — same model as `@post` |
|
|
18
|
+
| Forms | `formDataProvider` + `name` on fields (no Subscriber on form elements) |
|
|
19
|
+
| Derived / aggregate (JSONata) | `derive()` or `sonic-jsonata` — [Jsonata](/core/components/functional/jsonata) |
|
|
20
|
+
| Offline doc demos | `serviceURL="/docs-mock-api"` — [Local API demos](/docs/misc/docs-mock-api) |
|
|
21
|
+
|
|
22
|
+
Skill: `concorde-get-set-dp` in the package `ai/` folder.
|
|
23
|
+
|
|
24
|
+
## DataProviderKey
|
|
25
|
+
|
|
26
|
+
<sonic-code language="typescript">
|
|
27
|
+
<template>
|
|
28
|
+
import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
|
|
29
|
+
import { dp, get, set } from "@supersoniks/concorde/utils";
|
|
30
|
+
|
|
31
|
+
const cartKey = new DataProviderKey<{ items: string[] }>("cart");
|
|
32
|
+
|
|
33
|
+
set(cartKey, { items: [] });
|
|
34
|
+
dp(cartKey.items).set(["a", "b"]);
|
|
35
|
+
get(cartKey);
|
|
36
|
+
</template>
|
|
37
|
+
</sonic-code>
|
|
38
|
+
|
|
39
|
+
Dynamic paths (`users.${userId}`) → decorators or `sub()` — not `get("users.${id}")` in imperative code. Resolution rules: [Dynamic path placeholders](/docs/misc/dynamic-path).
|
|
40
|
+
|
|
41
|
+
[DataProviderKey](/docs/misc/dataProviderKey)
|
|
42
|
+
|
|
43
|
+
## Decorators
|
|
44
|
+
|
|
45
|
+
| Decorator | Role |
|
|
46
|
+
|-----------|------|
|
|
47
|
+
| `@subscribe` | Read-only property from store — [data configuration](/docs/getting-started/my-first-component) (type + key + scope) |
|
|
48
|
+
| `@publish` | Push property writes to store |
|
|
49
|
+
| `@handle` | Method called on assignment |
|
|
50
|
+
| `@ancestorAttribute` | Copy ancestor HTML attribute onto property |
|
|
51
|
+
| `@get` | HTTP GET into `ApiResult<T>` |
|
|
52
|
+
| `@post` | HTTP POST into `ApiResult<T>` (body from a publisher) |
|
|
53
|
+
| `@put` / `@patch` | HTTP PUT / PATCH into `ApiResult<T>` |
|
|
54
|
+
|
|
55
|
+
Walkthrough: [My first component](/docs/getting-started/my-first-component)
|
|
56
|
+
|
|
57
|
+
## HTTP and lists
|
|
58
|
+
|
|
59
|
+
- [@get](/docs/decorators/get) — single GET on a component
|
|
60
|
+
- [@post](/docs/decorators/post) — POST with body read from a `DataProviderKey`
|
|
61
|
+
- [@put](/docs/decorators/put) · [@patch](/docs/decorators/patch) — PUT / PATCH (same options as `@post`)
|
|
62
|
+
- [List](/core/components/functional/list) — `fetch` + `key="data"` + `/docs-mock-api/api/users`
|
|
63
|
+
- [Queue](/core/components/functional/queue) — lazy `offset=$offset&per_page=$limit` + optional `dataFilterProvider` (form → query)
|
|
64
|
+
|
|
65
|
+
## Starter kit
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx @supersoniks/create-concorde-ts-starter my-app
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Interactive routes mirror these patterns (`/concepts/*`, `/demo/*`).
|
|
72
|
+
|
|
73
|
+
## Derived data (`derive` / `sonic-jsonata`)
|
|
74
|
+
|
|
75
|
+
Use when you need **client-side aggregations** (groupby, top N, chart shapes) from existing DataProviders — without inline app JS in SDUI.
|
|
76
|
+
|
|
77
|
+
- Primitive: `derive({ inputs, compute, output, variables? })` from `@supersoniks/concorde/utils` (read-only output, debounce, generation, cycle detection, `{output}/_state_`).
|
|
78
|
+
- SDUI adapter: [`sonic-jsonata`](/core/components/functional/jsonata) (`inputProvider` → `expression` → `outputProvider`, optional `formDataProvider`).
|
|
79
|
+
- vs [`sonic-mix`](/core/components/functional/mix): mix composes bidirectionally; jsonata **computes** unidirectionally.
|
|
80
|
+
|
|
81
|
+
## Legacy integration
|
|
82
|
+
|
|
83
|
+
| Topic | Page |
|
|
84
|
+
|-------|------|
|
|
85
|
+
| `data-bind` HTML (plain HTML hosts) | [HTML integration](/docs/misc/html-integration) — doc demos use Lit in `src/docs/example/` |
|
|
86
|
+
| `@onAssign` | [@onAssign](/docs/decorators/on-assign) (prefer `@handle`) |
|
|
87
|
+
| `sonic-fetch` alone | [Fetch](/core/components/functional/fetch) |
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Installation
|
|
2
|
+
|
|
3
|
+
Start a new project from the official starter. It sets up Vite, TypeScript, Lit, Tailwind and Concorde in one command.
|
|
4
|
+
|
|
5
|
+
## Use the starter
|
|
6
|
+
|
|
7
|
+
<sonic-code language="shell">
|
|
8
|
+
<template>
|
|
9
|
+
npx @supersoniks/create-concorde-ts-starter my-app
|
|
10
|
+
cd my-app
|
|
11
|
+
yarn install
|
|
12
|
+
yarn dev --host
|
|
13
|
+
</template>
|
|
14
|
+
</sonic-code>
|
|
15
|
+
|
|
16
|
+
The project includes:
|
|
17
|
+
|
|
18
|
+
- an example component to copy from
|
|
19
|
+
- `npx concorde enable-short-paths` for short import paths
|
|
20
|
+
- `yarn ai:sync` for [AI agent skills](/docs/getting-started/ai-agents)
|
|
21
|
+
|
|
22
|
+
Package: [create-concorde-ts-starter](https://www.npmjs.com/package/@supersoniks/create-concorde-ts-starter).
|
|
23
|
+
|
|
24
|
+
## Stack
|
|
25
|
+
|
|
26
|
+
| Tool | Role |
|
|
27
|
+
|------|------|
|
|
28
|
+
| [Lit](https://lit.dev) | Base class, templates and reactive properties for web components |
|
|
29
|
+
| [TypeScript](https://www.typescriptlang.org) | Decorators and typed store paths |
|
|
30
|
+
| [Vite](https://vite.dev) | Dev server and build |
|
|
31
|
+
| [Tailwind](https://tailwindcss.com) | Optional, layout in your components. Concorde components ship their own styles, driven by [theme](/docs/getting-started/theming) variables |
|
|
32
|
+
|
|
33
|
+
## Gotchas
|
|
34
|
+
|
|
35
|
+
- `yarn dev` does not type-check. Run `tsc --noEmit` or a production build to catch type errors.
|
|
36
|
+
- Scripts that query the global document (`document.querySelector`, jQuery plugins, icon replacers) cannot see inside a shadow root. Query from the component's `renderRoot`, or pass the element as slotted content.
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# My first component
|
|
2
|
+
|
|
3
|
+
Build a **Lit** user card with Tailwind and Concorde UI, then connect it to the **DataProvider** store: declare the **data configuration** (type, key, scope), and let **`@subscribe`** keep the card in sync.
|
|
4
|
+
|
|
5
|
+
## 1. Lit component + Tailwind
|
|
6
|
+
|
|
7
|
+
Export Tailwind once (e.g. `src/docs/tailwind.ts` in this repo):
|
|
8
|
+
|
|
9
|
+
<sonic-code language="typescript">
|
|
10
|
+
<template>
|
|
11
|
+
import { css, unsafeCSS } from "lit";
|
|
12
|
+
import tailwindImport from "./css/tailwind.css?inline";
|
|
13
|
+
|
|
14
|
+
export const tailwind = css`${unsafeCSS(tailwindImport)}`;
|
|
15
|
+
</template>
|
|
16
|
+
</sonic-code>
|
|
17
|
+
|
|
18
|
+
User card — plain Lit properties and UI components (no store yet):
|
|
19
|
+
|
|
20
|
+
<sonic-code language="typescript">
|
|
21
|
+
<template>
|
|
22
|
+
import { html, LitElement } from "lit";
|
|
23
|
+
import { customElement, property } from "lit/decorators.js";
|
|
24
|
+
import { tailwind } from "../tailwind";
|
|
25
|
+
|
|
26
|
+
@customElement("docs-user")
|
|
27
|
+
export class DocsUser extends LitElement {
|
|
28
|
+
static styles = [tailwind];
|
|
29
|
+
|
|
30
|
+
@property({ type: String }) first_name = "";
|
|
31
|
+
@property({ type: String }) last_name = "";
|
|
32
|
+
@property({ type: String }) email = "";
|
|
33
|
+
@property({ type: String }) avatar = "";
|
|
34
|
+
|
|
35
|
+
render() {
|
|
36
|
+
return html`<div class="flex items-center gap-3 rounded-md p-2">
|
|
37
|
+
<sonic-image src=${this.avatar} rounded="md" ratio="1/1" class="w-16"></sonic-image>
|
|
38
|
+
<div>
|
|
39
|
+
<div>${this.first_name} <span class="font-bold">${this.last_name}</span></div>
|
|
40
|
+
<div class="text-sm text-neutral-400">${this.email}</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
</template>
|
|
46
|
+
</sonic-code>
|
|
47
|
+
|
|
48
|
+
## 2. Data configuration
|
|
49
|
+
|
|
50
|
+
The card does not hard-code user fields anymore. You declare **what** is stored, **where** it lives, and **which ancestor scope** applies — then `@subscribe` mirrors that object on the component.
|
|
51
|
+
|
|
52
|
+
### Type — shape of the data
|
|
53
|
+
|
|
54
|
+
`DocsUserData` documents the fields you expect at this scope (first name, email, avatar, …). TypeScript checks that `user` matches that shape.
|
|
55
|
+
|
|
56
|
+
<sonic-code language="typescript">
|
|
57
|
+
<template>
|
|
58
|
+
export type DocsUserData = {
|
|
59
|
+
first_name: string;
|
|
60
|
+
last_name: string;
|
|
61
|
+
email: string;
|
|
62
|
+
avatar: string;
|
|
63
|
+
};
|
|
64
|
+
</template>
|
|
65
|
+
</sonic-code>
|
|
66
|
+
|
|
67
|
+
### Key — path in the DataProvider
|
|
68
|
+
|
|
69
|
+
`docsUserRowKey` points at the store segment to read. The path `"${dataProvider}"` is resolved at runtime from a property on the component (see scope below).
|
|
70
|
+
|
|
71
|
+
<sonic-code language="typescript">
|
|
72
|
+
<template>
|
|
73
|
+
import { DataProviderKey } from "@supersoniks/concorde/core/utils/dataProviderKey";
|
|
74
|
+
|
|
75
|
+
export const docsUserRowKey = new DataProviderKey<
|
|
76
|
+
DocsUserData,
|
|
77
|
+
{ dataProvider: string | null }
|
|
78
|
+
>("${dataProvider}");
|
|
79
|
+
</template>
|
|
80
|
+
</sonic-code>
|
|
81
|
+
|
|
82
|
+
The second generic (`{ dataProvider: string | null }`) lists what the host must expose so `"${dataProvider}"` can be resolved. See [DataProviderKey](/docs/misc/dataProviderKey) and [Dynamic path placeholders](/docs/misc/dynamic-path).
|
|
83
|
+
|
|
84
|
+
### Scope — which store segment applies
|
|
85
|
+
|
|
86
|
+
A parent sets `dataProvider=${docsUserScopeAKey.path}` (or a list row sets `…/list-item/0`). [`@ancestorAttribute`](/docs/decorators/ancestor-attribute) copies that attribute onto `this.dataProvider`, so the key resolves to the correct branch.
|
|
87
|
+
|
|
88
|
+
<sonic-code language="typescript">
|
|
89
|
+
<template>
|
|
90
|
+
@ancestorAttribute("dataProvider")
|
|
91
|
+
dataProvider: string | null = null;
|
|
92
|
+
</template>
|
|
93
|
+
</sonic-code>
|
|
94
|
+
|
|
95
|
+
### Subscribe — keep the card in sync
|
|
96
|
+
|
|
97
|
+
[`@subscribe`](/docs/decorators/subscribe) watches `docsUserRowKey` and updates `user` when the store changes. Use `@state()` so Lit re-renders. The template reads `this.user` like any other property.
|
|
98
|
+
|
|
99
|
+
<sonic-code language="typescript">
|
|
100
|
+
<template>
|
|
101
|
+
import { html, LitElement, nothing } from "lit";
|
|
102
|
+
import { customElement, state } from "lit/decorators.js";
|
|
103
|
+
import {
|
|
104
|
+
ancestorAttribute,
|
|
105
|
+
subscribe,
|
|
106
|
+
} from "@supersoniks/concorde/core/decorators/Subscriber";
|
|
107
|
+
import { docsUserRowKey, type DocsUserData } from "./users";
|
|
108
|
+
import { tailwind } from "../tailwind";
|
|
109
|
+
|
|
110
|
+
@customElement("docs-user")
|
|
111
|
+
export class DocsUser extends LitElement {
|
|
112
|
+
static styles = [tailwind];
|
|
113
|
+
|
|
114
|
+
@ancestorAttribute("dataProvider")
|
|
115
|
+
dataProvider: string | null = null;
|
|
116
|
+
|
|
117
|
+
@subscribe(docsUserRowKey)
|
|
118
|
+
@state()
|
|
119
|
+
user: DocsUserData | null = null;
|
|
120
|
+
|
|
121
|
+
render() {
|
|
122
|
+
const u = this.user;
|
|
123
|
+
if (!u) return nothing;
|
|
124
|
+
return html`<div class="flex items-center gap-3 rounded-md p-2">
|
|
125
|
+
<sonic-image src=${u.avatar} rounded="md" ratio="1/1" class="w-16"></sonic-image>
|
|
126
|
+
<div>
|
|
127
|
+
<div>${u.first_name} <span class="font-bold">${u.last_name}</span></div>
|
|
128
|
+
<div class="text-sm text-neutral-400">${u.email}</div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
</template>
|
|
134
|
+
</sonic-code>
|
|
135
|
+
|
|
136
|
+
Live code: `src/docs/example/users.ts`. In this repo, imports use **`core/…` paths** (short `@supersoniks/concorde/…` exports apply in **consumer apps** only).
|
|
137
|
+
|
|
138
|
+
### Two scopes, one component
|
|
139
|
+
|
|
140
|
+
The same `docs-user` is mounted twice. Each copy inherits a **different** nearest `dataProvider` — that is the row/list **scope**:
|
|
141
|
+
|
|
142
|
+
<sonic-code>
|
|
143
|
+
<template>
|
|
144
|
+
<docs-demo-sources for="docs-user-two-scopes"></docs-demo-sources>
|
|
145
|
+
<docs-user-two-scopes></docs-user-two-scopes>
|
|
146
|
+
</template>
|
|
147
|
+
</sonic-code>
|
|
148
|
+
|
|
149
|
+
Markup (two isolated stores; keys from `docs-provider-keys.ts`):
|
|
150
|
+
|
|
151
|
+
<sonic-code language="markup">
|
|
152
|
+
<template>
|
|
153
|
+
<div class="grid md:grid-cols-2 gap-6">
|
|
154
|
+
<div dataProvider="${docsUserScopeAKey.path}">
|
|
155
|
+
<docs-user></docs-user>
|
|
156
|
+
</div>
|
|
157
|
+
<div dataProvider="${docsUserScopeBKey.path}">
|
|
158
|
+
<docs-user></docs-user>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</template>
|
|
162
|
+
</sonic-code>
|
|
163
|
+
|
|
164
|
+
Seeded in `docs-provider-keys.ts` (`set(docsUserScopeAKey, …)`): **Paul** / **Marie**. Without `@ancestorAttribute`, both cards would not know which store to read.
|
|
165
|
+
|
|
166
|
+
## 3. Fetch users — `sonic-list` with `.items`
|
|
167
|
+
|
|
168
|
+
Use a Lit parent and the **`items`** renderer (not HTML `<template>` children). The callback receives each row object from fetch — render fields directly (`${item.first_name}`, …), like porting a template that used `data-bind` / `<sonic-value>`.
|
|
169
|
+
|
|
170
|
+
<sonic-code>
|
|
171
|
+
<template>
|
|
172
|
+
<docs-lit-demo for="docs-users-list"></docs-lit-demo>
|
|
173
|
+
</template>
|
|
174
|
+
</sonic-code>
|
|
175
|
+
|
|
176
|
+
Wrapper (`docs-users-list.ts`):
|
|
177
|
+
|
|
178
|
+
<sonic-code language="typescript">
|
|
179
|
+
<template>
|
|
180
|
+
import { html, LitElement } from "lit";
|
|
181
|
+
import { customElement } from "lit/decorators.js";
|
|
182
|
+
import "../../core/components/functional/list/list";
|
|
183
|
+
import "./users";
|
|
184
|
+
|
|
185
|
+
@customElement("docs-users-list")
|
|
186
|
+
export class DocsUsersList extends LitElement {
|
|
187
|
+
private items = ({ first_name, last_name, email, avatar }) => html`
|
|
188
|
+
<div class="flex gap-3">
|
|
189
|
+
<sonic-image src=${avatar} ...></sonic-image>
|
|
190
|
+
<div>${first_name} <b>${last_name}</b></div>
|
|
191
|
+
<div class="text-sm text-neutral-400">${email}</div>
|
|
192
|
+
</div>
|
|
193
|
+
`;
|
|
194
|
+
|
|
195
|
+
render() {
|
|
196
|
+
return html`
|
|
197
|
+
<sonic-list fetch dataProvider=${usersListEndpoint.path} key="data" .items=${this.items}></sonic-list>
|
|
198
|
+
`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
</template>
|
|
202
|
+
</sonic-code>
|
|
203
|
+
|
|
204
|
+
See [Local API demos](/docs/misc/docs-mock-api) for `serviceURL="/docs-mock-api"`.
|
|
205
|
+
|
|
206
|
+
## 4. Form preview with `formDataProvider`
|
|
207
|
+
|
|
208
|
+
Edit fields in a form; the card follows the same `docsUserRowKey` when the preview host sets `dataProvider="userPreview"`.
|
|
209
|
+
|
|
210
|
+
<sonic-code>
|
|
211
|
+
<template>
|
|
212
|
+
<div class="grid grid-cols-1 gap-4 max-w-xl">
|
|
213
|
+
<form formDataProvider="${docsUserPreviewKey.path}" class="grid grid-cols-2 gap-3">
|
|
214
|
+
<sonic-input label="First name" name="first_name" value="Paul" size="sm"></sonic-input>
|
|
215
|
+
<sonic-input label="Last name" name="last_name" value="Metrand" size="sm"></sonic-input>
|
|
216
|
+
<sonic-input class="col-span-2" label="Email" name="email" value="paul@example.com" size="sm"></sonic-input>
|
|
217
|
+
<sonic-input class="col-span-2" label="Avatar URL" name="avatar" value="https://i.pravatar.cc/150?u=paul" size="sm"></sonic-input>
|
|
218
|
+
</form>
|
|
219
|
+
<sonic-divider align="left">Preview</sonic-divider>
|
|
220
|
+
<div dataProvider="${docsUserPreviewKey.path}">
|
|
221
|
+
<docs-user></docs-user>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
</template>
|
|
225
|
+
</sonic-code>
|
|
226
|
+
|
|
227
|
+
Use `formDataProvider` + `name` on inputs — no manual `@input` handlers ([Data flow](/docs/getting-started/dataFlow)).
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Introduction
|
|
2
|
+
|
|
3
|
+
## What is Concorde?
|
|
4
|
+
|
|
5
|
+
Based on **[lit.dev](https://lit.dev)**, Concorde is a collection of web components for shared apps and websites.
|
|
6
|
+
Build UIs without tying components to a specific host stack, while keeping visual consistency through the smallest set of CSS variables needed to define a theme.
|
|
7
|
+
|
|
8
|
+
## Why and use case
|
|
9
|
+
|
|
10
|
+
In 2022, Supersoniks needed a new ticketing stack for nearly 100 sites — mobile apps, modern sites, and legacy PHP without bundlers.
|
|
11
|
+
One composable web-component library replaced many one-off apps. Lit was chosen for broad runtime compatibility.
|
|
12
|
+
|
|
13
|
+
### Stack
|
|
14
|
+
|
|
15
|
+
* Lit
|
|
16
|
+
* TypeScript
|
|
17
|
+
* Vite
|
|
18
|
+
* Tailwind (starter kit, not required in the core package)
|
|
19
|
+
|
|
20
|
+
### Functional features
|
|
21
|
+
|
|
22
|
+
* **DataProvider** store (decorators, `get` / `set`)
|
|
23
|
+
* Forms (`formDataProvider`)
|
|
24
|
+
* Lists, queues, lazy loading
|
|
25
|
+
* Router, states, UI kit with status variants
|
|
26
|
+
|
|
27
|
+
## Start a new project
|
|
28
|
+
|
|
29
|
+
<sonic-code language="bash">
|
|
30
|
+
<template>
|
|
31
|
+
npx @supersoniks/create-concorde-ts-starter "project_name"
|
|
32
|
+
</template>
|
|
33
|
+
</sonic-code>
|
|
34
|
+
|
|
35
|
+
The starter runs **`yarn ai:sync`** for you. Details: [AI agents (skills)](/docs/getting-started/ai-agents).
|