@supersoniks/concorde 4.2.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +163 -0
  2. package/build-infos.json +1 -1
  3. package/concorde-core.bundle.js +585 -670
  4. package/concorde-core.es.js +7165 -9505
  5. package/dist/concorde-core.bundle.js +585 -670
  6. package/dist/concorde-core.es.js +7165 -9505
  7. package/docs/assets/index-DP1oMukw.js +4949 -0
  8. package/docs/assets/index-DZtxIZCW.css +1 -0
  9. package/docs/index.html +2 -2
  10. package/{src/docs/_misc → docs/src/docs/_decorators}/ancestor-attribute.md +15 -31
  11. package/docs/src/docs/_decorators/bind.md +164 -0
  12. package/docs/src/docs/_decorators/get.md +65 -0
  13. package/docs/src/docs/_decorators/publish.md +54 -0
  14. package/docs/src/docs/_decorators/subscribe.md +36 -0
  15. package/docs/src/docs/_misc/dataProviderKey.md +135 -0
  16. package/docs/src/docs/_misc/endpoint.md +42 -0
  17. package/docs/src/docs/search/docs-search.json +850 -710
  18. package/docs/src/tsconfig.json +43 -4
  19. package/package.json +25 -4
  20. package/php/get-challenge.php +34 -0
  21. package/php/some-service.php +42 -0
  22. package/scripts/pre-build.mjs +4 -0
  23. package/src/core/_types/endpoint.ts +4 -0
  24. package/src/core/_types/key.ts +1 -0
  25. package/src/core/components/functional/example/example.ts +38 -6
  26. package/src/core/decorators/Subscriber.ts +2 -0
  27. package/src/core/decorators/api.spec.ts +150 -0
  28. package/src/core/decorators/api.ts +244 -0
  29. package/src/core/decorators/subscriber/bind.ts +57 -145
  30. package/src/core/decorators/subscriber/dynamicPath.ts +77 -0
  31. package/src/core/decorators/subscriber/dynamicPropertyWatch.ts +105 -0
  32. package/src/core/decorators/subscriber/onAssign.ts +11 -147
  33. package/src/core/decorators/subscriber/publish.spec.ts +21 -0
  34. package/src/core/decorators/subscriber/publish.ts +148 -0
  35. package/src/core/decorators/subscriber/publisherPath.ts +13 -0
  36. package/src/core/decorators/subscriber/subscribe.spec.ts +21 -0
  37. package/src/core/decorators/subscriber/subscribe.ts +32 -0
  38. package/src/core/decorators/subscriber/subscribe.type-test.ts +32 -0
  39. package/src/core/utils/api.ts +83 -15
  40. package/src/core/utils/dataProviderKey.spec.ts +34 -0
  41. package/src/core/utils/dataProviderKey.ts +86 -0
  42. package/src/core/utils/endpoint.spec.ts +41 -0
  43. package/src/core/utils/endpoint.ts +87 -0
  44. package/src/decorators.ts +14 -0
  45. package/{docs/src/docs/_misc → src/docs/_decorators}/ancestor-attribute.md +15 -31
  46. package/src/docs/_decorators/bind.md +164 -0
  47. package/src/docs/_decorators/get.md +65 -0
  48. package/src/docs/_decorators/publish.md +54 -0
  49. package/src/docs/_decorators/subscribe.md +36 -0
  50. package/src/docs/_misc/dataProviderKey.md +135 -0
  51. package/src/docs/_misc/endpoint.md +42 -0
  52. package/src/docs/example/decorators-demo-bind-demos.ts +210 -0
  53. package/src/docs/example/decorators-demo-geo.ts +45 -0
  54. package/src/docs/example/decorators-demo-init.ts +228 -0
  55. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +324 -0
  56. package/src/docs/example/decorators-demo.ts +12 -459
  57. package/src/docs/navigation/navigation.ts +27 -10
  58. package/src/docs/search/docs-search.json +1059 -609
  59. package/src/tsconfig-model.json +1 -1
  60. package/src/tsconfig.json +65 -1
  61. package/src/tsconfig.tsbuildinfo +1 -1
  62. package/src/utils.ts +8 -1
  63. package/vite/config.js +25 -6
  64. package/vite.config.mts +13 -0
  65. package/docs/assets/index-B0IJ9I_B.js +0 -4918
  66. package/docs/assets/index-B3QHEJTV.css +0 -1
  67. package/docs/src/docs/_misc/bind.md +0 -436
  68. package/docs/src/docs/_misc/key.md +0 -135
  69. package/src/docs/_misc/bind.md +0 -362
  70. /package/docs/src/docs/{_misc → _decorators}/auto-subscribe.md +0 -0
  71. /package/docs/src/docs/{_misc → _decorators}/on-assign.md +0 -0
  72. /package/docs/src/docs/{_misc → _decorators}/wait-for-ancestors.md +0 -0
  73. /package/src/docs/{_misc → _decorators}/auto-subscribe.md +0 -0
  74. /package/src/docs/{_misc → _decorators}/on-assign.md +0 -0
  75. /package/src/docs/{_misc → _decorators}/wait-for-ancestors.md +0 -0
@@ -3000,12 +3000,12 @@
3000
3000
  }
3001
3001
  },
