@praxisui/core 7.0.0-beta.0 → 8.0.0-beta.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.
@@ -3886,6 +3886,14 @@ function createDefaultTableConfig() {
3886
3886
  'stack',
3887
3887
  'tabs',
3888
3888
  'tab',
3889
+ 'text',
3890
+ 'icon',
3891
+ 'image',
3892
+ 'badge',
3893
+ 'avatar',
3894
+ 'metric',
3895
+ 'progress',
3896
+ 'compose',
3889
3897
  'card',
3890
3898
  'value',
3891
3899
  'action',
@@ -5655,6 +5663,16 @@ function providePraxisJsonLogicOperator(definition) {
5655
5663
  useValue: definition,
5656
5664
  };
5657
5665
  }
5666
+ function providePraxisJsonLogicOperatorOverride(definition) {
5667
+ return {
5668
+ provide: PRAXIS_JSON_LOGIC_OPERATORS,
5669
+ multi: true,
5670
+ useValue: {
5671
+ ...definition,
5672
+ override: true,
5673
+ },
5674
+ };
5675
+ }
5658
5676
 
5659
5677
  class PraxisJsonLogicError extends Error {
5660
5678
  code;
@@ -5667,8 +5685,11 @@ class PraxisJsonLogicError extends Error {
5667
5685
  class PraxisJsonLogicService {
5668
5686
  customOperators = new Map();
5669
5687
  constructor(operatorDefinitions) {
5670
- for (const definition of operatorDefinitions ?? DEFAULT_JSON_LOGIC_OPERATORS) {
5671
- this.customOperators.set(definition.operator, definition);
5688
+ for (const definition of DEFAULT_JSON_LOGIC_OPERATORS) {
5689
+ this.registerCustomOperator(definition, 'praxis');
5690
+ }
5691
+ for (const definition of operatorDefinitions ?? []) {
5692
+ this.registerCustomOperator(definition, 'host', definition.override === true);
5672
5693
  }
5673
5694
  }
5674
5695
  evaluate(expression, data, options) {
@@ -5715,6 +5736,38 @@ class PraxisJsonLogicService {
5715
5736
  truthy(value) {
5716
5737
  return this.isTruthy(value);
5717
5738
  }
5739
+ listOperatorDescriptors() {
5740
+ return [
5741
+ ...BUILTIN_JSON_LOGIC_OPERATOR_DESCRIPTORS,
5742
+ ...Array.from(this.customOperators.values()).map((definition) => this.toOperatorDescriptor(definition)),
5743
+ ];
5744
+ }
5745
+ getOperatorDescriptor(operator) {
5746
+ const native = BUILTIN_JSON_LOGIC_OPERATOR_DESCRIPTORS.find((item) => item.operator === operator);
5747
+ if (native) {
5748
+ return native;
5749
+ }
5750
+ const custom = this.customOperators.get(operator);
5751
+ return custom ? this.toOperatorDescriptor(custom) : undefined;
5752
+ }
5753
+ registerCustomOperator(definition, source, allowOverride = false) {
5754
+ const operator = definition.operator;
5755
+ if (BUILTIN_JSON_LOGIC_OPERATORS.includes(operator)) {
5756
+ throw new PraxisJsonLogicError('RULE_OPERATOR_CONFLICT', `JSON Logic operator "${operator}" is native and cannot be registered as a custom operator.`);
5757
+ }
5758
+ const existing = this.customOperators.get(operator);
5759
+ if (existing && !allowOverride) {
5760
+ throw new PraxisJsonLogicError('RULE_OPERATOR_CONFLICT', `JSON Logic operator "${operator}" is already registered by ${existing.source}. Use providePraxisJsonLogicOperatorOverride for an explicit override.`);
5761
+ }
5762
+ this.customOperators.set(operator, {
5763
+ ...definition,
5764
+ source,
5765
+ });
5766
+ }
5767
+ toOperatorDescriptor(definition) {
5768
+ const { evaluate: _evaluate, override: _override, ...descriptor } = definition;
5769
+ return descriptor;
5770
+ }
5718
5771
  createContext(data, options) {
5719
5772
  return {
5720
5773
  data,
@@ -5773,6 +5826,27 @@ class PraxisJsonLogicService {
5773
5826
  if (operator === 'substr') {
5774
5827
  return this.evaluateSubstr(rawArgs, context);
5775
5828
  }
5829
+ if (operator === 'merge') {
5830
+ return this.evaluateMerge(rawArgs, context);
5831
+ }
5832
+ if (operator === 'map') {
5833
+ return this.evaluateMap(rawArgs, context);
5834
+ }
5835
+ if (operator === 'filter') {
5836
+ return this.evaluateFilter(rawArgs, context);
5837
+ }
5838
+ if (operator === 'reduce') {
5839
+ return this.evaluateReduce(rawArgs, context);
5840
+ }
5841
+ if (operator === 'all') {
5842
+ return this.evaluateAll(rawArgs, context);
5843
+ }
5844
+ if (operator === 'some') {
5845
+ return this.evaluateSome(rawArgs, context);
5846
+ }
5847
+ if (operator === 'none') {
5848
+ return this.evaluateNone(rawArgs, context);
5849
+ }
5776
5850
  const custom = this.customOperators.get(operator);
5777
5851
  if (!custom) {
5778
5852
  throw new PraxisJsonLogicError('RULE_OPERATOR_UNKNOWN', `Unsupported JSON Logic operator: ${operator}`);
@@ -5931,6 +6005,82 @@ class PraxisJsonLogicService {
5931
6005
  }
5932
6006
  return value.slice(normalizedStart, normalizedStart + length);
5933
6007
  }
6008
+ evaluateMerge(rawArgs, context) {
6009
+ const args = this.toArgumentArray(rawArgs).map((arg) => this.evaluateValue(arg, context));
6010
+ const result = [];
6011
+ for (const value of args) {
6012
+ if (Array.isArray(value)) {
6013
+ result.push(...value);
6014
+ }
6015
+ else {
6016
+ result.push(value);
6017
+ }
6018
+ }
6019
+ return result;
6020
+ }
6021
+ evaluateMap(rawArgs, context) {
6022
+ const [sourceExpression, mapExpression] = this.requireHigherOrderArgs('map', rawArgs, 2, 2);
6023
+ const source = this.evaluateValue(sourceExpression, context);
6024
+ this.assertArrayOperand('map', source);
6025
+ return source.map((item) => this.evaluateValue(mapExpression, this.createChildContext(context, item)));
6026
+ }
6027
+ evaluateFilter(rawArgs, context) {
6028
+ const [sourceExpression, predicateExpression] = this.requireHigherOrderArgs('filter', rawArgs, 2, 2);
6029
+ const source = this.evaluateValue(sourceExpression, context);
6030
+ this.assertArrayOperand('filter', source);
6031
+ return source.filter((item) => this.isTruthy(this.evaluateValue(predicateExpression, this.createChildContext(context, item))));
6032
+ }
6033
+ evaluateReduce(rawArgs, context) {
6034
+ const [sourceExpression, reducerExpression, initialExpression] = this.requireHigherOrderArgs('reduce', rawArgs, 2, 3);
6035
+ const source = this.evaluateValue(sourceExpression, context);
6036
+ this.assertArrayOperand('reduce', source);
6037
+ let accumulator = initialExpression === undefined
6038
+ ? null
6039
+ : this.evaluateValue(initialExpression, context);
6040
+ for (const current of source) {
6041
+ accumulator = this.evaluateValue(reducerExpression, this.createChildContext(context, {
6042
+ current,
6043
+ accumulator,
6044
+ }));
6045
+ }
6046
+ return accumulator;
6047
+ }
6048
+ evaluateAll(rawArgs, context) {
6049
+ const [sourceExpression, predicateExpression] = this.requireHigherOrderArgs('all', rawArgs, 2, 2);
6050
+ const source = this.evaluateValue(sourceExpression, context);
6051
+ this.assertArrayOperand('all', source);
6052
+ if (!source.length) {
6053
+ return false;
6054
+ }
6055
+ return source.every((item) => this.isTruthy(this.evaluateValue(predicateExpression, this.createChildContext(context, item))));
6056
+ }
6057
+ evaluateSome(rawArgs, context) {
6058
+ const [sourceExpression, predicateExpression] = this.requireHigherOrderArgs('some', rawArgs, 2, 2);
6059
+ const source = this.evaluateValue(sourceExpression, context);
6060
+ this.assertArrayOperand('some', source);
6061
+ return source.some((item) => this.isTruthy(this.evaluateValue(predicateExpression, this.createChildContext(context, item))));
6062
+ }
6063
+ evaluateNone(rawArgs, context) {
6064
+ const [sourceExpression, predicateExpression] = this.requireHigherOrderArgs('none', rawArgs, 2, 2);
6065
+ const source = this.evaluateValue(sourceExpression, context);
6066
+ this.assertArrayOperand('none', source);
6067
+ return !source.some((item) => this.isTruthy(this.evaluateValue(predicateExpression, this.createChildContext(context, item))));
6068
+ }
6069
+ requireHigherOrderArgs(operator, rawArgs, min, max) {
6070
+ const args = this.toArgumentArray(rawArgs);
6071
+ return this.requireArgs(operator, args, min, max);
6072
+ }
6073
+ assertArrayOperand(operator, value) {
6074
+ if (!Array.isArray(value)) {
6075
+ throw new PraxisJsonLogicError('RULE_ARGUMENT_TYPE_INVALID', `Operator ${operator} requires an array as the first argument.`);
6076
+ }
6077
+ }
6078
+ createChildContext(context, data) {
6079
+ return {
6080
+ ...context,
6081
+ data: data,
6082
+ };
6083
+ }
5934
6084
  evaluateArgs(operator, rawArgs, context, min, max) {
5935
6085
  const args = this.toArgumentArray(rawArgs).map((arg) => this.evaluateValue(arg, context));
5936
6086
  return this.requireArgs(operator, args, min, max);
@@ -6151,6 +6301,16 @@ class PraxisJsonLogicService {
6151
6301
  return { min: 1 };
6152
6302
  case 'substr':
6153
6303
  return { min: 2, max: 3 };
6304
+ case 'merge':
6305
+ return { min: 1 };
6306
+ case 'map':
6307
+ case 'filter':
6308
+ case 'all':
6309
+ case 'some':
6310
+ case 'none':
6311
+ return { min: 2, max: 2 };
6312
+ case 'reduce':
6313
+ return { min: 2, max: 3 };
6154
6314
  case '+':
6155
6315
  case '*':
6156
6316
  case 'min':
@@ -6196,10 +6356,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
6196
6356
  const DEFAULT_JSON_LOGIC_OPERATORS = [
6197
6357
  {
6198
6358
  operator: 'contains',
6359
+ namespace: 'praxis',
6199
6360
  minArgs: 2,
6200
6361
  maxArgs: 2,
6362
+ returnType: 'boolean',
6363
+ purity: 'pure',
6201
6364
  evaluate: (args, _context, helpers) => {
6202
6365
  const [container, candidate] = helpers.requireArgs('contains', args, 2, 2);
6366
+ if (container === undefined || container === null) {
6367
+ return false;
6368
+ }
6203
6369
  if (typeof container === 'string' && typeof candidate === 'string') {
6204
6370
  return container.includes(candidate);
6205
6371
  }
@@ -6211,10 +6377,16 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6211
6377
  },
6212
6378
  {
6213
6379
  operator: 'startsWith',
6380
+ namespace: 'praxis',
6214
6381
  minArgs: 2,
6215
6382
  maxArgs: 2,
6383
+ returnType: 'boolean',
6384
+ purity: 'pure',
6216
6385
  evaluate: (args, _context, helpers) => {
6217
6386
  const [value, prefix] = helpers.requireArgs('startsWith', args, 2, 2);
6387
+ if (value === undefined || value === null) {
6388
+ return false;
6389
+ }
6218
6390
  if (typeof value !== 'string' || typeof prefix !== 'string') {
6219
6391
  throw new PraxisJsonLogicError('RULE_ARGUMENT_TYPE_INVALID', '`startsWith` requires string arguments.');
6220
6392
  }
@@ -6223,10 +6395,16 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6223
6395
  },
6224
6396
  {
6225
6397
  operator: 'endsWith',
6398
+ namespace: 'praxis',
6226
6399
  minArgs: 2,
6227
6400
  maxArgs: 2,
6401
+ returnType: 'boolean',
6402
+ purity: 'pure',
6228
6403
  evaluate: (args, _context, helpers) => {
6229
6404
  const [value, suffix] = helpers.requireArgs('endsWith', args, 2, 2);
6405
+ if (value === undefined || value === null) {
6406
+ return false;
6407
+ }
6230
6408
  if (typeof value !== 'string' || typeof suffix !== 'string') {
6231
6409
  throw new PraxisJsonLogicError('RULE_ARGUMENT_TYPE_INVALID', '`endsWith` requires string arguments.');
6232
6410
  }
@@ -6235,10 +6413,16 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6235
6413
  },
6236
6414
  {
6237
6415
  operator: 'matches',
6416
+ namespace: 'praxis',
6238
6417
  minArgs: 2,
6239
6418
  maxArgs: 2,
6419
+ returnType: 'boolean',
6420
+ purity: 'pure',
6240
6421
  evaluate: (args, _context, helpers) => {
6241
6422
  const [value, pattern] = helpers.requireArgs('matches', args, 2, 2);
6423
+ if (value === undefined || value === null) {
6424
+ return false;
6425
+ }
6242
6426
  if (typeof value !== 'string' || typeof pattern !== 'string') {
6243
6427
  throw new PraxisJsonLogicError('RULE_ARGUMENT_TYPE_INVALID', '`matches` requires string arguments.');
6244
6428
  }
@@ -6252,8 +6436,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6252
6436
  },
6253
6437
  {
6254
6438
  operator: 'isBlank',
6439
+ namespace: 'praxis',
6255
6440
  minArgs: 1,
6256
6441
  maxArgs: 1,
6442
+ returnType: 'boolean',
6443
+ purity: 'pure',
6257
6444
  evaluate: (args, _context, helpers) => {
6258
6445
  const [value] = helpers.requireArgs('isBlank', args, 1, 1);
6259
6446
  if (value === undefined || value === null) {
@@ -6270,8 +6457,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6270
6457
  },
6271
6458
  {
6272
6459
  operator: 'len',
6460
+ namespace: 'praxis',
6273
6461
  minArgs: 1,
6274
6462
  maxArgs: 1,
6463
+ returnType: 'number',
6464
+ purity: 'pure',
6275
6465
  evaluate: (args, _context, helpers) => {
6276
6466
  const [value] = helpers.requireArgs('len', args, 1, 1);
6277
6467
  if (value === undefined || value === null) {
@@ -6291,8 +6481,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6291
6481
  },
6292
6482
  {
6293
6483
  operator: 'round',
6484
+ namespace: 'praxis',
6294
6485
  minArgs: 1,
6295
6486
  maxArgs: 1,
6487
+ returnType: 'number',
6488
+ purity: 'pure',
6296
6489
  evaluate: (args, _context, helpers) => {
6297
6490
  const [value] = helpers.requireArgs('round', args, 1, 1);
6298
6491
  if (typeof value !== 'number' || !Number.isFinite(value)) {
@@ -6303,8 +6496,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6303
6496
  },
6304
6497
  {
6305
6498
  operator: 'ceil',
6499
+ namespace: 'praxis',
6306
6500
  minArgs: 1,
6307
6501
  maxArgs: 1,
6502
+ returnType: 'number',
6503
+ purity: 'pure',
6308
6504
  evaluate: (args, _context, helpers) => {
6309
6505
  const [value] = helpers.requireArgs('ceil', args, 1, 1);
6310
6506
  if (typeof value !== 'number' || !Number.isFinite(value)) {
@@ -6315,8 +6511,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6315
6511
  },
6316
6512
  {
6317
6513
  operator: 'floor',
6514
+ namespace: 'praxis',
6318
6515
  minArgs: 1,
6319
6516
  maxArgs: 1,
6517
+ returnType: 'number',
6518
+ purity: 'pure',
6320
6519
  evaluate: (args, _context, helpers) => {
6321
6520
  const [value] = helpers.requireArgs('floor', args, 1, 1);
6322
6521
  if (typeof value !== 'number' || !Number.isFinite(value)) {
@@ -6327,8 +6526,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6327
6526
  },
6328
6527
  {
6329
6528
  operator: 'abs',
6529
+ namespace: 'praxis',
6330
6530
  minArgs: 1,
6331
6531
  maxArgs: 1,
6532
+ returnType: 'number',
6533
+ purity: 'pure',
6332
6534
  evaluate: (args, _context, helpers) => {
6333
6535
  const [value] = helpers.requireArgs('abs', args, 1, 1);
6334
6536
  if (typeof value !== 'number' || !Number.isFinite(value)) {
@@ -6339,7 +6541,10 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6339
6541
  },
6340
6542
  {
6341
6543
  operator: 'coalesce',
6544
+ namespace: 'praxis',
6342
6545
  minArgs: 1,
6546
+ returnType: 'unknown',
6547
+ purity: 'pure',
6343
6548
  evaluate: (args, _context, helpers) => {
6344
6549
  const values = helpers.requireArgs('coalesce', args, 1);
6345
6550
  for (const value of values) {
@@ -6352,14 +6557,20 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6352
6557
  },
6353
6558
  {
6354
6559
  operator: 'now',
6560
+ namespace: 'praxis',
6355
6561
  minArgs: 0,
6356
6562
  maxArgs: 0,
6563
+ returnType: 'number',
6564
+ purity: 'contextual',
6357
6565
  evaluate: () => Date.now(),
6358
6566
  },
6359
6567
  {
6360
6568
  operator: 'date',
6569
+ namespace: 'praxis',
6361
6570
  minArgs: 1,
6362
6571
  maxArgs: 1,
6572
+ returnType: 'number',
6573
+ purity: 'pure',
6363
6574
  evaluate: (args, _context, helpers) => {
6364
6575
  const [value] = helpers.requireArgs('date', args, 1, 1);
6365
6576
  const parsed = parseTemporalValue(value);
@@ -6374,8 +6585,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6374
6585
  },
6375
6586
  {
6376
6587
  operator: 'yearsSince',
6588
+ namespace: 'praxis',
6377
6589
  minArgs: 1,
6378
6590
  maxArgs: 1,
6591
+ returnType: 'number',
6592
+ purity: 'contextual',
6379
6593
  evaluate: (args, context, helpers) => {
6380
6594
  const [value] = helpers.requireArgs('yearsSince', args, 1, 1);
6381
6595
  const parsed = parseTemporalValue(value);
@@ -6388,8 +6602,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6388
6602
  },
6389
6603
  {
6390
6604
  operator: 'monthsSince',
6605
+ namespace: 'praxis',
6391
6606
  minArgs: 1,
6392
6607
  maxArgs: 1,
6608
+ returnType: 'number',
6609
+ purity: 'contextual',
6393
6610
  evaluate: (args, context, helpers) => {
6394
6611
  const [value] = helpers.requireArgs('monthsSince', args, 1, 1);
6395
6612
  const parsed = parseTemporalValue(value);
@@ -6402,8 +6619,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6402
6619
  },
6403
6620
  {
6404
6621
  operator: 'daysSince',
6622
+ namespace: 'praxis',
6405
6623
  minArgs: 1,
6406
6624
  maxArgs: 1,
6625
+ returnType: 'number',
6626
+ purity: 'contextual',
6407
6627
  evaluate: (args, context, helpers) => {
6408
6628
  const [value] = helpers.requireArgs('daysSince', args, 1, 1);
6409
6629
  const parsed = parseTemporalValue(value);
@@ -6416,8 +6636,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6416
6636
  },
6417
6637
  {
6418
6638
  operator: 'toNumber',
6639
+ namespace: 'praxis',
6419
6640
  minArgs: 1,
6420
6641
  maxArgs: 1,
6642
+ returnType: 'number',
6643
+ purity: 'pure',
6421
6644
  evaluate: (args, _context, helpers) => {
6422
6645
  const [value] = helpers.requireArgs('toNumber', args, 1, 1);
6423
6646
  const parsed = Number(value);
@@ -6426,8 +6649,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6426
6649
  },
6427
6650
  {
6428
6651
  operator: 'stringify',
6652
+ namespace: 'praxis',
6429
6653
  minArgs: 1,
6430
6654
  maxArgs: 1,
6655
+ returnType: 'string',
6656
+ purity: 'pure',
6431
6657
  evaluate: (args, _context, helpers) => {
6432
6658
  const [value] = helpers.requireArgs('stringify', args, 1, 1);
6433
6659
  return value == null ? '' : String(value);
@@ -6435,8 +6661,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6435
6661
  },
6436
6662
  {
6437
6663
  operator: 'jsonGet',
6664
+ namespace: 'praxis',
6438
6665
  minArgs: 2,
6439
6666
  maxArgs: 2,
6667
+ returnType: 'unknown',
6668
+ purity: 'pure',
6440
6669
  evaluate: (args, _context, helpers) => {
6441
6670
  const [target, path] = helpers.requireArgs('jsonGet', args, 2, 2);
6442
6671
  if (typeof path !== 'string') {
@@ -6450,8 +6679,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6450
6679
  },
6451
6680
  {
6452
6681
  operator: 'hasKey',
6682
+ namespace: 'praxis',
6453
6683
  minArgs: 2,
6454
6684
  maxArgs: 2,
6685
+ returnType: 'boolean',
6686
+ purity: 'pure',
6455
6687
  evaluate: (args, _context, helpers) => {
6456
6688
  const [target, path] = helpers.requireArgs('hasKey', args, 2, 2);
6457
6689
  if (typeof path !== 'string') {
@@ -6465,8 +6697,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6465
6697
  },
6466
6698
  {
6467
6699
  operator: 'isToday',
6700
+ namespace: 'praxis',
6468
6701
  minArgs: 1,
6469
6702
  maxArgs: 1,
6703
+ returnType: 'boolean',
6704
+ purity: 'contextual',
6470
6705
  evaluate: (args, context, helpers) => {
6471
6706
  const [candidate] = helpers.requireArgs('isToday', args, 1, 1);
6472
6707
  const parsed = parseTemporalValue(candidate);
@@ -6478,8 +6713,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6478
6713
  },
6479
6714
  {
6480
6715
  operator: 'inLast',
6716
+ namespace: 'praxis',
6481
6717
  minArgs: 3,
6482
6718
  maxArgs: 3,
6719
+ returnType: 'boolean',
6720
+ purity: 'contextual',
6483
6721
  evaluate: (args, context, helpers) => {
6484
6722
  const [candidate, rawAmount, rawUnit] = helpers.requireArgs('inLast', args, 3, 3);
6485
6723
  const parsed = parseTemporalValue(candidate);
@@ -6496,8 +6734,11 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
6496
6734
  },
6497
6735
  {
6498
6736
  operator: 'weekdayIn',
6737
+ namespace: 'praxis',
6499
6738
  minArgs: 2,
6500
6739
  maxArgs: 2,
6740
+ returnType: 'boolean',
6741
+ purity: 'contextual',
6501
6742
  evaluate: (args, context, helpers) => {
6502
6743
  const [candidate, rawDays] = helpers.requireArgs('weekdayIn', args, 2, 2);
6503
6744
  const parsed = parseTemporalValue(candidate);
@@ -6541,6 +6782,13 @@ const BUILTIN_JSON_LOGIC_OPERATORS = [
6541
6782
  'in',
6542
6783
  'cat',
6543
6784
  'substr',
6785
+ 'merge',
6786
+ 'map',
6787
+ 'filter',
6788
+ 'reduce',
6789
+ 'all',
6790
+ 'some',
6791
+ 'none',
6544
6792
  '+',
6545
6793
  '-',
6546
6794
  '*',
@@ -6549,6 +6797,39 @@ const BUILTIN_JSON_LOGIC_OPERATORS = [
6549
6797
  'min',
6550
6798
  'max',
6551
6799
  ];
6800
+ const BUILTIN_JSON_LOGIC_OPERATOR_DESCRIPTORS = [
6801
+ { operator: 'var', source: 'native', minArgs: 1, maxArgs: 2, returnType: 'unknown', purity: 'pure' },
6802
+ { operator: '==', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6803
+ { operator: '===', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6804
+ { operator: '!=', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6805
+ { operator: '!==', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6806
+ { operator: '>', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6807
+ { operator: '>=', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6808
+ { operator: '<', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6809
+ { operator: '<=', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6810
+ { operator: '!', source: 'native', minArgs: 1, maxArgs: 1, returnType: 'boolean', purity: 'pure' },
6811
+ { operator: '!!', source: 'native', minArgs: 1, maxArgs: 1, returnType: 'boolean', purity: 'pure' },
6812
+ { operator: 'and', source: 'native', minArgs: 1, returnType: 'unknown', purity: 'pure' },
6813
+ { operator: 'or', source: 'native', minArgs: 1, returnType: 'unknown', purity: 'pure' },
6814
+ { operator: 'if', source: 'native', minArgs: 2, returnType: 'unknown', purity: 'pure' },
6815
+ { operator: 'in', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6816
+ { operator: 'cat', source: 'native', minArgs: 1, returnType: 'string', purity: 'pure' },
6817
+ { operator: 'substr', source: 'native', minArgs: 2, maxArgs: 3, returnType: 'string', purity: 'pure' },
6818
+ { operator: 'merge', source: 'native', minArgs: 1, returnType: 'array', purity: 'pure' },
6819
+ { operator: 'map', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'array', purity: 'pure' },
6820
+ { operator: 'filter', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'array', purity: 'pure' },
6821
+ { operator: 'reduce', source: 'native', minArgs: 2, maxArgs: 3, returnType: 'unknown', purity: 'pure' },
6822
+ { operator: 'all', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6823
+ { operator: 'some', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6824
+ { operator: 'none', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'boolean', purity: 'pure' },
6825
+ { operator: '+', source: 'native', minArgs: 1, returnType: 'number', purity: 'pure' },
6826
+ { operator: '-', source: 'native', minArgs: 1, returnType: 'number', purity: 'pure' },
6827
+ { operator: '*', source: 'native', minArgs: 1, returnType: 'number', purity: 'pure' },
6828
+ { operator: '/', source: 'native', minArgs: 2, returnType: 'number', purity: 'pure' },
6829
+ { operator: '%', source: 'native', minArgs: 2, maxArgs: 2, returnType: 'number', purity: 'pure' },
6830
+ { operator: 'min', source: 'native', minArgs: 1, returnType: 'number', purity: 'pure' },
6831
+ { operator: 'max', source: 'native', minArgs: 1, returnType: 'number', purity: 'pure' },
6832
+ ];
6552
6833
  function isComparisonOperator(operator) {
6553
6834
  return ['==', '===', '!=', '!==', '>', '>=', '<', '<='].includes(operator);
6554
6835
  }
@@ -13280,6 +13561,7 @@ const RULE_PROPERTY_SCHEMA = {
13280
13561
  { name: 'validators', type: 'object', label: 'Validadores' },
13281
13562
  ],
13282
13563
  section: [
13564
+ { name: 'hidden', type: 'boolean', label: 'Oculto' },
13283
13565
  { name: 'visible', type: 'boolean', label: 'Visível' },
13284
13566
  { name: 'title', type: 'string', label: 'Título' },
13285
13567
  { name: 'description', type: 'string', label: 'Descrição' },
@@ -20134,6 +20416,8 @@ class WidgetShellComponent {
20134
20416
  [class.collapsed]="collapsed"
20135
20417
  [class.expanded]="expanded"
20136
20418
  [class.fullscreen]="fullscreen"
20419
+ [class.body-fill]="shell?.bodyLayout === 'fill'"
20420
+ [class.body-scroll]="shell?.bodyLayout === 'scroll'"
20137
20421
  [style.--pdx-shell-card-bg]="appearance?.card?.background || null"
20138
20422
  [style.--pdx-shell-card-border]="appearance?.card?.borderColor || null"
20139
20423
  [style.--pdx-shell-card-radius]="appearance?.card?.borderRadius || null"
@@ -20258,7 +20542,7 @@ class WidgetShellComponent {
20258
20542
  @if (expanded || fullscreen) {
20259
20543
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
20260
20544
  }
20261
- `, isInline: true, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20545
+ `, isInline: true, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20262
20546
  }
20263
20547
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: WidgetShellComponent, decorators: [{
20264
20548
  type: Component,
@@ -20270,6 +20554,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20270
20554
  [class.collapsed]="collapsed"
20271
20555
  [class.expanded]="expanded"
20272
20556
  [class.fullscreen]="fullscreen"
20557
+ [class.body-fill]="shell?.bodyLayout === 'fill'"
20558
+ [class.body-scroll]="shell?.bodyLayout === 'scroll'"
20273
20559
  [style.--pdx-shell-card-bg]="appearance?.card?.background || null"
20274
20560
  [style.--pdx-shell-card-border]="appearance?.card?.borderColor || null"
20275
20561
  [style.--pdx-shell-card-radius]="appearance?.card?.borderRadius || null"
@@ -20394,7 +20680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20394
20680
  @if (expanded || fullscreen) {
20395
20681
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
20396
20682
  }
20397
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"] }]
20683
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"] }]
20398
20684
  }], propDecorators: { shell: [{
20399
20685
  type: Input
20400
20686
  }], context: [{
@@ -21400,14 +21686,13 @@ function applyLinkPatches(current, patches) {
21400
21686
  if (!patch) {
21401
21687
  return cloneLink(link);
21402
21688
  }
21403
- return {
21404
- ...cloneLink(link),
21405
- status: patch.status ?? link.status,
21406
- lastEventAt: pickPatchedValue(patch, 'lastEventAt', link.lastEventAt),
21407
- lastDispatchTraceId: pickPatchedValue(patch, 'lastDispatchTraceId', link.lastDispatchTraceId),
21408
- lastDeliveredValuePreview: pickPatchedValue(patch, 'lastDeliveredValuePreview', link.lastDeliveredValuePreview),
21409
- diagnostics: cloneDiagnostics$1(patch.diagnostics ?? link.diagnostics),
21410
- };
21689
+ const next = cloneLink(link);
21690
+ next.status = patch.status ?? link.status;
21691
+ setOptionalLinkValue(next, 'lastEventAt', pickPatchedValue(patch, 'lastEventAt', link.lastEventAt));
21692
+ setOptionalLinkValue(next, 'lastDispatchTraceId', pickPatchedValue(patch, 'lastDispatchTraceId', link.lastDispatchTraceId));
21693
+ setOptionalLinkValue(next, 'lastDeliveredValuePreview', pickPatchedValue(patch, 'lastDeliveredValuePreview', link.lastDeliveredValuePreview));
21694
+ next.diagnostics = cloneDiagnostics$1(patch.diagnostics ?? link.diagnostics);
21695
+ return next;
21411
21696
  });
21412
21697
  }
21413
21698
  function pickPatchedValue(patch, key, fallback) {
@@ -21419,12 +21704,24 @@ function cloneLinks(links) {
21419
21704
  return links.map((link) => cloneLink(link));
21420
21705
  }
21421
21706
  function cloneLink(link) {
21422
- return {
21423
- ...link,
21707
+ const next = {
21708
+ linkId: link.linkId,
21709
+ status: link.status,
21424
21710
  source: { ...link.source },
21425
21711
  target: { ...link.target },
21426
21712
  diagnostics: cloneDiagnostics$1(link.diagnostics),
21427
21713
  };
21714
+ setOptionalLinkValue(next, 'lastEventAt', link.lastEventAt);
21715
+ setOptionalLinkValue(next, 'lastDispatchTraceId', link.lastDispatchTraceId);
21716
+ setOptionalLinkValue(next, 'lastDeliveredValuePreview', link.lastDeliveredValuePreview);
21717
+ return next;
21718
+ }
21719
+ function setOptionalLinkValue(link, key, value) {
21720
+ if (value === undefined) {
21721
+ delete link[key];
21722
+ return;
21723
+ }
21724
+ link[key] = value;
21428
21725
  }
21429
21726
  function cloneDiagnostics$1(diagnostics) {
21430
21727
  return diagnostics.map((diagnostic) => ({
@@ -23572,50 +23869,79 @@ class DynamicWidgetPageComponent {
23572
23869
  globalActions = inject(GlobalActionService);
23573
23870
  storage = inject(ASYNC_CONFIG_STORAGE);
23574
23871
  componentKeys = inject(ComponentKeyService);
23872
+ componentMetadata = inject(ComponentMetadataRegistry, {
23873
+ optional: true,
23874
+ });
23575
23875
  i18n = inject(PraxisI18nService);
23576
- route = (() => { try {
23577
- return inject(ActivatedRoute);
23578
- }
23579
- catch {
23580
- return undefined;
23581
- } })();
23876
+ route = (() => {
23877
+ try {
23878
+ return inject(ActivatedRoute);
23879
+ }
23880
+ catch {
23881
+ return undefined;
23882
+ }
23883
+ })();
23582
23884
  conn = inject(ConnectionManagerService);
23583
23885
  stateRuntime = inject(WidgetPageStateRuntimeService);
23584
- settingsPanel = inject(SETTINGS_PANEL_BRIDGE, { optional: true });
23585
- defaultShellEditor = inject(DYNAMIC_PAGE_SHELL_EDITOR, { optional: true });
23586
- defaultPageEditor = inject(DYNAMIC_PAGE_CONFIG_EDITOR, { optional: true });
23886
+ settingsPanel = inject(SETTINGS_PANEL_BRIDGE, {
23887
+ optional: true,
23888
+ });
23889
+ defaultShellEditor = inject(DYNAMIC_PAGE_SHELL_EDITOR, {
23890
+ optional: true,
23891
+ });
23892
+ defaultPageEditor = inject(DYNAMIC_PAGE_CONFIG_EDITOR, {
23893
+ optional: true,
23894
+ });
23587
23895
  constructor() { }
23588
23896
  ngOnDestroy() {
23589
23897
  this.compositionRuntime.destroy();
23590
23898
  }
23591
23899
  ngOnChanges(changes) {
23592
- if (changes['page'] || changes['context'] || changes['enableCustomization']) {
23900
+ if (changes['page'] ||
23901
+ changes['context'] ||
23902
+ changes['enableCustomization']) {
23593
23903
  const parsed = this.parsePage(this.page);
23594
23904
  const resolvedPage = parsed ? this.resolvePagePresets(parsed) : parsed;
23595
23905
  this.assertNoLegacyConnections(resolvedPage);
23596
23906
  this.widgetDiagnostics = {};
23597
23907
  this.widgetDiagnosticsChange.emit({});
23598
- this.pageDefinition = resolvedPage ? { ...resolvedPage, state: this.stateRuntime.normalizeState(resolvedPage.state) } : resolvedPage;
23908
+ this.pageDefinition = resolvedPage
23909
+ ? {
23910
+ ...resolvedPage,
23911
+ state: this.stateRuntime.normalizeState(resolvedPage.state),
23912
+ }
23913
+ : resolvedPage;
23599
23914
  this.pageRuntime = this.buildStateRuntime(this.pageDefinition?.state, this.pageDefinition?.context);
23600
23915
  this.pageState = this.pageRuntime.state;
23601
23916
  const bootstrapSnapshot = this.bootstrapCompositionAdapter(this.pageDefinition);
23602
23917
  const rawWidgets = this.pageDefinition?.widgets || [];
23603
23918
  let widgets = this.applyEditShellActions(rawWidgets);
23604
23919
  widgets = this.applyBootstrapCompositionHydration(widgets, bootstrapSnapshot);
23605
- this.pageDefinition = this.pageDefinition ? { ...this.pageDefinition, widgets } : this.pageDefinition;
23920
+ this.pageDefinition = this.pageDefinition
23921
+ ? { ...this.pageDefinition, widgets }
23922
+ : this.pageDefinition;
23606
23923
  this.page = this.pageDefinition;
23607
23924
  this.applyResponsivePresentation(this.pageDefinition, widgets, this.pageRuntime);
23608
23925
  this.reportStateDiagnostics(this.pageRuntime.diagnostics);
23609
23926
  }
23610
- if (this.autoPersist && (changes['pageIdentity'] || changes['componentInstanceId'])) {
23927
+ if (this.autoPersist &&
23928
+ (changes['pageIdentity'] || changes['componentInstanceId'])) {
23611
23929
  this.appliedPersisted = false;
23612
23930
  this.persistenceReady = false;
23613
23931
  }
23614
- if (this.autoPersist && !this.appliedPersisted && (changes['page'] || changes['context'] || changes['pageIdentity'] || changes['componentInstanceId'])) {
23932
+ if (this.autoPersist &&
23933
+ !this.appliedPersisted &&
23934
+ (changes['page'] ||
23935
+ changes['context'] ||
23936
+ changes['pageIdentity'] ||
23937
+ changes['componentInstanceId'])) {
23615
23938
  this.appliedPersisted = true;
23616
23939
  this.loadPersistedPage();
23617
23940
  }
23618
- if (this.autoPersist && this.persistenceReady && changes['page'] && !this.isHydrating) {
23941
+ if (this.autoPersist &&
23942
+ this.persistenceReady &&
23943
+ changes['page'] &&
23944
+ !this.isHydrating) {
23619
23945
  const parsed = this.parsePage(this.page);
23620
23946
  if (parsed)
23621
23947
  this.savePage(parsed);
@@ -23637,7 +23963,7 @@ class DynamicWidgetPageComponent {
23637
23963
  }
23638
23964
  const state = this.stateFromCompositionSnapshot(pageWithPatchedInputs.state, cycle.snapshot.state.primaryValues);
23639
23965
  const runtimeStatePaths = Array.from(new Set((cycle.snapshot.state.changedPaths || []).filter((path) => typeof path === 'string')));
23640
- const updatedPrimaryStatePaths = runtimeStatePaths.filter((path) => (!this.areStateValuesEqual(this.conn.extractByPath(this.stateRuntime.normalizeState(page.state).values || {}, path), this.conn.extractByPath(state.values || {}, path))));
23966
+ const updatedPrimaryStatePaths = runtimeStatePaths.filter((path) => !this.areStateValuesEqual(this.conn.extractByPath(this.stateRuntime.normalizeState(page.state).values || {}, path), this.conn.extractByPath(state.values || {}, path)));
23641
23967
  let widgets = this.cloneWidgets(pageWithPatchedInputs.widgets || []);
23642
23968
  const directDelivery = this.applyCompositionWidgetDeliveries(widgets, cycle);
23643
23969
  widgets = directDelivery.widgets;
@@ -23649,7 +23975,10 @@ class DynamicWidgetPageComponent {
23649
23975
  const stateProjectionChanged = !this.areStateValuesEqual(widgets, projectedWidgets);
23650
23976
  widgets = projectedWidgets;
23651
23977
  const nextRuntime = this.buildStateRuntime(state, pageWithPatchedInputs.context);
23652
- if (!updatedPrimaryStatePaths.length && !directDelivery.changed && !stateProjectionChanged && !widgetInputPatchResult.changed) {
23978
+ if (!updatedPrimaryStatePaths.length &&
23979
+ !directDelivery.changed &&
23980
+ !stateProjectionChanged &&
23981
+ !widgetInputPatchResult.changed) {
23653
23982
  return;
23654
23983
  }
23655
23984
  this.applyPageUpdate({ ...pageWithPatchedInputs, widgets, state }, true, nextRuntime, false);
@@ -23701,7 +24030,9 @@ class DynamicWidgetPageComponent {
23701
24030
  return null;
23702
24031
  }
23703
24032
  const candidate = payload.inputPatch;
23704
- if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
24033
+ if (!candidate ||
24034
+ typeof candidate !== 'object' ||
24035
+ Array.isArray(candidate)) {
23705
24036
  return null;
23706
24037
  }
23707
24038
  return candidate;
@@ -23719,12 +24050,26 @@ class DynamicWidgetPageComponent {
23719
24050
  }
23720
24051
  applyEditShellActions(widgets) {
23721
24052
  return this.cloneWidgets(widgets).map((widget) => {
23722
- if (!this.shouldInjectWidgetSettings(widget)) {
24053
+ if (!this.shouldInjectEditShellActions(widget)) {
23723
24054
  return widget;
23724
24055
  }
23725
24056
  const existingActions = widget.shell?.actions || [];
23726
- if (existingActions.some((action) => action.id === 'widget-settings')) {
23727
- return widget;
24057
+ const metadata = this.componentMetadata?.get(widget.definition?.id || '');
24058
+ const nextActions = [...existingActions];
24059
+ if (metadata?.configEditor &&
24060
+ !nextActions.some((action) => action.id === 'component-settings')) {
24061
+ nextActions.push({
24062
+ id: 'component-settings',
24063
+ icon: 'tune',
24064
+ variant: 'icon',
24065
+ placement: 'header',
24066
+ label: this.t('controls.componentSettings', 'Configurar conteudo'),
24067
+ tooltip: this.t('controls.componentSettingsTooltip', 'Abrir configuracoes do componente'),
24068
+ });
24069
+ }
24070
+ if (nextActions.some((action) => action.id === 'widget-settings') ||
24071
+ !this.canOpenWidgetShellSettings()) {
24072
+ return this.withShellActions(widget, nextActions);
23728
24073
  }
23729
24074
  const widgetSettingsAction = {
23730
24075
  id: 'widget-settings',
@@ -23734,15 +24079,23 @@ class DynamicWidgetPageComponent {
23734
24079
  label: this.t('controls.widgetSettings', 'Configurar widget'),
23735
24080
  tooltip: this.t('controls.widgetSettingsTooltip', 'Abrir configurações do widget'),
23736
24081
  };
23737
- return {
23738
- ...widget,
23739
- shell: {
23740
- ...(widget.shell || {}),
23741
- actions: [...existingActions, widgetSettingsAction],
23742
- },
23743
- };
24082
+ return this.withShellActions(widget, [...nextActions, widgetSettingsAction]);
23744
24083
  });
23745
24084
  }
24085
+ withShellActions(widget, actions) {
24086
+ const existingActions = widget.shell?.actions || [];
24087
+ if (existingActions.length === actions.length &&
24088
+ existingActions.every((action, index) => action === actions[index])) {
24089
+ return widget;
24090
+ }
24091
+ return {
24092
+ ...widget,
24093
+ shell: {
24094
+ ...(widget.shell || {}),
24095
+ actions,
24096
+ },
24097
+ };
24098
+ }
23746
24099
  applyBootstrapCompositionHydration(widgets, bootstrapSnapshot) {
23747
24100
  if (!this.compositionDefinition || !bootstrapSnapshot) {
23748
24101
  return this.cloneWidgets(widgets);
@@ -23764,10 +24117,10 @@ class DynamicWidgetPageComponent {
23764
24117
  return undefined;
23765
24118
  const definition = this.compositionDefinition ?? this.compositionFactory.create(page);
23766
24119
  this.compositionDefinition = definition;
23767
- if (!definition.links.some((link) => (link.from.kind === 'component-port'
23768
- && link.from.ref.widget === fromKey
23769
- && link.from.ref.port === output
23770
- && link.from.ref.direction === 'output'))) {
24120
+ if (!definition.links.some((link) => link.from.kind === 'component-port' &&
24121
+ link.from.ref.widget === fromKey &&
24122
+ link.from.ref.port === output &&
24123
+ link.from.ref.direction === 'output')) {
23771
24124
  return undefined;
23772
24125
  }
23773
24126
  let payload;
@@ -23810,12 +24163,15 @@ class DynamicWidgetPageComponent {
23810
24163
  };
23811
24164
  }
23812
24165
  const linksById = new Map(this.compositionDefinition.links.map((link) => [link.id, link]));
23813
- const runtimeLinks = cycle.snapshot.links.filter((link) => (link.lastDispatchTraceId === cycle.cycleId && link.status === 'delivered'));
24166
+ const runtimeLinks = cycle.snapshot.links.filter((link) => link.lastDispatchTraceId === cycle.cycleId &&
24167
+ link.status === 'delivered');
23814
24168
  let nextWidgets = this.cloneWidgets(widgets);
23815
24169
  let changed = false;
23816
24170
  for (const runtimeLink of runtimeLinks) {
23817
24171
  const link = linksById.get(runtimeLink.linkId);
23818
- if (!link || link.from.kind === 'state' || link.to.kind !== 'component-port') {
24172
+ if (!link ||
24173
+ link.from.kind === 'state' ||
24174
+ link.to.kind !== 'component-port') {
23819
24175
  continue;
23820
24176
  }
23821
24177
  const targetRef = link.to.ref;
@@ -23892,13 +24248,13 @@ class DynamicWidgetPageComponent {
23892
24248
  if (!normalizedPortId) {
23893
24249
  return normalizedBindingPath;
23894
24250
  }
23895
- if (normalizedBindingPath === normalizedPortId
23896
- || normalizedBindingPath.startsWith(`${normalizedPortId}.`)
23897
- || normalizedBindingPath.startsWith(`${normalizedPortId}[`)) {
24251
+ if (normalizedBindingPath === normalizedPortId ||
24252
+ normalizedBindingPath.startsWith(`${normalizedPortId}.`) ||
24253
+ normalizedBindingPath.startsWith(`${normalizedPortId}[`)) {
23898
24254
  return normalizedBindingPath;
23899
24255
  }
23900
- if (normalizedBindingPath.startsWith('.')
23901
- || normalizedBindingPath.startsWith('[')) {
24256
+ if (normalizedBindingPath.startsWith('.') ||
24257
+ normalizedBindingPath.startsWith('[')) {
23902
24258
  return `${normalizedPortId}${normalizedBindingPath}`;
23903
24259
  }
23904
24260
  return `${normalizedPortId}.${normalizedBindingPath}`;
@@ -23911,15 +24267,15 @@ class DynamicWidgetPageComponent {
23911
24267
  }
23912
24268
  return `widget:${fromKey}:${output}:${timestamp}:${sequence}`;
23913
24269
  }
23914
- shouldInjectWidgetSettings(widget) {
24270
+ shouldInjectEditShellActions(widget) {
23915
24271
  if (!this.enableCustomization || !this.settingsPanel) {
23916
24272
  return false;
23917
24273
  }
23918
- if (!(this.shellEditorComponent || this.defaultShellEditor)) {
23919
- return false;
23920
- }
23921
24274
  return !!widget.shell && widget.shell.kind !== 'none';
23922
24275
  }
24276
+ canOpenWidgetShellSettings() {
24277
+ return !!(this.shellEditorComponent || this.defaultShellEditor);
24278
+ }
23923
24279
  areStateValuesEqual(left, right) {
23924
24280
  if (left === right)
23925
24281
  return true;
@@ -23937,8 +24293,8 @@ class DynamicWidgetPageComponent {
23937
24293
  const rightKeys = Object.keys(right);
23938
24294
  if (leftKeys.length !== rightKeys.length)
23939
24295
  return false;
23940
- return leftKeys.every((key) => (Object.prototype.hasOwnProperty.call(right, key)
23941
- && this.areStateValuesEqual(left[key], right[key])));
24296
+ return leftKeys.every((key) => Object.prototype.hasOwnProperty.call(right, key) &&
24297
+ this.areStateValuesEqual(left[key], right[key]));
23942
24298
  }
23943
24299
  return false;
23944
24300
  }
@@ -23956,6 +24312,10 @@ class DynamicWidgetPageComponent {
23956
24312
  this.widgetDiagnosticsChange.emit({ ...this.widgetDiagnostics });
23957
24313
  }
23958
24314
  onShellAction(fromKey, evt) {
24315
+ if (evt.id === 'component-settings') {
24316
+ this.openWidgetComponentSettings(fromKey);
24317
+ return;
24318
+ }
23959
24319
  if (evt.id === 'widget-settings') {
23960
24320
  this.openWidgetShellSettings(fromKey);
23961
24321
  return;
@@ -24106,6 +24466,55 @@ class DynamicWidgetPageComponent {
24106
24466
  ref.applied$.subscribe((result) => this.applyWidgetShell(key, result, false));
24107
24467
  ref.saved$.subscribe((result) => this.applyWidgetShell(key, result, true));
24108
24468
  }
24469
+ openWidgetComponentSettings(key) {
24470
+ if (!this.settingsPanel)
24471
+ return;
24472
+ const page = this.ensurePageDefinition();
24473
+ const widget = page.widgets.find((w) => w.key === key);
24474
+ if (!widget)
24475
+ return;
24476
+ const metadata = this.componentMetadata?.get(widget.definition?.id || '');
24477
+ const editor = metadata?.configEditor?.component;
24478
+ if (!editor)
24479
+ return;
24480
+ const ref = this.settingsPanel.open({
24481
+ id: `dynamic-page-component:${key}`,
24482
+ title: metadata.configEditor?.title ||
24483
+ metadata.friendlyName ||
24484
+ this.t('controls.componentSettings', 'Configurar conteudo'),
24485
+ content: {
24486
+ component: editor,
24487
+ inputs: {
24488
+ inputs: this.cloneStateValues(widget.definition.inputs || {}),
24489
+ widgetKey: key,
24490
+ widgetType: widget.definition?.id,
24491
+ },
24492
+ },
24493
+ });
24494
+ ref.applied$.subscribe((result) => this.applyWidgetComponentInputs(key, result, false));
24495
+ ref.saved$.subscribe((result) => this.applyWidgetComponentInputs(key, result, true));
24496
+ }
24497
+ applyWidgetComponentInputs(key, result, persist) {
24498
+ if (!result || typeof result !== 'object' || Array.isArray(result))
24499
+ return;
24500
+ const nextInputs = 'inputs' in result &&
24501
+ result.inputs &&
24502
+ typeof result.inputs === 'object' &&
24503
+ !Array.isArray(result.inputs)
24504
+ ? result.inputs
24505
+ : result;
24506
+ const page = this.ensurePageDefinition();
24507
+ const widgets = page.widgets.map((w) => w.key === key
24508
+ ? {
24509
+ ...w,
24510
+ definition: {
24511
+ ...w.definition,
24512
+ inputs: this.cloneStateValues(nextInputs),
24513
+ },
24514
+ }
24515
+ : w);
24516
+ this.applyPageUpdate({ ...page, widgets }, persist);
24517
+ }
24109
24518
  openPageSettings() {
24110
24519
  if (!this.settingsPanel)
24111
24520
  return;
@@ -24134,7 +24543,7 @@ class DynamicWidgetPageComponent {
24134
24543
  if (!result)
24135
24544
  return;
24136
24545
  const page = this.ensurePageDefinition();
24137
- const widgets = page.widgets.map((w) => (w.key === key ? { ...w, shell: result.shell ?? null } : w));
24546
+ const widgets = page.widgets.map((w) => w.key === key ? { ...w, shell: result.shell ?? null } : w);
24138
24547
  let context = page.context || {};
24139
24548
  if (result.applyToAll && result.pagePreset) {
24140
24549
  const ui = { ...context.ui };
@@ -24201,7 +24610,10 @@ class DynamicWidgetPageComponent {
24201
24610
  },
24202
24611
  }).widgets
24203
24612
  : normalizedWidgets;
24204
- const hydrated = this.resolvePagePresets({ ...normalized, widgets: stateBoundWidgets });
24613
+ const hydrated = this.resolvePagePresets({
24614
+ ...normalized,
24615
+ widgets: stateBoundWidgets,
24616
+ });
24205
24617
  this.pageDefinition = hydrated;
24206
24618
  this.page = hydrated;
24207
24619
  this.pageState = runtime.state;
@@ -24231,21 +24643,28 @@ class DynamicWidgetPageComponent {
24231
24643
  this.pageColumnCount = Math.max(1, Number(canvas.columns) || 1);
24232
24644
  this.gridTemplateColumns = `repeat(${this.pageColumnCount}, minmax(0, 1fr))`;
24233
24645
  this.pageGap = canvas.gap || fallbackLayout?.gap || '16px';
24234
- this.gridAutoRows = canvas.autoRows === 'content' ? 'auto' : (canvas.rowUnit || '88px');
24646
+ this.gridAutoRows =
24647
+ canvas.autoRows === 'content' ? 'auto' : canvas.rowUnit || '88px';
24235
24648
  }
24236
24649
  mergeContext(pageContext, inputContext, runtime, pageDefinition) {
24237
24650
  const baseContext = this.buildStateContext(pageContext);
24238
24651
  const themePresetId = pageDefinition?.themePreset || '';
24239
- const themePreset = themePresetId ? BUILTIN_PAGE_THEME_PRESETS[themePresetId] : undefined;
24652
+ const themePreset = themePresetId
24653
+ ? BUILTIN_PAGE_THEME_PRESETS[themePresetId]
24654
+ : undefined;
24240
24655
  const layoutPresetId = pageDefinition?.layoutPreset || '';
24241
- const layoutPreset = layoutPresetId ? BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId] : undefined;
24656
+ const layoutPreset = layoutPresetId
24657
+ ? BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId]
24658
+ : undefined;
24242
24659
  return {
24243
24660
  ...baseContext,
24244
24661
  ...(inputContext || {}),
24245
24662
  pageDeviceKind: this.resolveDeviceKind(),
24246
24663
  pageLayoutPreset: layoutPreset || null,
24247
24664
  pageThemePreset: themePreset || null,
24248
- pageCanvas: pageDefinition?.canvas ? this.cloneStateValues(pageDefinition.canvas) : null,
24665
+ pageCanvas: pageDefinition?.canvas
24666
+ ? this.cloneStateValues(pageDefinition.canvas)
24667
+ : null,
24249
24668
  pageGrouping: this.cloneGrouping(pageDefinition?.grouping),
24250
24669
  pageState: this.cloneStateValues(runtime.primaryValues),
24251
24670
  pageStateDerived: this.cloneStateValues(runtime.derivedValues),
@@ -24352,7 +24771,10 @@ class DynamicWidgetPageComponent {
24352
24771
  const parsed = this.parsePage(this.page);
24353
24772
  if (parsed)
24354
24773
  return this.resolvePagePresets(parsed);
24355
- return { widgets: this.widgets(), state: this.stateRuntime.normalizeState(this.pageState) };
24774
+ return {
24775
+ widgets: this.widgets(),
24776
+ state: this.stateRuntime.normalizeState(this.pageState),
24777
+ };
24356
24778
  }
24357
24779
  parsePage(input) {
24358
24780
  if (!input)
@@ -24371,10 +24793,14 @@ class DynamicWidgetPageComponent {
24371
24793
  return input;
24372
24794
  }
24373
24795
  resolvePagePresets(page) {
24374
- const preset = page.layoutPreset ? BUILTIN_PAGE_LAYOUT_PRESETS[page.layoutPreset] : undefined;
24796
+ const preset = page.layoutPreset
24797
+ ? BUILTIN_PAGE_LAYOUT_PRESETS[page.layoutPreset]
24798
+ : undefined;
24375
24799
  const themePresetId = page.themePreset || preset?.defaultThemePreset;
24376
24800
  const mergedLayout = this.mergeLayout(preset?.defaultLayout, page.layout);
24377
- const grouping = (page.grouping && page.grouping.length ? page.grouping : preset?.defaultGrouping) || undefined;
24801
+ const grouping = (page.grouping && page.grouping.length
24802
+ ? page.grouping
24803
+ : preset?.defaultGrouping) || undefined;
24378
24804
  return {
24379
24805
  ...page,
24380
24806
  layout: mergedLayout,
@@ -24421,7 +24847,9 @@ class DynamicWidgetPageComponent {
24421
24847
  const widgetsWithOverrides = canvas
24422
24848
  ? this.applyCanvasLayoutToWidgets(baseWidgets, canvas)
24423
24849
  : baseWidgets;
24424
- const groups = canvas ? [] : this.buildRenderedGroups(grouping, widgetsWithOverrides);
24850
+ const groups = canvas
24851
+ ? []
24852
+ : this.buildRenderedGroups(grouping, widgetsWithOverrides);
24425
24853
  return {
24426
24854
  layout,
24427
24855
  canvas,
@@ -24492,10 +24920,13 @@ class DynamicWidgetPageComponent {
24492
24920
  return widget?.definition?.inputs?.['enableCustomization'] === true;
24493
24921
  }
24494
24922
  selectCanvasWidget(widgetKey) {
24923
+ if (!this.enableCustomization)
24924
+ return;
24495
24925
  if (this.selectedCanvasWidgetKey !== widgetKey) {
24496
24926
  this.selectedCanvasWidgetKey = widgetKey;
24497
24927
  }
24498
- if (this.blockedCanvasWidgetKey && this.blockedCanvasWidgetKey !== widgetKey) {
24928
+ if (this.blockedCanvasWidgetKey &&
24929
+ this.blockedCanvasWidgetKey !== widgetKey) {
24499
24930
  this.blockedCanvasWidgetKey = null;
24500
24931
  }
24501
24932
  }
@@ -24564,7 +24995,12 @@ class DynamicWidgetPageComponent {
24564
24995
  startPage: this.clonePageDefinition(this.ensurePageDefinition()),
24565
24996
  startX: 0,
24566
24997
  startY: 0,
24567
- startItem: { ...item, constraints: item.constraints ? { ...item.constraints } : undefined },
24998
+ startItem: {
24999
+ ...item,
25000
+ constraints: item.constraints
25001
+ ? { ...item.constraints }
25002
+ : undefined,
25003
+ },
24568
25004
  columns,
24569
25005
  columnWidth: 1,
24570
25006
  rowHeight: 1,
@@ -24583,7 +25019,9 @@ class DynamicWidgetPageComponent {
24583
25019
  ...widget,
24584
25020
  renderClassName,
24585
25021
  renderSpan: override?.span,
24586
- __order: typeof override?.order === 'number' ? override.order : Number.MAX_SAFE_INTEGER,
25022
+ __order: typeof override?.order === 'number'
25023
+ ? override.order
25024
+ : Number.MAX_SAFE_INTEGER,
24587
25025
  };
24588
25026
  })
24589
25027
  .filter((widget) => !!widget)
@@ -24623,7 +25061,9 @@ class DynamicWidgetPageComponent {
24623
25061
  if (!item || !metrics)
24624
25062
  return;
24625
25063
  const pageSnapshot = this.clonePageDefinition(this.ensurePageDefinition());
24626
- const pointerTarget = event.currentTarget instanceof HTMLElement ? event.currentTarget : undefined;
25064
+ const pointerTarget = event.currentTarget instanceof HTMLElement
25065
+ ? event.currentTarget
25066
+ : undefined;
24627
25067
  if (pointerTarget?.setPointerCapture) {
24628
25068
  try {
24629
25069
  pointerTarget.setPointerCapture(event.pointerId);
@@ -24638,7 +25078,10 @@ class DynamicWidgetPageComponent {
24638
25078
  startPage: pageSnapshot,
24639
25079
  startX: event.clientX,
24640
25080
  startY: event.clientY,
24641
- startItem: { ...item, constraints: item.constraints ? { ...item.constraints } : undefined },
25081
+ startItem: {
25082
+ ...item,
25083
+ constraints: item.constraints ? { ...item.constraints } : undefined,
25084
+ },
24642
25085
  columns: metrics.columns,
24643
25086
  columnWidth: metrics.columnWidth,
24644
25087
  rowHeight: metrics.rowHeight,
@@ -24657,7 +25100,7 @@ class DynamicWidgetPageComponent {
24657
25100
  const rect = host.getBoundingClientRect();
24658
25101
  const gap = this.parseCssPixelValue(this.pageGap, 16);
24659
25102
  const columns = Math.max(1, Number(canvas.columns) || 1);
24660
- const availableWidth = Math.max(1, rect.width - (gap * Math.max(0, columns - 1)));
25103
+ const availableWidth = Math.max(1, rect.width - gap * Math.max(0, columns - 1));
24661
25104
  const columnWidth = availableWidth / columns;
24662
25105
  const rowHeight = canvas.autoRows === 'content'
24663
25106
  ? this.parseCssPixelValue(canvas.rowUnit || '88px', 88)
@@ -24690,7 +25133,9 @@ class DynamicWidgetPageComponent {
24690
25133
  return { changed: false, blocked: false };
24691
25134
  const candidate = this.normalizeCanvasItem(updater({
24692
25135
  ...current,
24693
- constraints: current.constraints ? { ...current.constraints } : undefined,
25136
+ constraints: current.constraints
25137
+ ? { ...current.constraints }
25138
+ : undefined,
24694
25139
  }), effectiveCanvas?.columns || page.canvas.columns || 1);
24695
25140
  const collisionPolicy = effectiveCanvas
24696
25141
  ? this.resolveCanvasCollisionPolicy(effectiveCanvas, interactionKind)
@@ -24702,7 +25147,12 @@ class DynamicWidgetPageComponent {
24702
25147
  if (blocked) {
24703
25148
  this.blockedCanvasWidgetKey = widgetKey;
24704
25149
  this.transientCanvasItemsState.set({});
24705
- this.canvasPreviewState.set({ ...candidate, constraints: candidate.constraints ? { ...candidate.constraints } : undefined });
25150
+ this.canvasPreviewState.set({
25151
+ ...candidate,
25152
+ constraints: candidate.constraints
25153
+ ? { ...candidate.constraints }
25154
+ : undefined,
25155
+ });
24706
25156
  this.canvasPreviewInvalidState.set(true);
24707
25157
  if (blockedAnnouncement) {
24708
25158
  this.layoutAnnouncement = blockedAnnouncement;
@@ -24741,10 +25191,22 @@ class DynamicWidgetPageComponent {
24741
25191
  this.transientCanvasItemsState.set(changed
24742
25192
  ? Object.fromEntries(Object.entries(placement.items).map(([key, item]) => [
24743
25193
  key,
24744
- { ...item, constraints: item.constraints ? { ...item.constraints } : undefined },
25194
+ {
25195
+ ...item,
25196
+ constraints: item.constraints
25197
+ ? { ...item.constraints }
25198
+ : undefined,
25199
+ },
24745
25200
  ]))
24746
25201
  : {});
24747
- this.canvasPreviewState.set(changed ? { ...placement.primaryItem, constraints: placement.primaryItem.constraints ? { ...placement.primaryItem.constraints } : undefined } : null);
25202
+ this.canvasPreviewState.set(changed
25203
+ ? {
25204
+ ...placement.primaryItem,
25205
+ constraints: placement.primaryItem.constraints
25206
+ ? { ...placement.primaryItem.constraints }
25207
+ : undefined,
25208
+ }
25209
+ : null);
24748
25210
  this.canvasPreviewInvalidState.set(false);
24749
25211
  }
24750
25212
  return { changed, blocked: false, swappedWith: placement.swappedWith };
@@ -24762,7 +25224,10 @@ class DynamicWidgetPageComponent {
24762
25224
  },
24763
25225
  });
24764
25226
  const stateBoundWidgets = previewProjection.widgets;
24765
- const hydrated = this.resolvePagePresets({ ...normalized, widgets: stateBoundWidgets });
25227
+ const hydrated = this.resolvePagePresets({
25228
+ ...normalized,
25229
+ widgets: stateBoundWidgets,
25230
+ });
24766
25231
  this.pageDefinition = hydrated;
24767
25232
  this.page = hydrated;
24768
25233
  this.pageState = runtime.state;
@@ -24781,7 +25246,8 @@ class DynamicWidgetPageComponent {
24781
25246
  return page.canvas;
24782
25247
  }
24783
25248
  applyCanvasDrag(item, interaction, colDelta, rowDelta) {
24784
- const locked = item.constraints?.lockPosition || interaction.startItem.constraints?.lockPosition;
25249
+ const locked = item.constraints?.lockPosition ||
25250
+ interaction.startItem.constraints?.lockPosition;
24785
25251
  if (locked)
24786
25252
  return item;
24787
25253
  const nextCol = this.clampCanvasCol(interaction.startItem.col + colDelta, interaction.startItem.colSpan, interaction.columns);
@@ -24875,8 +25341,12 @@ class DynamicWidgetPageComponent {
24875
25341
  }
24876
25342
  canvasAnnouncement(kind, widgetKey) {
24877
25343
  return kind === 'drag'
24878
- ? this.t('announcements.moved', 'Widget movido: {{widget}}', { widget: widgetKey })
24879
- : this.t('announcements.resized', 'Widget redimensionado: {{widget}}', { widget: widgetKey });
25344
+ ? this.t('announcements.moved', 'Widget movido: {{widget}}', {
25345
+ widget: widgetKey,
25346
+ })
25347
+ : this.t('announcements.resized', 'Widget redimensionado: {{widget}}', {
25348
+ widget: widgetKey,
25349
+ });
24880
25350
  }
24881
25351
  blockedCanvasAnnouncement(kind) {
24882
25352
  return kind === 'drag'
@@ -24962,7 +25432,8 @@ class DynamicWidgetPageComponent {
24962
25432
  }
24963
25433
  return {
24964
25434
  blocked: false,
24965
- changed: !this.isSameCanvasItem(current, candidate) || !this.isSameCanvasItem(collision.item, swappedItem),
25435
+ changed: !this.isSameCanvasItem(current, candidate) ||
25436
+ !this.isSameCanvasItem(collision.item, swappedItem),
24966
25437
  primaryItem: candidate,
24967
25438
  items: {
24968
25439
  [widgetKey]: candidate,
@@ -24973,7 +25444,8 @@ class DynamicWidgetPageComponent {
24973
25444
  }
24974
25445
  findCanvasCollisions(widgetKey, candidate, canvas) {
24975
25446
  return Object.entries(canvas.items || {})
24976
- .filter(([otherKey, otherItem]) => otherKey !== widgetKey && this.canvasItemsOverlap(candidate, otherItem))
25447
+ .filter(([otherKey, otherItem]) => otherKey !== widgetKey &&
25448
+ this.canvasItemsOverlap(candidate, otherItem))
24977
25449
  .map(([key, item]) => ({ key, item }));
24978
25450
  }
24979
25451
  buildCanvasSwapItem(movingWidgetKey, sourceItem, targetWidgetKey, targetItem, movedItem, canvas) {
@@ -25003,24 +25475,24 @@ class DynamicWidgetPageComponent {
25003
25475
  return normalizedSwapItem;
25004
25476
  }
25005
25477
  canPlaceCanvasItem(widgetKey, candidate, canvas) {
25006
- return !Object.entries(canvas.items || {}).some(([otherKey, otherItem]) => (otherKey !== widgetKey && this.canvasItemsOverlap(candidate, otherItem)));
25478
+ return !Object.entries(canvas.items || {}).some(([otherKey, otherItem]) => otherKey !== widgetKey && this.canvasItemsOverlap(candidate, otherItem));
25007
25479
  }
25008
25480
  canvasItemsOverlap(left, right) {
25009
25481
  const leftRight = left.col + left.colSpan - 1;
25010
25482
  const rightRight = right.col + right.colSpan - 1;
25011
25483
  const leftBottom = left.row + left.rowSpan - 1;
25012
25484
  const rightBottom = right.row + right.rowSpan - 1;
25013
- return left.col <= rightRight
25014
- && leftRight >= right.col
25015
- && left.row <= rightBottom
25016
- && leftBottom >= right.row;
25485
+ return (left.col <= rightRight &&
25486
+ leftRight >= right.col &&
25487
+ left.row <= rightBottom &&
25488
+ leftBottom >= right.row);
25017
25489
  }
25018
25490
  isSameCanvasItem(left, right) {
25019
- return left.col === right.col
25020
- && left.row === right.row
25021
- && left.colSpan === right.colSpan
25022
- && left.rowSpan === right.rowSpan
25023
- && left.zIndex === right.zIndex;
25491
+ return (left.col === right.col &&
25492
+ left.row === right.row &&
25493
+ left.colSpan === right.colSpan &&
25494
+ left.rowSpan === right.rowSpan &&
25495
+ left.zIndex === right.zIndex);
25024
25496
  }
25025
25497
  clampCanvasCol(col, span, columns) {
25026
25498
  return this.clampNumber(col, 1, Math.max(1, columns - span + 1));
@@ -25031,7 +25503,9 @@ class DynamicWidgetPageComponent {
25031
25503
  parseCssPixelValue(value, fallback) {
25032
25504
  if (!value)
25033
25505
  return fallback;
25034
- const match = String(value).trim().match(/^(-?\d+(?:\.\d+)?)px$/i);
25506
+ const match = String(value)
25507
+ .trim()
25508
+ .match(/^(-?\d+(?:\.\d+)?)px$/i);
25035
25509
  if (!match)
25036
25510
  return fallback;
25037
25511
  const parsed = Number(match[1]);
@@ -25073,7 +25547,9 @@ class DynamicWidgetPageComponent {
25073
25547
  }
25074
25548
  return {
25075
25549
  ...group,
25076
- widgetKeys: override.widgetKeys?.length ? override.widgetKeys : group.widgetKeys,
25550
+ widgetKeys: override.widgetKeys?.length
25551
+ ? override.widgetKeys
25552
+ : group.widgetKeys,
25077
25553
  };
25078
25554
  })
25079
25555
  .filter((group) => !!group);
@@ -25186,7 +25662,9 @@ class DynamicWidgetPageComponent {
25186
25662
  return this.resolveRenderedCanvasItem(widget)?.zIndex ?? null;
25187
25663
  }
25188
25664
  widgetClassName(widget) {
25189
- return widget.renderClassName || widget.className || '';
25665
+ return (widget.renderClassName ||
25666
+ widget.className ||
25667
+ '');
25190
25668
  }
25191
25669
  mergeClassNames(...classNames) {
25192
25670
  const merged = classNames
@@ -25196,7 +25674,7 @@ class DynamicWidgetPageComponent {
25196
25674
  return merged.length ? Array.from(new Set(merged)).join(' ') : undefined;
25197
25675
  }
25198
25676
  resolveRenderedCanvasItem(widget) {
25199
- return this.transientCanvasItemsState()[widget.key] || widget.renderCanvasItem;
25677
+ return (this.transientCanvasItemsState()[widget.key] || widget.renderCanvasItem);
25200
25678
  }
25201
25679
  toPersistedCanonicalPage(page) {
25202
25680
  this.assertNoLegacyConnections(page);
@@ -25207,7 +25685,10 @@ class DynamicWidgetPageComponent {
25207
25685
  if (!key)
25208
25686
  return;
25209
25687
  try {
25210
- this.storage.saveConfig(key, this.toPersistedCanonicalPage(page)).pipe(take(1)).subscribe({ error: () => { } });
25688
+ this.storage
25689
+ .saveConfig(key, this.toPersistedCanonicalPage(page))
25690
+ .pipe(take(1))
25691
+ .subscribe({ error: () => { } });
25211
25692
  }
25212
25693
  catch { }
25213
25694
  }
@@ -25218,7 +25699,10 @@ class DynamicWidgetPageComponent {
25218
25699
  return;
25219
25700
  }
25220
25701
  try {
25221
- this.storage.loadConfig(key).pipe(take(1)).subscribe({
25702
+ this.storage
25703
+ .loadConfig(key)
25704
+ .pipe(take(1))
25705
+ .subscribe({
25222
25706
  next: (stored) => {
25223
25707
  if (!stored)
25224
25708
  return;
@@ -25242,7 +25726,9 @@ class DynamicWidgetPageComponent {
25242
25726
  if (this.pageIdentity?.routePath) {
25243
25727
  const base = buildPageKey(this.pageIdentity);
25244
25728
  const instance = this.sanitizeSegment(this.componentInstanceId);
25245
- return instance ? `dynamic-page:${base}:ik=${instance}` : `dynamic-page:${base}`;
25729
+ return instance
25730
+ ? `dynamic-page:${base}:ik=${instance}`
25731
+ : `dynamic-page:${base}`;
25246
25732
  }
25247
25733
  const id = this.componentKeyId();
25248
25734
  if (!id)
@@ -25280,7 +25766,9 @@ class DynamicWidgetPageComponent {
25280
25766
  sanitizeSegment(value) {
25281
25767
  if (!value)
25282
25768
  return '';
25283
- return String(value).trim().replace(/[\r\n\t|:]/g, '-');
25769
+ return String(value)
25770
+ .trim()
25771
+ .replace(/[\r\n\t|:]/g, '-');
25284
25772
  }
25285
25773
  assertNoLegacyConnections(page) {
25286
25774
  if (!page)
@@ -25294,17 +25782,17 @@ class DynamicWidgetPageComponent {
25294
25782
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: DynamicWidgetPageComponent, isStandalone: true, selector: "praxis-dynamic-page", inputs: { page: "page", context: "context", strictValidation: "strictValidation", enableCustomization: "enableCustomization", showPageSettingsButton: "showPageSettingsButton", shellEditorComponent: "shellEditorComponent", pageEditorComponent: "pageEditorComponent", autoPersist: "autoPersist", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId" }, outputs: { pageChange: "pageChange", widgetDiagnosticsChange: "widgetDiagnosticsChange" }, host: { listeners: { "window:resize": "onWindowResize()", "window:pointermove": "onCanvasPointerMove($event)", "window:pointerup": "onCanvasPointerUp($event)", "window:pointercancel": "onCanvasPointerCancel($event)" } }, providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], viewQueries: [{ propertyName: "pageCanvasHost", first: true, predicate: ["pageCanvasHost"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
25295
25783
  <div class="pdx-page-wrapper" [class.editing]="enableCustomization">
25296
25784
  @if (enableCustomization && showPageSettingsButton) {
25297
- <button
25298
- class="pdx-page-settings"
25299
- mat-icon-button
25300
- type="button"
25301
- [matTooltip]="pageSettingsLabel()"
25302
- matTooltipPosition="below"
25303
- [attr.aria-label]="pageSettingsLabel()"
25304
- (click)="openPageSettings()"
25305
- >
25306
- <mat-icon fontSet="material-symbols-outlined">settings</mat-icon>
25307
- </button>
25785
+ <button
25786
+ class="pdx-page-settings"
25787
+ mat-icon-button
25788
+ type="button"
25789
+ [matTooltip]="pageSettingsLabel()"
25790
+ matTooltipPosition="below"
25791
+ [attr.aria-label]="pageSettingsLabel()"
25792
+ (click)="openPageSettings()"
25793
+ >
25794
+ <mat-icon fontSet="material-symbols-outlined">settings</mat-icon>
25795
+ </button>
25308
25796
  }
25309
25797
  <div
25310
25798
  #pageCanvasHost
@@ -25319,8 +25807,12 @@ class DynamicWidgetPageComponent {
25319
25807
  <div
25320
25808
  class="pdx-widget pdx-widget--canvas"
25321
25809
  [class.pdx-widget--interactive]="enableCustomization"
25322
- [class.pdx-widget--canvas-selected]="isCanvasWidgetSelected(w.key)"
25323
- [class.pdx-widget--canvas-blocked]="isCanvasWidgetBlocked(w.key)"
25810
+ [class.pdx-widget--canvas-selected]="
25811
+ enableCustomization && isCanvasWidgetSelected(w.key)
25812
+ "
25813
+ [class.pdx-widget--canvas-blocked]="
25814
+ enableCustomization && isCanvasWidgetBlocked(w.key)
25815
+ "
25324
25816
  [class]="widgetClassName(w)"
25325
25817
  [style.gridColumn]="widgetGridColumn(w)"
25326
25818
  [style.gridRow]="widgetGridRow(w)"
@@ -25338,7 +25830,9 @@ class DynamicWidgetPageComponent {
25338
25830
  [attr.aria-label]="resizeHandleLabel(handle.id)"
25339
25831
  [title]="resizeHandleLabel(handle.id)"
25340
25832
  (pointerdown)="startCanvasResize(w.key, handle.id, $event)"
25341
- (keydown)="onCanvasResizeHandleKeydown(w.key, handle.id, $event)"
25833
+ (keydown)="
25834
+ onCanvasResizeHandleKeydown(w.key, handle.id, $event)
25835
+ "
25342
25836
  >
25343
25837
  <span class="pdx-canvas-resize-grip"></span>
25344
25838
  </button>
@@ -25351,9 +25845,11 @@ class DynamicWidgetPageComponent {
25351
25845
  [dragSurfaceLabel]="dragWidgetLabel()"
25352
25846
  (action)="onShellAction(w.key, $event)"
25353
25847
  (dragSurfacePointerDown)="startCanvasDrag(w.key, $event)"
25354
- (dragSurfaceKeydown)="onCanvasHandleKeydown(w.key, 'drag', $event)"
25848
+ (dragSurfaceKeydown)="
25849
+ onCanvasHandleKeydown(w.key, 'drag', $event)
25850
+ "
25355
25851
  >
25356
- <ng-container
25852
+ <ng-container
25357
25853
  [dynamicWidgetLoader]="w.definition"
25358
25854
  [ownerWidgetKey]="w.key"
25359
25855
  [context]="mergedContext"
@@ -25377,7 +25873,15 @@ class DynamicWidgetPageComponent {
25377
25873
  @for (group of renderedGroups(); track group.id) {
25378
25874
  <section
25379
25875
  class="pdx-group"
25380
- [class]="'pdx-group--' + group.kind + (group.layout ? ' pdx-group--layout-' + group.layout : '') + (group.emphasis ? ' pdx-group--emphasis-' + group.emphasis : '') + (group.side ? ' pdx-group--side-' + group.side : '')"
25876
+ [class]="
25877
+ 'pdx-group--' +
25878
+ group.kind +
25879
+ (group.layout ? ' pdx-group--layout-' + group.layout : '') +
25880
+ (group.emphasis
25881
+ ? ' pdx-group--emphasis-' + group.emphasis
25882
+ : '') +
25883
+ (group.side ? ' pdx-group--side-' + group.side : '')
25884
+ "
25381
25885
  [style.gridColumn]="groupGridColumn(group)"
25382
25886
  [attr.data-group-id]="group.id"
25383
25887
  [attr.data-group-kind]="group.kind"
@@ -25403,9 +25907,19 @@ class DynamicWidgetPageComponent {
25403
25907
  </div>
25404
25908
  @for (tab of group.tabs || []; track tab.id) {
25405
25909
  @if (activeTabId(group.id) === tab.id) {
25406
- <div class="pdx-group-content" [class]="'pdx-group-content--' + resolveGroupContentLayout(group)">
25910
+ <div
25911
+ class="pdx-group-content"
25912
+ [class]="
25913
+ 'pdx-group-content--' +
25914
+ resolveGroupContentLayout(group)
25915
+ "
25916
+ >
25407
25917
  @for (w of tab.widgets; track w.key) {
25408
- <div class="pdx-widget" [class]="w.renderClassName || w.className || ''" [style.gridColumn]="widgetGridColumn(w)">
25918
+ <div
25919
+ class="pdx-widget"
25920
+ [class]="w.renderClassName || w.className || ''"
25921
+ [style.gridColumn]="widgetGridColumn(w)"
25922
+ >
25409
25923
  <praxis-widget-shell
25410
25924
  [shell]="w.shell"
25411
25925
  [context]="mergedContext"
@@ -25418,7 +25932,9 @@ class DynamicWidgetPageComponent {
25418
25932
  [strictValidation]="strictValidation"
25419
25933
  [autoWireOutputs]="shouldAutoWireOutputs(w)"
25420
25934
  (widgetEvent)="onWidgetEvent(w.key, $event)"
25421
- (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
25935
+ (widgetDiagnostic)="
25936
+ onWidgetDiagnostic(w.key, $event)
25937
+ "
25422
25938
  ></ng-container>
25423
25939
  </praxis-widget-shell>
25424
25940
  </div>
@@ -25428,9 +25944,18 @@ class DynamicWidgetPageComponent {
25428
25944
  }
25429
25945
  </div>
25430
25946
  } @else {
25431
- <div class="pdx-group-content" [class]="'pdx-group-content--' + resolveGroupContentLayout(group)">
25947
+ <div
25948
+ class="pdx-group-content"
25949
+ [class]="
25950
+ 'pdx-group-content--' + resolveGroupContentLayout(group)
25951
+ "
25952
+ >
25432
25953
  @for (w of group.widgets; track w.key) {
25433
- <div class="pdx-widget" [class]="widgetClassName(w)" [style.gridColumn]="widgetGridColumn(w)">
25954
+ <div
25955
+ class="pdx-widget"
25956
+ [class]="widgetClassName(w)"
25957
+ [style.gridColumn]="widgetGridColumn(w)"
25958
+ >
25434
25959
  <praxis-widget-shell
25435
25960
  [shell]="w.shell"
25436
25961
  [context]="mergedContext"
@@ -25454,7 +25979,11 @@ class DynamicWidgetPageComponent {
25454
25979
  }
25455
25980
  } @else {
25456
25981
  @for (w of widgets(); track w.key) {
25457
- <div class="pdx-widget" [class]="widgetClassName(w)" [style.gridColumn]="widgetGridColumn(w)">
25982
+ <div
25983
+ class="pdx-widget"
25984
+ [class]="widgetClassName(w)"
25985
+ [style.gridColumn]="widgetGridColumn(w)"
25986
+ >
25458
25987
  <praxis-widget-shell
25459
25988
  [shell]="w.shell"
25460
25989
  [context]="mergedContext"
@@ -25475,27 +26004,36 @@ class DynamicWidgetPageComponent {
25475
26004
  }
25476
26005
  </div>
25477
26006
  @if (layoutAnnouncement) {
25478
- <div class="pdx-sr-only" aria-live="polite">{{ layoutAnnouncement }}</div>
26007
+ <div class="pdx-sr-only" aria-live="polite">
26008
+ {{ layoutAnnouncement }}
26009
+ </div>
25479
26010
  }
25480
26011
  </div>
25481
26012
  `, isInline: true, styles: [".pdx-page-wrapper{position:relative;display:block}.pdx-page{display:grid;gap:12px;grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-settings{position:sticky;top:8px;z-index:2;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:inherit;border-radius:12px;width:36px;height:36px;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-selected:before{border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:40px;height:18px;margin-left:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-8px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-8px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:18px;height:40px;margin-top:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-8px;cursor:ew-resize}.pdx-canvas-resize--west{left:-8px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:18px;height:18px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-8px;right:-8px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-8px;left:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-8px;right:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-8px;left:-8px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: WidgetShellComponent, selector: "praxis-widget-shell", inputs: ["shell", "context", "dragSurfaceEnabled", "dragSurfaceLabel"], outputs: ["action", "dragSurfacePointerDown", "dragSurfaceKeydown"] }] });
25482
26013
  }
25483
26014
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicWidgetPageComponent, decorators: [{
25484
26015
  type: Component,
25485
- args: [{ selector: 'praxis-dynamic-page', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule, DynamicWidgetLoaderDirective, WidgetShellComponent], providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], template: `
26016
+ args: [{ selector: 'praxis-dynamic-page', standalone: true, imports: [
26017
+ CommonModule,
26018
+ MatButtonModule,
26019
+ MatIconModule,
26020
+ MatTooltipModule,
26021
+ DynamicWidgetLoaderDirective,
26022
+ WidgetShellComponent,
26023
+ ], providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], template: `
25486
26024
  <div class="pdx-page-wrapper" [class.editing]="enableCustomization">
25487
26025
  @if (enableCustomization && showPageSettingsButton) {
25488
- <button
25489
- class="pdx-page-settings"
25490
- mat-icon-button
25491
- type="button"
25492
- [matTooltip]="pageSettingsLabel()"
25493
- matTooltipPosition="below"
25494
- [attr.aria-label]="pageSettingsLabel()"
25495
- (click)="openPageSettings()"
25496
- >
25497
- <mat-icon fontSet="material-symbols-outlined">settings</mat-icon>
25498
- </button>
26026
+ <button
26027
+ class="pdx-page-settings"
26028
+ mat-icon-button
26029
+ type="button"
26030
+ [matTooltip]="pageSettingsLabel()"
26031
+ matTooltipPosition="below"
26032
+ [attr.aria-label]="pageSettingsLabel()"
26033
+ (click)="openPageSettings()"
26034
+ >
26035
+ <mat-icon fontSet="material-symbols-outlined">settings</mat-icon>
26036
+ </button>
25499
26037
  }
25500
26038
  <div
25501
26039
  #pageCanvasHost
@@ -25510,8 +26048,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25510
26048
  <div
25511
26049
  class="pdx-widget pdx-widget--canvas"
25512
26050
  [class.pdx-widget--interactive]="enableCustomization"
25513
- [class.pdx-widget--canvas-selected]="isCanvasWidgetSelected(w.key)"
25514
- [class.pdx-widget--canvas-blocked]="isCanvasWidgetBlocked(w.key)"
26051
+ [class.pdx-widget--canvas-selected]="
26052
+ enableCustomization && isCanvasWidgetSelected(w.key)
26053
+ "
26054
+ [class.pdx-widget--canvas-blocked]="
26055
+ enableCustomization && isCanvasWidgetBlocked(w.key)
26056
+ "
25515
26057
  [class]="widgetClassName(w)"
25516
26058
  [style.gridColumn]="widgetGridColumn(w)"
25517
26059
  [style.gridRow]="widgetGridRow(w)"
@@ -25529,7 +26071,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25529
26071
  [attr.aria-label]="resizeHandleLabel(handle.id)"
25530
26072
  [title]="resizeHandleLabel(handle.id)"
25531
26073
  (pointerdown)="startCanvasResize(w.key, handle.id, $event)"
25532
- (keydown)="onCanvasResizeHandleKeydown(w.key, handle.id, $event)"
26074
+ (keydown)="
26075
+ onCanvasResizeHandleKeydown(w.key, handle.id, $event)
26076
+ "
25533
26077
  >
25534
26078
  <span class="pdx-canvas-resize-grip"></span>
25535
26079
  </button>
@@ -25542,9 +26086,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25542
26086
  [dragSurfaceLabel]="dragWidgetLabel()"
25543
26087
  (action)="onShellAction(w.key, $event)"
25544
26088
  (dragSurfacePointerDown)="startCanvasDrag(w.key, $event)"
25545
- (dragSurfaceKeydown)="onCanvasHandleKeydown(w.key, 'drag', $event)"
26089
+ (dragSurfaceKeydown)="
26090
+ onCanvasHandleKeydown(w.key, 'drag', $event)
26091
+ "
25546
26092
  >
25547
- <ng-container
26093
+ <ng-container
25548
26094
  [dynamicWidgetLoader]="w.definition"
25549
26095
  [ownerWidgetKey]="w.key"
25550
26096
  [context]="mergedContext"
@@ -25568,7 +26114,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25568
26114
  @for (group of renderedGroups(); track group.id) {
25569
26115
  <section
25570
26116
  class="pdx-group"
25571
- [class]="'pdx-group--' + group.kind + (group.layout ? ' pdx-group--layout-' + group.layout : '') + (group.emphasis ? ' pdx-group--emphasis-' + group.emphasis : '') + (group.side ? ' pdx-group--side-' + group.side : '')"
26117
+ [class]="
26118
+ 'pdx-group--' +
26119
+ group.kind +
26120
+ (group.layout ? ' pdx-group--layout-' + group.layout : '') +
26121
+ (group.emphasis
26122
+ ? ' pdx-group--emphasis-' + group.emphasis
26123
+ : '') +
26124
+ (group.side ? ' pdx-group--side-' + group.side : '')
26125
+ "
25572
26126
  [style.gridColumn]="groupGridColumn(group)"
25573
26127
  [attr.data-group-id]="group.id"
25574
26128
  [attr.data-group-kind]="group.kind"
@@ -25594,9 +26148,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25594
26148
  </div>
25595
26149
  @for (tab of group.tabs || []; track tab.id) {
25596
26150
  @if (activeTabId(group.id) === tab.id) {
25597
- <div class="pdx-group-content" [class]="'pdx-group-content--' + resolveGroupContentLayout(group)">
26151
+ <div
26152
+ class="pdx-group-content"
26153
+ [class]="
26154
+ 'pdx-group-content--' +
26155
+ resolveGroupContentLayout(group)
26156
+ "
26157
+ >
25598
26158
  @for (w of tab.widgets; track w.key) {
25599
- <div class="pdx-widget" [class]="w.renderClassName || w.className || ''" [style.gridColumn]="widgetGridColumn(w)">
26159
+ <div
26160
+ class="pdx-widget"
26161
+ [class]="w.renderClassName || w.className || ''"
26162
+ [style.gridColumn]="widgetGridColumn(w)"
26163
+ >
25600
26164
  <praxis-widget-shell
25601
26165
  [shell]="w.shell"
25602
26166
  [context]="mergedContext"
@@ -25609,7 +26173,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25609
26173
  [strictValidation]="strictValidation"
25610
26174
  [autoWireOutputs]="shouldAutoWireOutputs(w)"
25611
26175
  (widgetEvent)="onWidgetEvent(w.key, $event)"
25612
- (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
26176
+ (widgetDiagnostic)="
26177
+ onWidgetDiagnostic(w.key, $event)
26178
+ "
25613
26179
  ></ng-container>
25614
26180
  </praxis-widget-shell>
25615
26181
  </div>
@@ -25619,9 +26185,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25619
26185
  }
25620
26186
  </div>
25621
26187
  } @else {
25622
- <div class="pdx-group-content" [class]="'pdx-group-content--' + resolveGroupContentLayout(group)">
26188
+ <div
26189
+ class="pdx-group-content"
26190
+ [class]="
26191
+ 'pdx-group-content--' + resolveGroupContentLayout(group)
26192
+ "
26193
+ >
25623
26194
  @for (w of group.widgets; track w.key) {
25624
- <div class="pdx-widget" [class]="widgetClassName(w)" [style.gridColumn]="widgetGridColumn(w)">
26195
+ <div
26196
+ class="pdx-widget"
26197
+ [class]="widgetClassName(w)"
26198
+ [style.gridColumn]="widgetGridColumn(w)"
26199
+ >
25625
26200
  <praxis-widget-shell
25626
26201
  [shell]="w.shell"
25627
26202
  [context]="mergedContext"
@@ -25645,7 +26220,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25645
26220
  }
25646
26221
  } @else {
25647
26222
  @for (w of widgets(); track w.key) {
25648
- <div class="pdx-widget" [class]="widgetClassName(w)" [style.gridColumn]="widgetGridColumn(w)">
26223
+ <div
26224
+ class="pdx-widget"
26225
+ [class]="widgetClassName(w)"
26226
+ [style.gridColumn]="widgetGridColumn(w)"
26227
+ >
25649
26228
  <praxis-widget-shell
25650
26229
  [shell]="w.shell"
25651
26230
  [context]="mergedContext"
@@ -25666,7 +26245,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25666
26245
  }
25667
26246
  </div>
25668
26247
  @if (layoutAnnouncement) {
25669
- <div class="pdx-sr-only" aria-live="polite">{{ layoutAnnouncement }}</div>
26248
+ <div class="pdx-sr-only" aria-live="polite">
26249
+ {{ layoutAnnouncement }}
26250
+ </div>
25670
26251
  }
25671
26252
  </div>
25672
26253
  `, styles: [".pdx-page-wrapper{position:relative;display:block}.pdx-page{display:grid;gap:12px;grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-settings{position:sticky;top:8px;z-index:2;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:inherit;border-radius:12px;width:36px;height:36px;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-selected:before{border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:40px;height:18px;margin-left:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-8px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-8px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:18px;height:40px;margin-top:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-8px;cursor:ew-resize}.pdx-canvas-resize--west{left:-8px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:18px;height:18px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-8px;right:-8px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-8px;left:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-8px;right:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-8px;left:-8px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"] }]
@@ -27159,4 +27740,4 @@ function provideHookWhitelist(allowed) {
27159
27740
  * Generated bundle index. Do not edit.
27160
27741
  */
27161
27742
 
27162
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG$1 as GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_CATALOG as GLOBAL_ACTION_SPEC_CATALOG, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, normalizePraxisDataQueryContext, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, withMessage, withPraxisHttpLoading };
27743
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG$1 as GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_CATALOG as GLOBAL_ACTION_SPEC_CATALOG, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, normalizePraxisDataQueryContext, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, withMessage, withPraxisHttpLoading };