3002
3002
  {
3003
- "search": "Installation",
3003
+ "search": "@ancestorAttribute",
3004
3004
  "files": {
3005
- "docs/_getting-started/concorde-outside.md": {
3006
- "title": "Installation",
3005
+ "docs/_decorators/ancestor-attribute.md": {
3006
+ "title": "@ancestorAttribute",
3007
3007
  "hashes": {
3008
- "installation": {
3008
+ "ancestorattribute": {
3009
3009
  "count": 1,
3010
3010
  "title": "",
3011
3011
  "type": "page"
@@ -3015,14 +3015,14 @@
3015
3015
  }
3016
3016
  },
3017
3017
  {
3018
- "search": "The easiest way to use Concorde is by using the Concorde starter.The following command creates a new Vite project in TypeScript mode with Tailwind and an example component to get started.\n",
3018
+ "search": "The @ancestorAttribute decorator automatically injects the value of an ancestor's attribute into a class property at the time of connectedCallback.\n",
3019
3019
  "files": {
3020
- "docs/_getting-started/concorde-outside.md": {
3021
- "title": "Installation",
3020
+ "docs/_decorators/ancestor-attribute.md": {
3021
+ "title": "@ancestorAttribute",
3022
3022
  "hashes": {
3023
- "starter": {
3023
+ "ancestorattribute": {
3024
3024
  "count": 1,
3025
- "title": "Starter",
3025
+ "title": "",
3026
3026
  "type": "paragraph"
3027
3027
  }
3028
3028
  }
@@ -3030,14 +3030,14 @@
3030
3030
  }
3031
3031
  },
3032
3032
  {
3033
- "search": "For a more manual configuration, you can refer to the following sections. \nHowever, the Tailwind configuration is not mentioned at the moment.\n",
3033
+ "search": "This decorator uses HTML.getAncestorAttributeValue to traverse up the DOM tree from the current element and find the first ancestor that has the specified attribute. The value of this attribute is then assigned to the decorated property.\n",
3034
3034
  "files": {
3035
- "docs/_getting-started/concorde-outside.md": {
3036
- "title": "Installation",
3035
+ "docs/_decorators/ancestor-attribute.md": {
3036
+ "title": "@ancestorAttribute",
3037
3037
  "hashes": {
3038
- "brand-new-vite-project": {
3038
+ "principle": {
3039
3039
  "count": 1,
3040
- "title": "Brand New Vite Project",
3040
+ "title": "Principle",
3041
3041
  "type": "paragraph"
3042
3042
  }
3043
3043
  }
@@ -3045,14 +3045,14 @@
3045
3045
  }
3046
3046
  },
3047
3047
  {
3048
- "search": "Using Lit with TypeScript requires the following configuration in the "compilerOptions" section of the tsconfig.json file:\n",
3048
+ "search": "The component reads dataProvider and testAttribute from its ancestor wrapper.\n",
3049
3049
  "files": {
3050
- "docs/_getting-started/concorde-outside.md": {
3051
- "title": "Installation",
3050
+ "docs/_decorators/ancestor-attribute.md": {
3051
+ "title": "@ancestorAttribute",
3052
3052
  "hashes": {
3053
- "creating-the-project": {
3053
+ "basic-example": {
3054
3054
  "count": 1,
3055
- "title": "Creating the Project",
3055
+ "title": "Basic example",
3056
3056
  "type": "paragraph"
3057
3057
  }
3058
3058
  }
@@ -3060,29 +3060,34 @@
3060
3060
  }
3061
3061
  },
3062
3062
  {
3063
- "search": "Navigate to the project folder created and perform the installation:\n",
3063
+ "search": "This decorator is particularly useful for:\n",
3064
3064
  "files": {
3065
- "docs/_getting-started/concorde-outside.md": {
3066
- "title": "Installation",
3065
+ "docs/_decorators/ancestor-attribute.md": {
3066
+ "title": "@ancestorAttribute",
3067
3067
  "hashes": {
3068
- "installing-concorde": {
3068
+ "use-cases": {
3069
3069
  "count": 1,
3070
- "title": "Installing Concorde",
3070
+ "title": "Use cases",
3071
3071
  "type": "paragraph"
3072
3072
  }
3073
3073
  }
3074
- }
3075
- }
3076
- },
3077
- {
3078
- "search": "Shortcut imports work by default in JavaScript, but in TypeScript, they are activated by choice as they inject data into tsconfig.json. Here is the command:\n",
3079
- "files": {
3080
- "docs/_getting-started/concorde-outside.md": {
3081
- "title": "Installation",
3074
+ },
3075
+ "docs/_decorators/auto-subscribe.md": {
3076
+ "title": "@autoSubscribe",
3082
3077
  "hashes": {
3083
- "shortcut-imports": {
3078
+ "use-cases": {
3084
3079
  "count": 1,
3085
- "title": "Shortcut Imports",
3080
+ "title": "Use cases",
3081
+ "type": "paragraph"
3082
+ }
3083
+ }
3084
+ },
3085
+ "docs/_decorators/on-assign.md": {
3086
+ "title": "@onAssign",
3087
+ "hashes": {
3088
+ "use-cases": {
3089
+ "count": 1,
3090
+ "title": "Use cases",
3086
3091
  "type": "paragraph"
3087
3092
  }
3088
3093
  }
@@ -3090,29 +3095,29 @@
3090
3095
  }
3091
3096
  },
3092
3097
  {
3093
- "search": "Shortcut imports replace the actual paths with aliases as follows:\n",
3098
+ "search": "@autoSubscribe",
3094
3099
  "files": {
3095
- "docs/_getting-started/concorde-outside.md": {
3096
- "title": "Installation",
3100
+ "docs/_decorators/auto-subscribe.md": {
3101
+ "title": "@autoSubscribe",
3097
3102
  "hashes": {
3098
- "shortcut-imports": {
3103
+ "autosubscribe": {
3099
3104
  "count": 1,
3100
- "title": "Shortcut Imports",
3101
- "type": "paragraph"
3105
+ "title": "",
3106
+ "type": "page"
3102
3107
  }
3103
3108
  }
3104
3109
  }
3105
3110
  }
3106
3111
  },
3107
3112
  {
3108
- "search": "The original paths remain accessible. Shortcut imports are used for the examples later in this documentation.\n",
3113
+ "search": "The @autoSubscribe decorator automatically detects which publishers are accessed within a method and subscribes to them. When any of these publishers change, the method is automatically re-executed.\n",
3109
3114
  "files": {
3110
- "docs/_getting-started/concorde-outside.md": {
3111
- "title": "Installation",
3115
+ "docs/_decorators/auto-subscribe.md": {
3116
+ "title": "@autoSubscribe",
3112
3117
  "hashes": {
3113
- "shortcut-imports": {
3118
+ "autosubscribe": {
3114
3119
  "count": 1,
3115
- "title": "Shortcut Imports",
3120
+ "title": "",
3116
3121
  "type": "paragraph"
3117
3122
  }
3118
3123
  }
@@ -3120,14 +3125,14 @@
3120
3125
  }
3121
3126
  },
3122
3127
  {
3123
- "search": "Import needed component in main.ts or wherever you want to use it:\n",
3128
+ "search": "This decorator wraps a method to track which publishers are accessed during its execution. It then subscribes to all accessed publishers, and when any of them change, the method is re-executed. This provides automatic reactivity without manually managing subscriptions.\n",
3124
3129
  "files": {
3125
- "docs/_getting-started/concorde-outside.md": {
3126
- "title": "Installation",
3130
+ "docs/_decorators/auto-subscribe.md": {
3131
+ "title": "@autoSubscribe",
3127
3132
  "hashes": {
3128
- "simple-integration-in-html": {
3133
+ "principle": {
3129
3134
  "count": 1,
3130
- "title": "Simple Integration in HTML",
3135
+ "title": "Principle",
3131
3136
  "type": "paragraph"
3132
3137
  }
3133
3138
  }
@@ -3135,29 +3140,29 @@
3135
3140
  }
3136
3141
  },
3137
3142
  {
3138
- "search": "Then in the render function ofyour component or in the HTML of the web page that includes the compiled JS, use the component as follows:\n",
3143
+ "search": "@bind",
3139
3144
  "files": {
3140
- "docs/_getting-started/concorde-outside.md": {
3141
- "title": "Installation",
3145
+ "docs/_decorators/bind.md": {
3146
+ "title": "@bind",
3142
3147
  "hashes": {
3143
- "simple-integration-in-html": {
3148
+ "bind": {
3144
3149
  "count": 1,
3145
- "title": "Simple Integration in HTML",
3146
- "type": "paragraph"
3150
+ "title": "",
3151
+ "type": "page"
3147
3152
  }
3148
3153
  }
3149
3154
  }
3150
3155
  }
3151
3156
  },
3152
3157
  {
3153
- "search": "For example, create a file my-element.ts at the root:\n",
3158
+ "search": "Binds a class property to a path in a publisher. The property updates when publisher data changes.\n",
3154
3159
  "files": {
3155
- "docs/_getting-started/concorde-outside.md": {
3156
- "title": "Installation",
3160
+ "docs/_decorators/bind.md": {
3161
+ "title": "@bind",
3157
3162
  "hashes": {
3158
- "using-a-mixin-to-create-a-new-lit-component": {
3163
+ "bind": {
3159
3164
  "count": 1,
3160
- "title": "Using a Mixin to Create a New Lit Component",
3165
+ "title": "",
3161
3166
  "type": "paragraph"
3162
3167
  }
3163
3168
  }
@@ -3165,14 +3170,14 @@
3165
3170
  }
3166
3171
  },
3167
3172
  {
3168
- "search": "@customElement("my-element")\nexport class SonicComponent extends Fetcher(Subscriber(LitElement)) {\n @property() email = "";\n @property() first_name = "";\n @property() last_name = "";\n",
3173
+ "search": "For Lit re-renders, also add @state() on the same property.\n",
3169
3174
  "files": {
3170
- "docs/_getting-started/concorde-outside.md": {
3171
- "title": "Installation",
3175
+ "docs/_decorators/bind.md": {
3176
+ "title": "@bind",
3172
3177
  "hashes": {
3173
- "using-a-mixin-to-create-a-new-lit-component": {
3178
+ "bind": {
3174
3179
  "count": 1,
3175
- "title": "Using a Mixin to Create a New Lit Component",
3180
+ "title": "",
3176
3181
  "type": "paragraph"
3177
3182
  }
3178
3183
  }
@@ -3180,14 +3185,14 @@
3180
3185
  }
3181
3186
  },
3182
3187
  {
3183
- "search": " render() {\n return html<div> ${this.first_name} ${this.last_name} : ${this.email} </div>;\n }\n}\n \n\n",
3188
+ "search": "See also: @subscribe, @publish, @get.\n",
3184
3189
  "files": {
3185
- "docs/_getting-started/concorde-outside.md": {
3186
- "title": "Installation",
3190
+ "docs/_decorators/bind.md": {
3191
+ "title": "@bind",
3187
3192
  "hashes": {
3188
- "using-a-mixin-to-create-a-new-lit-component": {
3193
+ "bind": {
3189
3194
  "count": 1,
3190
- "title": "Using a Mixin to Create a New Lit Component",
3195
+ "title": "",
3191
3196
  "type": "paragraph"
3192
3197
  }
3193
3198
  }
@@ -3195,14 +3200,14 @@
3195
3200
  }
3196
3201
  },
3197
3202
  {
3198
- "search": "Import component main.ts or main.js or any other component that uses it to be compiled\n",
3203
+ "search": "The decorator subscribes via PublisherManager using dot notation. Publisher updates flow into the decorated property.\n",
3199
3204
  "files": {
3200
- "docs/_getting-started/concorde-outside.md": {
3201
- "title": "Installation",
3205
+ "docs/_decorators/bind.md": {
3206
+ "title": "@bind",
3202
3207
  "hashes": {
3203
- "using-a-mixin-to-create-a-new-lit-component": {
3208
+ "principle": {
3204
3209
  "count": 1,
3205
- "title": "Using a Mixin to Create a New Lit Component",
3210
+ "title": "Principle",
3206
3211
  "type": "paragraph"
3207
3212
  }
3208
3213
  }
@@ -3210,14 +3215,14 @@
3210
3215
  }
3211
3216
  },
3212
3217
  {
3213
- "search": "In the HTML of a JS or TS component or in the HTML of the web page containing the compiled JS:\n",
3218
+ "search": "@bind accepts either a string path (legacy) or a DataProviderKey<T>. The property type must match T. Use reflect: true to push local writes back to the publisher (see below). See DataProviderKey.\n",
3214
3219
  "files": {
3215
- "docs/_getting-started/concorde-outside.md": {
3216
- "title": "Installation",
3220
+ "docs/_decorators/bind.md": {
3221
+ "title": "@bind",
3217
3222
  "hashes": {
3218
- "using-a-mixin-to-create-a-new-lit-component": {
3223
+ "dataproviderkey-strict-typing": {
3219
3224
  "count": 1,
3220
- "title": "Using a Mixin to Create a New Lit Component",
3225
+ "title": "`DataProviderKey` (strict typing)",
3221
3226
  "type": "paragraph"
3222
3227
  }
3223
3228
  }
@@ -3225,29 +3230,29 @@
3225
3230
  }
3226
3231
  },
3227
3232
  {
3228
- "search": "Creating components",
3233
+ "search": "Two-way sync: reads from the publisher and local assignments call publisher.set(...). An internal guard avoids infinite loops.\n",
3229
3234
  "files": {
3230
- "docs/_getting-started/create-a-component.md": {
3231
- "title": "Creating components",
3235
+ "docs/_decorators/bind.md": {
3236
+ "title": "@bind",
3232
3237
  "hashes": {
3233
- "creating-components": {
3238
+ "reflect-reflect-true": {
3234
3239
  "count": 1,
3235
- "title": "",
3236
- "type": "page"
3240
+ "title": "Reflect (`reflect: true`)",
3241
+ "type": "paragraph"
3237
3242
  }
3238
3243
  }
3239
3244
  }
3240
3245
  }
3241
3246
  },
3242
3247
  {
3243
- "search": "In this document, we consider the src directory of the project as the root.\nWe describe how we organize our components as an example, however it depends on your project.\n",
3248
+ "search": "Use ${prop} or ${this.prop} inside a normal string literal (not a JS template literal with backticks). @bind re-subscribes when a reactive dependency changes.\n",
3244
3249
  "files": {
3245
- "docs/_getting-started/create-a-component.md": {
3246
- "title": "Creating components",
3250
+ "docs/_decorators/bind.md": {
3251
+ "title": "@bind",
3247
3252
  "hashes": {
3248
- "where-to-put-it": {
3253
+ "dynamic-paths": {
3249
3254
  "count": 1,
3250
- "title": "Where to put it?",
3255
+ "title": "Dynamic paths",
3251
3256
  "type": "paragraph"
3252
3257
  }
3253
3258
  }
@@ -3255,14 +3260,14 @@
3255
3260
  }
3256
3261
  },
3257
3262
  {
3258
- "search": "In concorde each component is currently organized in the following directory structure (at least we try):\n",
3263
+ "search": "Properties referenced in the pattern must be reactive (@property, etc.) or you must call requestUpdate manually.\n",
3259
3264
  "files": {
3260
- "docs/_getting-started/create-a-component.md": {
3261
- "title": "Creating components",
3265
+ "docs/_decorators/bind.md": {
3266
+ "title": "@bind",
3262
3267
  "hashes": {
3263
- "where-to-put-it": {
3268
+ "dynamic-paths": {
3264
3269
  "count": 1,
3265
- "title": "Where to put it?",
3270
+ "title": "Dynamic paths",
3266
3271
  "type": "paragraph"
3267
3272
  }
3268
3273
  }
@@ -3270,14 +3275,14 @@
3270
3275
  }
3271
3276
  },
3272
3277
  {
3273
- "search": "You can copy example.ts from the source to the desired destination to start with.\nThis file contains a web component in the form of a class that extends the Subscriber mixin, with a reactive property and a render function.\n",
3278
+ "search": "Works with any component that has the usual DOM lifecycle (LitElement, Subscriber mixin, etc.).\n",
3274
3279
  "files": {
3275
- "docs/_getting-started/create-a-component.md": {
3276
- "title": "Creating components",
3280
+ "docs/_decorators/bind.md": {
3281
+ "title": "@bind",
3277
3282
  "hashes": {
3278
- "starting-from-a-simple-model": {
3283
+ "notes": {
3279
3284
  "count": 1,
3280
- "title": "Starting from a Simple Model",
3285
+ "title": "Notes",
3281
3286
  "type": "paragraph"
3282
3287
  }
3283
3288
  }
@@ -3285,14 +3290,14 @@
3285
3290
  }
3286
3291
  },
3287
3292
  {
3288
- "search": "@customElement("sonic-example")\nexport class SonicComponent extends Subscriber(LitElement) {\n @property() text = "Example";\n render() {\n return html${this.text};\n }\n}\n \n\n",
3293
+ "search": "Shared data: Sharing data.\n",
3289
3294
  "files": {
3290
- "docs/_getting-started/create-a-component.md": {
3291
- "title": "Creating components",
3295
+ "docs/_decorators/bind.md": {
3296
+ "title": "@bind",
3292
3297
  "hashes": {
3293
- "starting-from-a-simple-model": {
3298
+ "notes": {
3294
3299
  "count": 1,
3295
- "title": "Starting from a Simple Model",
3300
+ "title": "Notes",
3296
3301
  "type": "paragraph"
3297
3302
  }
3298
3303
  }
@@ -3300,29 +3305,29 @@
3300
3305
  }
3301
3306
  },
3302
3307
  {
3303
- "search": "You can remove the dependency on Subscriber if automatic population of the component with external data is not required.\nFor example, for a UI component:\n",
3308
+ "search": "@get",
3304
3309
  "files": {
3305
- "docs/_getting-started/create-a-component.md": {
3306
- "title": "Creating components",
3310
+ "docs/_decorators/get.md": {
3311
+ "title": "@get",
3307
3312
  "hashes": {
3308
- "starting-from-a-simple-model": {
3313
+ "get": {
3309
3314
  "count": 1,
3310
- "title": "Starting from a Simple Model",
3311
- "type": "paragraph"
3315
+ "title": "",
3316
+ "type": "page"
3312
3317
  }
3313
3318
  }
3314
3319
  }
3315
3320
  }
3316
3321
  },
3317
3322
  {
3318
- "search": "@customElement("sonic-example")\nexport class SonicComponent extends LitElement {\n @property() text = "Example";\n render() {\n return html${this.text};\n }\n}\n \n\n",
3323
+ "search": "Loads data through API.getDetailed. The decorated property is ApiGetResult<T> | null: request, response (or null for dataProvider(...) resolution without HTTP), and typed result.\n",
3319
3324
  "files": {
3320
- "docs/_getting-started/create-a-component.md": {
3321
- "title": "Creating components",
3325
+ "docs/_decorators/get.md": {
3326
+ "title": "@get",
3322
3327
  "hashes": {
3323
- "starting-from-a-simple-model": {
3328
+ "get": {
3324
3329
  "count": 1,
3325
- "title": "Starting from a Simple Model",
3330
+ "title": "",
3326
3331
  "type": "paragraph"
3327
3332
  }
3328
3333
  }
@@ -3330,14 +3335,14 @@
3330
3335
  }
3331
3336
  },
3332
3337
  {
3333
- "search": "Regarding Subscriber, see:\n",
3338
+ "search": "Pass an Endpoint<T> as the first argument. Import get and ApiGetResult from @supersoniks/concorde/decorators, and Endpoint from @supersoniks/concorde/utils/endpoint.\n",
3334
3339
  "files": {
3335
- "docs/_getting-started/create-a-component.md": {
3336
- "title": "Creating components",
3340
+ "docs/_decorators/get.md": {
3341
+ "title": "@get",
3337
3342
  "hashes": {
3338
- "starting-from-a-simple-model": {
3343
+ "get": {
3339
3344
  "count": 1,
3340
- "title": "Starting from a Simple Model",
3345
+ "title": "",
3341
3346
  "type": "paragraph"
3342
3347
  }
3343
3348
  }
@@ -3345,14 +3350,14 @@
3345
3350
  }
3346
3351
  },
3347
3352
  {
3348
- "search": "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:\n",
3353
+ "search": "Same demo service as sonic-queue (geo.api.gouv.fr). Publisher setup lives in decorators-demo-geo.ts and decorators-demo-subscribe-publish-get-demos.ts.\n",
3349
3354
  "files": {
3350
- "docs/_getting-started/create-a-component.md": {
3351
- "title": "Creating components",
3355
+ "docs/_decorators/get.md": {
3356
+ "title": "@get",
3352
3357
  "hashes": {
3353
- "naming-the-component": {
3358
+ "minimal-example": {
3354
3359
  "count": 1,
3355
- "title": "Naming the Component",
3360
+ "title": "Minimal example",
3356
3361
  "type": "paragraph"
3357
3362
  }
3358
3363
  }
@@ -3360,14 +3365,14 @@
3360
3365
  }
3361
3366
  },
3362
3367
  {
3363
- "search": "For less generic components with a specific destination, we advise to include the destination in the name.\nFor example, for a "title" component in the "event" destination, the name would be simply:\n",
3368
+ "search": "Dynamic config and endpoint path (demo-api-get-configuration-key in doc sources):\n",
3364
3369
  "files": {
3365
- "docs/_getting-started/create-a-component.md": {
3366
- "title": "Creating components",
3370
+ "docs/_decorators/get.md": {
3371
+ "title": "@get",
3367
3372
  "hashes": {
3368
- "naming-the-component": {
3373
+ "live-demos": {
3369
3374
  "count": 1,
3370
- "title": "Naming the Component",
3375
+ "title": "Live demos",
3371
3376
  "type": "paragraph"
3372
3377
  }
3373
3378
  }
@@ -3375,14 +3380,14 @@
3375
3380
  }
3376
3381
  },
3377
3382
  {
3378
- "search": "To do this, study the functioning of https://lit.dev and also refer to Subscriber.\n",
3383
+ "search": "Scoped @get with @publish / @subscribe on the payload (see @publish and @subscribe) wrap under an ancestor with serviceURL="https://geo.api.gouv.fr/":\n",
3379
3384
  "files": {
3380
- "docs/_getting-started/create-a-component.md": {
3381
- "title": "Creating components",
3385
+ "docs/_decorators/get.md": {
3386
+ "title": "@get",
3382
3387
  "hashes": {
3383
- "creating-reactive-properties-and-modifying-the-render-function": {
3388
+ "live-demos": {
3384
3389
  "count": 1,
3385
- "title": "Creating Reactive Properties and Modifying the Render Function",
3390
+ "title": "Live demos",
3386
3391
  "type": "paragraph"
3387
3392
  }
3388
3393
  }
@@ -3390,14 +3395,14 @@
3390
3395
  }
3391
3396
  },
3392
3397
  {
3393
- "search": "The HTML structure of a component should remain as simple as possible.\n",
3398
+ "search": "Stale responses are ignored if the path or generation changed before the request finished.\n",
3394
3399
  "files": {
3395
- "docs/_getting-started/create-a-component.md": {
3396
- "title": "Creating components",
3400
+ "docs/_decorators/get.md": {
3401
+ "title": "@get",
3397
3402
  "hashes": {
3398
- "html-structure-of-a-component": {
3403
+ "live-demos": {
3399
3404
  "count": 1,
3400
- "title": "HTML Structure of a Component",
3405
+ "title": "Live demos",
3401
3406
  "type": "paragraph"
3402
3407
  }
3403
3408
  }
@@ -3405,29 +3410,29 @@
3405
3410
  }
3406
3411
  },
3407
3412
  {
3408
- "search": "Ideally, there should be only one additional level of elements in addition to slots.\n",
3413
+ "search": "@onAssign",
3409
3414
  "files": {
3410
- "docs/_getting-started/create-a-component.md": {
3411
- "title": "Creating components",
3415
+ "docs/_decorators/on-assign.md": {
3416
+ "title": "@onAssign",
3412
3417
  "hashes": {
3413
- "html-structure-of-a-component": {
3418
+ "onassign": {
3414
3419
  "count": 1,
3415
- "title": "HTML Structure of a Component",
3416
- "type": "paragraph"
3420
+ "title": "",
3421
+ "type": "page"
3417
3422
  }
3418
3423
  }
3419
3424
  }
3420
3425
  }
3421
3426
  },
3422
3427
  {
3423
- "search": "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.\n",
3428
+ "search": "The @onAssign decorator allows you to execute a method when one or more publishers are updated. The method is called only when all specified publishers have been assigned values.\n",
3424
3429
  "files": {
3425
- "docs/_getting-started/create-a-component.md": {
3426
- "title": "Creating components",
3430
+ "docs/_decorators/on-assign.md": {
3431
+ "title": "@onAssign",
3427
3432
  "hashes": {
3428
- "html-structure-of-a-component": {
3433
+ "onassign": {
3429
3434
  "count": 1,
3430
- "title": "HTML Structure of a Component",
3435
+ "title": "",
3431
3436
  "type": "paragraph"
3432
3437
  }
3433
3438
  }
@@ -3435,14 +3440,14 @@
3435
3440
  }
3436
3441
  },
3437
3442
  {
3438
- "search": "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.\n",
3443
+ "search": "This decorator subscribes to one or more publishers via the PublisherManager. When all specified publishers have been assigned values (via set), the decorated method is called with all the values as arguments.\n",
3439
3444
  "files": {
3440
- "docs/_getting-started/create-a-component.md": {
3441
- "title": "Creating components",
3445
+ "docs/_decorators/on-assign.md": {
3446
+ "title": "@onAssign",
3442
3447
  "hashes": {
3443
- "referencing-it": {
3448
+ "principle": {
3444
3449
  "count": 1,
3445
- "title": "Referencing It",
3450
+ "title": "Principle",
3446
3451
  "type": "paragraph"
3447
3452
  }
3448
3453
  }
@@ -3450,14 +3455,14 @@
3450
3455
  }
3451
3456
  },
3452
3457
  {
3453
- "search": "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.\n",
3458
+ "search": "This is particularly useful when you need to wait for multiple data sources to be ready before executing logic.\n",
3454
3459
  "files": {
3455
- "docs/_getting-started/create-a-component.md": {
3456
- "title": "Creating components",
3460
+ "docs/_decorators/on-assign.md": {
3461
+ "title": "@onAssign",
3457
3462
  "hashes": {
3458
- "referencing-it": {
3463
+ "principle": {
3459
3464
  "count": 1,
3460
- "title": "Referencing It",
3465
+ "title": "Principle",
3461
3466
  "type": "paragraph"
3462
3467
  }
3463
3468
  }
@@ -3465,14 +3470,14 @@
3465
3470
  }
3466
3471
  },
3467
3472
  {
3468
- "search": "Here's where we add imports based on the component's location inside concorde as an example\n",
3473
+ "search": "The path uses dot notation to navigate through the publisher structure:\n",
3469
3474
  "files": {
3470
- "docs/_getting-started/create-a-component.md": {
3471
- "title": "Creating components",
3475
+ "docs/_decorators/on-assign.md": {
3476
+ "title": "@onAssign",
3472
3477
  "hashes": {
3473
- "referencing-it": {
3478
+ "path-syntax": {
3474
3479
  "count": 1,
3475
- "title": "Referencing It",
3480
+ "title": "Path syntax",
3476
3481
  "type": "paragraph"
3477
3482
  }
3478
3483
  }
@@ -3480,14 +3485,14 @@
3480
3485
  }
3481
3486
  },
3482
3487
  {
3483
- "search": "As a reminder, the component is simply integrated into the context by adding a tag with the component's name, for example:\n",
3488
+ "search": "You can now build the paths dynamically by referencing the host class properties inside the strings passed to @onAssign. Two placeholder syntaxes are supported:\n",
3484
3489
  "files": {
3485
- "docs/_getting-started/create-a-component.md": {
3486
- "title": "Creating components",
3490
+ "docs/_decorators/on-assign.md": {
3491
+ "title": "@onAssign",
3487
3492
  "hashes": {
3488
- "using-it": {
3493
+ "dynamic-path-driven-by-class-properties": {
3489
3494
  "count": 1,
3490
- "title": "Using It",
3495
+ "title": "Dynamic path driven by class properties",
3491
3496
  "type": "paragraph"
3492
3497
  }
3493
3498
  }
@@ -3495,29 +3500,29 @@
3495
3500
  }
3496
3501
  },
3497
3502
  {
3498
- "search": "My first subscriber component",
3503
+ "search": "Each placeholder is replaced at runtime with the current value of the corresponding property. @onAssign automatically watches those properties and:\n",
3499
3504
  "files": {
3500
- "docs/_getting-started/my-first-subscriber.md": {
3501
- "title": "My first subscriber component",
3505
+ "docs/_decorators/on-assign.md": {
3506
+ "title": "@onAssign",
3502
3507
  "hashes": {
3503
- "my-first-subscriber-component": {
3508
+ "dynamic-path-driven-by-class-properties": {
3504
3509
  "count": 1,
3505
- "title": "",
3506
- "type": "page"
3510
+ "title": "Dynamic path driven by class properties",
3511
+ "type": "paragraph"
3507
3512
  }
3508
3513
  }
3509
3514
  }
3510
3515
  }
3511
3516
  },
3512
3517
  {
3513
- "search": "Learn how to build a subscriber component, styled with tailwind, \nwhich could be used as a regular component or could be filled from a dataprovider.\n",
3518
+ "search": "⚠️ Use classic string literals: @onAssign("${dataProvider}.${profileId}", "settings.${profileId}"). Do not use template literals (backticks), otherwise JavaScript would try to interpolate the value immediately.\n",
3514
3519
  "files": {
3515
- "docs/_getting-started/my-first-subscriber.md": {
3516
- "title": "My first subscriber component",
3520
+ "docs/_decorators/on-assign.md": {
3521
+ "title": "@onAssign",
3517
3522
  "hashes": {
3518
- "my-first-subscriber-component": {
3523
+ "dynamic-path-driven-by-class-properties": {
3519
3524
  "count": 1,
3520
- "title": "",
3525
+ "title": "Dynamic path driven by class properties",
3521
3526
  "type": "paragraph"
3522
3527
  }
3523
3528
  }
@@ -3525,14 +3530,14 @@
3525
3530
  }
3526
3531
  },
3527
3532
  {
3528
- "search": "First export tailwind, in a tailwind.ts file, stylesheet to add it in our component when needed.\n",
3533
+ "search": "Additional constraints:\n",
3529
3534
  "files": {
3530
- "docs/_getting-started/my-first-subscriber.md": {
3531
- "title": "My first subscriber component",
3535
+ "docs/_decorators/on-assign.md": {
3536
+ "title": "@onAssign",
3532
3537
  "hashes": {
3533
- "style-with-tailwind-and-ui-components": {
3538
+ "dynamic-path-driven-by-class-properties": {
3534
3539
  "count": 1,
3535
- "title": "Style with tailwind and ui components",
3540
+ "title": "Dynamic path driven by class properties",
3536
3541
  "type": "paragraph"
3537
3542
  }
3538
3543
  }
@@ -3540,29 +3545,29 @@
3540
3545
  }
3541
3546
  },
3542
3547
  {
3543
- "search": "Reactive properties can be filled by its attributes as a simple lit component.\n",
3548
+ "search": "@publish",
3544
3549
  "files": {
3545
- "docs/_getting-started/my-first-subscriber.md": {
3546
- "title": "My first subscriber component",
3550
+ "docs/_decorators/publish.md": {
3551
+ "title": "@publish",
3547
3552
  "hashes": {
3548
- "basic-usage": {
3553
+ "publish": {
3549
3554
  "count": 1,
3550
- "title": "Basic usage",
3551
- "type": "paragraph"
3555
+ "title": "",
3556
+ "type": "page"
3552
3557
  }
3553
3558
  }
3554
3559
  }
3555
3560
  }
3556
3561
  },
3557
3562
  {
3558
- "search": "Import Subscriber mixin, and add it around LitElement.\n\n",
3563
+ "search": "Write-only binding: assigning to the property publishes to the DataProviderKey path. No read subscription (inverse of @subscribe).\n",
3559
3564
  "files": {
3560
- "docs/_getting-started/my-first-subscriber.md": {
3561
- "title": "My first subscriber component",
3565
+ "docs/_decorators/publish.md": {
3566
+ "title": "@publish",
3562
3567
  "hashes": {
3563
- "add-subscriber-mixin": {
3568
+ "publish": {
3564
3569
  "count": 1,
3565
- "title": "Add Subscriber mixin",
3570
+ "title": "",
3566
3571
  "type": "paragraph"
3567
3572
  }
3568
3573
  }
@@ -3570,14 +3575,14 @@
3570
3575
  }
3571
3576
  },
3572
3577
  {
3573
- "search": "Without a dataProvider attribute, a subscriber set its own dataprovider from first ancestor found, and then reactive properties automatically filled and update from it.\nA fetcher is a simple component which set its fetch result to props of its dataprovider.\n\n",
3578
+ "search": "Similar to the “reflect” half of @bind without listening to the publisher.\n",
3574
3579
  "files": {
3575
- "docs/_getting-started/my-first-subscriber.md": {
3576
- "title": "My first subscriber component",
3580
+ "docs/_decorators/publish.md": {
3581
+ "title": "@publish",
3577
3582
  "hashes": {
3578
- "autofill-properties-from-a-dataprovider": {
3583
+ "publish": {
3579
3584
  "count": 1,
3580
- "title": "Autofill properties from a dataProvider",
3585
+ "title": "",
3581
3586
  "type": "paragraph"
3582
3587
  }
3583
3588
  }
@@ -3585,14 +3590,14 @@
3585
3590
  }
3586
3591
  },
3587
3592
  {
3588
- "search": "A subscriber can subscribe data from anywhere in the DOM, with its dataprovider set as a provider id.\n",
3593
+ "search": "Dynamic paths use the same placeholder rules as @bind / @subscribe.\n",
3589
3594
  "files": {
3590
- "docs/_getting-started/my-first-subscriber.md": {
3591
- "title": "My first subscriber component",
3595
+ "docs/_decorators/publish.md": {
3596
+ "title": "@publish",
3592
3597
  "hashes": {
3593
- "autofill-properties-from-a-dataprovider": {
3598
+ "example": {
3594
3599
  "count": 1,
3595
- "title": "Autofill properties from a dataProvider",
3600
+ "title": "Example",
3596
3601
  "type": "paragraph"
3597
3602
  }
3598
3603
  }
@@ -3600,12 +3605,12 @@
3600
3605
  }
3601
3606
  },
3602
3607
  {
3603
- "search": "Sharing data",
3608
+ "search": "@subscribe",
3604
3609
  "files": {
3605
- "docs/_getting-started/pubsub.md": {
3606
- "title": "Sharing data",
3610
+ "docs/_decorators/subscribe.md": {
3611
+ "title": "@subscribe",
3607
3612
  "hashes": {
3608
- "sharing-data": {
3613
+ "subscribe": {
3609
3614
  "count": 1,
3610
3615
  "title": "",
3611
3616
  "type": "page"
@@ -3615,12 +3620,12 @@
3615
3620
  }
3616
3621
  },
3617
3622
  {
3618
- "search": "This section describes how we share data between graphical and non graphical components and classes.\n",
3623
+ "search": "Read-only binding: only DataProviderKey<T> (no legacy string path). No reflect option the publisher updates the property, not the other way around.\n",
3619
3624
  "files": {
3620
- "docs/_getting-started/pubsub.md": {
3621
- "title": "Sharing data",
3625
+ "docs/_decorators/subscribe.md": {
3626
+ "title": "@subscribe",
3622
3627
  "hashes": {
3623
- "sharing-data": {
3628
+ "subscribe": {
3624
3629
  "count": 1,
3625
3630
  "title": "",
3626
3631
  "type": "paragraph"
@@ -3630,12 +3635,12 @@
3630
3635
  }
3631
3636
  },
3632
3637
  {
3633
- "search": "Especialy, graphical components should not reference each other in order to remain decoupled.\n",
3638
+ "search": "For bidirectional binding or string paths, use @bind.\n",
3634
3639
  "files": {
3635
- "docs/_getting-started/pubsub.md": {
3636
- "title": "Sharing data",
3640
+ "docs/_decorators/subscribe.md": {
3641
+ "title": "@subscribe",
3637
3642
  "hashes": {
3638
- "sharing-data": {
3643
+ "subscribe": {
3639
3644
  "count": 1,
3640
3645
  "title": "",
3641
3646
  "type": "paragraph"
@@ -3645,14 +3650,14 @@
3645
3650
  }
3646
3651
  },
3647
3652
  {
3648
- "search": "Thats why we use publish/subscribe paradigm to addresse this issue.\n",
3653
+ "search": "See also DataProviderKey.\n",
3649
3654
  "files": {
3650
- "docs/_getting-started/pubsub.md": {
3651
- "title": "Sharing data",
3655
+ "docs/_decorators/subscribe.md": {
3656
+ "title": "@subscribe",
3652
3657
  "hashes": {
3653
- "sharing-data": {
3658
+ "demo": {
3654
3659
  "count": 1,
3655
- "title": "",
3660
+ "title": "Demo",
3656
3661
  "type": "paragraph"
3657
3662
  }
3658
3663
  }
@@ -3660,29 +3665,29 @@
3660
3665
  }
3661
3666
  },
3662
3667
  {
3663
- "search": "❇️ The order of data creation and subscription theoretically has no importance.\n",
3668
+ "search": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3664
3669
  "files": {
3665
- "docs/_getting-started/pubsub.md": {
3666
- "title": "Sharing data",
3670
+ "docs/_decorators/wait-for-ancestors.md": {
3671
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3667
3672
  "hashes": {
3668
- "principle": {
3673
+ "awaitconnectedancestors-and-dispatchconnectedevent": {
3669
3674
  "count": 1,
3670
- "title": "Principle",
3671
- "type": "paragraph"
3675
+ "title": "",
3676
+ "type": "page"
3672
3677
  }
3673
3678
  }
3674
3679
  }
3675
3680
  }
3676
3681
  },
3677
3682
  {
3678
- "search": "Denotes the identifier of a publisher as referenced in the PublisherManager (see below).\nUses the dataProvider attribut in html tags to scop the content with some data.\nsee Subscribers.\n",
3683
+ "search": "The @awaitConnectedAncestors and @dispatchConnectedEvent decorators delay a web component's initialization until its matching ancestors have executed their connectedCallback. This is when contextual elements (publisher, dataProvider, etc.) are configured.\n",
3679
3684
  "files": {
3680
- "docs/_getting-started/pubsub.md": {
3681
- "title": "Sharing data",
3685
+ "docs/_decorators/wait-for-ancestors.md": {
3686
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3682
3687
  "hashes": {
3683
- "dataprovider": {
3688
+ "awaitconnectedancestors-and-dispatchconnectedevent": {
3684
3689
  "count": 1,
3685
- "title": "DataProvider",
3690
+ "title": "",
3686
3691
  "type": "paragraph"
3687
3692
  }
3688
3693
  }
@@ -3690,14 +3695,14 @@
3690
3695
  }
3691
3696
  },
3692
3697
  {
3693
- "search": "The PublisherManager is a utility class to get publishers\n",
3698
+ "search": "When a child component attaches to the DOM, its ancestors may not yet be initialized (especially if custom element definitions are loaded asynchronously). The @awaitConnectedAncestors decorator delays the component's connectedCallback until all ancestors matching the provided CSS selectors have executed their connectedCallback.\n",
3694
3699
  "files": {
3695
- "docs/_getting-started/pubsub.md": {
3696
- "title": "Sharing data",
3700
+ "docs/_decorators/wait-for-ancestors.md": {
3701
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3697
3702
  "hashes": {
3698
- "publishermanager": {
3703
+ "principle": {
3699
3704
  "count": 1,
3700
- "title": "PublisherManager",
3705
+ "title": "Principle",
3701
3706
  "type": "paragraph"
3702
3707
  }
3703
3708
  }
@@ -3705,14 +3710,14 @@
3705
3710
  }
3706
3711
  },
3707
3712
  {
3708
- "search": "It plays a central role in the components, especially through the "subscriber" mixin.\nAutomatic data communication between components in concorde uses this principle in conjunction with Lit's reactive properties. \nRefer to the documentation for Subscriber.\n",
3713
+ "search": "The @dispatchConnectedEvent decorator allows ancestors to signal they are ready by dispatching the sonic-connected event at the end of their connectedCallback. The event bubbles, so it can be listened to from anywhere (e.g. document.addEventListener(CONNECTED, handler)).\n",
3709
3714
  "files": {
3710
- "docs/_getting-started/pubsub.md": {
3711
- "title": "Sharing data",
3715
+ "docs/_decorators/wait-for-ancestors.md": {
3716
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3712
3717
  "hashes": {
3713
- "publishermanager": {
3718
+ "principle": {
3714
3719
  "count": 1,
3715
- "title": "PublisherManager",
3720
+ "title": "Principle",
3716
3721
  "type": "paragraph"
3717
3722
  }
3718
3723
  }
@@ -3720,14 +3725,14 @@
3720
3725
  }
3721
3726
  },
3722
3727
  {
3723
- "search": "It is declared on the window object to allow usage in a web page, so the equivalent one-liner would be:\n",
3728
+ "search": "Ancestors that are not web components (no hyphen in tag name) are considered connected by default and do not need to emit the event.\n",
3724
3729
  "files": {
3725
- "docs/_getting-started/pubsub.md": {
3726
- "title": "Sharing data",
3730
+ "docs/_decorators/wait-for-ancestors.md": {
3731
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3727
3732
  "hashes": {
3728
- "publishermanager": {
3733
+ "principle": {
3729
3734
  "count": 1,
3730
- "title": "PublisherManager",
3735
+ "title": "Principle",
3731
3736
  "type": "paragraph"
3732
3737
  }
3733
3738
  }
@@ -3735,14 +3740,14 @@
3735
3740
  }
3736
3741
  },
3737
3742
  {
3738
- "search": "This example can be tested in a console when Concorde is loaded on the page (for example, in a ticketing system).\nIn a component, you will need to perform an import as explained earlier.\n",
3743
+ "search": "An ancestor container decorated with @dispatchConnectedEvent() signals when it is ready. A child component decorated with @awaitConnectedAncestors("demo-wait-ancestor-container[dataProvider]") waits for this container to be initialized before initializing itself. Parameters are CSS selectors (element.matches()).\n",
3739
3744
  "files": {
3740
- "docs/_getting-started/pubsub.md": {
3741
- "title": "Sharing data",
3745
+ "docs/_decorators/wait-for-ancestors.md": {
3746
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3742
3747
  "hashes": {
3743
3748
  "basic-example": {
3744
3749
  "count": 1,
3745
- "title": "Basic Example",
3750
+ "title": "Basic example",
3746
3751
  "type": "paragraph"
3747
3752
  }
3748
3753
  }
@@ -3750,29 +3755,29 @@
3750
3755
  }
3751
3756
  },
3752
3757
  {
3753
- "search": "Introduction",
3758
+ "search": "The parent is registered via customElements.define() (vanilla JS) rather than @customElement, so it can be defined later—e.g. when the user clicks a button. This demonstrates the child waiting until the parent exists.\n",
3754
3759
  "files": {
3755
- "docs/_getting-started/start.md": {
3756
- "title": "Introduction",
3760
+ "docs/_decorators/wait-for-ancestors.md": {
3761
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3757
3762
  "hashes": {
3758
- "introduction": {
3763
+ "basic-example": {
3759
3764
  "count": 1,
3760
- "title": "",
3761
- "type": "page"
3765
+ "title": "Basic example",
3766
+ "type": "paragraph"
3762
3767
  }
3763
3768
  }
3764
3769
  }
3765
3770
  }
3766
3771
  },
3767
3772
  {
3768
- "search": "Based on lit.dev, Concorde is a collection of webcomponents made to build shared apps or websites.Develop user interfaces without thinking about the implementation context, where everything is scoped, but preserving graphic consistency by setting the strict minimum of css variables.\n",
3773
+ "search": "The child waits for all specified ancestors. Register outer first, then inner the child initializes only when both are ready.\n",
3769
3774
  "files": {
3770
- "docs/_getting-started/start.md": {
3771
- "title": "Introduction",
3775
+ "docs/_decorators/wait-for-ancestors.md": {
3776
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3772
3777
  "hashes": {
3773
- "what-is-concorde-": {
3778
+ "multiple-ancestors": {
3774
3779
  "count": 1,
3775
- "title": "What is Concorde ?",
3780
+ "title": "Multiple ancestors",
3776
3781
  "type": "paragraph"
3777
3782
  }
3778
3783
  }
@@ -3780,14 +3785,14 @@
3780
3785
  }
3781
3786
  },
3782
3787
  {
3783
- "search": "In 2022, Supersoniks wanted to create a new version of his ticketing app, in production un nearly 100 websites. We needed shared components which could be implemented in mobile apps, modern websites, and also old ones made in php, without bundlers or whatever.Instead of building a new app for each type of project, which would become impossible to maintain, we've decided to create one app, composed by a few webcomponents wich could easily be recomposed on any website.\nWebcomponents appeared to be a the perfect solution to guarantee that compatibility with all past, present and futures environment, and lit seemed to be the best choice to build them.\n",
3788
+ "search": "When the parent is defined at load and already in the DOM, the child initializes immediately (no delay).\n",
3784
3789
  "files": {
3785
- "docs/_getting-started/start.md": {
3786
- "title": "Introduction",
3790
+ "docs/_decorators/wait-for-ancestors.md": {
3791
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3787
3792
  "hashes": {
3788
- "why-and-use-case": {
3793
+ "ancestors-already-connected": {
3789
3794
  "count": 1,
3790
- "title": "Why and use case",
3795
+ "title": "Ancestors already connected",
3791
3796
  "type": "paragraph"
3792
3797
  }
3793
3798
  }
@@ -3795,14 +3800,14 @@
3795
3800
  }
3796
3801
  },
3797
3802
  {
3798
- "search": "A new project with Vite, Typescript and Tailwind already configured and a simple example of a subscriber component : \n",
3803
+ "search": "Static (both in DOM from start):\n",
3799
3804
  "files": {
3800
- "docs/_getting-started/start.md": {
3801
- "title": "Introduction",
3805
+ "docs/_decorators/wait-for-ancestors.md": {
3806
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3802
3807
  "hashes": {
3803
- "start-a-new-project-easily": {
3808
+ "ancestors-already-connected": {
3804
3809
  "count": 1,
3805
- "title": "Start a new project easily",
3810
+ "title": "Ancestors already connected",
3806
3811
  "type": "paragraph"
3807
3812
  }
3808
3813
  }
@@ -3810,29 +3815,29 @@
3810
3815
  }
3811
3816
  },
3812
3817
  {
3813
- "search": "Adding styles",
3818
+ "search": "Dynamic (child added on button click):\n",
3814
3819
  "files": {
3815
- "docs/_getting-started/theming.md": {
3816
- "title": "Adding styles",
3820
+ "docs/_decorators/wait-for-ancestors.md": {
3821
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3817
3822
  "hashes": {
3818
- "adding-styles": {
3823
+ "ancestors-already-connected": {
3819
3824
  "count": 1,
3820
- "title": "",
3821
- "type": "page"
3825
+ "title": "Ancestors already connected",
3826
+ "type": "paragraph"
3822
3827
  }
3823
3828
  }
3824
3829
  }
3825
3830
  }
3826
3831
  },
3827
3832
  {
3828
- "search": "No style crosses the shadow root of a component, except for inheritable properties (which have the "inherit" property possible) and CSS variables.\nProperties integrated via a "slot" remain stylizable in a conventional way.\n",
3833
+ "search": "Parameters are CSS selectors matched via element.matches() e.g. "sonic-subscriber", "sonic-subscriber[dataProvider]", ".my-container", or multiple: "sonic-subscriber", "sonic-sdui".\n",
3829
3834
  "files": {
3830
- "docs/_getting-started/theming.md": {
3831
- "title": "Adding styles",
3835
+ "docs/_decorators/wait-for-ancestors.md": {
3836
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3832
3837
  "hashes": {
3833
- "normal-behavior": {
3838
+ "css-selector-support": {
3834
3839
  "count": 1,
3835
- "title": "Normal Behavior",
3840
+ "title": "CSS selector support",
3836
3841
  "type": "paragraph"
3837
3842
  }
3838
3843
  }
@@ -3840,14 +3845,14 @@
3840
3845
  }
3841
3846
  },
3842
3847
  {
3843
- "search": "The declaration of reactive properties is useful for selecting a particular configuration that mostly affects a set of properties.\n",
3848
+ "search": "These decorators are particularly useful for:\n",
3844
3849
  "files": {
3845
- "docs/_getting-started/theming.md": {
3846
- "title": "Adding styles",
3850
+ "docs/_decorators/wait-for-ancestors.md": {
3851
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3847
3852
  "hashes": {
3848
- "choosing-style-presets-via-reactive-properties": {
3853
+ "use-cases": {
3849
3854
  "count": 1,
3850
- "title": "Choosing Style Presets via Reactive Properties:",
3855
+ "title": "Use cases",
3851
3856
  "type": "paragraph"
3852
3857
  }
3853
3858
  }
@@ -3855,14 +3860,14 @@
3855
3860
  }
3856
3861
  },
3857
3862
  {
3858
- "search": "For example, a size property (xs, sm, md, xl) will affect margins, font, line heights to align them with the corresponding CSS vars, which can be customized using the methods mentioned earlier if necessary.\n",
3863
+ "search": "The sonic-connected event bubbles, so you can listen to it from anywhere:\n",
3859
3864
  "files": {
3860
- "docs/_getting-started/theming.md": {
3861
- "title": "Adding styles",
3865
+ "docs/_decorators/wait-for-ancestors.md": {
3866
+ "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
3862
3867
  "hashes": {
3863
- "choosing-style-presets-via-reactive-properties": {
3868
+ "listening-to-the-connected-event": {
3864
3869
  "count": 1,
3865
- "title": "Choosing Style Presets via Reactive Properties:",
3870
+ "title": "Listening to the connected event",
3866
3871
  "type": "paragraph"
3867
3872
  }
3868
3873
  }
@@ -3870,29 +3875,29 @@
3870
3875
  }
3871
3876
  },
3872
3877
  {
3873
- "search": "It is recommended to use the {reflect: true} property for reactive properties that have an associated style on the :host(). For example: :host([type='primary']){...}\n",
3878
+ "search": "Installation",
3874
3879
  "files": {
3875
- "docs/_getting-started/theming.md": {
3876
- "title": "Adding styles",
3880
+ "docs/_getting-started/concorde-outside.md": {
3881
+ "title": "Installation",
3877
3882
  "hashes": {
3878
- "choosing-style-presets-via-reactive-properties": {
3883
+ "installation": {
3879
3884
  "count": 1,
3880
- "title": "Choosing Style Presets via Reactive Properties:",
3881
- "type": "paragraph"
3885
+ "title": "",
3886
+ "type": "page"
3882
3887
  }
3883
3888
  }
3884
3889
  }
3885
3890
  }
3886
3891
  },
3887
3892
  {
3888
- "search": "☢️ Caution: Passing class names via reactive properties / HTML attributes of the component should be avoided as it can quickly lead to difficult-to-manage situations.\n",
3893
+ "search": "The easiest way to use Concorde is by using the Concorde starter.The following command creates a new Vite project in TypeScript mode with Tailwind and an example component to get started.\n",
3889
3894
  "files": {
3890
- "docs/_getting-started/theming.md": {
3891
- "title": "Adding styles",
3895
+ "docs/_getting-started/concorde-outside.md": {
3896
+ "title": "Installation",
3892
3897
  "hashes": {
3893
- "choosing-style-presets-via-reactive-properties": {
3898
+ "starter": {
3894
3899
  "count": 1,
3895
- "title": "Choosing Style Presets via Reactive Properties:",
3900
+ "title": "Starter",
3896
3901
  "type": "paragraph"
3897
3902
  }
3898
3903
  }
@@ -3900,14 +3905,14 @@
3900
3905
  }
3901
3906
  },
3902
3907
  {
3903
- "search": "By default, the display property is inline.\nTherefore, be careful to define it according to the needs, as one might mistakenly expect it to be block as with a regular <div>.\n",
3908
+ "search": "For a more manual configuration, you can refer to the following sections. \nHowever, the Tailwind configuration is not mentioned at the moment.\n",
3904
3909
  "files": {
3905
- "docs/_getting-started/theming.md": {
3906
- "title": "Adding styles",
3910
+ "docs/_getting-started/concorde-outside.md": {
3911
+ "title": "Installation",
3907
3912
  "hashes": {
3908
- "css-display-property": {
3913
+ "brand-new-vite-project": {
3909
3914
  "count": 1,
3910
- "title": "CSS \"display\" Property",
3915
+ "title": "Brand New Vite Project",
3911
3916
  "type": "paragraph"
3912
3917
  }
3913
3918
  }
@@ -3915,14 +3920,404 @@
3915
3920
  }
3916
3921
  },
3917
3922
  {
3918
- "search": "☢️ Caution: Defining the display property as contents may seem attractive at first, but:\n",
3923
+ "search": "Using Lit with TypeScript requires the following configuration in the "compilerOptions" section of the tsconfig.json file:\n",
3919
3924
  "files": {
3920
- "docs/_getting-started/theming.md": {
3921
- "title": "Adding styles",
3925
+ "docs/_getting-started/concorde-outside.md": {
3926
+ "title": "Installation",
3922
3927
  "hashes": {
3923
- "css-display-property": {
3928
+ "creating-the-project": {
3924
3929
  "count": 1,
3925
- "title": "CSS \"display\" Property",
3930
+ "title": "Creating the Project",
3931
+ "type": "paragraph"
3932
+ }
3933
+ }
3934
+ }
3935
+ }
3936
+ },
3937
+ {
3938
+ "search": "Navigate to the project folder created and perform the installation:\n",
3939
+ "files": {
3940
+ "docs/_getting-started/concorde-outside.md": {
3941
+ "title": "Installation",
3942
+ "hashes": {
3943
+ "installing-concorde": {
3944
+ "count": 1,
3945
+ "title": "Installing Concorde",
3946
+ "type": "paragraph"
3947
+ }
3948
+ }
3949
+ }
3950
+ }
3951
+ },
3952
+ {
3953
+ "search": "Shortcut imports work by default in JavaScript, but in TypeScript, they are activated by choice as they inject data into tsconfig.json. Here is the command:\n",
3954
+ "files": {
3955
+ "docs/_getting-started/concorde-outside.md": {
3956
+ "title": "Installation",
3957
+ "hashes": {
3958
+ "shortcut-imports": {
3959
+ "count": 1,
3960
+ "title": "Shortcut Imports",
3961
+ "type": "paragraph"
3962
+ }
3963
+ }
3964
+ }
3965
+ }
3966
+ },
3967
+ {
3968
+ "search": "Shortcut imports replace the actual paths with aliases as follows:\n",
3969
+ "files": {
3970
+ "docs/_getting-started/concorde-outside.md": {
3971
+ "title": "Installation",
3972
+ "hashes": {
3973
+ "shortcut-imports": {
3974
+ "count": 1,
3975
+ "title": "Shortcut Imports",
3976
+ "type": "paragraph"
3977
+ }
3978
+ }
3979
+ }
3980
+ }
3981
+ },
3982
+ {
3983
+ "search": "The original paths remain accessible. Shortcut imports are used for the examples later in this documentation.\n",
3984
+ "files": {
3985
+ "docs/_getting-started/concorde-outside.md": {
3986
+ "title": "Installation",
3987
+ "hashes": {
3988
+ "shortcut-imports": {
3989
+ "count": 1,
3990
+ "title": "Shortcut Imports",
3991
+ "type": "paragraph"
3992
+ }
3993
+ }
3994
+ }
3995
+ }
3996
+ },
3997
+ {
3998
+ "search": "Import needed component in main.ts or wherever you want to use it:\n",
3999
+ "files": {
4000
+ "docs/_getting-started/concorde-outside.md": {
4001
+ "title": "Installation",
4002
+ "hashes": {
4003
+ "simple-integration-in-html": {
4004
+ "count": 1,
4005
+ "title": "Simple Integration in HTML",
4006
+ "type": "paragraph"
4007
+ }
4008
+ }
4009
+ }
4010
+ }
4011
+ },
4012
+ {
4013
+ "search": "Then in the render function ofyour component or in the HTML of the web page that includes the compiled JS, use the component as follows:\n",
4014
+ "files": {
4015
+ "docs/_getting-started/concorde-outside.md": {
4016
+ "title": "Installation",
4017
+ "hashes": {
4018
+ "simple-integration-in-html": {
4019
+ "count": 1,
4020
+ "title": "Simple Integration in HTML",
4021
+ "type": "paragraph"
4022
+ }
4023
+ }
4024
+ }
4025
+ }
4026
+ },
4027
+ {
4028
+ "search": "For example, create a file my-element.ts at the root:\n",
4029
+ "files": {
4030
+ "docs/_getting-started/concorde-outside.md": {
4031
+ "title": "Installation",
4032
+ "hashes": {
4033
+ "using-a-mixin-to-create-a-new-lit-component": {
4034
+ "count": 1,
4035
+ "title": "Using a Mixin to Create a New Lit Component",
4036
+ "type": "paragraph"
4037
+ }
4038
+ }
4039
+ }
4040
+ }
4041
+ },
4042
+ {
4043
+ "search": "@customElement("my-element")\nexport class SonicComponent extends Fetcher(Subscriber(LitElement)) {\n @property() email = "";\n @property() first_name = "";\n @property() last_name = "";\n",
4044
+ "files": {
4045
+ "docs/_getting-started/concorde-outside.md": {
4046
+ "title": "Installation",
4047
+ "hashes": {
4048
+ "using-a-mixin-to-create-a-new-lit-component": {
4049
+ "count": 1,
4050
+ "title": "Using a Mixin to Create a New Lit Component",
4051
+ "type": "paragraph"
4052
+ }
4053
+ }
4054
+ }
4055
+ }
4056
+ },
4057
+ {
4058
+ "search": " render() {\n return html<div> ${this.first_name} ${this.last_name} : ${this.email} </div>;\n }\n}\n \n\n",
4059
+ "files": {
4060
+ "docs/_getting-started/concorde-outside.md": {
4061
+ "title": "Installation",
4062
+ "hashes": {
4063
+ "using-a-mixin-to-create-a-new-lit-component": {
4064
+ "count": 1,
4065
+ "title": "Using a Mixin to Create a New Lit Component",
4066
+ "type": "paragraph"
4067
+ }
4068
+ }
4069
+ }
4070
+ }
4071
+ },
4072
+ {
4073
+ "search": "Import component main.ts or main.js or any other component that uses it to be compiled\n",
4074
+ "files": {
4075
+ "docs/_getting-started/concorde-outside.md": {
4076
+ "title": "Installation",
4077
+ "hashes": {
4078
+ "using-a-mixin-to-create-a-new-lit-component": {
4079
+ "count": 1,
4080
+ "title": "Using a Mixin to Create a New Lit Component",
4081
+ "type": "paragraph"
4082
+ }
4083
+ }
4084
+ }
4085
+ }
4086
+ },
4087
+ {
4088
+ "search": "In the HTML of a JS or TS component or in the HTML of the web page containing the compiled JS:\n",
4089
+ "files": {
4090
+ "docs/_getting-started/concorde-outside.md": {
4091
+ "title": "Installation",
4092
+ "hashes": {
4093
+ "using-a-mixin-to-create-a-new-lit-component": {
4094
+ "count": 1,
4095
+ "title": "Using a Mixin to Create a New Lit Component",
4096
+ "type": "paragraph"
4097
+ }
4098
+ }
4099
+ }
4100
+ }
4101
+ },
4102
+ {
4103
+ "search": "Creating components",
4104
+ "files": {
4105
+ "docs/_getting-started/create-a-component.md": {
4106
+ "title": "Creating components",
4107
+ "hashes": {
4108
+ "creating-components": {
4109
+ "count": 1,
4110
+ "title": "",
4111
+ "type": "page"
4112
+ }
4113
+ }
4114
+ }
4115
+ }
4116
+ },
4117
+ {
4118
+ "search": "In this document, we consider the src directory of the project as the root.\nWe describe how we organize our components as an example, however it depends on your project.\n",
4119
+ "files": {
4120
+ "docs/_getting-started/create-a-component.md": {
4121
+ "title": "Creating components",
4122
+ "hashes": {
4123
+ "where-to-put-it": {
4124
+ "count": 1,
4125
+ "title": "Where to put it?",
4126
+ "type": "paragraph"
4127
+ }
4128
+ }
4129
+ }
4130
+ }
4131
+ },
4132
+ {
4133
+ "search": "In concorde each component is currently organized in the following directory structure (at least we try):\n",
4134
+ "files": {
4135
+ "docs/_getting-started/create-a-component.md": {
4136
+ "title": "Creating components",
4137
+ "hashes": {
4138
+ "where-to-put-it": {
4139
+ "count": 1,
4140
+ "title": "Where to put it?",
4141
+ "type": "paragraph"
4142
+ }
4143
+ }
4144
+ }
4145
+ }
4146
+ },
4147
+ {
4148
+ "search": "You can copy example.ts from the source to the desired destination to start with.\nThis file contains a web component in the form of a class that extends the Subscriber mixin, with a reactive property and a render function.\n",
4149
+ "files": {
4150
+ "docs/_getting-started/create-a-component.md": {
4151
+ "title": "Creating components",
4152
+ "hashes": {
4153
+ "starting-from-a-simple-model": {
4154
+ "count": 1,
4155
+ "title": "Starting from a Simple Model",
4156
+ "type": "paragraph"
4157
+ }
4158
+ }
4159
+ }
4160
+ }
4161
+ },
4162
+ {
4163
+ "search": "@customElement("sonic-example")\nexport class SonicComponent extends Subscriber(LitElement) {\n @property() text = "Example";\n render() {\n return html${this.text};\n }\n}\n \n\n",
4164
+ "files": {
4165
+ "docs/_getting-started/create-a-component.md": {
4166
+ "title": "Creating components",
4167
+ "hashes": {
4168
+ "starting-from-a-simple-model": {
4169
+ "count": 1,
4170
+ "title": "Starting from a Simple Model",
4171
+ "type": "paragraph"
4172
+ }
4173
+ }
4174
+ }
4175
+ }
4176
+ },
4177
+ {
4178
+ "search": "You can remove the dependency on Subscriber if automatic population of the component with external data is not required.\nFor example, for a UI component:\n",
4179
+ "files": {
4180
+ "docs/_getting-started/create-a-component.md": {
4181
+ "title": "Creating components",
4182
+ "hashes": {
4183
+ "starting-from-a-simple-model": {
4184
+ "count": 1,
4185
+ "title": "Starting from a Simple Model",
4186
+ "type": "paragraph"
4187
+ }
4188
+ }
4189
+ }
4190
+ }
4191
+ },
4192
+ {
4193
+ "search": "@customElement("sonic-example")\nexport class SonicComponent extends LitElement {\n @property() text = "Example";\n render() {\n return html${this.text};\n }\n}\n \n\n",
4194
+ "files": {
4195
+ "docs/_getting-started/create-a-component.md": {
4196
+ "title": "Creating components",
4197
+ "hashes": {
4198
+ "starting-from-a-simple-model": {
4199
+ "count": 1,
4200
+ "title": "Starting from a Simple Model",
4201
+ "type": "paragraph"
4202
+ }
4203
+ }
4204
+ }
4205
+ }
4206
+ },
4207
+ {
4208
+ "search": "Regarding Subscriber, see:\n",
4209
+ "files": {
4210
+ "docs/_getting-started/create-a-component.md": {
4211
+ "title": "Creating components",
4212
+ "hashes": {
4213
+ "starting-from-a-simple-model": {
4214
+ "count": 1,
4215
+ "title": "Starting from a Simple Model",
4216
+ "type": "paragraph"
4217
+ }
4218
+ }
4219
+ }
4220
+ }
4221
+ },
4222
+ {
4223
+ "search": "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:\n",
4224
+ "files": {
4225
+ "docs/_getting-started/create-a-component.md": {
4226
+ "title": "Creating components",
4227
+ "hashes": {
4228
+ "naming-the-component": {
4229
+ "count": 1,
4230
+ "title": "Naming the Component",
4231
+ "type": "paragraph"
4232
+ }
4233
+ }
4234
+ }
4235
+ }
4236
+ },
4237
+ {
4238
+ "search": "For less generic components with a specific destination, we advise to include the destination in the name.\nFor example, for a "title" component in the "event" destination, the name would be simply:\n",
4239
+ "files": {
4240
+ "docs/_getting-started/create-a-component.md": {
4241
+ "title": "Creating components",
4242
+ "hashes": {
4243
+ "naming-the-component": {
4244
+ "count": 1,
4245
+ "title": "Naming the Component",
4246
+ "type": "paragraph"
4247
+ }
4248
+ }
4249
+ }
4250
+ }
4251
+ },
4252
+ {
4253
+ "search": "To do this, study the functioning of https://lit.dev and also refer to Subscriber.\n",
4254
+ "files": {
4255
+ "docs/_getting-started/create-a-component.md": {
4256
+ "title": "Creating components",
4257
+ "hashes": {
4258
+ "creating-reactive-properties-and-modifying-the-render-function": {
4259
+ "count": 1,
4260
+ "title": "Creating Reactive Properties and Modifying the Render Function",
4261
+ "type": "paragraph"
4262
+ }
4263
+ }
4264
+ }
4265
+ }
4266
+ },
4267
+ {
4268
+ "search": "The HTML structure of a component should remain as simple as possible.\n",
4269
+ "files": {
4270
+ "docs/_getting-started/create-a-component.md": {
4271
+ "title": "Creating components",
4272
+ "hashes": {
4273
+ "html-structure-of-a-component": {
4274
+ "count": 1,
4275
+ "title": "HTML Structure of a Component",
4276
+ "type": "paragraph"
4277
+ }
4278
+ }
4279
+ }
4280
+ }
4281
+ },
4282
+ {
4283
+ "search": "Ideally, there should be only one additional level of elements in addition to slots.\n",
4284
+ "files": {
4285
+ "docs/_getting-started/create-a-component.md": {
4286
+ "title": "Creating components",
4287
+ "hashes": {
4288
+ "html-structure-of-a-component": {
4289
+ "count": 1,
4290
+ "title": "HTML Structure of a Component",
4291
+ "type": "paragraph"
4292
+ }
4293
+ }
4294
+ }
4295
+ }
4296
+ },
4297
+ {
4298
+ "search": "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.\n",
4299
+ "files": {
4300
+ "docs/_getting-started/create-a-component.md": {
4301
+ "title": "Creating components",
4302
+ "hashes": {
4303
+ "html-structure-of-a-component": {
4304
+ "count": 1,
4305
+ "title": "HTML Structure of a Component",
4306
+ "type": "paragraph"
4307
+ }
4308
+ }
4309
+ }
4310
+ }
4311
+ },
4312
+ {
4313
+ "search": "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.\n",
4314
+ "files": {
4315
+ "docs/_getting-started/create-a-component.md": {
4316
+ "title": "Creating components",
4317
+ "hashes": {
4318
+ "referencing-it": {
4319
+ "count": 1,
4320
+ "title": "Referencing It",
3926
4321
  "type": "paragraph"
3927
4322
  }
3928
4323
  }
@@ -3930,14 +4325,14 @@
3930
4325
  }
3931
4326
  },
3932
4327
  {
3933
- "search": "tailwind has been integrated into Concorde and is available in scoped components (with Shadow DOM).\nTo use it, you need to import the following:\n",
4328
+ "search": "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.\n",
3934
4329
  "files": {
3935
- "docs/_getting-started/theming.md": {
3936
- "title": "Adding styles",
4330
+ "docs/_getting-started/create-a-component.md": {
4331
+ "title": "Creating components",
3937
4332
  "hashes": {
3938
- "tailwind-functional-classes": {
4333
+ "referencing-it": {
3939
4334
  "count": 1,
3940
- "title": "TAILWIND Functional Classes",
4335
+ "title": "Referencing It",
3941
4336
  "type": "paragraph"
3942
4337
  }
3943
4338
  }
@@ -3945,14 +4340,14 @@
3945
4340
  }
3946
4341
  },
3947
4342
  {
3948
- "search": "Then include the tailwind style in the static styles property of the component:\n",
4343
+ "search": "Here's where we add imports based on the component's location inside concorde as an example\n",
3949
4344
  "files": {
3950
- "docs/_getting-started/theming.md": {
3951
- "title": "Adding styles",
4345
+ "docs/_getting-started/create-a-component.md": {
4346
+ "title": "Creating components",
3952
4347
  "hashes": {
3953
- "tailwind-functional-classes": {
4348
+ "referencing-it": {
3954
4349
  "count": 1,
3955
- "title": "TAILWIND Functional Classes",
4350
+ "title": "Referencing It",
3956
4351
  "type": "paragraph"
3957
4352
  }
3958
4353
  }
@@ -3960,14 +4355,14 @@
3960
4355
  }
3961
4356
  },
3962
4357
  {
3963
- "search": "Finally, use it in the HTML within the render function:\n",
4358
+ "search": "As a reminder, the component is simply integrated into the context by adding a tag with the component's name, for example:\n",
3964
4359
  "files": {
3965
- "docs/_getting-started/theming.md": {
3966
- "title": "Adding styles",
4360
+ "docs/_getting-started/create-a-component.md": {
4361
+ "title": "Creating components",
3967
4362
  "hashes": {
3968
- "tailwind-functional-classes": {
4363
+ "using-it": {
3969
4364
  "count": 1,
3970
- "title": "TAILWIND Functional Classes",
4365
+ "title": "Using It",
3971
4366
  "type": "paragraph"
3972
4367
  }
3973
4368
  }
@@ -3975,14 +4370,29 @@
3975
4370
  }
3976
4371
  },
3977
4372
  {
3978
- "search": "The colors from Concorde's theme are referenced in Tailwind's theme.\n",
4373
+ "search": "My first subscriber component",
3979
4374
  "files": {
3980
- "docs/_getting-started/theming.md": {
3981
- "title": "Adding styles",
4375
+ "docs/_getting-started/my-first-subscriber.md": {
4376
+ "title": "My first subscriber component",
3982
4377
  "hashes": {
3983
- "tailwind-functional-classes": {
4378
+ "my-first-subscriber-component": {
3984
4379
  "count": 1,
3985
- "title": "TAILWIND Functional Classes",
4380
+ "title": "",
4381
+ "type": "page"
4382
+ }
4383
+ }
4384
+ }
4385
+ }
4386
+ },
4387
+ {
4388
+ "search": "Learn how to build a subscriber component, styled with tailwind, \nwhich could be used as a regular component or could be filled from a dataprovider.\n",
4389
+ "files": {
4390
+ "docs/_getting-started/my-first-subscriber.md": {
4391
+ "title": "My first subscriber component",
4392
+ "hashes": {
4393
+ "my-first-subscriber-component": {
4394
+ "count": 1,
4395
+ "title": "",
3986
4396
  "type": "paragraph"
3987
4397
  }
3988
4398
  }
@@ -3990,14 +4400,14 @@
3990
4400
  }
3991
4401
  },
3992
4402
  {
3993
- "search": "This operation is particularly useful when it comes to adding behavior to a simple existing element.\nIt may also become necessary to establish compatibility with a traditional JS library.\n",
4403
+ "search": "First export tailwind, in a tailwind.ts file, stylesheet to add it in our component when needed.\n",
3994
4404
  "files": {
3995
- "docs/_getting-started/theming.md": {
3996
- "title": "Adding styles",
4405
+ "docs/_getting-started/my-first-subscriber.md": {
4406
+ "title": "My first subscriber component",
3997
4407
  "hashes": {
3998
- "usefulness": {
4408
+ "style-with-tailwind-and-ui-components": {
3999
4409
  "count": 1,
4000
- "title": "Usefulness",
4410
+ "title": "Style with tailwind and ui components",
4001
4411
  "type": "paragraph"
4002
4412
  }
4003
4413
  }
@@ -4005,14 +4415,14 @@
4005
4415
  }
4006
4416
  },
4007
4417
  {
4008
- "search": "For example, with a text input:\n",
4418
+ "search": "Reactive properties can be filled by its attributes as a simple lit component.\n",
4009
4419
  "files": {
4010
- "docs/_getting-started/theming.md": {
4011
- "title": "Adding styles",
4420
+ "docs/_getting-started/my-first-subscriber.md": {
4421
+ "title": "My first subscriber component",
4012
4422
  "hashes": {
4013
- "usefulness": {
4423
+ "basic-usage": {
4014
4424
  "count": 1,
4015
- "title": "Usefulness",
4425
+ "title": "Basic usage",
4016
4426
  "type": "paragraph"
4017
4427
  }
4018
4428
  }
@@ -4020,14 +4430,14 @@
4020
4430
  }
4021
4431
  },
4022
4432
  {
4023
- "search": "If there is no shadow DOM (see the noShadowDom property of Subscriber):\n",
4433
+ "search": "Import Subscriber mixin, and add it around LitElement.\n\n",
4024
4434
  "files": {
4025
- "docs/_getting-started/theming.md": {
4026
- "title": "Adding styles",
4435
+ "docs/_getting-started/my-first-subscriber.md": {
4436
+ "title": "My first subscriber component",
4027
4437
  "hashes": {
4028
- "consequences": {
4438
+ "add-subscriber-mixin": {
4029
4439
  "count": 1,
4030
- "title": "Consequences",
4440
+ "title": "Add Subscriber mixin",
4031
4441
  "type": "paragraph"
4032
4442
  }
4033
4443
  }
@@ -4035,14 +4445,14 @@
4035
4445
  }
4036
4446
  },
4037
4447
  {
4038
- "search": "For example, the components queue, list, and fetch do not have a shadow DOM.\n",
4448
+ "search": "Without a dataProvider attribute, a subscriber set its own dataprovider from first ancestor found, and then reactive properties automatically filled and update from it.\nA fetcher is a simple component which set its fetch result to props of its dataprovider.\n\n",
4039
4449
  "files": {
4040
- "docs/_getting-started/theming.md": {
4041
- "title": "Adding styles",
4450
+ "docs/_getting-started/my-first-subscriber.md": {
4451
+ "title": "My first subscriber component",
4042
4452
  "hashes": {
4043
- "consequences": {
4453
+ "autofill-properties-from-a-dataprovider": {
4044
4454
  "count": 1,
4045
- "title": "Consequences",
4455
+ "title": "Autofill properties from a dataProvider",
4046
4456
  "type": "paragraph"
4047
4457
  }
4048
4458
  }
@@ -4050,14 +4460,14 @@
4050
4460
  }
4051
4461
  },
4052
4462
  {
4053
- "search": "ℹ️ Note: Specifically in this case, it may be useful to set the display property to contents.\n",
4463
+ "search": "A subscriber can subscribe data from anywhere in the DOM, with its dataprovider set as a provider id.\n",
4054
4464
  "files": {
4055
- "docs/_getting-started/theming.md": {
4056
- "title": "Adding styles",
4465
+ "docs/_getting-started/my-first-subscriber.md": {
4466
+ "title": "My first subscriber component",
4057
4467
  "hashes": {
4058
- "consequences": {
4468
+ "autofill-properties-from-a-dataprovider": {
4059
4469
  "count": 1,
4060
- "title": "Consequences",
4470
+ "title": "Autofill properties from a dataProvider",
4061
4471
  "type": "paragraph"
4062
4472
  }
4063
4473
  }
@@ -4065,12 +4475,12 @@
4065
4475
  }
4066
4476
  },
4067
4477
  {
4068
- "search": "@ancestorAttribute",
4478
+ "search": "Sharing data",
4069
4479
  "files": {
4070
- "docs/_misc/ancestor-attribute.md": {
4071
- "title": "@ancestorAttribute",
4480
+ "docs/_getting-started/pubsub.md": {
4481
+ "title": "Sharing data",
4072
4482
  "hashes": {
4073
- "ancestorattribute": {
4483
+ "sharing-data": {
4074
4484
  "count": 1,
4075
4485
  "title": "",
4076
4486
  "type": "page"
@@ -4080,12 +4490,12 @@
4080
4490
  }
4081
4491
  },
4082
4492
  {
4083
- "search": "The @ancestorAttribute decorator automatically injects the value of an ancestor's attribute into a class property at the time of connectedCallback.\n",
4493
+ "search": "This section describes how we share data between graphical and non graphical components and classes.\n",
4084
4494
  "files": {
4085
- "docs/_misc/ancestor-attribute.md": {
4086
- "title": "@ancestorAttribute",
4495
+ "docs/_getting-started/pubsub.md": {
4496
+ "title": "Sharing data",
4087
4497
  "hashes": {
4088
- "ancestorattribute": {
4498
+ "sharing-data": {
4089
4499
  "count": 1,
4090
4500
  "title": "",
4091
4501
  "type": "paragraph"
@@ -4095,10 +4505,40 @@
4095
4505
  }
4096
4506
  },
4097
4507
  {
4098
- "search": "This decorator uses HTML.getAncestorAttributeValue to traverse up the DOM tree from the current element and find the first ancestor that has the specified attribute. The value of this attribute is then assigned to the decorated property.\n",
4508
+ "search": "Especialy, graphical components should not reference each other in order to remain decoupled.\n",
4099
4509
  "files": {
4100
- "docs/_misc/ancestor-attribute.md": {
4101
- "title": "@ancestorAttribute",
4510
+ "docs/_getting-started/pubsub.md": {
4511
+ "title": "Sharing data",
4512
+ "hashes": {
4513
+ "sharing-data": {
4514
+ "count": 1,
4515
+ "title": "",
4516
+ "type": "paragraph"
4517
+ }
4518
+ }
4519
+ }
4520
+ }
4521
+ },
4522
+ {
4523
+ "search": "Thats why we use publish/subscribe paradigm to addresse this issue.\n",
4524
+ "files": {
4525
+ "docs/_getting-started/pubsub.md": {
4526
+ "title": "Sharing data",
4527
+ "hashes": {
4528
+ "sharing-data": {
4529
+ "count": 1,
4530
+ "title": "",
4531
+ "type": "paragraph"
4532
+ }
4533
+ }
4534
+ }
4535
+ }
4536
+ },
4537
+ {
4538
+ "search": "❇️ The order of data creation and subscription theoretically has no importance.\n",
4539
+ "files": {
4540
+ "docs/_getting-started/pubsub.md": {
4541
+ "title": "Sharing data",
4102
4542
  "hashes": {
4103
4543
  "principle": {
4104
4544
  "count": 1,
@@ -4110,14 +4550,14 @@
4110
4550
  }
4111
4551
  },
4112
4552
  {
4113
- "search": "Le composant lit les attributs dataProvider et testAttribute exposés par son conteneur ancêtre.\n",
4553
+ "search": "Denotes the identifier of a publisher as referenced in the PublisherManager (see below).\nUses the dataProvider attribut in html tags to scop the content with some data.\nsee Subscribers.\n",
4114
4554
  "files": {
4115
- "docs/_misc/ancestor-attribute.md": {
4116
- "title": "@ancestorAttribute",
4555
+ "docs/_getting-started/pubsub.md": {
4556
+ "title": "Sharing data",
4117
4557
  "hashes": {
4118
- "basic-example": {
4558
+ "dataprovider": {
4119
4559
  "count": 1,
4120
- "title": "Basic example",
4560
+ "title": "DataProvider",
4121
4561
  "type": "paragraph"
4122
4562
  }
4123
4563
  }
@@ -4125,44 +4565,59 @@
4125
4565
  }
4126
4566
  },
4127
4567
  {
4128
- "search": "This decorator is particularly useful for:\n",
4568
+ "search": "The PublisherManager is a utility class to get publishers\n",
4129
4569
  "files": {
4130
- "docs/_misc/ancestor-attribute.md": {
4131
- "title": "@ancestorAttribute",
4570
+ "docs/_getting-started/pubsub.md": {
4571
+ "title": "Sharing data",
4132
4572
  "hashes": {
4133
- "use-cases": {
4573
+ "publishermanager": {
4134
4574
  "count": 1,
4135
- "title": "Use cases",
4575
+ "title": "PublisherManager",
4136
4576
  "type": "paragraph"
4137
4577
  }
4138
4578
  }
4139
- },
4140
- "docs/_misc/auto-subscribe.md": {
4141
- "title": "@autoSubscribe",
4579
+ }
4580
+ }
4581
+ },
4582
+ {
4583
+ "search": "It plays a central role in the components, especially through the "subscriber" mixin.\nAutomatic data communication between components in concorde uses this principle in conjunction with Lit's reactive properties. \nRefer to the documentation for Subscriber.\n",
4584
+ "files": {
4585
+ "docs/_getting-started/pubsub.md": {
4586
+ "title": "Sharing data",
4142
4587
  "hashes": {
4143
- "use-cases": {
4588
+ "publishermanager": {
4144
4589
  "count": 1,
4145
- "title": "Use cases",
4590
+ "title": "PublisherManager",
4146
4591
  "type": "paragraph"
4147
4592
  }
4148
4593
  }
4149
- },
4150
- "docs/_misc/bind.md": {
4151
- "title": "@bind",
4594
+ }
4595
+ }
4596
+ },
4597
+ {
4598
+ "search": "It is declared on the window object to allow usage in a web page, so the equivalent one-liner would be:\n",
4599
+ "files": {
4600
+ "docs/_getting-started/pubsub.md": {
4601
+ "title": "Sharing data",
4152
4602
  "hashes": {
4153
- "use-cases": {
4603
+ "publishermanager": {
4154
4604
  "count": 1,
4155
- "title": "Use cases",
4605
+ "title": "PublisherManager",
4156
4606
  "type": "paragraph"
4157
4607
  }
4158
4608
  }
4159
- },
4160
- "docs/_misc/on-assign.md": {
4161
- "title": "@onAssign",
4609
+ }
4610
+ }
4611
+ },
4612
+ {
4613
+ "search": "This example can be tested in a console when Concorde is loaded on the page (for example, in a ticketing system).\nIn a component, you will need to perform an import as explained earlier.\n",
4614
+ "files": {
4615
+ "docs/_getting-started/pubsub.md": {
4616
+ "title": "Sharing data",
4162
4617
  "hashes": {
4163
- "use-cases": {
4618
+ "basic-example": {
4164
4619
  "count": 1,
4165
- "title": "Use cases",
4620
+ "title": "Basic Example",
4166
4621
  "type": "paragraph"
4167
4622
  }
4168
4623
  }
@@ -4170,12 +4625,12 @@
4170
4625
  }
4171
4626
  },
4172
4627
  {
4173
- "search": "@autoSubscribe",
4628
+ "search": "Introduction",
4174
4629
  "files": {
4175
- "docs/_misc/auto-subscribe.md": {
4176
- "title": "@autoSubscribe",
4630
+ "docs/_getting-started/start.md": {
4631
+ "title": "Introduction",
4177
4632
  "hashes": {
4178
- "autosubscribe": {
4633
+ "introduction": {
4179
4634
  "count": 1,
4180
4635
  "title": "",
4181
4636
  "type": "page"
@@ -4185,14 +4640,14 @@
4185
4640
  }
4186
4641
  },
4187
4642
  {
4188
- "search": "The @autoSubscribe decorator automatically detects which publishers are accessed within a method and subscribes to them. When any of these publishers change, the method is automatically re-executed.\n",
4643
+ "search": "Based on lit.dev, Concorde is a collection of webcomponents made to build shared apps or websites.Develop user interfaces without thinking about the implementation context, where everything is scoped, but preserving graphic consistency by setting the strict minimum of css variables.\n",
4189
4644
  "files": {
4190
- "docs/_misc/auto-subscribe.md": {
4191
- "title": "@autoSubscribe",
4645
+ "docs/_getting-started/start.md": {
4646
+ "title": "Introduction",
4192
4647
  "hashes": {
4193
- "autosubscribe": {
4648
+ "what-is-concorde-": {
4194
4649
  "count": 1,
4195
- "title": "",
4650
+ "title": "What is Concorde ?",
4196
4651
  "type": "paragraph"
4197
4652
  }
4198
4653
  }
@@ -4200,14 +4655,29 @@
4200
4655
  }
4201
4656
  },
4202
4657
  {
4203
- "search": "This decorator wraps a method to track which publishers are accessed during its execution. It then subscribes to all accessed publishers, and when any of them change, the method is re-executed. This provides automatic reactivity without manually managing subscriptions.\n",
4658
+ "search": "In 2022, Supersoniks wanted to create a new version of his ticketing app, in production un nearly 100 websites. We needed shared components which could be implemented in mobile apps, modern websites, and also old ones made in php, without bundlers or whatever.Instead of building a new app for each type of project, which would become impossible to maintain, we've decided to create one app, composed by a few webcomponents wich could easily be recomposed on any website.\nWebcomponents appeared to be a the perfect solution to guarantee that compatibility with all past, present and futures environment, and lit seemed to be the best choice to build them.\n",
4204
4659
  "files": {
4205
- "docs/_misc/auto-subscribe.md": {
4206
- "title": "@autoSubscribe",
4660
+ "docs/_getting-started/start.md": {
4661
+ "title": "Introduction",
4207
4662
  "hashes": {
4208
- "principle": {
4663
+ "why-and-use-case": {
4209
4664
  "count": 1,
4210
- "title": "Principle",
4665
+ "title": "Why and use case",
4666
+ "type": "paragraph"
4667
+ }
4668
+ }
4669
+ }
4670
+ }
4671
+ },
4672
+ {
4673
+ "search": "A new project with Vite, Typescript and Tailwind already configured and a simple example of a subscriber component : \n",
4674
+ "files": {
4675
+ "docs/_getting-started/start.md": {
4676
+ "title": "Introduction",
4677
+ "hashes": {
4678
+ "start-a-new-project-easily": {
4679
+ "count": 1,
4680
+ "title": "Start a new project easily",
4211
4681
  "type": "paragraph"
4212
4682
  }
4213
4683
  }
@@ -4215,12 +4685,12 @@
4215
4685
  }
4216
4686
  },
4217
4687
  {
4218
- "search": "@bind",
4688
+ "search": "Adding styles",
4219
4689
  "files": {
4220
- "docs/_misc/bind.md": {
4221
- "title": "@bind",
4690
+ "docs/_getting-started/theming.md": {
4691
+ "title": "Adding styles",
4222
4692
  "hashes": {
4223
- "bind": {
4693
+ "adding-styles": {
4224
4694
  "count": 1,
4225
4695
  "title": "",
4226
4696
  "type": "page"
@@ -4230,14 +4700,14 @@
4230
4700
  }
4231
4701
  },
4232
4702
  {
4233
- "search": "The @bind decorator automatically binds a class property to a path in a publisher. The property will be automatically \nupdated when the publisher's data changes.\n",
4703
+ "search": "No style crosses the shadow root of a component, except for inheritable properties (which have the "inherit" property possible) and CSS variables.\nProperties integrated via a "slot" remain stylizable in a conventional way.\n",
4234
4704
  "files": {
4235
- "docs/_misc/bind.md": {
4236
- "title": "@bind",
4705
+ "docs/_getting-started/theming.md": {
4706
+ "title": "Adding styles",
4237
4707
  "hashes": {
4238
- "bind": {
4708
+ "normal-behavior": {
4239
4709
  "count": 1,
4240
- "title": "",
4710
+ "title": "Normal Behavior",
4241
4711
  "type": "paragraph"
4242
4712
  }
4243
4713
  }
@@ -4245,14 +4715,14 @@
4245
4715
  }
4246
4716
  },
4247
4717
  {
4248
- "search": "If you need to trigger the rendering lifecycle of a LitElement, please also add the @state() decorator to the property.\n",
4718
+ "search": "The declaration of reactive properties is useful for selecting a particular configuration that mostly affects a set of properties.\n",
4249
4719
  "files": {
4250
- "docs/_misc/bind.md": {
4251
- "title": "@bind",
4720
+ "docs/_getting-started/theming.md": {
4721
+ "title": "Adding styles",
4252
4722
  "hashes": {
4253
- "bind": {
4723
+ "choosing-style-presets-via-reactive-properties": {
4254
4724
  "count": 1,
4255
- "title": "",
4725
+ "title": "Choosing Style Presets via Reactive Properties:",
4256
4726
  "type": "paragraph"
4257
4727
  }
4258
4728
  }
@@ -4260,14 +4730,14 @@
4260
4730
  }
4261
4731
  },
4262
4732
  {
4263
- "search": "This decorator subscribes to a publisher via the PublisherManager using a path (dot notation) to access a specific property. When this property is modified in the publisher, the decorated property is automatically updated.\n",
4733
+ "search": "For example, a size property (xs, sm, md, xl) will affect margins, font, line heights to align them with the corresponding CSS vars, which can be customized using the methods mentioned earlier if necessary.\n",
4264
4734
  "files": {
4265
- "docs/_misc/bind.md": {
4266
- "title": "@bind",
4735
+ "docs/_getting-started/theming.md": {
4736
+ "title": "Adding styles",
4267
4737
  "hashes": {
4268
- "principle": {
4738
+ "choosing-style-presets-via-reactive-properties": {
4269
4739
  "count": 1,
4270
- "title": "Principle",
4740
+ "title": "Choosing Style Presets via Reactive Properties:",
4271
4741
  "type": "paragraph"
4272
4742
  }
4273
4743
  }
@@ -4275,14 +4745,14 @@
4275
4745
  }
4276
4746
  },
4277
4747
  {
4278
- "search": "Lorsque vous avez besoin que les modifications locales se propagent également vers le publisher, activez l'option reflect :\n",
4748
+ "search": "It is recommended to use the {reflect: true} property for reactive properties that have an associated style on the :host(). For example: :host([type='primary']){...}\n",
4279
4749
  "files": {
4280
- "docs/_misc/bind.md": {
4281
- "title": "@bind",
4750
+ "docs/_getting-started/theming.md": {
4751
+ "title": "Adding styles",
4282
4752
  "hashes": {
4283
- "reflect-liaison-bidirectionnelle": {
4753
+ "choosing-style-presets-via-reactive-properties": {
4284
4754
  "count": 1,
4285
- "title": "Reflect (liaison bidirectionnelle)",
4755
+ "title": "Choosing Style Presets via Reactive Properties:",
4286
4756
  "type": "paragraph"
4287
4757
  }
4288
4758
  }
@@ -4290,24 +4760,14 @@
4290
4760
  }
4291
4761
  },
4292
4762
  {
4293
- "search": "The path uses dot notation to navigate through the publisher structure:\n",
4763
+ "search": "☢️ Caution: Passing class names via reactive properties / HTML attributes of the component should be avoided as it can quickly lead to difficult-to-manage situations.\n",
4294
4764
  "files": {
4295
- "docs/_misc/bind.md": {
4296
- "title": "@bind",
4297
- "hashes": {
4298
- "path-syntax": {
4299
- "count": 1,
4300
- "title": "Path syntax",
4301
- "type": "paragraph"
4302
- }
4303
- }
4304
- },
4305
- "docs/_misc/on-assign.md": {
4306
- "title": "@onAssign",
4765
+ "docs/_getting-started/theming.md": {
4766
+ "title": "Adding styles",
4307
4767
  "hashes": {
4308
- "path-syntax": {
4768
+ "choosing-style-presets-via-reactive-properties": {
4309
4769
  "count": 1,
4310
- "title": "Path syntax",
4770
+ "title": "Choosing Style Presets via Reactive Properties:",
4311
4771
  "type": "paragraph"
4312
4772
  }
4313
4773
  }
@@ -4315,14 +4775,14 @@
4315
4775
  }
4316
4776
  },
4317
4777
  {
4318
- "search": "You can now build the path dynamically by referencing the host class properties inside the string passed to @bind. Two placeholder syntaxes are supported:\n",
4778
+ "search": "By default, the display property is inline.\nTherefore, be careful to define it according to the needs, as one might mistakenly expect it to be block as with a regular <div>.\n",
4319
4779
  "files": {
4320
- "docs/_misc/bind.md": {
4321
- "title": "@bind",
4780
+ "docs/_getting-started/theming.md": {
4781
+ "title": "Adding styles",
4322
4782
  "hashes": {
4323
- "dynamic-path-driven-by-class-properties": {
4783
+ "css-display-property": {
4324
4784
  "count": 1,
4325
- "title": "Dynamic path driven by class properties",
4785
+ "title": "CSS \"display\" Property",
4326
4786
  "type": "paragraph"
4327
4787
  }
4328
4788
  }
@@ -4330,14 +4790,14 @@
4330
4790
  }
4331
4791
  },
4332
4792
  {
4333
- "search": "Each placeholder is replaced at runtime with the current value of the corresponding property. @bind automatically watches those properties and:\n",
4793
+ "search": "☢️ Caution: Defining the display property as contents may seem attractive at first, but:\n",
4334
4794
  "files": {
4335
- "docs/_misc/bind.md": {
4336
- "title": "@bind",
4795
+ "docs/_getting-started/theming.md": {
4796
+ "title": "Adding styles",
4337
4797
  "hashes": {
4338
- "dynamic-path-driven-by-class-properties": {
4798
+ "css-display-property": {
4339
4799
  "count": 1,
4340
- "title": "Dynamic path driven by class properties",
4800
+ "title": "CSS \"display\" Property",
4341
4801
  "type": "paragraph"
4342
4802
  }
4343
4803
  }
@@ -4345,14 +4805,14 @@
4345
4805
  }
4346
4806
  },
4347
4807
  {
4348
- "search": " }\n //\n render() {\n return html <div class="flex flex-col gap-2"> <sonic-select .value=${this.dataProvider} label="Users set" @change=${this.updateDataProvider} > <option value="demoUsers">First set of users</option> <option value="demoUsersAlt">Second set of users</option> </sonic-select> <sonic-input type="number" .value=${this.userIndex} @input=${this.updateUserIndex} min="0" max="9" label="Index" class="block" > </sonic-input> <sonic-button @click=${this.updateCurrentUserData} >Update current user data</sonic-button > <div class="flex flex-col gap-2 border p-2"> <div> <sonic-icon name="user" library="heroicons"></sonic-icon> ${this.user?.firstName} ${this.user?.lastName} </div> <div> <sonic-icon name="envelope" library="heroicons"></sonic-icon> ${this.user?.email} </div> </div> </div> ;\n }\n",
4808
+ "search": "tailwind has been integrated into Concorde and is available in scoped components (with Shadow DOM).\nTo use it, you need to import the following:\n",
4349
4809
  "files": {
4350
- "docs/_misc/bind.md": {
4351
- "title": "@bind",
4810
+ "docs/_getting-started/theming.md": {
4811
+ "title": "Adding styles",
4352
4812
  "hashes": {
4353
- "dynamic-path-driven-by-class-properties": {
4813
+ "tailwind-functional-classes": {
4354
4814
  "count": 1,
4355
- "title": "Dynamic path driven by class properties",
4815
+ "title": "TAILWIND Functional Classes",
4356
4816
  "type": "paragraph"
4357
4817
  }
4358
4818
  }
@@ -4360,14 +4820,14 @@
4360
4820
  }
4361
4821
  },
4362
4822
  {
4363
- "search": "⚠️ Use a classic string literal: @bind("${dataProvider}.${profileId}.info.title"). Do not use a template literal (backticks), otherwise JavaScript would try to interpolate the value immediately.\n",
4823
+ "search": "Then include the tailwind style in the static styles property of the component:\n",
4364
4824
  "files": {
4365
- "docs/_misc/bind.md": {
4366
- "title": "@bind",
4825
+ "docs/_getting-started/theming.md": {
4826
+ "title": "Adding styles",
4367
4827
  "hashes": {
4368
- "dynamic-path-driven-by-class-properties": {
4828
+ "tailwind-functional-classes": {
4369
4829
  "count": 1,
4370
- "title": "Dynamic path driven by class properties",
4830
+ "title": "TAILWIND Functional Classes",
4371
4831
  "type": "paragraph"
4372
4832
  }
4373
4833
  }
@@ -4375,24 +4835,14 @@
4375
4835
  }
4376
4836
  },
4377
4837
  {
4378
- "search": "Additional constraints:\n",
4838
+ "search": "Finally, use it in the HTML within the render function:\n",
4379
4839
  "files": {
4380
- "docs/_misc/bind.md": {
4381
- "title": "@bind",
4382
- "hashes": {
4383
- "dynamic-path-driven-by-class-properties": {
4384
- "count": 1,
4385
- "title": "Dynamic path driven by class properties",
4386
- "type": "paragraph"
4387
- }
4388
- }
4389
- },
4390
- "docs/_misc/on-assign.md": {
4391
- "title": "@onAssign",
4840
+ "docs/_getting-started/theming.md": {
4841
+ "title": "Adding styles",
4392
4842
  "hashes": {
4393
- "dynamic-path-driven-by-class-properties": {
4843
+ "tailwind-functional-classes": {
4394
4844
  "count": 1,
4395
- "title": "Dynamic path driven by class properties",
4845
+ "title": "TAILWIND Functional Classes",
4396
4846
  "type": "paragraph"
4397
4847
  }
4398
4848
  }
@@ -4400,29 +4850,29 @@
4400
4850
  }
4401
4851
  },
4402
4852
  {
4403
- "search": "@onAssign",
4853
+ "search": "The colors from Concorde's theme are referenced in Tailwind's theme.\n",
4404
4854
  "files": {
4405
- "docs/_misc/on-assign.md": {
4406
- "title": "@onAssign",
4855
+ "docs/_getting-started/theming.md": {
4856
+ "title": "Adding styles",
4407
4857
  "hashes": {
4408
- "onassign": {
4858
+ "tailwind-functional-classes": {
4409
4859
  "count": 1,
4410
- "title": "",
4411
- "type": "page"
4860
+ "title": "TAILWIND Functional Classes",
4861
+ "type": "paragraph"
4412
4862
  }
4413
4863
  }
4414
4864
  }
4415
4865
  }
4416
4866
  },
4417
4867
  {
4418
- "search": "The @onAssign decorator allows you to execute a method when one or more publishers are updated. The method is called only when all specified publishers have been assigned values.\n",
4868
+ "search": "This operation is particularly useful when it comes to adding behavior to a simple existing element.\nIt may also become necessary to establish compatibility with a traditional JS library.\n",
4419
4869
  "files": {
4420
- "docs/_misc/on-assign.md": {
4421
- "title": "@onAssign",
4870
+ "docs/_getting-started/theming.md": {
4871
+ "title": "Adding styles",
4422
4872
  "hashes": {
4423
- "onassign": {
4873
+ "usefulness": {
4424
4874
  "count": 1,
4425
- "title": "",
4875
+ "title": "Usefulness",
4426
4876
  "type": "paragraph"
4427
4877
  }
4428
4878
  }
@@ -4430,14 +4880,14 @@
4430
4880
  }
4431
4881
  },
4432
4882
  {
4433
- "search": "This decorator subscribes to one or more publishers via the PublisherManager. When all specified publishers have been assigned values (via set), the decorated method is called with all the values as arguments.\n",
4883
+ "search": "For example, with a text input:\n",
4434
4884
  "files": {
4435
- "docs/_misc/on-assign.md": {
4436
- "title": "@onAssign",
4885
+ "docs/_getting-started/theming.md": {
4886
+ "title": "Adding styles",
4437
4887
  "hashes": {
4438
- "principle": {
4888
+ "usefulness": {
4439
4889
  "count": 1,
4440
- "title": "Principle",
4890
+ "title": "Usefulness",
4441
4891
  "type": "paragraph"
4442
4892
  }
4443
4893
  }
@@ -4445,14 +4895,14 @@
4445
4895
  }
4446
4896
  },
4447
4897
  {
4448
- "search": "This is particularly useful when you need to wait for multiple data sources to be ready before executing logic.\n",
4898
+ "search": "If there is no shadow DOM (see the noShadowDom property of Subscriber):\n",
4449
4899
  "files": {
4450
- "docs/_misc/on-assign.md": {
4451
- "title": "@onAssign",
4900
+ "docs/_getting-started/theming.md": {
4901
+ "title": "Adding styles",
4452
4902
  "hashes": {
4453
- "principle": {
4903
+ "consequences": {
4454
4904
  "count": 1,
4455
- "title": "Principle",
4905
+ "title": "Consequences",
4456
4906
  "type": "paragraph"
4457
4907
  }
4458
4908
  }
@@ -4460,14 +4910,14 @@
4460
4910
  }
4461
4911
  },
4462
4912
  {
4463
- "search": "You can now build the paths dynamically by referencing the host class properties inside the strings passed to @onAssign. Two placeholder syntaxes are supported:\n",
4913
+ "search": "For example, the components queue, list, and fetch do not have a shadow DOM.\n",
4464
4914
  "files": {
4465
- "docs/_misc/on-assign.md": {
4466
- "title": "@onAssign",
4915
+ "docs/_getting-started/theming.md": {
4916
+ "title": "Adding styles",
4467
4917
  "hashes": {
4468
- "dynamic-path-driven-by-class-properties": {
4918
+ "consequences": {
4469
4919
  "count": 1,
4470
- "title": "Dynamic path driven by class properties",
4920
+ "title": "Consequences",
4471
4921
  "type": "paragraph"
4472
4922
  }
4473
4923
  }
@@ -4475,14 +4925,14 @@
4475
4925
  }
4476
4926
  },
4477
4927
  {
4478
- "search": "Each placeholder is replaced at runtime with the current value of the corresponding property. @onAssign automatically watches those properties and:\n",
4928
+ "search": "ℹ️ Note: Specifically in this case, it may be useful to set the display property to contents.\n",
4479
4929
  "files": {
4480
- "docs/_misc/on-assign.md": {
4481
- "title": "@onAssign",
4930
+ "docs/_getting-started/theming.md": {
4931
+ "title": "Adding styles",
4482
4932
  "hashes": {
4483
- "dynamic-path-driven-by-class-properties": {
4933
+ "consequences": {
4484
4934
  "count": 1,
4485
- "title": "Dynamic path driven by class properties",
4935
+ "title": "Consequences",
4486
4936
  "type": "paragraph"
4487
4937
  }
4488
4938
  }
@@ -4490,42 +4940,42 @@
4490
4940
  }
4491
4941
  },
4492
4942
  {
4493
- "search": "⚠️ Use classic string literals: @onAssign("${dataProvider}.${profileId}", "settings.${profileId}"). Do not use template literals (backticks), otherwise JavaScript would try to interpolate the value immediately.\n",
4943
+ "search": "DataProviderKey",
4494
4944
  "files": {
4495
- "docs/_misc/on-assign.md": {
4496
- "title": "@onAssign",
4945
+ "docs/_misc/dataProviderKey.md": {
4946
+ "title": "DataProviderKey",
4497
4947
  "hashes": {
4498
- "dynamic-path-driven-by-class-properties": {
4948
+ "dataproviderkey": {
4499
4949
  "count": 1,
4500
- "title": "Dynamic path driven by class properties",
4501
- "type": "paragraph"
4950
+ "title": "",
4951
+ "type": "page"
4502
4952
  }
4503
4953
  }
4504
4954
  }
4505
4955
  }
4506
4956
  },
4507
4957
  {
4508
- "search": "Templates Demo",
4958
+ "search": "The DataProviderKey<T> utility provides type-safe navigation through composite data structures. Each property or index access extends the path, and the final key can be retrieved via toString() or the path property.\n",
4509
4959
  "files": {
4510
- "docs/_misc/templates-demo.md": {
4511
- "title": "Templates Demo",
4960
+ "docs/_misc/dataProviderKey.md": {
4961
+ "title": "DataProviderKey",
4512
4962
  "hashes": {
4513
- "templates-demo": {
4963
+ "dataproviderkey": {
4514
4964
  "count": 1,
4515
4965
  "title": "",
4516
- "type": "page"
4966
+ "type": "paragraph"
4517
4967
  }
4518
4968
  }
4519
4969
  }
4520
4970
  }
4521
4971
  },
4522
4972
  {
4523
- "search": "Some test/demos\n",
4973
+ "search": "For a single HTTP path string (no dot-syntax), see Endpoint.\n",
4524
4974
  "files": {
4525
- "docs/_misc/templates-demo.md": {
4526
- "title": "Templates Demo",
4975
+ "docs/_misc/dataProviderKey.md": {
4976
+ "title": "DataProviderKey",
4527
4977
  "hashes": {
4528
- "templates-demo": {
4978
+ "dataproviderkey": {
4529
4979
  "count": 1,
4530
4980
  "title": "",
4531
4981
  "type": "paragraph"
@@ -4535,29 +4985,29 @@
4535
4985
  }
4536
4986
  },
4537
4987
  {
4538
- "search": "@awaitConnectedAncestors and @dispatchConnectedEvent",
4988
+ "search": "DataProviderKey uses a Proxy to intercept property access and build a cumulative path string. TypeScript infers the nested type at each level, so myKey.items[0] is correctly typed as DataProviderKey<Item> when items is Item[].\n",
4539
4989
  "files": {
4540
- "docs/_misc/wait-for-ancestors.md": {
4541
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
4990
+ "docs/_misc/dataProviderKey.md": {
4991
+ "title": "DataProviderKey",
4542
4992
  "hashes": {
4543
- "awaitconnectedancestors-and-dispatchconnectedevent": {
4993
+ "principle": {
4544
4994
  "count": 1,
4545
- "title": "",
4546
- "type": "page"
4995
+ "title": "Principle",
4996
+ "type": "paragraph"
4547
4997
  }
4548
4998
  }
4549
4999
  }
4550
5000
  }
4551
5001
  },
4552
5002
  {
4553
- "search": "The @awaitConnectedAncestors and @dispatchConnectedEvent decorators delay a web component's initialization until its matching ancestors have executed their connectedCallback. This is when contextual elements (publisher, dataProvider, etc.) are configured.\n",
5003
+ "search": "Use placeholders ${prop} or {$prop} in the path string. The path is resolved at runtime from the component's properties. The type remains declarative:\n",
4554
5004
  "files": {
4555
- "docs/_misc/wait-for-ancestors.md": {
4556
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5005
+ "docs/_misc/dataProviderKey.md": {
5006
+ "title": "DataProviderKey",
4557
5007
  "hashes": {
4558
- "awaitconnectedancestors-and-dispatchconnectedevent": {
5008
+ "dynamic-paths": {
4559
5009
  "count": 1,
4560
- "title": "",
5010
+ "title": "Dynamic paths",
4561
5011
  "type": "paragraph"
4562
5012
  }
4563
5013
  }
@@ -4565,14 +5015,14 @@
4565
5015
  }
4566
5016
  },
4567
5017
  {
4568
- "search": "When a child component attaches to the DOM, its ancestors may not yet be initialized (especially if custom element definitions are loaded asynchronously). The @awaitConnectedAncestors decorator delays the component's connectedCallback until all ancestors matching the provided CSS selectors have executed their connectedCallback.\n",
5018
+ "search": "The final path is built by concatenating each accessed property with a dot:\n",
4569
5019
  "files": {
4570
- "docs/_misc/wait-for-ancestors.md": {
4571
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5020
+ "docs/_misc/dataProviderKey.md": {
5021
+ "title": "DataProviderKey",
4572
5022
  "hashes": {
4573
- "principle": {
5023
+ "path-retrieval": {
4574
5024
  "count": 1,
4575
- "title": "Principle",
5025
+ "title": "Path retrieval",
4576
5026
  "type": "paragraph"
4577
5027
  }
4578
5028
  }
@@ -4580,14 +5030,14 @@
4580
5030
  }
4581
5031
  },
4582
5032
  {
4583
- "search": "The @dispatchConnectedEvent decorator allows ancestors to signal they are ready by dispatching the sonic-connected event at the end of their connectedCallback. The event bubbles, so it can be listened to from anywhere (e.g. document.addEventListener(CONNECTED, handler)).\n",
5033
+ "search": "Use toString() or path to get the full path string:\n",
4584
5034
  "files": {
4585
- "docs/_misc/wait-for-ancestors.md": {
4586
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5035
+ "docs/_misc/dataProviderKey.md": {
5036
+ "title": "DataProviderKey",
4587
5037
  "hashes": {
4588
- "principle": {
5038
+ "path-retrieval": {
4589
5039
  "count": 1,
4590
- "title": "Principle",
5040
+ "title": "Path retrieval",
4591
5041
  "type": "paragraph"
4592
5042
  }
4593
5043
  }
@@ -4595,14 +5045,14 @@
4595
5045
  }
4596
5046
  },
4597
5047
  {
4598
- "search": "Ancestors that are not web components (no hyphen in tag name) are considered connected by default and do not need to emit the event.\n",
5048
+ "search": "Use DataProviderKey with @subscribe (read-only) or @publish (write-only). The decorated property must match the key’s value type:\n",
4599
5049
  "files": {
4600
- "docs/_misc/wait-for-ancestors.md": {
4601
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5050
+ "docs/_misc/dataProviderKey.md": {
5051
+ "title": "DataProviderKey",
4602
5052
  "hashes": {
4603
- "principle": {
5053
+ "integration-with-subscribe-and-publish": {
4604
5054
  "count": 1,
4605
- "title": "Principle",
5055
+ "title": "Integration with @subscribe and @publish",
4606
5056
  "type": "paragraph"
4607
5057
  }
4608
5058
  }
@@ -4610,14 +5060,14 @@
4610
5060
  }
4611
5061
  },
4612
5062
  {
4613
- "search": "An ancestor container decorated with @dispatchConnectedEvent() signals when it is ready. A child component decorated with @awaitConnectedAncestors("demo-wait-ancestor-container[dataProvider]") waits for this container to be initialized before initializing itself. Parameters are CSS selectors (element.matches()).\n",
5063
+ "search": "Both decorators support dynamic paths: "base.${prop}" in the constructor. A wrong property type (e.g. number for DataProviderKey<string>) is a TypeScript error.\n",
4614
5064
  "files": {
4615
- "docs/_misc/wait-for-ancestors.md": {
4616
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5065
+ "docs/_misc/dataProviderKey.md": {
5066
+ "title": "DataProviderKey",
4617
5067
  "hashes": {
4618
- "basic-example": {
5068
+ "integration-with-subscribe-and-publish": {
4619
5069
  "count": 1,
4620
- "title": "Basic example",
5070
+ "title": "Integration with @subscribe and @publish",
4621
5071
  "type": "paragraph"
4622
5072
  }
4623
5073
  }
@@ -4625,29 +5075,29 @@
4625
5075
  }
4626
5076
  },
4627
5077
  {
4628
- "search": "The parent is registered via customElements.define() (vanilla JS) rather than @customElement, so it can be defined later—e.g. when the user clicks a button. This demonstrates the child waiting until the parent exists.\n",
5078
+ "search": "Endpoint",
4629
5079
  "files": {
4630
- "docs/_misc/wait-for-ancestors.md": {
4631
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5080
+ "docs/_misc/endpoint.md": {
5081
+ "title": "Endpoint",
4632
5082
  "hashes": {
4633
- "basic-example": {
5083
+ "endpoint": {
4634
5084
  "count": 1,
4635
- "title": "Basic example",
4636
- "type": "paragraph"
5085
+ "title": "",
5086
+ "type": "page"
4637
5087
  }
4638
5088
  }
4639
5089
  }
4640
5090
  }
4641
5091
  },
4642
5092
  {
4643
- "search": "The child waits for all specified ancestors. Register outer first, then inner the child initializes only when both are ready.\n",
5093
+ "search": "Endpoint<T, U> describes a single HTTP path (or a path accepted by API.get) and carries the expected response type T. Unlike DataProviderKey, there is no dot-navigation: the path is one string.\n",
4644
5094
  "files": {
4645
- "docs/_misc/wait-for-ancestors.md": {
4646
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5095
+ "docs/_misc/endpoint.md": {
5096
+ "title": "Endpoint",
4647
5097
  "hashes": {
4648
- "multiple-ancestors": {
5098
+ "endpoint": {
4649
5099
  "count": 1,
4650
- "title": "Multiple ancestors",
5100
+ "title": "",
4651
5101
  "type": "paragraph"
4652
5102
  }
4653
5103
  }
@@ -4655,14 +5105,14 @@
4655
5105
  }
4656
5106
  },
4657
5107
  {
4658
- "search": "When the parent is defined at load and already in the DOM, the child initializes immediately (no delay).\n",
5108
+ "search": "The optional second generic U (default any) describes host properties used to resolve dynamic segments in the path (${…} / {$…}), for example with the @get decorator.\n",
4659
5109
  "files": {
4660
- "docs/_misc/wait-for-ancestors.md": {
4661
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5110
+ "docs/_misc/endpoint.md": {
5111
+ "title": "Endpoint",
4662
5112
  "hashes": {
4663
- "ancestors-already-connected": {
5113
+ "endpoint": {
4664
5114
  "count": 1,
4665
- "title": "Ancestors already connected",
5115
+ "title": "",
4666
5116
  "type": "paragraph"
4667
5117
  }
4668
5118
  }
@@ -4670,14 +5120,14 @@
4670
5120
  }
4671
5121
  },
4672
5122
  {
4673
- "search": "Static (both in DOM from start):\n",
5123
+ "search": "Endpoint.normalizePath trims the string, rejects an empty path, strips leading slashes for paths relative to serviceURL, collapses duplicate slashes, and validates absolute http(s):// URLs.\n",
4674
5124
  "files": {
4675
- "docs/_misc/wait-for-ancestors.md": {
4676
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5125
+ "docs/_misc/endpoint.md": {
5126
+ "title": "Endpoint",
4677
5127
  "hashes": {
4678
- "ancestors-already-connected": {
5128
+ "normalization": {
4679
5129
  "count": 1,
4680
- "title": "Ancestors already connected",
5130
+ "title": "Normalization",
4681
5131
  "type": "paragraph"
4682
5132
  }
4683
5133
  }
@@ -4685,14 +5135,14 @@
4685
5135
  }
4686
5136
  },
4687
5137
  {
4688
- "search": "Dynamic (child added on button click):\n",
5138
+ "search": "getDataProviderKey() returns a typed publisher key whose path matches the endpoint path (payload typing follows ApiGetResult for this endpoint). Useful when pairing @get with @publish / @subscribe (see @get).\n",
4689
5139
  "files": {
4690
- "docs/_misc/wait-for-ancestors.md": {
4691
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5140
+ "docs/_misc/endpoint.md": {
5141
+ "title": "Endpoint",
4692
5142
  "hashes": {
4693
- "ancestors-already-connected": {
5143
+ "publisher-key-for-payloads": {
4694
5144
  "count": 1,
4695
- "title": "Ancestors already connected",
5145
+ "title": "Publisher key for payloads",
4696
5146
  "type": "paragraph"
4697
5147
  }
4698
5148
  }
@@ -4700,14 +5150,14 @@
4700
5150
  }
4701
5151
  },
4702
5152
  {
4703
- "search": "Parameters are CSS selectors matched via element.matches() e.g. "sonic-subscriber", "sonic-subscriber[dataProvider]", ".my-container", or multiple: "sonic-subscriber", "sonic-sdui".\n",
5153
+ "search": "Endpoint.looksLikeDataProviderPath(path) returns true for strings shaped like dataProvider(id)…, which API.get can resolve without HTTP.\n",
4704
5154
  "files": {
4705
- "docs/_misc/wait-for-ancestors.md": {
4706
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5155
+ "docs/_misc/endpoint.md": {
5156
+ "title": "Endpoint",
4707
5157
  "hashes": {
4708
- "css-selector-support": {
5158
+ "data-provider-paths": {
4709
5159
  "count": 1,
4710
- "title": "CSS selector support",
5160
+ "title": "Data-provider paths",
4711
5161
  "type": "paragraph"
4712
5162
  }
4713
5163
  }
@@ -4715,29 +5165,29 @@
4715
5165
  }
4716
5166
  },
4717
5167
  {
4718
- "search": "These decorators are particularly useful for:\n",
5168
+ "search": "Templates Demo",
4719
5169
  "files": {
4720
- "docs/_misc/wait-for-ancestors.md": {
4721
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5170
+ "docs/_misc/templates-demo.md": {
5171
+ "title": "Templates Demo",
4722
5172
  "hashes": {
4723
- "use-cases": {
5173
+ "templates-demo": {
4724
5174
  "count": 1,
4725
- "title": "Use cases",
4726
- "type": "paragraph"
5175
+ "title": "",
5176
+ "type": "page"
4727
5177
  }
4728
5178
  }
4729
5179
  }
4730
5180
  }
4731
5181
  },
4732
5182
  {
4733
- "search": "The sonic-connected event bubbles, so you can listen to it from anywhere:\n",
5183
+ "search": "Some test/demos\n",
4734
5184
  "files": {
4735
- "docs/_misc/wait-for-ancestors.md": {
4736
- "title": "@awaitConnectedAncestors and @dispatchConnectedEvent",
5185
+ "docs/_misc/templates-demo.md": {
5186
+ "title": "Templates Demo",
4737
5187
  "hashes": {
4738
- "listening-to-the-connected-event": {
5188
+ "templates-demo": {
4739
5189
  "count": 1,
4740
- "title": "Listening to the connected event",
5190
+ "title": "",
4741
5191
  "type": "paragraph"
4742
5192
  }
4743
5193
  }